mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-07-20 22:32:01 +00:00
[client] egl: avoid per-frame DMABUF flushes
Only fence and flush when initially attaching an EGLImage. Subsequent imports rely on framebuffer write completion, avoiding periodic driver stalls.
This commit is contained in:
@@ -247,6 +247,7 @@ static bool egl_texDMABUFUpdate(EGL_Texture * texture,
|
|||||||
|
|
||||||
int slot = (fdImage == &this->images[0]) ? 0 : 1;
|
int slot = (fdImage == &this->images[0]) ? 0 : 1;
|
||||||
fdImage->texIndex = slot;
|
fdImage->texIndex = slot;
|
||||||
|
GLsync sync = 0;
|
||||||
INTERLOCKED_SECTION(parent->copyLock,
|
INTERLOCKED_SECTION(parent->copyLock,
|
||||||
{
|
{
|
||||||
egl_stateBindTexture(0, GL_TEXTURE_EXTERNAL_OES, parent->tex[slot]);
|
egl_stateBindTexture(0, GL_TEXTURE_EXTERNAL_OES, parent->tex[slot]);
|
||||||
@@ -256,29 +257,28 @@ static bool egl_texDMABUFUpdate(EGL_Texture * texture,
|
|||||||
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
g_egl_dynProcs.glEGLImageTargetTexture2DOES(
|
g_egl_dynProcs.glEGLImageTargetTexture2DOES(
|
||||||
GL_TEXTURE_EXTERNAL_OES, image);
|
GL_TEXTURE_EXTERNAL_OES, image);
|
||||||
|
|
||||||
|
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||||
|
fdImage->sync = sync;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (unlikely(!sync))
|
||||||
|
{
|
||||||
|
DEBUG_GL_ERROR("Failed to create DMABUF sync");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Publish the texture attachment to the shared render context once. The
|
||||||
|
* backing memory is synchronized separately by framebuffer_wait(), so
|
||||||
|
* subsequent frames do not add any GL commands to this context. */
|
||||||
|
glFlush();
|
||||||
}
|
}
|
||||||
|
|
||||||
GLsync sync = 0;
|
|
||||||
INTERLOCKED_SECTION(parent->copyLock,
|
INTERLOCKED_SECTION(parent->copyLock,
|
||||||
{
|
{
|
||||||
if (fdImage->sync)
|
|
||||||
glDeleteSync(fdImage->sync);
|
|
||||||
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
||||||
fdImage->sync = sync;
|
|
||||||
this->lastIndex = (fdImage == &this->images[0]) ? 0 : 1;
|
this->lastIndex = (fdImage == &this->images[0]) ? 0 : 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (unlikely(!sync))
|
|
||||||
{
|
|
||||||
DEBUG_GL_ERROR("Failed to create DMABUF sync");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The fence is consumed by the shared render context. Submit it from the
|
|
||||||
* frame context now so the render context can wait without blocking the CPU. */
|
|
||||||
glFlush();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user