[Mesa-dev] [PATCH 2/5] st/glsl_to_tgsi: fix conditional assignments to packed shader outputs
Ian Romanick
idr at freedesktop.org
Tue Sep 26 18:34:49 UTC 2017
I'm hoping to land my patch series that removes ir_assignment::condition
either today or tomorrow. I believe that series deletes all of this
code... but this patch would still be useful for stable.
On 09/26/2017 07:42 AM, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Overriding the default (no-op) swizzle is clearly counter-productive,
> since the whole point is putting the destination register as one of
> the source operands so that it remains unmodified when the assignment
> condition is false.
>
> Fragment depth and stencil outputs are a special case due to how their
> source swizzles are manipulated in translate_src when compiling to
> TGSI.
>
> Fixes dEQP-GLES2.functional.shaders.conditionals.if.*_vertex
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index f4870a1c606..0daf5a14285 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -2890,21 +2890,29 @@ glsl_to_tgsi_visitor::emit_block_mov(ir_assignment *ir, const struct glsl_type *
> }
> return;
> }
>
> assert(type->is_scalar() || type->is_vector());
>
> l->type = type->base_type;
> r->type = type->base_type;
> if (cond) {
> st_src_reg l_src = st_src_reg(*l);
> - l_src.swizzle = swizzle_for_size(type->vector_elements);
> +
> + if (l_src.file == PROGRAM_OUTPUT &&
> + this->prog->Target == GL_FRAGMENT_PROGRAM_ARB &&
> + (l_src.index == FRAG_RESULT_DEPTH || l_src.index == FRAG_RESULT_STENCIL)) {
> + /* This is a special case because the source swizzles will be shifted
> + * later to account for the difference between GLSL (where they're
> + * plain floats) and TGSI (where they're Z and Y components). */
> + l_src.swizzle = SWIZZLE_XXXX;
> + }
>
> if (native_integers) {
> emit_asm(ir, TGSI_OPCODE_UCMP, *l, *cond,
> cond_swap ? l_src : *r,
> cond_swap ? *r : l_src);
> } else {
> emit_asm(ir, TGSI_OPCODE_CMP, *l, *cond,
> cond_swap ? l_src : *r,
> cond_swap ? *r : l_src);
> }
>
More information about the mesa-dev
mailing list