From a67cb0609587c230746b52567ff5775cab215220 Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Sat, 3 Feb 2024 10:14:04 +0800 Subject: GLSL Passthrough support for SSBO types (#3446) * GLSL Passthrough support for SSBO types * GLSL Passthrough support for SSBO types * Correctly apply glsl local size layout to entry points during lowering * Test for glsl layout correctness * typo * Reflect GLSL SSBO as raw buffers * Functional test for glsl ssbo * Allow allow glsl for render tests * Functional test for ssbo passthrough * Functional test for ssbo passthrough with spirv-direct * fix windows build error --------- Co-authored-by: Yong He --- source/slang/slang-ir-layout.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'source/slang/slang-ir-layout.cpp') diff --git a/source/slang/slang-ir-layout.cpp b/source/slang/slang-ir-layout.cpp index a6684c7b1..9bbdb1aef 100644 --- a/source/slang/slang-ir-layout.cpp +++ b/source/slang/slang-ir-layout.cpp @@ -152,10 +152,18 @@ case kIROp_##TYPE##Type: \ auto structType = cast(type); IRSizeAndAlignment structLayout; IRIntegerValue offset = 0; + bool seenFinalUnsizedArrayField = false; for (auto field : structType->getFields()) { + // If we failed to catch an unsized array earlier in the pipeline, + // this will pick it up before generating nonsense results for + // subsequent offsets + SLANG_ASSERT(!seenFinalUnsizedArrayField); + IRSizeAndAlignment fieldTypeLayout; SLANG_RETURN_ON_FAIL(getSizeAndAlignment(target, rules, field->getFieldType(), &fieldTypeLayout)); + seenFinalUnsizedArrayField = fieldTypeLayout.size == IRSizeAndAlignment::kIndeterminateSize; + structLayout.size = align(offset, fieldTypeLayout.alignment); structLayout.alignment = std::max(structLayout.alignment, fieldTypeLayout.alignment); @@ -202,6 +210,15 @@ case kIROp_##TYPE##Type: \ } break; + case kIROp_UnsizedArrayType: + { + auto unsizedArrayType = cast(type); + getSizeAndAlignment(target, rules, unsizedArrayType->getElementType(), outSizeAndAlignment); + outSizeAndAlignment->size = IRSizeAndAlignment::kIndeterminateSize; + return SLANG_OK; + } + break; + case kIROp_VectorType: { auto vecType = cast(type); -- cgit v1.2.3