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

Ian Romanick idr at freedesktop.org
Mon Jan 23 13:35:06 PST 2012


On 01/23/2012 05:54 AM, Brian Paul wrote:
> 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;

Here's the problem with cap bits in general.  On GEN4 through GEN5 we 
support native integer resources and shadow cube samplers.  We don't 
support 1.30 on those platforms because of clip distance and the new 
interpolation qualifiers.  If the other capabilities aren't used for 
other things internally (allowing meta ops to use different paths, 
etc.), I don't see any utility having a big pile of bits whose only 
purpose is to enable one feature.

>> +   }
>>
>>     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;

GLSL 1.20 also requires centroid sampling.  I assume that all the 
Gallium drivers that support MSAA have this, but it's worth mentioning.

>> +   }
>> +
>> +   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
> _______________________________________________
> 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