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

📄 vbo_exec_api.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
								\      for (i = 0; i < exec->vtx.vertex_size; i++)		\	 exec->vtx.vbptr[i] = exec->vtx.vertex[i];		\								\      exec->vtx.vbptr += exec->vtx.vertex_size;			\      exec->ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;	\								\      if (++exec->vtx.vert_count >= exec->vtx.max_vert)		\	 vbo_exec_vtx_wrap( exec );				\   }								\} while (0)#define ERROR() _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ )#define TAG(x) vbo_##x#include "vbo_attrib_tmp.h"/* Eval */static void GLAPIENTRY vbo_exec_EvalCoord1f( GLfloat u ){   GET_CURRENT_CONTEXT( ctx );   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;   {      GLint i;      if (exec->eval.recalculate_maps) 	 vbo_exec_eval_update( exec );      for (i = 0; i <= VBO_ATTRIB_TEX7; i++) {	 if (exec->eval.map1[i].map) 	    if (exec->vtx.active_sz[i] != exec->eval.map1[i].sz)	       vbo_exec_fixup_vertex( ctx, i, exec->eval.map1[i].sz );      }   }   _mesa_memcpy( exec->vtx.copied.buffer, exec->vtx.vertex,                  exec->vtx.vertex_size * sizeof(GLfloat));   vbo_exec_do_EvalCoord1f( exec, u );   _mesa_memcpy( exec->vtx.vertex, exec->vtx.copied.buffer,                 exec->vtx.vertex_size * sizeof(GLfloat));}static void GLAPIENTRY vbo_exec_EvalCoord2f( GLfloat u, GLfloat v ){   GET_CURRENT_CONTEXT( ctx );   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;   {      GLint i;      if (exec->eval.recalculate_maps) 	 vbo_exec_eval_update( exec );      for (i = 0; i <= VBO_ATTRIB_TEX7; i++) {	 if (exec->eval.map2[i].map) 	    if (exec->vtx.active_sz[i] != exec->eval.map2[i].sz)	       vbo_exec_fixup_vertex( ctx, i, exec->eval.map2[i].sz );      }      if (ctx->Eval.AutoNormal) 	 if (exec->vtx.active_sz[VBO_ATTRIB_NORMAL] != 3)	    vbo_exec_fixup_vertex( ctx, VBO_ATTRIB_NORMAL, 3 );   }   _mesa_memcpy( exec->vtx.copied.buffer, exec->vtx.vertex,                  exec->vtx.vertex_size * sizeof(GLfloat));   vbo_exec_do_EvalCoord2f( exec, u, v );   _mesa_memcpy( exec->vtx.vertex, exec->vtx.copied.buffer,                  exec->vtx.vertex_size * sizeof(GLfloat));}static void GLAPIENTRY vbo_exec_EvalCoord1fv( const GLfloat *u ){   vbo_exec_EvalCoord1f( u[0] );}static void GLAPIENTRY vbo_exec_EvalCoord2fv( const GLfloat *u ){   vbo_exec_EvalCoord2f( u[0], u[1] );}static void GLAPIENTRY vbo_exec_EvalPoint1( GLint i ){   GET_CURRENT_CONTEXT( ctx );   GLfloat du = ((ctx->Eval.MapGrid1u2 - ctx->Eval.MapGrid1u1) /		 (GLfloat) ctx->Eval.MapGrid1un);   GLfloat u = i * du + ctx->Eval.MapGrid1u1;   vbo_exec_EvalCoord1f( u );}static void GLAPIENTRY vbo_exec_EvalPoint2( GLint i, GLint j ){   GET_CURRENT_CONTEXT( ctx );   GLfloat du = ((ctx->Eval.MapGrid2u2 - ctx->Eval.MapGrid2u1) / 		 (GLfloat) ctx->Eval.MapGrid2un);   GLfloat dv = ((ctx->Eval.MapGrid2v2 - ctx->Eval.MapGrid2v1) / 		 (GLfloat) ctx->Eval.MapGrid2vn);   GLfloat u = i * du + ctx->Eval.MapGrid2u1;   GLfloat v = j * dv + ctx->Eval.MapGrid2v1;   vbo_exec_EvalCoord2f( u, v );}/** * Check if programs/shaders are enabled and valid at glBegin time. */GLboolean vbo_validate_shaders(GLcontext *ctx){   if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) ||       (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) {      return GL_FALSE;   }   if (ctx->Shader.CurrentProgram && !ctx->Shader.CurrentProgram->LinkStatus) {      return GL_FALSE;   }   return GL_TRUE;}/* Build a list of primitives on the fly.  Keep * ctx->Driver.CurrentExecPrimitive uptodate as well. */static void GLAPIENTRY vbo_exec_Begin( GLenum mode ){   GET_CURRENT_CONTEXT( ctx );    if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) {      struct vbo_exec_context *exec = &vbo_context(ctx)->exec;      int i;      if (ctx->NewState) {	 _mesa_update_state( ctx );	 CALL_Begin(ctx->Exec, (mode));	 return;      }      if (!vbo_validate_shaders(ctx)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glBegin (invalid vertex/fragment program)");         return;      }      /* Heuristic: attempt to isolate attributes occuring outside       * begin/end pairs.       */      if (exec->vtx.vertex_size && !exec->vtx.attrsz[0]) 	 vbo_exec_FlushVertices( ctx, ~0 );      i = exec->vtx.prim_count++;      exec->vtx.prim[i].mode = mode;      exec->vtx.prim[i].begin = 1;      exec->vtx.prim[i].end = 0;      exec->vtx.prim[i].indexed = 0;      exec->vtx.prim[i].weak = 0;      exec->vtx.prim[i].pad = 0;      exec->vtx.prim[i].start = exec->vtx.vert_count;      exec->vtx.prim[i].count = 0;      ctx->Driver.CurrentExecPrimitive = mode;   }   else       _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin" );      }static void GLAPIENTRY vbo_exec_End( void ){   GET_CURRENT_CONTEXT( ctx );    if (ctx->Driver.CurrentExecPrimitive != GL_POLYGON+1) {      struct vbo_exec_context *exec = &vbo_context(ctx)->exec;      int idx = exec->vtx.vert_count;      int i = exec->vtx.prim_count - 1;      exec->vtx.prim[i].end = 1;       exec->vtx.prim[i].count = idx - exec->vtx.prim[i].start;      ctx->Driver.CurrentExecPrimitive = GL_POLYGON+1;      if (exec->vtx.prim_count == VBO_MAX_PRIM)	 vbo_exec_vtx_flush( exec );	   }   else       _mesa_error( ctx, GL_INVALID_OPERATION, "glEnd" );}static void vbo_exec_vtxfmt_init( struct vbo_exec_context *exec ){   GLvertexformat *vfmt = &exec->vtxfmt;   vfmt->ArrayElement = _ae_loopback_array_elt;	        /* generic helper */   vfmt->Begin = vbo_exec_Begin;   vfmt->CallList = _mesa_CallList;   vfmt->CallLists = _mesa_CallLists;   vfmt->End = vbo_exec_End;   vfmt->EvalCoord1f = vbo_exec_EvalCoord1f;   vfmt->EvalCoord1fv = vbo_exec_EvalCoord1fv;   vfmt->EvalCoord2f = vbo_exec_EvalCoord2f;   vfmt->EvalCoord2fv = vbo_exec_EvalCoord2fv;   vfmt->EvalPoint1 = vbo_exec_EvalPoint1;   vfmt->EvalPoint2 = vbo_exec_EvalPoint2;   vfmt->Rectf = _mesa_noop_Rectf;   vfmt->EvalMesh1 = _mesa_noop_EvalMesh1;   vfmt->EvalMesh2 = _mesa_noop_EvalMesh2;   /* from attrib_tmp.h:    */   vfmt->Color3f = vbo_Color3f;   vfmt->Color3fv = vbo_Color3fv;   vfmt->Color4f = vbo_Color4f;   vfmt->Color4fv = vbo_Color4fv;   vfmt->FogCoordfEXT = vbo_FogCoordfEXT;   vfmt->FogCoordfvEXT = vbo_FogCoordfvEXT;   vfmt->MultiTexCoord1fARB = vbo_MultiTexCoord1f;   vfmt->MultiTexCoord1fvARB = vbo_MultiTexCoord1fv;   vfmt->MultiTexCoord2fARB = vbo_MultiTexCoord2f;   vfmt->MultiTexCoord2fvARB = vbo_MultiTexCoord2fv;   vfmt->MultiTexCoord3fARB = vbo_MultiTexCoord3f;   vfmt->MultiTexCoord3fvARB = vbo_MultiTexCoord3fv;   vfmt->MultiTexCoord4fARB = vbo_MultiTexCoord4f;   vfmt->MultiTexCoord4fvARB = vbo_MultiTexCoord4fv;   vfmt->Normal3f = vbo_Normal3f;   vfmt->Normal3fv = vbo_Normal3fv;   vfmt->SecondaryColor3fEXT = vbo_SecondaryColor3fEXT;   vfmt->SecondaryColor3fvEXT = vbo_SecondaryColor3fvEXT;   vfmt->TexCoord1f = vbo_TexCoord1f;   vfmt->TexCoord1fv = vbo_TexCoord1fv;   vfmt->TexCoord2f = vbo_TexCoord2f;   vfmt->TexCoord2fv = vbo_TexCoord2fv;   vfmt->TexCoord3f = vbo_TexCoord3f;   vfmt->TexCoord3fv = vbo_TexCoord3fv;   vfmt->TexCoord4f = vbo_TexCoord4f;   vfmt->TexCoord4fv = vbo_TexCoord4fv;   vfmt->Vertex2f = vbo_Vertex2f;   vfmt->Vertex2fv = vbo_Vertex2fv;   vfmt->Vertex3f = vbo_Vertex3f;   vfmt->Vertex3fv = vbo_Vertex3fv;   vfmt->Vertex4f = vbo_Vertex4f;   vfmt->Vertex4fv = vbo_Vertex4fv;      vfmt->VertexAttrib1fARB = vbo_VertexAttrib1fARB;   vfmt->VertexAttrib1fvARB = vbo_VertexAttrib1fvARB;   vfmt->VertexAttrib2fARB = vbo_VertexAttrib2fARB;   vfmt->VertexAttrib2fvARB = vbo_VertexAttrib2fvARB;   vfmt->VertexAttrib3fARB = vbo_VertexAttrib3fARB;   vfmt->VertexAttrib3fvARB = vbo_VertexAttrib3fvARB;   vfmt->VertexAttrib4fARB = vbo_VertexAttrib4fARB;   vfmt->VertexAttrib4fvARB = vbo_VertexAttrib4fvARB;   vfmt->VertexAttrib1fNV = vbo_VertexAttrib1fNV;   vfmt->VertexAttrib1fvNV = vbo_VertexAttrib1fvNV;   vfmt->VertexAttrib2fNV = vbo_VertexAttrib2fNV;   vfmt->VertexAttrib2fvNV = vbo_VertexAttrib2fvNV;   vfmt->VertexAttrib3fNV = vbo_VertexAttrib3fNV;   vfmt->VertexAttrib3fvNV = vbo_VertexAttrib3fvNV;   vfmt->VertexAttrib4fNV = vbo_VertexAttrib4fNV;   vfmt->VertexAttrib4fvNV = vbo_VertexAttrib4fvNV;   vfmt->Materialfv = vbo_Materialfv;   vfmt->EdgeFlag = vbo_EdgeFlag;   vfmt->Indexf = vbo_Indexf;   vfmt->Indexfv = vbo_Indexfv;}void vbo_exec_vtx_init( struct vbo_exec_context *exec ){   GLcontext *ctx = exec->ctx;   struct vbo_context *vbo = vbo_context(ctx);   GLuint i;   /* Allocate a buffer object.  Will just reuse this object    * continuously.    */   _mesa_reference_buffer_object(ctx,                                 &exec->vtx.bufferobj,                                 ctx->Array.NullBufferObj);   exec->vtx.buffer_map = ALIGN_MALLOC(VBO_VERT_BUFFER_SIZE * sizeof(GLfloat), 64);   vbo_exec_vtxfmt_init( exec );   /* Hook our functions into the dispatch table.    */   _mesa_install_exec_vtxfmt( exec->ctx, &exec->vtxfmt );   for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {      exec->vtx.attrsz[i] = 0;      exec->vtx.active_sz[i] = 0;      exec->vtx.inputs[i] = &exec->vtx.arrays[i];   }      {      struct gl_client_array *arrays = exec->vtx.arrays;      memcpy(arrays,      vbo->legacy_currval,  16 * sizeof(arrays[0]));      memcpy(arrays + 16, vbo->generic_currval, 16 * sizeof(arrays[0]));   }   exec->vtx.vertex_size = 0;}void vbo_exec_vtx_destroy( struct vbo_exec_context *exec ){   if (exec->vtx.buffer_map) {      ALIGN_FREE(exec->vtx.buffer_map);      exec->vtx.buffer_map = NULL;   }}void vbo_exec_FlushVertices( GLcontext *ctx, GLuint flags ){   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;   if (exec->ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END)      return;   if (exec->vtx.vert_count) {      vbo_exec_vtx_flush( exec );   }   if (exec->vtx.vertex_size) {      vbo_exec_copy_to_current( exec );      reset_attrfv( exec );   }   exec->ctx->Driver.NeedFlush = 0;}static void reset_attrfv( struct vbo_exec_context *exec ){      GLuint i;   for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {      exec->vtx.attrsz[i] = 0;      exec->vtx.active_sz[i] = 0;   }   exec->vtx.vertex_size = 0;}      

⌨️ 快捷键说明

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