⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 api_arrayelt.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -