From 03c36f94bb6d2f8b1c0c1f4e654caca7d709179f Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Sat, 16 Nov 2024 17:18:25 +0100 Subject: [PATCH] cogl/buffer: Don't store "vfuncs" in the struct This was done during the move to a GObjectified Buffer instance, but in the future when we will move the DriverVtable to an abstract class, this would annoy us. Given that those functions are only used internally in three instances, just replace them with the actual logic of checking whether tu use malloc fallback path or not. Helps https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4132 Part-of: --- cogl/cogl/cogl-buffer-private.h | 15 +-------- cogl/cogl/cogl-buffer.c | 57 ++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/cogl/cogl/cogl-buffer-private.h b/cogl/cogl/cogl-buffer-private.h index bebc18f41..6fc80695c 100644 --- a/cogl/cogl/cogl-buffer-private.h +++ b/cogl/cogl/cogl-buffer-private.h @@ -70,20 +70,7 @@ struct _CoglBuffer unsigned int store_created : 1; - void * (* map_range) (CoglBuffer *buffer, - size_t offset, - size_t size, - CoglBufferAccess access, - CoglBufferMapHint hints, - GError **error); - - void (* unmap) (CoglBuffer *buffer); - - gboolean (* set_data) (CoglBuffer *buffer, - unsigned int offset, - const void *data, - unsigned int size, - GError **error); + unsigned int use_malloc: 1; }; struct _CoglBufferClass { diff --git a/cogl/cogl/cogl-buffer.c b/cogl/cogl/cogl-buffer.c index 8c258e024..829adf6fd 100644 --- a/cogl/cogl/cogl-buffer.c +++ b/cogl/cogl/cogl-buffer.c @@ -143,20 +143,13 @@ cogl_buffer_set_property (GObject *gobject, use_malloc = TRUE; } + buffer->use_malloc = use_malloc; if (use_malloc) { - buffer->map_range = malloc_map_range; - buffer->unmap = malloc_unmap; - buffer->set_data = malloc_set_data; - buffer->data = g_malloc (buffer->size); } else { - buffer->map_range = buffer->context->driver_vtable->buffer_map_range; - buffer->unmap = buffer->context->driver_vtable->buffer_unmap; - buffer->set_data = buffer->context->driver_vtable->buffer_set_data; - buffer->context->driver_vtable->buffer_create (buffer); buffer->flags |= COGL_BUFFER_FLAG_BUFFER_OBJECT; @@ -282,12 +275,26 @@ cogl_buffer_map_range (CoglBuffer *buffer, g_return_val_if_fail (COGL_IS_BUFFER (buffer), NULL); g_return_val_if_fail (!(buffer->flags & COGL_BUFFER_FLAG_MAPPED), NULL); - buffer->data = buffer->map_range (buffer, - offset, - size, - access, - hints, - error); + if (buffer->use_malloc) + { + buffer->data = malloc_map_range (buffer, + offset, + size, + access, + hints, + error); + } + else + { + const CoglDriverVtable *driver = buffer->context->driver_vtable; + + buffer->data = driver->buffer_map_range (buffer, + offset, + size, + access, + hints, + error); + } return buffer->data; } @@ -300,7 +307,16 @@ cogl_buffer_unmap (CoglBuffer *buffer) if (!(buffer->flags & COGL_BUFFER_FLAG_MAPPED)) return; - buffer->unmap (buffer); + if (buffer->use_malloc) + { + malloc_unmap (buffer); + } + else + { + const CoglDriverVtable *driver = buffer->context->driver_vtable; + + driver->buffer_unmap (buffer); + } } void * @@ -387,7 +403,16 @@ cogl_buffer_set_data (CoglBuffer *buffer, g_return_val_if_fail (COGL_IS_BUFFER (buffer), FALSE); g_return_val_if_fail ((offset + size) <= buffer->size, FALSE); - status = buffer->set_data (buffer, offset, data, size, &ignore_error); + if (buffer->use_malloc) + { + status = malloc_set_data (buffer, offset, data, size, &ignore_error); + } + else + { + const CoglDriverVtable *driver = buffer->context->driver_vtable; + + status = driver->buffer_set_data (buffer, offset, data, size, &ignore_error); + } g_clear_error (&ignore_error); return status;