From fb224aa1a0df31834530654c28f38c26d45aeade Mon Sep 17 00:00:00 2001 From: Mark Kendall Date: Mon, 7 Sep 2020 17:51:07 +0100 Subject: [PATCH] Vulkan: Add MythBufferVulkan - re-enable compilation of MythVertexBufferVulkan - add base class MythBufferVulkan - a generic Vulkan buffer class --- mythtv/libs/libmythui/libmythui.pro | 2 + .../vulkan/mythvertexbuffervulkan.cpp | 51 +++++++++++++------ .../libmythui/vulkan/mythvertexbuffervulkan.h | 48 +++++++++++------ 3 files changed, 70 insertions(+), 31 deletions(-) diff --git a/mythtv/libs/libmythui/libmythui.pro b/mythtv/libs/libmythui/libmythui.pro index 0f40ce3892b..0ab4a86e297 100644 --- a/mythtv/libs/libmythui/libmythui.pro +++ b/mythtv/libs/libmythui/libmythui.pro @@ -205,6 +205,7 @@ using_vulkan { HEADERS += vulkan/mythuniformbuffervulkan.h HEADERS += vulkan/mythcombobuffervulkan.h HEADERS += vulkan/mythdebugvulkan.h + HEADERS += vulkan/mythvertexbuffervulkan.h SOURCES += vulkan/mythpainterwindowvulkan.cpp SOURCES += vulkan/mythpaintervulkan.cpp SOURCES += vulkan/mythrendervulkan.cpp @@ -214,6 +215,7 @@ using_vulkan { SOURCES += vulkan/mythuniformbuffervulkan.cpp SOURCES += vulkan/mythcombobuffervulkan.cpp SOURCES += vulkan/mythdebugvulkan.cpp + SOURCES += vulkan/mythvertexbuffervulkan.cpp using_libglslang: DEFINES += USING_GLSLANG } diff --git a/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.cpp b/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.cpp index 192f0ccaddc..09c909477b2 100644 --- a/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.cpp +++ b/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.cpp @@ -2,12 +2,12 @@ #include "mythlogging.h" #include "vulkan/mythvertexbuffervulkan.h" -#define LOC QString("VulkanVBO: ") +#define LOC QString("VulkanBuf: ") -MythVertexBufferVulkan* MythVertexBufferVulkan::Create(MythRenderVulkan *Render, VkDevice Device, - QVulkanDeviceFunctions *Functions, VkDeviceSize Size) +MythBufferVulkan* MythBufferVulkan::Create(MythRenderVulkan *Render, VkDevice Device, + QVulkanDeviceFunctions *Functions, VkDeviceSize Size) { - MythVertexBufferVulkan* result = new MythVertexBufferVulkan(Render, Device, Functions, Size); + MythBufferVulkan* result = new MythBufferVulkan(Render, Device, Functions, Size); if (result && !result->IsValid()) { delete result; @@ -16,17 +16,14 @@ MythVertexBufferVulkan* MythVertexBufferVulkan::Create(MythRenderVulkan *Render, return result; } -MythVertexBufferVulkan::MythVertexBufferVulkan(MythRenderVulkan *Render, VkDevice Device, - QVulkanDeviceFunctions* Functions, VkDeviceSize Size) +MythBufferVulkan::MythBufferVulkan(MythRenderVulkan *Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size) : MythVulkanObject(Render, Device, Functions), m_bufferSize(Size) { - if (!m_valid) - return; - - if (m_render->CreateBuffer(Size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - m_stagingBuffer, m_stagingMemory)) + if (m_valid && m_render->CreateBuffer(Size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + m_stagingBuffer, m_stagingMemory)) { if (m_render->CreateBuffer(Size, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, @@ -37,7 +34,7 @@ MythVertexBufferVulkan::MythVertexBufferVulkan(MythRenderVulkan *Render, VkDevic } } -MythVertexBufferVulkan::~MythVertexBufferVulkan() +MythBufferVulkan::~MythBufferVulkan() { if (m_device && m_devFuncs) { @@ -48,15 +45,39 @@ MythVertexBufferVulkan::~MythVertexBufferVulkan() } } -VkBuffer MythVertexBufferVulkan::GetBuffer(void) const +VkBuffer MythBufferVulkan::GetBuffer(void) const { return m_buffer; } -void* MythVertexBufferVulkan::GetMappedMemory(void) const + +void* MythBufferVulkan::GetMappedMemory(void) const { return m_mappedMemory; } +void MythBufferVulkan::Update(VkCommandBuffer CommandBuffer) +{ + m_render->CopyBuffer(m_stagingBuffer, m_buffer, m_bufferSize, CommandBuffer); +} + +MythVertexBufferVulkan* MythVertexBufferVulkan::Create(MythRenderVulkan *Render, VkDevice Device, + QVulkanDeviceFunctions *Functions, VkDeviceSize Size) +{ + MythVertexBufferVulkan* result = new MythVertexBufferVulkan(Render, Device, Functions, Size); + if (result && !result->IsValid()) + { + delete result; + result = nullptr; + } + return result; +} + +MythVertexBufferVulkan::MythVertexBufferVulkan(MythRenderVulkan *Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size) + : MythBufferVulkan(Render, Device, Functions, Size) +{ +} + void MythVertexBufferVulkan::Update(const QRect &Source, const QRect &Dest, int Alpha, int Rotation, VkCommandBuffer CommandBuffer) { diff --git a/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.h b/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.h index 81d0c8ef663..99d852d5f0e 100644 --- a/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.h +++ b/mythtv/libs/libmythui/vulkan/mythvertexbuffervulkan.h @@ -4,24 +4,20 @@ // MythTV #include "vulkan/mythrendervulkan.h" -class MythVertexBufferVulkan : protected MythVulkanObject +class MythBufferVulkan : protected MythVulkanObject { public: - static MythVertexBufferVulkan* Create(MythRenderVulkan* Render, VkDevice Device, - QVulkanDeviceFunctions* Functions, VkDeviceSize Size); - ~MythVertexBufferVulkan(); + static MythBufferVulkan* Create(MythRenderVulkan* Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size); + virtual ~MythBufferVulkan(); - VkBuffer GetBuffer (void) const; - bool NeedsUpdate (const QRect& Source, const QRect& Dest, int Alpha, int Rotation); - void* GetMappedMemory (void) const; - void Update (const QRect& Source, const QRect& Dest, int Alpha, int Rotation, - VkCommandBuffer CommandBuffer = nullptr); + VkBuffer GetBuffer () const; + void* GetMappedMemory () const; + void Update (VkCommandBuffer CommandBuffer = nullptr); protected: - MythVertexBufferVulkan(MythRenderVulkan* Render, VkDevice Device, - QVulkanDeviceFunctions* Functions, VkDeviceSize Size); - private: - Q_DISABLE_COPY(MythVertexBufferVulkan) + MythBufferVulkan(MythRenderVulkan* Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size); VkDeviceSize m_bufferSize { 0 }; VkBuffer m_buffer { nullptr }; @@ -29,10 +25,30 @@ class MythVertexBufferVulkan : protected MythVulkanObject VkBuffer m_stagingBuffer { nullptr }; VkDeviceMemory m_stagingMemory { nullptr }; void* m_mappedMemory { nullptr }; + + private: + Q_DISABLE_COPY(MythBufferVulkan) +}; + +class MythVertexBufferVulkan : public MythBufferVulkan +{ + public: + static MythVertexBufferVulkan* Create(MythRenderVulkan* Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size); + + bool NeedsUpdate (const QRect& Source, const QRect& Dest, int Alpha, int Rotation); + void Update (const QRect& Source, const QRect& Dest, int Alpha, int Rotation, + VkCommandBuffer CommandBuffer = nullptr); + + protected: + MythVertexBufferVulkan(MythRenderVulkan* Render, VkDevice Device, + QVulkanDeviceFunctions* Functions, VkDeviceSize Size); + + private: QRect m_source; QRect m_dest; - int m_rotation { 0 }; - int m_alpha { 255 }; + int m_rotation { 0 }; + int m_alpha { 255 }; }; -#endif // MYTHVBOVULKAN_H +#endif