1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[dxvk] Get rid of internal blit samplers

This commit is contained in:
Philip Rebohle 2024-09-28 20:39:03 +02:00 committed by Philip Rebohle
parent 67d1285b08
commit 150c40280f
4 changed files with 27 additions and 48 deletions

View File

@ -1726,8 +1726,10 @@ namespace dxvk {
// Common descriptor set properties that we use to
// bind the source image view to the fragment shader
Rc<DxvkSampler> 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<DxvkAccess::Write>(imageView->image());
m_cmd->trackSampler(sampler);
}
@ -3179,8 +3182,10 @@ namespace dxvk {
m_cmd->cmdSetScissor(1, &scissor);
// Bind source image view
Rc<DxvkSampler> 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<DxvkAccess::Write>(dstView->image());
m_cmd->trackResource<DxvkAccess::Read>(srcView->image());
m_cmd->trackSampler(sampler);
}
@ -6725,6 +6731,20 @@ namespace dxvk {
}
Rc<DxvkSampler> 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();

View File

@ -1741,6 +1741,9 @@ namespace dxvk {
size_t imageCount,
const DxvkRelocateImageInfo* imageInfos);
Rc<DxvkSampler> createBlitSampler(
VkFilter filter);
DxvkGraphicsPipeline* lookupGraphicsPipeline(
const DxvkGraphicsPipelineShaders& shaders);

View File

@ -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();

View File

@ -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<vk::DeviceFn> 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;