extern const struct tnl_pipeline_stage *intel_pipeline[];
bool
-i830CreateContext(const struct gl_config * mesaVis,
+i830CreateContext(int api,
+ const struct gl_config * mesaVis,
__DRIcontext * driContextPriv,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *error,
void *sharedContextPrivate)
{
struct dd_function_table functions;
struct i830_context *i830 = rzalloc(NULL, struct i830_context);
struct intel_context *intel = &i830->intel;
struct gl_context *ctx = &intel->ctx;
- if (!i830)
+
+ if (!i830) {
+ *error = __DRI_CTX_ERROR_NO_MEMORY;
return false;
+ }
i830InitVtbl(i830);
i830InitDriverFunctions(&functions);
- if (!intelInitContext(intel, __DRI_API_OPENGL, mesaVis, driContextPriv,
- sharedContextPrivate, &functions)) {
- free(i830);
+ if (!intelInitContext(intel, __DRI_API_OPENGL,
+ major_version, minor_version,
+ mesaVis, driContextPriv,
+ sharedContextPrivate, &functions,
+ error)) {
+ ralloc_free(i830);
return false;
}
/* i830_context.c
*/
extern bool
-i830CreateContext(const struct gl_config * mesaVis,
+i830CreateContext(int api,
+ const struct gl_config * mesaVis,
__DRIcontext * driContextPriv,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *error,
void *sharedContextPrivate);
/* i830_tex.c, i830_texstate.c
i915InitDriverFunctions(&functions);
- if (!intelInitContext(intel, api, mesaVis, driContextPriv,
- sharedContextPrivate, &functions)) {
- *error = __DRI_CTX_ERROR_NO_MEMORY;
- return false;
- }
-
- /* Now that the extension bits are known, filter against the requested API
- * and version.
- */
- switch (api) {
- case API_OPENGL_COMPAT: {
- const unsigned max_version =
- (ctx->Extensions.ARB_fragment_shader &&
- ctx->Extensions.ARB_occlusion_query) ? 20 : 15;
- const unsigned req_version = major_version * 10 + minor_version;
-
- if (req_version > max_version) {
- *error = __DRI_CTX_ERROR_BAD_VERSION;
- return false;
- }
- break;
- }
- case API_OPENGLES:
- case API_OPENGLES2:
- break;
- default:
- *error = __DRI_CTX_ERROR_BAD_API;
+ if (!intelInitContext(intel, api, major_version, minor_version,
+ mesaVis, driContextPriv,
+ sharedContextPrivate, &functions,
+ error)) {
+ ralloc_free(i915);
return false;
}
__DRIscreen *sPriv = driContextPriv->driScreenPriv;
struct intel_screen *screen = sPriv->driverPrivate;
struct dd_function_table functions;
- const unsigned req_version = major_version * 10 + minor_version;
- unsigned max_supported_version = 0;
unsigned i;
-#ifdef TEXTURE_FLOAT_ENABLED
- bool has_texture_float = true;
-#else
- bool has_texture_float = false;
-#endif
-
- bool supports_gl30 = has_texture_float &&
- (screen->gen == 6 ||
- (screen->gen == 7 &&
- screen->kernel_has_gen7_sol_reset));
-
- /* Determine max_supported_version. */
- switch (api) {
- case API_OPENGL_COMPAT:
- max_supported_version = supports_gl30 ? 30 : 21;
- break;
- case API_OPENGLES:
- max_supported_version = 11;
- break;
- case API_OPENGLES2:
- max_supported_version = 20;
- break;
- case API_OPENGL_CORE:
- max_supported_version = supports_gl30 ? 31 : 0;
- break;
- default:
- break;
- }
-
- if (max_supported_version == 0) {
- *error = __DRI_CTX_ERROR_BAD_API;
- return false;
- } else if (req_version > max_supported_version) {
- *error = __DRI_CTX_ERROR_BAD_VERSION;
- return false;
- }
-
struct brw_context *brw = rzalloc(NULL, struct brw_context);
if (!brw) {
printf("%s: failed to alloc context\n", __FUNCTION__);
struct intel_context *intel = &brw->intel;
struct gl_context *ctx = &intel->ctx;
- if (!intelInitContext( intel, api, mesaVis, driContextPriv,
- sharedContextPrivate, &functions )) {
+ if (!intelInitContext( intel, api, major_version, minor_version,
+ mesaVis, driContextPriv,
+ sharedContextPrivate, &functions,
+ error)) {
printf("%s: failed to init intel context\n", __FUNCTION__);
- *error = __DRI_CTX_ERROR_NO_MEMORY;
+ ralloc_free(brw);
return false;
}
intel_init_syncobj_functions(functions);
}
+static bool
+validate_context_version(struct intel_screen *screen,
+ int mesa_api,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *dri_ctx_error)
+{
+ unsigned req_version = 10 * major_version + minor_version;
+ unsigned max_version = 0;
+
+ switch (mesa_api) {
+ case API_OPENGL_COMPAT:
+ max_version = screen->max_gl_compat_version;
+ break;
+ case API_OPENGL_CORE:
+ max_version = screen->max_gl_core_version;
+ break;
+ case API_OPENGLES:
+ max_version = screen->max_gl_es1_version;
+ break;
+ case API_OPENGLES2:
+ max_version = screen->max_gl_es2_version;
+ break;
+ default:
+ max_version = 0;
+ break;
+ }
+
+ if (max_version == 0) {
+ *dri_ctx_error = __DRI_CTX_ERROR_BAD_API;
+ return false;
+ } else if (req_version > max_version) {
+ *dri_ctx_error = __DRI_CTX_ERROR_BAD_VERSION;
+ return false;
+ }
+
+ return true;
+}
+
bool
intelInitContext(struct intel_context *intel,
- int api,
+ int api,
+ unsigned major_version,
+ unsigned minor_version,
const struct gl_config * mesaVis,
__DRIcontext * driContextPriv,
void *sharedContextPrivate,
- struct dd_function_table *functions)
+ struct dd_function_table *functions,
+ unsigned *dri_ctx_error)
{
struct gl_context *ctx = &intel->ctx;
struct gl_context *shareCtx = (struct gl_context *) sharedContextPrivate;
struct gl_config visual;
/* we can't do anything without a connection to the device */
- if (intelScreen->bufmgr == NULL)
+ if (intelScreen->bufmgr == NULL) {
+ *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY;
+ return false;
+ }
+
+ if (!validate_context_version(intelScreen,
+ api, major_version, minor_version,
+ dri_ctx_error))
return false;
/* Can't rely on invalidate events, fall back to glViewport hack */
if (!_mesa_initialize_context(&intel->ctx, api, mesaVis, shareCtx,
functions)) {
+ *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY;
printf("%s: failed to init mesa context\n", __FUNCTION__);
return false;
}
*/
extern bool intelInitContext(struct intel_context *intel,
- int api,
- const struct gl_config * mesaVis,
- __DRIcontext * driContextPriv,
- void *sharedContextPrivate,
- struct dd_function_table *functions);
+ int api,
+ unsigned major_version,
+ unsigned minor_version,
+ const struct gl_config * mesaVis,
+ __DRIcontext * driContextPriv,
+ void *sharedContextPrivate,
+ struct dd_function_table *functions,
+ unsigned *dri_ctx_error);
extern void intelFinish(struct gl_context * ctx);
extern void intel_flush_rendering_to_batch(struct gl_context *ctx);
* functions.
*/
extern bool
-i830CreateContext(const struct gl_config *mesaVis,
+i830CreateContext(int api,
+ const struct gl_config *mesaVis,
__DRIcontext *driContextPriv,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *error,
void *sharedContextPrivate);
extern bool
major_version, minor_version, error,
sharedContextPrivate);
} else {
- switch (api) {
- case API_OPENGL_COMPAT:
- if (major_version > 1 || minor_version > 3) {
- *error = __DRI_CTX_ERROR_BAD_VERSION;
- success = false;
- }
- break;
- case API_OPENGLES:
- break;
- default:
- *error = __DRI_CTX_ERROR_BAD_API;
- success = false;
- }
-
- if (success) {
- intelScreen->no_vbo = true;
- success = i830CreateContext(mesaVis, driContextPriv,
- sharedContextPrivate);
- if (!success)
- *error = __DRI_CTX_ERROR_NO_MEMORY;
- }
+ intelScreen->no_vbo = true;
+ success = i830CreateContext(api, mesaVis, driContextPriv,
+ major_version, minor_version, error,
+ sharedContextPrivate);
}
#else
success = brwCreateContext(api, mesaVis,