diff options
| author | iwubcode <iwubcode@users.noreply.github.com> | 2017-08-08 00:09:25 -0500 |
|---|---|---|
| committer | iwubcode <iwubcode@users.noreply.github.com> | 2017-11-17 22:11:30 -0600 |
| commit | 76b775d5be1f9228c648b8edc1f7bb9533acb471 (patch) | |
| tree | 9338abc5fe185607082546b3b73f5d483b5fdc90 /Source/Core/VideoBackends/Vulkan/TextureConverter.cpp | |
| parent | 4d13f69dc146bff6e9f1debf4f51d38e6b1e19db (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.cpp | 20 |
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 |
