Module: Mesa
Branch: main
Commit: 4dd287308f86af95d0bb6001592aeeb9d3926750
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4dd287308f86af95d0bb6001592aeeb9d3926750

Author: Ganesh Belgur Ramachandra <ganesh.belgurramachan...@amd.com>
Date:   Tue Oct 17 12:20:50 2023 -0500

radeonsi: "get_blitter_vs" shader in nir

Reviewed-by: Marek Olšák <marek.ol...@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25782>

---

 src/gallium/drivers/radeonsi/si_pipe.h           |  4 +-
 src/gallium/drivers/radeonsi/si_shaderlib_nir.c  | 74 ++++++++++++++++++++++++
 src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c | 59 -------------------
 3 files changed, 77 insertions(+), 60 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index dcd0d8713d6..83e18a1f1c2 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -1647,7 +1647,7 @@ union si_compute_blit_shader_key {
 
 void *si_create_blit_cs(struct si_context *sctx, const union 
si_compute_blit_shader_key *options);
 
-/* si_shaderlib_tgsi.c */
+/* si_shaderlib_nir.c */
 void *si_get_blitter_vs(struct si_context *sctx, enum blitter_attrib_type type,
                         unsigned num_layers);
 void *si_create_dma_compute_shader(struct si_context *sctx, unsigned 
num_dwords_per_thread,
@@ -1656,6 +1656,8 @@ void *si_create_clear_buffer_rmw_cs(struct si_context 
*sctx);
 void *si_clear_render_target_shader(struct si_context *sctx, enum 
pipe_texture_target type);
 void *si_clear_12bytes_buffer_shader(struct si_context *sctx);
 void *si_create_fmask_expand_cs(struct si_context *sctx, unsigned num_samples, 
bool is_array);
+
+/* si_shaderlib_tgsi.c */
 void *si_create_query_result_cs(struct si_context *sctx);
 void *gfx11_create_sh_query_result_cs(struct si_context *sctx);
 
diff --git a/src/gallium/drivers/radeonsi/si_shaderlib_nir.c 
b/src/gallium/drivers/radeonsi/si_shaderlib_nir.c
index 85f9ea03d11..2b4373d16e3 100644
--- a/src/gallium/drivers/radeonsi/si_shaderlib_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shaderlib_nir.c
@@ -788,3 +788,77 @@ void *si_create_fmask_expand_cs(struct si_context *sctx, 
unsigned num_samples, b
 
    return create_shader_state(sctx, b.shader);
 }
+
+/* This is just a pass-through shader with 1-3 MOV instructions. */
+void *si_get_blitter_vs(struct si_context *sctx, enum blitter_attrib_type 
type, unsigned num_layers)
+{
+   unsigned vs_blit_property;
+   void **vs;
+
+   switch (type) {
+   case UTIL_BLITTER_ATTRIB_NONE:
+      vs = num_layers > 1 ? &sctx->vs_blit_pos_layered : &sctx->vs_blit_pos;
+      vs_blit_property = SI_VS_BLIT_SGPRS_POS;
+      break;
+   case UTIL_BLITTER_ATTRIB_COLOR:
+      vs = num_layers > 1 ? &sctx->vs_blit_color_layered : 
&sctx->vs_blit_color;
+      vs_blit_property = SI_VS_BLIT_SGPRS_POS_COLOR;
+      break;
+   case UTIL_BLITTER_ATTRIB_TEXCOORD_XY:
+   case UTIL_BLITTER_ATTRIB_TEXCOORD_XYZW:
+      assert(num_layers == 1);
+      vs = &sctx->vs_blit_texcoord;
+      vs_blit_property = SI_VS_BLIT_SGPRS_POS_TEXCOORD;
+      break;
+   default:
+      assert(0);
+      return NULL;
+   }
+
+   if (*vs)
+      return *vs;
+
+   /* Add 1 for the attribute ring address. */
+   if (sctx->gfx_level >= GFX11 && type != UTIL_BLITTER_ATTRIB_NONE)
+      vs_blit_property++;
+
+   const nir_shader_compiler_options *options =
+      sctx->b.screen->get_compiler_options(sctx->b.screen, PIPE_SHADER_IR_NIR, 
PIPE_SHADER_VERTEX);
+
+   nir_builder b =
+      nir_builder_init_simple_shader(MESA_SHADER_VERTEX, options, 
"get_blitter_vs");
+
+   /* Tell the shader to load VS inputs from SGPRs: */
+   b.shader->info.vs.blit_sgprs_amd = vs_blit_property;
+   b.shader->info.vs.window_space_position = true;
+
+   const struct glsl_type *vec4 = glsl_vec4_type();
+
+   nir_copy_var(&b,
+                nir_create_variable_with_location(b.shader, nir_var_shader_out,
+                                                  VARYING_SLOT_POS, vec4),
+                nir_create_variable_with_location(b.shader, nir_var_shader_in,
+                                                  VERT_ATTRIB_GENERIC0, vec4));
+
+   if (type != UTIL_BLITTER_ATTRIB_NONE) {
+      nir_copy_var(&b,
+                   nir_create_variable_with_location(b.shader, 
nir_var_shader_out,
+                                                     VARYING_SLOT_VAR0, vec4),
+                   nir_create_variable_with_location(b.shader, 
nir_var_shader_in,
+                                                     VERT_ATTRIB_GENERIC1, 
vec4));
+   }
+
+   if (num_layers > 1) {
+      nir_variable *out_layer =
+         nir_create_variable_with_location(b.shader, nir_var_shader_out,
+                                           VARYING_SLOT_LAYER, 
glsl_int_type());
+      out_layer->data.interpolation = INTERP_MODE_NONE;
+
+      nir_copy_var(&b, out_layer,
+                   nir_create_variable_with_location(b.shader, 
nir_var_system_value,
+                                                     SYSTEM_VALUE_INSTANCE_ID, 
glsl_int_type()));
+   }
+
+   *vs = create_shader_state(sctx, b.shader);
+   return *vs;
+}
diff --git a/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c 
b/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c
index 73392715874..13acc4eefc7 100644
--- a/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c
+++ b/src/gallium/drivers/radeonsi/si_shaderlib_tgsi.c
@@ -8,65 +8,6 @@
 #include "tgsi/tgsi_text.h"
 #include "tgsi/tgsi_ureg.h"
 
-void *si_get_blitter_vs(struct si_context *sctx, enum blitter_attrib_type 
type, unsigned num_layers)
-{
-   unsigned vs_blit_property;
-   void **vs;
-
-   switch (type) {
-   case UTIL_BLITTER_ATTRIB_NONE:
-      vs = num_layers > 1 ? &sctx->vs_blit_pos_layered : &sctx->vs_blit_pos;
-      vs_blit_property = SI_VS_BLIT_SGPRS_POS;
-      break;
-   case UTIL_BLITTER_ATTRIB_COLOR:
-      vs = num_layers > 1 ? &sctx->vs_blit_color_layered : 
&sctx->vs_blit_color;
-      vs_blit_property = SI_VS_BLIT_SGPRS_POS_COLOR;
-      break;
-   case UTIL_BLITTER_ATTRIB_TEXCOORD_XY:
-   case UTIL_BLITTER_ATTRIB_TEXCOORD_XYZW:
-      assert(num_layers == 1);
-      vs = &sctx->vs_blit_texcoord;
-      vs_blit_property = SI_VS_BLIT_SGPRS_POS_TEXCOORD;
-      break;
-   default:
-      assert(0);
-      return NULL;
-   }
-   if (*vs)
-      return *vs;
-
-   struct ureg_program *ureg = ureg_create(PIPE_SHADER_VERTEX);
-   if (!ureg)
-      return NULL;
-
-   /* Add 1 for the attribute ring address. */
-   if (sctx->gfx_level >= GFX11 && type != UTIL_BLITTER_ATTRIB_NONE)
-      vs_blit_property++;
-
-   /* Tell the shader to load VS inputs from SGPRs: */
-   ureg_property(ureg, TGSI_PROPERTY_VS_BLIT_SGPRS_AMD, vs_blit_property);
-   ureg_property(ureg, TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, true);
-
-   /* This is just a pass-through shader with 1-3 MOV instructions. */
-   ureg_MOV(ureg, ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0), 
ureg_DECL_vs_input(ureg, 0));
-
-   if (type != UTIL_BLITTER_ATTRIB_NONE) {
-      ureg_MOV(ureg, ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0), 
ureg_DECL_vs_input(ureg, 1));
-   }
-
-   if (num_layers > 1) {
-      struct ureg_src instance_id = ureg_DECL_system_value(ureg, 
TGSI_SEMANTIC_INSTANCEID, 0);
-      struct ureg_dst layer = ureg_DECL_output(ureg, TGSI_SEMANTIC_LAYER, 0);
-
-      ureg_MOV(ureg, ureg_writemask(layer, TGSI_WRITEMASK_X),
-               ureg_scalar(instance_id, TGSI_SWIZZLE_X));
-   }
-   ureg_END(ureg);
-
-   *vs = ureg_create_shader_and_destroy(ureg, &sctx->b);
-   return *vs;
-}
-
 /* Create the compute shader that is used to collect the results.
  *
  * One compute grid with a single thread is launched for every query result

Reply via email to