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

[dxvk] Support both linear and nearest samplers in blitter

This commit is contained in:
Philip Rebohle 2019-10-16 02:08:04 +02:00
parent 6ea21d57fe
commit e747315ba6
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 29 additions and 9 deletions

View File

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

View File

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

View File

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