[Mesa-dev] [PATCH 69/78] i965/nir/vec4: Implement nir_tex_src_sampler_offset tex source

Eduardo Lima Mitev elima at igalia.com
Fri Jun 26 01:07:25 PDT 2015


Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89580
---
 src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
index fa3f187..e91e39a 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
@@ -1486,9 +1486,30 @@ vec4_visitor::nir_emit_texture(nir_tex_instr *instr)
          has_nonconstant_offset = true;
          break;
 
-      case nir_tex_src_sampler_offset:
-         /* @TODO: not yet implemented */
+      case nir_tex_src_sampler_offset: {
+         /* The highest sampler which may be used by this operation is
+          * the last element of the array. Mark it here, because the generator
+          * doesn't have enough information to determine the bound.
+          */
+         uint32_t array_size = instr->sampler_array_size;
+
+         uint32_t max_used = sampler + array_size - 1;
+         if (instr->op == nir_texop_tg4) {
+            max_used += prog_data->base.binding_table.gather_texture_start;
+         } else {
+            max_used += prog_data->base.binding_table.texture_start;
+         }
+
+         brw_mark_surface_used(&prog_data->base, max_used);
+
+         /* Emit code to evaluate the actual indexing expression */
+         dst_reg temp(this, glsl_type::uint_type);
+         emit(ADD(temp, src, src_reg(sampler)));
+         emit_uniformize(temp, src_reg(temp));
+
+         sampler_reg = src_reg(temp);
          break;
+      }
 
       case nir_tex_src_projector:
          unreachable("Should be lowered by do_lower_texture_projection");
-- 
2.1.4



More information about the mesa-dev mailing list