From 2b396d236ab33dfe9c0defbe401d354ed3fb34f9 Mon Sep 17 00:00:00 2001 From: azhirnov Date: Thu, 8 Oct 2020 21:45:01 +0300 Subject: removed strong references to shaders in PSO --- Graphics/ShaderTools/include/SPIRVShaderResources.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Graphics/ShaderTools') diff --git a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp index 5c35de33..b7c96523 100644 --- a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp +++ b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp @@ -78,7 +78,7 @@ struct SPIRVShaderResourceAttribs static constexpr const Uint32 InvalidSepSmplrOrImgInd = static_cast(-1); -/* 0 */const char* const Name; +/* 0 */const char* Name; /* 8 */const Uint16 ArraySize; /* 10 */const ResourceType Type; /* 11 */ // unused -- cgit v1.2.3 From e92a0a857a85fad049646dd78d4f742d245cc9cd Mon Sep 17 00:00:00 2001 From: azhirnov Date: Thu, 8 Oct 2020 21:48:49 +0300 Subject: Some minor fixes --- Graphics/ShaderTools/src/SPIRVShaderResources.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'Graphics/ShaderTools') diff --git a/Graphics/ShaderTools/src/SPIRVShaderResources.cpp b/Graphics/ShaderTools/src/SPIRVShaderResources.cpp index 876858ae..be683d53 100644 --- a/Graphics/ShaderTools/src/SPIRVShaderResources.cpp +++ b/Graphics/ShaderTools/src/SPIRVShaderResources.cpp @@ -582,6 +582,7 @@ void SPIRVShaderResources::Initialize(IMemoryAllocator& Allocator, VERIFY_EXPR(GetNumACs() == Counters.NumACs); VERIFY_EXPR(GetNumSepSmplrs() == Counters.NumSepSmplrs); VERIFY_EXPR(GetNumSepImgs() == Counters.NumSepImgs); + VERIFY_EXPR(GetNumInptAtts() == Counters.NumInptAtts); // clang-format on if (MemorySize) @@ -618,6 +619,9 @@ SPIRVShaderResources::~SPIRVShaderResources() for (Uint32 n = 0; n < GetNumSepImgs(); ++n) GetSepImg(n).~SPIRVShaderResourceAttribs(); + for (Uint32 n = 0; n < GetNumInptAtts(); ++n) + GetInptAtt(n).~SPIRVShaderResourceAttribs(); + for (Uint32 n = 0; n < GetNumShaderStageInputs(); ++n) GetShaderStageInputAttribs(n).~SPIRVShaderStageInputAttribs(); } @@ -748,7 +752,8 @@ bool SPIRVShaderResources::IsCompatibleWith(const SPIRVShaderResources& Resource GetNumSmpldImgs() != Resources.GetNumSmpldImgs() || GetNumACs() != Resources.GetNumACs() || GetNumSepImgs() != Resources.GetNumSepImgs() || - GetNumSepSmplrs() != Resources.GetNumSepSmplrs()) + GetNumSepSmplrs() != Resources.GetNumSepSmplrs() || + GetNumInptAtts() != Resources.GetNumInptAtts()) return false; // clang-format on VERIFY_EXPR(GetTotalResources() == Resources.GetTotalResources()); -- cgit v1.2.3 From 998165f350cfd8ae6bd9cbf6fc812874c1c3c3da Mon Sep 17 00:00:00 2001 From: azhirnov Date: Thu, 8 Oct 2020 22:14:06 +0300 Subject: Revert some changes in ShaderResourceLayoutVk, fixed PSO comparison --- Graphics/ShaderTools/include/SPIRVShaderResources.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Graphics/ShaderTools') diff --git a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp index b7c96523..5c35de33 100644 --- a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp +++ b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp @@ -78,7 +78,7 @@ struct SPIRVShaderResourceAttribs static constexpr const Uint32 InvalidSepSmplrOrImgInd = static_cast(-1); -/* 0 */const char* Name; +/* 0 */const char* const Name; /* 8 */const Uint16 ArraySize; /* 10 */const ResourceType Type; /* 11 */ // unused -- cgit v1.2.3 From e7b18160a758b30dd6b701b4aa6f43c9c2061ccf Mon Sep 17 00:00:00 2001 From: assiduous Date: Sat, 17 Oct 2020 09:56:34 -0700 Subject: All backends: added resource dimension validation when setting shader variables --- .../ShaderTools/include/SPIRVShaderResources.hpp | 19 +++++++--- Graphics/ShaderTools/src/SPIRVShaderResources.cpp | 42 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) (limited to 'Graphics/ShaderTools') diff --git a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp index 5c35de33..091e2343 100644 --- a/Graphics/ShaderTools/include/SPIRVShaderResources.hpp +++ b/Graphics/ShaderTools/include/SPIRVShaderResources.hpp @@ -78,10 +78,11 @@ struct SPIRVShaderResourceAttribs static constexpr const Uint32 InvalidSepSmplrOrImgInd = static_cast(-1); -/* 0 */const char* const Name; -/* 8 */const Uint16 ArraySize; -/* 10 */const ResourceType Type; -/* 11 */ // unused +/* 0 */const char* const Name; +/* 8 */const Uint16 ArraySize; +/* 10 */const ResourceType Type; +/* 11.0*/const Uint8 ResourceDim : 7; +/* 11.7*/const Uint8 IsMS : 1; private: // Defines the mapping between separate samplers and seperate images when HLSL-style // combined texture samplers are in use (i.e. texture2D g_Tex + sampler g_Tex_sampler). @@ -159,6 +160,16 @@ public: } ShaderResourceDesc GetResourceDesc() const; + + RESOURCE_DIMENSION GetResourceDimension() const + { + return static_cast(ResourceDim); + } + + bool IsMultisample() const + { + return IsMS != 0; + } }; static_assert(sizeof(SPIRVShaderResourceAttribs) % sizeof(void*) == 0, "Size of SPIRVShaderResourceAttribs struct must be multiple of sizeof(void*)"); diff --git a/Graphics/ShaderTools/src/SPIRVShaderResources.cpp b/Graphics/ShaderTools/src/SPIRVShaderResources.cpp index be683d53..7fe1ed62 100644 --- a/Graphics/ShaderTools/src/SPIRVShaderResources.cpp +++ b/Graphics/ShaderTools/src/SPIRVShaderResources.cpp @@ -53,6 +53,46 @@ Type GetResourceArraySize(const diligent_spirv_cross::Compiler& Compiler, return static_cast(arrSize); } +static RESOURCE_DIMENSION GetResourceDimension(const diligent_spirv_cross::Compiler& Compiler, + const diligent_spirv_cross::Resource& Res) +{ + const auto& type = Compiler.get_type(Res.type_id); + if (type.basetype == diligent_spirv_cross::SPIRType::BaseType::Image || + type.basetype == diligent_spirv_cross::SPIRType::BaseType::SampledImage) + { + switch (type.image.dim) + { + // clang-format off + case spv::Dim1D: return type.image.arrayed ? RESOURCE_DIM_TEX_1D_ARRAY : RESOURCE_DIM_TEX_1D; + case spv::Dim2D: return type.image.arrayed ? RESOURCE_DIM_TEX_2D_ARRAY : RESOURCE_DIM_TEX_2D; + case spv::Dim3D: return RESOURCE_DIM_TEX_3D; + case spv::DimCube: return type.image.arrayed ? RESOURCE_DIM_TEX_CUBE_ARRAY : RESOURCE_DIM_TEX_CUBE; + case spv::DimBuffer: return RESOURCE_DIM_BUFFER; + // clang-format on + default: return RESOURCE_DIM_UNDEFINED; + } + } + else + { + return RESOURCE_DIM_UNDEFINED; + } +} + +static bool IsMultisample(const diligent_spirv_cross::Compiler& Compiler, + const diligent_spirv_cross::Resource& Res) +{ + const auto& type = Compiler.get_type(Res.type_id); + if (type.basetype == diligent_spirv_cross::SPIRType::BaseType::Image || + type.basetype == diligent_spirv_cross::SPIRType::BaseType::SampledImage) + { + return type.image.ms; + } + else + { + return RESOURCE_DIM_UNDEFINED; + } +} + static uint32_t GetDecorationOffset(const diligent_spirv_cross::Compiler& Compiler, const diligent_spirv_cross::Resource& Res, spv::Decoration Decoration) @@ -74,6 +114,8 @@ SPIRVShaderResourceAttribs::SPIRVShaderResourceAttribs(const diligent_spirv_cros Name {_Name}, ArraySize {GetResourceArraySize(Compiler, Res)}, Type {_Type}, + ResourceDim {Diligent::GetResourceDimension(Compiler, Res)}, + IsMS {Diligent::IsMultisample(Compiler, Res) ? Uint8{1} : Uint8{0}}, SepSmplrOrImgInd {_SepSmplrOrImgInd}, BindingDecorationOffset {GetDecorationOffset(Compiler, Res, spv::Decoration::DecorationBinding)}, DescriptorSetDecorationOffset {GetDecorationOffset(Compiler, Res, spv::Decoration::DecorationDescriptorSet)} -- cgit v1.2.3