aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main/state.c
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2018-02-02 21:31:27 +0100
committerMathias Fröhlich <[email protected]>2018-02-23 05:33:30 +0100
commit92d76a169127a6b8b4e2027a95425b592d0ca3db (patch)
tree59bda0fe66dd075475717cf249fa9c797fff2b9e /src/mesa/main/state.c
parentd73f1f2ad879d0c6712931b75f2bfb995c2c9fcb (diff)
mesa: Provide an alternative to get_vp_mode()
To get equivalent information than get_vp_mode(), track the vertex processing mode in a per context variable at gl_vertex_program_state::_VPMode. This aims to replace get_vp_mode() as seen in the vbo module. But instead of the get_vp_mode() implementation which only gives correct answers past calling _mesa_update_state() this context variable is immediately tracked when the vertex processing state is modified. The correctness of this value is asserted on state validation. With this in place we should be able to untangle the dependency with varying_vp_inputs and state invalidation. Signed-off-by: Mathias Fröhlich <[email protected]> Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/mesa/main/state.c')
-rw-r--r--src/mesa/main/state.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index df694d09092..2fd4fb9d323 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -177,15 +177,18 @@ update_program(struct gl_context *ctx)
*/
if (vsProg) {
/* Use GLSL vertex shader */
+ assert(VP_MODE_SHADER == ctx->VertexProgram._VPMode);
_mesa_reference_program(ctx, &ctx->VertexProgram._Current, vsProg);
}
else if (_mesa_arb_vertex_program_enabled(ctx)) {
/* Use user-defined vertex program */
+ assert(VP_MODE_SHADER == ctx->VertexProgram._VPMode);
_mesa_reference_program(ctx, &ctx->VertexProgram._Current,
ctx->VertexProgram.Current);
}
else if (ctx->VertexProgram._MaintainTnlProgram) {
/* Use vertex program generated from fixed-function state */
+ assert(VP_MODE_FF == ctx->VertexProgram._VPMode);
_mesa_reference_program(ctx, &ctx->VertexProgram._Current,
_mesa_get_fixed_func_vertex_program(ctx));
_mesa_reference_program(ctx, &ctx->VertexProgram._TnlProgram,
@@ -193,6 +196,7 @@ update_program(struct gl_context *ctx)
}
else {
/* no vertex program */
+ assert(VP_MODE_FF == ctx->VertexProgram._VPMode);
_mesa_reference_program(ctx, &ctx->VertexProgram._Current, NULL);
}
@@ -456,3 +460,22 @@ _mesa_set_vp_override(struct gl_context *ctx, GLboolean flag)
ctx->NewState |= _NEW_PROGRAM;
}
}
+
+
+/**
+ * Update ctx->VertexProgram._VPMode.
+ * This is to distinguish whether we're running
+ * a vertex program/shader,
+ * a fixed-function TNL program or
+ * a fixed function vertex transformation without any program.
+ */
+void
+_mesa_update_vertex_processing_mode(struct gl_context *ctx)
+{
+ if (ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX])
+ ctx->VertexProgram._VPMode = VP_MODE_SHADER;
+ else if (_mesa_arb_vertex_program_enabled(ctx))
+ ctx->VertexProgram._VPMode = VP_MODE_SHADER;
+ else
+ ctx->VertexProgram._VPMode = VP_MODE_FF;
+}