[Mesa-dev] [PATCH 07/14] dri: Pass API_OPENGL_CORE through to the drivers
Kenneth Graunke
kenneth at whitecape.org
Wed Aug 8 14:53:11 PDT 2012
On 08/08/2012 10:38 AM, Ian Romanick 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;
> + }
This doesn't look like rejecting API_OPENGL 3.2+. It looks like it
converts it to API_OPENGL_CORE, just like you did for 3.1.
I'll take your word for it that r100/r200 can only support GL 1.3, and
about the NV chips.
Looks OK other than that.
> +
> /* 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) {
> + *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) {
> + *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);
>
More information about the mesa-dev
mailing list