From: Marek Olšák <[email protected]>

Picked from a different branch. When we stop using the scratch patching,
this function will not be called.
---
 src/gallium/drivers/radeonsi/si_state_shaders.c | 101 +++++++++++++-----------
 1 file changed, 55 insertions(+), 46 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index ac53eff..16fb522 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2635,95 +2635,104 @@ static unsigned 
si_get_max_scratch_bytes_per_wave(struct si_context *sctx)
        unsigned bytes = 0;
 
        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));
        return bytes;
 }
 
+static bool si_update_scratch_relocs(struct si_context *sctx)
+{
+       int r;
+
+       /* Update the shaders, so that they are using the latest scratch.
+        * The scratch buffer may have been changed since these shaders were
+        * last used, so we still need to try to update them, even if they
+        * require scratch buffers smaller than the current size.
+        */
+       r = si_update_scratch_buffer(sctx, sctx->ps_shader.current);
+       if (r < 0)
+               return false;
+       if (r == 1)
+               si_pm4_bind_state(sctx, ps, sctx->ps_shader.current->pm4);
+
+       r = si_update_scratch_buffer(sctx, sctx->gs_shader.current);
+       if (r < 0)
+               return false;
+       if (r == 1)
+               si_pm4_bind_state(sctx, gs, sctx->gs_shader.current->pm4);
+
+       r = si_update_scratch_buffer(sctx, sctx->tcs_shader.current);
+       if (r < 0)
+               return false;
+       if (r == 1)
+               si_pm4_bind_state(sctx, hs, sctx->tcs_shader.current->pm4);
+
+       /* VS can be bound as LS, ES, or VS. */
+       r = si_update_scratch_buffer(sctx, sctx->vs_shader.current);
+       if (r < 0)
+               return false;
+       if (r == 1) {
+               if (sctx->tes_shader.current)
+                       si_pm4_bind_state(sctx, ls, 
sctx->vs_shader.current->pm4);
+               else if (sctx->gs_shader.current)
+                       si_pm4_bind_state(sctx, es, 
sctx->vs_shader.current->pm4);
+               else
+                       si_pm4_bind_state(sctx, vs, 
sctx->vs_shader.current->pm4);
+       }
+
+       /* TES can be bound as ES or VS. */
+       r = si_update_scratch_buffer(sctx, sctx->tes_shader.current);
+       if (r < 0)
+               return false;
+       if (r == 1) {
+               if (sctx->gs_shader.current)
+                       si_pm4_bind_state(sctx, es, 
sctx->tes_shader.current->pm4);
+               else
+                       si_pm4_bind_state(sctx, vs, 
sctx->tes_shader.current->pm4);
+       }
+
+       return true;
+}
+
 static bool si_update_spi_tmpring_size(struct si_context *sctx)
 {
        unsigned current_scratch_buffer_size =
                si_get_current_scratch_buffer_size(sctx);
        unsigned scratch_bytes_per_wave =
                si_get_max_scratch_bytes_per_wave(sctx);
        unsigned scratch_needed_size = scratch_bytes_per_wave *
                sctx->scratch_waves;
        unsigned spi_tmpring_size;
-       int r;
 
        if (scratch_needed_size > 0) {
                if (scratch_needed_size > current_scratch_buffer_size) {
                        /* Create a bigger scratch buffer */
                        r600_resource_reference(&sctx->scratch_buffer, NULL);
 
                        sctx->scratch_buffer = (struct r600_resource*)
                                r600_aligned_buffer_create(&sctx->screen->b.b,
                                                           
R600_RESOURCE_FLAG_UNMAPPABLE,
                                                           PIPE_USAGE_DEFAULT,
                                                           scratch_needed_size, 
256);
                        if (!sctx->scratch_buffer)
                                return false;
 
                        si_mark_atom_dirty(sctx, &sctx->scratch_state);
                        r600_context_add_resource_size(&sctx->b.b,
                                                       
&sctx->scratch_buffer->b.b);
                }
 
-               /* Update the shaders, so they are using the latest scratch.  
The
-                * scratch buffer may have been changed since these shaders were
-                * last used, so we still need to try to update them, even if
-                * they require scratch buffers smaller than the current size.
-                */
-               r = si_update_scratch_buffer(sctx, sctx->ps_shader.current);
-               if (r < 0)
-                       return false;
-               if (r == 1)
-                       si_pm4_bind_state(sctx, ps, 
sctx->ps_shader.current->pm4);
-
-               r = si_update_scratch_buffer(sctx, sctx->gs_shader.current);
-               if (r < 0)
-                       return false;
-               if (r == 1)
-                       si_pm4_bind_state(sctx, gs, 
sctx->gs_shader.current->pm4);
-
-               r = si_update_scratch_buffer(sctx, sctx->tcs_shader.current);
-               if (r < 0)
+               if (!si_update_scratch_relocs(sctx))
                        return false;
-               if (r == 1)
-                       si_pm4_bind_state(sctx, hs, 
sctx->tcs_shader.current->pm4);
-
-               /* VS can be bound as LS, ES, or VS. */
-               r = si_update_scratch_buffer(sctx, sctx->vs_shader.current);
-               if (r < 0)
-                       return false;
-               if (r == 1) {
-                       if (sctx->tes_shader.current)
-                               si_pm4_bind_state(sctx, ls, 
sctx->vs_shader.current->pm4);
-                       else if (sctx->gs_shader.current)
-                               si_pm4_bind_state(sctx, es, 
sctx->vs_shader.current->pm4);
-                       else
-                               si_pm4_bind_state(sctx, vs, 
sctx->vs_shader.current->pm4);
-               }
-
-               /* TES can be bound as ES or VS. */
-               r = si_update_scratch_buffer(sctx, sctx->tes_shader.current);
-               if (r < 0)
-                       return false;
-               if (r == 1) {
-                       if (sctx->gs_shader.current)
-                               si_pm4_bind_state(sctx, es, 
sctx->tes_shader.current->pm4);
-                       else
-                               si_pm4_bind_state(sctx, vs, 
sctx->tes_shader.current->pm4);
-               }
        }
 
        /* The LLVM shader backend should be reporting aligned scratch_sizes. */
        assert((scratch_needed_size & ~0x3FF) == scratch_needed_size &&
                "scratch size should already be aligned correctly.");
 
        spi_tmpring_size = S_0286E8_WAVES(sctx->scratch_waves) |
                           S_0286E8_WAVESIZE(scratch_bytes_per_wave >> 10);
        if (spi_tmpring_size != sctx->spi_tmpring_size) {
                sctx->spi_tmpring_size = spi_tmpring_size;
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to