mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 13:28:01 +03:00
Merge 3c53c52279
into 2afd7707fe
This commit is contained in:
commit
ab1c58675c
1 changed files with 41 additions and 30 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue