[Mesa-dev] [PATCH 03/12] st/mesa: make st_init_extensions context-independent

Marek Olšák maraeo at gmail.com
Sun Aug 3 09:28:04 PDT 2014


On Sun, Aug 3, 2014 at 6:06 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Sun, Aug 3, 2014 at 11:18 AM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> Setting Const.MaxSamples needed a rework, so that it doesn't call
>> st_choose_format, which depends on st_context.
>>
>> Other than that, there is no change in functionality.
>> ---
>>  src/mesa/state_tracker/st_context.c    |  26 ++-
>>  src/mesa/state_tracker/st_extensions.c | 400 +++++++++++++++++----------------
>>  src/mesa/state_tracker/st_extensions.h |   8 +-
>>  3 files changed, 242 insertions(+), 192 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
>> index ccd19f3..5f83e52 100644
>> --- a/src/mesa/state_tracker/st_context.c
>> +++ b/src/mesa/state_tracker/st_context.c
>> @@ -201,10 +201,34 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
>>        !!(screen->get_param(screen, PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK) &
>>           (PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 |
>>            PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600));
>> +   st->has_time_elapsed =
>> +      screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED);
>>
>>     /* GL limits and extensions */
>>     st_init_limits(st);
>> -   st_init_extensions(st);
>> +   st_init_extensions(st->pipe->screen, ctx->API, &ctx->Const,
>> +                      &ctx->Extensions, &st->options, ctx->Mesa_DXTn);
>> +
>> +   /* Enable shader-based fallbacks for ARB_color_buffer_float if needed. */
>> +   if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) {
>> +      if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) {
>> +         st->clamp_vert_color_in_shader = TRUE;
>> +      }
>> +
>> +      if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) {
>> +         st->clamp_frag_color_in_shader = TRUE;
>> +      }
>> +
>> +      /* For drivers which cannot do color clamping, it's better to just
>> +       * disable ARB_color_buffer_float in the core profile, because
>> +       * the clamping is deprecated there anyway. */
>> +      if (ctx->API == API_OPENGL_CORE &&
>> +          (st->clamp_frag_color_in_shader || st->clamp_vert_color_in_shader)) {
>> +         st->clamp_vert_color_in_shader = GL_FALSE;
>> +         st->clamp_frag_color_in_shader = GL_FALSE;
>
> I know it was like that in the original code, but you should either
> use TRUE/FALSE or GL_TRUE/GL_FALSE in both places... the fields are
> declared as GLbooleans ftr.

Okay, consider it fixed.

>
>> +         ctx->Extensions.ARB_color_buffer_float = GL_FALSE;
>> +      }
>> +   }
>>
>>     _mesa_compute_version(ctx);
>>
>> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
>> index f04ff4c..6901b51 100644
>> --- a/src/mesa/state_tracker/st_extensions.c
>> +++ b/src/mesa/state_tracker/st_extensions.c
>> @@ -340,14 +340,15 @@ struct st_extension_format_mapping {
>>   *
>>   * target and bind_flags are passed to is_format_supported.
>>   */
>> -static void init_format_extensions(struct st_context *st,
>> -                           const struct st_extension_format_mapping *mapping,
>> -                           unsigned num_mappings,
>> -                           enum pipe_texture_target target,
>> -                           unsigned bind_flags)
>> +static void
>> +init_format_extensions(struct pipe_screen *screen,
>> +                       struct gl_extensions *extensions,
>> +                       const struct st_extension_format_mapping *mapping,
>> +                       unsigned num_mappings,
>> +                       enum pipe_texture_target target,
>> +                       unsigned bind_flags)
>>  {
>> -   struct pipe_screen *screen = st->pipe->screen;
>> -   GLboolean *extensions = (GLboolean *) &st->ctx->Extensions;
>> +   GLboolean *extension_table = (GLboolean *) extensions;
>>     unsigned i;
>>     int j;
>>     int num_formats = Elements(mapping->format);
>> @@ -371,10 +372,36 @@ static void init_format_extensions(struct st_context *st,
>>
>>        /* Enable all extensions in the list. */
>>        for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++)
>> -         extensions[mapping[i].extension_offset[j]] = GL_TRUE;
>> +         extension_table[mapping[i].extension_offset[j]] = GL_TRUE;
>> +   }
>> +}
>> +
>> +
>> +/**
>> + * Given a list of formats and bind flags, return the maximum number
>> + * of samples supported by any of those formats.
>> + */
>> +static unsigned
>> +get_max_samples_for_formats(struct pipe_screen *screen,
>> +                            unsigned num_formats,
>> +                            enum pipe_format *formats,
>> +                            unsigned max_samples,
>> +                            unsigned bind)
>> +{
>> +   unsigned i, f;
>> +
>> +   for (i = max_samples; i > 0; --i) {
>> +      for (f = 0; f < num_formats; f++) {
>> +         if (screen->is_format_supported(screen, formats[f],
>> +                                         PIPE_TEXTURE_2D, i, bind)) {
>> +            return i;
>> +         }
>> +      }
>>     }
>> +   return 0;
>>  }
>>
>> +
>>  /**
>>   * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
>>   * which GL extensions are supported.
>> @@ -382,12 +409,15 @@ static void init_format_extensions(struct st_context *st,
>>   * features or can be built on top of other gallium features.
>>   * Some fine tuning may still be needed.
>>   */
>> -void st_init_extensions(struct st_context *st)
>> +void st_init_extensions(struct pipe_screen *screen,
>> +                        gl_api api,
>> +                        struct gl_constants *consts,
>> +                        struct gl_extensions *extensions,
>> +                        struct st_config_options *options,
>> +                        boolean has_lib_dxtc)
>>  {
>> -   struct pipe_screen *screen = st->pipe->screen;
>> -   struct gl_context *ctx = st->ctx;
>>     int i, glsl_feature_level;
>> -   GLboolean *extensions = (GLboolean *) &ctx->Extensions;
>> +   GLboolean *extension_table = (GLboolean *) extensions;
>>
>>     static const struct st_extension_cap_mapping cap_mapping[] = {
>>        { o(ARB_base_instance),                PIPE_CAP_START_INSTANCE                   },
>
> [...]
>
>>     /* ARB_color_buffer_float. */
>>     if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) {
>> -      ctx->Extensions.ARB_color_buffer_float = GL_TRUE;
>> -
>> -      if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) {
>> -         st->clamp_vert_color_in_shader = TRUE;
>> -      }
>> -
>> -      if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) {
>> -         st->clamp_frag_color_in_shader = TRUE;
>> -      }
>> -
>> -      /* For drivers which cannot do color clamping, it's better to just
>> -       * disable ARB_color_buffer_float in the core profile, because
>> -       * the clamping is deprecated there anyway. */
>> -      if (ctx->API == API_OPENGL_CORE &&
>> -          (st->clamp_frag_color_in_shader || st->clamp_vert_color_in_shader)) {
>> -         st->clamp_vert_color_in_shader = GL_FALSE;
>> -         st->clamp_frag_color_in_shader = GL_FALSE;
>> -         ctx->Extensions.ARB_color_buffer_float = GL_FALSE;
>> -      }
>> +      extensions->ARB_color_buffer_float = GL_TRUE;
>
> This should just go into the big table then, right?

