@@ -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 }
0 commit comments