diff --git a/gsk/gpu/gskglbuffer.c b/gsk/gpu/gskglbuffer.c index 7f7b567419..c5a98fcd4e 100644 --- a/gsk/gpu/gskglbuffer.c +++ b/gsk/gpu/gskglbuffer.c @@ -34,13 +34,17 @@ gsk_gl_buffer_map (GskGpuBuffer *buffer) } static void -gsk_gl_buffer_unmap (GskGpuBuffer *buffer) +gsk_gl_buffer_unmap (GskGpuBuffer *buffer, + gsize used) { GskGLBuffer *self = GSK_GL_BUFFER (buffer); + if (used == 0) + return; + gsk_gl_buffer_bind (self); - glBufferSubData (self->target, 0, gsk_gpu_buffer_get_size (buffer), self->data); + glBufferSubData (self->target, 0, used, self->data); } static void diff --git a/gsk/gpu/gskgpubuffer.c b/gsk/gpu/gskgpubuffer.c index 218f5a448a..de143ff5a4 100644 --- a/gsk/gpu/gskgpubuffer.c +++ b/gsk/gpu/gskgpubuffer.c @@ -45,8 +45,9 @@ gsk_gpu_buffer_map (GskGpuBuffer *self) } void -gsk_gpu_buffer_unmap (GskGpuBuffer *self) +gsk_gpu_buffer_unmap (GskGpuBuffer *self, + gsize size) { - GSK_GPU_BUFFER_GET_CLASS (self)->unmap (self); + GSK_GPU_BUFFER_GET_CLASS (self)->unmap (self, size); } diff --git a/gsk/gpu/gskgpubufferprivate.h b/gsk/gpu/gskgpubufferprivate.h index 143e5a37d0..bbe47a9df0 100644 --- a/gsk/gpu/gskgpubufferprivate.h +++ b/gsk/gpu/gskgpubufferprivate.h @@ -23,7 +23,8 @@ struct _GskGpuBufferClass GObjectClass parent_class; guchar * (* map) (GskGpuBuffer *self); - void (* unmap) (GskGpuBuffer *self); + void (* unmap) (GskGpuBuffer *self, + gsize used); }; GType gsk_gpu_buffer_get_type (void) G_GNUC_CONST; @@ -34,7 +35,8 @@ void gsk_gpu_buffer_setup (GskGpuB gsize gsk_gpu_buffer_get_size (GskGpuBuffer *self); guchar * gsk_gpu_buffer_map (GskGpuBuffer *self); -void gsk_gpu_buffer_unmap (GskGpuBuffer *self); +void gsk_gpu_buffer_unmap (GskGpuBuffer *self, + gsize used); G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskGpuBuffer, g_object_unref) diff --git a/gsk/gpu/gskgpudownloadop.c b/gsk/gpu/gskgpudownloadop.c index a9c3ec6148..5251f3aa21 100644 --- a/gsk/gpu/gskgpudownloadop.c +++ b/gsk/gpu/gskgpudownloadop.c @@ -126,7 +126,7 @@ gsk_gpu_download_op_vk_create (GskGpuDownloadOp *self) bytes, stride); g_bytes_unref (bytes); - gsk_gpu_buffer_unmap (self->buffer); + gsk_gpu_buffer_unmap (self->buffer, 0); } static GskGpuOp * diff --git a/gsk/gpu/gskgpuframe.c b/gsk/gpu/gskgpuframe.c index f28ded21fc..957a2095ae 100644 --- a/gsk/gpu/gskgpuframe.c +++ b/gsk/gpu/gskgpuframe.c @@ -426,7 +426,7 @@ gsk_gpu_frame_reserve_vertex_data (GskGpuFrame *self, if (priv->vertex_buffer_data) { memcpy (new_data, priv->vertex_buffer_data, old_size); - gsk_gpu_buffer_unmap (priv->vertex_buffer); + gsk_gpu_buffer_unmap (priv->vertex_buffer, old_size); } g_object_unref (priv->vertex_buffer); priv->vertex_buffer = new_buffer; @@ -434,7 +434,7 @@ gsk_gpu_frame_reserve_vertex_data (GskGpuFrame *self, } priv->vertex_buffer_used = size_needed; - + return size_needed - size; } @@ -480,7 +480,7 @@ gsk_gpu_frame_write_storage_buffer (GskGpuFrame *self, { g_assert (offset > 0); - gsk_gpu_buffer_unmap (priv->storage_buffer); + gsk_gpu_buffer_unmap (priv->storage_buffer, 0); g_clear_object (&priv->storage_buffer); priv->storage_buffer_data = 0; priv->storage_buffer_used = 0; @@ -591,14 +591,14 @@ gsk_gpu_frame_submit (GskGpuFrame *self) if (priv->vertex_buffer) { - gsk_gpu_buffer_unmap (priv->vertex_buffer); + gsk_gpu_buffer_unmap (priv->vertex_buffer, priv->vertex_buffer_used); priv->vertex_buffer_data = NULL; priv->vertex_buffer_used = 0; } if (priv->storage_buffer_data) { - gsk_gpu_buffer_unmap (priv->storage_buffer); + gsk_gpu_buffer_unmap (priv->storage_buffer, priv->storage_buffer_used); priv->storage_buffer_data = NULL; priv->storage_buffer_used = 0; } diff --git a/gsk/gpu/gskgpuuploadop.c b/gsk/gpu/gskgpuuploadop.c index a4eeead875..4d48fa9ab9 100644 --- a/gsk/gpu/gskgpuuploadop.c +++ b/gsk/gpu/gskgpuuploadop.c @@ -110,8 +110,8 @@ gsk_gpu_upload_op_vk_command_with_area (GskGpuOp *op, data = gsk_gpu_buffer_map (*buffer); draw_func (op, data, stride); - - gsk_gpu_buffer_unmap (*buffer); + + gsk_gpu_buffer_unmap (*buffer, area->height * stride); vkCmdPipelineBarrier (state->vk_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, diff --git a/gsk/gpu/gskvulkanbuffer.c b/gsk/gpu/gskvulkanbuffer.c index f181666a24..93dbba0b0f 100644 --- a/gsk/gpu/gskvulkanbuffer.c +++ b/gsk/gpu/gskvulkanbuffer.c @@ -45,7 +45,8 @@ gsk_vulkan_buffer_map (GskGpuBuffer *buffer) } static void -gsk_vulkan_buffer_unmap (GskGpuBuffer *buffer) +gsk_vulkan_buffer_unmap (GskGpuBuffer *buffer, + gsize size) { }