[Mesa-dev] [PATCH 5/5] mesa: compute the GLSL version in the core

Brian Paul brian.e.paul at gmail.com
Mon Jan 23 05:54:47 PST 2012


On Sun, Jan 22, 2012 at 4:36 PM, Marek Olšák <maraeo at gmail.com> wrote:
> I think the CAP-based approach is the way to expose GLSL 1.3 for st/mesa.
> The later GLSL versions can be easily derived from exposed extensions,
> it's just GLSL 1.3 that is tricky. Comments welcome.
> ---
>  src/mesa/drivers/dri/intel/intel_extensions.c  |    9 +--
>  src/mesa/drivers/dri/intel/intel_screen.c      |    2 +-
>  src/mesa/drivers/dri/nouveau/nouveau_context.c |    2 +-
>  src/mesa/drivers/dri/r200/r200_context.c       |    2 +-
>  src/mesa/drivers/dri/radeon/radeon_context.c   |    2 +-
>  src/mesa/main/context.c                        |   14 +----
>  src/mesa/main/mtypes.h                         |    9 +++
>  src/mesa/main/version.c                        |   76 ++++++++++++++++++++++--
>  src/mesa/main/version.h                        |    5 +-
>  src/mesa/state_tracker/st_extensions.c         |   40 ++++++-------
>  src/mesa/state_tracker/st_manager.c            |    2 +-
>  11 files changed, 109 insertions(+), 54 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c
> index 0ce452f..f9caeee 100644
> --- a/src/mesa/drivers/dri/intel/intel_extensions.c
> +++ b/src/mesa/drivers/dri/intel/intel_extensions.c
> @@ -90,11 +90,10 @@ intelInitExtensions(struct gl_context *ctx)
>    ctx->Extensions.OES_EGL_image = true;
>  #endif
>
> -   if (intel->gen >= 6)
> -      ctx->Const.GLSLVersion = 130;
> -   else
> -      ctx->Const.GLSLVersion = 120;
> -   _mesa_override_glsl_version(ctx);
> +   if (intel->gen >= 6) {
> +      ctx->Const.NativeIntegerResources = GL_TRUE;
> +      ctx->Const.ShadowCubeSamplers = GL_TRUE;
> +   }
>
>    if (intel->gen == 6 ||
>        (intel->gen == 7 && intel->intelScreen->kernel_has_gen7_sol_reset))
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
> index 094ff56..d51d59c 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -563,7 +563,7 @@ intelCreateContext(gl_api api,
>       struct gl_context *ctx =
>         (struct gl_context *) driContextPriv->driverPrivate;
>
> -      _mesa_compute_version(ctx);
> +      _mesa_validate_feature_support(ctx);
>       if (ctx->VersionMajor > major_version
>          || (ctx->VersionMajor == major_version
>              && ctx->VersionMinor >= minor_version)) {
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
> index 0cb918e..039d952 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
> @@ -82,7 +82,7 @@ nouveau_context_create(gl_api api,
>        nctx->dri_context = dri_ctx;
>        dri_ctx->driverPrivate = ctx;
>
> -       _mesa_compute_version(ctx);
> +       _mesa_validate_feature_support(ctx);
>        if (ctx->VersionMajor < major_version
>            || (ctx->VersionMajor == major_version
>                && ctx->VersionMinor < minor_version)) {
> diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
> index 244973e..4f3b7ff 100644
> --- a/src/mesa/drivers/dri/r200/r200_context.c
> +++ b/src/mesa/drivers/dri/r200/r200_context.c
> @@ -453,7 +453,7 @@ GLboolean r200CreateContext( gl_api api,
>       TCL_FALLBACK(rmesa->radeon.glCtx, R200_TCL_FALLBACK_TCL_DISABLE, 1);
>    }
>
> -   _mesa_compute_version(ctx);
> +   _mesa_validate_feature_support(ctx);
>    if (ctx->VersionMajor < major_version
>        || (ctx->VersionMajor == major_version
>           && ctx->VersionMinor < minor_version)) {
> diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
> index 9881d00..1fbac45 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_context.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_context.c
> @@ -401,7 +401,7 @@ r100CreateContext( gl_api api,
>  /*       _tnl_need_dlist_norm_lengths( ctx, GL_FALSE ); */
>    }
>
> -   _mesa_compute_version(ctx);
> +   _mesa_validate_feature_support(ctx);
>    if (ctx->VersionMajor < major_version
>        || (ctx->VersionMajor == major_version
>           && ctx->VersionMinor < minor_version)) {
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index f39cab5..7e3bdcf 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -624,18 +624,6 @@ _mesa_init_constants(struct gl_context *ctx)
>    ctx->Const.MaxGeometryTotalOutputComponents = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS;
>  #endif
>
> -   /* Shading language version */
> -   if (ctx->API == API_OPENGL) {
> -      ctx->Const.GLSLVersion = 120;
> -      _mesa_override_glsl_version(ctx);
> -   }
> -   else if (ctx->API == API_OPENGLES2) {
> -      ctx->Const.GLSLVersion = 100;
> -   }
> -   else if (ctx->API == API_OPENGLES) {
> -      ctx->Const.GLSLVersion = 0; /* GLSL not supported */
> -   }
> -
>    /* GL_ARB_framebuffer_object */
>    ctx->Const.MaxSamples = 0;
>
> @@ -1507,7 +1495,7 @@ _mesa_make_current( struct gl_context *newCtx,
>       }
>
>       if (newCtx->FirstTimeCurrent) {
> -         _mesa_compute_version(newCtx);
> +         _mesa_validate_feature_support(newCtx);
>
>          newCtx->Extensions.String = _mesa_make_extension_string(newCtx);
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 2ff6085..1d2a265 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2814,6 +2814,15 @@ struct gl_constants
>    GLboolean NativeIntegers;
>
>    /**
> +    * Does the driver support integer vertex attribs, textures,
> +    * and colorbuffers?
> +    */
> +   GLboolean NativeIntegerResources;
> +
> +   /** Whether shadow cube samplers are supported. */
> +   GLboolean ShadowCubeSamplers;
> +
> +   /**
>     * If the driver supports real 32-bit integers, what integer value should be
>     * used for boolean true in uniform uploads?  (Usually 1 or ~0.)
>     */
> diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
> index fc6e17c..b4e9d28 100644
> --- a/src/mesa/main/version.c
> +++ b/src/mesa/main/version.c
> @@ -56,8 +56,8 @@ override_version(struct gl_context *ctx, GLuint *major, GLuint *minor)
>  * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for
>  * MESA_GLSL_VERSION_OVERRIDE are integers, such as "130".
>  */
> -void
> -_mesa_override_glsl_version(struct gl_context *ctx)
> +static void
> +override_glsl_version(struct gl_context *ctx)
>  {
>    const char *env_var = "MESA_GLSL_VERSION_OVERRIDE";
>    const char *version;
> @@ -75,12 +75,45 @@ _mesa_override_glsl_version(struct gl_context *ctx)
>    }
>  }
>
> +static void
> +compute_glsl_version_opengl(struct gl_context *ctx)
> +{
> +   if (ctx->Extensions.ARB_shading_language_100 &&
> +       ctx->Extensions.ARB_shader_objects &&
> +       ctx->Extensions.ARB_vertex_shader &&
> +       ctx->Extensions.ARB_fragment_shader) {
> +      ctx->Const.GLSLVersion = 120;
> +   }
> +
> +   if (ctx->Const.GLSLVersion >= 120 &&
> +       ctx->Const.MaxClipPlanes >= 8 &&
> +       ctx->Const.NativeIntegers &&
> +       ctx->Const.NativeIntegerResources &&
> +       ctx->Const.ShadowCubeSamplers &&
> +       ctx->Extensions.ARB_shader_texture_lod &&
> +       ctx->Extensions.EXT_texture_array) {
> +      ctx->Const.GLSLVersion = 130;
> +   }
> +
> +   if (ctx->Const.GLSLVersion >= 130 &&
> +       ctx->Extensions.ARB_draw_instanced &&
> +       ctx->Extensions.ARB_texture_buffer_object &&
> +       ctx->Extensions.ARB_uniform_buffer_object &&
> +       ctx->Extensions.NV_texture_rectangle) {
> +      ctx->Const.GLSLVersion = 140;
> +   }
> +
> +   /* And we could go on...  */
> +
> +   override_glsl_version(ctx);
> +}
> +
>  /**
>  * Examine enabled GL extensions to determine GL version.
>  * Return major and minor version numbers.

This comment is out of date.  We don't actually return the version
numbers.  We set the ctx->VersionMajor/Minor and VersionString fields.


>  */
>  static void
> -compute_version(struct gl_context *ctx)
> +compute_version_opengl(struct gl_context *ctx)
>  {
>    GLuint major, minor;
>    static const int max = 100;
> @@ -298,15 +331,15 @@ compute_version_es2(struct gl_context *ctx)
>  * This should only be called once as part of context initialization
>  * or to perform version check for GLX_ARB_create_context_profile.
>  */
> -void
> -_mesa_compute_version(struct gl_context *ctx)
> +static void
> +compute_version(struct gl_context *ctx)
>  {
>    if (ctx->VersionMajor)
>       return;
>
>    switch (ctx->API) {
>    case API_OPENGL:
> -      compute_version(ctx);
> +      compute_version_opengl(ctx);
>       break;
>    case API_OPENGLES:
>       compute_version_es1(ctx);
> @@ -315,5 +348,36 @@ _mesa_compute_version(struct gl_context *ctx)
>       compute_version_es2(ctx);
>       break;
>    }
> +}
>
> +static void
> +compute_glsl_version(struct gl_context *ctx)
> +{
> +   switch (ctx->API) {
> +   case API_OPENGL:
> +      compute_glsl_version_opengl(ctx);
> +      break;
> +   case API_OPENGLES:
> +      ctx->Const.GLSLVersion = 0; /* GLSL not supported */
> +      break;
> +   case API_OPENGLES2:
> +      ctx->Const.GLSLVersion = 100;
> +      break;
> +   }
> +}
> +
> +void
> +_mesa_validate_feature_support(struct gl_context *ctx)
> +{
> +   compute_glsl_version(ctx);
> +   compute_version(ctx);
> +
> +   /* XXX disable the extensions which do not meet requirements of their
> +    * specifications. */
> +
> +   /* Extensions that depend on the versions *only*:
> +    */
> +   if (ctx->Const.GLSLVersion >= 130) {
> +      ctx->Extensions.ARB_conservative_depth = GL_TRUE;
> +   }
>  }
> diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h
> index 8723c1f..dbf9cd3 100644
> --- a/src/mesa/main/version.h
> +++ b/src/mesa/main/version.h
> @@ -43,9 +43,6 @@ struct gl_context;
>
>
>  extern void
> -_mesa_compute_version(struct gl_context *ctx);
> -
> -extern void
> -_mesa_override_glsl_version(struct gl_context *ctx);
> +_mesa_validate_feature_support(struct gl_context *ctx);
>
>  #endif /* VERSION_H */
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 6c8a491..9e34272 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -260,9 +260,6 @@ void st_init_extensions(struct st_context *st)
>    struct gl_context *ctx = st->ctx;
>    int i;
>
> -   ctx->Const.GLSLVersion = 120;
> -   _mesa_override_glsl_version(st->ctx);
> -
>    /*
>     * Extensions that are supported by all Gallium drivers:
>     */
> @@ -584,16 +581,15 @@ void st_init_extensions(struct st_context *st)
>        screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
>                                 PIPE_SHADER_CAP_INTEGERS)) {
>       ctx->Const.NativeIntegers = GL_TRUE;
> -   }
>
> -   if (ctx->Const.NativeIntegers)
> -      ctx->Const.GLSLVersion = 130;
> -
> -   /* Extensions that only depend on the GLSL version:
> -    */
> -   if (ctx->Const.GLSLVersion >= 130) {
> -      ctx->Extensions.ARB_conservative_depth = GL_TRUE;
> +      /* XXX maybe add caps for these. */
>       ctx->Const.MaxClipPlanes = 8;
> +      ctx->Const.ShadowCubeSamplers = GL_TRUE;
> +
> +      /* These extensions require native integers: */
> +      if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
> +         ctx->Extensions.ARB_shader_stencil_export = GL_TRUE;
> +      }
>    }
>
>    ctx->Extensions.NV_primitive_restart = GL_TRUE;
> @@ -634,10 +630,6 @@ void st_init_extensions(struct st_context *st)
>       ctx->Extensions.ARB_color_buffer_float = GL_TRUE;
>    }
>
> -   if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
> -      ctx->Extensions.ARB_shader_stencil_export = GL_TRUE;
> -   }
> -
>    if (screen->get_param(screen, PIPE_CAP_TGSI_INSTANCEID)) {
>       ctx->Extensions.ARB_draw_instanced = GL_TRUE;
>    }
> @@ -713,11 +705,17 @@ void st_init_extensions(struct st_context *st)
>       }
>    }
>
> -   if (ctx->Const.NativeIntegers &&
> -       screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_UINT, PIPE_TEXTURE_2D, 0,
> -                                   PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET) &&
> -       screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SINT, PIPE_TEXTURE_2D, 0,
> -                                   PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET))
> +   if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_UINT,
> +                                   PIPE_TEXTURE_2D, 0,
> +                                   PIPE_BIND_VERTEX_BUFFER |
> +                                   PIPE_BIND_SAMPLER_VIEW |
> +                                   PIPE_BIND_RENDER_TARGET) &&
> +       screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SINT,
> +                                   PIPE_TEXTURE_2D, 0,
> +                                   PIPE_BIND_VERTEX_BUFFER |
> +                                   PIPE_BIND_SAMPLER_VIEW |
> +                                   PIPE_BIND_RENDER_TARGET)) {
> +      ctx->Const.NativeIntegerResources = GL_TRUE;
>       ctx->Extensions.EXT_texture_integer = GL_TRUE;
> -
> +   }
>  }
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index 63920a3..82612b1 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -644,7 +644,7 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
>
>    /* need to perform version check */
>    if (attribs->major > 1 || attribs->minor > 0) {
> -      _mesa_compute_version(st->ctx);
> +      _mesa_validate_feature_support(st->ctx);
>
>       /* Is the actual version less than the requested version?  Mesa can't
>        * yet enforce the added restrictions of a forward-looking context, so

Looks good to me but the GLSL guys might want to double-check too.

Reviewed-by: Brian Paul <brianp at vmware.com>

-Brian


More information about the mesa-dev mailing list