📄 api_arrayelt.c
字号:
/* GL_FLOAT attributes */static void GLAPIENTRY VertexAttrib1fvARB(GLuint index, const GLfloat *v){ CALL_VertexAttrib1fvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib2fvARB(GLuint index, const GLfloat *v){ CALL_VertexAttrib2fvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib3fvARB(GLuint index, const GLfloat *v){ CALL_VertexAttrib3fvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib4fvARB(GLuint index, const GLfloat *v){ CALL_VertexAttrib4fvARB(GET_DISPATCH(), (index, v));}/* GL_DOUBLE attributes */static void GLAPIENTRY VertexAttrib1dvARB(GLuint index, const GLdouble *v){ CALL_VertexAttrib1dvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib2dvARB(GLuint index, const GLdouble *v){ CALL_VertexAttrib2dvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib3dvARB(GLuint index, const GLdouble *v){ CALL_VertexAttrib3dvARB(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib4dvARB(GLuint index, const GLdouble *v){ CALL_VertexAttrib4dvARB(GET_DISPATCH(), (index, v));}/* * Array [size][type] of VertexAttrib functions */static attrib_func AttribFuncsARB[2][4][8] = { { /* non-normalized */ { /* size 1 */ (attrib_func) VertexAttrib1bvARB, (attrib_func) VertexAttrib1ubvARB, (attrib_func) VertexAttrib1svARB, (attrib_func) VertexAttrib1usvARB, (attrib_func) VertexAttrib1ivARB, (attrib_func) VertexAttrib1uivARB, (attrib_func) VertexAttrib1fvARB, (attrib_func) VertexAttrib1dvARB }, { /* size 2 */ (attrib_func) VertexAttrib2bvARB, (attrib_func) VertexAttrib2ubvARB, (attrib_func) VertexAttrib2svARB, (attrib_func) VertexAttrib2usvARB, (attrib_func) VertexAttrib2ivARB, (attrib_func) VertexAttrib2uivARB, (attrib_func) VertexAttrib2fvARB, (attrib_func) VertexAttrib2dvARB }, { /* size 3 */ (attrib_func) VertexAttrib3bvARB, (attrib_func) VertexAttrib3ubvARB, (attrib_func) VertexAttrib3svARB, (attrib_func) VertexAttrib3usvARB, (attrib_func) VertexAttrib3ivARB, (attrib_func) VertexAttrib3uivARB, (attrib_func) VertexAttrib3fvARB, (attrib_func) VertexAttrib3dvARB }, { /* size 4 */ (attrib_func) VertexAttrib4bvARB, (attrib_func) VertexAttrib4ubvARB, (attrib_func) VertexAttrib4svARB, (attrib_func) VertexAttrib4usvARB, (attrib_func) VertexAttrib4ivARB, (attrib_func) VertexAttrib4uivARB, (attrib_func) VertexAttrib4fvARB, (attrib_func) VertexAttrib4dvARB } }, { /* normalized (except for float/double) */ { /* size 1 */ (attrib_func) VertexAttrib1NbvARB, (attrib_func) VertexAttrib1NubvARB, (attrib_func) VertexAttrib1NsvARB, (attrib_func) VertexAttrib1NusvARB, (attrib_func) VertexAttrib1NivARB, (attrib_func) VertexAttrib1NuivARB, (attrib_func) VertexAttrib1fvARB, (attrib_func) VertexAttrib1dvARB }, { /* size 2 */ (attrib_func) VertexAttrib2NbvARB, (attrib_func) VertexAttrib2NubvARB, (attrib_func) VertexAttrib2NsvARB, (attrib_func) VertexAttrib2NusvARB, (attrib_func) VertexAttrib2NivARB, (attrib_func) VertexAttrib2NuivARB, (attrib_func) VertexAttrib2fvARB, (attrib_func) VertexAttrib2dvARB }, { /* size 3 */ (attrib_func) VertexAttrib3NbvARB, (attrib_func) VertexAttrib3NubvARB, (attrib_func) VertexAttrib3NsvARB, (attrib_func) VertexAttrib3NusvARB, (attrib_func) VertexAttrib3NivARB, (attrib_func) VertexAttrib3NuivARB, (attrib_func) VertexAttrib3fvARB, (attrib_func) VertexAttrib3dvARB }, { /* size 4 */ (attrib_func) VertexAttrib4NbvARB, (attrib_func) VertexAttrib4NubvARB, (attrib_func) VertexAttrib4NsvARB, (attrib_func) VertexAttrib4NusvARB, (attrib_func) VertexAttrib4NivARB, (attrib_func) VertexAttrib4NuivARB, (attrib_func) VertexAttrib4fvARB, (attrib_func) VertexAttrib4dvARB } }};/**********************************************************************/GLboolean _ae_create_context( GLcontext *ctx ){ if (ctx->aelt_context) return GL_TRUE; /* These _gloffset_* values may not be compile-time constants */ SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bvEXT; SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubvEXT; SecondaryColorFuncs[2] = _gloffset_SecondaryColor3svEXT; SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usvEXT; SecondaryColorFuncs[4] = _gloffset_SecondaryColor3ivEXT; SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uivEXT; SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT; SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dvEXT; FogCoordFuncs[0] = -1; FogCoordFuncs[1] = -1; FogCoordFuncs[2] = -1; FogCoordFuncs[3] = -1; FogCoordFuncs[4] = -1; FogCoordFuncs[5] = -1; FogCoordFuncs[6] = _gloffset_FogCoordfvEXT; FogCoordFuncs[7] = _gloffset_FogCoorddvEXT; ctx->aelt_context = CALLOC( sizeof(AEcontext) ); if (!ctx->aelt_context) return GL_FALSE; AE_CONTEXT(ctx)->NewState = ~0; return GL_TRUE;}void _ae_destroy_context( GLcontext *ctx ){ if ( AE_CONTEXT( ctx ) ) { FREE( ctx->aelt_context ); ctx->aelt_context = NULL; }}static void check_vbo( AEcontext *actx, struct gl_buffer_object *vbo ){ if (vbo->Name && !vbo->Pointer) { GLuint i; for (i = 0; i < actx->nr_vbos; i++) if (actx->vbo[i] == vbo) return; assert(actx->nr_vbos < VERT_ATTRIB_MAX); actx->vbo[actx->nr_vbos++] = vbo; }}/** * Make a list of per-vertex functions to call for each glArrayElement call. * These functions access the array data (i.e. glVertex, glColor, glNormal, * etc). * Note: this may be called during display list construction. */static void _ae_update_state( GLcontext *ctx ){ AEcontext *actx = AE_CONTEXT(ctx); AEarray *aa = actx->arrays; AEattrib *at = actx->attribs; GLuint i; actx->nr_vbos = 0; /* conventional vertex arrays */ if (ctx->Array.ArrayObj->Index.Enabled) { aa->array = &ctx->Array.ArrayObj->Index; aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } if (ctx->Array.ArrayObj->EdgeFlag.Enabled) { aa->array = &ctx->Array.ArrayObj->EdgeFlag; aa->offset = _gloffset_EdgeFlagv; check_vbo(actx, aa->array->BufferObj); aa++; } if (ctx->Array.ArrayObj->Normal.Enabled) { aa->array = &ctx->Array.ArrayObj->Normal; aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } if (ctx->Array.ArrayObj->Color.Enabled) { aa->array = &ctx->Array.ArrayObj->Color; aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } if (ctx->Array.ArrayObj->SecondaryColor.Enabled) { aa->array = &ctx->Array.ArrayObj->SecondaryColor; aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } if (ctx->Array.ArrayObj->FogCoord.Enabled) { aa->array = &ctx->Array.ArrayObj->FogCoord; aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { struct gl_client_array *attribArray = &ctx->Array.ArrayObj->TexCoord[i]; if (attribArray->Enabled) { /* NOTE: we use generic glVertexAttribNV functions here. * If we ever remove GL_NV_vertex_program this will have to change. */ at->array = attribArray; ASSERT(!at->array->Normalized); at->func = AttribFuncsNV[at->array->Normalized] [at->array->Size-1] [TYPE_IDX(at->array->Type)]; at->index = VERT_ATTRIB_TEX0 + i; check_vbo(actx, at->array->BufferObj); at++; } } /* generic vertex attribute arrays */ for (i = 1; i < VERT_ATTRIB_MAX; i++) { /* skip zero! */ struct gl_client_array *attribArray = &ctx->Array.ArrayObj->VertexAttrib[i]; if (attribArray->Enabled) { at->array = attribArray; /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV * function pointer here (for float arrays) since the pointer may * change from one execution of _ae_loopback_array_elt() to * the next. Doing so caused UT to break. */ if (ctx->VertexProgram._Enabled && ctx->VertexProgram.Current->IsNVProgram) { at->func = AttribFuncsNV[at->array->Normalized] [at->array->Size-1] [TYPE_IDX(at->array->Type)]; } else { at->func = AttribFuncsARB[at->array->Normalized] [at->array->Size-1] [TYPE_IDX(at->array->Type)]; } at->index = i; check_vbo(actx, at->array->BufferObj); at++; } } /* finally, vertex position */ if (ctx->Array.ArrayObj->VertexAttrib[0].Enabled) { /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's * issued as the last (provoking) attribute). */ aa->array = &ctx->Array.ArrayObj->VertexAttrib[0]; assert(aa->array->Size >= 2); /* XXX fix someday? */ aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } else if (ctx->Array.ArrayObj->Vertex.Enabled) { aa->array = &ctx->Array.ArrayObj->Vertex; aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; check_vbo(actx, aa->array->BufferObj); aa++; } check_vbo(actx, ctx->Array.ElementArrayBufferObj); ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX); ASSERT(aa - actx->arrays < 32); at->func = NULL; /* terminate the list */ aa->offset = -1; /* terminate the list */ actx->NewState = 0;}void _ae_map_vbos( GLcontext *ctx ){ AEcontext *actx = AE_CONTEXT(ctx); GLuint i; if (actx->mapped_vbos) return; if (actx->NewState) _ae_update_state(ctx); for (i = 0; i < actx->nr_vbos; i++) ctx->Driver.MapBuffer(ctx, GL_ARRAY_BUFFER_ARB, GL_DYNAMIC_DRAW_ARB, actx->vbo[i]); if (actx->nr_vbos) actx->mapped_vbos = GL_TRUE;}void _ae_unmap_vbos( GLcontext *ctx ){ AEcontext *actx = AE_CONTEXT(ctx); GLuint i; if (!actx->mapped_vbos) return; assert (!actx->NewState); for (i = 0; i < actx->nr_vbos; i++) ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER_ARB, actx->vbo[i]); actx->mapped_vbos = GL_FALSE;}/** * Called via glArrayElement() and glDrawArrays(). * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions * for all enabled vertex arrays (for elt-th element). * Note: this may be called during display list construction. */void GLAPIENTRY _ae_loopback_array_elt( GLint elt ){ GET_CURRENT_CONTEXT(ctx); const AEcontext *actx = AE_CONTEXT(ctx); const AEarray *aa; const AEattrib *at; const struct _glapi_table * const disp = GET_DISPATCH(); GLboolean do_map; if (actx->NewState) { assert(!actx->mapped_vbos); _ae_update_state( ctx ); } do_map = actx->nr_vbos && !actx->mapped_vbos; /* */ if (do_map) _ae_map_vbos(ctx); /* generic attributes */ for (at = actx->attribs; at->func; at++) { const GLubyte *src = ADD_POINTERS(at->array->BufferObj->Pointer, at->array->Ptr) + elt * at->array->StrideB; at->func( at->index, src ); } /* conventional arrays */ for (aa = actx->arrays; aa->offset != -1 ; aa++) { const GLubyte *src = ADD_POINTERS(aa->array->BufferObj->Pointer, aa->array->Ptr) + elt * aa->array->StrideB; CALL_by_offset( disp, (array_func), aa->offset, ((const void *) src) ); } if (do_map) _ae_unmap_vbos(ctx);}void _ae_invalidate_state( GLcontext *ctx, GLuint new_state ){ AEcontext *actx = AE_CONTEXT(ctx); /* Only interested in this subset of mesa state. Need to prune * this down as both tnl/ and the drivers can raise statechanges * for arcane reasons in the middle of seemingly atomic operations * like DrawElements, over which we'd like to keep a known set of * arrays and vbo's mapped. * * Luckily, neither the drivers nor tnl muck with the state that * concerns us here: */ new_state &= _NEW_ARRAY | _NEW_PROGRAM; if (new_state) { assert(!actx->mapped_vbos); actx->NewState |= new_state; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -