Module: Mesa
Branch: master
Commit: 510dac76abb64c28f06debbafd867141a71911c6
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=510dac76abb64c28f06debbafd867141a71911c6

Author: Gert Wollny <gert.wol...@collabora.com>
Date:   Wed Dec 23 22:42:26 2020 +0100

r600/sfn: add lowering pass for cube textures

Signed-off-by: Gert Wollny <gert.wol...@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9302>

---

 .../drivers/r600/sfn/sfn_emittexinstruction.cpp    |  2 +-
 .../drivers/r600/sfn/sfn_instruction_tex.cpp       | 77 ++++++++++++++++++++++
 src/gallium/drivers/r600/sfn/sfn_instruction_tex.h |  1 +
 3 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp 
b/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp
index 177063595ae..f17e7f5f90f 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp
@@ -873,7 +873,7 @@ bool EmitTexInstruction::get_inputs(const nir_tex_instr& 
instr, TexInputs &src)
    sfn_log << SfnLog::tex << "Get Inputs with " << instr.coord_components << " 
components\n";
 
    unsigned grad_components = instr.coord_components;
-   if (instr.is_array)
+   if (instr.is_array && !instr.array_is_lowered_cube)
       --grad_components;
 
 
diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp 
b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp
index 41e879365aa..da6ea4717ca 100644
--- a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp
@@ -314,5 +314,82 @@ r600_nir_lower_txl_txf_array_or_cube(nir_shader *shader)
    return progress;
 }
 
+static bool
+r600_nir_lower_cube_to_2darray_filer(const nir_instr *instr, const void 
*_options)
+{
+   if (instr->type != nir_instr_type_tex)
+      return false;
+
+   auto tex = nir_instr_as_tex(instr);
+   if (tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE)
+      return false;
+
+   switch (tex->op) {
+   case nir_texop_tex:
+   case nir_texop_txb:
+   case nir_texop_txf:
+   case nir_texop_txl:
+   case nir_texop_lod:
+   case nir_texop_tg4:
+   case nir_texop_txd:
+      return true;
+   }
+   return false;
+}
+
+static nir_ssa_def *
+r600_nir_lower_cube_to_2darray_impl(nir_builder *b, nir_instr *instr, void 
*_options)
+{
+   b->cursor = nir_before_instr(instr);
+
+   auto tex = nir_instr_as_tex(instr);
+   int coord_idx = nir_tex_instr_src_index(tex, nir_tex_src_coord);
+   assert(coord_idx >= 0);
+
+   auto cubed = nir_cube_r600(b, nir_channels(b, tex->src[coord_idx].src.ssa, 
0x7));
+   auto xy = nir_fmad(b,
+                      nir_vec2(b, nir_channel(b, cubed, 1), nir_channel(b, 
cubed, 0)),
+                      nir_frcp(b, nir_fabs(b, nir_channel(b, cubed, 2))),
+                      nir_imm_float(b, 1.5));
+
+   nir_ssa_def *z = nir_channel(b, cubed, 3);
+   if (tex->is_array) {
+      auto slice = nir_fround_even(b, nir_channel(b, 
tex->src[coord_idx].src.ssa, 3));
+      z = nir_fmad(b, nir_fmax(b, slice, nir_imm_float(b, 0.0)), 
nir_imm_float(b, 8.0),
+                   z);
+   }
+
+   if (tex->op == nir_texop_txd) {
+      int ddx_idx = nir_tex_instr_src_index(tex, nir_tex_src_ddx);
+      auto zero_dot_5 = nir_imm_float(b, 0.5);
+      nir_instr_rewrite_src(&tex->instr, &tex->src[ddx_idx].src,
+                            nir_src_for_ssa(nir_fmul(b, nir_ssa_for_src(b, 
tex->src[ddx_idx].src, 3), zero_dot_5)));
+
+      int ddy_idx = nir_tex_instr_src_index(tex, nir_tex_src_ddy);
+      nir_instr_rewrite_src(&tex->instr, &tex->src[ddy_idx].src,
+                            nir_src_for_ssa(nir_fmul(b, nir_ssa_for_src(b, 
tex->src[ddy_idx].src, 3), zero_dot_5)));
+   }
+
+   auto new_coord = nir_vec3(b, nir_channel(b, xy, 0), nir_channel(b, xy, 1), 
z);
+   nir_instr_rewrite_src(&tex->instr, &tex->src[coord_idx].src,
+                         nir_src_for_ssa(new_coord));
+   tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
+   tex->is_array = true;
+   tex->array_is_lowered_cube = true;
+
+   tex->coord_components = 3;
+
+   return NIR_LOWER_INSTR_PROGRESS;
+}
+
+bool
+r600_nir_lower_cube_to_2darray(nir_shader *shader)
+{
+   return nir_shader_lower_instructions(shader,
+                                        r600_nir_lower_cube_to_2darray_filer,
+                                        r600_nir_lower_cube_to_2darray_impl, 
nullptr);
+}
+
+
 
 }
diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h 
b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h
index 1603a70960b..70f2e1a0a5c 100644
--- a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h
+++ b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h
@@ -133,6 +133,7 @@ private:
 
 bool r600_nir_lower_int_tg4(nir_shader *nir);
 bool r600_nir_lower_txl_txf_array_or_cube(nir_shader *shader);
+bool r600_nir_lower_cube_to_2darray(nir_shader *shader);
 
 }
 

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to