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:
parent
7d376dfddc
commit
d3fec7648d
@ -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,8 +182,8 @@ 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
|
||||||
foreach_driver_description (CoglDriverId driver_override,
|
foreach_driver_description (CoglDriverId driver_override,
|
||||||
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user