summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-21 17:07:34 -0700
committerGitHub <noreply@github.com>2023-08-21 17:07:34 -0700
commitbd6dbaf7c3ea720b4ed39904fe08878f9dcbd947 (patch)
tree9e8c436e0888d192c462f75e4655a63b51f41648
parentf94b2f7a328a898c5e3dc1389d08e0b7ce6e092e (diff)
Compile append and consume structured buffers to glsl. (#3142)
* Compile append and consume structured buffers to glsl. * Fix. * Update CI config. --------- Co-authored-by: Yong He <yhe@nvidia.com>
-rw-r--r--.github/workflows/windows-selfhosted.yml17
-rw-r--r--build/visual-studio/slang/slang.vcxproj2
-rw-r--r--build/visual-studio/slang/slang.vcxproj.filters6
-rw-r--r--source/slang/hlsl.meta.slang26
-rw-r--r--source/slang/slang-emit-c-like.cpp92
-rw-r--r--source/slang/slang-emit-c-like.h5
-rw-r--r--source/slang/slang-emit-glsl.cpp38
-rw-r--r--source/slang/slang-emit-glsl.h2
-rw-r--r--source/slang/slang-emit-torch.cpp6
-rw-r--r--source/slang/slang-emit-torch.h2
-rw-r--r--source/slang/slang-emit.cpp9
-rw-r--r--source/slang/slang-ir-byte-address-legalize.cpp2
-rw-r--r--source/slang/slang-ir-inst-defs.h8
-rw-r--r--source/slang/slang-ir-insts.h19
-rw-r--r--source/slang/slang-ir-lower-append-consume-structured-buffer.cpp247
-rw-r--r--source/slang/slang-ir-lower-append-consume-structured-buffer.h17
-rw-r--r--source/slang/slang-type-layout.cpp21
-rw-r--r--source/slang/slang-type-layout.h2
-rw-r--r--tests/bugs/texture2d-ms.hlsl.glsl2
-rw-r--r--tests/bugs/vk-structured-buffer-binding.hlsl.glsl20
-rw-r--r--tests/bugs/vk-structured-buffer-load.hlsl.glsl20
-rw-r--r--tests/compute/comma-operator.slang.glsl2
-rw-r--r--tests/compute/half-texture.slang.glsl2
-rw-r--r--tests/compute/unbounded-array-of-array-syntax.slang.glsl15
-rw-r--r--tests/cross-compile/array-of-buffers.slang.glsl19
-rw-r--r--tests/cross-compile/func-resource-param-array.slang.glsl26
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected20
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected46
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected10
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected14
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected14
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected48
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected30
-rw-r--r--tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected30
-rw-r--r--tests/hlsl/append-structured-buffer.slang43
-rw-r--r--tests/hlsl/consume-structured-buffer.slang35
-rw-r--r--tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl45
-rw-r--r--tests/slang-extension/atomic-float-byte-address-buffer-cross.slang.glsl54
-rw-r--r--tests/vkray/closesthit.slang.glsl22
-rw-r--r--tests/vkray/entry-point-params.slang.glsl10
40 files changed, 809 insertions, 239 deletions
diff --git a/.github/workflows/windows-selfhosted.yml b/.github/workflows/windows-selfhosted.yml
index 9b7c7b6eb..08f079537 100644
--- a/.github/workflows/windows-selfhosted.yml
+++ b/.github/workflows/windows-selfhosted.yml
@@ -12,8 +12,9 @@ jobs:
build:
runs-on: [Windows, self-hosted]
timeout-minutes: 100
-
+ continue-on-error: true
strategy:
+ fail-fast: false
matrix:
configuration: ['Release']
platform: ['x64']
@@ -38,11 +39,13 @@ jobs:
MSBuild.exe slang.sln -v:m -m -property:Configuration=${{matrix.configuration}} -property:Platform=${{matrix.platform}} -property:WindowsTargetPlatformVersion=10.0.19041.0 -maxcpucount:12
- name: test-spirv-direct
run: |
- set PATH=%PATH%;.\external\slang-binaries\spirv-tools\windows-${{matrix.testPlatform}}\bin\
- ".\bin\windows-${{matrix.testPlatform}}\${{matrix.configuration}}\slang-test.exe" tests/ -use-test-server -emit-spirv-directly -expected-failure-list tests/expected-failure.txt -api vk 2>&1
- shell: cmd
+ $ErrorActionPreference = "SilentlyContinue"
+ $env:Path += ';.\external\slang-binaries\spirv-tools\windows-${{matrix.testPlatform}}\bin\'
+ .\bin\windows-${{matrix.testPlatform}}\${{matrix.configuration}}\slang-test.exe tests/ -use-test-server -emit-spirv-directly -expected-failure-list tests/expected-failure.txt -api vk
+
- name: test
run: |
- set PATH=%PATH%;.\external\slang-binaries\spirv-tools\windows-${{matrix.testPlatform}}\bin\
- ".\bin\windows-${{matrix.testPlatform}}\${{matrix.configuration}}\slang-test.exe" -use-test-server -api vk 2>&1
- shell: cmd
+ $ErrorActionPreference = "SilentlyContinue"
+ $env:Path += ';.\external\slang-binaries\spirv-tools\windows-${{matrix.testPlatform}}\bin\'
+ .\bin\windows-${{matrix.testPlatform}}\${{matrix.configuration}}\slang-test.exe -use-test-server -api all-cpu
+
diff --git a/build/visual-studio/slang/slang.vcxproj b/build/visual-studio/slang/slang.vcxproj
index 2e82d97ce..ebbb4f98d 100644
--- a/build/visual-studio/slang/slang.vcxproj
+++ b/build/visual-studio/slang/slang.vcxproj
@@ -408,6 +408,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
<ClInclude Include="..\..\..\source\slang\slang-ir-liveness.h" />
<ClInclude Include="..\..\..\source\slang\slang-ir-loop-inversion.h" />
<ClInclude Include="..\..\..\source\slang\slang-ir-loop-unroll.h" />
+ <ClInclude Include="..\..\..\source\slang\slang-ir-lower-append-consume-structured-buffer.h" />
<ClInclude Include="..\..\..\source\slang\slang-ir-lower-binding-query.h" />
<ClInclude Include="..\..\..\source\slang\slang-ir-lower-bit-cast.h" />
<ClInclude Include="..\..\..\source\slang\slang-ir-lower-buffer-element-type.h" />
@@ -618,6 +619,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
<ClCompile Include="..\..\..\source\slang\slang-ir-liveness.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-ir-loop-inversion.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-ir-loop-unroll.cpp" />
+ <ClCompile Include="..\..\..\source\slang\slang-ir-lower-append-consume-structured-buffer.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-ir-lower-binding-query.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-ir-lower-bit-cast.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-ir-lower-buffer-element-type.cpp" />
diff --git a/build/visual-studio/slang/slang.vcxproj.filters b/build/visual-studio/slang/slang.vcxproj.filters
index 546a03ab0..0c4f8a4d3 100644
--- a/build/visual-studio/slang/slang.vcxproj.filters
+++ b/build/visual-studio/slang/slang.vcxproj.filters
@@ -312,6 +312,9 @@
<ClInclude Include="..\..\..\source\slang\slang-ir-loop-unroll.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\source\slang\slang-ir-lower-append-consume-structured-buffer.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\source\slang\slang-ir-lower-binding-query.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -938,6 +941,9 @@
<ClCompile Include="..\..\..\source\slang\slang-ir-loop-unroll.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\source\slang\slang-ir-lower-append-consume-structured-buffer.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\..\..\source\slang\slang-ir-lower-binding-query.cpp">
<Filter>Source Files</Filter>
</ClCompile>
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index b690a5910..3dcdc6c54 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -7,15 +7,30 @@ typedef uint UINT;
[ForceInline] float3 __asFloat3(float3 v) { return v; }
__generic<T>
+__intrinsic_op($(kIROp_StructuredBufferGetDimensions))
+uint2 __structuredBufferGetDimensions(AppendStructuredBuffer<T> buffer);
+
+__generic<T>
+__intrinsic_op($(kIROp_StructuredBufferGetDimensions))
+uint2 __structuredBufferGetDimensions(ConsumeStructuredBuffer<T> buffer);
+
+__generic<T>
__magic_type(HLSLAppendStructuredBufferType)
__intrinsic_type($(kIROp_HLSLAppendStructuredBufferType))
struct AppendStructuredBuffer
{
+ __intrinsic_op($(kIROp_StructuredBufferAppend))
void Append(T value);
+ [ForceInline]
void GetDimensions(
out uint numStructs,
- out uint stride);
+ out uint stride)
+ {
+ let result = __structuredBufferGetDimensions(this);
+ numStructs = result.x;
+ stride = result.y;
+ }
};
__magic_type(HLSLByteAddressBufferType)
@@ -257,11 +272,18 @@ __magic_type(HLSLConsumeStructuredBufferType)
__intrinsic_type($(kIROp_HLSLConsumeStructuredBufferType))
struct ConsumeStructuredBuffer
{
+ __intrinsic_op($(kIROp_StructuredBufferConsume))
T Consume();
+ [ForceInline]
void GetDimensions(
out uint numStructs,
- out uint stride);
+ out uint stride)
+ {
+ let result = __structuredBufferGetDimensions(this);
+ numStructs = result.x;
+ stride = result.y;
+ }
};
__generic<T, let N : int>
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index e1f631283..75a15d0c9 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -455,6 +455,66 @@ void CLikeSourceEmitter::emitRTTIObject(IRRTTIObject* rttiObject)
// This is only used in targets that support dynamic dispatching.
}
+void CLikeSourceEmitter::defaultEmitInstStmt(IRInst* inst)
+{
+ switch (inst->getOp())
+ {
+ case kIROp_AtomicCounterIncrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(";\n");
+ m_writer->emit("InterlockedAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", 1, ");
+ m_writer->emit(oldValName);
+ m_writer->emit(");\n");
+ }
+ break;
+ case kIROp_AtomicCounterDecrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(";\n");
+ m_writer->emit("InterlockedAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", -1, ");
+ m_writer->emit(oldValName);
+ m_writer->emit(");\n");
+ }
+ break;
+ case kIROp_StructuredBufferGetDimensions:
+ {
+ auto count = _generateUniqueName(UnownedStringSlice("_elementCount"));
+ auto stride = _generateUniqueName(UnownedStringSlice("_stride"));
+
+ m_writer->emit("uint ");
+ m_writer->emit(count);
+ m_writer->emit(";\n");
+ m_writer->emit("uint ");
+ m_writer->emit(stride);
+ m_writer->emit(";\n");
+ emitOperand(inst->getOperand(0), leftSide(getInfo(EmitOp::General), getInfo(EmitOp::Postfix)));
+ m_writer->emit(".GetDimensions(");
+ m_writer->emit(count);
+ m_writer->emit(", ");
+ m_writer->emit(stride);
+ m_writer->emit(");\n");
+ emitInstResultDecl(inst);
+ m_writer->emit("uint2(");
+ m_writer->emit(count);
+ m_writer->emit(", ");
+ m_writer->emit(stride);
+ m_writer->emit(");\n");
+ }
+ break;
+ default:
+ diagnoseUnhandledInst(inst);
+ }
+}
+
void CLikeSourceEmitter::emitTypeImpl(IRType* type, const StringSliceLoc* nameAndLoc)
{
@@ -1874,6 +1934,16 @@ void CLikeSourceEmitter::emitInstExpr(IRInst* inst, const EmitOpInfo& inOuterPre
defaultEmitInstExpr(inst, inOuterPrec);
}
+void CLikeSourceEmitter::emitInstStmt(IRInst* inst)
+{
+ // Try target specific impl first
+ if (tryEmitInstStmtImpl(inst))
+ {
+ return;
+ }
+ defaultEmitInstStmt(inst);
+}
+
void CLikeSourceEmitter::diagnoseUnhandledInst(IRInst* inst)
{
getSink()->diagnose(inst, Diagnostics::unimplemented, "unexpected IR opcode during code emit");
@@ -2193,6 +2263,23 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
}
break;
+ case kIROp_StructuredBufferAppend:
+ {
+ auto outer = getInfo(EmitOp::General);
+ emitOperand(inst->getOperand(0), leftSide(outer, getInfo(EmitOp::Postfix)));
+ m_writer->emit(".Append(");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(")");
+ }
+ break;
+ case kIROp_StructuredBufferConsume:
+ {
+ auto outer = getInfo(EmitOp::General);
+ emitOperand(inst->getOperand(0), leftSide(outer, getInfo(EmitOp::Postfix)));
+ m_writer->emit(".Consume()");
+ }
+ break;
+
case kIROp_Call:
{
emitCallExpr((IRCall*)inst, outerPrec);
@@ -2562,7 +2649,10 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst)
// Insts that needs to be emitted as code blocks.
case kIROp_CudaKernelLaunch:
- emitInstStmtImpl(inst);
+ case kIROp_AtomicCounterIncrement:
+ case kIROp_AtomicCounterDecrement:
+ case kIROp_StructuredBufferGetDimensions:
+ emitInstStmt(inst);
break;
case kIROp_LiveRangeStart:
diff --git a/source/slang/slang-emit-c-like.h b/source/slang/slang-emit-c-like.h
index 4f8d23a0d..420132a5d 100644
--- a/source/slang/slang-emit-c-like.h
+++ b/source/slang/slang-emit-c-like.h
@@ -549,7 +549,10 @@ public:
virtual bool tryEmitGlobalParamImpl(IRGlobalParam* varDecl, IRType* varType) { SLANG_UNUSED(varDecl); SLANG_UNUSED(varType); return false; }
virtual bool tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOuterPrec) { SLANG_UNUSED(inst); SLANG_UNUSED(inOuterPrec); return false; }
- virtual void emitInstStmtImpl(IRInst* inst) { SLANG_UNUSED(inst); }
+ virtual bool tryEmitInstStmtImpl(IRInst* inst) { SLANG_UNUSED(inst); return false; }
+
+ void defaultEmitInstStmt(IRInst* inst);
+ void emitInstStmt(IRInst* inst);
virtual void emitPostKeywordTypeAttributesImpl(IRInst* inst) { SLANG_UNUSED(inst); }
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index 0920c236c..e1f74f70d 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -201,8 +201,11 @@ void GLSLSourceEmitter::_emitGLSLStructuredBuffer(IRGlobalParam* varDecl, IRHLSL
m_writer->emit("buffer ");
// Generate a dummy name for the block
- m_writer->emit("_S");
- m_writer->emit(m_uniqueIDCounter++);
+ StringBuilder blockTypeName;
+ blockTypeName << "StructuredBuffer_";
+ getTypeNameHint(blockTypeName, structuredBufferType->getElementType());
+ blockTypeName << "_t";
+ m_writer->emit(_generateUniqueName(blockTypeName.produceString().getUnownedSlice()));
m_writer->emit(" {\n");
m_writer->indent();
@@ -2007,6 +2010,37 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
return false;
}
+bool GLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
+{
+ switch (inst->getOp())
+ {
+ case kIROp_AtomicCounterIncrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(" = ");
+ m_writer->emit("atomicAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", 1);\n");
+ return true;
+ }
+ case kIROp_AtomicCounterDecrement:
+ {
+ auto oldValName = getName(inst);
+ m_writer->emit("int ");
+ m_writer->emit(oldValName);
+ m_writer->emit(" = ");
+ m_writer->emit("atomicAdd(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", -1);\n");
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
void GLSLSourceEmitter::handleRequiredCapabilitiesImpl(IRInst* inst)
{
// Does this function declare any requirements on GLSL version or
diff --git a/source/slang/slang-emit-glsl.h b/source/slang/slang-emit-glsl.h
index d0cabfa94..7c1a15315 100644
--- a/source/slang/slang-emit-glsl.h
+++ b/source/slang/slang-emit-glsl.h
@@ -48,6 +48,8 @@ protected:
virtual bool tryEmitGlobalParamImpl(IRGlobalParam* varDecl, IRType* varType) SLANG_OVERRIDE;
virtual bool tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOuterPrec) SLANG_OVERRIDE;
+ virtual bool tryEmitInstStmtImpl(IRInst* inst) SLANG_OVERRIDE;
+
virtual void emitGlobalInstImpl(IRInst* inst) override;
void emitBufferPointerTypeDefinition(IRInst* ptrType);
diff --git a/source/slang/slang-emit-torch.cpp b/source/slang/slang-emit-torch.cpp
index bdb650607..ef04f33ba 100644
--- a/source/slang/slang-emit-torch.cpp
+++ b/source/slang/slang-emit-torch.cpp
@@ -65,12 +65,12 @@ void emitTorchScalarTypeName(SourceWriter* m_writer, IRInst* type)
}
}
-void TorchCppSourceEmitter::emitInstStmtImpl(IRInst* inst)
+bool TorchCppSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
{
switch (inst->getOp())
{
default:
- return;
+ return false;
case kIROp_CudaKernelLaunch:
{
m_writer->emit("AT_CUDA_CHECK(cudaLaunchKernel(");
@@ -101,7 +101,7 @@ void TorchCppSourceEmitter::emitInstStmtImpl(IRInst* inst)
emitOperand(inst->getOperand(4), getInfo(EmitOp::General));
m_writer->emit(")));\n");
- break;
+ return true;
}
}
}
diff --git a/source/slang/slang-emit-torch.h b/source/slang/slang-emit-torch.h
index aeb9058a4..9e76e42d1 100644
--- a/source/slang/slang-emit-torch.h
+++ b/source/slang/slang-emit-torch.h
@@ -19,7 +19,7 @@ public:
protected:
// CPPSourceEmitter overrides
- virtual void emitInstStmtImpl(IRInst* inst) override;
+ virtual bool tryEmitInstStmtImpl(IRInst* inst) override;
virtual bool tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOuterPrec) override;
virtual SlangResult calcTypeName(IRType* type, CodeGenTarget target, StringBuilder& out) override;
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 6521b05ba..03d62b540 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -31,6 +31,7 @@
#include "slang-ir-legalize-varying-params.h"
#include "slang-ir-link.h"
#include "slang-ir-com-interface.h"
+#include "slang-ir-lower-append-consume-structured-buffer.h"
#include "slang-ir-lower-binding-query.h"
#include "slang-ir-lower-generics.h"
#include "slang-ir-lower-tuple-types.h"
@@ -494,6 +495,14 @@ Result linkAndOptimizeIR(
validateIRModuleIfEnabled(codeGenContext, irModule);
+ // On non-HLSL targets, there isn't an implementation of `AppendStructuredBuffer`
+ // and `ConsumeStructuredBuffer` types, so we lower them into normal struct types
+ // of `RWStructuredBuffer` typed fields now.
+ if (target != CodeGenTarget::HLSL)
+ {
+ lowerAppendConsumeStructuredBuffers(targetRequest, irModule, sink);
+ }
+
// We don't need the legalize pass for C/C++ based types
if(options.shouldLegalizeExistentialAndResourceTypes )
{
diff --git a/source/slang/slang-ir-byte-address-legalize.cpp b/source/slang/slang-ir-byte-address-legalize.cpp
index 40fe64693..b4de66d77 100644
--- a/source/slang/slang-ir-byte-address-legalize.cpp
+++ b/source/slang/slang-ir-byte-address-legalize.cpp
@@ -741,6 +741,8 @@ struct ByteAddressBufferLegalizationContext
paramBuilder.setInsertBefore(byteAddressBufferParam);
auto structuredBufferParam = paramBuilder.createGlobalParam(structuredBufferParamType);
+ if (auto nameHint = byteAddressBufferParam->findDecoration<IRNameHintDecoration>())
+ paramBuilder.addNameHintDecoration(structuredBufferParam, nameHint->getName());
// The new parameter needs to be given a layout to match the existing
// parameter, so that it is given the same `binding` in the generated code.
diff --git a/source/slang/slang-ir-inst-defs.h b/source/slang/slang-ir-inst-defs.h
index 22355bd7e..c1b021181 100644
--- a/source/slang/slang-ir-inst-defs.h
+++ b/source/slang/slang-ir-inst-defs.h
@@ -447,6 +447,14 @@ INST(RWStructuredBufferStore, rwstructuredBufferStore, 3, 0)
INST(RWStructuredBufferGetElementPtr, rwstructuredBufferGetElementPtr, 2, 0)
+// Append/Consume-StructuredBuffer operations
+INST(StructuredBufferAppend, StructuredBufferAppend, 1, 0)
+INST(StructuredBufferConsume, StructuredBufferConsume, 1, 0)
+INST(StructuredBufferGetDimensions, StructuredBufferGetDimensions, 1, 0)
+
+INST(AtomicCounterIncrement, AtomicCounterIncrement, 1, 0)
+INST(AtomicCounterDecrement, AtomicCounterDecrement, 1, 0)
+
INST(MeshOutputRef, meshOutputRef, 2, 0)
// Construct a vector from a scalar
diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h
index adfcac7fd..4b0cac182 100644
--- a/source/slang/slang-ir-insts.h
+++ b/source/slang/slang-ir-insts.h
@@ -2144,6 +2144,25 @@ struct IRRWStructuredBufferGetElementPtr : IRInst
IRInst* getIndex() { return getOperand(1); }
};
+struct IRStructuredBufferAppend : IRInst
+{
+ IR_LEAF_ISA(StructuredBufferAppend);
+ IRInst* getBuffer() { return getOperand(0); }
+ IRInst* getElement() { return getOperand(1); }
+};
+
+struct IRStructuredBufferConsume : IRInst
+{
+ IR_LEAF_ISA(StructuredBufferConsume);
+ IRInst* getBuffer() { return getOperand(0); }
+};
+
+struct IRStructuredBufferGetDimensions : IRInst
+{
+ IR_LEAF_ISA(StructuredBufferGetDimensions);
+ IRInst* getBuffer() { return getOperand(0); }
+};
+
struct IRLoadReverseGradient : IRInst
{
IR_LEAF_ISA(LoadReverseGradient)
diff --git a/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp b/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
new file mode 100644
index 000000000..fa9f16223
--- /dev/null
+++ b/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
@@ -0,0 +1,247 @@
+#include "slang-ir-lower-append-consume-structured-buffer.h"
+#include "slang-ir.h"
+#include "slang-ir-insts.h"
+#include "slang-ir-util.h"
+#include "slang-ir-layout.h"
+#include "slang-ir-lower-buffer-element-type.h"
+
+namespace Slang
+{
+ static void lowerStructuredBufferType(TargetRequest* target, IRHLSLStructuredBufferTypeBase* type)
+ {
+ IRBuilder builder(type);
+ builder.setInsertBefore(type);
+
+ auto elementType = type->getElementType();
+
+ // Type.
+ auto structType = builder.createStructType();
+ StringBuilder nameSb;
+ if (type->getOp() == kIROp_HLSLAppendStructuredBufferType)
+ nameSb << "AppendStructuredBuffer_";
+ else
+ nameSb << "ConsumeStructuredBuffer_";
+ getTypeNameHint(nameSb, elementType);
+ nameSb << "_t";
+ builder.addNameHintDecoration(structType, nameSb.produceString().getUnownedSlice());
+
+ auto elementBufferKey = builder.createStructKey();
+ builder.addNameHintDecoration(elementBufferKey, UnownedStringSlice("elements"));
+
+ auto counterBufferKey = builder.createStructKey();
+ builder.addNameHintDecoration(counterBufferKey, UnownedStringSlice("counter"));
+
+ auto elementBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, elementType);
+ auto counterBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, builder.getIntType());
+
+ builder.createStructField(structType, elementBufferKey, elementBufferType);
+ builder.createStructField(structType, counterBufferKey, counterBufferType);
+
+ // Type layout.
+ auto layoutRules = getTypeLayoutRuleForBuffer(target, type);
+
+ IRTypeLayout::Builder elementTypeLayoutBuilder(&builder);
+ IRSizeAndAlignment elementSize;
+ getSizeAndAlignment(layoutRules, elementType, &elementSize);
+ elementTypeLayoutBuilder.addResourceUsage(LayoutResourceKind::Uniform, LayoutSize((LayoutSize::RawValue)elementSize.getStride()));
+ auto elementTypeLayout = elementTypeLayoutBuilder.build();
+
+ IRStructuredBufferTypeLayout::Builder elementBufferTypeLayoutBuilder(&builder, elementTypeLayout);
+ elementBufferTypeLayoutBuilder.addResourceUsage(LayoutResourceKind::DescriptorTableSlot, 1);
+ auto elementBufferTypeLayout = elementBufferTypeLayoutBuilder.build();
+
+ IRTypeLayout::Builder counterTypeLayoutBuilder(&builder);
+ counterTypeLayoutBuilder.addResourceUsage(LayoutResourceKind::Uniform, LayoutSize(4));
+ auto counterTypeLayout = counterTypeLayoutBuilder.build();
+
+ IRStructuredBufferTypeLayout::Builder counterBufferTypeLayoutBuilder(&builder, counterTypeLayout);
+ counterBufferTypeLayoutBuilder.addResourceUsage(LayoutResourceKind::DescriptorTableSlot, 1);
+ auto counterBufferTypeLayout = counterBufferTypeLayoutBuilder.build();
+
+ IRVarLayout::Builder elementBufferVarLayoutBuilder(&builder, elementBufferTypeLayout);
+ elementBufferVarLayoutBuilder.findOrAddResourceInfo(LayoutResourceKind::DescriptorTableSlot)->offset = 0;
+ auto elementBufferVarLayout = elementBufferVarLayoutBuilder.build();
+
+ IRVarLayout::Builder counterBufferVarLayoutBuilder(&builder, counterBufferTypeLayout);
+ counterBufferVarLayoutBuilder.findOrAddResourceInfo(LayoutResourceKind::DescriptorTableSlot)->offset = 1;
+ auto counterBufferVarLayout = counterBufferVarLayoutBuilder.build();
+
+ IRStructTypeLayout::Builder layoutBuilder(&builder);
+ layoutBuilder.addField(elementBufferKey, elementBufferVarLayout);
+ layoutBuilder.addField(counterBufferKey, counterBufferVarLayout);
+ auto typeLayout = layoutBuilder.build();
+
+ builder.addLayoutDecoration(structType, typeLayout);
+
+ IRFunc* appendFunc = nullptr;
+ IRFunc* consumeFunc = nullptr;
+ IRFunc* getDimensionsFunc = nullptr;
+
+ if (type->getOp() == kIROp_HLSLAppendStructuredBufferType)
+ {
+ // Append method.
+ appendFunc = builder.createFunc();
+ builder.addNameHintDecoration(appendFunc, UnownedStringSlice("AppendStructuredBuffer_Append"));
+ IRType* paramTypes[] = { structType, elementType };
+ auto funcType = builder.getFuncType(2, paramTypes, builder.getVoidType());
+ appendFunc->setFullType(funcType);
+ builder.setInsertInto(appendFunc);
+ builder.emitBlock();
+ auto bufferParam = builder.emitParam(structType);
+ auto elementParam = builder.emitParam(elementType);
+ auto elementBuffer = builder.emitFieldExtract(elementBufferType, bufferParam, elementBufferKey);
+ auto counterBuffer = builder.emitFieldExtract(counterBufferType, bufferParam, counterBufferKey);
+ IRInst* getCounterPtrArgs[] = { counterBuffer, builder.getIntValue(builder.getIntType(), 0) };
+ auto counterBufferPtr = builder.emitIntrinsicInst(builder.getPtrType(builder.getIntType()), kIROp_RWStructuredBufferGetElementPtr, 2, getCounterPtrArgs);
+ auto oldCounter = builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicCounterIncrement, 1, &counterBufferPtr);
+
+ IRInst* getElementPtrArgs[] = { elementBuffer, oldCounter };
+ auto elementBufferPtr = builder.emitIntrinsicInst(builder.getPtrType(elementType), kIROp_RWStructuredBufferGetElementPtr, 2, getElementPtrArgs);
+
+ builder.emitStore(elementBufferPtr, elementParam);
+ builder.emitReturn();
+ }
+ else
+ {
+ // Consume method.
+ consumeFunc = builder.createFunc();
+ builder.addNameHintDecoration(consumeFunc, UnownedStringSlice("ConsumeStructuredBuffer_Consume"));
+ IRType* paramTypes[] = { structType };
+ auto funcType = builder.getFuncType(1, paramTypes, elementType);
+ consumeFunc->setFullType(funcType);
+ builder.setInsertInto(consumeFunc);
+ auto firstBlock = builder.emitBlock();
+ auto bufferParam = builder.emitParam(structType);
+ auto elementBuffer = builder.emitFieldExtract(elementBufferType, bufferParam, elementBufferKey);
+ auto counterBuffer = builder.emitFieldExtract(counterBufferType, bufferParam, counterBufferKey);
+ IRInst* getCounterPtrArgs[] = { counterBuffer, builder.getIntValue(builder.getIntType(), 0) };
+ auto counterBufferPtr = builder.emitIntrinsicInst(builder.getPtrType(builder.getIntType()), kIROp_RWStructuredBufferGetElementPtr, 2, getCounterPtrArgs);
+ auto oldCounter = builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicCounterDecrement, 1, &counterBufferPtr);
+ auto index = builder.emitSub(builder.getIntType(), oldCounter, builder.getIntValue(builder.getIntType(), 1));
+
+ // Test if index is greater or equal than 0.
+ auto geq = builder.emitGeq(index, builder.getIntValue(builder.getIntType(), 0));
+ auto trueBlock = builder.emitBlock();
+
+ auto falseBlock = builder.emitBlock();
+ auto mergeBlock = builder.emitBlock();
+
+ builder.setInsertInto(firstBlock);
+ builder.emitIfElse(geq, trueBlock, falseBlock, mergeBlock);
+
+ builder.setInsertInto(trueBlock);
+ IRInst* getElementPtrArgs[] = { elementBuffer, index };
+ auto elementBufferPtr = builder.emitIntrinsicInst(builder.getPtrType(elementType), kIROp_RWStructuredBufferGetElementPtr, 2, getElementPtrArgs);
+ auto val = builder.emitLoad(elementBufferPtr);
+ builder.emitReturn(val);
+
+ builder.setInsertInto(falseBlock);
+ auto defaultVal = builder.emitDefaultConstruct(elementType);
+ builder.emitReturn(defaultVal);
+
+ builder.setInsertInto(mergeBlock);
+ builder.emitUnreachable();
+ }
+
+ // GetDimensions method.
+ {
+ getDimensionsFunc = builder.createFunc();
+ builder.addNameHintDecoration(getDimensionsFunc, UnownedStringSlice("StructuredBuffer_GetDimensions"));
+ IRType* paramTypes[] = { structType };
+ auto uint2Type = builder.getVectorType(builder.getUIntType(), 2);
+ auto funcType = builder.getFuncType(1, paramTypes, uint2Type);
+ getDimensionsFunc->setFullType(funcType);
+ builder.setInsertInto(getDimensionsFunc);
+ builder.emitBlock();
+ auto bufferParam = builder.emitParam(structType);
+ auto counterBuffer = builder.emitFieldExtract(counterBufferType, bufferParam, counterBufferKey);
+ IRInst* getCounterPtrArgs[] = { counterBuffer, builder.getIntValue(builder.getIntType(), 0) };
+ auto counterBufferPtr = builder.emitIntrinsicInst(builder.getPtrType(builder.getIntType()), kIROp_RWStructuredBufferGetElementPtr, 2, getCounterPtrArgs);
+ auto counter = builder.emitLoad(counterBufferPtr);
+ counter = builder.emitCast(builder.getUIntType(), counter);
+ auto stride = builder.getIntValue(builder.getUIntType(), elementSize.getStride());
+ IRInst* vecArgs[] = { counter, stride };
+ builder.emitReturn(builder.emitMakeVector(uint2Type, 2, vecArgs));
+ }
+
+ // Replace all insts with synthesized functions.
+ traverseUsers(type, [&](IRInst* typeUser)
+ {
+ if (typeUser->getFullType() != type)
+ return;
+ if (auto layoutDecor = typeUser->findDecoration<IRLayoutDecoration>())
+ {
+ // Replace the original StructuredBufferVarLayout with the new StructTypeVarLayout.
+ if (auto varLayout = as<IRVarLayout>(layoutDecor->getLayout()))
+ {
+ IRBuilder subBuilder(typeUser);
+ IRVarLayout::Builder newVarLayoutBuilder(&subBuilder, typeLayout);
+ newVarLayoutBuilder.cloneEverythingButOffsetsFrom(varLayout);
+ for (auto offsetAttr : varLayout->getOffsetAttrs())
+ {
+ auto info = newVarLayoutBuilder.findOrAddResourceInfo(offsetAttr->getResourceKind());
+ info->offset = offsetAttr->getOffset();
+ info->space = offsetAttr->getSpace();
+ info->kind = offsetAttr->getResourceKind();
+ }
+ auto newVarLayout = newVarLayoutBuilder.build();
+ subBuilder.addLayoutDecoration(typeUser, newVarLayout);
+ varLayout->removeAndDeallocate();
+ }
+ }
+ traverseUses(typeUser, [&](IRUse* use)
+ {
+ auto user = use->getUser();
+ switch (user->getOp())
+ {
+ case kIROp_StructuredBufferAppend:
+ {
+ IRBuilder subBuilder(user);
+ subBuilder.setInsertBefore(user);
+ IRInst* args[] = { user->getOperand(0), user->getOperand(1) };
+ auto call = subBuilder.emitCallInst(user->getFullType(), appendFunc, 2, args);
+ user->replaceUsesWith(call);
+ user->removeAndDeallocate();
+ break;
+ }
+ case kIROp_StructuredBufferConsume:
+ {
+ IRBuilder subBuilder(user);
+ subBuilder.setInsertBefore(user);
+ IRInst* args[] = { user->getOperand(0) };
+ auto call = subBuilder.emitCallInst(user->getFullType(), consumeFunc, 1, args);
+ user->replaceUsesWith(call);
+ user->removeAndDeallocate();
+ break;
+ }
+ case kIROp_StructuredBufferGetDimensions:
+ {
+ IRBuilder subBuilder(user);
+ subBuilder.setInsertBefore(user);
+ IRInst* args[] = { user->getOperand(0) };
+ auto call = subBuilder.emitCallInst(user->getFullType(), getDimensionsFunc, 1, args);
+ user->replaceUsesWith(call);
+ user->removeAndDeallocate();
+ break;
+ }
+ }
+ });
+ });
+ type->replaceUsesWith(structType);
+ }
+
+ void lowerAppendConsumeStructuredBuffers(TargetRequest* target, IRModule* module, DiagnosticSink* sink)
+ {
+ SLANG_UNUSED(sink);
+ for (auto globalInst : module->getGlobalInsts())
+ {
+ switch (globalInst->getOp())
+ {
+ case kIROp_HLSLAppendStructuredBufferType:
+ case kIROp_HLSLConsumeStructuredBufferType:
+ lowerStructuredBufferType(target, as<IRHLSLStructuredBufferTypeBase>(globalInst));
+ break;
+ }
+ }
+ }
+}
diff --git a/source/slang/slang-ir-lower-append-consume-structured-buffer.h b/source/slang/slang-ir-lower-append-consume-structured-buffer.h
new file mode 100644
index 000000000..81048724d
--- /dev/null
+++ b/source/slang/slang-ir-lower-append-consume-structured-buffer.h
@@ -0,0 +1,17 @@
+// slang-ir-lower-append-consume-structured-buffer.h
+#pragma once
+
+#include "slang-ir.h"
+
+namespace Slang
+{
+ struct IRModule;
+ class DiagnosticSink;
+ class TargetRequest;
+
+ /// For non-hlsl targets, lower append- and consume- structured buffers into `struct` types
+ /// that contains two RWStructuredBuffer typed fields, one to store the elements, and one
+ /// for the atomic buffer.
+ void lowerAppendConsumeStructuredBuffers(TargetRequest* target, IRModule* module, DiagnosticSink* sink);
+
+}
diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp
index cdf1f3694..978fa6fbb 100644
--- a/source/slang/slang-type-layout.cpp
+++ b/source/slang/slang-type-layout.cpp
@@ -715,6 +715,7 @@ static LayoutResourceKind _getHLSLLayoutResourceKind(ShaderParameterKind kind)
case ShaderParameterKind::MutableRawBuffer:
case ShaderParameterKind::MutableBuffer:
case ShaderParameterKind::MutableTexture:
+ case ShaderParameterKind::AppendConsumeStructuredBuffer:
return LayoutResourceKind::UnorderedAccess;
case ShaderParameterKind::SamplerState:
@@ -728,6 +729,13 @@ struct GLSLObjectLayoutRulesImpl : ObjectLayoutRulesImpl
{
virtual SimpleLayoutInfo GetObjectLayout(ShaderParameterKind kind, const Options& options) override
{
+ int slotCount = 1;
+
+ // In Vulkan GLSL, pretty much every object is just a descriptor-table slot.
+ // Except for AppendConsumeStructuredBuffer, which takes two slots.
+ if (kind == ShaderParameterKind::AppendConsumeStructuredBuffer)
+ slotCount = 2;
+
if (options.hlslToVulkanKindFlags)
{
// Is this an HLSL kind that might be shifted
@@ -745,14 +753,12 @@ struct GLSLObjectLayoutRulesImpl : ObjectLayoutRulesImpl
{
// We are going to consume a HLSL layout kind
// Later we will do shifting as necessary
- return SimpleLayoutInfo(hlslLayoutKind, 1);
+ return SimpleLayoutInfo(hlslLayoutKind, slotCount);
}
}
}
- // In Vulkan GLSL, pretty much every object is just a descriptor-table slot.
- // We can refine this method once we support a case where this isn't true.
- return SimpleLayoutInfo(LayoutResourceKind::DescriptorTableSlot, 1);
+ return SimpleLayoutInfo(LayoutResourceKind::DescriptorTableSlot, slotCount);
}
};
GLSLObjectLayoutRulesImpl kGLSLObjectLayoutRulesImpl;
@@ -799,6 +805,7 @@ struct HLSLObjectLayoutRulesImpl : ObjectLayoutRulesImpl
case ShaderParameterKind::MutableRawBuffer:
case ShaderParameterKind::MutableBuffer:
case ShaderParameterKind::MutableTexture:
+ case ShaderParameterKind::AppendConsumeStructuredBuffer:
return SimpleLayoutInfo(LayoutResourceKind::UnorderedAccess, 1);
case ShaderParameterKind::SamplerState:
@@ -974,6 +981,7 @@ struct CPUObjectLayoutRulesImpl : ObjectLayoutRulesImpl
case ShaderParameterKind::StructuredBuffer:
case ShaderParameterKind::MutableStructuredBuffer:
+ case ShaderParameterKind::AppendConsumeStructuredBuffer:
// It's a ptr and a size of the amount of elements
return SimpleLayoutInfo(LayoutResourceKind::Uniform, sizeof(void*) * 2, SLANG_ALIGN_OF(void*));
@@ -1033,6 +1041,7 @@ struct CUDAObjectLayoutRulesImpl : CPUObjectLayoutRulesImpl
case ShaderParameterKind::StructuredBuffer:
case ShaderParameterKind::MutableStructuredBuffer:
+ case ShaderParameterKind::AppendConsumeStructuredBuffer:
{
// It's a ptr and a count of the amount of elements
const size_t size = _roundToAlignment(sizeof(CUDAPtr) + sizeof(CUDACount), sizeof(CUDAPtr));
@@ -3763,8 +3772,8 @@ static TypeLayoutResult _createTypeLayout(
CASE(HLSLStructuredBufferType, StructuredBuffer);
CASE(HLSLRWStructuredBufferType, MutableStructuredBuffer);
CASE(HLSLRasterizerOrderedStructuredBufferType, MutableStructuredBuffer);
- CASE(HLSLAppendStructuredBufferType, MutableStructuredBuffer);
- CASE(HLSLConsumeStructuredBufferType, MutableStructuredBuffer);
+ CASE(HLSLAppendStructuredBufferType, AppendConsumeStructuredBuffer);
+ CASE(HLSLConsumeStructuredBufferType, AppendConsumeStructuredBuffer);
#undef CASE
diff --git a/source/slang/slang-type-layout.h b/source/slang/slang-type-layout.h
index af07f3e73..e3dd719d6 100644
--- a/source/slang/slang-type-layout.h
+++ b/source/slang/slang-type-layout.h
@@ -935,6 +935,8 @@ enum class ShaderParameterKind
MutableImage,
RegisterSpace,
+
+ AppendConsumeStructuredBuffer,
};
struct SimpleLayoutRulesImpl
diff --git a/tests/bugs/texture2d-ms.hlsl.glsl b/tests/bugs/texture2d-ms.hlsl.glsl
index 40ce5f9de..013d7d7bd 100644
--- a/tests/bugs/texture2d-ms.hlsl.glsl
+++ b/tests/bugs/texture2d-ms.hlsl.glsl
@@ -5,7 +5,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform texture2DMS tex_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_float4_t_0 {
vec4 _data[];
} outBuffer_0;
layout(local_size_x = 4, local_size_y = 4, local_size_z = 1) in;
diff --git a/tests/bugs/vk-structured-buffer-binding.hlsl.glsl b/tests/bugs/vk-structured-buffer-binding.hlsl.glsl
index 7298ea594..f108aac00 100644
--- a/tests/bugs/vk-structured-buffer-binding.hlsl.glsl
+++ b/tests/bugs/vk-structured-buffer-binding.hlsl.glsl
@@ -2,25 +2,23 @@
//TEST_IGNORE_FILE:
#version 450
+layout(row_major) uniform;
+layout(row_major) buffer;
-#define gDoneGroups gDoneGroups_0
-#define uv _S3
-#define SV_Target _S2
-
-layout(std430, binding = 3, set = 4)
-buffer _S1
-{
+layout(std430, binding = 3, set = 4) buffer StructuredBuffer_uint_t_0 {
uint _data[];
-} gDoneGroups;
+} gDoneGroups_0;
layout(location = 0)
-out vec4 SV_Target;
+out vec4 _S1;
layout(location = 0)
-in vec3 uv;
+in vec3 _S2;
void main()
{
- SV_Target = vec4(gDoneGroups._data[uint(int(uv.z))]);
+ _S1 = vec4(float(gDoneGroups_0._data[uint(int(_S2.z))]));
return;
}
+
+
diff --git a/tests/bugs/vk-structured-buffer-load.hlsl.glsl b/tests/bugs/vk-structured-buffer-load.hlsl.glsl
index 0184e6ed5..35fad779b 100644
--- a/tests/bugs/vk-structured-buffer-load.hlsl.glsl
+++ b/tests/bugs/vk-structured-buffer-load.hlsl.glsl
@@ -2,9 +2,11 @@
#extension GL_NV_ray_tracing : require
layout(row_major) uniform;
layout(row_major) buffer;
-layout(std430, binding = 1) readonly buffer _S1 {
+
+layout(std430, binding = 1) readonly buffer StructuredBuffer_float_t_0 {
float _data[];
} gParamBlock_sbuf_0;
+
float rcp_0(float x_0)
{
return 1.0 / x_0;
@@ -15,35 +17,37 @@ struct RayHitInfoPacked_0
vec4 PackedHitInfoA_0;
};
-rayPayloadInNV RayHitInfoPacked_0 _S2;
+rayPayloadInNV RayHitInfoPacked_0 _S1;
struct BuiltInTriangleIntersectionAttributes_0
{
vec2 barycentrics_0;
};
-hitAttributeNV BuiltInTriangleIntersectionAttributes_0 _S3;
+hitAttributeNV BuiltInTriangleIntersectionAttributes_0 _S2;
void main()
{
float HitT_0 = ((gl_RayTmaxNV));
- _S2.PackedHitInfoA_0.x = HitT_0;
+ _S1.PackedHitInfoA_0[0] = HitT_0;
+
+ float offsfloat_0 = gParamBlock_sbuf_0._data[0];
- float offsfloat_0 = ((gParamBlock_sbuf_0)._data[(0)]);
uint use_rcp_0 = 0U | uint(HitT_0 > 0.0);
+
if(use_rcp_0 != 0U)
{
- _S2.PackedHitInfoA_0.y = rcp_0(offsfloat_0);
+ _S1.PackedHitInfoA_0[1] = rcp_0(offsfloat_0);
}
else
{
if(use_rcp_0 > 0U&&offsfloat_0 == 0.0)
{
- _S2.PackedHitInfoA_0.y = (inversesqrt((offsfloat_0 + 1.0)));
+ _S1.PackedHitInfoA_0[1] = (inversesqrt((offsfloat_0 + 1.0)));
}
else
{
- _S2.PackedHitInfoA_0.y = (inversesqrt((offsfloat_0)));
+ _S1.PackedHitInfoA_0[1] = (inversesqrt((offsfloat_0)));
}
}
return;
diff --git a/tests/compute/comma-operator.slang.glsl b/tests/compute/comma-operator.slang.glsl
index af7120704..236029b47 100644
--- a/tests/compute/comma-operator.slang.glsl
+++ b/tests/compute/comma-operator.slang.glsl
@@ -3,7 +3,7 @@
//TEST_IGNORE_FILE:
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_int_t_0 {
int _data[];
} outputBuffer_0;
diff --git a/tests/compute/half-texture.slang.glsl b/tests/compute/half-texture.slang.glsl
index 27f63620d..16ff4d6e1 100644
--- a/tests/compute/half-texture.slang.glsl
+++ b/tests/compute/half-texture.slang.glsl
@@ -17,7 +17,7 @@ layout(rgba16f)
layout(binding = 3)
uniform image2D halfTexture4_0;
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_int_t_0 {
int _data[];
} outputBuffer_0;
diff --git a/tests/compute/unbounded-array-of-array-syntax.slang.glsl b/tests/compute/unbounded-array-of-array-syntax.slang.glsl
index 73148ae10..2ea90e4a6 100644
--- a/tests/compute/unbounded-array-of-array-syntax.slang.glsl
+++ b/tests/compute/unbounded-array-of-array-syntax.slang.glsl
@@ -1,28 +1,23 @@
//TEST_IGNORE_FILE:
-
#version 450
#extension GL_EXT_nonuniform_qualifier : require
layout(row_major) uniform;
layout(row_major) buffer;
-
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_int_t_0 {
int _data[];
} g_aoa_0[];
-layout(std430, binding = 0) buffer _S2 {
+layout(std430, binding = 0) buffer StructuredBuffer_int_t_1 {
int _data[];
} outputBuffer_0;
-
layout(local_size_x = 8, local_size_y = 1, local_size_z = 1) in;
void main()
{
int index_0 = int(gl_GlobalInvocationID.x);
int innerIndex_0 = index_0 & 3;
-
- int _S3 = nonuniformEXT(index_0 >> 2);
+ int _S1 = nonuniformEXT(index_0 >> 2);
uint bufferCount_0;
uint bufferStride_0;
- (bufferCount_0) = (g_aoa_0[_S3])._data.length(); (bufferStride_0) = 0;
-
+ (bufferCount_0) = (g_aoa_0[_S1])._data.length(); (bufferStride_0) = 0;
int innerIndex_1;
if(innerIndex_0 >= int(bufferCount_0))
{
@@ -32,6 +27,6 @@ void main()
{
innerIndex_1 = innerIndex_0;
}
- outputBuffer_0._data[uint(index_0)] = g_aoa_0[_S3]._data[uint(innerIndex_1)];
+ outputBuffer_0._data[uint(index_0)] = g_aoa_0[_S1]._data[uint(innerIndex_1)];
return;
}
diff --git a/tests/cross-compile/array-of-buffers.slang.glsl b/tests/cross-compile/array-of-buffers.slang.glsl
index a198a5277..fb1a4be2f 100644
--- a/tests/cross-compile/array-of-buffers.slang.glsl
+++ b/tests/cross-compile/array-of-buffers.slang.glsl
@@ -10,8 +10,7 @@ layout(binding = 0)
layout(std140) uniform _S1
{
uint index_0;
-} C_0;
-
+}C_0;
struct S_0
{
vec4 f_0;
@@ -21,23 +20,25 @@ layout(binding = 1)
layout(std140) uniform _S2
{
vec4 f_0;
-} cb_0[3];
-layout(std430, binding = 2) readonly buffer _S3 {
+}cb_0[3];
+layout(std430, binding = 2) readonly buffer StructuredBuffer_S_t_0 {
S_0 _data[];
} sb1_0[4];
-layout(std430, binding = 3) buffer _S4 {
+layout(std430, binding = 3) buffer StructuredBuffer_float4_t_0 {
vec4 _data[];
} sb2_0[5];
-layout(std430, binding = 4) readonly buffer _S5
+layout(std430, binding = 4) readonly buffer _S3
{
uint _data[];
} bb_0[6];
layout(location = 0)
-out vec4 _S6;
+out vec4 _S4;
void main()
{
- uint _S7 = ((bb_0[C_0.index_0])._data[(int(C_0.index_0 * 4U))/4]);
- _S6 = cb_0[C_0.index_0].f_0 + sb1_0[C_0.index_0]._data[C_0.index_0].f_0 + sb2_0[C_0.index_0]._data[C_0.index_0] + vec4(float(_S7));
+
+ uint _S5 = ((bb_0[C_0.index_0])._data[(int(C_0.index_0 * 4U))/4]);
+ _S4 = cb_0[C_0.index_0].f_0 + sb1_0[C_0.index_0]._data[C_0.index_0].f_0 + sb2_0[C_0.index_0]._data[C_0.index_0] + vec4(float(_S5));
return;
}
+
diff --git a/tests/cross-compile/func-resource-param-array.slang.glsl b/tests/cross-compile/func-resource-param-array.slang.glsl
index 9e396e55f..0c4c44bef 100644
--- a/tests/cross-compile/func-resource-param-array.slang.glsl
+++ b/tests/cross-compile/func-resource-param-array.slang.glsl
@@ -1,37 +1,33 @@
#version 450
layout(row_major) uniform;
layout(row_major) buffer;
-
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_int_t_0 {
int _data[];
} a_0;
-
-layout(std430, binding = 1) buffer _S2 {
+layout(std430, binding = 1) buffer StructuredBuffer_int_t_1 {
int _data[];
} b_0[3];
-
-layout(std430, binding = 2) buffer _S3 {
+layout(std430, binding = 2) buffer StructuredBuffer_int_t_2 {
int _data[];
} c_0[4][3];
-
-int f_0(uint _S4)
+int f_0(uint _S1)
{
- return a_0._data[_S4];
+ return a_0._data[_S1];
}
-int f_1(uint _S5, uint _S6)
+int f_1(uint _S2, uint _S3)
{
- return b_0[_S5]._data[_S6];
+ return b_0[_S2]._data[_S3];
}
-int g_0(uint _S7, uint _S8)
+int g_0(uint _S4, uint _S5)
{
- return b_0[_S7]._data[_S8];
+ return b_0[_S4]._data[_S5];
}
-int g_1(uint _S9, uint _S10, uint _S11)
+int g_1(uint _S6, uint _S7, uint _S8)
{
- return c_0[_S9][_S10]._data[_S11];
+ return c_0[_S6][_S7]._data[_S8];
}
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected
index 4338e70ac..2bb288e11 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected
@@ -7,7 +7,7 @@ standard output = {
#extension GL_NV_shader_invocation_reorder : require
layout(row_major) uniform;
layout(row_major) buffer;
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct RayDesc_0
@@ -20,23 +20,23 @@ struct RayDesc_0
void main()
{
- uvec3 _S2 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S2.xy);
- uvec3 _S3 = ((gl_LaunchSizeEXT));
+ uvec3 _S1 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S1.xy);
+ uvec3 _S2 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
RayDesc_0 ray_0;
ray_0.Origin_0 = vec3(float(idx_0), 0.0, 0.0);
ray_0.TMin_0 = 0.00999999977648258209;
ray_0.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_0.TMax_0 = 10000.0;
- uint _S4 = uint(idx_0);
+ uint _S3 = uint(idx_0);
hitObjectNV hitObj_0;
- hitObjectRecordMissNV(hitObj_0, _S4, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
- uint _S5 = uint(idx_0 + 1);
+ hitObjectRecordMissNV(hitObj_0, _S3, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
+ uint _S4 = uint(idx_0 + 1);
hitObjectNV hitObj_1;
- hitObjectRecordMissNV(hitObj_1, _S5, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
- bool _S6 = (hitObjectIsMissNV((hitObj_1)));
- outputBuffer_0._data[_S4] = uint(int(_S6));
+ hitObjectRecordMissNV(hitObj_1, _S4, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
+ bool _S5 = (hitObjectIsMissNV((hitObj_1)));
+ outputBuffer_0._data[_S3] = uint(int(_S5));
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected
index 199fdc86b..12922d994 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected
@@ -10,7 +10,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform accelerationStructureEXT scene_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct SomeValues_0
@@ -33,11 +33,11 @@ struct RayDesc_0
RayDesc_0 HitObject_GetRayDesc_0(hitObjectNV this_0)
{
- vec3 _S2 = (hitObjectGetWorldRayOriginNV((this_0)));
- float _S3 = (hitObjectGetRayTMinNV((this_0)));
- vec3 _S4 = (hitObjectGetObjectRayDirectionNV((this_0)));
- float _S5 = (hitObjectGetRayTMaxNV((this_0)));
- RayDesc_0 ray_0 = { _S2, _S3, _S4, _S5 };
+ vec3 _S1 = (hitObjectGetWorldRayOriginNV((this_0)));
+ float _S2 = (hitObjectGetRayTMinNV((this_0)));
+ vec3 _S3 = (hitObjectGetObjectRayDirectionNV((this_0)));
+ float _S4 = (hitObjectGetRayTMaxNV((this_0)));
+ RayDesc_0 ray_0 = { _S1, _S2, _S3, _S4 };
return ray_0;
}
@@ -49,9 +49,9 @@ SomeValues_0 HitObject_GetAttributes_0(hitObjectNV this_1)
uint calcValue_0(hitObjectNV hit_0)
{
- bool _S6 = (hitObjectIsHitNV((hit_0)));
+ bool _S5 = (hitObjectIsHitNV((hit_0)));
uint r_0;
- if(_S6)
+ if(_S5)
{
uint instanceIndex_0 = (hitObjectGetInstanceCustomIndexNV((hit_0)));
uint instanceID_0 = (hitObjectGetInstanceIdNV((hit_0)));
@@ -66,8 +66,8 @@ uint calcValue_0(hitObjectNV hit_0)
}
else
{
- bool _S7 = (hitObjectIsMissNV((hit_0)));
- if(_S7)
+ bool _S6 = (hitObjectIsMissNV((hit_0)));
+ if(_S6)
{
r_0 = 1U;
}
@@ -81,30 +81,30 @@ uint calcValue_0(hitObjectNV hit_0)
void main()
{
- uvec3 _S8 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S8.xy);
- uvec3 _S9 = ((gl_LaunchSizeEXT));
+ uvec3 _S7 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S7.xy);
+ uvec3 _S8 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
RayDesc_0 ray_2;
ray_2.Origin_0 = vec3(float(idx_0), 0.0, 0.0);
ray_2.TMin_0 = 0.00999999977648258209;
ray_2.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_2.TMax_0 = 10000.0;
- uint _S10 = uint(idx_0);
- uint _S11 = uint(idx_0 * 2);
- uint _S12 = uint(idx_0 * 3);
- RayDesc_0 _S13 = ray_2;
+ uint _S9 = uint(idx_0);
+ uint _S10 = uint(idx_0 * 2);
+ uint _S11 = uint(idx_0 * 3);
+ RayDesc_0 _S12 = ray_2;
hitObjectNV hitObj_0;
+ int _S13 = int(_S9);
int _S14 = int(_S10);
int _S15 = int(_S11);
- int _S16 = int(_S12);
- hitObjectRecordHitWithIndexNV(hitObj_0, scene_0, _S14, _S15, _S16, 0U, 0U, _S13.Origin_0, _S13.TMin_0, _S13.Direction_0, _S13.TMax_0, (0));
+ hitObjectRecordHitWithIndexNV(hitObj_0, scene_0, _S13, _S14, _S15, 0U, 0U, _S12.Origin_0, _S12.TMin_0, _S12.Direction_0, _S12.TMax_0, (0));
uint r_3 = calcValue_0(hitObj_0);
- RayDesc_0 _S17 = ray_2;
+ RayDesc_0 _S16 = ray_2;
hitObjectNV hitObj_1;
- hitObjectRecordHitNV(hitObj_1, scene_0, _S14, _S16, _S15, 0U, 0U, 4U, _S17.Origin_0, _S17.TMin_0, _S17.Direction_0, _S17.TMax_0, (0));
- uint _S18 = calcValue_0(hitObj_1);
- outputBuffer_0._data[_S10] = r_3 + _S18;
+ hitObjectRecordHitNV(hitObj_1, scene_0, _S13, _S15, _S14, 0U, 0U, 4U, _S16.Origin_0, _S16.TMin_0, _S16.Direction_0, _S16.TMax_0, (0));
+ uint _S17 = calcValue_0(hitObj_1);
+ outputBuffer_0._data[_S9] = r_3 + _S17;
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected
index ed80f38d3..f74c8d5e9 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected
@@ -7,7 +7,7 @@ standard output = {
#extension GL_NV_shader_invocation_reorder : require
layout(row_major) uniform;
layout(row_major) buffer;
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct RayDesc_0
@@ -27,11 +27,11 @@ void main()
ray_0.TMin_0 = 0.00999999977648258209;
ray_0.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_0.TMax_0 = 10000.0;
- uint _S2 = uint(idx_0);
+ uint _S1 = uint(idx_0);
hitObjectNV hitObj_0;
- hitObjectRecordMissNV(hitObj_0, _S2, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
- bool _S3 = (hitObjectIsMissNV((hitObj_0)));
- outputBuffer_0._data[_S2] = uint(int(_S3));
+ hitObjectRecordMissNV(hitObj_0, _S1, ray_0.Origin_0, ray_0.TMin_0, ray_0.Direction_0, ray_0.TMax_0);
+ bool _S2 = (hitObjectIsMissNV((hitObj_0)));
+ outputBuffer_0._data[_S1] = uint(int(_S2));
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected
index c8136645c..2522ee2e5 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected
@@ -7,20 +7,20 @@ standard output = {
#extension GL_NV_shader_invocation_reorder : require
layout(row_major) uniform;
layout(row_major) buffer;
-layout(std430, binding = 0) buffer _S1 {
+layout(std430, binding = 0) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
void main()
{
- uvec3 _S2 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S2.xy);
- uvec3 _S3 = ((gl_LaunchSizeEXT));
+ uvec3 _S1 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S1.xy);
+ uvec3 _S2 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
hitObjectNV hitObj_0;
hitObjectRecordEmptyNV((hitObj_0));
- uint _S4 = uint(idx_0);
- bool _S5 = (hitObjectIsEmptyNV((hitObj_0)));
- outputBuffer_0._data[_S4] = uint(_S5);
+ uint _S3 = uint(idx_0);
+ bool _S4 = (hitObjectIsEmptyNV((hitObj_0)));
+ outputBuffer_0._data[_S3] = uint(_S4);
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected
index 2340caa21..f1c52d1ad 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected
@@ -10,7 +10,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform accelerationStructureEXT scene_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct MyAttributes_0
@@ -58,19 +58,19 @@ MyAttributes_0 HitObject_GetAttributes_0(hitObjectNV this_0)
void accumulate_0(inout uint value_2, hitObjectNV hit_0)
{
value_2 = value_2 * 256U;
- bool _S2 = (hitObjectIsHitNV((hit_0)));
- if(_S2)
+ bool _S1 = (hitObjectIsHitNV((hit_0)));
+ if(_S1)
{
- MyAttributes_0 _S3 = HitObject_GetAttributes_0(hit_0);
- value_2 = value_2 + (16U + _S3.value_0);
+ MyAttributes_0 _S2 = HitObject_GetAttributes_0(hit_0);
+ value_2 = value_2 + (16U + _S2.value_0);
}
return;
}
void main()
{
- uvec3 _S4 = ((gl_LaunchIDEXT));
- uint idx_1 = _S4.x;
+ uvec3 _S3 = ((gl_LaunchIDEXT));
+ uint idx_1 = _S3.x;
uint r_0 = 0U;
RayDesc_0 ray_1 = makeRay_0(idx_1, 0U);
hitObjectNV hitObj_0;
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected
index 00213c62d..28bd5c1d9 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected
@@ -10,7 +10,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform accelerationStructureEXT scene_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct SomeValues_0
@@ -39,9 +39,9 @@ SomeValues_0 HitObject_GetAttributes_0(hitObjectNV this_0)
uint calcValue_0(hitObjectNV hit_0)
{
- bool _S2 = (hitObjectIsHitNV((hit_0)));
+ bool _S1 = (hitObjectIsHitNV((hit_0)));
uint r_0;
- if(_S2)
+ if(_S1)
{
uint instanceIndex_0 = (hitObjectGetInstanceCustomIndexNV((hit_0)));
uint instanceID_0 = (hitObjectGetInstanceIdNV((hit_0)));
@@ -75,45 +75,45 @@ struct RayDesc_0
void main()
{
- uvec3 _S3 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S3.xy);
- uvec3 _S4 = ((gl_LaunchSizeEXT));
+ uvec3 _S2 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S2.xy);
+ uvec3 _S3 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
- float _S5 = float(idx_0);
- float _S6 = _S5 * 2.0;
+ float _S4 = float(idx_0);
+ float _S5 = _S4 * 2.0;
RayDesc_0 ray_0;
- ray_0.Origin_0 = vec3(_S5, 0.0, 0.0);
+ ray_0.Origin_0 = vec3(_S4, 0.0, 0.0);
ray_0.TMin_0 = 0.00999999977648258209;
ray_0.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_0.TMax_0 = 10000.0;
- RayDesc_0 _S7 = ray_0;
+ RayDesc_0 _S6 = ray_0;
hitObjectNV hitObj_0;
p_1.a_0 = idx_0;
- p_1.b_0 = _S6;
- hitObjectTraceRayNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S7.Origin_0, _S7.TMin_0, _S7.Direction_0, _S7.TMax_0, (1));
+ p_1.b_0 = _S5;
+ hitObjectTraceRayNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S6.Origin_0, _S6.TMin_0, _S6.Direction_0, _S6.TMax_0, (1));
uint r_1 = calcValue_0(hitObj_0);
reorderThreadNV(hitObj_0);
- float _S8 = _S5 * 4.0;
+ float _S7 = _S4 * 4.0;
SomeValues_0 otherValues_0;
otherValues_0.a_0 = idx_0 * -1;
- otherValues_0.b_0 = _S8;
+ otherValues_0.b_0 = _S7;
HitObject_Invoke_0(scene_0, hitObj_0, otherValues_0);
- uint _S9 = calcValue_0(hitObj_0);
- uint r_2 = r_1 + _S9;
+ uint _S8 = calcValue_0(hitObj_0);
+ uint r_2 = r_1 + _S8;
reorderThreadNV(hitObj_0, uint(idx_0 & 3), 2U);
- float _S10 = _S5 * 8.0;
+ float _S9 = _S4 * 8.0;
otherValues_0.a_0 = idx_0 * -2;
- otherValues_0.b_0 = _S10;
+ otherValues_0.b_0 = _S9;
HitObject_Invoke_0(scene_0, hitObj_0, otherValues_0);
- uint _S11 = calcValue_0(hitObj_0);
- uint r_3 = r_2 + _S11;
+ uint _S10 = calcValue_0(hitObj_0);
+ uint r_3 = r_2 + _S10;
reorderThreadNV(uint(idx_0 & 1), 1U);
- float _S12 = _S5 * 16.0;
+ float _S11 = _S4 * 16.0;
otherValues_0.a_0 = idx_0 * -4;
- otherValues_0.b_0 = _S12;
+ otherValues_0.b_0 = _S11;
HitObject_Invoke_0(scene_0, hitObj_0, otherValues_0);
- uint _S13 = calcValue_0(hitObj_0);
- outputBuffer_0._data[uint(idx_0)] = r_3 + _S13;
+ uint _S12 = calcValue_0(hitObj_0);
+ outputBuffer_0._data[uint(idx_0)] = r_3 + _S12;
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected
index 535a7ccb7..872c635f9 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected
@@ -11,7 +11,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform accelerationStructureEXT scene_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct SomeValues_0
@@ -36,9 +36,9 @@ SomeValues_0 HitObject_GetAttributes_0(hitObjectNV this_0)
uint calcValue_0(hitObjectNV hit_0)
{
- bool _S2 = (hitObjectIsHitNV((hit_0)));
+ bool _S1 = (hitObjectIsHitNV((hit_0)));
uint r_0;
- if(_S2)
+ if(_S1)
{
uint instanceIndex_0 = (hitObjectGetInstanceCustomIndexNV((hit_0)));
uint instanceID_0 = (hitObjectGetInstanceIdNV((hit_0)));
@@ -64,26 +64,26 @@ struct RayDesc_0
void main()
{
- uvec3 _S3 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S3.xy);
- uvec3 _S4 = ((gl_LaunchSizeEXT));
+ uvec3 _S2 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S2.xy);
+ uvec3 _S3 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
float currentTime_0 = float(idx_0 / 4);
- float _S5 = float(idx_0);
- float _S6 = _S5 * 2.0;
+ float _S4 = float(idx_0);
+ float _S5 = _S4 * 2.0;
RayDesc_0 ray_0;
- ray_0.Origin_0 = vec3(_S5, 0.0, 0.0);
+ ray_0.Origin_0 = vec3(_S4, 0.0, 0.0);
ray_0.TMin_0 = 0.00999999977648258209;
ray_0.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_0.TMax_0 = 10000.0;
- RayDesc_0 _S7 = ray_0;
+ RayDesc_0 _S6 = ray_0;
hitObjectNV hitObj_0;
p_0.a_0 = idx_0;
- p_0.b_0 = _S6;
- hitObjectTraceRayMotionNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S7.Origin_0, _S7.TMin_0, _S7.Direction_0, _S7.TMax_0, currentTime_0, (0));
- uint _S8 = uint(idx_0);
- uint _S9 = calcValue_0(hitObj_0);
- outputBuffer_0._data[_S8] = _S9;
+ p_0.b_0 = _S5;
+ hitObjectTraceRayMotionNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S6.Origin_0, _S6.TMin_0, _S6.Direction_0, _S6.TMax_0, currentTime_0, (0));
+ uint _S7 = uint(idx_0);
+ uint _S8 = calcValue_0(hitObj_0);
+ outputBuffer_0._data[_S7] = _S8;
return;
}
diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected
index b1441df72..c3aa6608c 100644
--- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected
+++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected
@@ -10,7 +10,7 @@ layout(row_major) buffer;
layout(binding = 0)
uniform accelerationStructureEXT scene_0;
-layout(std430, binding = 1) buffer _S1 {
+layout(std430, binding = 1) buffer StructuredBuffer_uint_t_0 {
uint _data[];
} outputBuffer_0;
struct SomeValues_0
@@ -35,9 +35,9 @@ SomeValues_0 HitObject_GetAttributes_0(hitObjectNV this_0)
uint calcValue_0(hitObjectNV hit_0)
{
- bool _S2 = (hitObjectIsHitNV((hit_0)));
+ bool _S1 = (hitObjectIsHitNV((hit_0)));
uint r_0;
- if(_S2)
+ if(_S1)
{
uint instanceIndex_0 = (hitObjectGetInstanceCustomIndexNV((hit_0)));
uint instanceID_0 = (hitObjectGetInstanceIdNV((hit_0)));
@@ -63,25 +63,25 @@ struct RayDesc_0
void main()
{
- uvec3 _S3 = ((gl_LaunchIDEXT));
- ivec2 launchID_0 = ivec2(_S3.xy);
- uvec3 _S4 = ((gl_LaunchSizeEXT));
+ uvec3 _S2 = ((gl_LaunchIDEXT));
+ ivec2 launchID_0 = ivec2(_S2.xy);
+ uvec3 _S3 = ((gl_LaunchSizeEXT));
int idx_0 = launchID_0.x;
- float _S5 = float(idx_0);
- float _S6 = _S5 * 2.0;
+ float _S4 = float(idx_0);
+ float _S5 = _S4 * 2.0;
RayDesc_0 ray_0;
- ray_0.Origin_0 = vec3(_S5, 0.0, 0.0);
+ ray_0.Origin_0 = vec3(_S4, 0.0, 0.0);
ray_0.TMin_0 = 0.00999999977648258209;
ray_0.Direction_0 = vec3(0.0, 1.0, 0.0);
ray_0.TMax_0 = 10000.0;
- RayDesc_0 _S7 = ray_0;
+ RayDesc_0 _S6 = ray_0;
hitObjectNV hitObj_0;
p_0.a_0 = idx_0;
- p_0.b_0 = _S6;
- hitObjectTraceRayNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S7.Origin_0, _S7.TMin_0, _S7.Direction_0, _S7.TMax_0, (0));
- uint _S8 = uint(idx_0);
- uint _S9 = calcValue_0(hitObj_0);
- outputBuffer_0._data[_S8] = _S9;
+ p_0.b_0 = _S5;
+ hitObjectTraceRayNV(hitObj_0, scene_0, 20U, 255U, 0U, 4U, 0U, _S6.Origin_0, _S6.TMin_0, _S6.Direction_0, _S6.TMax_0, (0));
+ uint _S7 = uint(idx_0);
+ uint _S8 = calcValue_0(hitObj_0);
+ outputBuffer_0._data[_S7] = _S8;
return;
}
diff --git a/tests/hlsl/append-structured-buffer.slang b/tests/hlsl/append-structured-buffer.slang
new file mode 100644
index 000000000..8d0352e85
--- /dev/null
+++ b/tests/hlsl/append-structured-buffer.slang
@@ -0,0 +1,43 @@
+
+//TEST:SIMPLE(filecheck=GLSL):-target glsl -profile glsl_450 -stage compute -entry computeMain
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv -profile glsl_450 -stage compute -entry computeMain
+
+//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -xslang -fvk-use-gl-layout
+
+//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+AppendStructuredBuffer<float2> appendBuffer;
+
+// GLSL: layout(std430, binding = 1) buffer StructuredBuffer_float2_t
+// GLSL: vec2 _data[];
+// GLSL: } appendBuffer_elements_0
+
+// GLSL: layout(std430, binding = 2) buffer StructuredBuffer_int_t
+// GLSL: int _data[];
+// GLSL: } appendBuffer_counter
+
+// GLSL: void AppendStructuredBuffer_Append_0(vec2 [[PARAM:[A-Za-z0-9_]+]])
+// GLSL: int [[COUNTER:[A-Za-z0-9_]+]] = atomicAdd(appendBuffer_counter_0._data[0], 1);
+// GLSL: appendBuffer_elements_0._data{{\[}}[[COUNTER]]{{\]}} = [[PARAM]];
+
+// GLSL: uvec2 StructuredBuffer_GetDimensions_0()
+// GLSL: {
+// GLSL: return uvec2(uint(appendBuffer_counter_0._data[0]), 8U);
+// GLSL: }
+
+// SPIRV: OpEntryPoint
+
+//TEST_INPUT:set inBuffer = ubuffer(data=[1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0], stride=4)
+RWByteAddressBuffer inBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ var g = inBuffer.Load<float4>(4);
+ appendBuffer.Append(g.xy);
+
+ uint numStructs, stride;
+ appendBuffer.GetDimensions(numStructs, stride);
+ outputBuffer[dispatchThreadID.x] = numStructs; // expect 1.0
+}
diff --git a/tests/hlsl/consume-structured-buffer.slang b/tests/hlsl/consume-structured-buffer.slang
new file mode 100644
index 000000000..3027b4184
--- /dev/null
+++ b/tests/hlsl/consume-structured-buffer.slang
@@ -0,0 +1,35 @@
+
+//TEST:SIMPLE(filecheck=GLSL):-target glsl -profile glsl_450 -stage compute -entry computeMain
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv -profile glsl_450 -stage compute -entry computeMain
+
+//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -xslang -fvk-use-gl-layout
+
+//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+ConsumeStructuredBuffer<float2> consumeBuffer;
+
+// GLSL: layout(std430, binding = 1) buffer StructuredBuffer_float2_t
+// GLSL: vec2 _data[];
+// GLSL: } consumeBuffer_elements_0
+
+// GLSL: layout(std430, binding = 2) buffer StructuredBuffer_int_t
+// GLSL: int _data[];
+// GLSL: } consumeBuffer_counter
+
+// GLSL: vec2 ConsumeStructuredBuffer_Consume_0()
+// GLSL: int [[COUNTER:[A-Za-z0-9_]+]] = atomicAdd(consumeBuffer_counter_0._data[0], -1);
+// GLSL: int [[COUNTER1:[A-Za-z0-9_]+]] = [[COUNTER]] - 1;
+// GLSL: if{{\s?}}([[COUNTER1]] >= 0)
+// GLSL: return consumeBuffer_elements_0._data{{\[}}[[COUNTER1]]{{\]}};
+// GLSL: else
+// GLSL: return vec2(0.0);
+
+// SPIRV: OpEntryPoint
+
+[numthreads(1, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ var v = consumeBuffer.Consume();
+ outputBuffer[dispatchThreadID.x] = v.x; // expect 1.0
+}
diff --git a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl
index e1a54a30a..b704eb2b9 100644
--- a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl
+++ b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl
@@ -28,7 +28,7 @@ layout(std140) uniform _S1
layout(binding = 0)
uniform accelerationStructureEXT myAccelerationStructure_0;
-layout(std430, binding = 1) buffer _S2 {
+layout(std430, binding = 1) buffer StructuredBuffer_int_t_0 {
int _data[];
} resultBuffer_0;
struct MyProceduralHitAttrs_0
@@ -81,40 +81,37 @@ void main()
rayQueryEXT query_0;
MyRayPayload_0 payload_5;
payload_5.value_1 = -1;
- rayQueryInitializeEXT((query_0), (myAccelerationStructure_0), (C_0.rayFlags_0 | 512), (C_0.instanceMask_0), (C_0.origin_0), (C_0.tMin_0), (C_0.direction_0), (C_0.tMax_0));
+ rayQueryInitializeEXT((query_0), (myAccelerationStructure_0), (C_0.rayFlags_0 | 512U), (C_0.instanceMask_0), (C_0.origin_0), (C_0.tMin_0), (C_0.direction_0), (C_0.tMax_0));
MyProceduralHitAttrs_0 committedProceduralAttrs_0;
for(;;)
{
- bool _S3 = rayQueryProceedEXT(query_0);
- if(!_S3)
+ bool _S2 = rayQueryProceedEXT(query_0);
+ if(!_S2)
{
break;
}
- uint _S4 = (rayQueryGetIntersectionTypeEXT((query_0), false));
+ uint _S3 = (rayQueryGetIntersectionTypeEXT((query_0), false));
MyProceduralHitAttrs_0 committedProceduralAttrs_1;
- switch(_S4)
+ switch(_S3)
{
case 1U:
{
MyProceduralHitAttrs_0 candidateProceduralAttrs_0;
candidateProceduralAttrs_0.value_0 = 0;
float tHit_1 = 0.0;
- bool _S5 = myProceduralIntersection_0(tHit_1, candidateProceduralAttrs_0);
- if(_S5)
+ bool _S4 = myProceduralIntersection_0(tHit_1, candidateProceduralAttrs_0);
+ if(_S4)
{
- bool _S6 = myProceduralAnyHit_0(payload_5);
- if(_S6)
+ bool _S5 = myProceduralAnyHit_0(payload_5);
+ if(_S5)
{
rayQueryGenerateIntersectionEXT(query_0, tHit_1);
- MyProceduralHitAttrs_0 _S7 = candidateProceduralAttrs_0;
+ MyProceduralHitAttrs_0 _S6 = candidateProceduralAttrs_0;
if(C_0.shouldStopAtFirstHit_0 != 0U)
{
rayQueryTerminateEXT(query_0);
}
- else
- {
- }
- committedProceduralAttrs_1 = _S7;
+ committedProceduralAttrs_1 = _S6;
}
else
{
@@ -129,20 +126,14 @@ void main()
}
case 0U:
{
- bool _S8 = myTriangleAnyHit_0(payload_5);
- if(_S8)
+ bool _S7 = myTriangleAnyHit_0(payload_5);
+ if(_S7)
{
rayQueryConfirmIntersectionEXT(query_0);
if(C_0.shouldStopAtFirstHit_0 != 0U)
{
rayQueryTerminateEXT(query_0);
}
- else
- {
- }
- }
- else
- {
}
committedProceduralAttrs_1 = committedProceduralAttrs_0;
break;
@@ -155,8 +146,8 @@ void main()
}
committedProceduralAttrs_0 = committedProceduralAttrs_1;
}
- uint _S9 = (rayQueryGetIntersectionTypeEXT((query_0), true));
- switch(_S9)
+ uint _S8 = (rayQueryGetIntersectionTypeEXT((query_0), true));
+ switch(_S8)
{
case 1U:
{
@@ -178,6 +169,8 @@ void main()
break;
}
}
- ((resultBuffer_0)._data[(index_0)]) = payload_5.value_1;
+ resultBuffer_0._data[index_0] = payload_5.value_1;
return;
}
+
+
diff --git a/tests/slang-extension/atomic-float-byte-address-buffer-cross.slang.glsl b/tests/slang-extension/atomic-float-byte-address-buffer-cross.slang.glsl
index 4fb647199..330e76d11 100644
--- a/tests/slang-extension/atomic-float-byte-address-buffer-cross.slang.glsl
+++ b/tests/slang-extension/atomic-float-byte-address-buffer-cross.slang.glsl
@@ -2,34 +2,64 @@
#extension GL_EXT_shader_atomic_float : require
layout(row_major) uniform;
layout(row_major) buffer;
-layout(std430, binding = 1) buffer _S1 {
+
+#line 11 "tests/slang-extension/atomic-float-byte-address-buffer-cross.slang"
+layout(std430, binding = 1) buffer StructuredBuffer_float_t_0 {
float _data[];
} anotherBuffer_0;
-layout(std430, binding = 0) buffer _S2 {
+
+#line 11
+layout(std430, binding = 0) buffer StructuredBuffer_float_t_1 {
float _data[];
-} _S3;
-void RWByteAddressBuffer_InterlockedAddF32_0(uint _S4, float _S5, out float _S6)
+} outputBuffer_0;
+
+#line 1264 "core.meta.slang"
+void RWByteAddressBuffer_InterlockedAddF32_0(uint _S1, float _S2, out float _S3)
{
- float _S7 = (atomicAdd((((_S3)._data[(_S4 / 4U)])), (_S5)));
- _S6 = _S7;
+
+#line 391 "hlsl.meta.slang"
+ float _S4 = (atomicAdd((outputBuffer_0._data[_S1 / 4U]), (_S2)));
+
+#line 391
+ _S3 = _S4;
return;
}
-void RWByteAddressBuffer_InterlockedAddF32_1(uint _S8, float _S9)
+
+#line 392
+void RWByteAddressBuffer_InterlockedAddF32_1(uint _S5, float _S6)
{
- float _S10 = (atomicAdd((((_S3)._data[(_S8 / 4U)])), (_S9)));
+
+#line 406
+ float _S7 = (atomicAdd((outputBuffer_0._data[_S5 / 4U]), (_S6)));
return;
}
+
+#line 14 "tests/slang-extension/atomic-float-byte-address-buffer-cross.slang"
layout(local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
void main()
{
+
+#line 16
uint tid_0 = gl_GlobalInvocationID.x;
- uint _S11 = tid_0 >> 2;
- int idx_0 = int(tid_0 & 3U ^ _S11);
- float delta_0 = ((anotherBuffer_0)._data[(uint(idx_0 & 3))]);
+ uint _S8 = tid_0 >> 2;
+
+#line 17
+ int idx_0 = int(tid_0 & 3U ^ _S8);
+
+ float delta_0 = anotherBuffer_0._data[uint(idx_0 & 3)];
+
float previousValue_0 = 0.0;
+
+#line 21
RWByteAddressBuffer_InterlockedAddF32_0(uint(idx_0 << 2), 1.0, previousValue_0);
- RWByteAddressBuffer_InterlockedAddF32_1(uint(int(_S11) << 2), delta_0);
+
+#line 21
+ RWByteAddressBuffer_InterlockedAddF32_1(uint(int(_S8) << 2), delta_0);
+
+#line 27
return;
}
+
+
diff --git a/tests/vkray/closesthit.slang.glsl b/tests/vkray/closesthit.slang.glsl
index 6094b3a3d..bb3e81f87 100644
--- a/tests/vkray/closesthit.slang.glsl
+++ b/tests/vkray/closesthit.slang.glsl
@@ -3,17 +3,17 @@
#extension GL_NV_ray_tracing : require
#define tmp_shaderrecord _S1
-#define tmp_colors _S2
-#define tmp_hitattrs _S3
-#define tmp_payload _S4
-#define tmp_customidx _S5
-#define tmp_instanceid _S6
-#define tmp_add_0 _S7
-#define tmp_primid _S8
-#define tmp_add_1 _S9
-#define tmp_hitkind _S10
-#define tmp_hitt _S11
-#define tmp_tmin _S12
+#define tmp_colors StructuredBuffer_float4_t_0
+#define tmp_hitattrs _S2
+#define tmp_payload _S3
+#define tmp_customidx _S4
+#define tmp_instanceid _S5
+#define tmp_add_0 _S6
+#define tmp_primid _S7
+#define tmp_add_1 _S8
+#define tmp_hitkind _S9
+#define tmp_hitt _S10
+#define tmp_tmin _S11
struct SLANG_ParameterGroup_ShaderRecord_0
{
diff --git a/tests/vkray/entry-point-params.slang.glsl b/tests/vkray/entry-point-params.slang.glsl
index 00d2ba630..a505b337e 100644
--- a/tests/vkray/entry-point-params.slang.glsl
+++ b/tests/vkray/entry-point-params.slang.glsl
@@ -15,7 +15,7 @@
#endif
layout(std430, binding = 0)
-buffer _S1 {
+buffer StructuredBuffer_float_t_0 {
float _data[];
} buffer_0;
@@ -25,14 +25,14 @@ struct EntryPointParams_0
};
layout(shaderRecordEXT)
-buffer _S2
+buffer _S1
{
float value_0;
-} _S3;
+} _S2;
void main()
{
- uvec3 _S4 = gl_LaunchIDEXT;
- buffer_0._data[_S4.x] = _S3.value_0;
+ uvec3 _S3 = gl_LaunchIDEXT;
+ buffer_0._data[_S3.x] = _S2.value_0;
return;
}