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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4137>
This commit is contained in:
Bilal Elmoussaoui 2024-11-16 17:18:25 +01:00 committed by Jordan Petridis
parent 13f6dcc098
commit 03c36f94bb
2 changed files with 42 additions and 30 deletions

View File

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

View File

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