radeonsi: move shader pipe context state into a separate structure
authorMarek Olšák <marek.olsak@amd.com>
Tue, 17 Jan 2017 16:39:16 +0000 (17:39 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 18 Jan 2017 18:51:31 +0000 (19:51 +0100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index 758403518f65b39b7c0e9d5f53ebbc1bd83a7ff2..5a24318b96fbb973f4b14c9e131c42dbfbea980b 100644 (file)
@@ -251,18 +251,26 @@ enum {
 
 struct si_shader;
 
+/* State of the context creating the shader object. */
+struct si_compiler_ctx_state {
+       /* Should only be used by si_init_shader_selector_async and
+        * si_build_shader_variant if thread_index == -1 (non-threaded). */
+       LLVMTargetMachineRef            tm;
+
+       /* Used if thread_index == -1 or if debug.async is true. */
+       struct pipe_debug_callback      debug;
+
+       /* Used for creating the log string for gallium/ddebug. */
+       bool                            is_debug_context;
+};
+
 /* A shader selector is a gallium CSO and contains shader variants and
  * binaries for one TGSI program. This can be shared by multiple contexts.
  */
 struct si_shader_selector {
        struct si_screen        *screen;
        struct util_queue_fence ready;
-
-       /* Should only be used by si_init_shader_selector_async
-        * if thread_index == -1 (non-threaded). */
-       LLVMTargetMachineRef    tm;
-       struct pipe_debug_callback debug;
-       bool                    is_debug_context;
+       struct si_compiler_ctx_state compiler_ctx_state;
 
        pipe_mutex              mutex;
        struct si_shader        *first_variant; /* immutable after the first variant */
index 1ae344a62cc554753d9d5b81d6df47f1bc4bab90..eaba19a8bc1a0afda0bfd9767feaa52e78cd4042 100644 (file)
@@ -1086,7 +1086,7 @@ static void si_build_shader_variant(void *job, int thread_index)
        struct si_shader_selector *sel = shader->selector;
        struct si_screen *sscreen = sel->screen;
        LLVMTargetMachineRef tm;
-       struct pipe_debug_callback *debug = &sel->debug;
+       struct pipe_debug_callback *debug = &sel->compiler_ctx_state.debug;
        int r;
 
        if (thread_index >= 0) {
@@ -1095,7 +1095,7 @@ static void si_build_shader_variant(void *job, int thread_index)
                if (!debug->async)
                        debug = NULL;
        } else {
-               tm = sel->tm;
+               tm = sel->compiler_ctx_state.tm;
        }
 
        r = si_shader_create(sscreen, tm, shader, debug);
@@ -1106,7 +1106,7 @@ static void si_build_shader_variant(void *job, int thread_index)
                return;
        }
 
-       if (sel->is_debug_context) {
+       if (sel->compiler_ctx_state.is_debug_context) {
                FILE *f = open_memstream(&shader->shader_log,
                                         &shader->shader_log_size);
                if (f) {
@@ -1292,7 +1292,7 @@ void si_init_shader_selector_async(void *job, int thread_index)
        struct si_shader_selector *sel = (struct si_shader_selector *)job;
        struct si_screen *sscreen = sel->screen;
        LLVMTargetMachineRef tm;
-       struct pipe_debug_callback *debug = &sel->debug;
+       struct pipe_debug_callback *debug = &sel->compiler_ctx_state.debug;
        unsigned i;
 
        if (thread_index >= 0) {
@@ -1301,7 +1301,7 @@ void si_init_shader_selector_async(void *job, int thread_index)
                if (!debug->async)
                        debug = NULL;
        } else {
-               tm = sel->tm;
+               tm = sel->compiler_ctx_state.tm;
        }
 
        /* Compile the main shader part for use with a prolog and/or epilog.
@@ -1455,9 +1455,9 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
                return NULL;
 
        sel->screen = sscreen;
-       sel->tm = sctx->tm;
-       sel->debug = sctx->b.debug;
-       sel->is_debug_context = sctx->is_debug;
+       sel->compiler_ctx_state.tm = sctx->tm;
+       sel->compiler_ctx_state.debug = sctx->b.debug;
+       sel->compiler_ctx_state.is_debug_context = sctx->is_debug;
        sel->tokens = tgsi_dup_tokens(state->tokens);
        if (!sel->tokens) {
                FREE(sel);