Merge branch 'avoid-extraneous-uploads' into 'main'

gsk/gpu: avoid unnecessary buffer uploads

See merge request GNOME/gtk!6996
This commit is contained in:
Matthias Clasen
2024-03-08 23:48:52 +00:00
7 changed files with 23 additions and 15 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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 *

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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)
{
}