summaryrefslogtreecommitdiff
path: root/gsk/gl/gskgldriver.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsk/gl/gskgldriver.c')
-rw-r--r--gsk/gl/gskgldriver.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c
index 672f44a5ee..d0af5e76da 100644
--- a/gsk/gl/gskgldriver.c
+++ b/gsk/gl/gskgldriver.c
@@ -1126,14 +1126,20 @@ write_atlas_to_png (GskGLDriver *driver,
GskGLTextureAtlas *atlas,
const char *filename)
{
+ GdkGLTextureBuilder *builder;
GdkTexture *texture;
- texture = gdk_gl_texture_new (gsk_gl_driver_get_context (driver),
- atlas->texture_id,
- atlas->width, atlas->height,
- NULL, NULL);
+ builder = gdk_gl_texture_builder_new ();
+ gdk_gl_texture_builder_set_context (builder, gsk_gl_driver_get_context (driver));
+ gdk_gl_texture_builder_set_id (builder, atlas->texture_id);
+ gdk_gl_texture_builder_set_width (builder, atlas->width);
+ gdk_gl_texture_builder_set_height (builder, atlas->height);
+
+ texture = gdk_gl_texture_builder_build (builder, NULL, NULL);
gdk_texture_save_to_png (texture, filename);
+
g_object_unref (texture);
+ g_object_unref (builder);
}
void
@@ -1557,6 +1563,7 @@ typedef struct _GskGLTextureState
{
GdkGLContext *context;
GLuint texture_id;
+ GLsync sync;
} GskGLTextureState;
static void
@@ -1569,6 +1576,8 @@ create_texture_from_texture_destroy (gpointer data)
gdk_gl_context_make_current (state->context);
glDeleteTextures (1, &state->texture_id);
+ if (state->sync)
+ glDeleteSync (state->sync);
g_clear_object (&state->context);
g_free (state);
}
@@ -1578,8 +1587,9 @@ gsk_gl_driver_create_gdk_texture (GskGLDriver *self,
guint texture_id)
{
GskGLTextureState *state;
+ GdkGLTextureBuilder *builder;
GskGLTexture *texture;
- int width, height;
+ GdkTexture *result;
g_return_val_if_fail (GSK_IS_GL_DRIVER (self), NULL);
g_return_val_if_fail (self->command_queue != NULL, NULL);
@@ -1594,19 +1604,25 @@ gsk_gl_driver_create_gdk_texture (GskGLDriver *self,
state = g_new0 (GskGLTextureState, 1);
state->texture_id = texture_id;
state->context = g_object_ref (self->command_queue->context);
+ if (gdk_gl_context_has_sync (self->command_queue->context))
+ state->sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
g_hash_table_steal (self->textures, GUINT_TO_POINTER (texture_id));
- width = texture->width;
- height = texture->height;
+ builder = gdk_gl_texture_builder_new ();
+ gdk_gl_texture_builder_set_context (builder, self->command_queue->context);
+ gdk_gl_texture_builder_set_id (builder, texture_id);
+ gdk_gl_texture_builder_set_width (builder, texture->width);
+ gdk_gl_texture_builder_set_height (builder, texture->height);
+ gdk_gl_texture_builder_set_sync (builder, state->sync);
+
+ result = gdk_gl_texture_builder_build (builder,
+ create_texture_from_texture_destroy,
+ state);
texture->texture_id = 0;
gsk_gl_texture_free (texture);
+ g_object_unref (builder);
- return gdk_gl_texture_new (self->command_queue->context,
- texture_id,
- width,
- height,
- create_texture_from_texture_destroy,
- state);
+ return result;
}