Skip to content

Commit d0e0a6d

Browse files
SPIRVShaderResources: simplify specialization constants processing
1 parent 2385c1e commit d0e0a6d

2 files changed

Lines changed: 22 additions & 36 deletions

File tree

Graphics/ShaderTools/src/SPIRVShaderResources.cpp

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -614,19 +614,12 @@ SPIRVShaderResources::SPIRVShaderResources(IMemoryAllocator& Allocator,
614614
static_assert(Uint32{SPIRVShaderResourceAttribs::ResourceType::NumResourceTypes} == 13, "Please set the new resource type counter here");
615615

616616
// Specialization constants reflection
617-
struct SpecConstInfo
618-
{
619-
std::string Name;
620-
uint32_t SpecId = 0;
621-
uint32_t Size = 0;
622-
SHADER_CODE_BASIC_TYPE BasicType = SHADER_CODE_BASIC_TYPE_UNKNOWN;
623-
};
624-
std::vector<SpecConstInfo> SpecConstants;
625-
Uint32 NumSpecConstants = 0;
626-
617+
diligent_spirv_cross::SmallVector<SPIRVSpecializationConstantAttribs> SpecConstants;
618+
Uint32 NumSpecConstants = 0;
627619
{
628620
diligent_spirv_cross::SmallVector<diligent_spirv_cross::SpecializationConstant> spec_consts =
629621
Compiler.get_specialization_constants();
622+
SpecConstants.reserve(spec_consts.size());
630623
for (const diligent_spirv_cross::SpecializationConstant& sc : spec_consts)
631624
{
632625
const diligent_spirv_cross::SPIRConstant& Constant = Compiler.get_constant(sc.id);
@@ -641,22 +634,23 @@ SPIRVShaderResources::SPIRVShaderResources(IMemoryAllocator& Allocator,
641634
continue;
642635
}
643636

644-
SpecConstInfo Info;
645-
Info.Name = Compiler.get_name(sc.id);
646-
Info.SpecId = sc.constant_id;
647-
// OpTypeBool has width==1 in SPIRV-Cross; use 4 bytes (VkBool32) for bool specialization constants
648-
Info.Size = Type.basetype == diligent_spirv_cross::SPIRType::Boolean ? 4 : Type.width / 8;
649-
Info.BasicType = SpirvBaseTypeToShaderCodeBasicType(Type.basetype);
650-
651-
if (Info.Name.empty())
637+
const std::string& Name = Compiler.get_name(sc.id);
638+
if (Name.empty())
652639
{
653640
LOG_WARNING_MESSAGE("Specialization constant with SpecId=", sc.constant_id,
654641
" in shader '", CI.Name, "' has no name (OpName) and will be skipped.");
655642
continue;
656643
}
657-
658-
ResourceNamesPoolSize += Info.Name.length() + 1;
659-
SpecConstants.emplace_back(std::move(Info));
644+
ResourceNamesPoolSize += Name.length() + 1;
645+
646+
SPIRVSpecializationConstantAttribs Info{
647+
Name.c_str(),
648+
sc.constant_id,
649+
// OpTypeBool has width==1 in SPIRV-Cross; use 4 bytes (VkBool32) for bool specialization constants
650+
Type.basetype == diligent_spirv_cross::SPIRType::Boolean ? 4 : Type.width / 8,
651+
SpirvBaseTypeToShaderCodeBasicType(Type.basetype),
652+
};
653+
SpecConstants.push_back(Info);
660654
}
661655
NumSpecConstants = static_cast<Uint32>(SpecConstants.size());
662656
}
@@ -893,7 +887,7 @@ SPIRVShaderResources::SPIRVShaderResources(IMemoryAllocator& Allocator,
893887
if (!SpecConstants.empty())
894888
{
895889
Uint32 CurrSpecConst = 0;
896-
for (const SpecConstInfo& SC : SpecConstants)
890+
for (const SPIRVSpecializationConstantAttribs& SC : SpecConstants)
897891
{
898892
new (&GetSpecConstant(CurrSpecConst++)) SPIRVSpecializationConstantAttribs //
899893
{
@@ -961,6 +955,7 @@ void SPIRVShaderResources::Initialize(IMemoryAllocator& Allocator,
961955
size_t AlignedResourceNamesPoolSize = AlignUp(ResourceNamesPoolSize, sizeof(void*));
962956

963957
static_assert(sizeof(SPIRVShaderResourceAttribs) % sizeof(void*) == 0, "Size of SPIRVShaderResourceAttribs struct must be multiple of sizeof(void*)");
958+
static_assert(sizeof(SPIRVSpecializationConstantAttribs) % sizeof(void*) == 0, "Size of SPIRVSpecializationConstantAttribs struct must be multiple of sizeof(void*)");
964959
// clang-format off
965960
size_t MemorySize = GetTotalResources() * sizeof(SPIRVShaderResourceAttribs) +
966961
m_NumShaderStageInputs * sizeof(SPIRVShaderStageInputAttribs) +
@@ -1270,7 +1265,7 @@ std::string SPIRVShaderResources::DumpResources() const
12701265
<< "Specialization constants (" << GetNumSpecConstants() << "):";
12711266
for (Uint32 n = 0; n < GetNumSpecConstants(); ++n)
12721267
{
1273-
const auto& SC = GetSpecConstant(n);
1268+
const SPIRVSpecializationConstantAttribs& SC = GetSpecConstant(n);
12741269
ss << std::endl
12751270
<< " '" << SC.Name << "' SpecId=" << SC.SpecId << " Size=" << SC.Size;
12761271
}

Tests/DiligentCoreTest/src/ShaderTools/SPIRVShaderResourcesTest.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -589,15 +589,6 @@ TEST_F(SPIRVShaderResourcesTest, MixedResources_DXC)
589589
TestMixedResources(SHADER_COMPILER_DXC);
590590
}
591591

592-
593-
struct SPIRVSpecConstRefAttribs
594-
{
595-
const char* const Name;
596-
const uint32_t SpecId;
597-
const uint32_t Size;
598-
const SHADER_CODE_BASIC_TYPE BasicType;
599-
};
600-
601592
void TestSpecializationConstants(SHADER_COMPILER Compiler)
602593
{
603594
std::vector<unsigned int> SPIRV;
@@ -617,7 +608,7 @@ void TestSpecializationConstants(SHADER_COMPILER Compiler)
617608

618609
LOG_INFO_MESSAGE("SPIRV Resources:\n", Resources.DumpResources());
619610

620-
const std::vector<SPIRVSpecConstRefAttribs> RefSpecConstants = {
611+
const std::vector<SPIRVSpecializationConstantAttribs> RefSpecConstants = {
621612
{"g_EnableFeature", 0, 4, SHADER_CODE_BASIC_TYPE_BOOL},
622613
{"g_IntParam", 1, 4, SHADER_CODE_BASIC_TYPE_INT},
623614
{"g_UintParam", 2, 4, SHADER_CODE_BASIC_TYPE_UINT},
@@ -628,8 +619,8 @@ void TestSpecializationConstants(SHADER_COMPILER Compiler)
628619
EXPECT_EQ(ConstResources.GetNumSpecConstants(), static_cast<Uint32>(RefSpecConstants.size()));
629620

630621
// Build a map from name to reference for order-independent matching
631-
std::unordered_map<std::string, const SPIRVSpecConstRefAttribs*> RefMap;
632-
for (const SPIRVSpecConstRefAttribs& Ref : RefSpecConstants)
622+
std::unordered_map<std::string, const SPIRVSpecializationConstantAttribs*> RefMap;
623+
for (const SPIRVSpecializationConstantAttribs& Ref : RefSpecConstants)
633624
RefMap[Ref.Name] = &Ref;
634625

635626
for (Uint32 i = 0; i < ConstResources.GetNumSpecConstants(); ++i)
@@ -638,7 +629,7 @@ void TestSpecializationConstants(SHADER_COMPILER Compiler)
638629
const auto it = RefMap.find(SC.Name);
639630
ASSERT_NE(it, RefMap.end()) << "Specialization constant '" << SC.Name << "' is not found in the reference list";
640631

641-
const auto* pRef = it->second;
632+
const SPIRVSpecializationConstantAttribs* pRef = it->second;
642633
EXPECT_EQ(SC.SpecId, pRef->SpecId) << SC.Name;
643634
EXPECT_EQ(SC.Size, pRef->Size) << SC.Name;
644635
EXPECT_EQ(SC.BasicType, pRef->BasicType) << SC.Name;

0 commit comments

Comments
 (0)