This commit is contained in:
Megamouse 2025-04-27 16:01:14 +00:00 committed by GitHub
commit ab1c58675c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -35,40 +35,41 @@ void gl_gs_frame::reset()
draw_context_t gl_gs_frame::make_context() draw_context_t gl_gs_frame::make_context()
{ {
auto context = new GLContext(); GLContext* context = nullptr;
context->handle = new QOpenGLContext();
if (m_primary_context) // Workaround for the Qt warning: "Attempting to create QWindow-based QOffscreenSurface outside the gui thread. Expect failures."
// This is also necessery in debug builds.
Emu.BlockingCallFromMainThread([&]()
{ {
QOffscreenSurface* surface = nullptr; context = new GLContext();
context->handle = new QOpenGLContext();
// Workaround for the Qt warning: "Attempting to create QWindow-based QOffscreenSurface outside the gui thread. Expect failures." if (m_primary_context)
Emu.BlockingCallFromMainThread([&]()
{ {
surface = new QOffscreenSurface(); QOffscreenSurface* surface = new QOffscreenSurface();
surface->setFormat(m_format); surface->setFormat(m_format);
surface->create(); surface->create();
});
// Share resources with the first created context // Share resources with the first created context
context->handle->setShareContext(m_primary_context->handle); context->handle->setShareContext(m_primary_context->handle);
context->surface = surface; context->surface = surface;
context->owner = true; context->owner = true;
} }
else else
{ {
// This is the first created context, all others will share resources with this one // This is the first created context, all others will share resources with this one
m_primary_context = context; m_primary_context = context;
context->surface = this; context->surface = this;
context->owner = false; context->owner = false;
} }
context->handle->setFormat(m_format); context->handle->setFormat(m_format);
if (!context->handle->create()) if (!context->handle->create())
{ {
fmt::throw_exception("Failed to create OpenGL context"); fmt::throw_exception("Failed to create OpenGL context");
} }
});
return context; return context;
} }
@ -80,10 +81,16 @@ void gl_gs_frame::set_current(draw_context_t ctx)
fmt::throw_exception("Null context handle passed to set_current"); fmt::throw_exception("Null context handle passed to set_current");
} }
const auto context = static_cast<GLContext*>(ctx); // Calling this on the main thread is necessery in debug builds.
Emu.BlockingCallFromMainThread([&]()
if (!context->handle->makeCurrent(context->surface))
{ {
const auto context = static_cast<GLContext*>(ctx);
if (context->handle->makeCurrent(context->surface))
{
return;
}
if (!context->owner) if (!context->owner)
{ {
create(); create();
@ -100,14 +107,18 @@ void gl_gs_frame::set_current(draw_context_t ctx)
{ {
fmt::throw_exception("Could not bind OpenGL context"); fmt::throw_exception("Could not bind OpenGL context");
} }
} });
} }
void gl_gs_frame::delete_context(draw_context_t ctx) void gl_gs_frame::delete_context(draw_context_t ctx)
{ {
const auto gl_ctx = static_cast<GLContext*>(ctx); const auto gl_ctx = static_cast<GLContext*>(ctx);
gl_ctx->handle->doneCurrent(); // Calling this on the main thread is necessery in debug builds.
Emu.BlockingCallFromMainThread([&]()
{
gl_ctx->handle->doneCurrent();
});
#ifdef _MSC_VER #ifdef _MSC_VER
//AMD driver crashes when executing wglDeleteContext //AMD driver crashes when executing wglDeleteContext