summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2017-11-19 04:58:59 +0100
committerGitHub <noreply@github.com>2017-11-19 04:58:59 +0100
commit609a17a0cd41a12c0fbf9a7c47c8889232594778 (patch)
tree0a5f6f4b0a7d480accc4dfbcc3e9c1c6e3652dc0 /Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
parentd800b0f79868a28356b4e40cb9b2e5af43977042 (diff)
parent1f1574b7ab032afa7b3a600a071699f2cbea124e (diff)
Merge pull request #5498 from iwubcode/hybrid_xfb
Hybrid xfb
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/TextureConverter.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/TextureConverter.cpp44
1 files changed, 38 insertions, 6 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp b/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
index 75b4a01f4c..b8ac91d06b 100644
--- a/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
+++ b/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
@@ -5,6 +5,7 @@
#include "VideoBackends/Vulkan/TextureConverter.h"
#include <algorithm>
+#include <array>
#include <cstddef>
#include <cstring>
#include <string>
@@ -32,6 +33,14 @@
namespace Vulkan
{
+namespace
+{
+struct EFBEncodeParams
+{
+ std::array<s32, 4> position_uniform;
+ float y_scale;
+};
+}
TextureConverter::TextureConverter()
{
}
@@ -52,6 +61,8 @@ TextureConverter::~TextureConverter()
vkDestroyBufferView(g_vulkan_context->GetDevice(), m_texel_buffer_view_r32g32_uint, nullptr);
if (m_texel_buffer_view_rgba8_unorm != VK_NULL_HANDLE)
vkDestroyBufferView(g_vulkan_context->GetDevice(), m_texel_buffer_view_rgba8_unorm, nullptr);
+ if (m_texel_buffer_view_rgba8_uint != VK_NULL_HANDLE)
+ vkDestroyBufferView(g_vulkan_context->GetDevice(), m_texel_buffer_view_rgba8_uint, nullptr);
if (m_encoding_render_pass != VK_NULL_HANDLE)
vkDestroyRenderPass(g_vulkan_context->GetDevice(), m_encoding_render_pass, nullptr);
@@ -150,7 +161,7 @@ TextureConverter::GetCommandBufferForTextureConversion(const TextureCache::TCach
// EFB copies can be used as paletted textures as well. For these, we can't assume them to be
// contain the correct data before the frame begins (when the init command buffer is executed),
// so we must convert them at the appropriate time, during the drawing command buffer.
- if (src_entry->IsEfbCopy())
+ if (src_entry->IsCopy())
{
StateTracker::GetInstance()->EndRenderPass();
StateTracker::GetInstance()->SetPendingRebind();
@@ -243,14 +254,19 @@ void TextureConverter::EncodeTextureToMemory(VkImageView src_texture, u8* dest_p
VK_NULL_HANDLE, shader);
// Uniform - int4 of left,top,native_width,scale
- s32 position_uniform[4] = {src_rect.left, src_rect.top, static_cast<s32>(native_width),
- scale_by_half ? 2 : 1};
- draw.SetPushConstants(position_uniform, sizeof(position_uniform));
+ EFBEncodeParams encoder_params;
+ encoder_params.position_uniform[0] = src_rect.left;
+ encoder_params.position_uniform[1] = src_rect.top;
+ encoder_params.position_uniform[2] = static_cast<s32>(native_width);
+ encoder_params.position_uniform[3] = scale_by_half ? 2 : 1;
+ encoder_params.y_scale = params.y_scale;
+ draw.SetPushConstants(&encoder_params, sizeof(encoder_params));
// We also linear filtering for both box filtering and downsampling higher resolutions to 1x
// TODO: This only produces perfect downsampling for 2x IR, other resolutions will need more
// complex down filtering to average all pixels and produce the correct result.
- bool linear_filter = (scale_by_half && !params.depth) || g_renderer->GetEFBScale() != 1;
+ bool linear_filter =
+ (scale_by_half && !params.depth) || g_renderer->GetEFBScale() != 1 || params.y_scale > 1.0f;
draw.SetPSSampler(0, src_texture, linear_filter ? g_object_cache->GetLinearSampler() :
g_object_cache->GetPointSampler());
@@ -473,11 +489,22 @@ void TextureConverter::DecodeTexture(VkCommandBuffer command_buffer,
// Copy/commit upload buffer.
u32 texel_buffer_offset = static_cast<u32>(m_texel_buffer->GetCurrentOffset());
+
+ Util::BufferMemoryBarrier(g_command_buffer_mgr->GetCurrentCommandBuffer(),
+ m_texel_buffer->GetBuffer(), VK_ACCESS_SHADER_READ_BIT,
+ VK_ACCESS_HOST_WRITE_BIT, texel_buffer_offset, total_upload_size,
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT);
+
std::memcpy(m_texel_buffer->GetCurrentHostPointer(), data, data_size);
if (has_palette)
std::memcpy(m_texel_buffer->GetCurrentHostPointer() + palette_offset, palette, palette_size);
m_texel_buffer->CommitMemory(total_upload_size);
+ Util::BufferMemoryBarrier(g_command_buffer_mgr->GetCurrentCommandBuffer(),
+ m_texel_buffer->GetBuffer(), VK_ACCESS_HOST_WRITE_BIT,
+ VK_ACCESS_SHADER_READ_BIT, texel_buffer_offset, total_upload_size,
+ VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
+
// Determine uniforms.
PushConstants constants = {
{width, height},
@@ -499,6 +526,9 @@ void TextureConverter::DecodeTexture(VkCommandBuffer command_buffer,
case TextureConversionShader::BUFFER_FORMAT_R32G32_UINT:
data_view = m_texel_buffer_view_r32g32_uint;
break;
+ case TextureConversionShader::BUFFER_FORMAT_RGBA8_UINT:
+ data_view = m_texel_buffer_view_rgba8_uint;
+ break;
default:
break;
}
@@ -550,10 +580,12 @@ bool TextureConverter::CreateTexelBuffer()
m_texel_buffer_view_r16_uint = CreateTexelBufferView(VK_FORMAT_R16_UINT);
m_texel_buffer_view_r32g32_uint = CreateTexelBufferView(VK_FORMAT_R32G32_UINT);
m_texel_buffer_view_rgba8_unorm = CreateTexelBufferView(VK_FORMAT_R8G8B8A8_UNORM);
+ m_texel_buffer_view_rgba8_uint = CreateTexelBufferView(VK_FORMAT_R8G8B8A8_UINT);
return m_texel_buffer_view_r8_uint != VK_NULL_HANDLE &&
m_texel_buffer_view_r16_uint != VK_NULL_HANDLE &&
m_texel_buffer_view_r32g32_uint != VK_NULL_HANDLE &&
- m_texel_buffer_view_rgba8_unorm != VK_NULL_HANDLE;
+ m_texel_buffer_view_rgba8_unorm != VK_NULL_HANDLE &&
+ m_texel_buffer_view_rgba8_uint != VK_NULL_HANDLE;
}
VkBufferView TextureConverter::CreateTexelBufferView(VkFormat format) const