Mesa (master): zink: break out push constant creation in compiler and add drawid value
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Feb 16 01:00:33 UTC 2021
Module: Mesa
Branch: master
Commit: 7fad9d647a9fdec76d3d3d465873ac0fa76677d3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7fad9d647a9fdec76d3d3d465873ac0fa76677d3
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Jan 29 17:09:34 2021 -0500
zink: break out push constant creation in compiler and add drawid value
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8971>
---
src/gallium/drivers/zink/zink_compiler.c | 40 ++++++++++++++++----------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 1bff75bdbfb..71273abc0ce 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -38,6 +38,23 @@
#include "util/u_memory.h"
+static void
+create_vs_pushconst(nir_shader *nir)
+{
+ nir_variable *vs_pushconst;
+ /* create compatible layout for the ntv push constant loader */
+ struct glsl_struct_field *fields = rzalloc_array(nir, struct glsl_struct_field, 2);
+ fields[0].type = glsl_array_type(glsl_uint_type(), 1, 0);
+ fields[0].name = ralloc_asprintf(nir, "draw_mode_is_indexed");
+ fields[0].offset = offsetof(struct zink_push_constant, draw_mode_is_indexed);
+ fields[1].type = glsl_array_type(glsl_uint_type(), 1, 0);
+ fields[1].name = ralloc_asprintf(nir, "draw_id");
+ fields[1].offset = offsetof(struct zink_push_constant, draw_id);
+ vs_pushconst = nir_variable_create(nir, nir_var_mem_push_const,
+ glsl_struct_type(fields, 2, "struct", false), "vs_pushconst");
+ vs_pushconst->data.location = INT_MAX; //doesn't really matter
+}
+
static bool
lower_discard_if_instr(nir_intrinsic_instr *instr, nir_builder *b)
{
@@ -204,30 +221,10 @@ lower_64bit_vertex_attribs(nir_shader *shader)
static bool
lower_basevertex_instr(nir_intrinsic_instr *instr, nir_builder *b)
{
- nir_variable *vs_pushconst = NULL;
-
if (instr->intrinsic != nir_intrinsic_load_base_vertex)
return false;
- nir_foreach_shader_in_variable(var, b->shader) {
- if (var->data.location == INT_MAX) {
- vs_pushconst = var;
- break;
- }
- }
b->cursor = nir_after_instr(&instr->instr);
-
- if (!vs_pushconst) {
- /* create compatible layout for the ntv push constant loader */
- struct glsl_struct_field *fields = rzalloc_array(b->shader, struct glsl_struct_field, 1);
- fields[0].type = glsl_array_type(glsl_uint_type(), 1, 0);
- fields[0].name = ralloc_asprintf(b->shader, "draw_mode_is_indexed");
- fields[0].offset = offsetof(struct zink_push_constant, draw_mode_is_indexed);
- vs_pushconst = nir_variable_create(b->shader, nir_var_mem_push_const,
- glsl_struct_type(fields, 1, "struct", false), "vs_pushconst");
- vs_pushconst->data.location = INT_MAX; //doesn't really matter
- }
-
nir_intrinsic_instr *load = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_push_constant);
load->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
nir_intrinsic_set_range(load, 4);
@@ -496,6 +493,9 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
NIR_PASS_V(nir, nir_lower_tex, &tex_opts);
}
+ if (nir->info.stage == MESA_SHADER_VERTEX)
+ create_vs_pushconst(nir);
+
/* only do uniforms -> ubo if we have uniforms, otherwise we're just
* screwing with the bindings for no reason
*/
More information about the mesa-commit
mailing list