HLSL: add standard sample position return form of GetSamplePosition method
authorsteve-lunarg <steve_gh@khasekhemwy.net>
Wed, 26 Apr 2017 14:31:56 +0000 (08:31 -0600)
committersteve-lunarg <steve_gh@khasekhemwy.net>
Wed, 26 Apr 2017 14:31:56 +0000 (08:31 -0600)
Multisample textures support a GetSamplePosition() method intended to query
positions given a sample index.  This cannot be truly implemented in SPIR-V,
but #753 requested returning standard positions for the 1..16 cases, which
this PR adds.  Anything besides that returns (0,0).  If the standard positions
are not used, this will be wrong.

This should be revisited when there is a real query available.

Test/baseResults/hlsl.getsampleposition.dx10.frag.out
Test/hlsl.getsampleposition.dx10.frag
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h

index 4c86b75..d8274fa 100644 (file)
 hlsl.getsampleposition.dx10.frag
-ERROR: 0:16: '' : unimplemented: GetSamplePosition 
-ERROR: 0:17: '' : unimplemented: GetSamplePosition 
-ERROR: 2 compilation errors.  No code generated.
-
-
 Shader version: 500
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
-0:13  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:? Sequence
+0:13  Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13    Function Parameters: 
+0:13      'sample' ( in int)
 0:?     Sequence
 0:16      Sequence
 0:16        move second child to first child ( temp 2-component vector of float)
 0:16          'r00' ( temp 2-component vector of float)
-0:16          ERROR: Bad aggregation op
- ( temp 2-component vector of float)
-0:16            'g_tTex2dmsf4' ( uniform texture2DMS)
-0:16            Constant:
-0:16              1 (const int)
+0:16          Sequence
+0:16            move second child to first child ( temp uint)
+0:16              '@sampleCount' ( temp uint)
+0:16              imageQuerySamples ( temp uint)
+0:16                'g_tTex2dmsf4' ( uniform texture2DMS)
+0:16            Test condition and select ( temp 2-component vector of float)
+0:16              Condition
+0:16              Compare Equal ( temp bool)
+0:16                '@sampleCount' ( temp uint)
+0:16                Constant:
+0:16                  2 (const int)
+0:16              true case
+0:16              indirect index ( temp 2-component vector of float)
+0:?                 Constant:
+0:?                   0.250000
+0:?                   0.250000
+0:?                   -0.250000
+0:?                   -0.250000
+0:16                'sample' ( in int)
+0:16              false case
+0:16              Test condition and select ( temp 2-component vector of float)
+0:16                Condition
+0:16                Compare Equal ( temp bool)
+0:16                  '@sampleCount' ( temp uint)
+0:16                  Constant:
+0:16                    4 (const int)
+0:16                true case
+0:16                indirect index ( temp 2-component vector of float)
+0:?                   Constant:
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.375000
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.125000
+0:?                     0.125000
+0:?                     0.375000
+0:16                  'sample' ( in int)
+0:16                false case
+0:16                Test condition and select ( temp 2-component vector of float)
+0:16                  Condition
+0:16                  Compare Equal ( temp bool)
+0:16                    '@sampleCount' ( temp uint)
+0:16                    Constant:
+0:16                      8 (const int)
+0:16                  true case
+0:16                  indirect index ( temp 2-component vector of float)
+0:?                     Constant:
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.312500
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.312500
+0:?                       -0.312500
+0:?                       0.312500
+0:?                       -0.437500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.437500
+0:?                       0.437500
+0:?                       -0.437500
+0:16                    'sample' ( in int)
+0:16                  false case
+0:16                  Test condition and select ( temp 2-component vector of float)
+0:16                    Condition
+0:16                    Compare Equal ( temp bool)
+0:16                      '@sampleCount' ( temp uint)
+0:16                      Constant:
+0:16                        16 (const int)
+0:16                    true case
+0:16                    indirect index ( temp 2-component vector of float)
+0:?                       Constant:
+0:?                         0.062500
+0:?                         0.062500
+0:?                         -0.062500
+0:?                         -0.187500
+0:?                         -0.187500
+0:?                         0.125000
+0:?                         0.250000
+0:?                         -0.062500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.125000
+0:?                         0.312500
+0:?                         0.312500
+0:?                         0.187500
+0:?                         0.187500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.375000
+0:?                         0.000000
+0:?                         -0.437500
+0:?                         -0.250000
+0:?                         -0.375000
+0:?                         -0.375000
+0:?                         0.250000
+0:?                         -0.500000
+0:?                         0.000000
+0:?                         0.437500
+0:?                         -0.250000
+0:?                         0.375000
+0:?                         0.437500
+0:?                         -0.437500
+0:?                         -0.500000
+0:16                      'sample' ( in int)
+0:16                    false case
+0:?                     Constant:
+0:?                       0.000000
+0:?                       0.000000
 0:17      Sequence
 0:17        move second child to first child ( temp 2-component vector of float)
 0:17          'r01' ( temp 2-component vector of float)
