From 150c40280f9c1542239db1e37acd135e9178cbe3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 28 Sep 2024 20:39:03 +0200 Subject: [PATCH] [dxvk] Get rid of internal blit samplers --- src/dxvk/dxvk_context.cpp | 24 ++++++++++++++++++++++-- src/dxvk/dxvk_context.h | 3 +++ src/dxvk/dxvk_meta_blit.cpp | 33 ++------------------------------- src/dxvk/dxvk_meta_blit.h | 15 --------------- 4 files changed, 27 insertions(+), 48 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 9774e1916..9b0b4cfa5 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1726,8 +1726,10 @@ namespace dxvk { // Common descriptor set properties that we use to // bind the source image view to the fragment shader + Rc sampler = createBlitSampler(filter); + VkDescriptorImageInfo descriptorImage = { }; - descriptorImage.sampler = m_common->metaBlit().getSampler(filter); + descriptorImage.sampler = sampler->handle(); descriptorImage.imageLayout = srcLayout; VkWriteDescriptorSet descriptorWrite = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET }; @@ -1850,6 +1852,7 @@ namespace dxvk { } m_cmd->trackResource(imageView->image()); + m_cmd->trackSampler(sampler); } @@ -3179,8 +3182,10 @@ namespace dxvk { m_cmd->cmdSetScissor(1, &scissor); // Bind source image view + Rc sampler = createBlitSampler(filter); + VkDescriptorImageInfo descriptorImage; - descriptorImage.sampler = m_common->metaBlit().getSampler(filter); + descriptorImage.sampler = sampler->handle(); descriptorImage.imageView = srcView->handle(); descriptorImage.imageLayout = srcLayout; @@ -3240,6 +3245,7 @@ namespace dxvk { m_cmd->trackResource(dstView->image()); m_cmd->trackResource(srcView->image()); + m_cmd->trackSampler(sampler); } @@ -6725,6 +6731,20 @@ namespace dxvk { } + Rc DxvkContext::createBlitSampler( + VkFilter filter) { + DxvkSamplerKey samplerKey; + samplerKey.setFilter(filter, filter, + VK_SAMPLER_MIPMAP_MODE_NEAREST); + samplerKey.setAddressModes( + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); + + return m_device->createSampler(samplerKey); + } + + DxvkGraphicsPipeline* DxvkContext::lookupGraphicsPipeline( const DxvkGraphicsPipelineShaders& shaders) { auto idx = shaders.hash() % m_gpLookupCache.size(); diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 86f4a8514..8475a85cd 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1741,6 +1741,9 @@ namespace dxvk { size_t imageCount, const DxvkRelocateImageInfo* imageInfos); + Rc createBlitSampler( + VkFilter filter); + DxvkGraphicsPipeline* lookupGraphicsPipeline( const DxvkGraphicsPipelineShaders& shaders); diff --git a/src/dxvk/dxvk_meta_blit.cpp b/src/dxvk/dxvk_meta_blit.cpp index e2a3abdef..f439774c7 100644 --- a/src/dxvk/dxvk_meta_blit.cpp +++ b/src/dxvk/dxvk_meta_blit.cpp @@ -13,8 +13,6 @@ namespace dxvk { DxvkMetaBlitObjects::DxvkMetaBlitObjects(const DxvkDevice* device) : m_vkd (device->vkd()), - 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)) { @@ -39,9 +37,6 @@ namespace dxvk { m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderFrag1D, nullptr); 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_samplerBlit, nullptr); - m_vkd->vkDestroySampler(m_vkd->device(), m_samplerCopy, nullptr); } @@ -64,32 +59,8 @@ namespace dxvk { m_pipelines.insert({ key, pipeline }); return pipeline; } - - - VkSampler DxvkMetaBlitObjects::getSampler(VkFilter filter) { - return filter == VK_FILTER_NEAREST - ? m_samplerCopy - : m_samplerBlit; - } - - - VkSampler DxvkMetaBlitObjects::createSampler(VkFilter filter) const { - VkSamplerCreateInfo info = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO }; - 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; - info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; - - VkSampler result = VK_NULL_HANDLE; - if (m_vkd->vkCreateSampler(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS) - throw DxvkError("DxvkMetaBlitObjects: Failed to create sampler"); - return result; - } - - + + VkShaderModule DxvkMetaBlitObjects::createShaderModule(const SpirvCodeBuffer& code) const { VkShaderModuleCreateInfo info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO }; info.codeSize = code.size(); diff --git a/src/dxvk/dxvk_meta_blit.h b/src/dxvk/dxvk_meta_blit.h index cd2382e83..cbbc3dc6b 100644 --- a/src/dxvk/dxvk_meta_blit.h +++ b/src/dxvk/dxvk_meta_blit.h @@ -115,22 +115,10 @@ namespace dxvk { VkFormat viewFormat, VkSampleCountFlagBits samples); - /** - * \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_samplerCopy; - VkSampler m_samplerBlit; - VkShaderModule m_shaderVert = VK_NULL_HANDLE; VkShaderModule m_shaderGeom = VK_NULL_HANDLE; VkShaderModule m_shaderFrag1D = VK_NULL_HANDLE; @@ -144,9 +132,6 @@ namespace dxvk { DxvkMetaBlitPipeline, DxvkHash, DxvkEq> m_pipelines; - VkSampler createSampler( - VkFilter filter) const; - VkShaderModule createShaderModule( const SpirvCodeBuffer& code) const;