summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2024-10-29 14:49:26 +0800
committerGitHub <noreply@github.com>2024-10-29 14:49:26 +0800
commitf65d756bff8d4c5cbc15bd0322a2ae8e6b896a21 (patch)
treeea1d61342cd29368e19135000ec2948813096205 /source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
parenta729c15e9dce9f5116a38afc66329ab2ca4cea54 (diff)
format
* format * Minor test fixes * enable checking cpp format in ci
Diffstat (limited to 'source/slang/slang-ir-lower-append-consume-structured-buffer.cpp')
-rw-r--r--source/slang/slang-ir-lower-append-consume-structured-buffer.cpp553
1 files changed, 307 insertions, 246 deletions
diff --git a/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp b/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
index ac8a8b5e7..c528669d7 100644
--- a/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
+++ b/source/slang/slang-ir-lower-append-consume-structured-buffer.cpp
@@ -1,272 +1,333 @@
#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"
+#include "slang-ir-util.h"
+#include "slang-ir.h"
namespace Slang
{
- static void lowerStructuredBufferType(TargetProgram* target, IRHLSLStructuredBufferTypeBase* type)
+static void lowerStructuredBufferType(TargetProgram* 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 << ">";
+ builder.addNameHintDecoration(structType, nameSb.produceString().getUnownedSlice());
+
+ auto elementBufferKey = builder.createStructKey();
+ builder.addNameHintDecoration(elementBufferKey, UnownedStringSlice("elements"));
+
+ auto counterBufferKey = builder.createStructKey();
+ builder.addNameHintDecoration(counterBufferKey, UnownedStringSlice("counter"));
+
+ builder.addDecoration(elementBufferKey, kIROp_CounterBufferDecoration, counterBufferKey);
+
+ IRInst* operands[2] = {elementType, type->getDataLayout()};
+ auto elementBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, 2, operands);
+
+ operands[0] = builder.getIntType();
+ operands[1] = builder.getType(kIROp_DefaultBufferLayoutType);
+ auto counterBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, 2, operands);
+
+ builder.createStructField(structType, elementBufferKey, elementBufferType);
+ builder.createStructField(structType, counterBufferKey, counterBufferType);
+
+ // Type layout.
+ auto layoutRules = getTypeLayoutRuleForBuffer(target, type);
+
+ IRTypeLayout::Builder elementTypeLayoutBuilder(&builder);
+ IRSizeAndAlignment elementSize;
+ getSizeAndAlignment(target->getOptionSet(), 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)
{
- 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 << ">";
- builder.addNameHintDecoration(structType, nameSb.produceString().getUnownedSlice());
-
- auto elementBufferKey = builder.createStructKey();
- builder.addNameHintDecoration(elementBufferKey, UnownedStringSlice("elements"));
-
- auto counterBufferKey = builder.createStructKey();
- builder.addNameHintDecoration(counterBufferKey, UnownedStringSlice("counter"));
-
- builder.addDecoration(elementBufferKey, kIROp_CounterBufferDecoration, counterBufferKey);
-
- IRInst* operands[2] = { elementType, type->getDataLayout() };
- auto elementBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, 2, operands);
-
- operands[0] = builder.getIntType();
- operands[1] = builder.getType(kIROp_DefaultBufferLayoutType);
- auto counterBufferType = builder.getType(kIROp_HLSLRWStructuredBufferType, 2, operands);
-
- builder.createStructField(structType, elementBufferKey, elementBufferType);
- builder.createStructField(structType, counterBufferKey, counterBufferType);
-
- // Type layout.
- auto layoutRules = getTypeLayoutRuleForBuffer(target, type);
-
- IRTypeLayout::Builder elementTypeLayoutBuilder(&builder);
- IRSizeAndAlignment elementSize;
- getSizeAndAlignment(target->getOptionSet(), 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;
+ // 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);
+ IRInst* atomicIncArgs[] = {
+ counterBufferPtr,
+ builder.getIntValue(builder.getIntType(), kIRMemoryOrder_Relaxed)};
+ auto oldCounter =
+ builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicInc, 2, atomicIncArgs);
+
+ 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);
+ IRInst* atomicDecArgs[] = {
+ counterBufferPtr,
+ builder.getIntValue(builder.getIntType(), kIRMemoryOrder_Relaxed)};
+ auto oldCounter =
+ builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicDec, 2, atomicDecArgs);
+ 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();
+ }
- 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);
- IRInst* atomicIncArgs[] = { counterBufferPtr, builder.getIntValue(builder.getIntType(), kIRMemoryOrder_Relaxed) };
- auto oldCounter = builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicInc, 2, atomicIncArgs);
-
- 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);
- IRInst* atomicDecArgs[] = { counterBufferPtr, builder.getIntValue(builder.getIntType(), kIRMemoryOrder_Relaxed) };
- auto oldCounter = builder.emitIntrinsicInst(builder.getIntType(), kIROp_AtomicDec, 2, atomicDecArgs);
- 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 elementBuffer =
+ builder.emitFieldExtract(elementBufferType, bufferParam, elementBufferKey);
+
+ const auto dim = builder.emitIntrinsicInst(
+ uint2Type,
+ kIROp_StructuredBufferGetDimensions,
+ 1,
+ &elementBuffer);
+ builder.emitReturn(dim);
+ }
- // GetDimensions method.
+ // Replace all insts with synthesized functions.
+ traverseUsers(
+ type,
+ [&](IRInst* typeUser)
{
- 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 elementBuffer = builder.emitFieldExtract(elementBufferType, bufferParam, elementBufferKey);
-
- const auto dim = builder.emitIntrinsicInst(
- uint2Type,
- kIROp_StructuredBufferGetDimensions,
- 1,
- &elementBuffer
- );
- builder.emitReturn(dim);
- }
-
- // Replace all insts with synthesized functions.
- traverseUsers(type, [&](IRInst* typeUser)
+ if (typeUser->getFullType() != type)
+ return;
+ if (auto layoutDecor = typeUser->findDecoration<IRLayoutDecoration>())
{
- 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()))
{
- // 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);
- IRVarOffsetAttr* uavOffsetAttr = nullptr;
- IRVarOffsetAttr* descriptorTableSlotOffsetAttr = nullptr;
+ IRBuilder subBuilder(typeUser);
+ IRVarLayout::Builder newVarLayoutBuilder(&subBuilder, typeLayout);
+ newVarLayoutBuilder.cloneEverythingButOffsetsFrom(varLayout);
+ IRVarOffsetAttr* uavOffsetAttr = nullptr;
+ IRVarOffsetAttr* descriptorTableSlotOffsetAttr = nullptr;
- for (auto offsetAttr : varLayout->getOffsetAttrs())
+ for (auto offsetAttr : varLayout->getOffsetAttrs())
+ {
+ if (offsetAttr->getResourceKind() == LayoutResourceKind::UnorderedAccess)
+ uavOffsetAttr = offsetAttr;
+ else if (
+ offsetAttr->getResourceKind() ==
+ LayoutResourceKind::DescriptorTableSlot)
+ descriptorTableSlotOffsetAttr = offsetAttr;
+ auto info = newVarLayoutBuilder.findOrAddResourceInfo(
+ offsetAttr->getResourceKind());
+ info->offset = offsetAttr->getOffset();
+ info->space = offsetAttr->getSpace();
+ info->kind = offsetAttr->getResourceKind();
+ }
+ // If the user provided an layout offset for UAV but not for descriptor table
+ // slot, then we use the UAV offset for the descriptor table slot offset.
+ if (uavOffsetAttr && !descriptorTableSlotOffsetAttr)
+ {
+ auto info = newVarLayoutBuilder.findOrAddResourceInfo(
+ LayoutResourceKind::DescriptorTableSlot);
+ info->offset = uavOffsetAttr->getOffset();
+ info->space = uavOffsetAttr->getSpace();
+ info->kind = LayoutResourceKind::DescriptorTableSlot;
+ }
+ auto newVarLayout = newVarLayoutBuilder.build();
+ subBuilder.addLayoutDecoration(typeUser, newVarLayout);
+ varLayout->removeAndDeallocate();
+ }
+ }
+ traverseUses(
+ typeUser,
+ [&](IRUse* use)
+ {
+ auto user = use->getUser();
+ switch (user->getOp())
+ {
+ case kIROp_StructuredBufferAppend:
{
- if (offsetAttr->getResourceKind() == LayoutResourceKind::UnorderedAccess)
- uavOffsetAttr = offsetAttr;
- else if (offsetAttr->getResourceKind() == LayoutResourceKind::DescriptorTableSlot)
- descriptorTableSlotOffsetAttr = offsetAttr;
- auto info = newVarLayoutBuilder.findOrAddResourceInfo(offsetAttr->getResourceKind());
- info->offset = offsetAttr->getOffset();
- info->space = offsetAttr->getSpace();
- info->kind = offsetAttr->getResourceKind();
+ 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;
}
- // If the user provided an layout offset for UAV but not for descriptor table slot, then
- // we use the UAV offset for the descriptor table slot offset.
- if (uavOffsetAttr && !descriptorTableSlotOffsetAttr)
+ case kIROp_StructuredBufferConsume:
{
- auto info = newVarLayoutBuilder.findOrAddResourceInfo(LayoutResourceKind::DescriptorTableSlot);
- info->offset = uavOffsetAttr->getOffset();
- info->space = uavOffsetAttr->getSpace();
- info->kind = LayoutResourceKind::DescriptorTableSlot;
+ 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;
}
- auto newVarLayout = newVarLayoutBuilder.build();
- subBuilder.addLayoutDecoration(typeUser, newVarLayout);
- varLayout->removeAndDeallocate();
- }
- }
- traverseUses(typeUser, [&](IRUse* use)
- {
- auto user = use->getUser();
- switch (user->getOp())
+ case kIROp_StructuredBufferGetDimensions:
{
- 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;
- }
+ 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);
- }
+ }
+ });
+ });
+ type->replaceUsesWith(structType);
+}
- void lowerAppendConsumeStructuredBuffers(TargetProgram* target, IRModule* module, DiagnosticSink* sink)
+void lowerAppendConsumeStructuredBuffers(
+ TargetProgram* target,
+ IRModule* module,
+ DiagnosticSink* sink)
+{
+ SLANG_UNUSED(sink);
+ for (auto globalInst : module->getGlobalInsts())
{
- SLANG_UNUSED(sink);
- for (auto globalInst : module->getGlobalInsts())
+ switch (globalInst->getOp())
{
- switch (globalInst->getOp())
- {
- case kIROp_HLSLAppendStructuredBufferType:
- case kIROp_HLSLConsumeStructuredBufferType:
- lowerStructuredBufferType(target, as<IRHLSLStructuredBufferTypeBase>(globalInst));
- break;
- }
+ case kIROp_HLSLAppendStructuredBufferType:
+ case kIROp_HLSLConsumeStructuredBufferType:
+ lowerStructuredBufferType(target, as<IRHLSLStructuredBufferTypeBase>(globalInst));
+ break;
}
}
}
+} // namespace Slang