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 <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ian Romanick 2012-08-07 12:43:17 -07:00
parent db273724c9
commit d606926013
3 changed files with 46 additions and 5 deletions

View File

@ -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;
}

View File

@ -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);
/*======================================================================

View File

@ -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) {