summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2017-08-08 00:09:25 -0500
committeriwubcode <iwubcode@users.noreply.github.com>2017-11-17 22:11:30 -0600
commit76b775d5be1f9228c648b8edc1f7bb9533acb471 (patch)
tree9338abc5fe185607082546b3b73f5d483b5fdc90 /Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
parent4d13f69dc146bff6e9f1debf4f51d38e6b1e19db (diff)
Video Common: Add XFB decoding via the GPU
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/TextureConverter.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/TextureConverter.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp b/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
index 75f274f917..b646a59fa8 100644
--- a/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
+++ b/Source/Core/VideoBackends/Vulkan/TextureConverter.cpp
@@ -61,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);
@@ -487,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},
@@ -513,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;
}
@@ -564,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