diff options
Diffstat (limited to 'gsk/gl/gskgldriver.c')
-rw-r--r-- | gsk/gl/gskgldriver.c | 42 |
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; } |