summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-07-26 12:23:32 -0700
committerGitHub <noreply@github.com>2023-07-26 12:23:32 -0700
commit727245a67443447aeec6f7281e8e65834974fbd1 (patch)
tree787e866f52c1b8424a014cd560b0844f0fe6d8a0
parent7b48b24baac066c3c54aaad3f36fb5979fc18ed1 (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.slang8
-rw-r--r--source/slang/slang-emit-glsl.cpp5
-rw-r--r--tests/bindings/hlsl-to-vulkan-shift-rw-structured.hlsl10
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