|
|
|
@ -152,7 +152,9 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, |
|
|
|
use_accelerated ? screen_info.image_view : *raw_image_views[image_index]; |
|
|
|
|
|
|
|
if (!fsr) { |
|
|
|
UpdateDescriptorSet(image_index, source_image_view); |
|
|
|
const bool is_nn = |
|
|
|
Settings::values.scaling_filter.GetValue() == Settings::ScalingFilter::NearestNeighbor; |
|
|
|
UpdateDescriptorSet(image_index, source_image_view, is_nn); |
|
|
|
} |
|
|
|
|
|
|
|
BufferData data; |
|
|
|
@ -247,7 +249,7 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, |
|
|
|
crop_rect = crop_rect.Scale(Settings::values.resolution_info.up_factor); |
|
|
|
VkImageView fsr_image_view = |
|
|
|
fsr->Draw(scheduler, image_index, source_image_view, crop_rect); |
|
|
|
UpdateDescriptorSet(image_index, fsr_image_view); |
|
|
|
UpdateDescriptorSet(image_index, fsr_image_view, true); |
|
|
|
} |
|
|
|
|
|
|
|
scheduler.Record( |
|
|
|
@ -286,6 +288,9 @@ VkSemaphore VKBlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, |
|
|
|
const auto filter = Settings::values.scaling_filter.GetValue(); |
|
|
|
cmdbuf.BeginRenderPass(renderpass_bi, VK_SUBPASS_CONTENTS_INLINE); |
|
|
|
switch (filter) { |
|
|
|
case Settings::ScalingFilter::NearestNeighbor: |
|
|
|
cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *bilinear_pipeline); |
|
|
|
break; |
|
|
|
case Settings::ScalingFilter::Bilinear: |
|
|
|
cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *bilinear_pipeline); |
|
|
|
break; |
|
|
|
@ -745,13 +750,33 @@ void VKBlitScreen::CreateGraphicsPipeline() { |
|
|
|
} |
|
|
|
|
|
|
|
void VKBlitScreen::CreateSampler() { |
|
|
|
bool linear = Settings::values.scaling_filter.GetValue() != Settings::ScalingFilter::Fsr; |
|
|
|
const VkSamplerCreateInfo ci{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.magFilter = linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST, |
|
|
|
.minFilter = linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST, |
|
|
|
.magFilter = VK_FILTER_LINEAR, |
|
|
|
.minFilter = VK_FILTER_LINEAR, |
|
|
|
.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, |
|
|
|
.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, |
|
|
|
.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, |
|
|
|
.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, |
|
|
|
.mipLodBias = 0.0f, |
|
|
|
.anisotropyEnable = VK_FALSE, |
|
|
|
.maxAnisotropy = 0.0f, |
|
|
|
.compareEnable = VK_FALSE, |
|
|
|
.compareOp = VK_COMPARE_OP_NEVER, |
|
|
|
.minLod = 0.0f, |
|
|
|
.maxLod = 0.0f, |
|
|
|
.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, |
|
|
|
.unnormalizedCoordinates = VK_FALSE, |
|
|
|
}; |
|
|
|
|
|
|
|
const VkSamplerCreateInfo ci_nn{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.magFilter = VK_FILTER_NEAREST, |
|
|
|
.minFilter = VK_FILTER_NEAREST, |
|
|
|
.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, |
|
|
|
.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, |
|
|
|
.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, |
|
|
|
@ -768,6 +793,7 @@ void VKBlitScreen::CreateSampler() { |
|
|
|
}; |
|
|
|
|
|
|
|
sampler = device.GetLogical().CreateSampler(ci); |
|
|
|
nn_sampler = device.GetLogical().CreateSampler(ci_nn); |
|
|
|
} |
|
|
|
|
|
|
|
void VKBlitScreen::CreateFramebuffers() { |
|
|
|
@ -862,7 +888,8 @@ void VKBlitScreen::CreateRawImages(const Tegra::FramebufferConfig& framebuffer) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void VKBlitScreen::UpdateDescriptorSet(std::size_t image_index, VkImageView image_view) const { |
|
|
|
void VKBlitScreen::UpdateDescriptorSet(std::size_t image_index, VkImageView image_view, |
|
|
|
bool nn) const { |
|
|
|
const VkDescriptorBufferInfo buffer_info{ |
|
|
|
.buffer = *buffer, |
|
|
|
.offset = offsetof(BufferData, uniform), |
|
|
|
@ -883,7 +910,7 @@ void VKBlitScreen::UpdateDescriptorSet(std::size_t image_index, VkImageView imag |
|
|
|
}; |
|
|
|
|
|
|
|
const VkDescriptorImageInfo image_info{ |
|
|
|
.sampler = *sampler, |
|
|
|
.sampler = nn ? *nn_sampler : *sampler, |
|
|
|
.imageView = image_view, |
|
|
|
.imageLayout = VK_IMAGE_LAYOUT_GENERAL, |
|
|
|
}; |
|
|
|
|