diff options
| author | Yong He <yonghe@outlook.com> | 2023-07-27 14:15:16 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-27 14:15:16 -0700 |
| commit | 04f72443d717ca7b8304f893452c471fc6b6dc8f (patch) | |
| tree | c70498d149eeed09cc0f438e68ca5da212f203df | |
| parent | c1216cae34a5e8ef912091fcaaf25b6633ac1db6 (diff) | |
Fix -fvk-u-shift not applying to global constant buffer. (#3033)
* Fix -fvk-u-shift not applying to global constant buffer.
* Fix test.
* Fix.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-parameter-binding.cpp | 16 | ||||
| -rw-r--r-- | tests/bindings/hlsl-to-vulkan-shift-bshift-global.slang | 35 | ||||
| -rw-r--r-- | tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl | 8 | ||||
| -rw-r--r-- | tests/bugs/vk-shift-uniform-issue.slang | 2 |
5 files changed, 61 insertions, 5 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 37c38dd95..321f41d54 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -241,7 +241,10 @@ void GLSLSourceEmitter::_emitGLSLByteAddressBuffer(IRGlobalParam* varDecl, IRByt { // We can use ShaderResource/DescriptorSlot interchangably here. // This is possible because vk-shift-* - const LayoutResourceKindFlags kinds = LayoutResourceKindFlag::ShaderResource | LayoutResourceKindFlag::DescriptorTableSlot; + bool isReadOnly = (as<IRHLSLByteAddressBufferType>(byteAddressBufferType) != nullptr); + + const LayoutResourceKindFlags kinds = (isReadOnly ? LayoutResourceKindFlag::ShaderResource : LayoutResourceKindFlag::UnorderedAccess) + | LayoutResourceKindFlag::DescriptorTableSlot; EmitVarChain chain(layout); diff --git a/source/slang/slang-parameter-binding.cpp b/source/slang/slang-parameter-binding.cpp index 51279b605..47f370854 100644 --- a/source/slang/slang-parameter-binding.cpp +++ b/source/slang/slang-parameter-binding.cpp @@ -3634,7 +3634,8 @@ static void _appendRange(Index start, LayoutSize size, StringBuilder& ioBuf) } static void _maybeApplyHLSLToVulkanShifts( - ParameterBindingContext* paramContext, + ParameterBindingContext* paramContext, + ParameterBindingAndKindInfo& globalConstantBinding, TargetRequest* targetReq, DiagnosticSink* sink) { @@ -3655,6 +3656,17 @@ static void _maybeApplyHLSLToVulkanShifts( return; } + // If the user specified -fvk-b-shift for the default space but not -fvk-bind-global, we want to apply the shift + // to the global constant buffer. + if (!vulkanOptions->hasGlobalsBinding()) + { + auto globalCBufferShift = vulkanOptions->getShift(HLSLToVulkanLayoutOptions::Kind::ConstantBuffer, globalConstantBinding.space); + if (globalCBufferShift != HLSLToVulkanLayoutOptions::kInvalidShift) + { + globalConstantBinding.index += globalCBufferShift; + } + } + for (ParameterInfo* parameterInfo : sharedContext.parameters) { auto varLayout = parameterInfo->varLayout; @@ -4035,7 +4047,7 @@ RefPtr<ProgramLayout> generateParameterBindings( _completeBindings(&context, program); // We may need to finally do any shifting if we have HLSLToVulkanLayoutOptions - _maybeApplyHLSLToVulkanShifts(&context, targetReq, sink); + _maybeApplyHLSLToVulkanShifts(&context, globalConstantBufferBinding, targetReq, sink); // Next we need to create a type layout to reflect the information // we have collected, and we will use the `ScopeLayoutBuilder` diff --git a/tests/bindings/hlsl-to-vulkan-shift-bshift-global.slang b/tests/bindings/hlsl-to-vulkan-shift-bshift-global.slang new file mode 100644 index 000000000..5972805e9 --- /dev/null +++ b/tests/bindings/hlsl-to-vulkan-shift-bshift-global.slang @@ -0,0 +1,35 @@ +//TEST:SIMPLE(filecheck=CHECK):-target glsl -profile glsl_450 -entry MainVs -stage vertex -fvk-b-shift 14 0 -fvk-s-shift 58 0 -fvk-t-shift 218 0 -fvk-u-shift 482 0 + +// CHECK: layout(binding = 15) +// CHECK-NEXT: layout(std140) uniform +// CHECK-NEXT: { +// CHECK-NEXT: vec4 g_vCBuffer0Values + +// CHECK: layout(binding = 14) +// CHECK-NEXT: layout(std140) uniform +// CHECK-NEXT: { +// CHECK-NEXT: vec4 g_vGlobalValues + +float4 g_vGlobalValues; // This ends up in globals + +cbuffer CBufferTest_t +{ + float4 g_vCBuffer0Values; +}; + +struct VS_INPUT +{ + float3 vPositionWs : POSITION; +}; + +struct PS_INPUT +{ + float4 vColor; +}; + +PS_INPUT MainVs( VS_INPUT i ) +{ + PS_INPUT o; + o.vColor.rgba = g_vCBuffer0Values + g_vGlobalValues; + return o; +}
\ No newline at end of file diff --git a/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl b/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl index 95e9ff3f7..2fcbdf77c 100644 --- a/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl +++ b/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl @@ -1,10 +1,16 @@ //TEST:SIMPLE(filecheck=CHECK):-target glsl -profile glsl_450 -entry MainCs -stage compute -fvk-b-shift 0 0 -fvk-s-shift 14 0 -fvk-t-shift 30 0 -fvk-u-shift 158 0 + +// CHECK: layout(std430, binding = 159) buffer +// CHECK: } g_ByteBuffer + // CHECK: layout(std430, binding = 158) buffer RWStructuredBuffer<uint> g_OutputCullBits; +RWByteAddressBuffer g_ByteBuffer; + [numthreads(32, 1, 1)] void MainCs(uint3 vThreadId : SV_DispatchThreadID, uint3 vGroupThreadId : SV_GroupThreadID, uint3 vGroupId : SV_GroupID) { - g_OutputCullBits[vThreadId.x] = 0; + g_OutputCullBits[vThreadId.x] = g_ByteBuffer.Load(0); }
\ No newline at end of file diff --git a/tests/bugs/vk-shift-uniform-issue.slang b/tests/bugs/vk-shift-uniform-issue.slang index 950a01c6f..fa49c3561 100644 --- a/tests/bugs/vk-shift-uniform-issue.slang +++ b/tests/bugs/vk-shift-uniform-issue.slang @@ -24,7 +24,7 @@ // CHECK:layout(binding = 1001) // CHECK:layout(std140) uniform _S4 -// CHECK:layout(binding = 0) +// CHECK:layout(binding = 1000) // CHECK:layout(std140) uniform _S5 Texture2D texture0; |
