softpipe: Refactor pipe_shader_state setup.
authorEric Anholt <eric@anholt.net>
Wed, 1 Jan 2020 00:31:54 +0000 (16:31 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jul 2020 00:24:26 +0000 (00:24 +0000)
We had repeated code that I want to repeatedly change for adding
nir-to-tgsi.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6018>

src/gallium/drivers/softpipe/sp_state_shader.c

index dc2418f5a507b1bd68b2f749a90325ebd326ef36..fef187e7f114c62acc46174b88e759e716a149f4 100644 (file)
@@ -114,6 +114,21 @@ softpipe_find_fs_variant(struct softpipe_context *sp,
    return create_fs_variant(sp, fs, key);
 }
 
+static void
+softpipe_create_shader_state(struct pipe_shader_state *shader,
+                             const struct pipe_shader_state *templ,
+                             bool debug)
+{
+   assert(templ->type == PIPE_SHADER_IR_TGSI);
+   shader->type = PIPE_SHADER_IR_TGSI;
+   /* we need to keep a local copy of the tokens */
+   shader->tokens = tgsi_dup_tokens(templ->tokens);
+
+   shader->stream_output = templ->stream_output;
+
+   if (debug)
+      tgsi_dump(shader->tokens, 0);
+}
 
 static void *
 softpipe_create_fs_state(struct pipe_context *pipe,
@@ -122,12 +137,7 @@ softpipe_create_fs_state(struct pipe_context *pipe,
    struct softpipe_context *softpipe = softpipe_context(pipe);
    struct sp_fragment_shader *state = CALLOC_STRUCT(sp_fragment_shader);
 
-   /* debug */
-   if (softpipe->dump_fs) 
-      tgsi_dump(templ->tokens, 0);
-
-   /* we need to keep a local copy of the tokens */
-   state->shader.tokens = tgsi_dup_tokens(templ->tokens);
+   softpipe_create_shader_state(&state->shader, templ, softpipe->dump_fs);
 
    /* draw's fs state */
    state->draw_shader = draw_create_fragment_shader(softpipe->draw,
@@ -211,13 +221,11 @@ softpipe_create_vs_state(struct pipe_context *pipe,
    if (!state)
       goto fail;
 
-   /* copy shader tokens, the ones passed in will go away.
-    */
-   state->shader.tokens = tgsi_dup_tokens(templ->tokens);
-   if (state->shader.tokens == NULL)
+   softpipe_create_shader_state(&state->shader, templ, false);
+   if (!state->shader.tokens)
       goto fail;
 
-   state->draw_data = draw_create_vertex_shader(softpipe->draw, templ);
+   state->draw_data = draw_create_vertex_shader(softpipe->draw, &state->shader);
    if (state->draw_data == NULL) 
       goto fail;
 
@@ -273,19 +281,9 @@ softpipe_create_gs_state(struct pipe_context *pipe,
    if (!state)
       goto fail;
 
-   state->shader = *templ;
+   softpipe_create_shader_state(&state->shader, templ, softpipe->dump_gs);
 
    if (templ->tokens) {
-      /* debug */
-      if (softpipe->dump_gs)
-         tgsi_dump(templ->tokens, 0);
-
-      /* copy shader tokens, the ones passed in will go away.
-       */
-      state->shader.tokens = tgsi_dup_tokens(templ->tokens);
-      if (state->shader.tokens == NULL)
-         goto fail;
-
       state->draw_data = draw_create_geometry_shader(softpipe->draw, templ);
       if (state->draw_data == NULL)
          goto fail;