We can use shaders from multiple contexts, and they were not
otherwise locked yet.

v2: Fix the shader = NULL case.

Signed-off-by: Bas Nieuwenhuizen <[email protected]>
---
 src/gallium/drivers/radeonsi/si_compute.c       | 20 ++++++++++++++++----
 src/gallium/drivers/radeonsi/si_state_shaders.c | 13 +++++++++++--
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_compute.c 
b/src/gallium/drivers/radeonsi/si_compute.c
index 7e05be5..a99a985 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -37,6 +37,7 @@
 #define MAX_GLOBAL_BUFFERS 20
 
 struct si_compute {
+       pipe_mutex mutex;
        unsigned ir_type;
        unsigned local_size;
        unsigned private_size;
@@ -116,6 +117,7 @@ static void *si_create_compute_state(
                si_shader_binary_upload(sctx->screen, &program->shader);
        }
 
+       pipe_mutex_init(program->mutex);
        return program;
 }
 
@@ -196,15 +198,19 @@ static void si_initialize_compute(struct si_context *sctx)
 }
 
 static bool si_setup_compute_scratch_buffer(struct si_context *sctx,
-                                            struct si_shader *shader,
+                                            struct si_compute *program,
                                             struct si_shader_config *config)
 {
+       struct si_shader *shader = &program->shader;
        uint64_t scratch_bo_size, scratch_needed;
        scratch_bo_size = 0;
        scratch_needed = config->scratch_bytes_per_wave * sctx->scratch_waves;
        if (sctx->compute_scratch_buffer)
                scratch_bo_size = sctx->compute_scratch_buffer->b.b.width0;
 
+       if (!scratch_needed)
+               return true;
+
        if (scratch_bo_size < scratch_needed) {
                pipe_resource_reference(
                        (struct pipe_resource**)&sctx->compute_scratch_buffer,
@@ -218,18 +224,23 @@ static bool si_setup_compute_scratch_buffer(struct 
si_context *sctx,
                        return false;
        }
 
-       if (sctx->compute_scratch_buffer != shader->scratch_bo && 
scratch_needed) {
+       pipe_mutex_lock(program->mutex);
+
+       if (sctx->compute_scratch_buffer != shader->scratch_bo) {
                uint64_t scratch_va = sctx->compute_scratch_buffer->gpu_address;
 
                si_shader_apply_scratch_relocs(sctx, shader, config, 
scratch_va);
 
-               if (si_shader_binary_upload(sctx->screen, shader))
+               if (si_shader_binary_upload(sctx->screen, shader)) {
+                       pipe_mutex_unlock(program->mutex);
                        return false;
+               }
 
                r600_resource_reference(&shader->scratch_bo,
                                        sctx->compute_scratch_buffer);
        }
 
+       pipe_mutex_unlock(program->mutex);
        return true;
 }
 
@@ -272,7 +283,7 @@ static bool si_switch_compute_shader(struct si_context 
*sctx,
                config->rsrc2 |=  S_00B84C_LDS_SIZE(lds_blocks);
        }
 
-       if (!si_setup_compute_scratch_buffer(sctx, shader, config))
+       if (!si_setup_compute_scratch_buffer(sctx, program, config))
                return false;
 
        if (shader->scratch_bo) {
@@ -503,6 +514,7 @@ static void si_delete_compute_state(struct pipe_context 
*ctx, void* state){
                sctx->cs_shader_state.emitted_program = NULL;
 
        si_shader_destroy(&program->shader);
+       pipe_mutex_destroy(program->mutex);
        FREE(program);
 }
 
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 49e688a..c846001 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1618,6 +1618,7 @@ static int si_update_scratch_buffer(struct si_context 
*sctx,
                                    struct si_shader *shader)
 {
        uint64_t scratch_va = sctx->scratch_buffer->gpu_address;
+       struct si_shader_selector *sel;
        int r;
 
        if (!shader)
@@ -1627,10 +1628,15 @@ static int si_update_scratch_buffer(struct si_context 
*sctx,
        if (shader->config.scratch_bytes_per_wave == 0)
                return 0;
 
+       sel = shader->selector;
+       pipe_mutex_lock(sel->mutex);
+
        /* This shader is already configured to use the current
         * scratch buffer. */
-       if (shader->scratch_bo == sctx->scratch_buffer)
+       if (shader->scratch_bo == sctx->scratch_buffer) {
+               pipe_mutex_unlock(sel->mutex);
                return 0;
+       }
 
        assert(sctx->scratch_buffer);
 
@@ -1638,14 +1644,17 @@ static int si_update_scratch_buffer(struct si_context 
*sctx,
 
        /* Replace the shader bo with a new bo that has the relocs applied. */
        r = si_shader_binary_upload(sctx->screen, shader);
-       if (r)
+       if (r) {
+               pipe_mutex_unlock(sel->mutex);
                return r;
+       }
 
        /* Update the shader state to use the new shader bo. */
        si_shader_init_pm4_state(shader);
 
        r600_resource_reference(&shader->scratch_bo, sctx->scratch_buffer);
 
+       pipe_mutex_unlock(sel->mutex);
        return 1;
 }
 
-- 
2.8.0

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

Reply via email to