home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / tnl / t_context.cpp < prev    next >
C/C++ Source or Header  |  2002-10-29  |  7KB  |  245 lines

  1. /* $Id: t_context.c,v 1.30 2002/10/29 20:29:01 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  3.5
  6.  *
  7.  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  23.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  * Authors:
  27.  *    Keith Whitwell <keith@tungstengraphics.com>
  28.  */
  29.  
  30.  
  31. #include "glheader.h"
  32. #include "imports.h"
  33. #include "macros.h"
  34. #include "mtypes.h"
  35. #include "dlist.h"
  36. #include "light.h"
  37. #include "vtxfmt.h"
  38.  
  39. #include "t_context.h"
  40. #include "t_array_api.h"
  41. #include "t_eval_api.h"
  42. #include "t_imm_alloc.h"
  43. #include "t_imm_api.h"
  44. #include "t_imm_exec.h"
  45. #include "t_imm_dlist.h"
  46. #include "t_pipeline.h"
  47. #include "tnl.h"
  48.  
  49. #ifndef THREADS
  50. struct immediate *_tnl_CurrentInput = NULL;
  51. #endif
  52.  
  53.  
  54. void
  55. _tnl_MakeCurrent( GLcontext *ctx,
  56.           GLframebuffer *drawBuffer,
  57.           GLframebuffer *readBuffer )
  58. {
  59. #ifndef THREADS
  60.    SET_IMMEDIATE( ctx, TNL_CURRENT_IM(ctx) );
  61. #endif
  62. }
  63.  
  64.  
  65. static void
  66. install_driver_callbacks( GLcontext *ctx )
  67. {
  68.    ctx->Driver.NewList = _tnl_NewList;
  69.    ctx->Driver.EndList = _tnl_EndList;
  70.    ctx->Driver.FlushVertices = _tnl_flush_vertices;
  71.    ctx->Driver.MakeCurrent = _tnl_MakeCurrent;
  72.    ctx->Driver.BeginCallList = _tnl_BeginCallList;
  73.    ctx->Driver.EndCallList = _tnl_EndCallList;
  74. }
  75.  
  76.  
  77.  
  78. GLboolean
  79. _tnl_CreateContext( GLcontext *ctx )
  80. {
  81.    TNLcontext *tnl;
  82.  
  83.    /* Create the TNLcontext structure
  84.     */
  85.    ctx->swtnl_context = tnl = (TNLcontext *) CALLOC( sizeof(TNLcontext) );
  86.  
  87.    if (!tnl) {
  88.       return GL_FALSE;
  89.    }
  90.  
  91.    /* Initialize the VB.
  92.     */
  93.    tnl->vb.Size = MAX2( IMM_SIZE,
  94.             ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES);
  95.  
  96.  
  97.    /* Initialize tnl state and tnl->vtxfmt.
  98.     */
  99.    _tnl_dlist_init( ctx );
  100.    _tnl_array_init( ctx );
  101.    _tnl_imm_init( ctx );
  102.    _tnl_eval_init( ctx );
  103.    _tnl_install_pipeline( ctx, _tnl_default_pipeline );
  104.  
  105.  
  106.    tnl->NeedNdcCoords = GL_TRUE;
  107.    tnl->LoopbackDListCassettes = GL_FALSE;
  108.    tnl->CalcDListNormalLengths = GL_TRUE;
  109.  
  110.    /* Hook our functions into exec and compile dispatch tables.
  111.     */
  112.    _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
  113.  
  114.    tnl->save_vtxfmt = tnl->vtxfmt;
  115.    tnl->save_vtxfmt.CallList = _mesa_save_CallList;    
  116.    tnl->save_vtxfmt.EvalMesh1 = _mesa_save_EvalMesh1;    
  117.    tnl->save_vtxfmt.EvalMesh2 = _mesa_save_EvalMesh2;
  118.    tnl->save_vtxfmt.Begin = _tnl_save_Begin;
  119.  
  120.    _mesa_install_save_vtxfmt( ctx, &tnl->save_vtxfmt );
  121.  
  122.  
  123.    /* Set a few default values in the driver struct.
  124.     */
  125.    install_driver_callbacks(ctx);
  126.    ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT;
  127.    ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
  128.    ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN;
  129.  
  130.    tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
  131.    tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
  132.    tnl->Driver.NotifyMaterialChange = _mesa_validate_all_lighting_tables;
  133.  
  134.  
  135.    
  136.    return GL_TRUE;
  137. }
  138.  
  139.  
  140. void
  141. _tnl_DestroyContext( GLcontext *ctx )
  142. {
  143.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  144.  
  145.    _tnl_array_destroy( ctx );
  146.    _tnl_imm_destroy( ctx );
  147.    _tnl_destroy_pipeline( ctx );
  148.    _tnl_free_immediate( ctx, tnl->freed_immediate );
  149.  
  150.    FREE(tnl);
  151.    ctx->swtnl_context = 0;
  152. }
  153.  
  154.  
  155. void
  156. _tnl_InvalidateState( GLcontext *ctx, GLuint new_state )
  157. {
  158.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  159.  
  160.    if (new_state & _NEW_ARRAY) {
  161.       struct immediate *IM = TNL_CURRENT_IM(ctx);
  162.       IM->ArrayEltFlags = ~ctx->Array._Enabled;
  163.       IM->ArrayEltFlush = (ctx->Array.LockCount 
  164.                ? FLUSH_ELT_LAZY : FLUSH_ELT_EAGER);
  165.       IM->ArrayEltIncr = ctx->Array.Vertex.Enabled ? 1 : 0;
  166.       tnl->pipeline.run_input_changes |= ctx->Array.NewState; /* overkill */
  167.    }
  168.  
  169.    tnl->pipeline.run_state_changes |= new_state;
  170.    tnl->pipeline.build_state_changes |= (new_state &
  171.                      tnl->pipeline.build_state_trigger);
  172.  
  173.    tnl->eval.EvalNewState |= new_state;
  174. }
  175.  
  176.  
  177. void
  178. _tnl_wakeup_exec( GLcontext *ctx )
  179. {
  180.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  181.  
  182.    install_driver_callbacks(ctx);
  183.    ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
  184.  
  185.    /* Hook our functions into exec and compile dispatch tables.
  186.     */
  187.    _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
  188.  
  189.    /* Call all appropriate driver callbacks to revive state.
  190.     */
  191.    _tnl_MakeCurrent( ctx, ctx->DrawBuffer, ctx->ReadBuffer );
  192.  
  193.    /* Assume we haven't been getting state updates either:
  194.     */
  195.    _tnl_InvalidateState( ctx, ~0 );
  196.    tnl->pipeline.run_input_changes = ~0;
  197.  
  198.    if (ctx->Light.ColorMaterialEnabled) {
  199.       _mesa_update_color_material( ctx, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
  200.    }
  201.  
  202. }
  203.  
  204.  
  205. void
  206. _tnl_wakeup_save_exec( GLcontext *ctx )
  207. {
  208.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  209.  
  210.    _tnl_wakeup_exec( ctx );
  211.    _mesa_install_save_vtxfmt( ctx, &tnl->save_vtxfmt );
  212. }
  213.  
  214.  
  215. void
  216. _tnl_need_projected_coords( GLcontext *ctx, GLboolean mode )
  217. {
  218.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  219.    if (tnl->NeedNdcCoords != mode) {
  220.       tnl->NeedNdcCoords = mode;
  221.       _tnl_InvalidateState( ctx, _NEW_PROJECTION );
  222.    }
  223. }
  224.  
  225. void
  226. _tnl_need_dlist_loopback( GLcontext *ctx, GLboolean mode )
  227. {
  228.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  229.    tnl->LoopbackDListCassettes = mode;
  230. }
  231.  
  232. void
  233. _tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean mode )
  234. {
  235.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  236.    tnl->CalcDListNormalLengths = mode;
  237. }
  238.  
  239. void
  240. _tnl_isolate_materials( GLcontext *ctx, GLboolean mode )
  241. {
  242.    TNLcontext *tnl = TNL_CONTEXT(ctx);
  243.    tnl->IsolateMaterials = mode;
  244. }
  245.