diff options
Diffstat (limited to 'gsk/gl/gskglcommandqueue.c')
-rw-r--r-- | gsk/gl/gskglcommandqueue.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/gsk/gl/gskglcommandqueue.c b/gsk/gl/gskglcommandqueue.c index d5aa01a5f8..cf8acc5da2 100644 --- a/gsk/gl/gskglcommandqueue.c +++ b/gsk/gl/gskglcommandqueue.c @@ -427,6 +427,7 @@ gsk_gl_command_queue_dispose (GObject *object) gsk_gl_command_batches_clear (&self->batches); gsk_gl_command_binds_clear (&self->batch_binds); gsk_gl_command_uniforms_clear (&self->batch_uniforms); + gsk_gl_syncs_clear (&self->syncs); gsk_gl_buffer_destroy (&self->vertices); @@ -449,6 +450,7 @@ gsk_gl_command_queue_init (GskGLCommandQueue *self) gsk_gl_command_batches_init (&self->batches, 128); gsk_gl_command_binds_init (&self->batch_binds, 1024); gsk_gl_command_uniforms_init (&self->batch_uniforms, 2048); + gsk_gl_syncs_init (&self->syncs, 10); gsk_gl_buffer_init (&self->vertices, GL_ARRAY_BUFFER, sizeof (GskGLDrawVertex)); } @@ -1159,17 +1161,25 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self, if G_UNLIKELY (batch->draw.bind_count > 0) { const GskGLCommandBind *bind = &self->batch_binds.items[batch->draw.bind_offset]; - for (guint i = 0; i < batch->draw.bind_count; i++) { if (textures[bind->texture] != bind->id) { + GskGLSync *s; + if (active != bind->texture) { active = bind->texture; glActiveTexture (GL_TEXTURE0 + bind->texture); } + s = gsk_gl_syncs_get_sync (&self->syncs, bind->id); + if (s && s->sync) + { + glWaitSync ((GLsync) s->sync, 0, GL_TIMEOUT_IGNORED); + s->sync = NULL; + } + glBindTexture (GL_TEXTURE_2D, bind->id); textures[bind->texture] = bind->id; if (!self->has_samplers) @@ -1315,6 +1325,7 @@ gsk_gl_command_queue_end_frame (GskGLCommandQueue *self) self->batches.len = 0; self->batch_binds.len = 0; self->batch_uniforms.len = 0; + self->syncs.len = 0; self->n_uploads = 0; self->tail_batch_index = -1; self->in_frame = FALSE; |