diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-05-29 01:02:35 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-05-29 01:02:35 +0000 |
| commit | 939937b3e2abd7c473ad990f2f257d08219696ce (patch) | |
| tree | 7efd20d554a3df8f316dbf48c97f6e281850d4ee /Graphics/GraphicsEngineVulkan | |
| parent | Removed wrong comment (diff) | |
| download | DiligentCore-939937b3e2abd7c473ad990f2f257d08219696ce.tar.gz DiligentCore-939937b3e2abd7c473ad990f2f257d08219696ce.zip | |
Fixed issue with storage buffer not being bound through UAV in Vulkan; fixed a number of other minor issues
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
10 files changed, 139 insertions, 61 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/BufferViewVkImpl.h b/Graphics/GraphicsEngineVulkan/include/BufferViewVkImpl.h index c6085487..675bc145 100644 --- a/Graphics/GraphicsEngineVulkan/include/BufferViewVkImpl.h +++ b/Graphics/GraphicsEngineVulkan/include/BufferViewVkImpl.h @@ -35,6 +35,8 @@ namespace Diligent { class FixedBlockMemoryAllocator; +class BufferVkImpl; + /// Implementation of the Diligent::IBufferViewVk interface class BufferViewVkImpl : public BufferViewBase<IBufferViewVk> { @@ -52,7 +54,9 @@ public: virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ); virtual VkBufferView GetVkBufferView()const override final{return m_BuffView;} - + const BufferVkImpl* GetBufferVk()const; + BufferVkImpl* GetBufferVk(); + protected: VulkanUtilities::BufferViewWrapper m_BuffView; diff --git a/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.h b/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.h index 45a21735..15c9b226 100644 --- a/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.h +++ b/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.h @@ -121,7 +121,6 @@ public: } } - Vk_CPU_DESCRIPTOR_HANDLE GetCBVHandle(){return m_CBVDescriptorAllocation.GetCpuHandle();} */ private: virtual void CreateViewInternal( const struct BufferViewDesc &ViewDesc, IBufferView **ppView, bool bIsDefaultView )override; diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h index f2129a41..192e06cc 100644 --- a/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h +++ b/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h @@ -100,7 +100,8 @@ public: const SPIRVShaderResourceAttribs::ResourceType Type; RefCntAutoPtr<IDeviceObject> pObject; - VkDescriptorBufferInfo GetBufferDescriptorWriteInfo () const; + VkDescriptorBufferInfo GetUniformBufferDescriptorWriteInfo () const; + VkDescriptorBufferInfo GetStorageBufferDescriptorWriteInfo () const; VkDescriptorImageInfo GetImageDescriptorWriteInfo (bool IsImmutableSampler)const; VkBufferView GetBufferViewWriteInfo () const; VkDescriptorImageInfo GetSamplerDescriptorWriteInfo() const; diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h index 81aa5ed9..bd843797 100644 --- a/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h +++ b/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h @@ -183,10 +183,15 @@ public: const VkBufferView* pTexelBufferView)const; private: - void CacheBuffer(IDeviceObject* pBuffer, - ShaderResourceCacheVk::Resource& DstRes, - VkDescriptorSet vkDescrSet, - Uint32 ArrayInd)const; + void CacheUniformBuffer(IDeviceObject* pBuffer, + ShaderResourceCacheVk::Resource& DstRes, + VkDescriptorSet vkDescrSet, + Uint32 ArrayInd)const; + + void CacheStorageBuffer(IDeviceObject* pBufferView, + ShaderResourceCacheVk::Resource& DstRes, + VkDescriptorSet vkDescrSet, + Uint32 ArrayInd)const; void CacheTexelBuffer(IDeviceObject* pBufferView, ShaderResourceCacheVk::Resource& DstRes, diff --git a/Graphics/GraphicsEngineVulkan/src/BufferViewVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/BufferViewVkImpl.cpp index 98b87a14..1c2fdf29 100644 --- a/Graphics/GraphicsEngineVulkan/src/BufferViewVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/BufferViewVkImpl.cpp @@ -24,6 +24,7 @@ #include "pch.h" #include "BufferViewVkImpl.h" #include "RenderDeviceVkImpl.h" +#include "BufferVkImpl.h" namespace Diligent { @@ -47,4 +48,14 @@ BufferViewVkImpl::~BufferViewVkImpl() IMPLEMENT_QUERY_INTERFACE( BufferViewVkImpl, IID_BufferViewVk, TBufferViewBase ) +const BufferVkImpl* BufferViewVkImpl::GetBufferVk()const +{ + return ValidatedCast<const BufferVkImpl>(m_pBuffer); +} + +BufferVkImpl* BufferViewVkImpl::GetBufferVk() +{ + return ValidatedCast<BufferVkImpl>(m_pBuffer); +} + } diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index ad625d0b..288892d2 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -182,7 +182,7 @@ PipelineStateVkImpl :: PipelineStateVkImpl(IReferenceCounters *pRefCounters, Ren CSStage.stage = VK_SHADER_STAGE_COMPUTE_BIT; ParseResourceLayoutAndCreateShader(ComputePipeline.pCS, 0); - CSStage.module = m_ShaderModules[CSInd]; + CSStage.module = m_ShaderModules[0]; m_PipelineLayout.Finalize(LogicalDevice); PipelineCI.layout = m_PipelineLayout.GetVkPipelineLayout(); @@ -234,7 +234,7 @@ PipelineStateVkImpl :: PipelineStateVkImpl(IReferenceCounters *pRefCounters, Ren ParseResourceLayoutAndCreateShader(pShader, s); - StageCI.module = m_ShaderModules[GetShaderTypeIndex(ShaderType)]; + StageCI.module = m_ShaderModules[s]; StageCI.pName = "main"; // entry point StageCI.pSpecializationInfo = nullptr; } diff --git a/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp b/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp index 08d56395..86e38add 100644 --- a/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp @@ -158,6 +158,7 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk( const EngineVkAttribs& Crea DeviceFeatures.geometryShader = VK_TRUE; DeviceFeatures.tessellationShader= VK_TRUE; DeviceFeatures.dualSrcBlend = VK_TRUE; + DeviceFeatures.multiViewport = VK_TRUE; DeviceCreateInfo.pEnabledFeatures = &DeviceFeatures; // NULL or a pointer to a VkPhysicalDeviceFeatures structure that contains // boolean indicators of all the features to be enabled. diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp index b5bb57b6..88a9612c 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp @@ -98,13 +98,9 @@ void ShaderResourceCacheVk::TransitionResources(DeviceContextVkImpl *pCtxVkImpl) switch (Res.Type) { case SPIRVShaderResourceAttribs::ResourceType::UniformBuffer: - case SPIRVShaderResourceAttribs::ResourceType::StorageBuffer: { auto *pBufferVk = Res.pObject.RawPtr<BufferVkImpl>(); - VkAccessFlags RequiredAccessFlags = - Res.Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer ? - VK_ACCESS_UNIFORM_READ_BIT : - (VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT); + VkAccessFlags RequiredAccessFlags = VK_ACCESS_UNIFORM_READ_BIT; if(pBufferVk->GetAccessFlags() != RequiredAccessFlags) { if(VerifyOnly) @@ -115,6 +111,7 @@ void ShaderResourceCacheVk::TransitionResources(DeviceContextVkImpl *pCtxVkImpl) } break; + case SPIRVShaderResourceAttribs::ResourceType::StorageBuffer: case SPIRVShaderResourceAttribs::ResourceType::UniformTexelBuffer: case SPIRVShaderResourceAttribs::ResourceType::StorageTexelBuffer: { @@ -180,27 +177,40 @@ template void ShaderResourceCacheVk::TransitionResources<false>(DeviceContextVkI template void ShaderResourceCacheVk::TransitionResources<true>(DeviceContextVkImpl *pCtxVkImpl); -VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetBufferDescriptorWriteInfo()const +VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetUniformBufferDescriptorWriteInfo()const { - VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer || - Type == SPIRVShaderResourceAttribs::ResourceType::StorageBuffer, - "Uniform or storage buffer resource is expected"); + VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer, "Uniform buffer resource is expected"); auto* pBuffVk = pObject.RawPtr<const BufferVkImpl>(); + // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC descriptor type require + // buffer to be created with VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT + VERIFY_EXPR( (pBuffVk->GetDesc().BindFlags & BIND_UNIFORM_BUFFER) != 0); - // The buffer must be created with the following flags so that it can be bound to the specified descriptor (13.2.4): - // * VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC -> VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC -> VK_BUFFER_USAGE_STORAGE_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER -> VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER -> VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT + VkDescriptorBufferInfo DescrBuffInfo; + DescrBuffInfo.buffer = pBuffVk->GetVkBuffer(); + // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset member + // of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment (13.2.4) + DescrBuffInfo.offset = 0; + DescrBuffInfo.range = pBuffVk->GetDesc().uiSizeInBytes; + return DescrBuffInfo; +} + +VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetStorageBufferDescriptorWriteInfo()const +{ + VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::StorageBuffer, "Storage buffer resource is expected"); + + auto* pBuffViewVk = pObject.RawPtr<const BufferViewVkImpl>(); + VERIFY_EXPR(pBuffViewVk->GetDesc().ViewType == BUFFER_VIEW_UNORDERED_ACCESS); + + auto* pBuffVk = pBuffViewVk->GetBufferVk(); + // VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC descriptor type + // require buffer to be created with VK_BUFFER_USAGE_STORAGE_BUFFER_BIT (13.2.4) + VERIFY_EXPR((pBuffVk->GetDesc().BindFlags & BIND_UNORDERED_ACCESS) != 0); VkDescriptorBufferInfo DescrBuffInfo; DescrBuffInfo.buffer = pBuffVk->GetVkBuffer(); - // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset - // member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment - // If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the offset - // member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment - // (13.2.4) + // If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the offset member + // of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment (13.2.4) DescrBuffInfo.offset = 0; DescrBuffInfo.range = pBuffVk->GetDesc().uiSizeInBytes; return DescrBuffInfo; @@ -213,7 +223,10 @@ VkDescriptorImageInfo ShaderResourceCacheVk::Resource::GetImageDescriptorWriteIn Type == SPIRVShaderResourceAttribs::ResourceType::SampledImage, "Storage image, separate image or sampled image resource is expected"); + bool IsStorageImage = Type == SPIRVShaderResourceAttribs::ResourceType::StorageImage; + auto* pTexViewVk = pObject.RawPtr<const TextureViewVkImpl>(); + VERIFY_EXPR(pTexViewVk->GetDesc().ViewType == (IsStorageImage ? TEXTURE_VIEW_UNORDERED_ACCESS : TEXTURE_VIEW_SHADER_RESOURCE)); VkDescriptorImageInfo DescrImgInfo; DescrImgInfo.sampler = VK_NULL_HANDLE; @@ -240,10 +253,7 @@ VkDescriptorImageInfo ShaderResourceCacheVk::Resource::GetImageDescriptorWriteIn // If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, for each descriptor that will be accessed // via load or store operations the imageLayout member for corresponding elements of pImageInfo // MUST be VK_IMAGE_LAYOUT_GENERAL (13.2.4) - DescrImgInfo.imageLayout = - (Type == SPIRVShaderResourceAttribs::ResourceType::StorageImage) ? - VK_IMAGE_LAYOUT_GENERAL : - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + DescrImgInfo.imageLayout = IsStorageImage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; return DescrImgInfo; } @@ -253,7 +263,10 @@ VkBufferView ShaderResourceCacheVk::Resource::GetBufferViewWriteInfo()const VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::UniformTexelBuffer || Type == SPIRVShaderResourceAttribs::ResourceType::StorageTexelBuffer, "Uniform or storage buffer resource is expected"); - + + // The following bits must have been set at buffer creation time: + // * VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER -> VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT + // * VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER -> VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT auto* pBuffViewVk = pObject.RawPtr<const BufferViewVkImpl>(); return pBuffViewVk->GetVkBufferView(); } diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp index 9ead007a..fe0c98b5 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp @@ -298,44 +298,68 @@ bool ShaderResourceLayoutVk::VkResource::UpdateCachedResource(ShaderResourceCach } } -void ShaderResourceLayoutVk::VkResource::CacheBuffer(IDeviceObject* pBuffer, - ShaderResourceCacheVk::Resource& DstRes, - VkDescriptorSet vkDescrSet, - Uint32 ArrayInd)const +void ShaderResourceLayoutVk::VkResource::CacheUniformBuffer(IDeviceObject* pBuffer, + ShaderResourceCacheVk::Resource& DstRes, + VkDescriptorSet vkDescrSet, + Uint32 ArrayInd)const { - VERIFY(SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer || - SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::StorageBuffer, - "Uniform or storage buffer resource is expected"); + VERIFY(SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer, "Uniform buffer resource is expected"); if( UpdateCachedResource(DstRes, ArrayInd, pBuffer, IID_BufferVk, "buffer") ) { #ifdef VERIFY_SHADER_BINDINGS - // The buffer must be created with the following flags so that it can be bound to the specified descriptor (13.2.4): - // * VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC -> VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC -> VK_BUFFER_USAGE_STORAGE_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER -> VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT - // * VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER -> VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT + // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC descriptor type require + // buffer to be created with VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT auto* pBuffVk = DstRes.pObject.RawPtr<BufferVkImpl>(); // Use final type - const auto IsUniformBuffer = SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer; - const auto ExpectedBindFlag = IsUniformBuffer ? BIND_UNIFORM_BUFFER : BIND_UNORDERED_ACCESS; - if( (pBuffVk->GetDesc().BindFlags & ExpectedBindFlag) == 0) + if( (pBuffVk->GetDesc().BindFlags & BIND_UNIFORM_BUFFER) == 0) { - LOG_RESOURCE_BINDING_ERROR("buffer", pBuffer, SpirvAttribs.GetPrintName(ArrayInd), ParentResLayout.GetShaderName(), "Buffer was not created with ", (IsUniformBuffer ? "BIND_UNIFORM_BUFFER" : "BIND_UNORDERED_ACCESS"), " flag.") + LOG_RESOURCE_BINDING_ERROR("buffer", pBuffer, SpirvAttribs.GetPrintName(ArrayInd), ParentResLayout.GetShaderName(), "Buffer was not created with BIND_UNIFORM_BUFFER flag.") DstRes.pObject.Release(); return; } #endif - // Do not update descriptor for a dynamic uniform/storage buffer. All dynamic resource + // Do not update descriptor for a dynamic uniform buffer. All dynamic resource // descriptors are updated at once by CommitDynamicResources() when SRB is committed. if(vkDescrSet != VK_NULL_HANDLE && SpirvAttribs.VarType != SHADER_VARIABLE_TYPE_DYNAMIC) { - VkDescriptorBufferInfo DescrBuffInfo = DstRes.GetBufferDescriptorWriteInfo(); + VkDescriptorBufferInfo DescrBuffInfo = DstRes.GetUniformBufferDescriptorWriteInfo(); UpdateDescriptorHandle(vkDescrSet, ArrayInd, nullptr, &DescrBuffInfo, nullptr); } } } +void ShaderResourceLayoutVk::VkResource::CacheStorageBuffer(IDeviceObject* pBuffer, + ShaderResourceCacheVk::Resource& DstRes, + VkDescriptorSet vkDescrSet, + Uint32 ArrayInd)const +{ + VERIFY(SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::StorageBuffer, "Storage buffer resource is expected"); + + if( UpdateCachedResource(DstRes, ArrayInd, pBuffer, IID_BufferViewVk, "buffer view") ) + { +#ifdef VERIFY_SHADER_BINDINGS + // VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC descriptor type + // require buffer to be created with VK_BUFFER_USAGE_STORAGE_BUFFER_BIT (13.2.4) + auto* pBuffViewVk = DstRes.pObject.RawPtr<BufferViewVkImpl>(); + auto* pBuffVk = pBuffViewVk->GetBufferVk(); // Use final type + if( (pBuffVk->GetDesc().BindFlags & BIND_UNORDERED_ACCESS) == 0) + { + LOG_RESOURCE_BINDING_ERROR("buffer", pBuffer, SpirvAttribs.GetPrintName(ArrayInd), ParentResLayout.GetShaderName(), "Buffer was not created with BIND_UNORDERED_ACCESS flag.") + DstRes.pObject.Release(); + return; + } +#endif + + // Do not update descriptor for a dynamic storage buffer. All dynamic resource + // descriptors are updated at once by CommitDynamicResources() when SRB is committed. + if(vkDescrSet != VK_NULL_HANDLE && SpirvAttribs.VarType != SHADER_VARIABLE_TYPE_DYNAMIC) + { + VkDescriptorBufferInfo DescrBuffInfo = DstRes.GetStorageBufferDescriptorWriteInfo(); + UpdateDescriptorHandle(vkDescrSet, ArrayInd, nullptr, &DescrBuffInfo, nullptr); + } + } +} void ShaderResourceLayoutVk::VkResource::CacheTexelBuffer(IDeviceObject* pBufferView, ShaderResourceCacheVk::Resource& DstRes, @@ -351,8 +375,10 @@ void ShaderResourceLayoutVk::VkResource::CacheTexelBuffer(IDeviceObject* auto* pBuffViewVk = DstRes.pObject.RawPtr<BufferViewVkImpl>(); #ifdef VERIFY_SHADER_BINDINGS - const auto& ViewDesc = pBuffViewVk->GetDesc(); - const auto ViewType = ViewDesc.ViewType; + // The following bits must have been set at buffer creation time: + // * VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER -> VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT + // * VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER -> VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT + const auto ViewType = pBuffViewVk->GetDesc().ViewType; const bool IsStorageBuffer = SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::StorageTexelBuffer; const auto dbgExpectedViewType = IsStorageBuffer ? BUFFER_VIEW_UNORDERED_ACCESS : BUFFER_VIEW_SHADER_RESOURCE; if (ViewType != dbgExpectedViewType) @@ -390,9 +416,8 @@ void ShaderResourceLayoutVk::VkResource::CacheImage(IDeviceObject* { #ifdef VERIFY_SHADER_BINDINGS auto* pTexViewVk = DstRes.pObject.RawPtr<TextureViewVkImpl>(); + const auto ViewType = pTexViewVk->GetDesc().ViewType; const bool IsStorageImage = SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::StorageImage; - const auto& ViewDesc = pTexViewVk->GetDesc(); - const auto ViewType = ViewDesc.ViewType; const auto dbgExpectedViewType = IsStorageImage ? TEXTURE_VIEW_UNORDERED_ACCESS : TEXTURE_VIEW_SHADER_RESOURCE; if (ViewType != dbgExpectedViewType) { @@ -475,8 +500,11 @@ void ShaderResourceLayoutVk::VkResource::BindResource(IDeviceObject *pObj, Uint3 switch (SpirvAttribs.Type) { case SPIRVShaderResourceAttribs::ResourceType::UniformBuffer: + CacheUniformBuffer(pObj, DstRes, vkDescrSet, ArrayIndex); + break; + case SPIRVShaderResourceAttribs::ResourceType::StorageBuffer: - CacheBuffer(pObj, DstRes, vkDescrSet, ArrayIndex); + CacheStorageBuffer(pObj, DstRes, vkDescrSet, ArrayIndex); break; case SPIRVShaderResourceAttribs::ResourceType::UniformTexelBuffer: @@ -718,12 +746,22 @@ void ShaderResourceLayoutVk::CommitDynamicResources(const ShaderResourceCacheVk& switch(Res.SpirvAttribs.Type) { case SPIRVShaderResourceAttribs::ResourceType::UniformBuffer: + WriteDescrSetIt->pBufferInfo = &(*DescrBuffIt); + while(ArrElem < Res.SpirvAttribs.ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) + { + const auto& CachedRes = SetResources.GetResource(Res.CacheOffset + ArrElem); + *DescrBuffIt = CachedRes.GetUniformBufferDescriptorWriteInfo(); + ++DescrBuffIt; + ++ArrElem; + } + break; + case SPIRVShaderResourceAttribs::ResourceType::StorageBuffer: WriteDescrSetIt->pBufferInfo = &(*DescrBuffIt); while(ArrElem < Res.SpirvAttribs.ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) { const auto& CachedRes = SetResources.GetResource(Res.CacheOffset + ArrElem); - *DescrBuffIt = CachedRes.GetBufferDescriptorWriteInfo(); + *DescrBuffIt = CachedRes.GetStorageBufferDescriptorWriteInfo(); ++DescrBuffIt; ++ArrElem; } diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderVariableVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderVariableVk.cpp index 461566b9..3c0a2dd8 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderVariableVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderVariableVk.cpp @@ -48,6 +48,9 @@ void ShaderVariableManagerVk::Initialize(const ShaderResourceLayoutVk& SrcLayout { m_NumVariables += IsAllowedType(VarType, AllowedTypeBits) ? SrcLayout.GetResourceCount(VarType) : 0; } + + if(m_NumVariables == 0) + return; auto *pRawMem = ALLOCATE(Allocator, "Raw memory buffer for shader variables", m_NumVariables*sizeof(ShaderVariableVkImpl)); m_pVariables = reinterpret_cast<ShaderVariableVkImpl*>(pRawMem); @@ -78,10 +81,13 @@ void ShaderVariableManagerVk::Destroy(IMemoryAllocator &Allocator) { VERIFY(m_pDbgAllocator == &Allocator, "Incosistent alloctor"); - for(Uint32 v=0; v < m_NumVariables; ++v) - m_pVariables[v].~ShaderVariableVkImpl(); - Allocator.Free(m_pVariables); - m_pVariables = nullptr; + if(m_pVariables != nullptr) + { + for(Uint32 v=0; v < m_NumVariables; ++v) + m_pVariables[v].~ShaderVariableVkImpl(); + Allocator.Free(m_pVariables); + m_pVariables = nullptr; + } } ShaderVariableVkImpl* ShaderVariableManagerVk::GetVariable(const Char* Name) |
