Enable GatherCmpRed. Green/Blue/Alpha cannot be supported.
authorsteve-lunarg <steve_gh@khasekhemwy.net>
Thu, 9 Mar 2017 15:59:45 +0000 (08:59 -0700)
committersteve-lunarg <steve_gh@khasekhemwy.net>
Thu, 9 Mar 2017 15:59:45 +0000 (08:59 -0700)
This implements GatherCmpRed in terms of OpImageDrefGather.

There appears to be no way to implement the Green/Blue/Apha forms: see #673.

Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out [new file with mode: 0644]
Test/hlsl.gathercmpRGBA.offset.dx10.frag
gtests/Hlsl.FromFile.cpp
hlsl/hlslParseHelper.cpp

diff --git a/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
new file mode 100644 (file)
index 0000000..d7af451
--- /dev/null
@@ -0,0 +1,610 @@
+hlsl.gathercmpRGBA.offset.dx10.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:38  Function Definition: @main( (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38    Function Parameters: 
+0:?     Sequence
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of float)
+0:45          'txval001' (temp 4-component vector of float)
+0:45          textureGatherOffset (temp 4-component vector of float)
+0:45            Construct combined texture-sampler (temp sampler2DShadow)
+0:45              'g_tTex2df4' (uniform texture2D)
+0:45              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:45            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:45              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:45              Constant:
+0:45                1 (const uint)
+0:45            Constant:
+0:45              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               0 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of int)
+0:46          'txval011' (temp 4-component vector of int)
+0:46          textureGatherOffset (temp 4-component vector of int)
+0:46            Construct combined texture-sampler (temp isampler2DShadow)
+0:46              'g_tTex2di4' (uniform itexture2D)
+0:46              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:46            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:46              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:46              Constant:
+0:46                1 (const uint)
+0:46            Constant:
+0:46              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               -1 (const int)
+0:46            Constant:
+0:46              0 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of uint)
+0:47          'txval021' (temp 4-component vector of uint)
+0:47          textureGatherOffset (temp 4-component vector of uint)
+0:47            Construct combined texture-sampler (temp usampler2DShadow)
+0:47              'g_tTex2du4' (uniform utexture2D)
+0:47              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:47            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:47              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:47              Constant:
+0:47                1 (const uint)
+0:47            Constant:
+0:47              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               1 (const int)
+0:47            Constant:
+0:47              0 (const int)
+0:49      Sequence
+0:49        move second child to first child (temp 4-component vector of float)
+0:49          'txval004' (temp 4-component vector of float)
+0:49          textureGatherOffsets (temp 4-component vector of float)
+0:49            Construct combined texture-sampler (temp sampler2DShadow)
+0:49              'g_tTex2df4' (uniform texture2D)
+0:49              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:49            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:49              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:49              Constant:
+0:49                1 (const uint)
+0:49            Constant:
+0:49              0.750000
+0:49            Constant:
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49            Constant:
+0:49              0 (const int)
+0:50      Sequence
+0:50        move second child to first child (temp 4-component vector of int)
+0:50          'txval014' (temp 4-component vector of int)
+0:50          textureGatherOffsets (temp 4-component vector of int)
+0:50            Construct combined texture-sampler (temp isampler2DShadow)
+0:50              'g_tTex2di4' (uniform itexture2D)
+0:50              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:50            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:50              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:50              Constant:
+0:50                1 (const uint)
+0:50            Constant:
+0:50              0.750000
+0:50            Constant:
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of uint)
+0:51          'txval024' (temp 4-component vector of uint)
+0:51          textureGatherOffsets (temp 4-component vector of uint)
+0:51            Construct combined texture-sampler (temp usampler2DShadow)
+0:51              'g_tTex2du4' (uniform utexture2D)
+0:51              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:51            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:51              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:51              Constant:
+0:51                1 (const uint)
+0:51            Constant:
+0:51              0.750000
+0:51            Constant:
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51            Constant:
+0:51              0 (const int)
+0:114      move second child to first child (temp 4-component vector of float)
+0:114        Color: direct index for structure (temp 4-component vector of float)
+0:114          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:114          Constant:
+0:114            0 (const int)
+0:114        Constant:
+0:114          1.000000
+0:114          1.000000
+0:114          1.000000
+0:114          1.000000
+0:115      move second child to first child (temp float)
+0:115        Depth: direct index for structure (temp float)
+0:115          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115          Constant:
+0:115            1 (const int)
+0:115        Constant:
+0:115          1.000000
+0:117      Branch: Return with expression
+0:117        'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38  Function Definition: main( (temp void)
+0:38    Function Parameters: 
+0:?     Sequence
+0:38      Sequence
+0:38        move second child to first child (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38          'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38          Function Call: @main( (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38        move second child to first child (temp 4-component vector of float)
+0:?           'Color' (layout(location=0 ) out 4-component vector of float)
+0:38          Color: direct index for structure (temp 4-component vector of float)
+0:38            'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38            Constant:
+0:38              0 (const int)
+0:38        move second child to first child (temp float)
+0:?           'Depth' (out float FragDepth)
+0:38          Depth: direct index for structure (temp float)
+0:38            'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38            Constant:
+0:38              1 (const int)
+0:?   Linker Objects
+0:?     'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
+0:?     'g_tTex1di4' (uniform itexture1D)
+0:?     'g_tTex1du4' (uniform utexture1D)
+0:?     'g_tTex2df4' (uniform texture2D)
+0:?     'g_tTex2di4' (uniform itexture2D)
+0:?     'g_tTex2du4' (uniform utexture2D)
+0:?     'g_tTex3df4' (uniform texture3D)
+0:?     'g_tTex3di4' (uniform itexture3D)
+0:?     'g_tTex3du4' (uniform utexture3D)
+0:?     'g_tTexcdf4' (uniform textureCube)
+0:?     'g_tTexcdi4' (uniform itextureCube)
+0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
+0:?     'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:38  Function Definition: @main( (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38    Function Parameters: 
+0:?     Sequence
+0:45      Sequence
+0:45        move second child to first child (temp 4-component vector of float)
+0:45          'txval001' (temp 4-component vector of float)
+0:45          textureGatherOffset (temp 4-component vector of float)
+0:45            Construct combined texture-sampler (temp sampler2DShadow)
+0:45              'g_tTex2df4' (uniform texture2D)
+0:45              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:45            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:45              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:45              Constant:
+0:45                1 (const uint)
+0:45            Constant:
+0:45              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               0 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      Sequence
+0:46        move second child to first child (temp 4-component vector of int)
+0:46          'txval011' (temp 4-component vector of int)
+0:46          textureGatherOffset (temp 4-component vector of int)
+0:46            Construct combined texture-sampler (temp isampler2DShadow)
+0:46              'g_tTex2di4' (uniform itexture2D)
+0:46              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:46            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:46              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:46              Constant:
+0:46                1 (const uint)
+0:46            Constant:
+0:46              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               -1 (const int)
+0:46            Constant:
+0:46              0 (const int)
+0:47      Sequence
+0:47        move second child to first child (temp 4-component vector of uint)
+0:47          'txval021' (temp 4-component vector of uint)
+0:47          textureGatherOffset (temp 4-component vector of uint)
+0:47            Construct combined texture-sampler (temp usampler2DShadow)
+0:47              'g_tTex2du4' (uniform utexture2D)
+0:47              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:47            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:47              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:47              Constant:
+0:47                1 (const uint)
+0:47            Constant:
+0:47              0.750000
+0:?             Constant:
+0:?               1 (const int)
+0:?               1 (const int)
+0:47            Constant:
+0:47              0 (const int)
+0:49      Sequence
+0:49        move second child to first child (temp 4-component vector of float)
+0:49          'txval004' (temp 4-component vector of float)
+0:49          textureGatherOffsets (temp 4-component vector of float)
+0:49            Construct combined texture-sampler (temp sampler2DShadow)
+0:49              'g_tTex2df4' (uniform texture2D)
+0:49              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:49            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:49              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:49              Constant:
+0:49                1 (const uint)
+0:49            Constant:
+0:49              0.750000
+0:49            Constant:
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49              1 (const int)
+0:49              0 (const int)
+0:49            Constant:
+0:49              0 (const int)
+0:50      Sequence
+0:50        move second child to first child (temp 4-component vector of int)
+0:50          'txval014' (temp 4-component vector of int)
+0:50          textureGatherOffsets (temp 4-component vector of int)
+0:50            Construct combined texture-sampler (temp isampler2DShadow)
+0:50              'g_tTex2di4' (uniform itexture2D)
+0:50              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:50            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:50              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:50              Constant:
+0:50                1 (const uint)
+0:50            Constant:
+0:50              0.750000
+0:50            Constant:
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50              1 (const int)
+0:50              -1 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      Sequence
+0:51        move second child to first child (temp 4-component vector of uint)
+0:51          'txval024' (temp 4-component vector of uint)
+0:51          textureGatherOffsets (temp 4-component vector of uint)
+0:51            Construct combined texture-sampler (temp usampler2DShadow)
+0:51              'g_tTex2du4' (uniform utexture2D)
+0:51              'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:51            c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of float)
+0:51              'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+0:51              Constant:
+0:51                1 (const uint)
+0:51            Constant:
+0:51              0.750000
+0:51            Constant:
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51              1 (const int)
+0:51            Constant:
+0:51              0 (const int)
+0:114      move second child to first child (temp 4-component vector of float)
+0:114        Color: direct index for structure (temp 4-component vector of float)
+0:114          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:114          Constant:
+0:114            0 (const int)
+0:114        Constant:
+0:114          1.000000
+0:114          1.000000
+0:114          1.000000
+0:114          1.000000
+0:115      move second child to first child (temp float)
+0:115        Depth: direct index for structure (temp float)
+0:115          'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:115          Constant:
+0:115            1 (const int)
+0:115        Constant:
+0:115          1.000000
+0:117      Branch: Return with expression
+0:117        'psout' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38  Function Definition: main( (temp void)
+0:38    Function Parameters: 
+0:?     Sequence
+0:38      Sequence
+0:38        move second child to first child (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38          'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38          Function Call: @main( (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38        move second child to first child (temp 4-component vector of float)
+0:?           'Color' (layout(location=0 ) out 4-component vector of float)
+0:38          Color: direct index for structure (temp 4-component vector of float)
+0:38            'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38            Constant:
+0:38              0 (const int)
+0:38        move second child to first child (temp float)
+0:?           'Depth' (out float FragDepth)
+0:38          Depth: direct index for structure (temp float)
+0:38            'flattenTemp' (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:38            Constant:
+0:38              1 (const int)
+0:?   Linker Objects
+0:?     'g_sSampCmp' (layout(binding=0 ) uniform sampler)
+0:?     'g_tTex1df4a' (layout(binding=1 ) uniform texture1D)
+0:?     'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
+0:?     'g_tTex1di4' (uniform itexture1D)
+0:?     'g_tTex1du4' (uniform utexture1D)
+0:?     'g_tTex2df4' (uniform texture2D)
+0:?     'g_tTex2di4' (uniform itexture2D)
+0:?     'g_tTex2du4' (uniform utexture2D)
+0:?     'g_tTex3df4' (uniform texture3D)
+0:?     'g_tTex3di4' (uniform itexture3D)
+0:?     'g_tTex3du4' (uniform utexture3D)
+0:?     'g_tTexcdf4' (uniform textureCube)
+0:?     'g_tTexcdi4' (uniform itextureCube)
+0:?     'g_tTexcdu4' (uniform utextureCube)
+0:?     'Color' (layout(location=0 ) out 4-component vector of float)
+0:?     'Depth' (out float FragDepth)
+0:?     'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform float c1, layout(offset=8 ) uniform 2-component vector of float c2, layout(offset=16 ) uniform 3-component vector of float c3, layout(offset=32 ) uniform 4-component vector of float c4})
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 146
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 111 115
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 8  "PS_OUTPUT"
+                              MemberName 8(PS_OUTPUT) 0  "Color"
+                              MemberName 8(PS_OUTPUT) 1  "Depth"
+                              Name 10  "@main("
+                              Name 13  "txval001"
+                              Name 16  "g_tTex2df4"
+                              Name 20  "g_sSampCmp"
+                              Name 27  "$Global"
+                              MemberName 27($Global) 0  "c1"
+                              MemberName 27($Global) 1  "c2"
+                              MemberName 27($Global) 2  "c3"
+                              MemberName 27($Global) 3  "c4"
+                              Name 29  ""
+                              Name 42  "txval011"
+                              Name 45  "g_tTex2di4"
+                              Name 59  "txval021"
+                              Name 62  "g_tTex2du4"
+                              Name 72  "txval004"
+                              Name 82  "txval014"
+                              Name 90  "txval024"
+                              Name 99  "psout"
+                              Name 108  "flattenTemp"
+                              Name 111  "Color"
+                              Name 115  "Depth"
+                              Name 120  "g_tTex1df4a"
+                              Name 121  "g_tTex1df4"
+                              Name 124  "g_tTex1di4"
+                              Name 127  "g_tTex1du4"
+                              Name 130  "g_tTex3df4"
+                              Name 133  "g_tTex3di4"
+                              Name 136  "g_tTex3du4"
+                              Name 139  "g_tTexcdf4"
+                              Name 142  "g_tTexcdi4"
+                              Name 145  "g_tTexcdu4"
+                              Decorate 16(g_tTex2df4) DescriptorSet 0
+                              Decorate 20(g_sSampCmp) DescriptorSet 0
+                              Decorate 20(g_sSampCmp) Binding 0
+                              MemberDecorate 27($Global) 0 Offset 0
+                              MemberDecorate 27($Global) 1 Offset 8
+                              MemberDecorate 27($Global) 2 Offset 16
+                              MemberDecorate 27($Global) 3 Offset 32
+                              Decorate 27($Global) Block
+                              Decorate 29 DescriptorSet 0
+                              Decorate 45(g_tTex2di4) DescriptorSet 0
+                              Decorate 62(g_tTex2du4) DescriptorSet 0
+                              Decorate 111(Color) Location 0
+                              Decorate 115(Depth) BuiltIn FragDepth
+                              Decorate 120(g_tTex1df4a) DescriptorSet 0
+                              Decorate 120(g_tTex1df4a) Binding 1
+                              Decorate 121(g_tTex1df4) DescriptorSet 0
+                              Decorate 121(g_tTex1df4) Binding 0
+                              Decorate 124(g_tTex1di4) DescriptorSet 0
+                              Decorate 127(g_tTex1du4) DescriptorSet 0
+                              Decorate 130(g_tTex3df4) DescriptorSet 0
+                              Decorate 133(g_tTex3di4) DescriptorSet 0
+                              Decorate 136(g_tTex3du4) DescriptorSet 0
+                              Decorate 139(g_tTexcdf4) DescriptorSet 0
+                              Decorate 142(g_tTexcdi4) DescriptorSet 0
+                              Decorate 145(g_tTexcdu4) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+               9:             TypeFunction 8(PS_OUTPUT)
+              12:             TypePointer Function 7(fvec4)
+              14:             TypeImage 6(float) 2D sampled format:Unknown
+              15:             TypePointer UniformConstant 14
+  16(g_tTex2df4):     15(ptr) Variable UniformConstant
+              18:             TypeSampler
+              19:             TypePointer UniformConstant 18
+  20(g_sSampCmp):     19(ptr) Variable UniformConstant
+              22:             TypeImage 6(float) 2D depth sampled format:Unknown
+              23:             TypeSampledImage 22
+              25:             TypeVector 6(float) 2
+              26:             TypeVector 6(float) 3
+     27($Global):             TypeStruct 6(float) 25(fvec2) 26(fvec3) 7(fvec4)
+              28:             TypePointer Uniform 27($Global)
+              29:     28(ptr) Variable Uniform
+              30:             TypeInt 32 1
+              31:     30(int) Constant 1
+              32:             TypePointer Uniform 25(fvec2)
+              35:    6(float) Constant 1061158912
+              36:             TypeVector 30(int) 2
+              37:     30(int) Constant 0
+              38:   36(ivec2) ConstantComposite 31 37
+              40:             TypeVector 30(int) 4
+              41:             TypePointer Function 40(ivec4)
+              43:             TypeImage 30(int) 2D sampled format:Unknown
+              44:             TypePointer UniformConstant 43
+  45(g_tTex2di4):     44(ptr) Variable UniformConstant
+              48:             TypeImage 30(int) 2D depth sampled format:Unknown
+              49:             TypeSampledImage 48
+              53:     30(int) Constant 4294967295
+              54:   36(ivec2) ConstantComposite 31 53
+              56:             TypeInt 32 0
+              57:             TypeVector 56(int) 4
+              58:             TypePointer Function 57(ivec4)
+              60:             TypeImage 56(int) 2D sampled format:Unknown
+              61:             TypePointer UniformConstant 60
+  62(g_tTex2du4):     61(ptr) Variable UniformConstant
+              65:             TypeImage 56(int) 2D depth sampled format:Unknown
+              66:             TypeSampledImage 65
+              70:   36(ivec2) ConstantComposite 31 31
+              78:     56(int) Constant 4
+              79:             TypeArray 36(ivec2) 78
+              80:          79 ConstantComposite 38 38 38 38
+              88:          79 ConstantComposite 54 54 54 54
+              96:          79 ConstantComposite 70 70 70 70
+              98:             TypePointer Function 8(PS_OUTPUT)
+             100:    6(float) Constant 1065353216
+             101:    7(fvec4) ConstantComposite 100 100 100 100
+             103:             TypePointer Function 6(float)
+             110:             TypePointer Output 7(fvec4)
+      111(Color):    110(ptr) Variable Output
+             114:             TypePointer Output 6(float)
+      115(Depth):    114(ptr) Variable Output
+             118:             TypeImage 6(float) 1D sampled format:Unknown
+             119:             TypePointer UniformConstant 118
+120(g_tTex1df4a):    119(ptr) Variable UniformConstant
+ 121(g_tTex1df4):    119(ptr) Variable UniformConstant
+             122:             TypeImage 30(int) 1D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex1di4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 56(int) 1D sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+ 127(g_tTex1du4):    126(ptr) Variable UniformConstant
+             128:             TypeImage 6(float) 3D sampled format:Unknown
+             129:             TypePointer UniformConstant 128
+ 130(g_tTex3df4):    129(ptr) Variable UniformConstant
+             131:             TypeImage 30(int) 3D sampled format:Unknown
+             132:             TypePointer UniformConstant 131
+ 133(g_tTex3di4):    132(ptr) Variable UniformConstant
+             134:             TypeImage 56(int) 3D sampled format:Unknown
+             135:             TypePointer UniformConstant 134
+ 136(g_tTex3du4):    135(ptr) Variable UniformConstant
+             137:             TypeImage 6(float) Cube sampled format:Unknown
+             138:             TypePointer UniformConstant 137
+ 139(g_tTexcdf4):    138(ptr) Variable UniformConstant
+             140:             TypeImage 30(int) Cube sampled format:Unknown
+             141:             TypePointer UniformConstant 140
+ 142(g_tTexcdi4):    141(ptr) Variable UniformConstant
+             143:             TypeImage 56(int) Cube sampled format:Unknown
+             144:             TypePointer UniformConstant 143
+ 145(g_tTexcdu4):    144(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+108(flattenTemp):     98(ptr) Variable Function
+             109:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 108(flattenTemp) 109
+             112:     12(ptr) AccessChain 108(flattenTemp) 37
+             113:    7(fvec4) Load 112
+                              Store 111(Color) 113
+             116:    103(ptr) AccessChain 108(flattenTemp) 31
+             117:    6(float) Load 116
+                              Store 115(Depth) 117
+                              Return
+                              FunctionEnd
+      10(@main():8(PS_OUTPUT) Function None 9
+              11:             Label
+    13(txval001):     12(ptr) Variable Function
+    42(txval011):     41(ptr) Variable Function
+    59(txval021):     58(ptr) Variable Function
+    72(txval004):     12(ptr) Variable Function
+    82(txval014):     41(ptr) Variable Function
+    90(txval024):     58(ptr) Variable Function
+       99(psout):     98(ptr) Variable Function
+              17:          14 Load 16(g_tTex2df4)
+              21:          18 Load 20(g_sSampCmp)
+              24:          23 SampledImage 17 21
+              33:     32(ptr) AccessChain 29 31
+              34:   25(fvec2) Load 33
+              39:    7(fvec4) ImageDrefGather 24 34 35 ConstOffset 38
+                              Store 13(txval001) 39
+              46:          43 Load 45(g_tTex2di4)
+              47:          18 Load 20(g_sSampCmp)
+              50:          49 SampledImage 46 47
+              51:     32(ptr) AccessChain 29 31
+              52:   25(fvec2) Load 51
+              55:   40(ivec4) ImageDrefGather 50 52 35 ConstOffset 54
+                              Store 42(txval011) 55
+              63:          60 Load 62(g_tTex2du4)
+              64:          18 Load 20(g_sSampCmp)
+              67:          66 SampledImage 63 64
+              68:     32(ptr) AccessChain 29 31
+              69:   25(fvec2) Load 68
+              71:   57(ivec4) ImageDrefGather 67 69 35 ConstOffset 70
+                              Store 59(txval021) 71
+              73:          14 Load 16(g_tTex2df4)
+              74:          18 Load 20(g_sSampCmp)
+              75:          23 SampledImage 73 74
+              76:     32(ptr) AccessChain 29 31
+              77:   25(fvec2) Load 76
+              81:    7(fvec4) ImageDrefGather 75 77 35 ConstOffsets 80
+                              Store 72(txval004) 81
+              83:          43 Load 45(g_tTex2di4)
+              84:          18 Load 20(g_sSampCmp)
+              85:          49 SampledImage 83 84
+              86:     32(ptr) AccessChain 29 31
+              87:   25(fvec2) Load 86
+              89:   40(ivec4) ImageDrefGather 85 87 35 ConstOffsets 88
+                              Store 82(txval014) 89
+              91:          60 Load 62(g_tTex2du4)
+              92:          18 Load 20(g_sSampCmp)
+              93:          66 SampledImage 91 92
+              94:     32(ptr) AccessChain 29 31
+              95:   25(fvec2) Load 94
+              97:   57(ivec4) ImageDrefGather 93 95 35 ConstOffsets 96
+                              Store 90(txval024) 97
+             102:     12(ptr) AccessChain 99(psout) 37
+                              Store 102 101
+             104:    103(ptr) AccessChain 99(psout) 31
+                              Store 104 100
+             105:8(PS_OUTPUT) Load 99(psout)
+                              ReturnValue 105
+                              FunctionEnd
index 3a6fbb7..18e3a37 100644 (file)
@@ -29,10 +29,10 @@ uniform float2 c2;
 uniform float3 c3;
 uniform float4 c4;
 
-uniform int  o1;
-uniform int2 o2;
-uniform int3 o3;
-uniform int4 o4;
+
+
+
+
 
 PS_OUTPUT main()
 {
@@ -42,69 +42,72 @@ PS_OUTPUT main()
 
    // no 1D gathers
 
-   float4 txval001 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
-   int4   txval011 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
-   uint4  txval021 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2);
+   float4 txval001 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0));
+   int4   txval011 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,-1));
+   uint4  txval021 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,1));
 
