[Mesa-dev] [PATCH 10/14] i915: Validate API and version in i915CreateContext
Kenneth Graunke
kenneth at whitecape.org
Wed Aug 8 15:09:38 PDT 2012
On 08/08/2012 10:38 AM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> src/mesa/drivers/dri/i915/i915_context.c | 35 ++++++++++++++++++++++++++++-
> src/mesa/drivers/dri/i915/i915_context.h | 3 ++
> src/mesa/drivers/dri/intel/intel_screen.c | 4 +++
> 3 files changed, 41 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..0729479 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,34 @@ 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)
> + ? 0x200 : 0x105;
> + const unsigned req_version = (major_version << 8) | minor_version;
Not the most readable of code. I'd prefer:
const unsigned max_version =
(ctx->Extensions.ARB_fragment_shader &&
ctx->Extensions.ARB_occlusion_query) ? 20 : 15;
const unsigned requested_ver = major_version * 10 + minor_version;
That matches the style we use in ctx->Version. Otherwise,
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> + 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 2fef8fe..bc8c265 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -680,6 +680,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,
> @@ -721,6 +724,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-dev
mailing list