summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-05-29 01:02:35 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-05-29 01:02:35 +0000
commit939937b3e2abd7c473ad990f2f257d08219696ce (patch)
tree7efd20d554a3df8f316dbf48c97f6e281850d4ee /Graphics/GraphicsEngineVulkan
parentRemoved wrong comment (diff)
downloadDiligentCore-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')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/BufferViewVkImpl.h6
-rw-r--r--Graphics/GraphicsEngineVulkan/include/BufferVkImpl.h1
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h3
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h13
-rw-r--r--Graphics/GraphicsEngineVulkan/src/BufferViewVkImpl.cpp11
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp4
-rw-r--r--Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp1
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp61
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp86
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderVariableVk.cpp14
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)