[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