diff options
| author | Yong He <yonghe@outlook.com> | 2023-07-26 12:23:32 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-26 12:23:32 -0700 |
| commit | 727245a67443447aeec6f7281e8e65834974fbd1 (patch) | |
| tree | 787e866f52c1b8424a014cd560b0844f0fe6d8a0 | |
| parent | 7b48b24baac066c3c54aaad3f36fb5979fc18ed1 (diff) | |
Fix -fvk-u-shift not applying to RWStructuredBuffer on glsl output. (#3027)
* Fix -fvk-u-shift not applying to RWStructuredBuffer on glsl output.
* Add `transpose` to `ObjectToWorld4x3`.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
| -rw-r--r-- | source/slang/hlsl.meta.slang | 8 | ||||
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 5 | ||||
| -rw-r--r-- | tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl | 10 |
3 files changed, 17 insertions, 6 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 58ddb1401..70b1f2151 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -5457,12 +5457,12 @@ __target_intrinsic(GL_NV_ray_tracing, "transpose(gl_WorldToObjectNV)") __target_intrinsic(GL_EXT_ray_tracing, "transpose(gl_WorldToObjectEXT)") float3x4 WorldToObject3x4(); -__target_intrinsic(GL_NV_ray_tracing, "(gl_ObjectToWorldNV)") -__target_intrinsic(GL_EXT_ray_tracing, "(gl_ObjectToWorld3x4EXT)") +__target_intrinsic(GL_NV_ray_tracing, "transpose(gl_ObjectToWorldNV)") +__target_intrinsic(GL_EXT_ray_tracing, "transpose(gl_ObjectToWorld3x4EXT)") float4x3 ObjectToWorld4x3(); -__target_intrinsic(GL_NV_ray_tracing, "(gl_WorldToObjectNV)") -__target_intrinsic(GL_EXT_ray_tracing, "(gl_WorldToObject3x4EXT)") +__target_intrinsic(GL_NV_ray_tracing, "transpose(gl_WorldToObjectNV)") +__target_intrinsic(GL_EXT_ray_tracing, "transpose(gl_WorldToObject3x4EXT)") float4x3 WorldToObject4x3(); // NOTE! diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index c377b40c6..37c38dd95 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -155,13 +155,14 @@ void GLSLSourceEmitter::_emitGLSLStructuredBuffer(IRGlobalParam* varDecl, IRHLSL m_writer->emit("layout("); m_writer->emit(getTargetReq()->getForceGLSLScalarBufferLayout() ? "scalar" : "std430"); - + bool isReadOnly = (as<IRHLSLStructuredBufferType>(structuredBufferType) != nullptr); auto layout = getVarLayout(varDecl); if (layout) { // We can use ShaderResource/DescriptorSlot interchangably here. // This is possible because vk-shift-* - const LayoutResourceKindFlags kinds = LayoutResourceKindFlag::ShaderResource | LayoutResourceKindFlag::DescriptorTableSlot; + const LayoutResourceKindFlags kinds = (isReadOnly ? LayoutResourceKindFlag::ShaderResource : LayoutResourceKindFlag::UnorderedAccess) + | LayoutResourceKindFlag::DescriptorTableSlot; EmitVarChain chain(layout); diff --git a/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl b/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl new file mode 100644 index 000000000..95e9ff3f7 --- /dev/null +++ b/tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl @@ -0,0 +1,10 @@ +//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 = 158) buffer + +RWStructuredBuffer<uint> g_OutputCullBits; +[numthreads(32, 1, 1)] +void MainCs(uint3 vThreadId : SV_DispatchThreadID, uint3 vGroupThreadId : SV_GroupThreadID, uint3 vGroupId : SV_GroupID) +{ + g_OutputCullBits[vThreadId.x] = 0; +}
\ No newline at end of file |
