context.c

来自「Mesa is an open-source implementation of」· C语言 代码 · 共 1,776 行 · 第 1/4 页

C
1,776
字号
#if FEATURE_ARB_shader_objects   ss->ShaderObjects = _mesa_NewHashTable();#endif   ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);   if (!ss->Default1D)      goto cleanup;   ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);   if (!ss->Default2D)      goto cleanup;   ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);   if (!ss->Default3D)      goto cleanup;   ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);   if (!ss->DefaultCubeMap)      goto cleanup;   ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);   if (!ss->DefaultRect)      goto cleanup;   ss->Default1DArray = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D_ARRAY_EXT);   if (!ss->Default1DArray)      goto cleanup;   ss->Default2DArray = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D_ARRAY_EXT);   if (!ss->Default2DArray)      goto cleanup;   /* sanity check */   assert(ss->Default1D->RefCount == 1);   _glthread_INIT_MUTEX(ss->TexMutex);   ss->TextureStateStamp = 0;#if FEATURE_EXT_framebuffer_object   ss->FrameBuffers = _mesa_NewHashTable();   if (!ss->FrameBuffers)      goto cleanup;   ss->RenderBuffers = _mesa_NewHashTable();   if (!ss->RenderBuffers)      goto cleanup;#endif   return GL_TRUE;cleanup:   /* Ran out of memory at some point.  Free everything and return NULL */   if (ss->DisplayList)      _mesa_DeleteHashTable(ss->DisplayList);   if (ss->TexObjects)      _mesa_DeleteHashTable(ss->TexObjects);#if FEATURE_NV_vertex_program   if (ss->Programs)      _mesa_DeleteHashTable(ss->Programs);#endif#if FEATURE_ARB_vertex_program   _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);#endif#if FEATURE_ARB_fragment_program   _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);#endif#if FEATURE_ATI_fragment_shader   if (ss->DefaultFragmentShader)      _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);#endif#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object   if (ss->BufferObjects)      _mesa_DeleteHashTable(ss->BufferObjects);#endif   if (ss->ArrayObjects)      _mesa_DeleteHashTable (ss->ArrayObjects);#if FEATURE_ARB_shader_objects   if (ss->ShaderObjects)      _mesa_DeleteHashTable (ss->ShaderObjects);#endif#if FEATURE_EXT_framebuffer_object   if (ss->FrameBuffers)      _mesa_DeleteHashTable(ss->FrameBuffers);   if (ss->RenderBuffers)      _mesa_DeleteHashTable(ss->RenderBuffers);#endif   if (ss->Default1D)      (*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);   if (ss->Default2D)      (*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);   if (ss->Default3D)      (*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);   if (ss->DefaultCubeMap)      (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);   if (ss->DefaultRect)      (*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);   if (ss->Default1DArray)      (*ctx->Driver.DeleteTexture)(ctx, ss->Default1DArray);   if (ss->Default2DArray)      (*ctx->Driver.DeleteTexture)(ctx, ss->Default2DArray);   _mesa_free(ss);   return GL_FALSE;}/** * Callback for deleting a display list.  Called by _mesa_HashDeleteAll(). */static voiddelete_displaylist_cb(GLuint id, void *data, void *userData){   struct mesa_display_list *list = (struct mesa_display_list *) data;   GLcontext *ctx = (GLcontext *) userData;   _mesa_delete_list(ctx, list);}/** * Callback for deleting a texture object.  Called by _mesa_HashDeleteAll(). */static voiddelete_texture_cb(GLuint id, void *data, void *userData){   struct gl_texture_object *texObj = (struct gl_texture_object *) data;   GLcontext *ctx = (GLcontext *) userData;   ctx->Driver.DeleteTexture(ctx, texObj);}/** * Callback for deleting a program object.  Called by _mesa_HashDeleteAll(). */static voiddelete_program_cb(GLuint id, void *data, void *userData){   struct gl_program *prog = (struct gl_program *) data;   GLcontext *ctx = (GLcontext *) userData;   ASSERT(prog->RefCount == 1); /* should only be referenced by hash table */   prog->RefCount = 0;  /* now going away */   ctx->Driver.DeleteProgram(ctx, prog);}/** * Callback for deleting an ATI fragment shader object. * Called by _mesa_HashDeleteAll(). */static voiddelete_fragshader_cb(GLuint id, void *data, void *userData){   struct ati_fragment_shader *shader = (struct ati_fragment_shader *) data;   GLcontext *ctx = (GLcontext *) userData;   _mesa_delete_ati_fragment_shader(ctx, shader);}/** * Callback for deleting a buffer object.  Called by _mesa_HashDeleteAll(). */static voiddelete_bufferobj_cb(GLuint id, void *data, void *userData){   struct gl_buffer_object *bufObj = (struct gl_buffer_object *) data;   GLcontext *ctx = (GLcontext *) userData;   ctx->Driver.DeleteBuffer(ctx, bufObj);}/** * Callback for deleting an array object.  Called by _mesa_HashDeleteAll(). */static voiddelete_arrayobj_cb(GLuint id, void *data, void *userData){   struct gl_array_object *arrayObj = (struct gl_array_object *) data;   GLcontext *ctx = (GLcontext *) userData;   _mesa_delete_array_object(ctx, arrayObj);}/** * Callback for freeing shader program data. Call it before delete_shader_cb * to avoid memory access error. */static voidfree_shader_program_data_cb(GLuint id, void *data, void *userData){   GLcontext *ctx = (GLcontext *) userData;   struct gl_shader_program *shProg = (struct gl_shader_program *) data;   if (shProg->Type == GL_SHADER_PROGRAM_MESA) {       _mesa_free_shader_program_data(ctx, shProg);   }}/** * Callback for deleting shader and shader programs objects. * Called by _mesa_HashDeleteAll(). */static voiddelete_shader_cb(GLuint id, void *data, void *userData){   GLcontext *ctx = (GLcontext *) userData;   struct gl_shader *sh = (struct gl_shader *) data;   if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER) {      _mesa_free_shader(ctx, sh);   }   else {      struct gl_shader_program *shProg = (struct gl_shader_program *) data;      ASSERT(shProg->Type == GL_SHADER_PROGRAM_MESA);      _mesa_free_shader_program(ctx, shProg);   }}/** * Callback for deleting a framebuffer object.  Called by _mesa_HashDeleteAll() */static voiddelete_framebuffer_cb(GLuint id, void *data, void *userData){   struct gl_framebuffer *fb = (struct gl_framebuffer *) data;   /* The fact that the framebuffer is in the hashtable means its refcount    * is one, but we're removing from the hashtable now.  So clear refcount.    */   /*assert(fb->RefCount == 1);*/   fb->RefCount = 0;   /* NOTE: Delete should always be defined but there are two reports    * of it being NULL (bugs 13507, 14293).  Work-around for now.    */   if (fb->Delete)      fb->Delete(fb);}/** * Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll() */static voiddelete_renderbuffer_cb(GLuint id, void *data, void *userData){   struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;   rb->RefCount = 0;  /* see comment for FBOs above */   if (rb->Delete)      rb->Delete(rb);}/** * Deallocate a shared state object and all children structures. * * \param ctx GL context. * \param ss shared state pointer. *  * Frees the display lists, the texture objects (calling the driver texture * deletion callback to free its private data) and the vertex programs, as well * as their hash tables. * * \sa alloc_shared_state(). */static voidfree_shared_state( GLcontext *ctx, struct gl_shared_state *ss ){   /*    * Free display lists    */   _mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);   _mesa_DeleteHashTable(ss->DisplayList);#if FEATURE_ARB_shader_objects   _mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx);   _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);   _mesa_DeleteHashTable(ss->ShaderObjects);#endif#if defined(FEATURE_NV_vertex_program) || defined(FEATURE_NV_fragment_program)   _mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);   _mesa_DeleteHashTable(ss->Programs);#endif#if FEATURE_ARB_vertex_program   _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);#endif#if FEATURE_ARB_fragment_program   _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);#endif#if FEATURE_ATI_fragment_shader   _mesa_HashDeleteAll(ss->ATIShaders, delete_fragshader_cb, ctx);   _mesa_DeleteHashTable(ss->ATIShaders);   _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);#endif#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object   _mesa_HashDeleteAll(ss->BufferObjects, delete_bufferobj_cb, ctx);   _mesa_DeleteHashTable(ss->BufferObjects);#endif   _mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);   _mesa_DeleteHashTable(ss->ArrayObjects);#if FEATURE_EXT_framebuffer_object   _mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);   _mesa_DeleteHashTable(ss->FrameBuffers);   _mesa_HashDeleteAll(ss->RenderBuffers, delete_renderbuffer_cb, ctx);   _mesa_DeleteHashTable(ss->RenderBuffers);#endif   /*    * Free texture objects (after FBOs since some textures might have    * been bound to FBOs).    */   ASSERT(ctx->Driver.DeleteTexture);   /* the default textures */   ctx->Driver.DeleteTexture(ctx, ss->Default1D);   ctx->Driver.DeleteTexture(ctx, ss->Default2D);   ctx->Driver.DeleteTexture(ctx, ss->Default3D);   ctx->Driver.DeleteTexture(ctx, ss->DefaultCubeMap);   ctx->Driver.DeleteTexture(ctx, ss->DefaultRect);   ctx->Driver.DeleteTexture(ctx, ss->Default1DArray);   ctx->Driver.DeleteTexture(ctx, ss->Default2DArray);   /* all other textures */   _mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx);   _mesa_DeleteHashTable(ss->TexObjects);   _glthread_DESTROY_MUTEX(ss->Mutex);   _mesa_free(ss);}/** * Initialize fields of gl_current_attrib (aka ctx->Current.*) */static void_mesa_init_current(GLcontext *ctx){   GLuint i;   /* Init all to (0,0,0,1) */   for (i = 0; i < VERT_ATTRIB_MAX; i++) {      ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );   }   /* redo special cases: */   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );   ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );}/** * Init vertex/fragment program native limits from logical limits. */static voidinit_natives(struct gl_program_constants *prog){   prog->MaxNativeInstructions = prog->MaxInstructions;   prog->MaxNativeAluInstructions = prog->MaxAluInstructions;   prog->MaxNativeTexInstructions = prog->MaxTexInstructions;   prog->MaxNativeTexIndirections = prog->MaxTexIndirections;   prog->MaxNativeAttribs = prog->MaxAttribs;   prog->MaxNativeTemps = prog->MaxTemps;   prog->MaxNativeAddressRegs = prog->MaxAddressRegs;   prog->MaxNativeParameters = prog->MaxParameters;}/** * Initialize fields of gl_constants (aka ctx->Const.*). * Use defaults from config.h.  The device drivers will often override * some of these values (such as number of texture units). */static void _mesa_init_constants(GLcontext *ctx){   assert(ctx);   assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);   assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);   assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_COORD_UNITS);   assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_IMAGE_UNITS);   /* Constants, may be overriden (usually only reduced) by device drivers */   ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;   ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;   ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;   ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;   ctx->Const.MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;   ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;   ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;   ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,                                     ctx->Const.MaxTextureImageUnits);   ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;   ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;   ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;   ctx->Const.SubPixelBits = SUB_PIXEL_BITS;   ctx->Const.MinPointSize = MIN_POINT_SIZE;   ctx->Const.MaxPointSize = MAX_POINT_SIZE;   ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;   ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;   ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;   ctx->Const.MinLineWidth = MIN_LINE_WIDTH;   ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;   ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;   ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;   ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;   ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;   ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;   ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;   ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;   ctx->Const.MaxLights = MAX_LIGHTS;   ctx->Const.MaxShininess = 128.0;   ctx->Const.MaxSpotExponent = 128.0;   ctx->Const.MaxViewportWidth = MAX_WIDTH;   ctx->Const.MaxViewportHeight = MAX_HEIGHT;#if FEATURE_ARB_vertex_program   ctx->Const.VertexProgram.MaxInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;   ctx->Const.VertexProgram.MaxAluInstructions = 0;   ctx->Const.VertexProgram.MaxTexInstructions = 0;   ctx->Const.VertexProgram.MaxTexIndirections = 0;   ctx->Const.VertexProgram.MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;   ctx->Const.VertexProgram.MaxTemps = MAX_PROGRAM_TEMPS;   ctx->Const.VertexProgram.MaxParameters = MAX_NV_VERTEX_PROGRAM_PARAMS;   ctx->Const.VertexProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;   ctx->Const.VertexProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;   ctx->Const.VertexProgram.MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;   ctx->Const.VertexProgram.MaxUniformComponents = 4 * MAX_UNIFORMS;   init_natives(&ctx->Const.VertexProgram);#endif#if FEATURE_ARB_fragment_program   ctx->Const.FragmentProgram.MaxInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;   ctx->Const.FragmentProgram.MaxAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;   ctx->Const.FragmentProgram.MaxTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;   ctx->Const.FragmentProgram.MaxTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;   ctx->Const.FragmentProgram.MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;   ctx->Const.FragmentProgram.MaxTemps = MAX_PROGRAM_TEMPS;   ctx->Const.FragmentProgram.MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;   ctx->Const.FragmentProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;   ctx->Const.FragmentProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;   ctx->Const.FragmentProgram.MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?