st/glsl_to_tgsi: swizzle PROGRAM_OUTPUTs correctly in src_register translation

This is required for reading directly from fragment shader stencil and depth
outputs.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle 2016-11-21 10:36:50 +01:00
parent 611166b8ed
commit 0a58b258ca
1 changed files with 11 additions and 1 deletions

View File

@ -5383,9 +5383,19 @@ src_register(struct st_translate *t, const st_src_reg *reg)
case PROGRAM_TEMPORARY:
case PROGRAM_ARRAY:
case PROGRAM_OUTPUT:
return ureg_src(dst_register(t, reg->file, reg->index, reg->array_id));
case PROGRAM_OUTPUT: {
struct ureg_dst dst = dst_register(t, reg->file, reg->index, reg->array_id);
assert(dst.WriteMask != 0);
unsigned shift = ffs(dst.WriteMask) - 1;
return ureg_swizzle(ureg_src(dst),
shift,
MIN2(shift + 1, 3),
MIN2(shift + 2, 3),
MIN2(shift + 3, 3));
}
case PROGRAM_UNIFORM:
assert(reg->index >= 0);
return reg->index < t->num_constants ?