void dri_init_options(struct dri_screen *screen) { pipe_loader_load_options(screen->dev); dri_fill_st_options(screen); }
GLboolean dri_create_context(gl_api api, const struct gl_config * visual, __DRIcontext * cPriv, unsigned major_version, unsigned minor_version, uint32_t flags, unsigned *error, void *sharedContextPrivate) { __DRIscreen *sPriv = cPriv->driScreenPriv; struct dri_screen *screen = dri_screen(sPriv); struct st_api *stapi = screen->st_api; struct dri_context *ctx = NULL; struct st_context_iface *st_share = NULL; struct st_context_attribs attribs; enum st_context_error ctx_err = 0; 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: attribs.profile = ST_PROFILE_DEFAULT; attribs.major = major_version; attribs.minor = minor_version; if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) attribs.flags |= ST_CONTEXT_FLAG_DEBUG; 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 (sharedContextPrivate) { st_share = ((struct dri_context *)sharedContextPrivate)->st; } ctx = CALLOC_STRUCT(dri_context); if (ctx == NULL) { *error = __DRI_CTX_ERROR_NO_MEMORY; goto fail; } cPriv->driverPrivate = ctx; ctx->cPriv = cPriv; ctx->sPriv = sPriv; driParseConfigFiles(&ctx->optionCache, &screen->optionCache, sPriv->myNum, driver_descriptor.name); dri_fill_st_options(&attribs.options, &ctx->optionCache); dri_fill_st_visual(&attribs.visual, screen, visual); ctx->st = stapi->create_context(stapi, &screen->base, &attribs, &ctx_err, st_share); if (ctx->st == NULL) { switch (ctx_err) { case ST_CONTEXT_SUCCESS: *error = __DRI_CTX_ERROR_SUCCESS; break; case ST_CONTEXT_ERROR_NO_MEMORY: *error = __DRI_CTX_ERROR_NO_MEMORY; break; case ST_CONTEXT_ERROR_BAD_API: *error = __DRI_CTX_ERROR_BAD_API; break; case ST_CONTEXT_ERROR_BAD_VERSION: *error = __DRI_CTX_ERROR_BAD_VERSION; break; case ST_CONTEXT_ERROR_BAD_FLAG: *error = __DRI_CTX_ERROR_BAD_FLAG; break; case ST_CONTEXT_ERROR_UNKNOWN_ATTRIBUTE: *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; break; case ST_CONTEXT_ERROR_UNKNOWN_FLAG: *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; break; } goto fail; } ctx->st->st_manager_private = (void *) ctx; ctx->stapi = stapi; // Context successfully created. See if post-processing is requested. dri_pp_query(ctx); ctx->pp = pp_init(screen->base.screen, ctx->pp_enabled); *error = __DRI_CTX_ERROR_SUCCESS; return GL_TRUE; fail: if (ctx && ctx->st) ctx->st->destroy(ctx->st); FREE(ctx); return GL_FALSE; }
GLboolean dri_create_context(gl_api api, const struct gl_config * visual, __DRIcontext * cPriv, unsigned major_version, unsigned minor_version, uint32_t flags, bool notify_reset, unsigned *error, void *sharedContextPrivate) { __DRIscreen *sPriv = cPriv->driScreenPriv; struct dri_screen *screen = dri_screen(sPriv); struct st_api *stapi = screen->st_api; struct dri_context *ctx = NULL; struct st_context_iface *st_share = NULL; struct st_context_attribs attribs; enum st_context_error ctx_err = 0; 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_DEBUG) != 0) attribs.flags |= ST_CONTEXT_FLAG_DEBUG; 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 | __DRI_CTX_FLAG_FORWARD_COMPATIBLE)) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; goto fail; } if (notify_reset) { *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; goto fail; } if (sharedContextPrivate) { st_share = ((struct dri_context *)sharedContextPrivate)->st; } ctx = CALLOC_STRUCT(dri_context); if (ctx == NULL) { *error = __DRI_CTX_ERROR_NO_MEMORY; goto fail; } cPriv->driverPrivate = ctx; ctx->cPriv = cPriv; ctx->sPriv = sPriv; dri_fill_st_options(&attribs.options, &screen->optionCache); dri_fill_st_visual(&attribs.visual, screen, visual); ctx->st = stapi->create_context(stapi, &screen->base, &attribs, &ctx_err, st_share); if (ctx->st == NULL) { switch (ctx_err) { case ST_CONTEXT_SUCCESS: *error = __DRI_CTX_ERROR_SUCCESS; break; case ST_CONTEXT_ERROR_NO_MEMORY: *error = __DRI_CTX_ERROR_NO_MEMORY; break; case ST_CONTEXT_ERROR_BAD_API: *error = __DRI_CTX_ERROR_BAD_API; break; case ST_CONTEXT_ERROR_BAD_VERSION: *error = __DRI_CTX_ERROR_BAD_VERSION; break; case ST_CONTEXT_ERROR_BAD_FLAG: *error = __DRI_CTX_ERROR_BAD_FLAG; break; case ST_CONTEXT_ERROR_UNKNOWN_ATTRIBUTE: *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; break; case ST_CONTEXT_ERROR_UNKNOWN_FLAG: *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; break; } goto fail; } ctx->st->st_manager_private = (void *) ctx; ctx->stapi = stapi; if (ctx->st->cso_context) { ctx->pp = pp_init(ctx->st->pipe, screen->pp_enabled, ctx->st->cso_context); ctx->hud = hud_create(ctx->st->pipe, ctx->st->cso_context); } *error = __DRI_CTX_ERROR_SUCCESS; return GL_TRUE; fail: if (ctx && ctx->st) ctx->st->destroy(ctx->st); free(ctx); return GL_FALSE; }