summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-11-16 21:23:13 -0800
committerGitHub <noreply@github.com>2023-11-16 21:23:13 -0800
commit240aa243527eabcf87c30aabf9749396de47b1b2 (patch)
tree00fd10c993aba5a5efee8e3bb698914efc6afe5a /source/slang
parent6732f571e301754f6edc799b871f5e443eb9a9b8 (diff)
GLSL/SPIRV Fixes. (#3337)
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-emit-spirv.cpp6
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp2
-rw-r--r--source/slang/slang-ir-inst-defs.h1
-rw-r--r--source/slang/slang-ir-insts.h5
-rw-r--r--source/slang/slang-ir-spirv-legalize.cpp16
-rw-r--r--source/slang/slang-ir-translate-glsl-global-var.cpp3
6 files changed, 27 insertions, 6 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 4c802641d..869484ab9 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -1894,6 +1894,12 @@ struct SPIRVEmitContext
emitOpDecorate(getSection(SpvLogicalSectionID::Annotations), nullptr, varInst, SpvDecorationFlat);
}
}
+
+ if (var->findDecorationImpl(kIROp_RequireSPIRVDescriptorIndexingExtensionDecoration))
+ {
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_EXT_descriptor_indexing"));
+ requireSPIRVCapability(SpvCapabilityRuntimeDescriptorArray);
+ }
}
void maybeEmitName(SpvInst* spvInst, IRInst* irInst)
diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp
index 5ab85eca9..7bd4f77a3 100644
--- a/source/slang/slang-ir-glsl-legalize.cpp
+++ b/source/slang/slang-ir-glsl-legalize.cpp
@@ -1420,7 +1420,7 @@ ScalarizedVal createGLSLGlobalVaryingsImpl(
fieldBindingIndex,
fieldBindingSpace,
declarator,
- field->getKey());
+ field);
if (fieldVal.flavor != ScalarizedVal::Flavor::none)
{
ScalarizedTupleValImpl::Element element;
diff --git a/source/slang/slang-ir-inst-defs.h b/source/slang/slang-ir-inst-defs.h
index 88d398070..23f922b5b 100644
--- a/source/slang/slang-ir-inst-defs.h
+++ b/source/slang/slang-ir-inst-defs.h
@@ -848,6 +848,7 @@ INST(HighLevelDeclDecoration, highLevelDecl, 1, 0)
INST(SemanticDecoration, semantic, 2, 0)
INST(PackOffsetDecoration, packoffset, 2, 0)
+ INST(RequireSPIRVDescriptorIndexingExtensionDecoration, RequireSPIRVDescriptorIndexingExtensionDecoration, 0, 0)
INST(SPIRVOpDecoration, spirvOpDecoration, 1, 0)
/// Decorated function is marked for the forward-mode differentiation pass.
diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h
index 434f0305e..86a7e2e04 100644
--- a/source/slang/slang-ir-insts.h
+++ b/source/slang/slang-ir-insts.h
@@ -4237,6 +4237,11 @@ public:
addDecoration(value, kIROp_SemanticDecoration, getStringValue(text), getIntValue(getIntType(), index));
}
+ void addRequireSPIRVDescriptorIndexingExtensionDecoration(IRInst* value)
+ {
+ addDecoration(value, kIROp_RequireSPIRVDescriptorIndexingExtensionDecoration);
+ }
+
void addTargetIntrinsicDecoration(IRInst* value, IRInst* caps, UnownedStringSlice const& definition, UnownedStringSlice const& predicate, IRInst* typeScrutinee)
{
typeScrutinee
diff --git a/source/slang/slang-ir-spirv-legalize.cpp b/source/slang/slang-ir-spirv-legalize.cpp
index 7dbb02a71..2e9219c9d 100644
--- a/source/slang/slang-ir-spirv-legalize.cpp
+++ b/source/slang/slang-ir-spirv-legalize.cpp
@@ -464,7 +464,7 @@ struct SPIRVLegalizationContext : public SourceEmitterBase
auto innerType = inst->getFullType();
- auto arrayType = as<IRArrayType>(inst->getDataType());
+ auto arrayType = as<IRArrayTypeBase>(inst->getDataType());
IRInst* arraySize = nullptr;
if (arrayType)
{
@@ -560,9 +560,17 @@ struct SPIRVLegalizationContext : public SourceEmitterBase
}
auto innerElementType = innerType;
- if (arraySize)
+ if (arrayType)
{
- innerType = builder.getArrayType(innerType, arraySize);
+ Array<IRInst*, 2> arrayTypeArgs;
+ arrayTypeArgs.add(innerType);
+ if (arraySize)
+ arrayTypeArgs.add(arraySize);
+ innerType = (IRType*)builder.emitIntrinsicInst(builder.getTypeKind(), arrayType->getOp(), (UInt)arrayTypeArgs.getCount(), arrayTypeArgs.getBuffer());
+ if (!arraySize)
+ {
+ builder.addRequireSPIRVDescriptorIndexingExtensionDecoration(inst);
+ }
}
// Make a pointer type of storageClass.
@@ -577,7 +585,7 @@ struct SPIRVLegalizationContext : public SourceEmitterBase
insertLoadAtLatestLocation(inst, use);
});
}
- else if (arraySize)
+ else if (arrayType)
{
traverseUses(inst, [&](IRUse* use)
{
diff --git a/source/slang/slang-ir-translate-glsl-global-var.cpp b/source/slang/slang-ir-translate-glsl-global-var.cpp
index 41005e9d4..5d79cbe17 100644
--- a/source/slang/slang-ir-translate-glsl-global-var.cpp
+++ b/source/slang/slang-ir-translate-glsl-global-var.cpp
@@ -60,7 +60,7 @@ namespace Slang
{
builder.addNameHintDecoration(key, nameHint->getName());
}
- builder.createStructField(inputStructType, key, inputType);
+ auto field = builder.createStructField(inputStructType, key, inputType);
IRTypeLayout::Builder fieldTypeLayout(&builder);
fieldTypeLayout.addResourceUsage(LayoutResourceKind::VaryingInput, LayoutSize(1));
IRVarLayout::Builder varLayoutBuilder(&builder, fieldTypeLayout.build());
@@ -86,6 +86,7 @@ namespace Slang
inputVarIndex++;
}
inputStructTypeLayoutBuilder.addField(key, varLayoutBuilder.build());
+ input->transferDecorationsTo(field);
}
auto paramTypeLayout = inputStructTypeLayoutBuilder.build();
IRVarLayout::Builder paramVarLayoutBuilder(&builder, paramTypeLayout);