Yes, but not in this patch. Maybe in a later patch as a cleanup.

>
>>     }
>>
>>     if (screen->fence_finish) {
>> -      ctx->Extensions.ARB_sync = GL_TRUE;
>> +      extensions->ARB_sync = GL_TRUE;
>>     }
>>
>>     /* Maximum sample count. */
>> -   for (i = 16; i > 0; --i) {
>> -      enum pipe_format pformat = st_choose_format(st, GL_RGBA,
>> -                                                  GL_NONE, GL_NONE,
>> -                                                  PIPE_TEXTURE_2D, i,
>> -                                                  PIPE_BIND_RENDER_TARGET, FALSE);
>> -      if (pformat != PIPE_FORMAT_NONE) {
>> -         ctx->Const.MaxSamples = i;
>> -         ctx->Const.MaxColorTextureSamples = i;
>> -         break;
>> -      }
>> +   {
>> +      enum pipe_format color_formats[] = {
>> +         PIPE_FORMAT_R8G8B8A8_UNORM,
>> +         PIPE_FORMAT_B8G8R8A8_UNORM,
>> +         PIPE_FORMAT_A8R8G8B8_UNORM,
>> +         PIPE_FORMAT_A8B8G8R8_UNORM,
>> +      };
>> +      enum pipe_format depth_formats[] = {
>> +         PIPE_FORMAT_Z16_UNORM,
>> +         PIPE_FORMAT_Z24X8_UNORM,
>> +         PIPE_FORMAT_X8Z24_UNORM,
>> +         PIPE_FORMAT_Z32_UNORM,
>> +         PIPE_FORMAT_Z32_FLOAT
>> +      };
>> +      enum pipe_format int_formats[] = {
>> +         PIPE_FORMAT_R32G32B32A32_UINT,
>> +         PIPE_FORMAT_R32G32B32A32_SINT,
>
> Uhm... should this be R8G8B8A8 instead? At least that's what's in the
> format_map in st_format.c for GL_RGBA_INTEGER_EXT. (And it doesn't
> include the UINT variant...)

It doesn't matter which formats are tested as long as at least one
format in the list is supported for MSAA texturing. I assume all
drivers that support MSAA integer texturing support it with all
integer formats. R32G32B32A32 seemed like a safe choice.

Marek


More information about the mesa-dev mailing list