📄 vbo_exec_api.c
字号:
\ 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 + -