Module: Mesa
Branch: master
Commit: ffbaba6072091712b582ea52c294edfb6a3b4e38
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffbaba6072091712b582ea52c294edfb6a3b4e38

Author: Marek Olšák <marek.ol...@amd.com>
Date:   Sat May 27 18:49:11 2017 +0200

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 <nicolai.haeh...@amd.com>

---

 src/gallium/drivers/radeonsi/si_state_shaders.c | 21 ++++++++++++++++++---
 1 file 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 5cbb91b819..631272efcd 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);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to