From a31b462e2e09700c793adf04e1a32a02b503e08f Mon Sep 17 00:00:00 2001 From: Jeremy Ong Date: Sat, 19 Mar 2022 23:44:15 -0600 Subject: [PATCH] Add "bindless" SRG member reflected attribute Signed-off-by: Jeremy Ong --- .gitignore | 3 ++- prepare_solution_win.bat | 2 +- src/AzslcBackend.cpp | 8 +++++++- src/AzslcBackend.h | 1 + src/AzslcReflection.cpp | 1 + tests/Advanced/emission-tester.py | 3 +++ tests/Samples/Bindless.azsl | 9 +++++++++ tests/Samples/Bindless.txt | 2 ++ 8 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/Samples/Bindless.azsl create mode 100644 tests/Samples/Bindless.txt diff --git a/.gitignore b/.gitignore index a779b02..d51451b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ bin/* src/generated/*.interp src/generated/*.tokens src/generated/java/ +src/dist .vs build /src/.antlr/azslLexer.interp @@ -14,4 +15,4 @@ build /src/.antlr/azslParser.interp /src/.antlr/azslParser.java /src/.antlr/azslParser.tokens -/tests/testfuncs.pyc \ No newline at end of file +/tests/testfuncs.pyc diff --git a/prepare_solution_win.bat b/prepare_solution_win.bat index 7771b0f..410b7a7 100644 --- a/prepare_solution_win.bat +++ b/prepare_solution_win.bat @@ -8,7 +8,7 @@ REM set platform=win set architecture=x64 -set generator="Visual Studio 16 2019" +set generator="Visual Studio 17 2022" set curr_dir=%~dp0 set src_path=%curr_dir%\src diff --git a/src/AzslcBackend.cpp b/src/AzslcBackend.cpp index 8086ebc..d0a82e5 100644 --- a/src/AzslcBackend.cpp +++ b/src/AzslcBackend.cpp @@ -547,6 +547,7 @@ namespace AZ::ShaderCompiler int count = 1; RootParamType paramType = RootParamType::SrgConstantCB; // this is the default because when "kind" is not "Variable", this function is used on symbols of "kind" "SRG" bool isUnboundedArray = false; + bool isBindlessArray = false; if (kind == Kind::Variable) { const auto* memberInfo = m_ir->GetSymbolSubAs(id.m_name); @@ -564,6 +565,11 @@ namespace AZ::ShaderCompiler } } + if (memberInfo->GetArrayDimensions().IsArray()) + { + isBindlessArray = m_ir->m_symbols.GetAttribute(id, "bindless").has_value(); + } + if (shouldCheckForValidArraySize) { CheckHasOneFoldedDimensionOrThrow(memberInfo->GetArrayDimensions(), "CodeEmitter::BuildSignatureDescription"); @@ -573,7 +579,7 @@ namespace AZ::ShaderCompiler } auto regType = RootParamTypeToBindingType(paramType); - auto srgElementDesc = RootSigDesc::SrgParamDesc{ id, paramType, bindInfo.GetCurrent(regType), count, -1, isUnboundedArray}; + auto srgElementDesc = RootSigDesc::SrgParamDesc{ id, paramType, bindInfo.GetCurrent(regType), count, -1, isUnboundedArray, isBindlessArray}; rootSig.m_descriptorMap.emplace(id, srgElementDesc); bindInfo.SignalRegisterIncrement(regType, count); return srgElementDesc; diff --git a/src/AzslcBackend.h b/src/AzslcBackend.h index 6e1a690..405dea7 100644 --- a/src/AzslcBackend.h +++ b/src/AzslcBackend.h @@ -68,6 +68,7 @@ namespace AZ::ShaderCompiler // of 1 and at the same time We do not forget that m_uid refers // to an unbounded array. bool m_isUnboundedArray = false; + bool m_isBindlessArray = false; }; struct SrgDesc diff --git a/src/AzslcReflection.cpp b/src/AzslcReflection.cpp index 4cbbf89..8871729 100644 --- a/src/AzslcReflection.cpp +++ b/src/AzslcReflection.cpp @@ -638,6 +638,7 @@ namespace AZ::ShaderCompiler output["space"] = bindInfo.m_registerBinding.m_pair[BindingPair::Set::Untainted].m_logicalSpace; output["index-merged"] = bindInfo.m_registerBinding.m_pair[BindingPair::Set::Merged].m_registerIndex; output["space-merged"] = bindInfo.m_registerBinding.m_pair[BindingPair::Set::Merged].m_logicalSpace; + output["bindless"] = bindInfo.m_isBindlessArray; } void CodeReflection::DumpSRGLayout(const Options& options) const diff --git a/tests/Advanced/emission-tester.py b/tests/Advanced/emission-tester.py index bfbed75..e9cbf2b 100644 --- a/tests/Advanced/emission-tester.py +++ b/tests/Advanced/emission-tester.py @@ -46,6 +46,9 @@ def doTests(compiler, silent, azdxcpath): if testhelper.verifyEmissionPatterns(os.path.abspath(os.path.join(workDir, "../Samples/UnboundedArrays.azsl_manual")), compiler, silent, ["--use-spaces",]) : result += 1 else: resultFailed += 1 + if testhelper.verifyEmissionPatterns(os.path.abspath(os.path.join(workDir, "../Samples/Bindless.azsl")), compiler, silent, ["--srg",]) : result += 1 + else: resultFailed += 1 + for base, dirs, files in os.walk(os.path.join(workDir, "../Emission/")): for f in files: if f.endswith(".azsl"): diff --git a/tests/Samples/Bindless.azsl b/tests/Samples/Bindless.azsl new file mode 100644 index 0000000..c566517 --- /dev/null +++ b/tests/Samples/Bindless.azsl @@ -0,0 +1,9 @@ +ShaderResourceGroupSemantic BindlessGroup +{ + FrequencyId = 10; +}; + +ShaderResourceGroup BindlessTextures : BindlessGroup +{ + [bindless] Texture2D textures[]; +}; diff --git a/tests/Samples/Bindless.txt b/tests/Samples/Bindless.txt new file mode 100644 index 0000000..5334a84 --- /dev/null +++ b/tests/Samples/Bindless.txt @@ -0,0 +1,2 @@ +# Srg layout produced with azslc.exe Bindless.azsl --srg +"\"bindless\": true"