cogl/renderer: Simplify driver constraints logic

By just using the DriverId to get all the necessary details where
needed.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4194>
This commit is contained in:
Bilal Elmoussaoui 2024-12-22 17:12:12 +01:00 committed by Marge Bot
parent 7d376dfddc
commit d3fec7648d

View File

@ -69,45 +69,15 @@
#endif #endif
typedef struct _CoglDriverDescription static CoglDriverId _cogl_drivers[] =
{
CoglDriverId id;
const char *name;
/* It would be nice to make this a pointer and then use a compound
* literal from C99 to initialise it but we probably can't get away
* with using C99 here. Instead we'll just use a fixed-size array.
* GCC should complain if someone adds an 8th feature to a
* driver. */
const CoglPrivateFeature private_features[8];
const char *libgl_name;
} CoglDriverDescription;
static CoglDriverDescription _cogl_drivers[] =
{ {
#ifdef HAVE_GL #ifdef HAVE_GL
{
COGL_DRIVER_ID_GL3, COGL_DRIVER_ID_GL3,
"gl3",
{ COGL_PRIVATE_FEATURE_ANY_GL,
-1 },
COGL_GL_LIBNAME,
},
#endif #endif
#ifdef HAVE_GLES2 #ifdef HAVE_GLES2
{
COGL_DRIVER_ID_GLES2, COGL_DRIVER_ID_GLES2,
"gles2",
{ COGL_PRIVATE_FEATURE_ANY_GL,
-1 },
COGL_GLES2_LIBNAME,
},
#endif #endif
{
COGL_DRIVER_ID_NOP, COGL_DRIVER_ID_NOP,
"nop",
{ -1 },
NULL /* libgl_name */
}
}; };
static CoglWinsysVtableGetter _cogl_winsys_vtable_getters[] = static CoglWinsysVtableGetter _cogl_winsys_vtable_getters[] =
@ -212,7 +182,7 @@ cogl_xlib_renderer_set_foreign_display (CoglRenderer *renderer,
} }
#endif /* HAVE_X11 */ #endif /* HAVE_X11 */
typedef gboolean (*CoglDriverCallback) (CoglDriverDescription *description, typedef gboolean (*CoglDriverCallback) (CoglDriverId driver_id,
void *user_data); void *user_data);
static void static void
@ -226,9 +196,9 @@ foreach_driver_description (CoglDriverId driver_override,
{ {
for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++) for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++)
{ {
if (_cogl_drivers[i].id == driver_override) if (_cogl_drivers[i] == driver_override)
{ {
callback (&_cogl_drivers[i], user_data); callback (_cogl_drivers[i], user_data);
return; return;
} }
} }
@ -239,7 +209,7 @@ foreach_driver_description (CoglDriverId driver_override,
for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++) for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++)
{ {
if (!callback (&_cogl_drivers[i], user_data)) if (!callback (_cogl_drivers[i], user_data))
return; return;
} }
} }
@ -247,14 +217,14 @@ foreach_driver_description (CoglDriverId driver_override,
static CoglDriverId static CoglDriverId
driver_name_to_id (const char *name) driver_name_to_id (const char *name)
{ {
int i; if (g_ascii_strcasecmp ("gl3", name) == 0)
return COGL_DRIVER_ID_GL3;
for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++) else if (g_ascii_strcasecmp ("gles2", name) == 0)
{ return COGL_DRIVER_ID_GLES2;
if (g_ascii_strcasecmp (_cogl_drivers[i].name, name) == 0) else if (g_ascii_strcasecmp ("nop", name) == 0)
return _cogl_drivers[i].id; return COGL_DRIVER_ID_NOP;
}
g_warn_if_reached ();
return COGL_DRIVER_ID_ANY; return COGL_DRIVER_ID_ANY;
} }
@ -278,19 +248,14 @@ driver_id_to_name (CoglDriverId id)
return "unknown"; return "unknown";
} }
typedef struct _SatisfyConstraintsState
{
const CoglDriverDescription *driver_description;
} SatisfyConstraintsState;
/* XXX this is still uglier than it needs to be */ /* XXX this is still uglier than it needs to be */
static gboolean static gboolean
satisfy_constraints (CoglDriverDescription *description, satisfy_constraints (CoglDriverId driver_id,
void *user_data) void *user_data)
{ {
SatisfyConstraintsState *state = user_data; CoglDriverId *state = user_data;
state->driver_description = description; *state = driver_id;
return FALSE; return FALSE;
} }
@ -300,11 +265,9 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
GError **error) GError **error)
{ {
const char *driver_name = g_getenv ("COGL_DRIVER"); const char *driver_name = g_getenv ("COGL_DRIVER");
CoglDriverId driver_override = COGL_DRIVER_ID_ANY; CoglDriverId picked_driver, driver_override = COGL_DRIVER_ID_ANY;
const char *invalid_override = NULL; const char *invalid_override = NULL;
const char *libgl_name; const char *libgl_name = NULL;
SatisfyConstraintsState state;
const CoglDriverDescription *desc;
int i; int i;
if (driver_name) if (driver_name)
@ -335,7 +298,7 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++) for (i = 0; i < G_N_ELEMENTS (_cogl_drivers); i++)
{ {
if (_cogl_drivers[i].id == driver_override) if (_cogl_drivers[i] == driver_override)
{ {
found = TRUE; found = TRUE;
break; break;
@ -354,13 +317,12 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
return FALSE; return FALSE;
} }
state.driver_description = NULL;
foreach_driver_description (driver_override, foreach_driver_description (driver_override,
satisfy_constraints, satisfy_constraints,
&state); &picked_driver);
if (!state.driver_description) if (picked_driver == COGL_DRIVER_ID_ANY)
{ {
g_set_error (error, COGL_RENDERER_ERROR, g_set_error (error, COGL_RENDERER_ERROR,
COGL_RENDERER_ERROR_BAD_CONSTRAINT, COGL_RENDERER_ERROR_BAD_CONSTRAINT,
@ -368,8 +330,7 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
return FALSE; return FALSE;
} }
desc = state.driver_description; renderer->driver_id = picked_driver;
renderer->driver_id = desc->id;
switch (renderer->driver_id) switch (renderer->driver_id)
{ {
@ -377,12 +338,14 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
case COGL_DRIVER_ID_GL3: case COGL_DRIVER_ID_GL3:
renderer->driver = g_object_new (COGL_TYPE_DRIVER_GL3, NULL); renderer->driver = g_object_new (COGL_TYPE_DRIVER_GL3, NULL);
renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GL3, NULL); renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GL3, NULL);
libgl_name = COGL_GL_LIBNAME;
break; break;
#endif #endif
#ifdef HAVE_GLES2 #ifdef HAVE_GLES2
case COGL_DRIVER_ID_GLES2: case COGL_DRIVER_ID_GLES2:
renderer->driver = g_object_new (COGL_TYPE_DRIVER_GLES2, NULL); renderer->driver = g_object_new (COGL_TYPE_DRIVER_GLES2, NULL);
renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GLES2, NULL); renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GLES2, NULL);
libgl_name = COGL_GLES2_LIBNAME;
break; break;
#endif #endif
@ -393,15 +356,7 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
break; break;
} }
libgl_name = desc->libgl_name; if (libgl_name)
memset(renderer->private_features, 0, sizeof (renderer->private_features));
for (i = 0; desc->private_features[i] != -1; i++)
COGL_FLAGS_SET (renderer->private_features,
desc->private_features[i], TRUE);
if (COGL_FLAGS_GET (renderer->private_features,
COGL_PRIVATE_FEATURE_ANY_GL))
{ {
renderer->libgl_module = g_module_open (libgl_name, renderer->libgl_module = g_module_open (libgl_name,
G_MODULE_BIND_LAZY); G_MODULE_BIND_LAZY);