[Mesa-dev] [PATCH 11/16] mesa/st: adjust packed const buffer index for indirect indexing

Timothy Arceri tarceri at itsqueeze.com
Tue Jun 20 01:50:40 UTC 2017


The extra mul should end up const folded away in the backend.
---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 5d82536..8cb6b16 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -2194,20 +2194,31 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
                const_offset = const_offset_ir->value.u[0];
                cbuf.index = const_offset / 16;
                offset_expr->operands[0]->accept(this);
                offset = this->result;
             }
          }
 
          /* Relative/variable index into constant buffer */
          emit_asm(ir, TGSI_OPCODE_USHR, st_dst_reg(index_reg), offset,
               st_src_reg_for_int(4));
+
+         if (ctx->Const.PackedDriverUniformStorage) {
+            st_src_reg tmp_reg =
+               get_temp(native_integers ? glsl_type::int_type :
+                        glsl_type::float_type);
+            emit_asm(ir, TGSI_OPCODE_MUL, st_dst_reg(tmp_reg),
+                     index_reg, st_src_reg_for_type(index_reg.type, 4));
+
+            index_reg = tmp_reg;
+         }
+
          cbuf.reladdr = ralloc(mem_ctx, st_src_reg);
          memcpy(cbuf.reladdr, &index_reg, sizeof(index_reg));
       }
 
       if (const_uniform_block) {
          /* Constant constant buffer */
          cbuf.reladdr2 = NULL;
          cbuf.index2D = const_block;
          cbuf.has_index2 = true;
       }
@@ -2873,20 +2884,34 @@ glsl_to_tgsi_visitor::visit(ir_dereference_array *ir)
       if (element_size == 1) {
          index_reg = this->result;
       } else {
          index_reg = get_temp(native_integers ?
                               glsl_type::int_type : glsl_type::float_type);
 
          emit_asm(ir, TGSI_OPCODE_MUL, st_dst_reg(index_reg),
               this->result, st_src_reg_for_type(index_reg.type, element_size));
       }
 
+      ir_variable *var = ir->array->variable_referenced();
+      if (ctx->Const.PackedDriverUniformStorage &&
+          var && var->data.mode == ir_var_uniform) {
+         unsigned comps = ir->type->without_array()->vector_elements;
+
+         st_src_reg tmp_reg =
+            get_temp(native_integers ? glsl_type::int_type :
+                     glsl_type::float_type);
+         emit_asm(ir, TGSI_OPCODE_MUL, st_dst_reg(tmp_reg),
+                  index_reg, st_src_reg_for_type(index_reg.type, comps));
+
+         index_reg = tmp_reg;
+      }
+
       /* If there was already a relative address register involved, add the
        * new and the old together to get the new offset.
        */
       if (!is_2D && src.reladdr != NULL) {
          st_src_reg accum_reg = get_temp(native_integers ?
                                 glsl_type::int_type : glsl_type::float_type);
 
          emit_asm(ir, TGSI_OPCODE_ADD, st_dst_reg(accum_reg),
               index_reg, *src.reladdr);
 
-- 
2.9.4



More information about the mesa-dev mailing list