-   float4 txval004 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   int4   txval014 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   uint4  txval024 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
+   float4 txval004 = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   int4   txval014 = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,-1), int2(1,-1), int2(1,-1), int2(1,-1));
+   uint4  txval024 = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,1), int2(1,1), int2(1,1), int2(1,1));
    
-   // float4 txval00s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
-   // int4   txval01s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
-   // uint4  txval02s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, status);
-
-   // float4 txval004s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // int4   txval014s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // uint4  txval024s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-
-   float4 txval101 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
-   int4   txval111 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
-   uint4  txval121 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2);
-
-   float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-
-   // float4 txval10s = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
-   // int4   txval11s = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
-   // uint4  txval12s = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, status);
-
-   // float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-
-   float4 txval201 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
-   int4   txval211 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
-   uint4  txval221 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2);
-
-   float4 txval204 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   int4   txval214 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   uint4  txval224 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-
-   // float4 txval204s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // int4   txval214s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // uint4  txval224s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-
-   // float4 txval20s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
-   // int4   txval21s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
-   // uint4  txval22s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, o2, status);
-
-   float4 txval301 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
-   int4   txval311 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
-   uint4  txval321 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2);
-
-   float4 txval304 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   int4   txval314 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-   uint4  txval324 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2);
-
-   // float4 txval304s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // int4   txval314s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-   // uint4  txval324s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, o2, o2, o2, status);
-
-   // float4 txval30s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
-   // int4   txval31s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
-   // uint4  txval32s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, o2, status);
+   // float4 txval00s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // int4   txval01s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // uint4  txval02s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), status);
+
+   // float4 txval004s = g_tTex2df4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // int4   txval014s = g_tTex2di4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // uint4  txval024s = g_tTex2du4 . GatherCmpRed(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+
+   // GatherCmpGreen not implemented pending OpImageDrefGather component input
+   // float4 txval101 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0));
+   // int4   txval111 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0));
+   // uint4  txval121 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0));
+
+   // float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+
+   // float4 txval10s = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // int4   txval11s = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // uint4  txval12s = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), status);
+
+   // float4 txval104 = g_tTex2df4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // int4   txval114 = g_tTex2di4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // uint4  txval124 = g_tTex2du4 . GatherCmpGreen(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+
+   // GatherCmpBlue not implemented pending OpImageDrefGather component input
+   // float4 txval201 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0));
+   // int4   txval211 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0));
+   // uint4  txval221 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0));
+
+   // float4 txval204 = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // int4   txval214 = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // uint4  txval224 = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+
+   // float4 txval204s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // int4   txval214s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // uint4  txval224s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+
+   // float4 txval20s = g_tTex2df4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // int4   txval21s = g_tTex2di4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // uint4  txval22s = g_tTex2du4 . GatherCmpBlue(g_sSampCmp, c2, 0.75, int2(1,0), status);
+
+   // GatherCmpAlpha not implemented pending OpImageDrefGather component input
+   // float4 txval301 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0));
+   // int4   txval311 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0));
+   // uint4  txval321 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0));
+
+   // float4 txval304 = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // int4   txval314 = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+   // uint4  txval324 = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0));
+
+   // float4 txval304s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // int4   txval314s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+   // uint4  txval324s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), int2(1,0), int2(1,0), int2(1,0), status);
+
+   // float4 txval30s = g_tTex2df4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // int4   txval31s = g_tTex2di4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), status);
+   // uint4  txval32s = g_tTex2du4 . GatherCmpAlpha(g_sSampCmp, c2, 0.75, int2(1,0), status);
 
    // no 3D gathers with offset
 
