diff options
author | Marek Olšák <[email protected]> | 2017-05-01 17:34:41 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-05-03 22:58:27 +0200 |
commit | f466683cb07796fa89f96ef87a6f076218ae6db8 (patch) | |
tree | e9e880519b00a49db954e6e36fbeebb5a2cdc5e0 /src/gallium/drivers/radeonsi/si_shader.c | |
parent | ec34632859f0420e0d1912357a96ec280ed87561 (diff) |
radeonsi/gfx9: fix gl_ViewportIndex
v2: remove unnecessary LLVMBuildAnd calls
Cc: 17.1 <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_shader.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 7f771408a37..3af878b5c20 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2393,8 +2393,8 @@ handle_semantic: shader->selector->info.writes_layer) { pos_args[1].enabled_channels = shader->selector->info.writes_psize | (shader->selector->info.writes_edgeflag << 1) | - (shader->selector->info.writes_layer << 2) | - (shader->selector->info.writes_viewport_index << 3); + (shader->selector->info.writes_layer << 2); + pos_args[1].valid_mask = 0; /* EXEC mask */ pos_args[1].done = 0; /* last export? */ pos_args[1].target = V_008DFC_SQ_EXP_POS + 1; @@ -2423,11 +2423,34 @@ handle_semantic: ctx->f32, ""); } - if (shader->selector->info.writes_layer) - pos_args[1].out[2] = layer_value; + if (ctx->screen->b.chip_class >= GFX9) { + /* GFX9 has the layer in out.z[10:0] and the viewport + * index in out.z[19:16]. + */ + if (shader->selector->info.writes_layer) + pos_args[1].out[2] = layer_value; + + if (shader->selector->info.writes_viewport_index) { + LLVMValueRef v = viewport_index_value; + + v = bitcast(bld_base, TGSI_TYPE_UNSIGNED, v); + v = LLVMBuildShl(ctx->gallivm.builder, v, + LLVMConstInt(ctx->i32, 16, 0), ""); + v = LLVMBuildOr(ctx->gallivm.builder, v, + bitcast(bld_base, TGSI_TYPE_UNSIGNED, + pos_args[1].out[2]), ""); + pos_args[1].out[2] = bitcast(bld_base, TGSI_TYPE_FLOAT, v); + pos_args[1].enabled_channels |= 1 << 2; + } + } else { + if (shader->selector->info.writes_layer) + pos_args[1].out[2] = layer_value; - if (shader->selector->info.writes_viewport_index) - pos_args[1].out[3] = viewport_index_value; + if (shader->selector->info.writes_viewport_index) { + pos_args[1].out[3] = viewport_index_value; + pos_args[1].enabled_channels |= 1 << 3; + } + } } for (i = 0; i < 4; i++) |