mirror of
https://github.com/hyprwm/aquamarine.git
synced 2025-12-20 04:40:12 +01:00
renderer: ensure makecurrent isnt called twice
depending on the attachment and commitstate we might end up calling makecurrent twice on an already current context, and on destruction we also make it current yet again even tho it was current. drivers doesnt keep track of this and is very inefficient when calling this on itself all the time. add a bool and only call it when it has changed or require change.
This commit is contained in:
parent
be166e11d8
commit
e83f154813
2 changed files with 12 additions and 7 deletions
|
|
@ -637,21 +637,26 @@ SP<CDRMRenderer> CDRMRenderer::attempt(SP<CBackend> backend_, Hyprutils::Memory:
|
|||
CEglContextGuard::CEglContextGuard(const CDRMRenderer& renderer_) : renderer(renderer_) {
|
||||
savedEGLState.display = eglGetCurrentDisplay();
|
||||
savedEGLState.context = eglGetCurrentContext();
|
||||
savedEGLState.draw = eglGetCurrentSurface(EGL_DRAW);
|
||||
savedEGLState.read = eglGetCurrentSurface(EGL_READ);
|
||||
|
||||
if (!eglMakeCurrent(renderer.egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, renderer.egl.context))
|
||||
renderer.backend->log(AQ_LOG_WARNING, "CDRMRenderer: setEGL eglMakeCurrent failed");
|
||||
const bool alreadyCurrent = savedEGLState.display == renderer.egl.display && savedEGLState.context == renderer.egl.context;
|
||||
|
||||
if (!alreadyCurrent) {
|
||||
if (!eglMakeCurrent(renderer.egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, renderer.egl.context))
|
||||
renderer.backend->log(AQ_LOG_WARNING, "CDRMRenderer: setEGL eglMakeCurrent failed");
|
||||
madeChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
CEglContextGuard::~CEglContextGuard() {
|
||||
if (!madeChange)
|
||||
return; // Skip restore if we didn’t change anything
|
||||
|
||||
EGLDisplay dpy = savedEGLState.display ? savedEGLState.display : renderer.egl.display;
|
||||
|
||||
// egl can't handle this
|
||||
if (dpy == EGL_NO_DISPLAY)
|
||||
return;
|
||||
|
||||
if (!eglMakeCurrent(dpy, savedEGLState.draw, savedEGLState.read, savedEGLState.context))
|
||||
if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, savedEGLState.context))
|
||||
renderer.backend->log(AQ_LOG_WARNING, "CDRMRenderer: restoreEGL eglMakeCurrent failed");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,8 +77,8 @@ namespace Aquamarine {
|
|||
struct {
|
||||
EGLDisplay display = nullptr;
|
||||
EGLContext context = nullptr;
|
||||
EGLSurface draw = nullptr, read = nullptr;
|
||||
} savedEGLState;
|
||||
bool madeChange = false;
|
||||
};
|
||||
|
||||
class CDRMRenderer {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue