summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-01-23 07:38:01 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-01-23 07:38:01 +0000
commitb8caf2173c16d8ae4ac5fc5303a1e525ef56509c (patch)
treec902c3f249a968da521e005610b789bf323f73a8 /Graphics/GraphicsEngineVulkan
parentMerge branch 'azhirnov-res_layout' into resource_signature (diff)
downloadDiligentCore-b8caf2173c16d8ae4ac5fc5303a1e525ef56509c.tar.gz
DiligentCore-b8caf2173c16d8ae4ac5fc5303a1e525ef56509c.zip
Few updates to resource signature VK implementation
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp3
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp12
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp22
3 files changed, 19 insertions, 18 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp
index 358cd3bc..2cb20f5c 100644
--- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp
+++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.hpp
@@ -481,7 +481,8 @@ private:
struct DescriptorSetBindInfo
{
- using ShaderResourceArray = std::array<RefCntAutoPtr<ShaderResourceBindingVkImpl>, MAX_RESOURCE_SIGNATURES>;
+ // Do not use strong references!
+ using ShaderResourceArray = std::array<ShaderResourceBindingVkImpl*, MAX_RESOURCE_SIGNATURES>;
using VkDescSetArray = std::array<VkDescriptorSet, MAX_RESOURCE_SIGNATURES * MAX_DESCR_SET_PER_SIGNATURE>;
using BoolArray = std::bitset<MAX_RESOURCE_SIGNATURES>;
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp
index d1e8fb38..1658dd06 100644
--- a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp
+++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp
@@ -37,7 +37,6 @@
namespace Diligent
{
-class DeviceContextVkImpl;
class ShaderResourceCacheVk;
/// Implementation of the Diligent::PipelineLayoutVk class
@@ -71,9 +70,10 @@ public:
struct ResourceInfo
{
- SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN;
- Uint16 DescrSetIndex = 0;
- Uint16 BindingIndex = 0;
+ SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN;
+
+ Uint32 DescrSetIndex = 0;
+ Uint32 BindingIndex = 0;
};
bool GetResourceInfo(const char* Name, SHADER_TYPE Stage, ResourceInfo& Info) const;
@@ -83,14 +83,14 @@ private:
VulkanUtilities::PipelineLayoutWrapper m_VkPipelineLayout;
- // Index of the first descriptor set, for every resource signature
+ // Index of the first descriptor set, for every resource signature.
FirstDescrSetIndexArrayType m_FirstDescrSetIndex = {};
// The number of resource signatures used by this pipeline layout
// (Maximum is MAX_RESOURCE_SIGNATURES)
Uint8 m_SignatureCount = 0;
- // The total number of descriptor sets used by this pipeline layout.
+ // The total number of descriptor sets used by this pipeline layout
// (Maximum is MAX_RESOURCE_SIGNATURES * 2)
Uint8 m_DescrSetCount = 0;
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp
index c4cefb88..f2245d34 100644
--- a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp
@@ -57,13 +57,13 @@ void PipelineLayoutVk::Release(RenderDeviceVkImpl* pDeviceVk, Uint64 CommandQueu
void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount)
{
- VERIFY(m_SignatureCount == 0 && m_DescrSetCount == 0,
+ VERIFY(m_SignatureCount == 0 && m_DescrSetCount == 0 && !m_VkPipelineLayout,
"This pipeline layout is already initialized");
for (Uint32 i = 0; i < SignatureCount; ++i)
{
auto* pSignature = ValidatedCast<PipelineResourceSignatureVkImpl>(ppSignatures[i]);
- VERIFY(pSignature != nullptr, "Pipeline resource signature at index ", i, " is null. This error should've been caught by ValidatePipelineResourceSignatures.");
+ VERIFY(pSignature != nullptr, "Pipeline resource signature at index ", i, " is null. This error should've been caught by ValidatePipelineResourceSignatures.");
const Uint8 Index = pSignature->GetDesc().BindingIndex;
@@ -74,7 +74,7 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi
VERIFY(m_Signatures[Index] == nullptr,
"Pipeline resource signature '", pSignature->GetDesc().Name, "' at index ", Uint32{Index},
" conflicts with another resource signature '", m_Signatures[Index]->GetDesc().Name,
- "' that uses the same index. This error should've been caught by ValidatePipelineResourceSignatureDesc.");
+ "' that uses the same index. This error should've been caught by ValidatePipelineResourceSignatures.");
m_SignatureCount = std::max<Uint8>(m_SignatureCount, Index + 1);
m_Signatures[Index] = pSignature;
@@ -88,7 +88,7 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi
m_Signatures[i] = pEmptySign;
}
- std::array<VkDescriptorSetLayout, MAX_RESOURCE_SIGNATURES * MAX_DESCR_SET_PER_SIGNATURE> DescSetLayouts;
+ std::array<VkDescriptorSetLayout, MAX_RESOURCE_SIGNATURES* MAX_DESCR_SET_PER_SIGNATURE> DescSetLayouts = {};
Uint32 DescSetLayoutCount = 0;
Uint32 DynamicUniformBufferCount = 0;
@@ -117,20 +117,20 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi
const auto& Limits = pDeviceVk->GetPhysicalDevice().GetProperties().limits;
if (DescSetLayoutCount > Limits.maxBoundDescriptorSets)
{
- LOG_ERROR_AND_THROW("The total number of descriptor sets used by the pipeline layout (", DescSetLayoutCount,
- ") exceeds device limit (", Limits.maxBoundDescriptorSets, ")");
+ LOG_ERROR_AND_THROW("The total number of descriptor sets (", DescSetLayoutCount,
+ ") used by the pipeline layout exceeds device limit (", Limits.maxBoundDescriptorSets, ")");
}
if (DynamicUniformBufferCount > Limits.maxDescriptorSetUniformBuffersDynamic)
{
- LOG_ERROR_AND_THROW("The number of dynamic uniform buffers (", DynamicUniformBufferCount,
- ") exceeds device limit (", Limits.maxDescriptorSetUniformBuffersDynamic, ")");
+ LOG_ERROR_AND_THROW("The number of dynamic uniform buffers (", DynamicUniformBufferCount,
+ ") used by the pipeline layout exceeds device limit (", Limits.maxDescriptorSetUniformBuffersDynamic, ")");
}
if (DynamicStorageBufferCount > Limits.maxDescriptorSetStorageBuffersDynamic)
{
LOG_ERROR_AND_THROW("The number of dynamic storage buffers (", DynamicStorageBufferCount,
- ") exceeds device limit (", Limits.maxDescriptorSetStorageBuffersDynamic, ")");
+ ") used by the pipeline layout exceeds device limit (", Limits.maxDescriptorSetStorageBuffersDynamic, ")");
}
VERIFY(m_DescrSetCount <= std::numeric_limits<decltype(m_DescrSetCount)>::max(),
@@ -177,8 +177,8 @@ bool PipelineLayoutVk::GetResourceInfo(const char* Name, SHADER_TYPE Stage, Reso
if ((Res.ShaderStages & Stage) && strcmp(Res.Name, Name) == 0)
{
Info.Type = Res.ResourceType;
- Info.BindingIndex = static_cast<Uint16>(Attr.BindingIndex);
- Info.DescrSetIndex = m_FirstDescrSetIndex[i] + static_cast<Uint16>(Attr.DescrSet);
+ Info.BindingIndex = Attr.BindingIndex;
+ Info.DescrSetIndex = m_FirstDescrSetIndex[i] + Attr.DescrSet;
return true;
}
}