From 311d84d767b9385ea6004ed87886b72a0fe18bc0 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Mon, 29 Oct 2018 08:42:49 -0700 Subject: Fixed issue with binding sampler array elements of combined image samplers in Vk backend --- Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp | 5 +++++ Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp index 32a1d588..8eabf75f 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp @@ -218,6 +218,7 @@ template void ShaderResourceCacheVk::TransitionResources(DeviceContextVkIm VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetUniformBufferDescriptorWriteInfo()const { VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::UniformBuffer, "Uniform buffer resource is expected"); + DEV_CHECK_ERR(pObject != nullptr, "Unable to get uniform buffer write info: cached object is null"); auto* pBuffVk = pObject.RawPtr(); // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC descriptor type require @@ -236,6 +237,7 @@ VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetUniformBufferDescript VkDescriptorBufferInfo ShaderResourceCacheVk::Resource::GetStorageBufferDescriptorWriteInfo()const { VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::StorageBuffer, "Storage buffer resource is expected"); + DEV_CHECK_ERR(pObject != nullptr, "Unable to get storage buffer write info: cached object is null"); auto* pBuffViewVk = pObject.RawPtr(); const auto& ViewDesc = pBuffViewVk->GetDesc(); @@ -261,6 +263,7 @@ VkDescriptorImageInfo ShaderResourceCacheVk::Resource::GetImageDescriptorWriteIn Type == SPIRVShaderResourceAttribs::ResourceType::SeparateImage || Type == SPIRVShaderResourceAttribs::ResourceType::SampledImage, "Storage image, separate image or sampled image resource is expected"); + DEV_CHECK_ERR(pObject != nullptr, "Unable to get image descriptor write info: cached object is null"); bool IsStorageImage = Type == SPIRVShaderResourceAttribs::ResourceType::StorageImage; @@ -310,6 +313,7 @@ VkBufferView ShaderResourceCacheVk::Resource::GetBufferViewWriteInfo()const VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::UniformTexelBuffer || Type == SPIRVShaderResourceAttribs::ResourceType::StorageTexelBuffer, "Uniform or storage buffer resource is expected"); + DEV_CHECK_ERR(pObject != nullptr, "Unable to get buffer view write info: cached object is null"); // The following bits must have been set at buffer creation time: // * VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER -> VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT @@ -321,6 +325,7 @@ VkBufferView ShaderResourceCacheVk::Resource::GetBufferViewWriteInfo()const VkDescriptorImageInfo ShaderResourceCacheVk::Resource::GetSamplerDescriptorWriteInfo()const { VERIFY(Type == SPIRVShaderResourceAttribs::ResourceType::SeparateSampler, "Separate sampler resource is expected"); + DEV_CHECK_ERR(pObject != nullptr, "Unable to get separate sampler descriptor write info: cached object is null"); auto* pSamplerVk = pObject.RawPtr(); VkDescriptorImageInfo DescrImgInfo; diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp index 5f2f87bc..b9a5a346 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp @@ -629,9 +629,9 @@ void ShaderResourceLayoutVk::VkResource::BindResource(IDeviceObject *pObj, Uint3 VERIFY_EXPR(SpirvAttribs.Type == SPIRVShaderResourceAttribs::ResourceType::SeparateImage); DEV_CHECK_ERR(SeparateSampler.SpirvAttribs.ArraySize == 1 || SeparateSampler.SpirvAttribs.ArraySize == SpirvAttribs.ArraySize, "Array size (", SeparateSampler.SpirvAttribs.ArraySize,") of separate sampler variable '", - SeparateSampler.SpirvAttribs.Name, "' must be one or same as the array size (", SpirvAttribs.ArraySize, + SeparateSampler.SpirvAttribs.Name, "' must be one or the same as the array size (", SpirvAttribs.ArraySize, ") of separate image variable '", SpirvAttribs.Name, "' it is assigned to"); - Uint32 SamplerArrInd = SeparateSampler.SpirvAttribs.ArraySize == 0 ? ArrayIndex : 0; + Uint32 SamplerArrInd = SeparateSampler.SpirvAttribs.ArraySize == 1 ? 0 : ArrayIndex; SeparateSampler.BindResource(pSampler, SamplerArrInd, ResourceCache); } ); -- cgit v1.2.3