/** * Really want to install these callbacks to a central facility to be * invoked according to the state flags. That will have to wait for a * mesa rework: */ void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state ) { struct vbo_context *vbo = vbo_context(ctx); struct vbo_exec_context *exec = &vbo->exec; if (!exec->validating && new_state & (_NEW_PROGRAM|_NEW_ARRAY)) { exec->array.recalculate_inputs = GL_TRUE; /* If we ended up here because a VAO was deleted, the _DrawArrays * pointer which pointed to the VAO might be invalid now, so set it * to NULL. This prevents crashes in driver functions like Clear * where driver state validation might occur, but the vbo module is * still in an invalid state. * * Drivers should skip vertex array state validation if _DrawArrays * is NULL. It also has no effect on performance, because attrib * bindings will be recalculated anyway. */ if (vbo->last_draw_method == DRAW_ARRAYS) { ctx->Array._DrawArrays = NULL; vbo->last_draw_method = DRAW_NONE; } } if (new_state & _NEW_EVAL) exec->eval.recalculate_maps = 1; _ae_invalidate_state(ctx, new_state); }
/* Really want to install these callbacks to a central facility to be * invoked according to the state flags. That will have to wait for a * mesa rework: */ void vbo_exec_invalidate_state( GLcontext *ctx, GLuint new_state ) { struct vbo_exec_context *exec = &vbo_context(ctx)->exec; if (new_state & (_NEW_PROGRAM|_NEW_EVAL)) exec->eval.recalculate_maps = 1; _ae_invalidate_state(ctx, new_state); }
void vbo_exec_invalidate_state(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); struct vbo_exec_context *exec = &vbo->exec; if (ctx->NewState & _NEW_ARRAY) { _ae_invalidate_state(ctx); } if (ctx->NewState & _NEW_EVAL) exec->eval.recalculate_maps = GL_TRUE; }
/** * Really want to install these callbacks to a central facility to be * invoked according to the state flags. That will have to wait for a * mesa rework: */ void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state ) { struct vbo_exec_context *exec = &vbo_context(ctx)->exec; if (new_state & (_NEW_PROGRAM|_NEW_ARRAY)) { exec->array.recalculate_inputs = GL_TRUE; } if (new_state & (_NEW_PROGRAM|_NEW_EVAL)) exec->eval.recalculate_maps = 1; _ae_invalidate_state(ctx, new_state); }
void _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) { TNLcontext *tnl = TNL_CONTEXT(ctx); if (new_state & (_NEW_HINT)) { ASSERT(tnl->AllowVertexFog || tnl->AllowPixelFog); tnl->_DoVertexFog = (tnl->AllowVertexFog && (ctx->Hint.Fog != GL_NICEST)) || !tnl->AllowPixelFog; } if (new_state & _NEW_ARRAY) { tnl->pipeline.run_input_changes |= ctx->Array.NewState; /* overkill */ } _ae_invalidate_state(ctx, new_state); tnl->pipeline.run_state_changes |= new_state; tnl->pipeline.build_state_changes |= (new_state & tnl->pipeline.build_state_trigger); tnl->vtx.eval.new_state |= new_state; /* Calculate tnl->render_inputs: */ if (ctx->Visual.rgbMode) { tnl->render_inputs = (_TNL_BIT_POS| _TNL_BIT_COLOR0| (ctx->Texture._EnabledCoordUnits << _TNL_ATTRIB_TEX0)); if (NEED_SECONDARY_COLOR(ctx)) tnl->render_inputs |= _TNL_BIT_COLOR1; } else { tnl->render_inputs |= (_TNL_BIT_POS|_TNL_BIT_INDEX); } if (ctx->Fog.Enabled) tnl->render_inputs |= _TNL_BIT_FOG; if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL) tnl->render_inputs |= _TNL_BIT_EDGEFLAG; if (ctx->RenderMode == GL_FEEDBACK) tnl->render_inputs |= _TNL_BIT_TEX0; if (ctx->Point._Attenuated || (ctx->VertexProgram._Enabled && ctx->VertexProgram.PointSizeEnabled)) tnl->render_inputs |= _TNL_BIT_POINTSIZE; }
void vbo_exec_invalidate_state(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); struct vbo_exec_context *exec = &vbo->exec; if (ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) { exec->array.recalculate_inputs = GL_TRUE; _ae_invalidate_state(ctx); } /* If _mesa_update_state is called in a non draw code path, * changes in the VAO need to be captured. */ if (ctx->Array.VAO->NewArrays) exec->array.recalculate_inputs = GL_TRUE; if (ctx->NewState & _NEW_EVAL) exec->eval.recalculate_maps = GL_TRUE; }
/** * Helper to enable/disable client-side state. */ static void client_state(GLcontext *ctx, GLenum cap, GLboolean state) { GLuint flag; GLboolean *var; switch (cap) { case GL_VERTEX_ARRAY: var = &ctx->Array.ArrayObj->Vertex.Enabled; flag = _NEW_ARRAY_VERTEX; break; case GL_NORMAL_ARRAY: var = &ctx->Array.ArrayObj->Normal.Enabled; flag = _NEW_ARRAY_NORMAL; break; case GL_COLOR_ARRAY: var = &ctx->Array.ArrayObj->Color.Enabled; flag = _NEW_ARRAY_COLOR0; break; case GL_INDEX_ARRAY: var = &ctx->Array.ArrayObj->Index.Enabled; flag = _NEW_ARRAY_INDEX; break; case GL_TEXTURE_COORD_ARRAY: var = &ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled; flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture); break; case GL_EDGE_FLAG_ARRAY: var = &ctx->Array.ArrayObj->EdgeFlag.Enabled; flag = _NEW_ARRAY_EDGEFLAG; break; case GL_FOG_COORDINATE_ARRAY_EXT: var = &ctx->Array.ArrayObj->FogCoord.Enabled; flag = _NEW_ARRAY_FOGCOORD; break; case GL_SECONDARY_COLOR_ARRAY_EXT: var = &ctx->Array.ArrayObj->SecondaryColor.Enabled; flag = _NEW_ARRAY_COLOR1; break; #if FEATURE_point_size_array case GL_POINT_SIZE_ARRAY_OES: var = &ctx->Array.ArrayObj->PointSize.Enabled; flag = _NEW_ARRAY_POINT_SIZE; break; #endif #if FEATURE_NV_vertex_program case GL_VERTEX_ATTRIB_ARRAY0_NV: case GL_VERTEX_ATTRIB_ARRAY1_NV: case GL_VERTEX_ATTRIB_ARRAY2_NV: case GL_VERTEX_ATTRIB_ARRAY3_NV: case GL_VERTEX_ATTRIB_ARRAY4_NV: case GL_VERTEX_ATTRIB_ARRAY5_NV: case GL_VERTEX_ATTRIB_ARRAY6_NV: case GL_VERTEX_ATTRIB_ARRAY7_NV: case GL_VERTEX_ATTRIB_ARRAY8_NV: case GL_VERTEX_ATTRIB_ARRAY9_NV: case GL_VERTEX_ATTRIB_ARRAY10_NV: case GL_VERTEX_ATTRIB_ARRAY11_NV: case GL_VERTEX_ATTRIB_ARRAY12_NV: case GL_VERTEX_ATTRIB_ARRAY13_NV: case GL_VERTEX_ATTRIB_ARRAY14_NV: case GL_VERTEX_ATTRIB_ARRAY15_NV: CHECK_EXTENSION(NV_vertex_program, cap); { GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; var = &ctx->Array.ArrayObj->VertexAttrib[n].Enabled; flag = _NEW_ARRAY_ATTRIB(n); } break; #endif /* FEATURE_NV_vertex_program */ default: _mesa_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState(0x%x)", cap); return; } if (*var == state) return; FLUSH_VERTICES(ctx, _NEW_ARRAY); ctx->Array.NewState |= flag; _ae_invalidate_state(ctx, _NEW_ARRAY); *var = state; if (state) ctx->Array.ArrayObj->_Enabled |= flag; else ctx->Array.ArrayObj->_Enabled &= ~flag; if (ctx->Driver.Enable) { ctx->Driver.Enable( ctx, cap, state ); } }
void _vbo_InvalidateState( GLcontext *ctx, GLuint new_state ) { _ae_invalidate_state(ctx, new_state); vbo_exec_invalidate_state(ctx, new_state); }
/** * Helper to enable/disable client-side state. */ static void client_state(struct gl_context *ctx, GLenum cap, GLboolean state) { GLbitfield64 flag; GLboolean *var; switch (cap) { case GL_VERTEX_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Enabled; flag = VERT_BIT_POS; break; case GL_NORMAL_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL].Enabled; flag = VERT_BIT_NORMAL; break; case GL_COLOR_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR].Enabled; flag = VERT_BIT_COLOR; break; case GL_INDEX_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled; flag = VERT_BIT_COLOR_INDEX; break; case GL_TEXTURE_COORD_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_TEX].Enabled; flag = VERT_BIT_TEX; break; case GL_EDGE_FLAG_ARRAY: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled; flag = VERT_BIT_EDGEFLAG; break; case GL_FOG_COORDINATE_ARRAY_EXT: var = &ctx->Array.VertexAttrib[VERT_ATTRIB_FOG].Enabled; flag = VERT_BIT_FOG; break; default: goto invalid_enum_error; } if (*var == state) return; FLUSH_VERTICES(ctx, _NEW_ARRAY); ctx->Array.NewState |= flag; _ae_invalidate_state(ctx, _NEW_ARRAY); *var = state; if (state) ctx->Array._Enabled |= flag; else ctx->Array._Enabled &= ~flag; if (ctx->Driver.Enable) { ctx->Driver.Enable( ctx, cap, state ); } return; invalid_enum_error: _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(0x%x)", state ? "Enable" : "Disable", cap); }
/** * Helper to enable/disable client-side state. */ static void client_state(struct gl_context *ctx, GLenum cap, GLboolean state) { struct gl_array_object *arrayObj = ctx->Array.ArrayObj; GLbitfield64 flag; GLboolean *var; switch (cap) { case GL_VERTEX_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled; flag = VERT_BIT_POS; break; case GL_NORMAL_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled; flag = VERT_BIT_NORMAL; break; case GL_COLOR_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled; flag = VERT_BIT_COLOR0; break; case GL_INDEX_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled; flag = VERT_BIT_COLOR_INDEX; break; case GL_TEXTURE_COORD_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_TEX].Enabled; flag = VERT_BIT_TEX; break; case GL_EDGE_FLAG_ARRAY: var = &arrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled; flag = VERT_BIT_EDGEFLAG; break; case GL_FOG_COORDINATE_ARRAY_EXT: var = &arrayObj->VertexAttrib[VERT_ATTRIB_FOG].Enabled; flag = VERT_BIT_FOG; break; case GL_SECONDARY_COLOR_ARRAY_EXT: var = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled; flag = VERT_BIT_COLOR1; break; #if FEATURE_point_size_array case GL_POINT_SIZE_ARRAY_OES: var = &arrayObj->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Enabled; flag = VERT_BIT_POINT_SIZE; break; #endif #if FEATURE_NV_vertex_program case GL_VERTEX_ATTRIB_ARRAY0_NV: case GL_VERTEX_ATTRIB_ARRAY1_NV: case GL_VERTEX_ATTRIB_ARRAY2_NV: case GL_VERTEX_ATTRIB_ARRAY3_NV: case GL_VERTEX_ATTRIB_ARRAY4_NV: case GL_VERTEX_ATTRIB_ARRAY5_NV: case GL_VERTEX_ATTRIB_ARRAY6_NV: case GL_VERTEX_ATTRIB_ARRAY7_NV: case GL_VERTEX_ATTRIB_ARRAY8_NV: case GL_VERTEX_ATTRIB_ARRAY9_NV: case GL_VERTEX_ATTRIB_ARRAY10_NV: case GL_VERTEX_ATTRIB_ARRAY11_NV: case GL_VERTEX_ATTRIB_ARRAY12_NV: case GL_VERTEX_ATTRIB_ARRAY13_NV: case GL_VERTEX_ATTRIB_ARRAY14_NV: case GL_VERTEX_ATTRIB_ARRAY15_NV: CHECK_EXTENSION(NV_vertex_program, cap); { GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; ASSERT(VERT_ATTRIB_GENERIC(n) < Elements(ctx->Array.ArrayObj->VertexAttrib)); var = &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(n)].Enabled; flag = VERT_BIT_GENERIC(n); } break; #endif /* FEATURE_NV_vertex_program */ default: goto invalid_enum_error; } if (*var == state) return; FLUSH_VERTICES(ctx, _NEW_ARRAY); ctx->Array.NewState |= flag; _ae_invalidate_state(ctx, _NEW_ARRAY); *var = state; if (state) ctx->Array.ArrayObj->_Enabled |= flag; else ctx->Array.ArrayObj->_Enabled &= ~flag; if (ctx->Driver.Enable) { ctx->Driver.Enable( ctx, cap, state ); } return; invalid_enum_error: _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(0x%x)", state ? "Enable" : "Disable", cap); }