radeonsi: add radeonsi_sync_compile option
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 25 Mar 2019 14:44:45 +0000 (15:44 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 25 Apr 2019 10:35:29 +0000 (12:35 +0200)
Force the driver thread to sync immediately with a compiler thread (but
compilation still happens in a separate thread).

This can be useful to simplify debugging compiler issues.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_debug_options.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index f4c3e19..019256c 100644 (file)
@@ -1,5 +1,6 @@
 OPT_BOOL(clear_db_cache_before_clear, false, "Clear DB cache before fast depth clear")
 OPT_BOOL(enable_nir, false, "Enable NIR")
 OPT_BOOL(aux_debug, false, "Generate ddebug_dumps for the auxiliary context")
+OPT_BOOL(sync_compile, false, "Always compile synchronously (will cause stalls)")
 
 #undef OPT_BOOL
index 5bdfd4f..f57e773 100644 (file)
@@ -1952,6 +1952,10 @@ current_not_ready:
                /* Use the default (unoptimized) shader for now. */
                memset(&key->opt, 0, sizeof(key->opt));
                mtx_unlock(&sel->mutex);
+
+               if (sscreen->options.sync_compile)
+                       util_queue_fence_wait(&shader->ready);
+
                goto again;
        }
 
@@ -2164,12 +2168,12 @@ void si_schedule_initial_compile(struct si_context *sctx, unsigned processor,
        util_queue_fence_init(ready_fence);
 
        struct util_async_debug_callback async_debug;
-       bool wait =
+       bool debug =
                (sctx->debug.debug_message && !sctx->debug.async) ||
                sctx->is_debug ||
                si_can_dump_shader(sctx->screen, processor);
 
-       if (wait) {
+       if (debug) {
                u_async_debug_init(&async_debug);
                compiler_ctx_state->debug = async_debug.base;
        }
@@ -2177,11 +2181,14 @@ void si_schedule_initial_compile(struct si_context *sctx, unsigned processor,
        util_queue_add_job(&sctx->screen->shader_compiler_queue, job,
                           ready_fence, execute, NULL);
 
-       if (wait) {
+       if (debug) {
                util_queue_fence_wait(ready_fence);
                u_async_debug_drain(&async_debug, &sctx->debug);
                u_async_debug_cleanup(&async_debug);
        }
+
+       if (sctx->screen->options.sync_compile)
+               util_queue_fence_wait(ready_fence);
 }
 
 /* Return descriptor slot usage masks from the given shader info. */