+ struct st_context_iface *st_share = NULL;
+ struct st_context_attribs attribs;
+ enum st_context_error ctx_err = 0;
+ unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG |
+ __DRI_CTX_FLAG_FORWARD_COMPATIBLE;
+
+ if (screen->has_reset_status_query)
+ allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS;
+
+ if (flags & ~allowed_flags) {
+ *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
+ goto fail;
+ }
+
+ if (!screen->has_reset_status_query && notify_reset) {
+ *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
+ goto fail;
+ }
+
+ memset(&attribs, 0, sizeof(attribs));
+ switch (api) {
+ case API_OPENGLES:
+ attribs.profile = ST_PROFILE_OPENGL_ES1;
+ break;
+ case API_OPENGLES2:
+ attribs.profile = ST_PROFILE_OPENGL_ES2;
+ break;
+ case API_OPENGL_COMPAT:
+ case API_OPENGL_CORE:
+ attribs.profile = api == API_OPENGL_COMPAT ? ST_PROFILE_DEFAULT
+ : ST_PROFILE_OPENGL_CORE;
+ attribs.major = major_version;
+ attribs.minor = minor_version;
+
+ if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0)
+ attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE;
+ break;
+ default:
+ *error = __DRI_CTX_ERROR_BAD_API;
+ goto fail;
+ }
+
+ if ((flags & __DRI_CTX_FLAG_DEBUG) != 0)
+ attribs.flags |= ST_CONTEXT_FLAG_DEBUG;
+
+ if (flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)
+ attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS;
+
+ if (notify_reset)
+ attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED;