[Mesa-dev] [PATCH 2/5] st/glsl_to_tgsi: fix conditional assignments to packed shader outputs
Nicolai Hähnle
nicolai.haehnle at amd.com
Tue Sep 26 19:33:33 UTC 2017
On 26.09.2017 20:34, Ian Romanick wrote:
> 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.
Yep, that series is much appreciated. If it weren't for stable, I would
have just waited :)
Cheers,
Nicolai
> 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