diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 1e6f27e7fcc..7f49336131e 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -2060,7 +2060,9 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex inst->getOp() == kIROp_ArrayType ? emitOpTypeArray(inst, elementType, irArrayType->getElementCount()) : emitOpTypeRuntimeArray(inst, elementType); - if (shouldEmitArrayStride(irArrayType->getElementType())) + // Arrays of opaque types should not emit a stride + if (!isIROpaqueType(elementType) && + shouldEmitArrayStride(irArrayType->getElementType())) { auto stride = 0; // If the array type has no stride, it indicates that this array type is only diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 687841d5efa..69bd2c6c206 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -2408,4 +2408,17 @@ bool isSignedType(IRType* type) } } +bool isIROpaqueType(IRType* type) +{ + switch (type->getOp()) + { + case kIROp_TextureType: + case kIROp_SamplerStateType: + case kIROp_SamplerComparisonStateType: + return true; + default: + return false; + } +} + } // namespace Slang diff --git a/source/slang/slang-ir-util.h b/source/slang/slang-ir-util.h index edb8fdf0934..e325fbdc266 100644 --- a/source/slang/slang-ir-util.h +++ b/source/slang/slang-ir-util.h @@ -421,6 +421,8 @@ constexpr bool anyOf(Range&& range, Predicate&& pred) IRType* getUnsignedTypeFromSignedType(IRBuilder* builder, IRType* type); bool isSignedType(IRType* type); + +bool isIROpaqueType(IRType* type); } // namespace Slang #endif diff --git a/tests/language-feature/constants/unsized-opaque-array.slang b/tests/language-feature/constants/unsized-opaque-array.slang new file mode 100644 index 00000000000..2aab695f667 --- /dev/null +++ b/tests/language-feature/constants/unsized-opaque-array.slang @@ -0,0 +1,14 @@ +//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry main -emit-spirv-directly + +// SPIRV-NOT: OpDecorate {{.*}} ArrayStride 8 +layout(binding = 0) +Texture2D textures[]; + +RWTexture2D tex; + +[shader("compute")] +[numthreads(1,1,1)] +void main(uint3 threadId : SV_DispatchThreadID) +{ + tex[threadId.xy] = uint(textures[0][threadId.xy].r); +} \ No newline at end of file