From 48b3b3ee85c99589da130dae95733b97c7792472 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 11 Oct 2019 02:58:39 +0200 Subject: [PATCH] [dxvk] Use float format for sampled unbound image views Fixes validation errors in many cases if a texture is not bound. --- src/dxvk/dxvk_context.cpp | 4 ++-- src/dxvk/dxvk_unbound.cpp | 45 ++++++++++++++++++++++++--------------- src/dxvk/dxvk_unbound.h | 40 +++++++++++++++++++++++----------- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 02666834..0d52838c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -3753,7 +3753,7 @@ namespace dxvk { } } else { bindMask.clr(i); - descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view); + descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, true); } break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: @@ -3771,7 +3771,7 @@ namespace dxvk { } } else { bindMask.clr(i); - descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view); + descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, false); } break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: diff --git a/src/dxvk/dxvk_unbound.cpp b/src/dxvk/dxvk_unbound.cpp index e634bc7f..762c0ed0 100644 --- a/src/dxvk/dxvk_unbound.cpp +++ b/src/dxvk/dxvk_unbound.cpp @@ -9,13 +9,8 @@ namespace dxvk { m_image1D (createImage(dev, VK_IMAGE_TYPE_1D, 1)), m_image2D (createImage(dev, VK_IMAGE_TYPE_2D, 6)), m_image3D (createImage(dev, VK_IMAGE_TYPE_3D, 1)), - m_view1D (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D, 1)), - m_view1DArr (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, 1)), - m_view2D (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_2D, 1)), - m_view2DArr (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY, 1)), - m_viewCube (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_CUBE, 6)), - m_viewCubeArr (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, 6)), - m_view3D (createImageView(dev, m_image3D, VK_IMAGE_VIEW_TYPE_3D, 1)) { + m_viewsSampled (createImageViews(dev, VK_FORMAT_R32_SFLOAT)), + m_viewsStorage (createImageViews(dev, VK_FORMAT_R32_UINT)) { } @@ -128,11 +123,12 @@ namespace dxvk { Rc DxvkUnboundResources::createImageView( DxvkDevice* dev, const Rc& image, + VkFormat format, VkImageViewType type, uint32_t layers) { DxvkImageViewCreateInfo info; info.type = type; - info.format = image->info().format; + info.format = format; info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT; info.aspect = VK_IMAGE_ASPECT_COLOR_BIT; @@ -148,16 +144,31 @@ namespace dxvk { } - const DxvkImageView* DxvkUnboundResources::getImageView(VkImageViewType type) const { + DxvkUnboundResources::UnboundViews DxvkUnboundResources::createImageViews(DxvkDevice* dev, VkFormat format) { + UnboundViews result; + result.view1D = createImageView(dev, m_image1D, format, VK_IMAGE_VIEW_TYPE_1D, 1); + result.view1DArr = createImageView(dev, m_image1D, format, VK_IMAGE_VIEW_TYPE_1D_ARRAY, 1); + result.view2D = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_2D, 1); + result.view2DArr = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_2D_ARRAY, 1); + result.viewCube = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_CUBE, 6); + result.viewCubeArr = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, 6); + result.view3D = createImageView(dev, m_image3D, format, VK_IMAGE_VIEW_TYPE_3D, 1); + return result; + } + + + const DxvkImageView* DxvkUnboundResources::getImageView(VkImageViewType type, bool sampled) const { + auto views = sampled ? &m_viewsSampled : &m_viewsStorage; + switch (type) { - case VK_IMAGE_VIEW_TYPE_1D: return m_view1D.ptr(); - case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return m_view1DArr.ptr(); - case VK_IMAGE_VIEW_TYPE_2D: return m_view2D.ptr(); - case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return m_view2DArr.ptr(); - case VK_IMAGE_VIEW_TYPE_CUBE: return m_viewCube.ptr(); - case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return m_viewCubeArr.ptr(); - case VK_IMAGE_VIEW_TYPE_3D: return m_view3D.ptr(); - default: Logger::err("null"); return nullptr; + case VK_IMAGE_VIEW_TYPE_1D: return views->view1D.ptr(); + case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return views->view1DArr.ptr(); + case VK_IMAGE_VIEW_TYPE_2D: return views->view2D.ptr(); + case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return views->view2DArr.ptr(); + case VK_IMAGE_VIEW_TYPE_CUBE: return views->viewCube.ptr(); + case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return views->viewCubeArr.ptr(); + case VK_IMAGE_VIEW_TYPE_3D: return views->view3D.ptr(); + default: return nullptr; } } diff --git a/src/dxvk/dxvk_unbound.h b/src/dxvk/dxvk_unbound.h index c9a5cf63..d9ae01e0 100644 --- a/src/dxvk/dxvk_unbound.h +++ b/src/dxvk/dxvk_unbound.h @@ -85,10 +85,11 @@ namespace dxvk { * * Contains both an image view and a sampler * descriptor for the given image view type. + * \param [in] type Image view type * \returns Dummy image view descriptor */ VkDescriptorImageInfo imageSamplerDescriptor(VkImageViewType type) const { - auto view = getImageView(type); + auto view = getImageView(type, true); VkDescriptorImageInfo result; result.sampler = m_sampler->handle(); @@ -103,10 +104,12 @@ namespace dxvk { * Points to an image view which, instead of * reading image data, will return zeroes for * all components unconditionally. + * \param [in] type Image view type + * \param [in] sampled Format selector * \returns Dummy image view descriptor */ - VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type) const { - auto view = getImageView(type); + VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type, bool sampled) const { + auto view = getImageView(type, sampled); VkDescriptorImageInfo result; result.sampler = VK_NULL_HANDLE; @@ -125,6 +128,16 @@ namespace dxvk { private: + struct UnboundViews { + Rc view1D; + Rc view1DArr; + Rc view2D; + Rc view2DArr; + Rc viewCube; + Rc viewCubeArr; + Rc view3D; + }; + Rc m_sampler; Rc m_buffer; @@ -133,14 +146,9 @@ namespace dxvk { Rc m_image1D; Rc m_image2D; Rc m_image3D; - - Rc m_view1D; - Rc m_view1DArr; - Rc m_view2D; - Rc m_view2DArr; - Rc m_viewCube; - Rc m_viewCubeArr; - Rc m_view3D; + + UnboundViews m_viewsSampled; + UnboundViews m_viewsStorage; Rc createSampler(DxvkDevice* dev); @@ -158,11 +166,17 @@ namespace dxvk { Rc createImageView( DxvkDevice* dev, const Rc& image, + VkFormat format, VkImageViewType type, uint32_t layers); - + + UnboundViews createImageViews( + DxvkDevice* dev, + VkFormat format); + const DxvkImageView* getImageView( - VkImageViewType type) const; + VkImageViewType type, + bool sampled) const; void clearBuffer( const Rc& ctx,