diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c index 394a6180f58..be6d3d8181a 100644 --- a/src/mesa/drivers/dri/i915/i915_context.c +++ b/src/mesa/drivers/dri/i915/i915_context.c @@ -30,6 +30,7 @@ #include "main/framebuffer.h" #include "main/extensions.h" #include "main/macros.h" +#include "main/state.h" #include "main/version.h" #include "main/vtxfmt.h" #include "intel_chipset.h" @@ -255,6 +256,7 @@ i915CreateContext(int api, ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt; ctx->FragmentProgram._MaintainTexEnvProgram = true; + _mesa_reset_vertex_processing_mode(ctx); /* FINISHME: Are there other options that should be enabled for software * FINISHME: vertex shaders? diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index a156c2534c3..be26d4f5004 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1127,6 +1127,7 @@ brwCreateContext(gl_api api, ctx->VertexProgram._MaintainTnlProgram = true; ctx->FragmentProgram._MaintainTexEnvProgram = true; + _mesa_reset_vertex_processing_mode(ctx); brw_draw_init( brw ); diff --git a/src/mesa/drivers/x11/xm_api.c b/src/mesa/drivers/x11/xm_api.c index a3990d2048b..b3aa687872e 100644 --- a/src/mesa/drivers/x11/xm_api.c +++ b/src/mesa/drivers/x11/xm_api.c @@ -71,6 +71,7 @@ #include "main/framebuffer.h" #include "main/macros.h" #include "main/renderbuffer.h" +#include "main/state.h" #include "main/teximage.h" #include "main/version.h" #include "main/vtxfmt.h" @@ -920,6 +921,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) if (0) { mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE; mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; + _mesa_reset_vertex_processing_mode(ctx); } _mesa_enable_sw_extensions(mesaCtx); diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 29653bd19a6..66b3141e7f7 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1247,6 +1247,7 @@ _mesa_initialize_context(struct gl_context *ctx, if (ctx->VertexProgram._MaintainTnlProgram) { /* this is required... */ ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; + _mesa_reset_vertex_processing_mode(ctx); } /* Mesa core handles all the formats that mesa core knows about. @@ -1287,6 +1288,7 @@ _mesa_initialize_context(struct gl_context *ctx, case API_OPENGLES2: ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; ctx->VertexProgram._MaintainTnlProgram = GL_TRUE; + _mesa_reset_vertex_processing_mode(ctx); break; } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 59b7d1cdbf4..e72ee17412f 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2382,6 +2382,8 @@ struct gl_vertex_program_state GLboolean _Overriden; + bool _VPModeOptimizesConstantAttribs; + /** * If we have a vertex program, a TNL program or no program at all. * Note that this value should be kept up to date all the time, diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 76ebef0b473..9431b73b346 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -571,19 +571,8 @@ _mesa_update_state( struct gl_context *ctx ) static void set_varying_vp_inputs(struct gl_context *ctx, GLbitfield varying_inputs) { - /* - * The gl_context::varying_vp_inputs value is only used when in - * VP_MODE_FF mode. - */ - if (VP_MODE_FF != ctx->VertexProgram._VPMode) - return; - - /* Only fixed-func generated programs ever uses varying_vp_inputs. */ - if (!ctx->VertexProgram._MaintainTnlProgram && - !ctx->FragmentProgram._MaintainTexEnvProgram) - return; - - if (ctx->varying_vp_inputs != varying_inputs) { + if (ctx->VertexProgram._VPModeOptimizesConstantAttribs && + ctx->varying_vp_inputs != varying_inputs) { ctx->varying_vp_inputs = varying_inputs; ctx->NewState |= _NEW_VARYING_VP_INPUTS; } @@ -622,6 +611,14 @@ set_vertex_processing_mode(struct gl_context *ctx, gl_vertex_processing_mode m) /* Finally memorize the value */ ctx->VertexProgram._VPMode = m; + /* The gl_context::varying_vp_inputs value is only used when in + * VP_MODE_FF mode and the fixed-func pipeline is emulated by shaders. + */ + ctx->VertexProgram._VPModeOptimizesConstantAttribs = + m == VP_MODE_FF && + ctx->VertexProgram._MaintainTnlProgram && + ctx->FragmentProgram._MaintainTexEnvProgram; + /* Since we only track the varying inputs while being in fixed function * vertex processing mode, we may need to recheck for the * _NEW_VARYING_VP_INPUTS bit. @@ -649,6 +646,13 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx) } +void +_mesa_reset_vertex_processing_mode(struct gl_context *ctx) +{ + ctx->VertexProgram._VPMode = -1; /* force the update */ + _mesa_update_vertex_processing_mode(ctx); +} + /** * Set the _DrawVAO and the net enabled arrays. * The vao->_Enabled bitmask is transformed due to position/generic0 diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index 1ad5525a132..d9b4584e417 100644 --- a/src/mesa/main/state.h +++ b/src/mesa/main/state.h @@ -54,6 +54,9 @@ _mesa_set_vp_override(struct gl_context *ctx, GLboolean flag); extern void _mesa_update_vertex_processing_mode(struct gl_context *ctx); +extern void +_mesa_reset_vertex_processing_mode(struct gl_context *ctx); + /** * Set the _DrawVAO and the net enabled arrays. diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index d23cbafd230..27581f0c538 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -35,6 +35,7 @@ #include "main/hash.h" #include "main/macros.h" #include "main/shaderobj.h" +#include "main/state.h" #include "program.h" #include "prog_cache.h" #include "prog_parameter.h" @@ -100,7 +101,7 @@ _mesa_init_program(struct gl_context *ctx) ctx->Shared->DefaultFragmentProgram); assert(ctx->FragmentProgram.Current); ctx->FragmentProgram.Cache = _mesa_new_program_cache(); - ctx->VertexProgram._VPMode = VP_MODE_FF; + _mesa_reset_vertex_processing_mode(ctx); /* XXX probably move this stuff */ ctx->ATIFragmentShader.Enabled = GL_FALSE; diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index e0617157f1b..68a0a193ef2 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -33,6 +33,7 @@ #include "main/glthread.h" #include "main/samplerobj.h" #include "main/shaderobj.h" +#include "main/state.h" #include "main/version.h" #include "main/vtxfmt.h" #include "main/hash.h" @@ -649,6 +650,7 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, */ ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; ctx->VertexProgram._MaintainTnlProgram = GL_TRUE; + _mesa_reset_vertex_processing_mode(ctx); if (no_error) ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR;