|
|
|
@ -8,13 +8,16 @@
|
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
#include <QKeyEvent>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QOffscreenSurface>
|
|
|
|
|
#include <QOpenGLContext>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QScreen>
|
|
|
|
|
#include <QStringList>
|
|
|
|
|
#include <QWindow>
|
|
|
|
|
|
|
|
|
|
#ifdef HAS_OPENGL
|
|
|
|
|
#include <QOffscreenSurface>
|
|
|
|
|
#include <QOpenGLContext>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if !defined(WIN32) && HAS_VULKAN
|
|
|
|
|
#include <qpa/qplatformnativeinterface.h>
|
|
|
|
|
#endif
|
|
|
|
@ -98,6 +101,7 @@ void EmuThread::run() {
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAS_OPENGL
|
|
|
|
|
class OpenGLSharedContext : public Core::Frontend::GraphicsContext {
|
|
|
|
|
public:
|
|
|
|
|
/// Create the original context that should be shared from
|
|
|
|
@ -183,6 +187,7 @@ private:
|
|
|
|
|
std::unique_ptr<QOffscreenSurface> offscreen_surface{};
|
|
|
|
|
QSurface* surface;
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
class DummyContext : public Core::Frontend::GraphicsContext {};
|
|
|
|
|
|
|
|
|
@ -473,6 +478,7 @@ void GRenderWindow::resizeEvent(QResizeEvent* event) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedContext() const {
|
|
|
|
|
#ifdef HAS_OPENGL
|
|
|
|
|
if (Settings::values.renderer_backend == Settings::RendererBackend::OpenGL) {
|
|
|
|
|
auto c = static_cast<OpenGLSharedContext*>(main_context.get());
|
|
|
|
|
// Bind the shared contexts to the main surface in case the backend wants to take over
|
|
|
|
@ -480,6 +486,7 @@ std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedCont
|
|
|
|
|
return std::make_unique<OpenGLSharedContext>(c->GetShareContext(),
|
|
|
|
|
child_widget->windowHandle());
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
return std::make_unique<DummyContext>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -560,6 +567,7 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool GRenderWindow::InitializeOpenGL() {
|
|
|
|
|
#ifdef HAS_OPENGL
|
|
|
|
|
// TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground,
|
|
|
|
|
// WA_DontShowOnScreen, WA_DeleteOnClose
|
|
|
|
|
auto child = new OpenGLRenderWidget(this);
|
|
|
|
@ -571,6 +579,11 @@ bool GRenderWindow::InitializeOpenGL() {
|
|
|
|
|
std::make_unique<OpenGLSharedContext>(context->GetShareContext(), child->windowHandle()));
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
#else
|
|
|
|
|
QMessageBox::warning(this, tr("OpenGL not available!"),
|
|
|
|
|
tr("yuzu has not been compiled with OpenGL support."));
|
|
|
|
|
return false;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool GRenderWindow::InitializeVulkan() {
|
|
|
|
|