radeonsi/gfx9: don't read LS out vertex stride from an SGPR in monolithic HS
authorMarek Olšák <marek.olsak@amd.com>
Tue, 5 Sep 2017 17:02:13 +0000 (19:02 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 7 Sep 2017 11:00:07 +0000 (13:00 +0200)
-44 bytes in a monolithic LS-HS binary.

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
src/gallium/drivers/radeonsi/si_state_shaders.c

index 362ee038e1cdbc5e99a922c93df4529194e42721..96ba907a0822952c6600857b345b1f58a76b5599 100644 (file)
@@ -408,6 +408,11 @@ static LLVMValueRef get_tcs_in_vertex_dw_stride(struct si_shader_context *ctx)
                return LLVMConstInt(ctx->i32, stride * 4, 0);
 
        case PIPE_SHADER_TESS_CTRL:
+               if (ctx->screen->b.chip_class >= GFX9 &&
+                   ctx->shader->is_monolithic) {
+                       stride = util_last_bit64(ctx->shader->key.part.tcs.ls->outputs_written);
+                       return LLVMConstInt(ctx->i32, stride * 4, 0);
+               }
                return unpack_param(ctx, ctx->param_vs_state_bits, 24, 8);
 
        default:
index d8791a2a62ef81419f03ea7924c9476eba6903d7..9f76551cfbbbb40327534edb85695d4c66b89da5 100644 (file)
@@ -1291,7 +1291,12 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
                         *  - remove the fixup for unused input VGPRs
                         */
                        key->part.tcs.ls_prolog.ls_vgpr_fix = sctx->ls_vgpr_fix;
-                       key->opt.prefer_mono = sctx->ls_vgpr_fix;
+
+                       /* The LS output / HS input layout can be communicated
+                        * directly instead of via user SGPRs for merged LS-HS.
+                        * The LS VGPR fix prefers this too.
+                        */
+                       key->opt.prefer_mono = 1;
                }
 
                key->part.tcs.epilog.prim_mode =