From 6b43d274e7899a7bbe80831eab96ef0d387dea91 Mon Sep 17 00:00:00 2001 From: steve-lunarg Date: Thu, 6 Oct 2016 20:12:24 -0600 Subject: [PATCH] HLSL: phase 2a: add r-value operator[] for RWTexture/RWBuffer This commit adds r-value support for RW textures and buffers. Supported is: - Function in parameter conversions - conversion of rvalue use to imageLoad --- Test/baseResults/hlsl.rw.bracket.frag.out | 719 ++++++++++++++++++++++ Test/hlsl.rw.bracket.frag | 114 ++++ gtests/Hlsl.FromFile.cpp | 1 + hlsl/hlslParseHelper.cpp | 40 +- hlsl/hlslParseHelper.h | 1 + 5 files changed, 869 insertions(+), 6 deletions(-) create mode 100644 Test/baseResults/hlsl.rw.bracket.frag.out create mode 100644 Test/hlsl.rw.bracket.frag diff --git a/Test/baseResults/hlsl.rw.bracket.frag.out b/Test/baseResults/hlsl.rw.bracket.frag.out new file mode 100644 index 00000000..7c72e98b --- /dev/null +++ b/Test/baseResults/hlsl.rw.bracket.frag.out @@ -0,0 +1,719 @@ +hlsl.rw.bracket.frag +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:38 Function Definition: Fn1(vi4; (temp 4-component vector of int) +0:38 Function Parameters: +0:38 'x' (in 4-component vector of int) +0:? Sequence +0:38 Branch: Return with expression +0:38 'x' (in 4-component vector of int) +0:39 Function Definition: Fn1(vu4; (temp 4-component vector of uint) +0:39 Function Parameters: +0:39 'x' (in 4-component vector of uint) +0:? Sequence +0:39 Branch: Return with expression +0:39 'x' (in 4-component vector of uint) +0:40 Function Definition: Fn1(vf4; (temp 4-component vector of float) +0:40 Function Parameters: +0:40 'x' (in 4-component vector of float) +0:? Sequence +0:40 Branch: Return with expression +0:40 'x' (in 4-component vector of float) +0:42 Function Definition: Fn2(vi4; (temp void) +0:42 Function Parameters: +0:42 'x' (out 4-component vector of int) +0:? Sequence +0:42 move second child to first child (temp 4-component vector of int) +0:42 'x' (out 4-component vector of int) +0:42 Constant: +0:42 0 (const int) +0:42 0 (const int) +0:42 0 (const int) +0:42 0 (const int) +0:43 Function Definition: Fn2(vu4; (temp void) +0:43 Function Parameters: +0:43 'x' (out 4-component vector of uint) +0:? Sequence +0:43 move second child to first child (temp 4-component vector of uint) +0:43 'x' (out 4-component vector of uint) +0:43 Constant: +0:43 0 (const uint) +0:43 0 (const uint) +0:43 0 (const uint) +0:43 0 (const uint) +0:44 Function Definition: Fn2(vf4; (temp void) +0:44 Function Parameters: +0:44 'x' (out 4-component vector of float) +0:? Sequence +0:44 move second child to first child (temp 4-component vector of float) +0:44 'x' (out 4-component vector of float) +0:44 Constant: +0:44 0.000000 +0:44 0.000000 +0:44 0.000000 +0:44 0.000000 +0:47 Function Definition: main( (temp structure{temp 4-component vector of float Color}) +0:47 Function Parameters: +0:? Sequence +0:53 imageLoad (temp 4-component vector of float) +0:53 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:53 c1: direct index for structure (layout(offset=0 ) uniform int) +0:53 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:53 Constant: +0:53 0 (const uint) +0:55 Sequence +0:55 move second child to first child (temp 4-component vector of float) +0:55 'r00' (temp 4-component vector of float) +0:55 imageLoad (temp 4-component vector of float) +0:55 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:55 c1: direct index for structure (layout(offset=0 ) uniform int) +0:55 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:55 Constant: +0:55 0 (const uint) +0:56 Sequence +0:56 move second child to first child (temp 4-component vector of int) +0:56 'r01' (temp 4-component vector of int) +0:56 imageLoad (temp 4-component vector of int) +0:56 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:56 c1: direct index for structure (layout(offset=0 ) uniform int) +0:56 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:56 Constant: +0:56 0 (const uint) +0:57 Sequence +0:57 move second child to first child (temp 4-component vector of uint) +0:57 'r02' (temp 4-component vector of uint) +0:57 imageLoad (temp 4-component vector of uint) +0:57 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:57 c1: direct index for structure (layout(offset=0 ) uniform int) +0:57 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:57 Constant: +0:57 0 (const uint) +0:60 Sequence +0:60 move second child to first child (temp 4-component vector of float) +0:60 'r10' (temp 4-component vector of float) +0:60 imageLoad (temp 4-component vector of float) +0:60 'g_tTex2df4' (layout(rgba32f ) uniform image2D) +0:60 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:60 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:60 Constant: +0:60 1 (const uint) +0:61 Sequence +0:61 move second child to first child (temp 4-component vector of int) +0:61 'r11' (temp 4-component vector of int) +0:61 imageLoad (temp 4-component vector of int) +0:61 'g_tTex2di4' (layout(rgba32i ) uniform iimage2D) +0:61 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:61 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:61 Constant: +0:61 1 (const uint) +0:62 Sequence +0:62 move second child to first child (temp 4-component vector of uint) +0:62 'r12' (temp 4-component vector of uint) +0:62 imageLoad (temp 4-component vector of uint) +0:62 'g_tTex2du4' (layout(rgba32ui ) uniform uimage2D) +0:62 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:62 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:62 Constant: +0:62 1 (const uint) +0:65 Sequence +0:65 move second child to first child (temp 4-component vector of float) +0:65 'r20' (temp 4-component vector of float) +0:65 imageLoad (temp 4-component vector of float) +0:65 'g_tTex3df4' (layout(rgba32f ) uniform image3D) +0:65 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:65 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:65 Constant: +0:65 2 (const uint) +0:66 Sequence +0:66 move second child to first child (temp 4-component vector of int) +0:66 'r21' (temp 4-component vector of int) +0:66 imageLoad (temp 4-component vector of int) +0:66 'g_tTex3di4' (layout(rgba32i ) uniform iimage3D) +0:66 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:66 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:66 Constant: +0:66 2 (const uint) +0:67 Sequence +0:67 move second child to first child (temp 4-component vector of uint) +0:67 'r22' (temp 4-component vector of uint) +0:67 imageLoad (temp 4-component vector of uint) +0:67 'g_tTex3du4' (layout(rgba32ui ) uniform uimage3D) +0:67 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:67 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:67 Constant: +0:67 2 (const uint) +0:86 Function Call: Fn1(vf4; (temp 4-component vector of float) +0:86 imageLoad (temp 4-component vector of float) +0:86 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:86 c1: direct index for structure (layout(offset=0 ) uniform int) +0:86 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:86 Constant: +0:86 0 (const uint) +0:87 Function Call: Fn1(vi4; (temp 4-component vector of int) +0:87 imageLoad (temp 4-component vector of int) +0:87 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:87 c1: direct index for structure (layout(offset=0 ) uniform int) +0:87 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:87 Constant: +0:87 0 (const uint) +0:88 Function Call: Fn1(vu4; (temp 4-component vector of uint) +0:88 imageLoad (temp 4-component vector of uint) +0:88 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:88 c1: direct index for structure (layout(offset=0 ) uniform int) +0:88 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:88 Constant: +0:88 0 (const uint) +0:111 move second child to first child (temp 4-component vector of float) +0:111 Color: direct index for structure (temp 4-component vector of float) +0:111 'psout' (temp structure{temp 4-component vector of float Color}) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1.000000 +0:111 1.000000 +0:111 1.000000 +0:111 1.000000 +0:113 Sequence +0:113 Sequence +0:113 move second child to first child (temp 4-component vector of float) +0:? 'Color' (layout(location=0 ) out 4-component vector of float) +0:113 Color: direct index for structure (temp 4-component vector of float) +0:113 'psout' (temp structure{temp 4-component vector of float Color}) +0:113 Constant: +0:113 0 (const int) +0:113 Branch: Return +0:? Linker Objects +0:? 'g_sSamp' (layout(binding=0 ) uniform sampler) +0:? 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:? 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:? 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:? 'g_tTex2df4' (layout(rgba32f ) uniform image2D) +0:? 'g_tTex2di4' (layout(rgba32i ) uniform iimage2D) +0:? 'g_tTex2du4' (layout(rgba32ui ) uniform uimage2D) +0:? 'g_tTex3df4' (layout(rgba32f ) uniform image3D) +0:? 'g_tTex3di4' (layout(rgba32i ) uniform iimage3D) +0:? 'g_tTex3du4' (layout(rgba32ui ) uniform uimage3D) +0:? 'g_tTex1df4a' (layout(rgba32f ) uniform image1DArray) +0:? 'g_tTex1di4a' (layout(rgba32i ) uniform iimage1DArray) +0:? 'g_tTex1du4a' (layout(rgba32ui ) uniform uimage1DArray) +0:? 'g_tTex2df4a' (layout(rgba32f ) uniform image2DArray) +0:? 'g_tTex2di4a' (layout(rgba32i ) uniform iimage2DArray) +0:? 'g_tTex2du4a' (layout(rgba32ui ) uniform uimage2DArray) +0:? 'anon@0' (uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:? 'Color' (layout(location=0 ) out 4-component vector of float) + + +Linked fragment stage: + + +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:38 Function Definition: Fn1(vi4; (temp 4-component vector of int) +0:38 Function Parameters: +0:38 'x' (in 4-component vector of int) +0:? Sequence +0:38 Branch: Return with expression +0:38 'x' (in 4-component vector of int) +0:39 Function Definition: Fn1(vu4; (temp 4-component vector of uint) +0:39 Function Parameters: +0:39 'x' (in 4-component vector of uint) +0:? Sequence +0:39 Branch: Return with expression +0:39 'x' (in 4-component vector of uint) +0:40 Function Definition: Fn1(vf4; (temp 4-component vector of float) +0:40 Function Parameters: +0:40 'x' (in 4-component vector of float) +0:? Sequence +0:40 Branch: Return with expression +0:40 'x' (in 4-component vector of float) +0:42 Function Definition: Fn2(vi4; (temp void) +0:42 Function Parameters: +0:42 'x' (out 4-component vector of int) +0:? Sequence +0:42 move second child to first child (temp 4-component vector of int) +0:42 'x' (out 4-component vector of int) +0:42 Constant: +0:42 0 (const int) +0:42 0 (const int) +0:42 0 (const int) +0:42 0 (const int) +0:43 Function Definition: Fn2(vu4; (temp void) +0:43 Function Parameters: +0:43 'x' (out 4-component vector of uint) +0:? Sequence +0:43 move second child to first child (temp 4-component vector of uint) +0:43 'x' (out 4-component vector of uint) +0:43 Constant: +0:43 0 (const uint) +0:43 0 (const uint) +0:43 0 (const uint) +0:43 0 (const uint) +0:44 Function Definition: Fn2(vf4; (temp void) +0:44 Function Parameters: +0:44 'x' (out 4-component vector of float) +0:? Sequence +0:44 move second child to first child (temp 4-component vector of float) +0:44 'x' (out 4-component vector of float) +0:44 Constant: +0:44 0.000000 +0:44 0.000000 +0:44 0.000000 +0:44 0.000000 +0:47 Function Definition: main( (temp structure{temp 4-component vector of float Color}) +0:47 Function Parameters: +0:? Sequence +0:53 imageLoad (temp 4-component vector of float) +0:53 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:53 c1: direct index for structure (layout(offset=0 ) uniform int) +0:53 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:53 Constant: +0:53 0 (const uint) +0:55 Sequence +0:55 move second child to first child (temp 4-component vector of float) +0:55 'r00' (temp 4-component vector of float) +0:55 imageLoad (temp 4-component vector of float) +0:55 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:55 c1: direct index for structure (layout(offset=0 ) uniform int) +0:55 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:55 Constant: +0:55 0 (const uint) +0:56 Sequence +0:56 move second child to first child (temp 4-component vector of int) +0:56 'r01' (temp 4-component vector of int) +0:56 imageLoad (temp 4-component vector of int) +0:56 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:56 c1: direct index for structure (layout(offset=0 ) uniform int) +0:56 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:56 Constant: +0:56 0 (const uint) +0:57 Sequence +0:57 move second child to first child (temp 4-component vector of uint) +0:57 'r02' (temp 4-component vector of uint) +0:57 imageLoad (temp 4-component vector of uint) +0:57 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:57 c1: direct index for structure (layout(offset=0 ) uniform int) +0:57 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:57 Constant: +0:57 0 (const uint) +0:60 Sequence +0:60 move second child to first child (temp 4-component vector of float) +0:60 'r10' (temp 4-component vector of float) +0:60 imageLoad (temp 4-component vector of float) +0:60 'g_tTex2df4' (layout(rgba32f ) uniform image2D) +0:60 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:60 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:60 Constant: +0:60 1 (const uint) +0:61 Sequence +0:61 move second child to first child (temp 4-component vector of int) +0:61 'r11' (temp 4-component vector of int) +0:61 imageLoad (temp 4-component vector of int) +0:61 'g_tTex2di4' (layout(rgba32i ) uniform iimage2D) +0:61 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:61 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:61 Constant: +0:61 1 (const uint) +0:62 Sequence +0:62 move second child to first child (temp 4-component vector of uint) +0:62 'r12' (temp 4-component vector of uint) +0:62 imageLoad (temp 4-component vector of uint) +0:62 'g_tTex2du4' (layout(rgba32ui ) uniform uimage2D) +0:62 c2: direct index for structure (layout(offset=8 ) uniform 2-component vector of int) +0:62 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:62 Constant: +0:62 1 (const uint) +0:65 Sequence +0:65 move second child to first child (temp 4-component vector of float) +0:65 'r20' (temp 4-component vector of float) +0:65 imageLoad (temp 4-component vector of float) +0:65 'g_tTex3df4' (layout(rgba32f ) uniform image3D) +0:65 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:65 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:65 Constant: +0:65 2 (const uint) +0:66 Sequence +0:66 move second child to first child (temp 4-component vector of int) +0:66 'r21' (temp 4-component vector of int) +0:66 imageLoad (temp 4-component vector of int) +0:66 'g_tTex3di4' (layout(rgba32i ) uniform iimage3D) +0:66 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:66 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:66 Constant: +0:66 2 (const uint) +0:67 Sequence +0:67 move second child to first child (temp 4-component vector of uint) +0:67 'r22' (temp 4-component vector of uint) +0:67 imageLoad (temp 4-component vector of uint) +0:67 'g_tTex3du4' (layout(rgba32ui ) uniform uimage3D) +0:67 c3: direct index for structure (layout(offset=16 ) uniform 3-component vector of int) +0:67 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:67 Constant: +0:67 2 (const uint) +0:86 Function Call: Fn1(vf4; (temp 4-component vector of float) +0:86 imageLoad (temp 4-component vector of float) +0:86 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:86 c1: direct index for structure (layout(offset=0 ) uniform int) +0:86 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:86 Constant: +0:86 0 (const uint) +0:87 Function Call: Fn1(vi4; (temp 4-component vector of int) +0:87 imageLoad (temp 4-component vector of int) +0:87 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:87 c1: direct index for structure (layout(offset=0 ) uniform int) +0:87 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:87 Constant: +0:87 0 (const uint) +0:88 Function Call: Fn1(vu4; (temp 4-component vector of uint) +0:88 imageLoad (temp 4-component vector of uint) +0:88 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:88 c1: direct index for structure (layout(offset=0 ) uniform int) +0:88 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:88 Constant: +0:88 0 (const uint) +0:111 move second child to first child (temp 4-component vector of float) +0:111 Color: direct index for structure (temp 4-component vector of float) +0:111 'psout' (temp structure{temp 4-component vector of float Color}) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1.000000 +0:111 1.000000 +0:111 1.000000 +0:111 1.000000 +0:113 Sequence +0:113 Sequence +0:113 move second child to first child (temp 4-component vector of float) +0:? 'Color' (layout(location=0 ) out 4-component vector of float) +0:113 Color: direct index for structure (temp 4-component vector of float) +0:113 'psout' (temp structure{temp 4-component vector of float Color}) +0:113 Constant: +0:113 0 (const int) +0:113 Branch: Return +0:? Linker Objects +0:? 'g_sSamp' (layout(binding=0 ) uniform sampler) +0:? 'g_tTex1df4' (layout(binding=0 rgba32f ) uniform image1D) +0:? 'g_tTex1di4' (layout(rgba32i ) uniform iimage1D) +0:? 'g_tTex1du4' (layout(rgba32ui ) uniform uimage1D) +0:? 'g_tTex2df4' (layout(rgba32f ) uniform image2D) +0:? 'g_tTex2di4' (layout(rgba32i ) uniform iimage2D) +0:? 'g_tTex2du4' (layout(rgba32ui ) uniform uimage2D) +0:? 'g_tTex3df4' (layout(rgba32f ) uniform image3D) +0:? 'g_tTex3di4' (layout(rgba32i ) uniform iimage3D) +0:? 'g_tTex3du4' (layout(rgba32ui ) uniform uimage3D) +0:? 'g_tTex1df4a' (layout(rgba32f ) uniform image1DArray) +0:? 'g_tTex1di4a' (layout(rgba32i ) uniform iimage1DArray) +0:? 'g_tTex1du4a' (layout(rgba32ui ) uniform uimage1DArray) +0:? 'g_tTex2df4a' (layout(rgba32f ) uniform image2DArray) +0:? 'g_tTex2di4a' (layout(rgba32i ) uniform iimage2DArray) +0:? 'g_tTex2du4a' (layout(rgba32ui ) uniform uimage2DArray) +0:? 'anon@0' (uniform block{layout(offset=0 ) uniform int c1, layout(offset=8 ) uniform 2-component vector of int c2, layout(offset=16 ) uniform 3-component vector of int c3, layout(offset=32 ) uniform 4-component vector of int c4, layout(offset=48 ) uniform int o1, layout(offset=56 ) uniform 2-component vector of int o2, layout(offset=64 ) uniform 3-component vector of int o3, layout(offset=80 ) uniform 4-component vector of int o4}) +0:? 'Color' (layout(location=0 ) out 4-component vector of float) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 190 + + Capability Shader + Capability Sampled1D + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 165 + ExecutionMode 4 OriginUpperLeft + Name 4 "main" + Name 11 "Fn1(vi4;" + Name 10 "x" + Name 18 "Fn1(vu4;" + Name 17 "x" + Name 25 "Fn1(vf4;" + Name 24 "x" + Name 29 "Fn2(vi4;" + Name 28 "x" + Name 33 "Fn2(vu4;" + Name 32 "x" + Name 37 "Fn2(vf4;" + Name 36 "x" + Name 56 "g_tTex1df4" + Name 60 "$Global" + MemberName 60($Global) 0 "c1" + MemberName 60($Global) 1 "c2" + MemberName 60($Global) 2 "c3" + MemberName 60($Global) 3 "c4" + MemberName 60($Global) 4 "o1" + MemberName 60($Global) 5 "o2" + MemberName 60($Global) 6 "o3" + MemberName 60($Global) 7 "o4" + Name 62 "" + Name 67 "r00" + Name 72 "r01" + Name 75 "g_tTex1di4" + Name 80 "r02" + Name 83 "g_tTex1du4" + Name 88 "r10" + Name 91 "g_tTex2df4" + Name 98 "r11" + Name 101 "g_tTex2di4" + Name 106 "r12" + Name 109 "g_tTex2du4" + Name 114 "r20" + Name 117 "g_tTex3df4" + Name 124 "r21" + Name 127 "g_tTex3di4" + Name 132 "r22" + Name 135 "g_tTex3du4" + Name 144 "param" + Name 150 "param" + Name 156 "param" + Name 158 "PS_OUTPUT" + MemberName 158(PS_OUTPUT) 0 "Color" + Name 160 "psout" + Name 165 "Color" + Name 171 "g_sSamp" + Name 174 "g_tTex1df4a" + Name 177 "g_tTex1di4a" + Name 180 "g_tTex1du4a" + Name 183 "g_tTex2df4a" + Name 186 "g_tTex2di4a" + Name 189 "g_tTex2du4a" + Decorate 56(g_tTex1df4) DescriptorSet 0 + Decorate 56(g_tTex1df4) Binding 0 + MemberDecorate 60($Global) 0 Offset 0 + MemberDecorate 60($Global) 1 Offset 8 + MemberDecorate 60($Global) 2 Offset 16 + MemberDecorate 60($Global) 3 Offset 32 + MemberDecorate 60($Global) 4 Offset 48 + MemberDecorate 60($Global) 5 Offset 56 + MemberDecorate 60($Global) 6 Offset 64 + MemberDecorate 60($Global) 7 Offset 80 + Decorate 60($Global) Block + Decorate 62 DescriptorSet 0 + Decorate 75(g_tTex1di4) DescriptorSet 0 + Decorate 83(g_tTex1du4) DescriptorSet 0 + Decorate 91(g_tTex2df4) DescriptorSet 0 + Decorate 101(g_tTex2di4) DescriptorSet 0 + Decorate 109(g_tTex2du4) DescriptorSet 0 + Decorate 117(g_tTex3df4) DescriptorSet 0 + Decorate 127(g_tTex3di4) DescriptorSet 0 + Decorate 135(g_tTex3du4) DescriptorSet 0 + Decorate 165(Color) Location 0 + Decorate 171(g_sSamp) DescriptorSet 0 + Decorate 171(g_sSamp) Binding 0 + Decorate 174(g_tTex1df4a) DescriptorSet 0 + Decorate 177(g_tTex1di4a) DescriptorSet 0 + Decorate 180(g_tTex1du4a) DescriptorSet 0 + Decorate 183(g_tTex2df4a) DescriptorSet 0 + Decorate 186(g_tTex2di4a) DescriptorSet 0 + Decorate 189(g_tTex2du4a) DescriptorSet 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7: TypeVector 6(int) 4 + 8: TypePointer Function 7(ivec4) + 9: TypeFunction 7(ivec4) 8(ptr) + 13: TypeInt 32 0 + 14: TypeVector 13(int) 4 + 15: TypePointer Function 14(ivec4) + 16: TypeFunction 14(ivec4) 15(ptr) + 20: TypeFloat 32 + 21: TypeVector 20(float) 4 + 22: TypePointer Function 21(fvec4) + 23: TypeFunction 21(fvec4) 22(ptr) + 27: TypeFunction 2 8(ptr) + 31: TypeFunction 2 15(ptr) + 35: TypeFunction 2 22(ptr) + 48: 6(int) Constant 0 + 49: 7(ivec4) ConstantComposite 48 48 48 48 + 50: 13(int) Constant 0 + 51: 14(ivec4) ConstantComposite 50 50 50 50 + 52: 20(float) Constant 0 + 53: 21(fvec4) ConstantComposite 52 52 52 52 + 54: TypeImage 20(float) 1D nonsampled format:Rgba32f + 55: TypePointer UniformConstant 54 + 56(g_tTex1df4): 55(ptr) Variable UniformConstant + 58: TypeVector 6(int) 2 + 59: TypeVector 6(int) 3 + 60($Global): TypeStruct 6(int) 58(ivec2) 59(ivec3) 7(ivec4) 6(int) 58(ivec2) 59(ivec3) 7(ivec4) + 61: TypePointer Uniform 60($Global) + 62: 61(ptr) Variable Uniform + 63: TypePointer Uniform 6(int) + 73: TypeImage 6(int) 1D nonsampled format:Rgba32i + 74: TypePointer UniformConstant 73 + 75(g_tTex1di4): 74(ptr) Variable UniformConstant + 81: TypeImage 13(int) 1D nonsampled format:Rgba32ui + 82: TypePointer UniformConstant 81 + 83(g_tTex1du4): 82(ptr) Variable UniformConstant + 89: TypeImage 20(float) 2D nonsampled format:Rgba32f + 90: TypePointer UniformConstant 89 + 91(g_tTex2df4): 90(ptr) Variable UniformConstant + 93: 6(int) Constant 1 + 94: TypePointer Uniform 58(ivec2) + 99: TypeImage 6(int) 2D nonsampled format:Rgba32i + 100: TypePointer UniformConstant 99 + 101(g_tTex2di4): 100(ptr) Variable UniformConstant + 107: TypeImage 13(int) 2D nonsampled format:Rgba32ui + 108: TypePointer UniformConstant 107 + 109(g_tTex2du4): 108(ptr) Variable UniformConstant + 115: TypeImage 20(float) 3D nonsampled format:Rgba32f + 116: TypePointer UniformConstant 115 + 117(g_tTex3df4): 116(ptr) Variable UniformConstant + 119: 6(int) Constant 2 + 120: TypePointer Uniform 59(ivec3) + 125: TypeImage 6(int) 3D nonsampled format:Rgba32i + 126: TypePointer UniformConstant 125 + 127(g_tTex3di4): 126(ptr) Variable UniformConstant + 133: TypeImage 13(int) 3D nonsampled format:Rgba32ui + 134: TypePointer UniformConstant 133 + 135(g_tTex3du4): 134(ptr) Variable UniformConstant + 158(PS_OUTPUT): TypeStruct 21(fvec4) + 159: TypePointer Function 158(PS_OUTPUT) + 161: 20(float) Constant 1065353216 + 162: 21(fvec4) ConstantComposite 161 161 161 161 + 164: TypePointer Output 21(fvec4) + 165(Color): 164(ptr) Variable Output + 169: TypeSampler + 170: TypePointer UniformConstant 169 + 171(g_sSamp): 170(ptr) Variable UniformConstant + 172: TypeImage 20(float) 1D array nonsampled format:Rgba32f + 173: TypePointer UniformConstant 172 +174(g_tTex1df4a): 173(ptr) Variable UniformConstant + 175: TypeImage 6(int) 1D array nonsampled format:Rgba32i + 176: TypePointer UniformConstant 175 +177(g_tTex1di4a): 176(ptr) Variable UniformConstant + 178: TypeImage 13(int) 1D array nonsampled format:Rgba32ui + 179: TypePointer UniformConstant 178 +180(g_tTex1du4a): 179(ptr) Variable UniformConstant + 181: TypeImage 20(float) 2D array nonsampled format:Rgba32f + 182: TypePointer UniformConstant 181 +183(g_tTex2df4a): 182(ptr) Variable UniformConstant + 184: TypeImage 6(int) 2D array nonsampled format:Rgba32i + 185: TypePointer UniformConstant 184 +186(g_tTex2di4a): 185(ptr) Variable UniformConstant + 187: TypeImage 13(int) 2D array nonsampled format:Rgba32ui + 188: TypePointer UniformConstant 187 +189(g_tTex2du4a): 188(ptr) Variable UniformConstant + 4(main): 2 Function None 3 + 5: Label + 67(r00): 22(ptr) Variable Function + 72(r01): 8(ptr) Variable Function + 80(r02): 15(ptr) Variable Function + 88(r10): 22(ptr) Variable Function + 98(r11): 8(ptr) Variable Function + 106(r12): 15(ptr) Variable Function + 114(r20): 22(ptr) Variable Function + 124(r21): 8(ptr) Variable Function + 132(r22): 15(ptr) Variable Function + 144(param): 22(ptr) Variable Function + 150(param): 8(ptr) Variable Function + 156(param): 15(ptr) Variable Function + 160(psout): 159(ptr) Variable Function + 57: 54 Load 56(g_tTex1df4) + 64: 63(ptr) AccessChain 62 48 + 65: 6(int) Load 64 + 66: 21(fvec4) ImageRead 57 65 + 68: 54 Load 56(g_tTex1df4) + 69: 63(ptr) AccessChain 62 48 + 70: 6(int) Load 69 + 71: 21(fvec4) ImageRead 68 70 + Store 67(r00) 71 + 76: 73 Load 75(g_tTex1di4) + 77: 63(ptr) AccessChain 62 48 + 78: 6(int) Load 77 + 79: 7(ivec4) ImageRead 76 78 + Store 72(r01) 79 + 84: 81 Load 83(g_tTex1du4) + 85: 63(ptr) AccessChain 62 48 + 86: 6(int) Load 85 + 87: 14(ivec4) ImageRead 84 86 + Store 80(r02) 87 + 92: 89 Load 91(g_tTex2df4) + 95: 94(ptr) AccessChain 62 93 + 96: 58(ivec2) Load 95 + 97: 21(fvec4) ImageRead 92 96 + Store 88(r10) 97 + 102: 99 Load 101(g_tTex2di4) + 103: 94(ptr) AccessChain 62 93 + 104: 58(ivec2) Load 103 + 105: 7(ivec4) ImageRead 102 104 + Store 98(r11) 105 + 110: 107 Load 109(g_tTex2du4) + 111: 94(ptr) AccessChain 62 93 + 112: 58(ivec2) Load 111 + 113: 14(ivec4) ImageRead 110 112 + Store 106(r12) 113 + 118: 115 Load 117(g_tTex3df4) + 121: 120(ptr) AccessChain 62 119 + 122: 59(ivec3) Load 121 + 123: 21(fvec4) ImageRead 118 122 + Store 114(r20) 123 + 128: 125 Load 127(g_tTex3di4) + 129: 120(ptr) AccessChain 62 119 + 130: 59(ivec3) Load 129 + 131: 7(ivec4) ImageRead 128 130 + Store 124(r21) 131 + 136: 133 Load 135(g_tTex3du4) + 137: 120(ptr) AccessChain 62 119 + 138: 59(ivec3) Load 137 + 139: 14(ivec4) ImageRead 136 138 + Store 132(r22) 139 + 140: 54 Load 56(g_tTex1df4) + 141: 63(ptr) AccessChain 62 48 + 142: 6(int) Load 141 + 143: 21(fvec4) ImageRead 140 142 + Store 144(param) 143 + 145: 21(fvec4) FunctionCall 25(Fn1(vf4;) 144(param) + 146: 73 Load 75(g_tTex1di4) + 147: 63(ptr) AccessChain 62 48 + 148: 6(int) Load 147 + 149: 7(ivec4) ImageRead 146 148 + Store 150(param) 149 + 151: 7(ivec4) FunctionCall 11(Fn1(vi4;) 150(param) + 152: 81 Load 83(g_tTex1du4) + 153: 63(ptr) AccessChain 62 48 + 154: 6(int) Load 153 + 155: 14(ivec4) ImageRead 152 154 + Store 156(param) 155 + 157: 14(ivec4) FunctionCall 18(Fn1(vu4;) 156(param) + 163: 22(ptr) AccessChain 160(psout) 48 + Store 163 162 + 166: 22(ptr) AccessChain 160(psout) 48 + 167: 21(fvec4) Load 166 + Store 165(Color) 167 + Return + FunctionEnd + 11(Fn1(vi4;): 7(ivec4) Function None 9 + 10(x): 8(ptr) FunctionParameter + 12: Label + 39: 7(ivec4) Load 10(x) + ReturnValue 39 + FunctionEnd + 18(Fn1(vu4;): 14(ivec4) Function None 16 + 17(x): 15(ptr) FunctionParameter + 19: Label + 42: 14(ivec4) Load 17(x) + ReturnValue 42 + FunctionEnd + 25(Fn1(vf4;): 21(fvec4) Function None 23 + 24(x): 22(ptr) FunctionParameter + 26: Label + 45: 21(fvec4) Load 24(x) + ReturnValue 45 + FunctionEnd + 29(Fn2(vi4;): 2 Function None 27 + 28(x): 8(ptr) FunctionParameter + 30: Label + Store 28(x) 49 + Return + FunctionEnd + 33(Fn2(vu4;): 2 Function None 31 + 32(x): 15(ptr) FunctionParameter + 34: Label + Store 32(x) 51 + Return + FunctionEnd + 37(Fn2(vf4;): 2 Function None 35 + 36(x): 22(ptr) FunctionParameter + 38: Label + Store 36(x) 53 + Return + FunctionEnd diff --git a/Test/hlsl.rw.bracket.frag b/Test/hlsl.rw.bracket.frag new file mode 100644 index 00000000..e435b91d --- /dev/null +++ b/Test/hlsl.rw.bracket.frag @@ -0,0 +1,114 @@ +SamplerState g_sSamp : register(s0); + +RWTexture1D g_tTex1df4 : register(t0); +RWTexture1D g_tTex1di4; +RWTexture1D g_tTex1du4; + +RWTexture2D g_tTex2df4; +RWTexture2D g_tTex2di4; +RWTexture2D g_tTex2du4; + +RWTexture3D g_tTex3df4; +RWTexture3D g_tTex3di4; +RWTexture3D g_tTex3du4; + +RWTexture1DArray g_tTex1df4a; +RWTexture1DArray g_tTex1di4a; +RWTexture1DArray g_tTex1du4a; + +RWTexture2DArray g_tTex2df4a; +RWTexture2DArray g_tTex2di4a; +RWTexture2DArray g_tTex2du4a; + +struct PS_OUTPUT +{ + float4 Color : SV_Target0; +}; + +uniform int c1; +uniform int2 c2; +uniform int3 c3; +uniform int4 c4; + +uniform int o1; +uniform int2 o2; +uniform int3 o3; +uniform int4 o4; + +int4 Fn1(in int4 x) { return x; } +uint4 Fn1(in uint4 x) { return x; } +float4 Fn1(in float4 x) { return x; } + +void Fn2(out int4 x) { x = int4(0); } +void Fn2(out uint4 x) { x = uint4(0); } +void Fn2(out float4 x) { x = float4(0); } + +PS_OUTPUT main() +{ + PS_OUTPUT psout; + + // Test as R-values + + // 1D + g_tTex1df4[c1]; + + float4 r00 = g_tTex1df4[c1]; + int4 r01 = g_tTex1di4[c1]; + uint4 r02 = g_tTex1du4[c1]; + + // 2D + float4 r10 = g_tTex2df4[c2]; + int4 r11 = g_tTex2di4[c2]; + uint4 r12 = g_tTex2du4[c2]; + + // 3D + float4 r20 = g_tTex3df4[c3]; + int4 r21 = g_tTex3di4[c3]; + uint4 r22 = g_tTex3du4[c3]; + + // // Test as L-values + // // 1D + // g_tTex1df4[c1] = float4(1,2,3,4); + // g_tTex1di4[c1] = int4(1,2,3,4); + // g_tTex1du4[c1] = uint4(1,2,3,4); + + // // 2D + // g_tTex2df4[c2] = float4(1,2,3,4); + // g_tTex2di4[c2] = int4(1,2,3,4); + // g_tTex2du4[c2] = uint4(1,2,3,4); + + // // 3D + // g_tTex3df4[c3] = float4(1,2,3,4); + // g_tTex3di4[c3] = int4(1,2,3,4); + // g_tTex3du4[c3] = uint4(1,2,3,4); + + // // Test function calling + Fn1(g_tTex1df4[c1]); // in + Fn1(g_tTex1di4[c1]); // in + Fn1(g_tTex1du4[c1]); // in + + // Fn2(g_tTex1df4[c1]); // out + // Fn2(g_tTex1di4[c1]); // out + // Fn2(g_tTex1du4[c1]); // out + + // // Test increment operators + // g_tTex1df4[c1]++; + // g_tTex1di4[c1]++; + // g_tTex1du4[c1]++; + + // g_tTex1df4[c1]--; + // g_tTex1di4[c1]--; + // g_tTex1du4[c1]--; + + // ++g_tTex1df4[c1]; + // ++g_tTex1di4[c1]; + // ++g_tTex1du4[c1]; + + // --g_tTex1df4[c1]; + // --g_tTex1di4[c1]; + // --g_tTex1du4[c1]; + + psout.Color = 1.0; + + return psout; +} diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 7b642171..9a160cf4 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -147,6 +147,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.pp.line.frag", "main"}, {"hlsl.precise.frag", "main"}, {"hlsl.promotions.frag", "main"}, + {"hlsl.rw.bracket.frag", "main"}, {"hlsl.sample.array.dx10.frag", "main"}, {"hlsl.sample.basic.dx10.frag", "main"}, {"hlsl.sample.offset.dx10.frag", "main"}, diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 4eda44d7..204e9f08 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -297,12 +297,40 @@ TIntermTyped* HlslParseContext::handleVariable(const TSourceLoc& loc, TSymbol* s return node; } +// +// Handle operator[] on any objects it applies to. Currently: +// Textures +// Buffers +// +TIntermTyped* HlslParseContext::handleBracketOperator(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index) +{ + // handle r-value operator[] on textures and images. l-values will be processed later. + if (base->getType().getBasicType() == EbtSampler && !base->isArray()) { + const TSampler& sampler = base->getType().getSampler(); + if (sampler.isImage() || sampler.isTexture()) { + const int vecSize = 4; // TODO: handle arbitrary sizes (get from qualifier) + TIntermAggregate* load = new TIntermAggregate(EOpImageLoad); + + load->setType(TType(sampler.type, EvqTemporary, vecSize)); + load->setLoc(loc); + load->getSequence().push_back(base); + load->getSequence().push_back(index); + return load; + } + } + + return nullptr; +} + // // Handle seeing a base[index] dereference in the grammar. // TIntermTyped* HlslParseContext::handleBracketDereference(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index) { - TIntermTyped* result = nullptr; + TIntermTyped* result = handleBracketOperator(loc, base, index); + + if (result != nullptr) + return result; // it was handled as an operator[] bool flattened = false; int indexValue = 0; @@ -425,10 +453,10 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt field == "SampleLevel") { // If it's not a method on a sampler object, we fall through in case it is a struct member. if (base->getType().getBasicType() == EbtSampler) { - const TSampler& texType = base->getType().getSampler(); - if (! texType.isPureSampler()) { - const int vecSize = texType.isShadow() ? 1 : 4; - return intermediate.addMethod(base, TType(texType.type, EvqTemporary, vecSize), &field, loc); + const TSampler& sampler = base->getType().getSampler(); + if (! sampler.isPureSampler()) { + const int vecSize = sampler.isShadow() ? 1 : 4; // TODO: handle arbitrary sample return sizes + return intermediate.addMethod(base, TType(sampler.type, EvqTemporary, vecSize), &field, loc); } } } @@ -1261,7 +1289,7 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType case Esd2D: numDims = 2; break; // W, H case Esd3D: numDims = 3; break; // W, H, D case EsdCube: numDims = 2; break; // W, H (cube) - case EsdBuffer: numDims = 1; break; // buffers + case EsdBuffer: numDims = 1; break; // W (buffers) default: assert(0 && "unhandled texture dimension"); } diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index c8ebdbe8..78beadb3 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -61,6 +61,7 @@ public: void handlePragma(const TSourceLoc&, const TVector&); TIntermTyped* handleVariable(const TSourceLoc&, TSymbol* symbol, const TString* string); TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); + TIntermTyped* handleBracketOperator(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); void checkIndex(const TSourceLoc&, const TType&, int& index); TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);