From d60692601388b5448fb0ed4eb894103293b2f074 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 7 Aug 2012 12:43:17 -0700 Subject: [PATCH] i965: Validate API and version in brwCreateContext v2: Use base-10 for versions like gl_context::Version. Suggested by Ken. Signed-off-by: Ian Romanick Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_context.c | 40 +++++++++++++++++++++-- src/mesa/drivers/dri/i965/brw_context.h | 3 ++ src/mesa/drivers/dri/intel/intel_screen.c | 8 +++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index a5711e4a58d..e72d5b6710f 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -75,27 +75,61 @@ bool brwCreateContext(int api, const struct gl_config *mesaVis, __DRIcontext *driContextPriv, + unsigned major_version, + unsigned minor_version, + unsigned *error, void *sharedContextPrivate) { __DRIscreen *sPriv = driContextPriv->driScreenPriv; struct intel_screen *screen = sPriv->driverPrivate; struct dd_function_table functions; - struct brw_context *brw = rzalloc(NULL, struct brw_context); - struct intel_context *intel = &brw->intel; - struct gl_context *ctx = &intel->ctx; unsigned i; + /* Filter against the requested API and version. + */ + switch (api) { + case API_OPENGL: { +#ifdef TEXTURE_FLOAT_ENABLED + const unsigned max_version = + (screen->gen == 6 || + (screen->gen == 7 && screen->kernel_has_gen7_sol_reset)) + ? 30 : 21; +#else + const unsigned max_version = 21; +#endif + 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; + return false; + } + + struct brw_context *brw = rzalloc(NULL, struct brw_context); if (!brw) { printf("%s: failed to alloc context\n", __FUNCTION__); + *error = __DRI_CTX_ERROR_NO_MEMORY; return false; } brwInitDriverFunctions(screen, &functions); + struct intel_context *intel = &brw->intel; + struct gl_context *ctx = &intel->ctx; + if (!intelInitContext( intel, api, mesaVis, driContextPriv, sharedContextPrivate, &functions )) { printf("%s: failed to init intel context\n", __FUNCTION__); FREE(brw); + *error = __DRI_CTX_ERROR_NO_MEMORY; return false; } diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 51dfcca4827..15ef0a35d4f 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1099,6 +1099,9 @@ void brwInitVtbl( struct brw_context *brw ); bool brwCreateContext(int api, const struct gl_config *mesaVis, __DRIcontext *driContextPriv, + unsigned major_version, + unsigned minor_version, + unsigned *error, void *sharedContextPrivate); /*====================================================================== diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 737cc49b16b..034499bf801 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -701,6 +701,9 @@ extern bool brwCreateContext(int api, const struct gl_config *mesaVis, __DRIcontext *driContextPriv, + unsigned major_version, + unsigned minor_version, + unsigned *error, void *sharedContextPrivate); static GLboolean @@ -764,8 +767,9 @@ intelCreateContext(gl_api api, } #else success = brwCreateContext(api, mesaVis, - driContextPriv, - sharedContextPrivate); + driContextPriv, + major_version, minor_version, error, + sharedContextPrivate); #endif if (success) {