st/mesa: For vertex shaders, don't emit saturate when SM 3.0 is unsupported
There is a bug in the current lowering pass implementation where we lower saturate to clamp only for vertex shaders on drivers supporting SM 3.0. The correct behavior is to actually lower to clamp only when we don't support saturate which happens on drivers that don't support SM 3.0 Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
This commit is contained in:
@@ -271,6 +271,8 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
|
||||
*/
|
||||
st->ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize,
|
||||
ctx->Const.MaxPointSizeAA);
|
||||
/* For vertex shaders, make sure not to emit saturate when SM 3.0 is not supported */
|
||||
ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].EmitNoSat = !st->has_shader_model3;
|
||||
|
||||
_mesa_compute_version(ctx);
|
||||
|
||||
|
||||
@@ -5419,9 +5419,6 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
if (!pscreen->get_param(pscreen, PIPE_CAP_TEXTURE_GATHER_OFFSETS))
|
||||
lower_offset_arrays(ir);
|
||||
do_mat_op_to_vec(ir);
|
||||
/* Emit saturates in the vertex shader only if SM 3.0 is supported. */
|
||||
bool vs_sm3 = (_mesa_shader_stage_to_program(prog->_LinkedShaders[i]->Stage) ==
|
||||
GL_VERTEX_PROGRAM_ARB) && st_context(ctx)->has_shader_model3;
|
||||
lower_instructions(ir,
|
||||
MOD_TO_FRACT |
|
||||
DIV_TO_MUL_RCP |
|
||||
@@ -5432,7 +5429,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
BORROW_TO_ARITH |
|
||||
(options->EmitNoPow ? POW_TO_EXP2 : 0) |
|
||||
(!ctx->Const.NativeIntegers ? INT_DIV_TO_MUL_RCP : 0) |
|
||||
(vs_sm3 ? SAT_TO_CLAMP : 0));
|
||||
(options->EmitNoSat ? SAT_TO_CLAMP : 0));
|
||||
|
||||
lower_ubo_reference(prog->_LinkedShaders[i], ir);
|
||||
do_vec_index_to_cond_assign(ir);
|
||||
|
||||
Reference in New Issue
Block a user