Permalink
Browse files

Drop Host_GetRenderSurface and pass display to backend

  • Loading branch information...
stenzek committed Oct 3, 2018
1 parent 134d967 commit a3961750a7174be7402fc492367f017d845b8e1f
Showing with 129 additions and 124 deletions.
  1. +0 −5 Source/Android/jni/MainAndroid.cpp
  2. +8 −0 Source/Core/Core/Boot/Boot.h
  3. +3 −6 Source/Core/Core/Core.cpp
  4. +0 −3 Source/Core/Core/Host.h
  5. +10 −7 Source/Core/DolphinNoGUI/MainNoGUI.cpp
  6. +2 −11 Source/Core/DolphinQt/Host.cpp
  7. +0 −1 Source/Core/DolphinQt/Host.h
  8. +17 −2 Source/Core/DolphinQt/MainWindow.cpp
  9. +1 −3 Source/Core/DolphinQt/RenderWidget.cpp
  10. +8 −3 Source/Core/VideoBackends/D3D/Render.cpp
  11. +3 −0 Source/Core/VideoBackends/D3D/Render.h
  12. +2 −2 Source/Core/VideoBackends/D3D/VideoBackend.h
  13. +2 −2 Source/Core/VideoBackends/D3D/main.cpp
  14. +2 −2 Source/Core/VideoBackends/Null/NullBackend.cpp
  15. +5 −0 Source/Core/VideoBackends/Null/Render.cpp
  16. +2 −0 Source/Core/VideoBackends/Null/Render.h
  17. +2 −2 Source/Core/VideoBackends/Null/VideoBackend.h
  18. +6 −2 Source/Core/VideoBackends/OGL/Render.cpp
  19. +2 −0 Source/Core/VideoBackends/OGL/Render.h
  20. +2 −2 Source/Core/VideoBackends/OGL/VideoBackend.h
  21. +1 −1 Source/Core/VideoBackends/OGL/main.cpp
  22. +6 −0 Source/Core/VideoBackends/Software/SWRenderer.cpp
  23. +2 −0 Source/Core/VideoBackends/Software/SWRenderer.h
  24. +1 −1 Source/Core/VideoBackends/Software/SWmain.cpp
  25. +2 −2 Source/Core/VideoBackends/Software/VideoBackend.h
  26. +10 −35 Source/Core/VideoBackends/Vulkan/Renderer.cpp
  27. +2 −0 Source/Core/VideoBackends/Vulkan/Renderer.h
  28. +12 −14 Source/Core/VideoBackends/Vulkan/SwapChain.cpp
  29. +6 −3 Source/Core/VideoBackends/Vulkan/SwapChain.h
  30. +2 −2 Source/Core/VideoBackends/Vulkan/VideoBackend.h
  31. +4 −4 Source/Core/VideoBackends/Vulkan/main.cpp
  32. +1 −2 Source/Core/VideoCommon/RenderBase.cpp
  33. +2 −2 Source/Core/VideoCommon/RenderBase.h
  34. +1 −1 Source/Core/VideoCommon/VideoBackendBase.h
  35. +0 −4 Source/UnitTests/StubHost.cpp
@@ -89,11 +89,6 @@ void Host_Message(HostMessageID id)
}
}
void* Host_GetRenderHandle()
{
return s_surf;
}
void Host_UpdateTitle(const std::string& title)
{
__android_log_write(ANDROID_LOG_INFO, DOLPHIN_TAG, title.c_str());
@@ -78,6 +78,14 @@ struct BootParameters
Parameters parameters;
std::optional<std::string> savestate_path;
bool delete_savestate = false;
// Connection to a display server. This is used on X11 and Wayland platforms.
void* display_connection = nullptr;
// Render surface. This is a pointer to the native window handle, which depends
// on the platform. e.g. HWND for Windows, Window for X11. If the surface is
// set to nullptr, the video backend will run in headless mode.
void* render_surface = nullptr;
};
class CBoot
@@ -89,7 +89,6 @@ static bool s_is_stopping = false;
static bool s_hardware_initialized = false;
static bool s_is_started = false;
static Common::Flag s_is_booting;
static void* s_window_handle = nullptr;
static std::thread s_emu_thread;
static StateChangedCallbackFunc s_on_state_changed_callback;
@@ -215,8 +214,6 @@ bool Init(std::unique_ptr<BootParameters> boot)
Host_UpdateMainFrame(); // Disable any menus or buttons at boot
s_window_handle = Host_GetRenderHandle();
// Start the emu thread
s_emu_thread = std::thread(EmuThread, std::move(boot));
return true;
@@ -441,7 +438,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot)
g_video_backend->InitBackendInfo();
g_Config.Refresh();
if (!g_video_backend->Initialize(s_window_handle))
if (!g_video_backend->Initialize(boot->display_connection, boot->render_surface))
{
PanicAlert("Failed to initialize video backend!");
return;
@@ -462,7 +459,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot)
bool init_controllers = false;
if (!g_controller_interface.IsInit())
{
g_controller_interface.Initialize(s_window_handle);
g_controller_interface.Initialize(boot->render_surface);
Pad::Initialize();
Keyboard::Initialize();
init_controllers = true;
@@ -958,4 +955,4 @@ void DoFrameStep()
}
}
} // Core
} // namespace Core
View
@@ -44,6 +44,3 @@ void Host_UpdateMainFrame();
void Host_UpdateTitle(const std::string& title);
void Host_YieldToUI();
void Host_UpdateProgressDialog(const char* caption, int position, int total);
// TODO (neobrain): Remove this from host!
void* Host_GetRenderHandle();
@@ -71,6 +71,9 @@ class Platform
}
virtual void Shutdown() {}
virtual ~Platform() {}
virtual void* GetDisplayHandle() { return nullptr; }
virtual void* GetWindowHandle() { return nullptr; }
};
static Platform* platform;
@@ -91,12 +94,6 @@ void Host_Message(HostMessageID id)
updateMainFrameEvent.Set();
}
static void* s_window_handle = nullptr;
void* Host_GetRenderHandle()
{
return s_window_handle;
}
void Host_UpdateTitle(const std::string& title)
{
platform->SetTitle(title);
@@ -187,7 +184,6 @@ class PlatformX11 : public Platform
}
XMapRaised(dpy, win);
XFlush(dpy);
s_window_handle = (void*)win;
if (SConfig::GetInstance().bDisableScreenSaver)
X11Utils::InhibitScreensaver(win, true);
@@ -354,6 +350,10 @@ class PlatformX11 : public Platform
XCloseDisplay(dpy);
}
void* GetDisplayHandle() override { return static_cast<void*>(dpy); }
void* GetWindowHandle() override { return reinterpret_cast<void*>(win); }
};
#endif
@@ -433,6 +433,9 @@ int main(int argc, char* argv[])
DolphinAnalytics::Instance()->ReportDolphinStart("nogui");
boot->display_connection = platform->GetDisplayHandle();
boot->render_surface = platform->GetWindowHandle();
if (!BootManager::BootCore(std::move(boot)))
{
fprintf(stderr, "Could not boot the specified file\n");
@@ -30,14 +30,10 @@ Host* Host::GetInstance()
return s_instance;
}
void* Host::GetRenderHandle()
{
return m_render_handle;
}
void Host::SetRenderHandle(void* handle)
{
m_render_handle = handle;
if (g_renderer)
g_renderer->ChangeSurface(handle);
}
bool Host::GetRenderFocus()
@@ -94,11 +90,6 @@ void Host_UpdateTitle(const std::string& title)
emit Host::GetInstance()->RequestTitle(QString::fromStdString(title));
}
void* Host_GetRenderHandle()
{
return Host::GetInstance()->GetRenderHandle();
}
bool Host_RendererHasFocus()
{
return Host::GetInstance()->GetRenderFocus();
@@ -20,7 +20,6 @@ class Host final : public QObject
public:
static Host* GetInstance();
void* GetRenderHandle();
bool GetRenderFocus();
bool GetRenderFullscreen();
@@ -26,6 +26,10 @@
#include "QtUtils/SignalDaemon.h"
#endif
#ifndef WIN32
#include <qpa/qplatformnativeinterface.h>
#endif
#include "Common/Version.h"
#include "Core/Boot/Boot.h"
@@ -98,7 +102,6 @@
#include "VideoCommon/VideoConfig.h"
#if defined(HAVE_XRANDR) && HAVE_XRANDR
#include <qpa/qplatformnativeinterface.h>
#include "UICommon/X11Utils.h"
#endif
@@ -797,14 +800,26 @@ void MainWindow::StartGame(std::unique_ptr<BootParameters>&& parameters)
m_pending_boot = std::move(parameters);
return;
}
// We need the render widget before booting.
ShowRenderWidget();
// Populate the video backend fields of the boot parameters.
parameters->render_surface = reinterpret_cast<void*>(m_render_widget->winId());
#ifndef WIN32
parameters->display_connection =
QGuiApplication::platformNativeInterface()->nativeResourceForWindow("display",
windowHandle());
#endif
// Boot up, show an error if it fails to load the game.
if (!BootManager::BootCore(std::move(parameters)))
{
QMessageBox::critical(this, tr("Error"), tr("Failed to init core"), QMessageBox::Ok);
HideRenderWidget();
return;
}
ShowRenderWidget();
#ifdef USE_DISCORD_PRESENCE
if (!NetPlay::IsNetPlayRunning())
Discord::UpdateDiscordPresence();
@@ -55,8 +55,6 @@ RenderWidget::RenderWidget(QWidget* parent) : QWidget(parent)
connect(this, &RenderWidget::FocusChanged, Host::GetInstance(), &Host::SetRenderFocus,
Qt::DirectConnection);
emit HandleChanged((void*)winId());
m_mouse_timer = new QTimer(this);
connect(m_mouse_timer, &QTimer::timeout, this, &RenderWidget::HandleCursorTimer);
m_mouse_timer->setSingleShot(true);
@@ -144,7 +142,7 @@ bool RenderWidget::event(QEvent* event)
}
break;
case QEvent::WinIdChange:
emit HandleChanged((void*)winId());
emit HandleChanged(reinterpret_cast<void*>(winId()));
break;
case QEvent::WindowActivate:
if (SConfig::GetInstance().m_PauseOnFocusLost && Core::GetState() == Core::State::Paused)
@@ -225,6 +225,11 @@ void Renderer::Create3DVisionTexture(int width, int height)
DXGI_FORMAT_R8G8B8A8_UNORM, 1, 1, &sys_data);
}
bool Renderer::IsHeadless() const
{
return D3D::swapchain == nullptr;
}
std::unique_ptr<AbstractTexture> Renderer::CreateTexture(const TextureConfig& config)
{
return std::make_unique<DXTexture>(config);
@@ -698,12 +703,12 @@ void Renderer::CheckForSurfaceChange()
if (!m_surface_changed.TestAndClear())
return;
m_surface_handle = m_new_surface_handle;
m_new_surface_handle = nullptr;
SAFE_RELEASE(m_screenshot_texture);
SAFE_RELEASE(m_3d_vision_texture);
D3D::Reset(reinterpret_cast<HWND>(m_new_surface_handle));
m_new_surface_handle = nullptr;
UpdateBackbufferSize();
}
@@ -22,6 +22,9 @@ class Renderer : public ::Renderer
~Renderer() override;
StateCache& GetStateCache() { return m_state_cache; }
bool IsHeadless() const override;
std::unique_ptr<AbstractTexture> CreateTexture(const TextureConfig& config) override;
std::unique_ptr<AbstractStagingTexture>
CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
@@ -11,12 +11,12 @@ namespace DX11
{
class VideoBackend : public VideoBackendBase
{
bool Initialize(void*) override;
bool Initialize(void* display_handle, void* window_handle) override;
void Shutdown() override;
std::string GetName() const override;
std::string GetDisplayName() const override;
void InitBackendInfo() override;
};
}
} // namespace DX11
@@ -127,7 +127,7 @@ void VideoBackend::InitBackendInfo()
DX11::D3D::UnloadD3D();
}
bool VideoBackend::Initialize(void* window_handle)
bool VideoBackend::Initialize(void* display_handle, void* window_handle)
{
if (window_handle == nullptr)
return false;
@@ -188,4 +188,4 @@ void VideoBackend::Shutdown()
D3D::Close();
}
}
} // namespace DX11
@@ -54,7 +54,7 @@ void VideoBackend::InitBackendInfo()
g_Config.backend_info.AAModes = {1};
}
bool VideoBackend::Initialize(void* window_handle)
bool VideoBackend::Initialize(void* display_handle, void* window_handle)
{
InitializeShared();
@@ -80,4 +80,4 @@ void VideoBackend::Shutdown()
ShutdownShared();
}
}
} // namespace Null
@@ -24,6 +24,11 @@ Renderer::~Renderer()
UpdateActiveConfig();
}
bool Renderer::IsHeadless() const
{
return true;
}
std::unique_ptr<AbstractTexture> Renderer::CreateTexture(const TextureConfig& config)
{
return std::make_unique<NullTexture>(config);
@@ -14,6 +14,8 @@ class Renderer : public ::Renderer
Renderer();
~Renderer() override;
bool IsHeadless() const override;
std::unique_ptr<AbstractTexture> CreateTexture(const TextureConfig& config) override;
std::unique_ptr<AbstractStagingTexture>
CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
@@ -11,7 +11,7 @@ namespace Null
{
class VideoBackend : public VideoBackendBase
{
bool Initialize(void* window_handle) override;
bool Initialize(void* display_handle, void* window_handle) override;
void Shutdown() override;
std::string GetName() const override { return "Null"; }
@@ -22,4 +22,4 @@ class VideoBackend : public VideoBackendBase
}
void InitBackendInfo() override;
};
}
} // namespace Null
@@ -804,6 +804,11 @@ Renderer::Renderer()
Renderer::~Renderer() = default;
bool Renderer::IsHeadless() const
{
return g_main_gl_context->IsHeadless();
}
void Renderer::Shutdown()
{
::Renderer::Shutdown();
@@ -1499,9 +1504,8 @@ void Renderer::CheckForSurfaceChange()
if (!m_surface_changed.TestAndClear())
return;
m_surface_handle = m_new_surface_handle;
g_main_gl_context->UpdateSurface(m_new_surface_handle);
m_new_surface_handle = nullptr;
g_main_gl_context->UpdateSurface(m_surface_handle);
// With a surface change, the window likely has new dimensions.
m_backbuffer_width = g_main_gl_context->GetBackBufferWidth();
@@ -84,6 +84,8 @@ class Renderer : public ::Renderer
Renderer();
~Renderer() override;
bool IsHeadless() const override;
void Init();
void Shutdown() override;
@@ -11,7 +11,7 @@ namespace OGL
{
class VideoBackend : public VideoBackendBase
{
bool Initialize(void*) override;
bool Initialize(void* display_handle, void* window_handle) override;
void Shutdown() override;
std::string GetName() const override;
@@ -23,4 +23,4 @@ class VideoBackend : public VideoBackendBase
bool InitializeGLExtensions();
bool FillBackendInfo();
};
}
} // namespace OGL
Oops, something went wrong.

0 comments on commit a396175

Please sign in to comment.