[Mesa-dev] [PATCH 07/14] dri: Pass API_OPENGL_CORE through to the drivers

Ian Romanick idr at freedesktop.org
Wed Aug 8 13:23:16 PDT 2012


These drivers can only do OpenGL 1.3.

(Sent from my phone.)

On Aug 8, 2012, at 11:21 AM, Jordan Justen <jljusten at gmail.com> wrote:

> On Wed, Aug 8, 2012 at 10:38 AM, Ian Romanick <idr at freedesktop.org> wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>> 
>> This forces the drivers to do at least some validation of context API
>> and version before creating the context.  In r100 and r200 drivers, this
>> means that they don't do any post-hoc validation.
>> 
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>> src/mesa/drivers/dri/common/dri_util.c         |   15 +++++++++++++++
>> src/mesa/drivers/dri/intel/intel_screen.c      |   17 +++++++++++++++++
>> src/mesa/drivers/dri/nouveau/nouveau_context.c |   24 +++++++++++++++++++++++-
>> src/mesa/drivers/dri/r200/r200_context.c       |   22 +++++++++++++++-------
>> src/mesa/drivers/dri/radeon/radeon_context.c   |   22 +++++++++++++++-------
>> src/mesa/drivers/dri/swrast/swrast.c           |   19 ++++++++++++++-----
>> 6 files changed, 99 insertions(+), 20 deletions(-)
>> 
>> diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
>> index 91ae186..025a14a 100644
>> --- a/src/mesa/drivers/dri/common/dri_util.c
>> +++ b/src/mesa/drivers/dri/common/dri_util.c
>> @@ -192,6 +192,8 @@ dri2CreateContextAttribs(__DRIscreen *screen, int api,
>>        mesa_api = API_OPENGLES2;
>>        break;
>>     case __DRI_API_OPENGL_CORE:
>> +        mesa_api = API_OPENGL_CORE;
>> +        break;
>>     default:
>>        *error = __DRI_CTX_ERROR_BAD_API;
>>        return NULL;
>> @@ -218,6 +220,19 @@ dri2CreateContextAttribs(__DRIscreen *screen, int api,
>>        }
>>     }
>> 
>> +    /* Mesa does not support the GL_ARB_compatibilty extension or the
>> +     * compatibility profile.  This means that we treat a API_OPENGL 3.1 as
>> +     * API_OPENGL_CORE and reject API_OPENGL 3.2+.
>> +     */
>> +    if (mesa_api == API_OPENGL && major_version == 3 && minor_version == 1)
>> +       mesa_api = API_OPENGL_CORE;
>> +
>> +    if (mesa_api == API_OPENGL
>> +        && ((major_version > 3)
>> +            || (major_version == 3 && minor_version >= 2))) {
>> +       mesa_api = API_OPENGL_CORE;
>> +    }
>> +
>>     /* The EGL_KHR_create_context spec says:
>>      *
>>      *     "Flags are only defined for OpenGL context creation, and specifying
>> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
>> index 3c595bc..e541c7f 100644
>> --- a/src/mesa/drivers/dri/intel/intel_screen.c
>> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
>> @@ -701,6 +701,23 @@ intelCreateContext(gl_api api,
>>    struct intel_screen *intelScreen = sPriv->driverPrivate;
>>    bool success = false;
>> 
>> +   switch (api) {
>> +   case API_OPENGL:
>> +   case API_OPENGLES:
>> +      break;
>> +   case API_OPENGLES2:
>> +#ifdef I915
>> +      if (!IS_9XX(intelScreen->deviceID)) {
>> +         *error = __DRI_CTX_ERROR_BAD_API;
>> +         return false;
>> +      }
>> +#endif
>> +      break;
>> +   case API_OPENGL_CORE:
>> +      *error = __DRI_CTX_ERROR_BAD_API;
>> +      return GL_FALSE;
>> +   }
>> +
>> #ifdef I915
>>    if (IS_9XX(intelScreen->deviceID)) {
>>       if (!IS_965(intelScreen->deviceID)) {
>> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
>> index f794308..4409eae 100644
>> --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
>> +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
>> @@ -59,9 +59,31 @@ nouveau_context_create(gl_api api,
>>        struct nouveau_context *nctx;
>>        struct gl_context *ctx;
>> 
>> +       switch (api) {
>> +       case API_OPENGL:
>> +               /* Do after-the-fact version checking (below).
>> +                */
>> +               break;
>> +       case API_OPENGLES:
>> +               /* NV10 and NV20 can support OpenGL ES 1.0 only.  Older chips
>> +                * cannot do even that.
>> +                */
>> +               if ((screen->device->chipset & 0xf0) == 0x00) {
>> +                       *error = __DRI_CTX_ERROR_BAD_API;
>> +                       return GL_FALSE;
>> +               } else if (minor_version != 0) {
>> +                       *error = __DRI_CTX_ERROR_BAD_VERSION;
>> +                       return GL_FALSE;
>> +               }
>> +               break;
>> +       case API_OPENGLES2:
>> +       case API_OPENGL_CORE:
>> +               *error = __DRI_CTX_ERROR_BAD_API;
>> +               return GL_FALSE;
>> +       }
>> +
>>        /* API and flag filtering is handled in dri2CreateContextAttribs.
>>         */
>> -       (void) api;
>>        (void) flags;
>> 
>>        ctx = screen->driver->context_create(screen, visual, share_ctx);
>> diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
>> index 17e08a1..5f8cc86 100644
>> --- a/src/mesa/drivers/dri/r200/r200_context.c
>> +++ b/src/mesa/drivers/dri/r200/r200_context.c
>> @@ -212,9 +212,22 @@ GLboolean r200CreateContext( gl_api api,
>>    int i;
>>    int tcl_mode;
>> 
>> -   /* API and flag filtering is handled in dri2CreateContextAttribs.
>> +   switch (api) {
>> +   case API_OPENGL:
>> +      if (major_version > 1 || minor_version > 3) {
> 
> This checks for GL > 1.3. Is that what is needed here?
> 
> I was thinking that for API_OPENGL we'd be looking for
> GL >= 3.1 => error.
> 
>> +         *error = __DRI_CTX_ERROR_BAD_VERSION;
>> +         return GL_FALSE;
>> +      }
>> +      break;
>> +   case API_OPENGLES:
>> +      break;
>> +   default:
>> +      *error = __DRI_CTX_ERROR_BAD_API;
>> +      return GL_FALSE;
>> +   }
>> +
>> +   /* Flag filtering is handled in dri2CreateContextAttribs.
>>     */
>> -   (void) api;
>>    (void) flags;
>> 
>>    assert(glVisual);
>> @@ -454,11 +467,6 @@ GLboolean r200CreateContext( gl_api api,
>>    }
>> 
>>    _mesa_compute_version(ctx);
>> -   if (ctx->Version < major_version * 10 + minor_version) {
>> -      r200DestroyContext(driContextPriv);
>> -      *error = __DRI_CTX_ERROR_BAD_VERSION;
>> -      return GL_FALSE;
>> -   }
>> 
>>    *error = __DRI_CTX_ERROR_SUCCESS;
>>    return GL_TRUE;
>> diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
>> index 34c392e..e17c786 100644
>> --- a/src/mesa/drivers/dri/radeon/radeon_context.c
>> +++ b/src/mesa/drivers/dri/radeon/radeon_context.c
>> @@ -178,9 +178,22 @@ r100CreateContext( gl_api api,
>>    int i;
>>    int tcl_mode, fthrottle_mode;
>> 
>> -   /* API and flag filtering is handled in dri2CreateContextAttribs.
>> +   switch (api) {
>> +   case API_OPENGL:
>> +      if (major_version > 1 || minor_version > 3) {
> 
> Same question.
> 
>> +         *error = __DRI_CTX_ERROR_BAD_VERSION;
>> +         return GL_FALSE;
>> +      }
>> +      break;
>> +   case API_OPENGLES:
>> +      break;
>> +   default:
>> +      *error = __DRI_CTX_ERROR_BAD_API;
>> +      return GL_FALSE;
>> +   }
>> +
>> +   /* Flag filtering is handled in dri2CreateContextAttribs.
>>     */
>> -   (void) api;
>>    (void) flags;
>> 
>>    assert(glVisual);
>> @@ -402,11 +415,6 @@ r100CreateContext( gl_api api,
>>    }
>> 
>>    _mesa_compute_version(ctx);
>> -   if (ctx->Version < major_version * 10 + minor_version) {
>> -      radeonDestroyContext(driContextPriv);
>> -      *error = __DRI_CTX_ERROR_BAD_VERSION;
>> -      return GL_FALSE;
>> -   }
>> 
>>    *error = __DRI_CTX_ERROR_SUCCESS;
>>    return GL_TRUE;
>> diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
>> index ca6bda02..7773fd9 100644
>> --- a/src/mesa/drivers/dri/swrast/swrast.c
>> +++ b/src/mesa/drivers/dri/swrast/swrast.c
>> @@ -719,11 +719,20 @@ dri_create_context(gl_api api,
>>      */
>>     (void) flags;
>> 
>> -    if (api == API_OPENGL
>> -       && (major_version > 2
>> -           || (major_version == 2 && minor_version > 1))) {
>> -       *error = __DRI_CTX_ERROR_BAD_VERSION;
>> -       goto context_fail;
>> +    switch (api) {
>> +    case API_OPENGL:
>> +        if (major_version > 2
>> +           || (major_version == 2 && minor_version > 1)) {
>> +            *error = __DRI_CTX_ERROR_BAD_VERSION;
>> +            return GL_FALSE;
>> +        }
>> +        break;
>> +    case API_OPENGLES:
>> +    case API_OPENGLES2:
>> +        break;
>> +    case API_OPENGL_CORE:
>> +        *error = __DRI_CTX_ERROR_BAD_API;
>> +        return GL_FALSE;
>>     }
>> 
>>     ctx = CALLOC_STRUCT(dri_context);
>> --
>> 1.7.6.5
>> 
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list