From ddde5ee6c202f98e2243bdd7774db08baa30558e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 3 Apr 2019 17:24:04 +0200 Subject: [PATCH] [dxvk] Support combined image sampler descriptors in the backend --- src/dxvk/dxvk_context.cpp | 22 ++++++++++++++++++++++ src/dxvk/dxvk_descriptor.cpp | 2 +- src/dxvk/dxvk_device.h | 10 ++++++++++ src/dxvk/dxvk_unbound.h | 17 +++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 3f4ff48fb..c7841ca7c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -3331,6 +3331,26 @@ namespace dxvk { m_descInfos[i].image = m_device->dummyImageViewDescriptor(binding.view); } break; + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + if (res.sampler != nullptr && res.imageView != nullptr + && res.imageView->handle(binding.view) != VK_NULL_HANDLE) { + updatePipelineState |= bindMask.setBound(i); + + m_descInfos[i].image.sampler = res.sampler->handle(); + m_descInfos[i].image.imageView = res.imageView->handle(binding.view); + m_descInfos[i].image.imageLayout = res.imageView->imageInfo().layout; + + if (res.imageView->imageHandle() == depthImage) + m_descInfos[i].image.imageLayout = depthLayout; + + m_cmd->trackResource(res.sampler); + m_cmd->trackResource(res.imageView); + m_cmd->trackResource(res.imageView->image()); + } else { + updatePipelineState |= bindMask.setUnbound(i); + m_descInfos[i].image = m_device->dummyImageSamplerDescriptor(binding.view); + } break; + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: if (res.bufferView != nullptr) { @@ -3750,6 +3770,7 @@ namespace dxvk { /* fall through */ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: srcAccess = m_barriers.getImageAccess( slot.imageView->image(), slot.imageView->subresources()); @@ -3824,6 +3845,7 @@ namespace dxvk { /* fall through */ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: m_barriers.accessImage( slot.imageView->image(), slot.imageView->subresources(), diff --git a/src/dxvk/dxvk_descriptor.cpp b/src/dxvk/dxvk_descriptor.cpp index d63c07e8c..e4da463ac 100644 --- a/src/dxvk/dxvk_descriptor.cpp +++ b/src/dxvk/dxvk_descriptor.cpp @@ -17,7 +17,7 @@ namespace dxvk { { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, MaxSets / 8 }, { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, MaxSets * 3 }, { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, MaxSets / 8 }, - { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, MaxSets / 16 } }}; + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, MaxSets * 2 } }}; VkDescriptorPoolCreateInfo info; info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index d0a4241c3..0c3494fc4 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -487,6 +487,16 @@ namespace dxvk { return m_unboundResources.imageViewDescriptor(type); } + /** + * \brief Dummy combined image sampler descriptor + * + * \param [in] type Required view type + * \returns Descriptor that points to a dummy image + */ + VkDescriptorImageInfo dummyImageSamplerDescriptor(VkImageViewType type) const { + return m_unboundResources.imageSamplerDescriptor(type); + } + }; } \ No newline at end of file diff --git a/src/dxvk/dxvk_unbound.h b/src/dxvk/dxvk_unbound.h index 5e5119799..92d00e85a 100644 --- a/src/dxvk/dxvk_unbound.h +++ b/src/dxvk/dxvk_unbound.h @@ -78,6 +78,23 @@ namespace dxvk { return result; } + /** + * \brief Dummy combined image sampler descriptor + * + * Contains both an image view and a sampler + * descriptor for the given image view type. + * \returns Dummy image view descriptor + */ + VkDescriptorImageInfo imageSamplerDescriptor(VkImageViewType type) const { + auto view = getImageView(type); + + VkDescriptorImageInfo result; + result.sampler = m_sampler->handle(); + result.imageView = view->handle(); + result.imageLayout = view->imageInfo().layout; + return result; + } + /** * \brief Dummy image view descriptor *