diff --git a/xbmc/cores/RetroPlayer/buffers/CMakeLists.txt b/xbmc/cores/RetroPlayer/buffers/CMakeLists.txt index 8410f6abdc885..f48420e16d271 100644 --- a/xbmc/cores/RetroPlayer/buffers/CMakeLists.txt +++ b/xbmc/cores/RetroPlayer/buffers/CMakeLists.txt @@ -24,7 +24,7 @@ if(OPENGL_FOUND) RenderBufferPoolOpenGL.cpp) endif() -if(CORE_PLATFORM_NAME_LC STREQUAL gbm AND OPENGLES_FOUND) +if(CORE_PLATFORM_NAME_LC STREQUAL gbm OR CORE_PLATFORM_NAME_LC STREQUAL wayland) list(APPEND SOURCES RenderBufferDMA.cpp RenderBufferPoolDMA.cpp) list(APPEND HEADERS RenderBufferDMA.h diff --git a/xbmc/cores/RetroPlayer/buffers/RenderBufferDMA.cpp b/xbmc/cores/RetroPlayer/buffers/RenderBufferDMA.cpp index 0b13e23651291..aab9e39b5b88c 100644 --- a/xbmc/cores/RetroPlayer/buffers/RenderBufferDMA.cpp +++ b/xbmc/cores/RetroPlayer/buffers/RenderBufferDMA.cpp @@ -11,19 +11,26 @@ #include "ServiceBroker.h" #include "utils/BufferObject.h" #include "utils/EGLImage.h" -#include "windowing/gbm/WinSystemGbmEGLContext.h" +#include "windowing/WinSystem.h" +#include "windowing/linux/WinSystemEGL.h" -using namespace KODI::WINDOWING::GBM; using namespace KODI; using namespace RETRO; CRenderBufferDMA::CRenderBufferDMA(CRenderContext& context, int fourcc) : m_context(context), m_fourcc(fourcc), - m_egl(new CEGLImage( - static_cast(CServiceBroker::GetWinSystem())->GetEGLDisplay())), m_bo(CBufferObject::GetBufferObject()) { + auto winSystemEGL = + dynamic_cast(CServiceBroker::GetWinSystem()); + + if (winSystemEGL == nullptr) + throw std::runtime_error("dynamic_cast failed to cast to CWinSystemEGL. This is likely due to " + "a build misconfiguration as DMA can only be used with EGL and " + "specifically platforms that implement CWinSystemEGL"); + + m_egl = std::make_unique(winSystemEGL->GetEGLDisplay()); } CRenderBufferDMA::~CRenderBufferDMA() diff --git a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/CMakeLists.txt b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/CMakeLists.txt index e87ad8ecd000b..8094f3a105ca3 100644 --- a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/CMakeLists.txt +++ b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/CMakeLists.txt @@ -18,7 +18,7 @@ if(OPENGL_FOUND) list(APPEND HEADERS RPRendererOpenGL.h) endif() -if(CORE_PLATFORM_NAME_LC STREQUAL gbm AND OPENGLES_FOUND) +if(CORE_PLATFORM_NAME_LC STREQUAL gbm OR CORE_PLATFORM_NAME_LC STREQUAL wayland) list(APPEND SOURCES RPRendererDMA.cpp) list(APPEND HEADERS RPRendererDMA.h) endif() diff --git a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.cpp b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.cpp index 1982f9855de97..9919b34119b58 100644 --- a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.cpp +++ b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.cpp @@ -12,6 +12,7 @@ #include "cores/RetroPlayer/buffers/RenderBufferPoolDMA.h" #include "cores/RetroPlayer/rendering/RenderContext.h" #include "cores/RetroPlayer/rendering/RenderVideoSettings.h" +#include "utils/BufferObjectFactory.h" #include "utils/GLUtils.h" #include @@ -34,6 +35,9 @@ CRPBaseRenderer* CRendererFactoryDMA::CreateRenderer(const CRenderSettings& sett RenderBufferPoolVector CRendererFactoryDMA::CreateBufferPools(CRenderContext& context) { + if (!CBufferObjectFactory::CreateBufferObject()) + return {}; + return {std::make_shared(context)}; } diff --git a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.h b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.h index 67decd1e85f7d..bcdd6995cffac 100644 --- a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.h +++ b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.h @@ -19,6 +19,8 @@ namespace RETRO class CRendererFactoryDMA : public IRendererFactory { public: + ~CRendererFactoryDMA() override = default; + // implementation of IRendererFactory std::string RenderSystemName() const override; CRPBaseRenderer* CreateRenderer(const CRenderSettings& settings, diff --git a/xbmc/utils/BufferObjectFactory.cpp b/xbmc/utils/BufferObjectFactory.cpp index effe317ef21ef..356771cf2ff52 100644 --- a/xbmc/utils/BufferObjectFactory.cpp +++ b/xbmc/utils/BufferObjectFactory.cpp @@ -8,17 +8,22 @@ #include "BufferObjectFactory.h" -std::vector()>> CBufferObjectFactory::m_bufferObjects; +std::list()>> CBufferObjectFactory::m_bufferObjects; std::unique_ptr CBufferObjectFactory::CreateBufferObject() { - return m_bufferObjects.back()(); + for (const auto bufferObject : m_bufferObjects) + { + return bufferObject(); + } + + return nullptr; } void CBufferObjectFactory::RegisterBufferObject( std::function()> createFunc) { - m_bufferObjects.emplace_back(createFunc); + m_bufferObjects.emplace_front(createFunc); } void CBufferObjectFactory::ClearBufferObjects() diff --git a/xbmc/utils/BufferObjectFactory.h b/xbmc/utils/BufferObjectFactory.h index 692566c88a376..eb4185f084ed2 100644 --- a/xbmc/utils/BufferObjectFactory.h +++ b/xbmc/utils/BufferObjectFactory.h @@ -11,8 +11,8 @@ #include "BufferObject.h" #include +#include #include -#include /** * @brief Factory that provides CBufferObject registration and creation @@ -44,5 +44,5 @@ class CBufferObjectFactory static void ClearBufferObjects(); protected: - static std::vector()>> m_bufferObjects; + static std::list()>> m_bufferObjects; }; diff --git a/xbmc/utils/CMakeLists.txt b/xbmc/utils/CMakeLists.txt index a03edfe2d5131..648d15ffee9b6 100644 --- a/xbmc/utils/CMakeLists.txt +++ b/xbmc/utils/CMakeLists.txt @@ -185,16 +185,18 @@ if(NOT CORE_SYSTEM_NAME STREQUAL windows AND NOT CORE_SYSTEM_NAME STREQUAL windo list(APPEND HEADERS GLUtils.h) endif() -if(CORE_PLATFORM_NAME_LC STREQUAL gbm) - list(APPEND SOURCES EGLImage.cpp) - list(APPEND HEADERS EGLImage.h) - +if(CORE_PLATFORM_NAME_LC STREQUAL gbm OR CORE_PLATFORM_NAME_LC STREQUAL wayland) list(APPEND SOURCES BufferObject.cpp BufferObjectFactory.cpp - DumbBufferObject.cpp) + EGLImage.cpp) list(APPEND HEADERS BufferObject.h BufferObjectFactory.h - DumbBufferObject.h) + EGLImage.h) + + if(CORE_PLATFORM_NAME_LC STREQUAL gbm) + list(APPEND SOURCES DumbBufferObject.cpp) + list(APPEND SOURCES DumbBufferObject.h) + endif() if(HAVE_LINUX_MEMFD AND HAVE_LINUX_UDMABUF) list(APPEND SOURCES UDMABufferObject.cpp) diff --git a/xbmc/windowing/wayland/WinSystemWaylandEGLContextGLES.cpp b/xbmc/windowing/wayland/WinSystemWaylandEGLContextGLES.cpp index fdba55326d69e..6d051cc4ed7fa 100644 --- a/xbmc/windowing/wayland/WinSystemWaylandEGLContextGLES.cpp +++ b/xbmc/windowing/wayland/WinSystemWaylandEGLContextGLES.cpp @@ -10,10 +10,14 @@ #include "OptionalsReg.h" #include "cores/RetroPlayer/process/RPProcessInfo.h" +#include "cores/RetroPlayer/rendering/VideoRenderers/RPRendererDMA.h" #include "cores/RetroPlayer/rendering/VideoRenderers/RPRendererOpenGLES.h" #include "cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h" #include "cores/VideoPlayer/VideoRenderers/RenderFactory.h" #include "rendering/gles/ScreenshotSurfaceGLES.h" +#include "utils/BufferObjectFactory.h" +#include "utils/DMAHeapBufferObject.h" +#include "utils/UDMABufferObject.h" #include "utils/log.h" #include @@ -34,6 +38,8 @@ bool CWinSystemWaylandEGLContextGLES::InitWindowSystem() } CLinuxRendererGLES::Register(); + + RETRO::CRPProcessInfo::RegisterRendererFactory(new RETRO::CRendererFactoryDMA); RETRO::CRPProcessInfo::RegisterRendererFactory(new RETRO::CRendererFactoryOpenGLES); bool general, deepColor; @@ -46,6 +52,14 @@ bool CWinSystemWaylandEGLContextGLES::InitWindowSystem() ::WAYLAND::VAAPIRegister(m_vaapiProxy.get(), deepColor); } + CBufferObjectFactory::ClearBufferObjects(); +#if defined(HAVE_LINUX_MEMFD) && defined(HAVE_LINUX_UDMABUF) + CUDMABufferObject::Register(); +#endif +#if defined(HAVE_LINUX_DMA_HEAP) + CDMAHeapBufferObject::Register(); +#endif + CScreenshotSurfaceGLES::Register(); return true;