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

Ilia Mirkin imirkin at alum.mit.edu
Sun Aug 3 09:06:33 PDT 2014


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.

> +         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?

>     }
>
>     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...)

> +      };
> +
> +      consts->MaxSamples =
> +         get_max_samples_for_formats(screen, Elements(color_formats),
> +                                     color_formats, 16,
> +                                     PIPE_BIND_RENDER_TARGET);
> +
> +      consts->MaxColorTextureSamples =
> +         get_max_samples_for_formats(screen, Elements(color_formats),
> +                                     color_formats, consts->MaxSamples,
> +                                     PIPE_BIND_SAMPLER_VIEW);
> +
> +      consts->MaxDepthTextureSamples =
> +         get_max_samples_for_formats(screen, Elements(depth_formats),
> +                                     depth_formats, consts->MaxSamples,
> +                                     PIPE_BIND_SAMPLER_VIEW);
> +
> +      consts->MaxIntegerSamples =
> +         get_max_samples_for_formats(screen, Elements(int_formats),
> +                                     int_formats, consts->MaxSamples,
> +                                     PIPE_BIND_SAMPLER_VIEW);
>     }
> -   for (i = ctx->Const.MaxSamples; i > 0; --i) {
> -      enum pipe_format pformat = st_choose_format(st, GL_DEPTH_STENCIL,
> -                                                  GL_NONE, GL_NONE,
> -                                                  PIPE_TEXTURE_2D, i,
> -                                                  PIPE_BIND_DEPTH_STENCIL, FALSE);
> -      if (pformat != PIPE_FORMAT_NONE) {
> -         ctx->Const.MaxDepthTextureSamples = i;
> -         break;
> -      }
> -   }
> -   for (i = ctx->Const.MaxSamples; i > 0; --i) {
> -      enum pipe_format pformat = st_choose_format(st, GL_RGBA_INTEGER,
> -                                                  GL_NONE, GL_NONE,
> -                                                  PIPE_TEXTURE_2D, i,
> -                                                  PIPE_BIND_RENDER_TARGET, FALSE);
> -      if (pformat != PIPE_FORMAT_NONE) {
> -         ctx->Const.MaxIntegerSamples = i;
> -         break;
> -      }
> -   }


More information about the mesa-dev mailing list