From e747315ba667c37de81f859c8b2b96194f6b7073 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 16 Oct 2019 02:08:04 +0200 Subject: [PATCH] [dxvk] Support both linear and nearest samplers in blitter --- src/dxvk/dxvk_context.cpp | 2 +- src/dxvk/dxvk_meta_blit.cpp | 21 +++++++++++++++------ src/dxvk/dxvk_meta_blit.h | 15 +++++++++++++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 635c63e1..80de1ea3 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1629,7 +1629,7 @@ namespace dxvk { // Common descriptor set properties that we use to // bind the source image view to the fragment shader VkDescriptorImageInfo descriptorImage; - descriptorImage.sampler = VK_NULL_HANDLE; + descriptorImage.sampler = m_common->metaBlit().getSampler(VK_FILTER_LINEAR); descriptorImage.imageView = VK_NULL_HANDLE; descriptorImage.imageLayout = imageView->imageInfo().layout; diff --git a/src/dxvk/dxvk_meta_blit.cpp b/src/dxvk/dxvk_meta_blit.cpp index 5cb5230b..8213a967 100644 --- a/src/dxvk/dxvk_meta_blit.cpp +++ b/src/dxvk/dxvk_meta_blit.cpp @@ -13,7 +13,8 @@ namespace dxvk { DxvkMetaBlitObjects::DxvkMetaBlitObjects(const DxvkDevice* device) : m_vkd (device->vkd()), - m_sampler (createSampler()), + m_samplerCopy (createSampler(VK_FILTER_NEAREST)), + m_samplerBlit (createSampler(VK_FILTER_LINEAR)), m_shaderFrag1D(createShaderModule(dxvk_blit_frag_1d)), m_shaderFrag2D(createShaderModule(dxvk_blit_frag_2d)), m_shaderFrag3D(createShaderModule(dxvk_blit_frag_3d)) { @@ -42,7 +43,8 @@ namespace dxvk { m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderGeom, nullptr); m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderVert, nullptr); - m_vkd->vkDestroySampler(m_vkd->device(), m_sampler, nullptr); + m_vkd->vkDestroySampler(m_vkd->device(), m_samplerBlit, nullptr); + m_vkd->vkDestroySampler(m_vkd->device(), m_samplerCopy, nullptr); } @@ -65,6 +67,13 @@ namespace dxvk { } + VkSampler DxvkMetaBlitObjects::getSampler(VkFilter filter) { + return filter == VK_FILTER_NEAREST + ? m_samplerCopy + : m_samplerBlit; + } + + VkRenderPass DxvkMetaBlitObjects::getRenderPass(VkFormat viewFormat) { auto entry = m_renderPasses.find(viewFormat); if (entry != m_renderPasses.end()) @@ -76,13 +85,13 @@ namespace dxvk { } - VkSampler DxvkMetaBlitObjects::createSampler() const { + VkSampler DxvkMetaBlitObjects::createSampler(VkFilter filter) const { VkSamplerCreateInfo info; info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; info.pNext = nullptr; info.flags = 0; - info.magFilter = VK_FILTER_LINEAR; - info.minFilter = VK_FILTER_LINEAR; + info.magFilter = filter; + info.minFilter = filter; info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; @@ -184,7 +193,7 @@ namespace dxvk { binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - binding.pImmutableSamplers = &m_sampler; + binding.pImmutableSamplers = nullptr; VkDescriptorSetLayoutCreateInfo info; info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; diff --git a/src/dxvk/dxvk_meta_blit.h b/src/dxvk/dxvk_meta_blit.h index a7a89586..f0be9dd1 100644 --- a/src/dxvk/dxvk_meta_blit.h +++ b/src/dxvk/dxvk_meta_blit.h @@ -94,11 +94,21 @@ namespace dxvk { VkImageViewType viewType, VkFormat viewFormat); + /** + * \brief Retrieves sampler with a given filter + * + * \param [in] filter The desired filter + * \returns Sampler object with the given filter + */ + VkSampler getSampler( + VkFilter filter); + private: Rc m_vkd; - VkSampler m_sampler; + VkSampler m_samplerCopy; + VkSampler m_samplerBlit; VkShaderModule m_shaderVert = VK_NULL_HANDLE; VkShaderModule m_shaderGeom = VK_NULL_HANDLE; @@ -120,7 +130,8 @@ namespace dxvk { VkRenderPass getRenderPass( VkFormat viewFormat); - VkSampler createSampler() const; + VkSampler createSampler( + VkFilter filter) const; VkShaderModule createShaderModule( const SpirvCodeBuffer& code) const;