Mesa (master): i915: Validate API and version in i915CreateContext
Ian Romanick
idr at kemper.freedesktop.org
Tue Aug 14 00:45:00 UTC 2012
Module: Mesa
Branch: master
Commit: db273724c9484d513f5caa34729475d2873d9f7b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=db273724c9484d513f5caa34729475d2873d9f7b
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Tue Aug 7 12:30:14 2012 -0700
i915: Validate API and version in i915CreateContext
v2: Use base-10 for versions like gl_context::Version. Suggested by Ken.
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/i915/i915_context.c | 34 ++++++++++++++++++++++++++++-
src/mesa/drivers/dri/i915/i915_context.h | 3 ++
src/mesa/drivers/dri/intel/intel_screen.c | 4 +++
3 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c
index dc32292..1a0baa2 100644
--- a/src/mesa/drivers/dri/i915/i915_context.c
+++ b/src/mesa/drivers/dri/i915/i915_context.c
@@ -146,6 +146,9 @@ bool
i915CreateContext(int api,
const struct gl_config * mesaVis,
__DRIcontext * driContextPriv,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *error,
void *sharedContextPrivate)
{
struct dd_function_table functions;
@@ -153,8 +156,10 @@ i915CreateContext(int api,
struct intel_context *intel = &i915->intel;
struct gl_context *ctx = &intel->ctx;
- if (!i915)
+ if (!i915) {
+ *error = __DRI_CTX_ERROR_NO_MEMORY;
return false;
+ }
i915InitVtbl(i915);
@@ -163,6 +168,33 @@ i915CreateContext(int api,
if (!intelInitContext(intel, api, mesaVis, driContextPriv,
sharedContextPrivate, &functions)) {
FREE(i915);
+ *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: {
+ 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;
+ FREE(i915);
+ return false;
+ }
+ break;
+ }
+ case API_OPENGLES:
+ case API_OPENGLES2:
+ break;
+ default:
+ *error = __DRI_CTX_ERROR_BAD_API;
+ FREE(i915);
return false;
}
diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h
index 7037465..f5c1596 100644
--- a/src/mesa/drivers/dri/i915/i915_context.h
+++ b/src/mesa/drivers/dri/i915/i915_context.h
@@ -322,6 +322,9 @@ do { \
extern bool i915CreateContext(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 877d11b..737cc49 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -693,6 +693,9 @@ extern bool
i915CreateContext(int api,
const struct gl_config *mesaVis,
__DRIcontext *driContextPriv,
+ unsigned major_version,
+ unsigned minor_version,
+ unsigned *error,
void *sharedContextPrivate);
extern bool
brwCreateContext(int api,
@@ -734,6 +737,7 @@ intelCreateContext(gl_api api,
#ifdef I915
if (IS_9XX(intelScreen->deviceID)) {
success = i915CreateContext(api, mesaVis, driContextPriv,
+ major_version, minor_version, error,
sharedContextPrivate);
} else {
switch (api) {
More information about the mesa-commit
mailing list