index 689a015..16c4455 100644 (file)
@@ -111,6 +111,7 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.gather.basic.dx10.vert", "main"},
         {"hlsl.gather.offset.dx10.frag", "main"},
         {"hlsl.gather.offsetarray.dx10.frag", "main"},
+        {"hlsl.gathercmpRGBA.offset.dx10.frag", "main"},
         {"hlsl.gatherRGBA.array.dx10.frag", "main"},
         {"hlsl.gatherRGBA.basic.dx10.frag", "main"},
         {"hlsl.gatherRGBA.offset.dx10.frag", "main"},
index e0dcc09..38984ac 100755 (executable)
@@ -3043,8 +3043,10 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
             // For now, we have nothing to map the component-wise comparison forms
             // to, because neither GLSL nor SPIR-V has such an opcode.  Issue an
             // unimplemented error instead.  Most of the machinery is here if that
-            // should ever become available.
-            if (cmpValues) {
+            // should ever become available.  However, red can be passed through
+            // to OpImageDrefGather.  G/B/A cannot, because that opcode does not
+            // accept a component.
+            if (cmpValues != 0 && op != EOpMethodGatherCmpRed) {
                 error(loc, "unimplemented: component-level gather compare", "", "");
                 return;
             }
@@ -3125,7 +3127,7 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
             }
 
             // Add comparison value if we have one
-            if (argTex->getType().getSampler().isShadow())
+            if (argCmp != nullptr)
                 txgather->getSequence().push_back(argCmp);
 
             // Add offset (either 1, or an array of 4) if we have one