diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2025-05-16 15:01:24 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-16 12:01:24 -0700 |
| commit | da951e06e7eb8ad1b9c91d6176be8165ea4f2b45 (patch) | |
| tree | 84df8551021ad8806531fc2ed59058f65fbfa256 /source | |
| parent | 0244c96d637f47fa264d441a82d3dca78889373b (diff) | |
Address structured buffer `GetDimensions` issues for WGSL, GLSL and SPIRV (#7010)
* Fix structured buffer get dimensions
* Further fixes and added tests
* Remove unnecessary include
* Fix test issues
* attempt to fix wgpu crash
* test remove half usage in test
* attempt to fix WGPU test issue
* Another attempt to fix WGSL test - make test similar to the existing GetDimensions test
---------
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 11 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 21 | ||||
| -rw-r--r-- | source/slang/slang-ir-lower-buffer-element-type.cpp | 14 |
3 files changed, 35 insertions, 11 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 116d9b1d6..a8ce6564c 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -2790,11 +2790,12 @@ bool GLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) auto elementType = as<IRHLSLStructuredBufferTypeBase>(inst->getOperand(0)->getDataType()) ->getElementType(); - IRIntegerValue stride = 0; - if (auto sizeDecor = elementType->findDecoration<IRSizeAndAlignmentDecoration>()) - { - stride = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment()); - } + + // The element type should have a `SizeAndAlignment` decoration created during lowering. + auto sizeDecor = elementType->findDecoration<IRSizeAndAlignmentDecoration>(); + SLANG_ASSERT(sizeDecor); + const auto stride = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment()); + m_writer->emit(stride); m_writer->emit(");\n"); return true; diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 7d202c7c1..54417899c 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -6878,12 +6878,21 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex kResultID, inst->getOperand(0), SpvLiteralInteger::from32(0)); - auto elementType = as<IRPtrType>(inst->getOperand(0)->getDataType())->getValueType(); - IRIntegerValue stride = 0; - if (auto sizeDecor = elementType->findDecoration<IRSizeAndAlignmentDecoration>()) - { - stride = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment()); - } + + // The buffer is a global parameter, so it's a pointer + auto bufPtrType = cast<IRPtrTypeBase>(inst->getOperand(0)->getDataType()); + // It's lowered to a struct type.. + auto bufType = cast<IRStructType>(bufPtrType->getValueType()); + // containing an unsized array, specifically one with an explicit + // stride, which is not expressible in spirv_asm blocks + auto arrayType = cast<IRArrayTypeBase>(bufType->getFields().getFirst()->getFieldType()); + + // The element type should have a `SizeAndAlignment` decoration created during lowering. + auto sizeDecor = + arrayType->getElementType()->findDecoration<IRSizeAndAlignmentDecoration>(); + SLANG_ASSERT(sizeDecor); + const auto stride = align(sizeDecor->getSize(), (int)sizeDecor->getAlignment()); + auto strideOperand = emitIntConstant(stride, builder.getUIntType()); auto result = emitOpCompositeConstruct(parent, inst, inst->getDataType(), arrayLength, strideOperand); diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp index 1294b400d..ed0a3b309 100644 --- a/source/slang/slang-ir-lower-buffer-element-type.cpp +++ b/source/slang/slang-ir-lower-buffer-element-type.cpp @@ -939,11 +939,25 @@ struct LoweredElementTypeContext } } if (auto structBuffer = as<IRHLSLStructuredBufferTypeBase>(globalInst)) + { elementType = structBuffer->getElementType(); + auto config = getTypeLoweringConfigForBuffer(target, structBuffer); + + // Create size and alignment decoration for potential use + // in`StructuredBufferGetDimensions`. + IRSizeAndAlignment sizeAlignment; + getSizeAndAlignment( + target->getOptionSet(), + config.layoutRule, + elementType, + &sizeAlignment); + SLANG_UNUSED(sizeAlignment); + } else if (auto constBuffer = as<IRUniformParameterGroupType>(globalInst)) elementType = constBuffer->getElementType(); else if (auto storageBuffer = as<IRGLSLShaderStorageBufferType>(globalInst)) elementType = storageBuffer->getElementType(); + if (as<IRTextureBufferType>(globalInst)) continue; if (!as<IRStructType>(elementType) && !as<IRMatrixType>(elementType) && |
