summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeonsi/si_shader.c
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-09-05 20:09:05 +0200
committerMarek Olšák <[email protected]>2017-09-07 13:00:07 +0200
commit7ec64bd88cc6f3b5977e3526c5ecff1e07847e8c (patch)
tree4e9cea3e80fcb72e9a0b4996517e54736bb69755 /src/gallium/drivers/radeonsi/si_shader.c
parent07fe10c75d0f099c1a4f6b5e41c65ed46f30223e (diff)
radeonsi: don't read tcs_out_lds_layout.patch_stride from an SGPR
Same as before, writing TCS outputs to LDS is rare. Tested-by: Dieter Nützel <[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.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 9117aec5b77..e0e9c14beb5 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -320,12 +320,6 @@ get_tcs_in_patch_stride(struct si_shader_context *ctx)
return unpack_param(ctx, ctx->param_vs_state_bits, 8, 13);
}
-static LLVMValueRef
-get_tcs_out_patch_stride(struct si_shader_context *ctx)
-{
- return unpack_param(ctx, ctx->param_tcs_out_lds_layout, 0, 13);
-}
-
static unsigned get_tcs_out_vertex_dw_stride_constant(struct si_shader_context *ctx)
{
assert(ctx->type == PIPE_SHADER_TESS_CTRL);
@@ -343,6 +337,20 @@ static LLVMValueRef get_tcs_out_vertex_dw_stride(struct si_shader_context *ctx)
return LLVMConstInt(ctx->i32, stride, 0);
}
+static LLVMValueRef get_tcs_out_patch_stride(struct si_shader_context *ctx)
+{
+ if (ctx->shader->key.mono.u.ff_tcs_inputs_to_copy)
+ return unpack_param(ctx, ctx->param_tcs_out_lds_layout, 0, 13);
+
+ const struct tgsi_shader_info *info = &ctx->shader->selector->info;
+ unsigned tcs_out_vertices = info->properties[TGSI_PROPERTY_TCS_VERTICES_OUT];
+ unsigned vertex_dw_stride = get_tcs_out_vertex_dw_stride_constant(ctx);
+ unsigned num_patch_outputs = util_last_bit64(ctx->shader->selector->patch_outputs_written);
+ unsigned patch_dw_stride = tcs_out_vertices * vertex_dw_stride +
+ num_patch_outputs * 4;
+ return LLVMConstInt(ctx->i32, patch_dw_stride, 0);
+}
+
static LLVMValueRef
get_tcs_out_patch0_offset(struct si_shader_context *ctx)
{