r600: refactor and export some shader selector code for compute
authorDave Airlie <airlied@redhat.com>
Fri, 3 Nov 2017 01:33:44 +0000 (11:33 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 5 Dec 2017 20:31:50 +0000 (20:31 +0000)
This just moves some code around to make it easier to add compute.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state_common.c

index 4af87e1a3aea46d5eaff81cc0187cbe418e33483..4028d98d960f27fbeaa80b1e32c5d0220a89c797 100644 (file)
@@ -1023,6 +1023,16 @@ void eg_trace_emit(struct r600_context *rctx);
 void eg_dump_debug_state(struct pipe_context *ctx, FILE *f,
                         unsigned flags);
 
+struct r600_pipe_shader_selector *r600_create_shader_state_tokens(struct pipe_context *ctx,
+                                                                 const struct tgsi_token *tokens,
+                                                                 unsigned pipe_shader_type);
+int r600_shader_select(struct pipe_context *ctx,
+                      struct r600_pipe_shader_selector* sel,
+                      bool *dirty);
+
+void r600_delete_shader_selector(struct pipe_context *ctx,
+                                struct r600_pipe_shader_selector *sel);
+
 struct r600_shader_atomic;
 bool evergreen_emit_atomic_buffer_setup(struct r600_context *rctx,
                                        struct r600_pipe_shader *cs_shader,
index aedf210a22a067cdfce4626f66a45ad3bb52cb1c..938a85f238735bd74399b7680c02ac5028d90e9b 100644 (file)
@@ -829,7 +829,7 @@ static inline void r600_shader_selector_key(const struct pipe_context *ctx,
 
 /* Select the hw shader variant depending on the current state.
  * (*dirty) is set to 1 if current variant was changed */
-static int r600_shader_select(struct pipe_context *ctx,
+int r600_shader_select(struct pipe_context *ctx,
         struct r600_pipe_shader_selector* sel,
         bool *dirty)
 {
@@ -897,17 +897,27 @@ static int r600_shader_select(struct pipe_context *ctx,
        return 0;
 }
 
+struct r600_pipe_shader_selector *r600_create_shader_state_tokens(struct pipe_context *ctx,
+                                                                 const struct tgsi_token *tokens,
+                                                                 unsigned pipe_shader_type)
+{
+       struct r600_pipe_shader_selector *sel = CALLOC_STRUCT(r600_pipe_shader_selector);
+       int i;
+
+       sel->type = pipe_shader_type;
+       sel->tokens = tgsi_dup_tokens(tokens);
+       tgsi_scan_shader(tokens, &sel->info);
+       return sel;
+}
+
 static void *r600_create_shader_state(struct pipe_context *ctx,
                               const struct pipe_shader_state *state,
                               unsigned pipe_shader_type)
 {
-       struct r600_pipe_shader_selector *sel = CALLOC_STRUCT(r600_pipe_shader_selector);
        int i;
+       struct r600_pipe_shader_selector *sel = r600_create_shader_state_tokens(ctx, state->tokens, pipe_shader_type);
 
-       sel->type = pipe_shader_type;
-       sel->tokens = tgsi_dup_tokens(state->tokens);
        sel->so = state->stream_output;
-       tgsi_scan_shader(state->tokens, &sel->info);
 
        switch (pipe_shader_type) {
        case PIPE_SHADER_GEOMETRY:
@@ -1048,8 +1058,8 @@ static void r600_bind_tes_state(struct pipe_context *ctx, void *state)
        rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;
 }
 
-static void r600_delete_shader_selector(struct pipe_context *ctx,
-               struct r600_pipe_shader_selector *sel)
+void r600_delete_shader_selector(struct pipe_context *ctx,
+                                struct r600_pipe_shader_selector *sel)
 {
        struct r600_pipe_shader *p = sel->current, *c;
        while (p) {