mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 22:20:24 +00:00
glarea: Synchronize
Create a fence object and pass it along when creating the GL texture, so that the GL renderer can wait for the texture to be ready.
This commit is contained in:
parent
8292b846d5
commit
bec0afa61b
@ -32,6 +32,8 @@
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkrenderlayoutprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gdk/gdkgltextureprivate.h"
|
||||
#include "gdk/gdkglcontextprivate.h"
|
||||
|
||||
#include <epoxy/gl.h>
|
||||
|
||||
@ -697,6 +699,15 @@ static void
|
||||
release_texture (gpointer data)
|
||||
{
|
||||
Texture *texture = data;
|
||||
gpointer sync;
|
||||
|
||||
sync = gdk_gl_texture_builder_get_sync (texture->builder);
|
||||
if (sync)
|
||||
{
|
||||
glDeleteSync (sync);
|
||||
gdk_gl_texture_builder_set_sync (texture->builder, NULL);
|
||||
}
|
||||
|
||||
texture->holder = NULL;
|
||||
}
|
||||
|
||||
@ -742,6 +753,7 @@ gtk_gl_area_snapshot (GtkWidget *widget,
|
||||
if (status == GL_FRAMEBUFFER_COMPLETE)
|
||||
{
|
||||
Texture *texture;
|
||||
gpointer sync = NULL;
|
||||
|
||||
if (priv->needs_render || priv->auto_render)
|
||||
{
|
||||
@ -760,6 +772,11 @@ gtk_gl_area_snapshot (GtkWidget *widget,
|
||||
priv->texture = NULL;
|
||||
priv->textures = g_list_prepend (priv->textures, texture);
|
||||
|
||||
if (gdk_gl_context_has_sync (priv->context))
|
||||
sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
|
||||
gdk_gl_texture_builder_set_sync (texture->builder, sync);
|
||||
|
||||
texture->holder = gdk_gl_texture_builder_build (texture->builder,
|
||||
release_texture,
|
||||
texture);
|
||||
|
Loading…
Reference in New Issue
Block a user