-0:17          ERROR: Bad aggregation op
- ( temp 2-component vector of float)
-0:17            'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:17            Constant:
-0:17              2 (const int)
+0:17          Sequence
+0:17            move second child to first child ( temp uint)
+0:17              '@sampleCount' ( temp uint)
+0:17              imageQuerySamples ( temp uint)
+0:17                'g_tTex2dmsf4a' ( uniform texture2DMSArray)
+0:17            Test condition and select ( temp 2-component vector of float)
+0:17              Condition
+0:17              Compare Equal ( temp bool)
+0:17                '@sampleCount' ( temp uint)
+0:17                Constant:
+0:17                  2 (const int)
+0:17              true case
+0:17              indirect index ( temp 2-component vector of float)
+0:?                 Constant:
+0:?                   0.250000
+0:?                   0.250000
+0:?                   -0.250000
+0:?                   -0.250000
+0:17                'sample' ( in int)
+0:17              false case
+0:17              Test condition and select ( temp 2-component vector of float)
+0:17                Condition
+0:17                Compare Equal ( temp bool)
+0:17                  '@sampleCount' ( temp uint)
+0:17                  Constant:
+0:17                    4 (const int)
+0:17                true case
+0:17                indirect index ( temp 2-component vector of float)
+0:?                   Constant:
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.375000
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.125000
+0:?                     0.125000
+0:?                     0.375000
+0:17                  'sample' ( in int)
+0:17                false case
+0:17                Test condition and select ( temp 2-component vector of float)
+0:17                  Condition
+0:17                  Compare Equal ( temp bool)
+0:17                    '@sampleCount' ( temp uint)
+0:17                    Constant:
+0:17                      8 (const int)
+0:17                  true case
+0:17                  indirect index ( temp 2-component vector of float)
+0:?                     Constant:
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.312500
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.312500
+0:?                       -0.312500
+0:?                       0.312500
+0:?                       -0.437500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.437500
+0:?                       0.437500
+0:?                       -0.437500
+0:17                    'sample' ( in int)
+0:17                  false case
+0:17                  Test condition and select ( temp 2-component vector of float)
+0:17                    Condition
+0:17                    Compare Equal ( temp bool)
+0:17                      '@sampleCount' ( temp uint)
+0:17                      Constant:
+0:17                        16 (const int)
+0:17                    true case
+0:17                    indirect index ( temp 2-component vector of float)
+0:?                       Constant:
+0:?                         0.062500
+0:?                         0.062500
+0:?                         -0.062500
+0:?                         -0.187500
+0:?                         -0.187500
+0:?                         0.125000
+0:?                         0.250000
+0:?                         -0.062500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.125000
+0:?                         0.312500
+0:?                         0.312500
+0:?                         0.187500
+0:?                         0.187500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.375000
+0:?                         0.000000
+0:?                         -0.437500
+0:?                         -0.250000
+0:?                         -0.375000
+0:?                         -0.375000
+0:?                         0.250000
+0:?                         -0.500000
+0:?                         0.000000
+0:?                         0.437500
+0:?                         -0.250000
+0:?                         0.375000
+0:?                         0.437500
+0:?                         -0.437500
+0:?                         -0.500000
+0:17                      'sample' ( in int)
+0:17                    false case
+0:?                     Constant:
+0:?                       0.000000
+0:?                       0.000000
 0:19      move second child to first child ( temp 4-component vector of float)
 0:19        Color: direct index for structure ( temp 4-component vector of float)
 0:19          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
@@ -48,10 +258,14 @@ ERROR: node is still EOpNull!
 0:13  Function Definition: main( ( temp void)
 0:13    Function Parameters: 
 0:?     Sequence
+0:13      move second child to first child ( temp int)
+0:?         'sample' ( temp int)
+0:?         'sample' (layout( location=0) in int)
 0:13      Sequence
 0:13        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:13          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:13          Function Call: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:?             'sample' ( temp int)
 0:13        move second child to first child ( temp 4-component vector of float)
 0:?           'Color' (layout( location=0) out 4-component vector of float)
 0:13          Color: direct index for structure ( temp 4-component vector of float)
@@ -70,6 +284,7 @@ ERROR: node is still EOpNull!
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
 0:?     'Color' (layout( location=0) out 4-component vector of float)
 0:?     'Depth' ( out float FragDepth)
+0:?     'sample' (layout( location=0) in int)
 
 
 Linked fragment stage:
@@ -77,26 +292,241 @@ Linked fragment stage:
 
 Shader version: 500
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
-0:13  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:? Sequence
+0:13  Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13    Function Parameters: 
+0:13      'sample' ( in int)
 0:?     Sequence
 0:16      Sequence
 0:16        move second child to first child ( temp 2-component vector of float)
 0:16          'r00' ( temp 2-component vector of float)
-0:16          ERROR: Bad aggregation op
- ( temp 2-component vector of float)
-0:16            'g_tTex2dmsf4' ( uniform texture2DMS)
-0:16            Constant:
-0:16              1 (const int)
+0:16          Sequence
+0:16            move second child to first child ( temp uint)
+0:16              '@sampleCount' ( temp uint)
+0:16              imageQuerySamples ( temp uint)
+0:16                'g_tTex2dmsf4' ( uniform texture2DMS)
+0:16            Test condition and select ( temp 2-component vector of float)
+0:16              Condition
+0:16              Compare Equal ( temp bool)
+0:16                '@sampleCount' ( temp uint)
+0:16                Constant:
+0:16                  2 (const int)
+0:16              true case
+0:16              indirect index ( temp 2-component vector of float)
+0:?                 Constant:
+0:?                   0.250000
+0:?                   0.250000
+0:?                   -0.250000
+0:?                   -0.250000
+0:16                'sample' ( in int)
+0:16              false case
+0:16              Test condition and select ( temp 2-component vector of float)
+0:16                Condition
+0:16                Compare Equal ( temp bool)
+0:16                  '@sampleCount' ( temp uint)
+0:16                  Constant:
+0:16                    4 (const int)
+0:16                true case
+0:16                indirect index ( temp 2-component vector of float)
+0:?                   Constant:
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.375000
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.125000
+0:?                     0.125000
+0:?                     0.375000
+0:16                  'sample' ( in int)
+0:16                false case
+0:16                Test condition and select ( temp 2-component vector of float)
+0:16                  Condition
+0:16                  Compare Equal ( temp bool)
+0:16                    '@sampleCount' ( temp uint)
+0:16                    Constant:
+0:16                      8 (const int)
+0:16                  true case
+0:16                  indirect index ( temp 2-component vector of float)
+0:?                     Constant:
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.312500
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.312500
+0:?                       -0.312500
+0:?                       0.312500
+0:?                       -0.437500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.437500
+0:?                       0.437500
+0:?                       -0.437500
+0:16                    'sample' ( in int)
+0:16                  false case
+0:16                  Test condition and select ( temp 2-component vector of float)
+0:16                    Condition
+0:16                    Compare Equal ( temp bool)
+0:16                      '@sampleCount' ( temp uint)
+0:16                      Constant:
+0:16                        16 (const int)
+0:16                    true case
+0:16                    indirect index ( temp 2-component vector of float)
+0:?                       Constant:
+0:?                         0.062500
+0:?                         0.062500
+0:?                         -0.062500
+0:?                         -0.187500
+0:?                         -0.187500
+0:?                         0.125000
+0:?                         0.250000
+0:?                         -0.062500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.125000
+0:?                         0.312500
+0:?                         0.312500
+0:?                         0.187500
+0:?                         0.187500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.375000
+0:?                         0.000000
+0:?                         -0.437500
+0:?                         -0.250000
+0:?                         -0.375000
+0:?                         -0.375000
+0:?                         0.250000
+0:?                         -0.500000
+0:?                         0.000000
+0:?                         0.437500
+0:?                         -0.250000
+0:?                         0.375000
+0:?                         0.437500
+0:?                         -0.437500
+0:?                         -0.500000
+0:16                      'sample' ( in int)
+0:16                    false case
+0:?                     Constant:
+0:?                       0.000000
+0:?                       0.000000
 0:17      Sequence
 0:17        move second child to first child ( temp 2-component vector of float)
 0:17          'r01' ( temp 2-component vector of float)
-0:17          ERROR: Bad aggregation op
- ( temp 2-component vector of float)
-0:17            'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:17            Constant:
-0:17              2 (const int)
+0:17          Sequence
+0:17            move second child to first child ( temp uint)
+0:17              '@sampleCount' ( temp uint)
+0:17              imageQuerySamples ( temp uint)
+0:17                'g_tTex2dmsf4a' ( uniform texture2DMSArray)
+0:17            Test condition and select ( temp 2-component vector of float)
+0:17              Condition
+0:17              Compare Equal ( temp bool)
+0:17                '@sampleCount' ( temp uint)
+0:17                Constant:
+0:17                  2 (const int)
+0:17              true case
+0:17              indirect index ( temp 2-component vector of float)
+0:?                 Constant:
+0:?                   0.250000
+0:?                   0.250000
+0:?                   -0.250000
+0:?                   -0.250000
+0:17                'sample' ( in int)
+0:17              false case
+0:17              Test condition and select ( temp 2-component vector of float)
+0:17                Condition
+0:17                Compare Equal ( temp bool)
+0:17                  '@sampleCount' ( temp uint)
+0:17                  Constant:
+0:17                    4 (const int)
+0:17                true case
+0:17                indirect index ( temp 2-component vector of float)
+0:?                   Constant:
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.375000
+0:?                     -0.125000
+0:?                     -0.375000
+0:?                     0.125000
+0:?                     0.125000
+0:?                     0.375000
+0:17                  'sample' ( in int)
+0:17                false case
+0:17                Test condition and select ( temp 2-component vector of float)
+0:17                  Condition
+0:17                  Compare Equal ( temp bool)
+0:17                    '@sampleCount' ( temp uint)
+0:17                    Constant:
+0:17                      8 (const int)
+0:17                  true case
+0:17                  indirect index ( temp 2-component vector of float)
+0:?                     Constant:
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.312500
+0:?                       0.062500
+0:?                       -0.187500
+0:?                       -0.312500
+0:?                       -0.312500
+0:?                       0.312500
+0:?                       -0.437500
+0:?                       -0.062500
+0:?                       0.187500
+0:?                       0.437500
+0:?                       0.437500
+0:?                       -0.437500
+0:17                    'sample' ( in int)
+0:17                  false case
+0:17                  Test condition and select ( temp 2-component vector of float)
+0:17                    Condition
+0:17                    Compare Equal ( temp bool)
+0:17                      '@sampleCount' ( temp uint)
+0:17                      Constant:
+0:17                        16 (const int)
+0:17                    true case
+0:17                    indirect index ( temp 2-component vector of float)
+0:?                       Constant:
+0:?                         0.062500
+0:?                         0.062500
+0:?                         -0.062500
+0:?                         -0.187500
+0:?                         -0.187500
+0:?                         0.125000
+0:?                         0.250000
+0:?                         -0.062500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.125000
+0:?                         0.312500
+0:?                         0.312500
+0:?                         0.187500
+0:?                         0.187500
+0:?                         -0.312500
+0:?                         -0.125000
+0:?                         0.375000
+0:?                         0.000000
+0:?                         -0.437500
+0:?                         -0.250000
+0:?                         -0.375000
+0:?                         -0.375000
+0:?                         0.250000
+0:?                         -0.500000
+0:?                         0.000000
+0:?                         0.437500
+0:?                         -0.250000
+0:?                         0.375000
+0:?                         0.437500
+0:?                         -0.437500
+0:?                         -0.500000
+0:17                      'sample' ( in int)
+0:17                    false case
+0:?                     Constant:
+0:?                       0.000000
+0:?                       0.000000
 0:19      move second child to first child ( temp 4-component vector of float)
 0:19        Color: direct index for structure ( temp 4-component vector of float)
 0:19          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
@@ -119,10 +549,14 @@ ERROR: node is still EOpNull!
 0:13  Function Definition: main( ( temp void)
 0:13    Function Parameters: 
 0:?     Sequence
+0:13      move second child to first child ( temp int)
+0:?         'sample' ( temp int)
+0:?         'sample' (layout( location=0) in int)
 0:13      Sequence
 0:13        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:13          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:13          Function Call: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:?             'sample' ( temp int)
 0:13        move second child to first child ( temp 4-component vector of float)
 0:?           'Color' (layout( location=0) out 4-component vector of float)
 0:13          Color: direct index for structure ( temp 4-component vector of float)
@@ -141,5 +575,340 @@ ERROR: node is still EOpNull!
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
 0:?     'Color' (layout( location=0) out 4-component vector of float)
 0:?     'Depth' ( out float FragDepth)
+0:?     'sample' (layout( location=0) in int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 221
 
-SPIR-V is not generated for failed compile or link
+                              Capability Shader
+                              Capability ImageMSArray
+                              Capability ImageQuery
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 204 211 215
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 10  "PS_OUTPUT"
+                              MemberName 10(PS_OUTPUT) 0  "Color"
+                              MemberName 10(PS_OUTPUT) 1  "Depth"
+                              Name 13  "@main(i1;"
+                              Name 12  "sample"
+                              Name 17  "r00"
+                              Name 20  "@sampleCount"
+                              Name 23  "g_tTex2dmsf4"
+                              Name 42  "indexable"
+                              Name 65  "indexable"
+                              Name 96  "indexable"
+                              Name 129  "indexable"
+                              Name 138  "r01"
+                              Name 139  "@sampleCount"
+                              Name 142  "g_tTex2dmsf4a"
+                              Name 151  "indexable"
+                              Name 161  "indexable"
+                              Name 171  "indexable"
+                              Name 181  "indexable"
+                              Name 190  "psout"
+                              Name 202  "sample"
+                              Name 204  "sample"
+                              Name 206  "flattenTemp"
+                              Name 207  "param"
+                              Name 211  "Color"
+                              Name 215  "Depth"
+                              Name 220  "g_sSamp"
+                              Decorate 23(g_tTex2dmsf4) DescriptorSet 0
+                              Decorate 142(g_tTex2dmsf4a) DescriptorSet 0
+                              Decorate 204(sample) Location 0
+                              Decorate 211(Color) Location 0
+                              Decorate 215(Depth) BuiltIn FragDepth
+                              Decorate 220(g_sSamp) DescriptorSet 0
+                              Decorate 220(g_sSamp) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+   10(PS_OUTPUT):             TypeStruct 9(fvec4) 8(float)
+              11:             TypeFunction 10(PS_OUTPUT) 7(ptr)
+              15:             TypeVector 8(float) 2
+              16:             TypePointer Function 15(fvec2)
+              18:             TypeInt 32 0
+              19:             TypePointer Function 18(int)
+              21:             TypeImage 8(float) 2D multi-sampled sampled format:Unknown
+              22:             TypePointer UniformConstant 21
+23(g_tTex2dmsf4):     22(ptr) Variable UniformConstant
+              28:      6(int) Constant 2
+              29:             TypeBool
+              33:     18(int) Constant 2
+              34:             TypeArray 15(fvec2) 33
+              35:    8(float) Constant 1048576000
+              36:   15(fvec2) ConstantComposite 35 35
+              37:    8(float) Constant 3196059648
+              38:   15(fvec2) ConstantComposite 37 37
+              39:          34 ConstantComposite 36 38
+              41:             TypePointer Function 34
+              48:      6(int) Constant 4
+              52:     18(int) Constant 4
+              53:             TypeArray 15(fvec2) 52
+              54:    8(float) Constant 3187671040
+              55:    8(float) Constant 3200253952
+              56:   15(fvec2) ConstantComposite 54 55
+              57:    8(float) Constant 1052770304
+              58:   15(fvec2) ConstantComposite 57 54
+              59:    8(float) Constant 1040187392
+              60:   15(fvec2) ConstantComposite 55 59
+              61:   15(fvec2) ConstantComposite 59 57
+              62:          53 ConstantComposite 56 58 60 61
+              64:             TypePointer Function 53
+              71:      6(int) Constant 8
+              75:     18(int) Constant 8
+              76:             TypeArray 15(fvec2) 75
+              77:    8(float) Constant 1031798784
+              78:    8(float) Constant 3191865344
+              79:   15(fvec2) ConstantComposite 77 78
+              80:    8(float) Constant 3179282432
+              81:    8(float) Constant 1044381696
+              82:   15(fvec2) ConstantComposite 80 81
+              83:    8(float) Constant 1050673152
+              84:   15(fvec2) ConstantComposite 83 77
+              85:    8(float) Constant 3198156800
+              86:   15(fvec2) ConstantComposite 78 85
+              87:   15(fvec2) ConstantComposite 85 83
+              88:    8(float) Constant 3202351104
+              89:   15(fvec2) ConstantComposite 88 80
+              90:    8(float) Constant 1054867456
+              91:   15(fvec2) ConstantComposite 81 90
+              92:   15(fvec2) ConstantComposite 90 88
+              93:          76 ConstantComposite 79 82 84 86 87 89 91 92
+              95:             TypePointer Function 76
+             102:      6(int) Constant 16
+             106:     18(int) Constant 16
+             107:             TypeArray 15(fvec2) 106
+             108:   15(fvec2) ConstantComposite 77 77
+             109:   15(fvec2) ConstantComposite 80 78
+             110:   15(fvec2) ConstantComposite 78 59
+             111:   15(fvec2) ConstantComposite 35 80
+             112:   15(fvec2) ConstantComposite 85 54
+             113:   15(fvec2) ConstantComposite 59 83
+             114:   15(fvec2) ConstantComposite 83 81
+             115:   15(fvec2) ConstantComposite 81 85
+             116:   15(fvec2) ConstantComposite 54 57
+             117:    8(float) Constant 0
+             118:   15(fvec2) ConstantComposite 117 88
+             119:   15(fvec2) ConstantComposite 37 55
+             120:   15(fvec2) ConstantComposite 55 35
+             121:    8(float) Constant 3204448256
+             122:   15(fvec2) ConstantComposite 121 117
+             123:   15(fvec2) ConstantComposite 90 37
+             124:   15(fvec2) ConstantComposite 57 90
+             125:   15(fvec2) ConstantComposite 88 121
+             126:         107 ConstantComposite 108 109 110 111 112 113 114 115 116 118 119 120 122 123 124 125
+             128:             TypePointer Function 107
+             133:   15(fvec2) ConstantComposite 117 117
+             140:             TypeImage 8(float) 2D array multi-sampled sampled format:Unknown
+             141:             TypePointer UniformConstant 140
+142(g_tTex2dmsf4a):    141(ptr) Variable UniformConstant
+             189:             TypePointer Function 10(PS_OUTPUT)
+             191:      6(int) Constant 0
+             192:    8(float) Constant 1065353216
+             193:    9(fvec4) ConstantComposite 192 192 192 192
+             194:             TypePointer Function 9(fvec4)
+             196:      6(int) Constant 1
+             197:             TypePointer Function 8(float)
+             203:             TypePointer Input 6(int)
+     204(sample):    203(ptr) Variable Input
+             210:             TypePointer Output 9(fvec4)
+      211(Color):    210(ptr) Variable Output
+             214:             TypePointer Output 8(float)
+      215(Depth):    214(ptr) Variable Output
+             218:             TypeSampler
+             219:             TypePointer UniformConstant 218
+    220(g_sSamp):    219(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+     202(sample):      7(ptr) Variable Function
+206(flattenTemp):    189(ptr) Variable Function
+      207(param):      7(ptr) Variable Function
+             205:      6(int) Load 204(sample)
+                              Store 202(sample) 205
+             208:      6(int) Load 202(sample)
+                              Store 207(param) 208
+             209:10(PS_OUTPUT) FunctionCall 13(@main(i1;) 207(param)
+                              Store 206(flattenTemp) 209
+             212:    194(ptr) AccessChain 206(flattenTemp) 191
+             213:    9(fvec4) Load 212
+                              Store 211(Color) 213
+             216:    197(ptr) AccessChain 206(flattenTemp) 196
+             217:    8(float) Load 216
+                              Store 215(Depth) 217
+                              Return
+                              FunctionEnd
+   13(@main(i1;):10(PS_OUTPUT) Function None 11
+      12(sample):      7(ptr) FunctionParameter
+              14:             Label
+         17(r00):     16(ptr) Variable Function
+20(@sampleCount):     19(ptr) Variable Function
+              26:     16(ptr) Variable Function
+   42(indexable):     41(ptr) Variable Function
+              46:     16(ptr) Variable Function
+   65(indexable):     64(ptr) Variable Function
+              69:     16(ptr) Variable Function
+   96(indexable):     95(ptr) Variable Function
+             100:     16(ptr) Variable Function
+  129(indexable):    128(ptr) Variable Function
+        138(r01):     16(ptr) Variable Function
+139(@sampleCount):     19(ptr) Variable Function
+             145:     16(ptr) Variable Function
+  151(indexable):     41(ptr) Variable Function
+             155:     16(ptr) Variable Function
+  161(indexable):     64(ptr) Variable Function
+             165:     16(ptr) Variable Function
+  171(indexable):     95(ptr) Variable Function
+             175:     16(ptr) Variable Function
+  181(indexable):    128(ptr) Variable Function
+      190(psout):    189(ptr) Variable Function
+              24:          21 Load 23(g_tTex2dmsf4)
+              25:     18(int) ImageQuerySamples 24
+                              Store 20(@sampleCount) 25
+              27:     18(int) Load 20(@sampleCount)
+              30:    29(bool) IEqual 27 28
+                              SelectionMerge 32 None
+                              BranchConditional 30 31 45
+              31:               Label
+              40:      6(int)   Load 12(sample)
+                                Store 42(indexable) 39
+              43:     16(ptr)   AccessChain 42(indexable) 40
+              44:   15(fvec2)   Load 43
+                                Store 26 44
+                                Branch 32
+              45:               Label
+              47:     18(int)   Load 20(@sampleCount)
+              49:    29(bool)   IEqual 47 48
+                                SelectionMerge 51 None
+                                BranchConditional 49 50 68
+              50:                 Label
+              63:      6(int)     Load 12(sample)
+                                  Store 65(indexable) 62
+              66:     16(ptr)     AccessChain 65(indexable) 63
+              67:   15(fvec2)     Load 66
+                                  Store 46 67
+                                  Branch 51
+              68:                 Label
+              70:     18(int)     Load 20(@sampleCount)
+              72:    29(bool)     IEqual 70 71
+                                  SelectionMerge 74 None
+                                  BranchConditional 72 73 99
+              73:                   Label
+              94:      6(int)       Load 12(sample)
+                                    Store 96(indexable) 93
+              97:     16(ptr)       AccessChain 96(indexable) 94
+              98:   15(fvec2)       Load 97
+                                    Store 69 98
+                                    Branch 74
+              99:                   Label
+             101:     18(int)       Load 20(@sampleCount)
+             103:    29(bool)       IEqual 101 102
+                                    SelectionMerge 105 None
+                                    BranchConditional 103 104 132
+             104:                     Label
+             127:      6(int)         Load 12(sample)
+                                      Store 129(indexable) 126
+             130:     16(ptr)         AccessChain 129(indexable) 127
+             131:   15(fvec2)         Load 130
+                                      Store 100 131
+                                      Branch 105
+             132:                     Label
+                                      Store 100 133
+                                      Branch 105
+             105:                   Label
+             134:   15(fvec2)       Load 100
+                                    Store 69 134
+                                    Branch 74
+              74:                 Label
+             135:   15(fvec2)     Load 69
+                                  Store 46 135
+                                  Branch 51
+              51:               Label
+             136:   15(fvec2)   Load 46
+                                Store 26 136
+                                Branch 32
+              32:             Label
+             137:   15(fvec2) Load 26
+                              Store 17(r00) 137
+             143:         140 Load 142(g_tTex2dmsf4a)
+             144:     18(int) ImageQuerySamples 143
+                              Store 139(@sampleCount) 144
+             146:     18(int) Load 139(@sampleCount)
+             147:    29(bool) IEqual 146 28
+                              SelectionMerge 149 None
+                              BranchConditional 147 148 154
+             148:               Label
+             150:      6(int)   Load 12(sample)
+                                Store 151(indexable) 39
+             152:     16(ptr)   AccessChain 151(indexable) 150
+             153:   15(fvec2)   Load 152
+                                Store 145 153
+                                Branch 149
+             154:               Label
+             156:     18(int)   Load 139(@sampleCount)
+             157:    29(bool)   IEqual 156 48
+                                SelectionMerge 159 None
+                                BranchConditional 157 158 164
+             158:                 Label
+             160:      6(int)     Load 12(sample)
+                                  Store 161(indexable) 62
+             162:     16(ptr)     AccessChain 161(indexable) 160
+             163:   15(fvec2)     Load 162
+                                  Store 155 163
+                                  Branch 159
+             164:                 Label
+             166:     18(int)     Load 139(@sampleCount)
+             167:    29(bool)     IEqual 166 71
+                                  SelectionMerge 169 None
+                                  BranchConditional 167 168 174
+             168:                   Label
+             170:      6(int)       Load 12(sample)
+                                    Store 171(indexable) 93
+             172:     16(ptr)       AccessChain 171(indexable) 170
+             173:   15(fvec2)       Load 172
+                                    Store 165 173
+                                    Branch 169
+             174:                   Label
+             176:     18(int)       Load 139(@sampleCount)
+             177:    29(bool)       IEqual 176 102
+                                    SelectionMerge 179 None
+                                    BranchConditional 177 178 184
+             178:                     Label
+             180:      6(int)         Load 12(sample)
+                                      Store 181(indexable) 126
+             182:     16(ptr)         AccessChain 181(indexable) 180
+             183:   15(fvec2)         Load 182
+                                      Store 175 183
+                                      Branch 179
+             184:                     Label
+                                      Store 175 133
+                                      Branch 179
+             179:                   Label
+             185:   15(fvec2)       Load 175
+                                    Store 165 185
+                                    Branch 169
+             169:                 Label
+             186:   15(fvec2)     Load 165
+                                  Store 155 186
+                                  Branch 159
+             159:               Label
+             187:   15(fvec2)   Load 155
+                                Store 145 187
+                                Branch 149
+             149:             Label
+             188:   15(fvec2) Load 145
+                              Store 138(r01) 188
+             195:    194(ptr) AccessChain 190(psout) 191
+                              Store 195 193
+             198:    197(ptr) AccessChain 190(psout) 196
+                              Store 198 192
+             199:10(PS_OUTPUT) Load 190(psout)
+                              ReturnValue 199
+                              FunctionEnd
index a7a93b3..a1182fb 100644 (file)
@@ -9,12 +9,12 @@ struct PS_OUTPUT
     float  Depth : SV_Depth;
 };
 
-PS_OUTPUT main()
+PS_OUTPUT main(int sample : SAMPLE)
 {
    PS_OUTPUT psout;
 
-   float2 r00 = g_tTex2dmsf4.GetSamplePosition(1);
-   float2 r01 = g_tTex2dmsf4a.GetSamplePosition(2);
+   float2 r00 = g_tTex2dmsf4.GetSamplePosition(sample);
+   float2 r01 = g_tTex2dmsf4a.GetSamplePosition(sample);
 
    psout.Color = 1.0;
    psout.Depth = 1.0;
index bfac15b..6d96377 100755 (executable)
@@ -2843,7 +2843,73 @@ void HlslParseContext::decomposeStructBufferMethods(const TSourceLoc& loc, TInte
         break; // most pass through unchanged
     }
 }
+
+// Create array of standard sample positions for given sample count.
+// TODO: remove when a real method to query sample pos exists in SPIR-V.
+TIntermConstantUnion* HlslParseContext::getSamplePosArray(int count)
+{
+    struct tSamplePos { float x, y; };
+
+    static const tSamplePos pos1[] = {
+        { 0.0/16.0,  0.0/16.0 },
+    };
+
+    // standard sample positions for 2, 4, 8, and 16 samples.
+    static const tSamplePos pos2[] = {
+        { 4.0/16.0,  4.0/16.0 }, {-4.0/16.0, -4.0/16.0 },
+    };
+
+    static const tSamplePos pos4[] = {
+        {-2.0/16.0, -6.0/16.0 }, { 6.0/16.0, -2.0/16.0 }, {-6.0/16.0,  2.0/16.0 }, { 2.0/16.0,  6.0/16.0 },
+    };
+
+    static const tSamplePos pos8[] = {
+        { 1.0/16.0, -3.0/16.0 }, {-1.0/16.0,  3.0/16.0 }, { 5.0/16.0,  1.0/16.0 }, {-3.0/16.0, -5.0/16.0 },
+        {-5.0/16.0,  5.0/16.0 }, {-7.0/16.0, -1.0/16.0 }, { 3.0/16.0,  7.0/16.0 }, { 7.0/16.0, -7.0/16.0 },
+    };
+
+    static const tSamplePos pos16[] = {
+        { 1.0/16.0,  1.0/16.0 }, {-1.0/16.0, -3.0/16.0 }, {-3.0/16.0,  2.0/16.0 }, { 4.0/16.0, -1.0/16.0 },
+        {-5.0/16.0, -2.0/16.0 }, { 2.0/16.0,  5.0/16.0 }, { 5.0/16.0,  3.0/16.0 }, { 3.0/16.0, -5.0/16.0 },
+        {-2.0/16.0,  6.0/16.0 }, { 0.0/16.0, -7.0/16.0 }, {-4.0/16.0, -6.0/16.0 }, {-6.0/16.0,  4.0/16.0 },
+        {-8.0/16.0,  0.0/16.0 }, { 7.0/16.0, -4.0/16.0 }, { 6.0/16.0,  7.0/16.0 }, {-7.0/16.0, -8.0/16.0 },
+    };
+
+    const tSamplePos* sampleLoc = nullptr;
+    int numSamples = count;
+
+    switch (count) {
+    case 2:  sampleLoc = pos2;  break;
+    case 4:  sampleLoc = pos4;  break;
+    case 8:  sampleLoc = pos8;  break;
+    case 16: sampleLoc = pos16; break;
+    default:
+        sampleLoc = pos1;
+        numSamples = 1;
+    }
+
+    TConstUnionArray* values = new TConstUnionArray(numSamples*2);
     
+    for (int pos=0; pos<count; ++pos) {
+        TConstUnion x, y;
+        x.setDConst(sampleLoc[pos].x);
+        y.setDConst(sampleLoc[pos].y);
+
+        (*values)[pos*2+0] = x;
+        (*values)[pos*2+1] = y;
+    }
+
+    TType retType(EbtFloat, EvqConst, 2);
+
+    if (numSamples != 1) {
+        TArraySizes arraySizes;
+        arraySizes.addInnerSize(numSamples);
+        retType.newArraySizes(arraySizes);
+    }
+
+    return new TIntermConstantUnion(*values, retType);
+}
+
 //
 // Decompose DX9 and DX10 sample intrinsics & object methods into AST
 //
@@ -3510,7 +3576,68 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
 
     case EOpMethodGetSamplePosition:
         {
-            error(loc, "unimplemented: GetSamplePosition", "", "");
+            // TODO: this entire decomposition exists because there is not yet a way to query
+            // the sample position directly through SPIR-V.  Instead, we return fixed sample
+            // positions for common cases.  *** If the sample positions are set differently,
+            // this will be wrong. ***
+
+            TIntermTyped* argTex     = argAggregate->getSequence()[0]->getAsTyped();
+            TIntermTyped* argSampIdx = argAggregate->getSequence()[1]->getAsTyped();
+
+            TIntermAggregate* samplesQuery = new TIntermAggregate(EOpImageQuerySamples);
+            samplesQuery->getSequence().push_back(argTex);
+            samplesQuery->setType(TType(EbtUint, EvqTemporary, 1));
+            samplesQuery->setLoc(loc);
+
+            TIntermAggregate* compoundStatement = nullptr;
+
+            TVariable* outSampleCount = makeInternalVariable("@sampleCount", TType(EbtUint));
+            outSampleCount->getWritableType().getQualifier().makeTemporary();
+            TIntermTyped* compAssign = intermediate.addAssign(EOpAssign, intermediate.addSymbol(*outSampleCount, loc),
+                                                              samplesQuery, loc);
+            compoundStatement = intermediate.growAggregate(compoundStatement, compAssign);
+
+            TIntermTyped* idxtest[4];
+
+            // Create tests against 2, 4, 8, and 16 sample values
+            int count = 0;
+            for (int val = 2; val <= 16; val *= 2)
+                idxtest[count++] =
+                    intermediate.addBinaryNode(EOpEqual, 
+                                               intermediate.addSymbol(*outSampleCount, loc),
+                                               intermediate.addConstantUnion(val, loc),
+                                               loc, TType(EbtBool));
+
+            const TOperator idxOp = (argSampIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect;
+            
+            // Create index ops into position arrays given sample index.
+            // TODO: should it be clamped?
+            TIntermTyped* index[4];
+            count = 0;
+            for (int val = 2; val <= 16; val *= 2) {
+                index[count] = intermediate.addIndex(idxOp, getSamplePosArray(val), argSampIdx, loc);
+                index[count++]->setType(TType(EbtFloat, EvqTemporary, 2));
+            }
+
+            // Create expression as:
+            // (sampleCount == 2)  ? pos2[idx] :
+            // (sampleCount == 4)  ? pos4[idx] :
+            // (sampleCount == 8)  ? pos8[idx] :
+            // (sampleCount == 16) ? pos16[idx] : float2(0,0);
+            TIntermTyped* test = 
+                intermediate.addSelection(idxtest[0], index[0], 
+                    intermediate.addSelection(idxtest[1], index[1], 
+                        intermediate.addSelection(idxtest[2], index[2],
+                            intermediate.addSelection(idxtest[3], index[3], 
+                                                      getSamplePosArray(1), loc), loc), loc), loc);
+                                         
+            compoundStatement = intermediate.growAggregate(compoundStatement, test);
+            compoundStatement->setOperator(EOpSequence);
+            compoundStatement->setLoc(loc);
+            compoundStatement->setType(TType(EbtFloat, EvqTemporary, 2));
+
+            node = compoundStatement;
+
             break;
         }
 
index 649d045..cecfcf1 100755 (executable)
@@ -273,6 +273,9 @@ protected:
     // Test method names
     bool isStructBufferMethod(const TString& name) const;
 
+    // Return standard sample position array
+    TIntermConstantUnion* getSamplePosArray(int count);
+
     TType* getStructBufferContentType(const TType& type) const;
     bool isStructBufferType(const TType& type) const { return getStructBufferContentType(type) != nullptr; }
     TIntermTyped* indexStructBufferContent(const TSourceLoc& loc, TIntermTyped* buffer) const;