Mesa (master): mesa/st: Make a single helper for the NIR-to-TGSI transfer.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jan 15 00:25:46 UTC 2021
Module: Mesa
Branch: master
Commit: 500dfc05da2398d5a617bc3c155cc2d0552dfe3c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=500dfc05da2398d5a617bc3c155cc2d0552dfe3c
Author: Eric Anholt <eric at anholt.net>
Date: Mon Jan 11 15:39:15 2021 -0800
mesa/st: Make a single helper for the NIR-to-TGSI transfer.
The common path means that we get NIR IR dumping on builtin shaders, too.
Reviewed-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8488>
---
src/mesa/state_tracker/st_nir_builtins.c | 37 +------------
src/mesa/state_tracker/st_program.c | 89 +++++++++++++++++++-------------
src/mesa/state_tracker/st_program.h | 3 ++
3 files changed, 59 insertions(+), 70 deletions(-)
diff --git a/src/mesa/state_tracker/st_nir_builtins.c b/src/mesa/state_tracker/st_nir_builtins.c
index a5279dbc2af..6e1989a9889 100644
--- a/src/mesa/state_tracker/st_nir_builtins.c
+++ b/src/mesa/state_tracker/st_nir_builtins.c
@@ -22,20 +22,18 @@
#include "tgsi/tgsi_from_mesa.h"
#include "st_nir.h"
+#include "st_program.h"
#include "compiler/nir/nir_builder.h"
#include "compiler/glsl/gl_nir.h"
-#include "nir/nir_to_tgsi.h"
#include "tgsi/tgsi_parse.h"
struct pipe_shader_state *
st_nir_finish_builtin_shader(struct st_context *st,
nir_shader *nir)
{
- struct pipe_context *pipe = st->pipe;
struct pipe_screen *screen = st->screen;
gl_shader_stage stage = nir->info.stage;
- enum pipe_shader_type sh = pipe_shader_type_from_mesa(stage);
nir->info.separate_shader = true;
if (stage == MESA_SHADER_FRAGMENT)
@@ -75,38 +73,7 @@ st_nir_finish_builtin_shader(struct st_context *st,
.ir.nir = nir,
};
- if (PIPE_SHADER_IR_NIR !=
- screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_PREFERRED_IR)) {
- state.type = PIPE_SHADER_IR_TGSI;
- state.tokens = nir_to_tgsi(nir, screen);
- }
-
- struct pipe_shader_state *shader;
- switch (stage) {
- case MESA_SHADER_VERTEX:
- shader = pipe->create_vs_state(pipe, &state);
- break;
- case MESA_SHADER_TESS_CTRL:
- shader = pipe->create_tcs_state(pipe, &state);
- break;
- case MESA_SHADER_TESS_EVAL:
- shader = pipe->create_tes_state(pipe, &state);
- break;
- case MESA_SHADER_GEOMETRY:
- shader = pipe->create_gs_state(pipe, &state);
- break;
- case MESA_SHADER_FRAGMENT:
- shader = pipe->create_fs_state(pipe, &state);
- break;
- default:
- unreachable("unsupported shader stage");
- return NULL;
- }
-
- if (state.type == PIPE_SHADER_IR_TGSI)
- tgsi_free_tokens(state.tokens);
-
- return shader;
+ return st_create_nir_shader(st, &state);
}
/**
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 07bb8d8436e..e2a91d57cd0 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -489,6 +489,58 @@ st_translate_stream_output_info(struct gl_program *prog)
so_info->num_outputs = info->NumOutputs;
}
+/**
+ * Creates a driver shader from a NIR shader. Takes ownership of the
+ * passed nir_shader.
+ */
+struct pipe_shader_state *
+st_create_nir_shader(struct st_context *st, struct pipe_shader_state *state)
+{
+ struct pipe_context *pipe = st->pipe;
+ struct pipe_screen *screen = st->screen;
+
+ assert(state->type == PIPE_SHADER_IR_NIR);
+ nir_shader *nir = state->ir.nir;
+ gl_shader_stage stage = nir->info.stage;
+ enum pipe_shader_type sh = pipe_shader_type_from_mesa(stage);
+
+ if (ST_DEBUG & DEBUG_PRINT_IR)
+ nir_print_shader(nir, stderr);
+
+ if (PIPE_SHADER_IR_NIR !=
+ screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_PREFERRED_IR)) {
+ state->type = PIPE_SHADER_IR_TGSI;
+ state->tokens = nir_to_tgsi(nir, screen);
+ }
+
+ struct pipe_shader_state *shader;
+ switch (stage) {
+ case MESA_SHADER_VERTEX:
+ shader = pipe->create_vs_state(pipe, state);
+ break;
+ case MESA_SHADER_TESS_CTRL:
+ shader = pipe->create_tcs_state(pipe, state);
+ break;
+ case MESA_SHADER_TESS_EVAL:
+ shader = pipe->create_tes_state(pipe, state);
+ break;
+ case MESA_SHADER_GEOMETRY:
+ shader = pipe->create_gs_state(pipe, state);
+ break;
+ case MESA_SHADER_FRAGMENT:
+ shader = pipe->create_fs_state(pipe, state);
+ break;
+ default:
+ unreachable("unsupported shader stage");
+ return NULL;
+ }
+
+ if (state->type == PIPE_SHADER_IR_TGSI)
+ tgsi_free_tokens(state->tokens);
+
+ return shader;
+}
+
/**
* Translate a vertex program.
*/
@@ -726,27 +778,10 @@ st_create_vp_variant(struct st_context *st,
nir_shader_get_entrypoint(state.ir.nir));
}
- if (ST_DEBUG & DEBUG_PRINT_IR)
- nir_print_shader(state.ir.nir, stderr);
-
- /* If the driver wants TGSI, then translate before handing off. */
-
- if (st->pipe->screen->get_shader_param(st->pipe->screen,
- PIPE_SHADER_VERTEX,
- PIPE_SHADER_CAP_PREFERRED_IR) !=
- PIPE_SHADER_IR_NIR) {
- nir_shader *s = state.ir.nir;
- state.tokens = nir_to_tgsi(s, st->pipe->screen);
- state.type = PIPE_SHADER_IR_TGSI;
- }
-
if (key->is_draw_shader)
vpv->base.driver_shader = draw_create_vertex_shader(st->draw, &state);
else
- vpv->base.driver_shader = pipe->create_vs_state(pipe, &state);
-
- if (state.type == PIPE_SHADER_IR_TGSI)
- tgsi_free_tokens(state.tokens);
+ vpv->base.driver_shader = st_create_nir_shader(st, &state);
return vpv;
}
@@ -1337,25 +1372,9 @@ st_create_fp_variant(struct st_context *st,
screen->finalize_nir(screen, state.ir.nir, false);
}
- if (ST_DEBUG & DEBUG_PRINT_IR)
- nir_print_shader(state.ir.nir, stderr);
-
- /* If the driver wants TGSI, then translate before handing off. */
- if (st->pipe->screen->get_shader_param(st->pipe->screen,
- PIPE_SHADER_FRAGMENT,
- PIPE_SHADER_CAP_PREFERRED_IR) !=
- PIPE_SHADER_IR_NIR) {
- nir_shader *s = state.ir.nir;
- state.tokens = nir_to_tgsi(s, st->pipe->screen);
- state.type = PIPE_SHADER_IR_TGSI;
- }
-
- variant->base.driver_shader = pipe->create_fs_state(pipe, &state);
+ variant->base.driver_shader = st_create_nir_shader(st, &state);
variant->key = *key;
- if (state.type == PIPE_SHADER_IR_TGSI)
- tgsi_free_tokens(state.tokens);
-
return variant;
}
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index e1bdd1fbb79..157339e34a3 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -357,6 +357,9 @@ st_serialize_nir(struct st_program *stp);
extern void
st_finalize_program(struct st_context *st, struct gl_program *prog);
+struct pipe_shader_state *
+st_create_nir_shader(struct st_context *st, struct pipe_shader_state *state);
+
#ifdef __cplusplus
}
#endif
More information about the mesa-commit
mailing list