spirv/nir: Properly handle gather components
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 21 Jul 2016 02:56:45 +0000 (19:56 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 22 Jul 2016 23:27:35 +0000 (16:27 -0700)
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "12.0" <mesa-dev@lists.freedesktop.org>
src/compiler/spirv/spirv_to_nir.c

index c32dfaa76bad017b7244598e8c4482f16d1d3b06..b1bb48be577bce33c8a18dcd40e6769a7863187a 100644 (file)
@@ -1368,14 +1368,23 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
       break;
    }
 
-   /* These all have an explicit depth value as their next source */
+   unsigned gather_component = 0;
    switch (opcode) {
    case SpvOpImageSampleDrefImplicitLod:
    case SpvOpImageSampleDrefExplicitLod:
    case SpvOpImageSampleProjDrefImplicitLod:
    case SpvOpImageSampleProjDrefExplicitLod:
+   case SpvOpImageDrefGather:
+      /* These all have an explicit depth value as their next source */
       (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_comparitor);
       break;
+
+   case SpvOpImageGather:
+      /* This has a component as its next source */
+      gather_component =
+         vtn_value(b, w[idx++], vtn_value_type_constant)->constant->value.u[0];
+      break;
+
    default:
       break;
    }
@@ -1481,6 +1490,7 @@ 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 &&
                                 glsl_get_components(ret_type->type) == 1;
+   instr->component = gather_component;
 
    if (has_coord) {
       switch (instr->sampler_dim) {