From 7b1dcd6693c009066114246475fa99a1ae21044e Mon Sep 17 00:00:00 2001 From: steve-lunarg Date: Thu, 20 Apr 2017 13:16:23 -0600 Subject: [PATCH] HLSL: add readonly qualifier to tbuffer, so they end up as SRV --- Test/baseResults/hlsl.automap.frag.out | 2 ++ Test/baseResults/hlsl.buffer.frag.out | 29 ++++++++++----- Test/baseResults/hlsl.layout.frag.out | 27 +++++++------- Test/hlsl.automap.frag | 12 +++---- glslang/MachineIndependent/ShaderLang.cpp | 9 +++++ glslang/MachineIndependent/iomapper.cpp | 43 ++++++++++++++++++++++- hlsl/hlslGrammar.cpp | 8 +++-- 7 files changed, 101 insertions(+), 29 deletions(-) diff --git a/Test/baseResults/hlsl.automap.frag.out b/Test/baseResults/hlsl.automap.frag.out index ca7d285be..7664bf649 100644 --- a/Test/baseResults/hlsl.automap.frag.out +++ b/Test/baseResults/hlsl.automap.frag.out @@ -15,6 +15,7 @@ u4: offset -1, type 9051, size 1, index -1, binding 44 u5.@data: offset 0, type 1405, size 0, index 2, binding -1 u6.@data: offset 0, type 1406, size 1, index 3, binding -1 cb1: offset 0, type 1404, size 1, index 4, binding -1 +tb1: offset 0, type 1404, size 1, index 5, binding -1 Uniform block reflection: t4: offset -1, type ffffffff, size 0, index -1, binding 14 @@ -22,6 +23,7 @@ t5: offset -1, type ffffffff, size 0, index -1, binding 15 u5: offset -1, type ffffffff, size 0, index -1, binding 45 u6: offset -1, type ffffffff, size 0, index -1, binding 46 cb: offset -1, type ffffffff, size 4, index -1, binding 51 +tb: offset -1, type ffffffff, size 4, index -1, binding 17 Vertex attribute reflection: diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out index 623480c55..faa2ad63a 100755 --- a/Test/baseResults/hlsl.buffer.frag.out +++ b/Test/baseResults/hlsl.buffer.frag.out @@ -17,7 +17,7 @@ gl_FragCoord origin is upper left 0:31 Constant: 0:31 0 (const uint) 0:31 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -0:31 'anon@1' (layout( row_major std430) buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:31 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:31 Constant: 0:31 0 (const uint) 0:31 v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float) @@ -25,7 +25,7 @@ gl_FragCoord origin is upper left 0:31 Constant: 0:31 0 (const uint) 0:31 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:31 'anon@3' (layout( binding=8 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) 0:31 Constant: 0:31 0 (const uint) 0:30 Function Definition: PixelShaderFunction( ( temp void) @@ -40,9 +40,9 @@ gl_FragCoord origin is upper left 0:? 'input' ( temp 4-component vector of float) 0:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:? 'anon@1' (layout( row_major std430) buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:? 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:? 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) -0:? 'anon@3' (layout( binding=8 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'input' (layout( location=0) in 4-component vector of float) @@ -68,7 +68,7 @@ gl_FragCoord origin is upper left 0:31 Constant: 0:31 0 (const uint) 0:31 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -0:31 'anon@1' (layout( row_major std430) buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:31 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:31 Constant: 0:31 0 (const uint) 0:31 v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float) @@ -76,7 +76,7 @@ gl_FragCoord origin is upper left 0:31 Constant: 0:31 0 (const uint) 0:31 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:31 'anon@3' (layout( binding=8 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) 0:31 Constant: 0:31 0 (const uint) 0:30 Function Definition: PixelShaderFunction( ( temp void) @@ -91,9 +91,9 @@ gl_FragCoord origin is upper left 0:? 'input' ( temp 4-component vector of float) 0:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:? 'anon@1' (layout( row_major std430) buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:? 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:? 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) -0:? 'anon@3' (layout( binding=8 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'input' (layout( location=0) in 4-component vector of float) @@ -141,6 +141,7 @@ gl_FragCoord origin is upper left MemberDecorate 14 0 Offset 0 Decorate 14 Block Decorate 16 DescriptorSet 0 + MemberDecorate 23 0 NonWritable MemberDecorate 23 0 Offset 0 Decorate 23 BufferBlock Decorate 25 DescriptorSet 0 @@ -149,24 +150,36 @@ gl_FragCoord origin is upper left Decorate 29(cbufName) Block Decorate 31 DescriptorSet 10 Decorate 31 Binding 2 + MemberDecorate 36(tbufName) 0 NonWritable MemberDecorate 36(tbufName) 0 Offset 16 + MemberDecorate 36(tbufName) 1 NonWritable MemberDecorate 36(tbufName) 1 Offset 48 + MemberDecorate 36(tbufName) 2 NonWritable MemberDecorate 36(tbufName) 2 Offset 60 + MemberDecorate 36(tbufName) 3 NonWritable MemberDecorate 36(tbufName) 3 Offset 64 + MemberDecorate 36(tbufName) 4 NonWritable MemberDecorate 36(tbufName) 4 Offset 68 + MemberDecorate 36(tbufName) 5 NonWritable MemberDecorate 36(tbufName) 5 Offset 72 + MemberDecorate 36(tbufName) 6 NonWritable MemberDecorate 36(tbufName) 6 Offset 76 + MemberDecorate 36(tbufName) 7 NonWritable MemberDecorate 36(tbufName) 7 Offset 80 MemberDecorate 36(tbufName) 8 RowMajor + MemberDecorate 36(tbufName) 8 NonWritable MemberDecorate 36(tbufName) 8 Offset 96 MemberDecorate 36(tbufName) 8 MatrixStride 16 MemberDecorate 36(tbufName) 9 ColMajor + MemberDecorate 36(tbufName) 9 NonWritable MemberDecorate 36(tbufName) 9 Offset 160 MemberDecorate 36(tbufName) 9 MatrixStride 16 MemberDecorate 36(tbufName) 10 RowMajor + MemberDecorate 36(tbufName) 10 NonWritable MemberDecorate 36(tbufName) 10 Offset 208 MemberDecorate 36(tbufName) 10 MatrixStride 16 MemberDecorate 36(tbufName) 11 RowMajor + MemberDecorate 36(tbufName) 11 NonWritable MemberDecorate 36(tbufName) 11 Offset 272 MemberDecorate 36(tbufName) 11 MatrixStride 16 Decorate 36(tbufName) BufferBlock diff --git a/Test/baseResults/hlsl.layout.frag.out b/Test/baseResults/hlsl.layout.frag.out index b8a96cfa6..bfbfaafa0 100755 --- a/Test/baseResults/hlsl.layout.frag.out +++ b/Test/baseResults/hlsl.layout.frag.out @@ -12,23 +12,23 @@ gl_FragCoord origin is upper left 0:17 add ( temp 4-component vector of float) 0:17 'input' ( in 4-component vector of float) 0:17 v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:17 'anon@0' (layout( set=3 binding=5 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) +0:17 'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) 0:17 Constant: 0:17 0 (const uint) 0:17 v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float) -0:17 'anon@1' (layout( row_major std430 push_constant) buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) +0:17 'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) 0:17 Constant: 0:17 0 (const uint) 0:17 v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:17 'anon@2' (layout( set=4 binding=7 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) +0:17 'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) 0:17 Constant: 0:17 0 (const uint) 0:? Linker Objects -0:? 'anon@0' (layout( set=3 binding=5 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) -0:? 'anon@1' (layout( row_major std430 push_constant) buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) +0:? 'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) +0:? 'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) 0:? 'specConst' ( specialization-constant const int) 0:? 10 (const int) -0:? 'anon@2' (layout( set=4 binding=7 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) +0:? 'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) Linked fragment stage: @@ -48,23 +48,23 @@ gl_FragCoord origin is upper left 0:17 add ( temp 4-component vector of float) 0:17 'input' ( in 4-component vector of float) 0:17 v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:17 'anon@0' (layout( set=3 binding=5 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) +0:17 'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) 0:17 Constant: 0:17 0 (const uint) 0:17 v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float) -0:17 'anon@1' (layout( row_major std430 push_constant) buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) +0:17 'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) 0:17 Constant: 0:17 0 (const uint) 0:17 v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:17 'anon@2' (layout( set=4 binding=7 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) +0:17 'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) 0:17 Constant: 0:17 0 (const uint) 0:? Linker Objects -0:? 'anon@0' (layout( set=3 binding=5 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) -0:? 'anon@1' (layout( row_major std430 push_constant) buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) +0:? 'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1}) +0:? 'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5}) 0:? 'specConst' ( specialization-constant const int) 0:? 10 (const int) -0:? 'anon@2' (layout( set=4 binding=7 row_major std430) buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) +0:? 'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) // Module Version 10000 // Generated by (magic number): 80001 @@ -89,12 +89,15 @@ gl_FragCoord origin is upper left MemberName 30(tbufName2) 0 "v1PostLayout" Name 32 "" Name 38 "specConst" + MemberDecorate 14(tbufName) 0 NonWritable MemberDecorate 14(tbufName) 0 Offset 16 Decorate 14(tbufName) BufferBlock Decorate 16 DescriptorSet 3 Decorate 16 Binding 5 + MemberDecorate 23(tbufName2) 0 NonWritable MemberDecorate 23(tbufName2) 0 Offset 0 Decorate 23(tbufName2) BufferBlock + MemberDecorate 30(tbufName2) 0 NonWritable MemberDecorate 30(tbufName2) 0 Offset 16 Decorate 30(tbufName2) BufferBlock Decorate 32 DescriptorSet 4 diff --git a/Test/hlsl.automap.frag b/Test/hlsl.automap.frag index fbb454518..da1e885fc 100644 --- a/Test/hlsl.automap.frag +++ b/Test/hlsl.automap.frag @@ -24,9 +24,9 @@ cbuffer cb : register(b1) { int cb1; }; -// tbuffer tb : register(t7) { -// int tb1; -// }; +tbuffer tb : register(t7) { + int tb1; +}; float4 main() : SV_Target0 { @@ -47,11 +47,11 @@ float4 main() : SV_Target0 u4[0]; u5.Load(0); u6[0]; - u7[0]; - u8[0]; + u7; + u8; cb1; - // tb1; TODO: wrong type? + tb1; return 0; } diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 992038338..c3a1164d2 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -1555,14 +1555,23 @@ void TShader::setSourceEntryPoint(const char* name) sourceEntryPointName = name; } +// Set binding base for sampler types void TShader::setShiftSamplerBinding(unsigned int base) { intermediate->setShiftSamplerBinding(base); } +// Set binding base for texture types (SRV) void TShader::setShiftTextureBinding(unsigned int base) { intermediate->setShiftTextureBinding(base); } +// Set binding base for image types void TShader::setShiftImageBinding(unsigned int base) { intermediate->setShiftImageBinding(base); } +// Set binding base for uniform buffer objects (CBV) void TShader::setShiftUboBinding(unsigned int base) { intermediate->setShiftUboBinding(base); } +// Synonym for setShiftUboBinding, to match HLSL language. void TShader::setShiftCbufferBinding(unsigned int base) { intermediate->setShiftUboBinding(base); } +// Set binding base for UAV (unordered access view) void TShader::setShiftUavBinding(unsigned int base) { intermediate->setShiftUavBinding(base); } +// Set binding base for SSBOs void TShader::setShiftSsboBinding(unsigned int base) { intermediate->setShiftSsboBinding(base); } +// Enables binding automapping using TIoMapper void TShader::setAutoMapBindings(bool map) { intermediate->setAutoMapBindings(map); } +// See comment above TDefaultHlslIoMapper in iomapper.cpp: void TShader::setHlslIoMapping(bool hlslIoMap) { intermediate->setHlslIoMapping(hlslIoMap); } void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlattenUniformArrays(flatten); } void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); } diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp index 355cc428e..54972e78d 100644 --- a/glslang/MachineIndependent/iomapper.cpp +++ b/glslang/MachineIndependent/iomapper.cpp @@ -491,6 +491,48 @@ protected: } }; +/******************************************************************************** +The following IO resolver maps types in HLSL register space, as follows: + +t – for shader resource views (SRV) + TEXTURE1D + TEXTURE1DARRAY + TEXTURE2D + TEXTURE2DARRAY + TEXTURE3D + TEXTURECUBE + TEXTURECUBEARRAY + TEXTURE2DMS + TEXTURE2DMSARRAY + STRUCTUREDBUFFER + BYTEADDRESSBUFFER + BUFFER + TBUFFER + +s – for samplers + SAMPLER + SAMPLER1D + SAMPLER2D + SAMPLER3D + SAMPLERCUBE + SAMPLERSTATE + SAMPLERCOMPARISONSTATE + +u – for unordered access views (UAV) + RWBYTEADDRESSBUFFER + RWSTRUCTUREDBUFFER + APPENDSTRUCTUREDBUFFER + CONSUMESTRUCTUREDBUFFER + RWBUFFER + RWTEXTURE1D + RWTEXTURE1DARRAY + RWTEXTURE2D + RWTEXTURE2DARRAY + RWTEXTURE3D + +b – for constant buffer views (CBV) + CBUFFER + ********************************************************************************/ struct TDefaultHlslIoResolver : public TDefaultIoResolverBase { bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override @@ -498,7 +540,6 @@ struct TDefaultHlslIoResolver : public TDefaultIoResolverBase if (type.getQualifier().hasBinding()) { const int set = getLayoutSet(type); - // Use Uav binding if requested: else will pass through to old behavior if (isUavType(type)) return checkEmpty(set, baseUavBinding + type.getQualifier().layoutBinding); diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 3a1627b98..63b78bf3a 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -1846,13 +1846,16 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList) // This storage qualifier will tell us whether it's an AST // block type or just a generic structure type. TStorageQualifier storageQualifier = EvqTemporary; + bool readonly = false; // CBUFFER - if (acceptTokenClass(EHTokCBuffer)) + if (acceptTokenClass(EHTokCBuffer)) { storageQualifier = EvqUniform; // TBUFFER - else if (acceptTokenClass(EHTokTBuffer)) + } else if (acceptTokenClass(EHTokTBuffer)) { storageQualifier = EvqBuffer; + readonly = true; + } // CLASS // STRUCT else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct)) @@ -1908,6 +1911,7 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList) new(&type) TType(typeList, structName); else { postDeclQualifier.storage = storageQualifier; + postDeclQualifier.readonly = readonly; new(&type) TType(typeList, structName, postDeclQualifier); // sets EbtBlock }