This flag essentially tells the compiler whether it prefers dot products or multiply/adds for matrix operations. As such, ShaderCompilerOptions seems like the right place for it. This also lets us specify it on a per-stage basis. This patch makes all existing users set the flag for the Vertex Shader stage only, as it's currently only used for fixed-function vertex programs. That will change soon, and I wanted to preserve the existing behavior. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Eric Anholt <eric@anholt.net>tags/mesa-9.2-rc1
@@ -351,7 +351,7 @@ GLboolean r200CreateContext( gl_api api, | |||
ctx->Const.MaxDrawBuffers = 1; | |||
ctx->Const.MaxColorAttachments = 1; | |||
_mesa_set_mvp_with_dp4( ctx, GL_TRUE ); | |||
ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].PreferDP4 = GL_TRUE; | |||
/* Install the customized pipeline: | |||
*/ |
@@ -314,7 +314,7 @@ r100CreateContext( gl_api api, | |||
ctx->Const.MaxColorAttachments = 1; | |||
ctx->Const.MaxRenderbufferSize = 2048; | |||
_mesa_set_mvp_with_dp4( ctx, GL_TRUE ); | |||
ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].PreferDP4 = true; | |||
/* Install the customized pipeline: | |||
*/ |
@@ -1720,18 +1720,6 @@ _mesa_Flush(void) | |||
} | |||
/** | |||
* Set mvp_with_dp4 flag. If a driver has a preference for DP4 over | |||
* MUL/MAD, or vice versa, call this function to register that. | |||
* Otherwise we default to MUL/MAD. | |||
*/ | |||
void | |||
_mesa_set_mvp_with_dp4( struct gl_context *ctx, | |||
GLboolean flag ) | |||
{ | |||
ctx->mvp_with_dp4 = flag; | |||
} | |||
/* | |||
* ARB_blend_func_extended - ERRORS section | |||
* "The error INVALID_OPERATION is generated by Begin or any procedure that |
@@ -155,11 +155,6 @@ extern struct _glapi_table * | |||
_mesa_get_dispatch(struct gl_context *ctx); | |||
void | |||
_mesa_set_mvp_with_dp4( struct gl_context *ctx, | |||
GLboolean flag ); | |||
extern GLboolean | |||
_mesa_valid_to_render(struct gl_context *ctx, const char *where); | |||
@@ -1674,7 +1674,7 @@ _mesa_get_fixed_func_vertex_program(struct gl_context *ctx) | |||
return NULL; | |||
create_new_program( &key, prog, | |||
ctx->mvp_with_dp4, | |||
ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].PreferDP4, | |||
ctx->Const.VertexProgram.MaxTemps ); | |||
#if 0 |
@@ -2433,6 +2433,12 @@ struct gl_shader_compiler_options | |||
GLuint MaxIfDepth; /**< Maximum nested IF blocks */ | |||
GLuint MaxUnrollIterations; | |||
/** | |||
* Prefer DP4 instructions (rather than MUL/MAD) for matrix * vector | |||
* operations, such as position transformation. | |||
*/ | |||
GLboolean PreferDP4; | |||
struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */ | |||
}; | |||
@@ -3574,12 +3580,6 @@ struct gl_context | |||
GLboolean TextureFormatSupported[MESA_FORMAT_COUNT]; | |||
/** | |||
* Use dp4 (rather than mul/mad) instructions for position | |||
* transformation? | |||
*/ | |||
GLboolean mvp_with_dp4; | |||
GLboolean RasterDiscard; /**< GL_RASTERIZER_DISCARD */ | |||
/** |
@@ -219,7 +219,7 @@ _mesa_insert_mvp_mad_code(struct gl_context *ctx, struct gl_vertex_program *vpro | |||
void | |||
_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_vertex_program *vprog) | |||
{ | |||
if (ctx->mvp_with_dp4) | |||
if (ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].PreferDP4) | |||
_mesa_insert_mvp_dp4_code( ctx, vprog ); | |||
else | |||
_mesa_insert_mvp_mad_code( ctx, vprog ); |
@@ -240,7 +240,7 @@ struct st_context *st_create_context(gl_api api, struct pipe_context *pipe, | |||
* driver prefers DP4 or MUL/MAD for vertex transformation. | |||
*/ | |||
if (debug_get_option_mesa_mvp_dp4()) | |||
_mesa_set_mvp_with_dp4( ctx, GL_TRUE ); | |||
ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].PreferDP4 = GL_TRUE; | |||
return st_create_context_priv(ctx, pipe, options); | |||
} |