/// @brief Check the values of `attrs->context_*`. static bool glx_config_check_context_attrs(struct glx_display *dpy, const struct wcore_config_attrs *attrs) { struct glx_platform *plat = glx_platform(dpy->wcore.platform); if (attrs->context_forward_compatible) { assert(attrs->context_api == WAFFLE_CONTEXT_OPENGL); assert(wcore_config_attrs_version_ge(attrs, 30)); } if (attrs->context_debug && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request a debug context"); return false; } if (attrs->context_robust && !dpy->ARB_create_context_robustness) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context_robustness is required in order to " "request a robust access context"); return false; } switch (attrs->context_api) { case WAFFLE_CONTEXT_OPENGL: if (!wcore_config_attrs_version_eq(attrs, 10) && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request an OpenGL version not equal to the default " "value 1.0"); return false; } else if (wcore_config_attrs_version_ge(attrs, 32) && !dpy->ARB_create_context_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context_profile is required " "to create a context with version >= 3.2"); return false; } else if (wcore_config_attrs_version_ge(attrs, 32)) { assert(attrs->context_profile == WAFFLE_CONTEXT_CORE_PROFILE || attrs->context_profile == WAFFLE_CONTEXT_COMPATIBILITY_PROFILE); } if (attrs->context_forward_compatible && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request a forward-compatible context"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES1: assert(wcore_config_attrs_version_eq(attrs, 10) || wcore_config_attrs_version_eq(attrs, 11)); assert(!attrs->context_forward_compatible); if (!dpy->EXT_create_context_es_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile is required " "to create an OpenGL ES1 context"); return false; } else if (!linux_platform_dl_can_open(plat->linux, WAFFLE_DL_OPENGL_ES1)) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "failed to open the OpenGL ES1 library"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES2: assert(attrs->context_major_version == 2); assert(!attrs->context_forward_compatible); if (!dpy->EXT_create_context_es_profile && !dpy->EXT_create_context_es2_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile or " "GLX_EXT_create_context_es2_profile is required " "to create an OpenGL ES2 context"); return false; } if (!linux_platform_dl_can_open(plat->linux, WAFFLE_DL_OPENGL_ES2)) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "failed to open the OpenGL ES2 library"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES3: assert(attrs->context_major_version == 3); if (!dpy->EXT_create_context_es_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile is required " "to create an OpenGL ES3 context"); return false; } if (!linux_platform_dl_can_open(plat->linux, WAFFLE_DL_OPENGL_ES3)) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "failed to open the OpenGL ES3 library"); return false; } return true; default: wcore_error_internal("context_api has bad value %#x", attrs->context_api); return false; } }
/// @brief Check the values of `attrs->context_*`. static bool glx_config_check_context_attrs(struct glx_display *dpy, const struct wcore_config_attrs *attrs) { if (attrs->context_forward_compatible) { assert(attrs->context_api == WAFFLE_CONTEXT_OPENGL); assert(wcore_config_attrs_version_ge(attrs, 30)); } if (attrs->context_debug && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request a debug context"); return false; } if (attrs->context_robust && !dpy->ARB_create_context_robustness) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context_robustness is required in order to " "request a robust access context"); return false; } switch (attrs->context_api) { case WAFFLE_CONTEXT_OPENGL: if (glx_context_needs_arb_create_context(attrs) && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request an OpenGL version greater or equal than 3.2"); return false; } else if (wcore_config_attrs_version_ge(attrs, 32) && !dpy->ARB_create_context_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context_profile is required " "to create a context with version >= 3.2"); return false; } else if (wcore_config_attrs_version_ge(attrs, 32)) { assert(attrs->context_profile == WAFFLE_CONTEXT_CORE_PROFILE || attrs->context_profile == WAFFLE_CONTEXT_COMPATIBILITY_PROFILE); } if (attrs->context_forward_compatible && !dpy->ARB_create_context) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_ARB_create_context is required in order to " "request a forward-compatible context"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES1: if (!dpy->EXT_create_context_es_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile is required " "to create an OpenGL ES1 context"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES2: if (!dpy->EXT_create_context_es_profile && !dpy->EXT_create_context_es2_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile or " "GLX_EXT_create_context_es2_profile is required " "to create an OpenGL ES2 context"); return false; } return true; case WAFFLE_CONTEXT_OPENGL_ES3: if (!dpy->EXT_create_context_es_profile) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "GLX_EXT_create_context_es_profile is required " "to create an OpenGL ES3 context"); return false; } return true; default: assert(false); return false; } }