summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-05-27 18:49:11 +0200
committerMarek Olšák <[email protected]>2017-06-07 18:43:42 +0200
commitffbaba6072091712b582ea52c294edfb6a3b4e38 (patch)
tree0c08d9c791f439366c4de26e4af500b9a7faa5d8 /src
parent6e2c07749bff974e96234a1b75c15f6f4a3c82f9 (diff)
radeonsi/gfx9: fix LS scratch buffer support without TCS for GFX9
LS is merged into TCS. If there is no TCS, LS is merged into fixed-func TCS. The problem is the fixed-func TCS was ignored by scratch update functions, so LS didn't have the scratch buffer set up. Note that Mesa 17.1 doesn't have merged shaders. Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/radeonsi/si_state_shaders.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 5cbb91b819e..631272efcd6 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2711,6 +2711,15 @@ static unsigned si_get_scratch_buffer_bytes_per_wave(struct si_shader *shader)
return shader ? shader->config.scratch_bytes_per_wave : 0;
}
+static struct si_shader *si_get_tcs_current(struct si_context *sctx)
+{
+ if (!sctx->tes_shader.cso)
+ return NULL; /* tessellation disabled */
+
+ return sctx->tcs_shader.cso ? sctx->tcs_shader.current :
+ sctx->fixed_func_tcs_shader.current;
+}
+
static unsigned si_get_max_scratch_bytes_per_wave(struct si_context *sctx)
{
unsigned bytes = 0;
@@ -2718,13 +2727,19 @@ static unsigned si_get_max_scratch_bytes_per_wave(struct si_context *sctx)
bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(sctx->ps_shader.current));
bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(sctx->gs_shader.current));
bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(sctx->vs_shader.current));
- bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(sctx->tcs_shader.current));
bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(sctx->tes_shader.current));
+
+ if (sctx->tes_shader.cso) {
+ struct si_shader *tcs = si_get_tcs_current(sctx);
+
+ bytes = MAX2(bytes, si_get_scratch_buffer_bytes_per_wave(tcs));
+ }
return bytes;
}
static bool si_update_scratch_relocs(struct si_context *sctx)
{
+ struct si_shader *tcs = si_get_tcs_current(sctx);
int r;
/* Update the shaders, so that they are using the latest scratch.
@@ -2744,11 +2759,11 @@ static bool si_update_scratch_relocs(struct si_context *sctx)
if (r == 1)
si_pm4_bind_state(sctx, gs, sctx->gs_shader.current->pm4);
- r = si_update_scratch_buffer(sctx, sctx->tcs_shader.current);
+ r = si_update_scratch_buffer(sctx, tcs);
if (r < 0)
return false;
if (r == 1)
- si_pm4_bind_state(sctx, hs, sctx->tcs_shader.current->pm4);
+ si_pm4_bind_state(sctx, hs, tcs->pm4);
/* VS can be bound as LS, ES, or VS. */
r = si_update_scratch_buffer(sctx, sctx->vs_shader.current);