nir/spirv: Better handle constant offsets in texture lookups
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 9 Feb 2016 06:12:18 +0000 (22:12 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 9 Feb 2016 18:29:05 +0000 (10:29 -0800)
src/compiler/nir/spirv/spirv_to_nir.c

index ee39b333c1a94cc29fc7ea55a966a3bbbdc13f48..c0dd92c36a4c654aec9d035af53c6afc2fc96be8 100644 (file)
@@ -1287,6 +1287,8 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
       unreachable("Unhandled opcode");
    }
 
+   nir_constant *const_offset = NULL;
+
    /* Now we need to handle some number of optional arguments */
    if (idx < count) {
       uint32_t operands = w[idx++];
@@ -1310,8 +1312,12 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
          (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_ddy);
       }
 
-      if (operands & SpvImageOperandsOffsetMask ||
-          operands & SpvImageOperandsConstOffsetMask)
+      if (operands & SpvImageOperandsConstOffsetMask) {
+         const_offset =
+            vtn_value(b, w[idx++], vtn_value_type_constant)->constant;
+      }
+
+      if (operands & SpvImageOperandsOffsetMask)
          (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_offset);
 
       if (operands & SpvImageOperandsConstOffsetsMask)
@@ -1343,6 +1349,11 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
    instr->is_shadow = glsl_sampler_type_is_shadow(image_type);
    instr->is_new_style_shadow = instr->is_shadow;
 
+   if (const_offset) {
+      for (unsigned i = 0; i < 4; i++)
+         instr->const_offset[i] = const_offset->value.u[i];
+   }
+
    if (has_coord) {
       switch (instr->sampler_dim) {
       case GLSL_SAMPLER_DIM_1D: