summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
-rw-r--r--source/slang/slang-emit-spirv.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index d07d587e5..e4b5c2f4d 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -2767,6 +2767,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
param->getDataType(),
storageClass);
maybeEmitPointerDecoration(varInst, param);
+ maybeEmitWriteOnlyImageDecoration(varInst, param);
if (layout)
emitVarLayout(param, varInst, layout);
emitDecorations(param, getID(varInst));
@@ -5686,6 +5687,25 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
maybeEmitPointerDecoration(varInst, inst->getDataType(), as<IRVar>(inst), inst->getOp());
}
+ void maybeEmitWriteOnlyImageDecoration(SpvInst* varInst, IRInst* inst)
+ {
+ auto ptrType = as<IRPtrTypeBase>(inst->getDataType());
+ if (!ptrType)
+ return;
+ auto textureType = as<IRTextureType>(ptrType->getValueType());
+ if (!textureType)
+ return;
+
+ if (textureType->getAccess() == SLANG_RESOURCE_ACCESS_WRITE)
+ {
+ emitOpDecorate(
+ getSection(SpvLogicalSectionID::Annotations),
+ nullptr,
+ getID(varInst),
+ SpvDecorationNonReadable);
+ }
+ }
+
SpvInst* emitParam(SpvInstParent* parent, IRInst* inst)
{
auto paramSpvInst = emitOpFunctionParameter(parent, inst, inst->getFullType());