radeonsi: don't read tcs_out_lds_layout.patch_stride from an SGPR
authorMarek Olšák <marek.olsak@amd.com>
Tue, 5 Sep 2017 18:09:05 +0000 (20:09 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 7 Sep 2017 11:00:07 +0000 (13:00 +0200)
Same as before, writing TCS outputs to LDS is rare.

Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.c

index 9117aec5b77485b292181a7c5eeedae55f346437..e0e9c14beb54102036f2ed8bbb5686d824b2bef6 100644 (file)
@@ -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)
 {