summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2012-08-07 12:43:17 -0700
committerIan Romanick <[email protected]>2012-08-13 17:38:55 -0700
commitd60692601388b5448fb0ed4eb894103293b2f074 (patch)
tree67135e2e4622eaf36530123b64644fcada1591b7 /src
parentdb273724c9484d513f5caa34729475d2873d9f7b (diff)
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 <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.c40
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h3
-rw-r--r--src/mesa/drivers/dri/intel/intel_screen.c8
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) {