Right now the generator marks direct surfaces as used but leaves marking of
indirect surfaces to the caller. Just make the callers handle marking in both
cases for consistency.
---
 src/mesa/drivers/dri/i965/brw_fs_generator.cpp |  6 ------
 src/mesa/drivers/dri/i965/brw_fs_nir.cpp       | 24 ++++++++++++++++--------
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
index 740003c..96d34b7 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
@@ -914,8 +914,6 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg 
dst, struct brw_reg src
                  inst->header_size != 0,
                  simd_mode,
                  return_format);
-
-      brw_mark_surface_used(prog_data, sampler + base_binding_table_index);
    } else {
       /* Non-const sampler index */
 
@@ -946,10 +944,6 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg 
dst, struct brw_reg src
                               inst->header_size != 0 /* header */,
                               simd_mode,
                               return_format);
-
-      /* visitor knows more than we do about the surface limit required,
-       * so has already done marking.
-       */
    }
 
    if (is_combined_send) {
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
index 349b428..1298148 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
@@ -1980,6 +1980,11 @@ fs_visitor::nir_emit_texture(const fs_builder &bld, 
nir_tex_instr *instr)
    unsigned sampler = instr->sampler_index;
    fs_reg sampler_reg(sampler);
 
+   unsigned binding_table_texture_start =
+      instr->op == nir_texop_tg4 && devinfo->gen < 8 ?
+         stage_prog_data->binding_table.gather_texture_start :
+         stage_prog_data->binding_table.texture_start;
+
    int gather_component = instr->component;
 
    bool is_rect = instr->sampler_dim == GLSL_SAMPLER_DIM_RECT;
@@ -1992,6 +1997,7 @@ fs_visitor::nir_emit_texture(const fs_builder &bld, 
nir_tex_instr *instr)
 
    fs_reg coordinate, shadow_comparitor, lod, lod2, sample_index, mcs, 
tex_offset;
 
+   bool is_indirect_sampler = false;
    for (unsigned i = 0; i < instr->num_srcs; i++) {
       fs_reg src = get_nir_src(instr->src[i].src);
       switch (instr->src[i].src_type) {
@@ -2046,14 +2052,7 @@ fs_visitor::nir_emit_texture(const fs_builder &bld, 
nir_tex_instr *instr)
          unreachable("should be lowered");
 
       case nir_tex_src_sampler_offset: {
-         /* Figure out the highest possible sampler index and mark it as used 
*/
-         uint32_t max_used = sampler + instr->sampler_array_size - 1;
-         if (instr->op == nir_texop_tg4 && devinfo->gen < 8) {
-            max_used += stage_prog_data->binding_table.gather_texture_start;
-         } else {
-            max_used += stage_prog_data->binding_table.texture_start;
-         }
-         brw_mark_surface_used(prog_data, max_used);
+         is_indirect_sampler = true;
 
          /* Emit code to evaluate the actual indexing expression */
          sampler_reg = vgrf(glsl_type::uint_type);
@@ -2067,6 +2066,15 @@ fs_visitor::nir_emit_texture(const fs_builder &bld, 
nir_tex_instr *instr)
       }
    }
 
+   if (!is_indirect_sampler) {
+      brw_mark_surface_used(prog_data, binding_table_texture_start + sampler);
+   } else {
+      /* Figure out the highest possible sampler index and mark it as used */
+      uint32_t max_used = binding_table_texture_start + sampler +
+                          instr->sampler_array_size - 1;
+      brw_mark_surface_used(prog_data, max_used);
+   }
+
    if (instr->op == nir_texop_txf_ms) {
       if (devinfo->gen >= 7 &&
           key_tex->compressed_multisample_layout_mask & (1 << sampler)) {
-- 
1.9.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to