summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/TextureCache.h
diff options
context:
space:
mode:
authorStenzek <stenzek@users.noreply.github.com>2016-11-04 23:11:10 +1000
committerGitHub <noreply@github.com>2016-11-04 23:11:10 +1000
commitac2971b30e015a17c8aac937092a0dfd7c4beaf5 (patch)
tree5bb0b8686a3b2e3b01155a000077a2226b70a26f /Source/Core/VideoBackends/Vulkan/TextureCache.h
parentd2fdafa1556aaa2b71017d9e2ac2dffc2e551008 (diff)
parentc880c37244d4c9d63ce3e3560383825097818d85 (diff)
Merge pull request #4374 from stenzek/vulkan-xfb
Vulkan: Cleanup and implement XFB support
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/TextureCache.h')
-rw-r--r--Source/Core/VideoBackends/Vulkan/TextureCache.h62
1 files changed, 40 insertions, 22 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/TextureCache.h b/Source/Core/VideoBackends/Vulkan/TextureCache.h
index 18c8bd6020..5da9515991 100644
--- a/Source/Core/VideoBackends/Vulkan/TextureCache.h
+++ b/Source/Core/VideoBackends/Vulkan/TextureCache.h
@@ -20,25 +20,10 @@ class TextureEncoder;
class TextureCache : public TextureCacheBase
{
public:
- TextureCache();
- ~TextureCache();
-
- bool Initialize(StateTracker* state_tracker);
-
- bool CompileShaders() override;
- void DeleteShaders() override;
- void ConvertTexture(TCacheEntryBase* base_entry, TCacheEntryBase* base_unconverted, void* palette,
- TlutFormat format) override;
-
- void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y,
- u32 memory_stride, PEControl::PixelFormat src_format, const EFBRectangle& src_rect,
- bool is_intensity, bool scale_by_half) override;
-
-private:
struct TCacheEntry : TCacheEntryBase
{
- TCacheEntry(const TCacheEntryConfig& config_, TextureCache* parent,
- std::unique_ptr<Texture2D> texture, VkFramebuffer framebuffer);
+ TCacheEntry(const TCacheEntryConfig& config_, std::unique_ptr<Texture2D> texture,
+ VkFramebuffer framebuffer);
~TCacheEntry();
Texture2D* GetTexture() const { return m_texture.get(); }
@@ -55,20 +40,51 @@ private:
bool Save(const std::string& filename, unsigned int level) override;
private:
- TextureCache* m_parent;
std::unique_ptr<Texture2D> m_texture;
-
- // If we're an EFB copy, framebuffer for drawing into.
VkFramebuffer m_framebuffer;
};
+ TextureCache();
+ ~TextureCache();
+
+ static TextureCache* GetInstance();
+
+ bool Initialize();
+
+ bool CompileShaders() override;
+ void DeleteShaders() override;
+
TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) override;
- bool CreateRenderPasses();
+ void ConvertTexture(TCacheEntryBase* base_entry, TCacheEntryBase* base_unconverted, void* palette,
+ TlutFormat format) override;
+
+ void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y,
+ u32 memory_stride, PEControl::PixelFormat src_format, const EFBRectangle& src_rect,
+ bool is_intensity, bool scale_by_half) override;
+
+ void CopyRectangleFromTexture(TCacheEntry* dst_texture, const MathUtil::Rectangle<int>& dst_rect,
+ Texture2D* src_texture, const MathUtil::Rectangle<int>& src_rect);
+
+ // Encodes texture to guest memory in XFB (YUYV) format.
+ void EncodeYUYVTextureToMemory(void* dst_ptr, u32 dst_width, u32 dst_stride, u32 dst_height,
+ Texture2D* src_texture, const MathUtil::Rectangle<int>& src_rect);
+ // Decodes data from guest memory in XFB (YUYV) format to a RGBA format texture on the GPU.
+ void DecodeYUYVTextureFromMemory(TCacheEntry* dst_texture, const void* src_ptr, u32 src_width,
+ u32 src_stride, u32 src_height);
+
+private:
+ bool CreateRenderPasses();
VkRenderPass GetRenderPassForTextureUpdate(const Texture2D* texture) const;
- StateTracker* m_state_tracker = nullptr;
+ // Copies the contents of a texture using vkCmdCopyImage
+ void CopyTextureRectangle(TCacheEntry* dst_texture, const MathUtil::Rectangle<int>& dst_rect,
+ Texture2D* src_texture, const MathUtil::Rectangle<int>& src_rect);
+
+ // Copies (and optionally scales) the contents of a texture using a framgent shader.
+ void ScaleTextureRectangle(TCacheEntry* dst_texture, const MathUtil::Rectangle<int>& dst_rect,
+ Texture2D* src_texture, const MathUtil::Rectangle<int>& src_rect);
VkRenderPass m_initialize_render_pass = VK_NULL_HANDLE;
VkRenderPass m_update_render_pass = VK_NULL_HANDLE;
@@ -82,6 +98,8 @@ private:
VkShaderModule m_copy_shader = VK_NULL_HANDLE;
VkShaderModule m_efb_color_to_tex_shader = VK_NULL_HANDLE;
VkShaderModule m_efb_depth_to_tex_shader = VK_NULL_HANDLE;
+ VkShaderModule m_rgb_to_yuyv_shader = VK_NULL_HANDLE;
+ VkShaderModule m_yuyv_to_rgb_shader = VK_NULL_HANDLE;
};
} // namespace Vulkan