[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