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 + -
显示快捷键?