[Mesa-dev] [PATCH 6/8] st/mesa: pass storage_sample_count parameter into st_choose_format

Marek Olšák maraeo at gmail.com
Wed Aug 1 23:26:02 UTC 2018


From: Marek Olšák <marek.olsak at amd.com>

---
 src/mesa/state_tracker/st_cb_drawpixels.c | 14 ++++++-------
 src/mesa/state_tracker/st_cb_fbo.c        |  6 +++---
 src/mesa/state_tracker/st_cb_texture.c    |  2 +-
 src/mesa/state_tracker/st_format.c        | 24 ++++++++++++++---------
 src/mesa/state_tracker/st_format.h        |  4 +++-
 src/mesa/state_tracker/st_texture.c       |  2 +-
 6 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 5a331f841de..b8895684bc2 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -528,21 +528,21 @@ make_texture(struct st_context *st,
     * image to draw.
     */
    pipeFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
                                           format, type, unpack->SwapBytes);
 
    if (pipeFormat == PIPE_FORMAT_NONE) {
       /* Use the generic approach. */
       GLenum intFormat = internal_format(ctx, format, type);
 
       pipeFormat = st_choose_format(st, intFormat, format, type,
-                                    st->internal_target, 0,
+                                    st->internal_target, 0, 0,
                                     PIPE_BIND_SAMPLER_VIEW, FALSE);
       assert(pipeFormat != PIPE_FORMAT_NONE);
    }
 
    mformat = st_pipe_format_to_mesa_format(pipeFormat);
    baseInternalFormat = _mesa_get_format_base_format(mformat);
 
    pixels = _mesa_map_pbo_source(ctx, unpack, pixels);
    if (!pixels)
       return NULL;
@@ -1577,49 +1577,49 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
    /* Choose the format for the temporary texture. */
    srcFormat = rbRead->texture->format;
    srcBind = PIPE_BIND_SAMPLER_VIEW |
       (type == GL_COLOR ? PIPE_BIND_RENDER_TARGET : PIPE_BIND_DEPTH_STENCIL);
 
    if (!screen->is_format_supported(screen, srcFormat, st->internal_target, 0,
                                     0, srcBind)) {
       /* srcFormat is non-renderable. Find a compatible renderable format. */
       if (type == GL_DEPTH) {
          srcFormat = st_choose_format(st, GL_DEPTH_COMPONENT, GL_NONE,
-                                      GL_NONE, st->internal_target, 0,
+                                      GL_NONE, st->internal_target, 0, 0,
                                       srcBind, FALSE);
       }
       else {
          assert(type == GL_COLOR);
 
          if (util_format_is_float(srcFormat)) {
             srcFormat = st_choose_format(st, GL_RGBA32F, GL_NONE,
-                                         GL_NONE, st->internal_target, 0,
+                                         GL_NONE, st->internal_target, 0, 0,
                                          srcBind, FALSE);
          }
          else if (util_format_is_pure_sint(srcFormat)) {
             srcFormat = st_choose_format(st, GL_RGBA32I, GL_NONE,
-                                         GL_NONE, st->internal_target, 0,
+                                         GL_NONE, st->internal_target, 0, 0,
                                          srcBind, FALSE);
          }
          else if (util_format_is_pure_uint(srcFormat)) {
             srcFormat = st_choose_format(st, GL_RGBA32UI, GL_NONE,
-                                         GL_NONE, st->internal_target, 0,
+                                         GL_NONE, st->internal_target, 0, 0,
                                          srcBind, FALSE);
          }
          else if (util_format_is_snorm(srcFormat)) {
             srcFormat = st_choose_format(st, GL_RGBA16_SNORM, GL_NONE,
-                                         GL_NONE, st->internal_target, 0,
+                                         GL_NONE, st->internal_target, 0, 0,
                                          srcBind, FALSE);
          }
          else {
             srcFormat = st_choose_format(st, GL_RGBA, GL_NONE,
-                                         GL_NONE, st->internal_target, 0,
+                                         GL_NONE, st->internal_target, 0, 0,
                                          srcBind, FALSE);
          }
       }
 
       if (srcFormat == PIPE_FORMAT_NONE) {
          assert(0 && "cannot choose a format for src of CopyPixels");
          return;
       }
    }
 
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 2bb910fcecd..811451656ca 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -76,21 +76,21 @@ st_renderbuffer_alloc_sw_storage(struct gl_context * ctx,
 
    if (internalFormat == GL_RGBA16_SNORM) {
       /* Special case for software accum buffers.  Otherwise, if the
        * call to st_choose_renderbuffer_format() fails (because the
        * driver doesn't support signed 16-bit/channel colors) we'd
        * just return without allocating the software accum buffer.
        */
       format = PIPE_FORMAT_R16G16B16A16_SNORM;
    }
    else {
-      format = st_choose_renderbuffer_format(st, internalFormat, 0);
+      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
 
       /* Not setting gl_renderbuffer::Format here will cause
        * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
        */
       if (format == PIPE_FORMAT_NONE) {
          return GL_TRUE;
       }
    }
 
    strb->Base.Format = st_pipe_format_to_mesa_format(format);
@@ -162,30 +162,30 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
       unsigned start, i;
 
       if (ctx->Const.MaxSamples > 1 &&  rb->NumSamples == 1) {
          /* don't try num_samples = 1 with drivers that support real msaa */
          start = 2;
       } else {
          start = rb->NumSamples;
       }
 
       for (i = start; i <= ctx->Const.MaxSamples; i++) {
-         format = st_choose_renderbuffer_format(st, internalFormat, i);
+         format = st_choose_renderbuffer_format(st, internalFormat, i, i);
 
          if (format != PIPE_FORMAT_NONE) {
             rb->NumSamples = i;
             rb->NumStorageSamples = i;
             break;
          }
       }
    } else {
-      format = st_choose_renderbuffer_format(st, internalFormat, 0);
+      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
    }
 
    /* Not setting gl_renderbuffer::Format here will cause
     * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
     */
    if (format == PIPE_FORMAT_NONE) {
       return GL_TRUE;
    }
 
    strb->Base.Format = st_pipe_format_to_mesa_format(format);
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 93b6b32b7e2..5406d0247c5 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -2036,21 +2036,21 @@ st_GetTexSubImage(struct gl_context * ctx,
                                           pipe_target, 0, 0, bind))
             goto fallback;
          dst_glformat = GL_RG16_SNORM;
          break;
       default:
          assert(0);
          goto fallback;
       }
 
       dst_format = st_choose_format(st, dst_glformat, format, type,
-                                    pipe_target, 0, bind, FALSE);
+                                    pipe_target, 0, 0, bind, FALSE);
 
       if (dst_format == PIPE_FORMAT_NONE) {
          /* unable to get an rgba format!?! */
          goto fallback;
       }
    }
 
    /* create the destination texture of size (width X height X depth) */
    memset(&dst_templ, 0, sizeof(dst_templ));
    dst_templ.target = pipe_target;
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index c2535e85324..16a18c272dc 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -2046,27 +2046,29 @@ static const struct format_mapping format_map[] = {
 
 /**
  * Return first supported format from the given list.
  * \param allow_dxt  indicates whether it's OK to return a DXT format.
  */
 static enum pipe_format
 find_supported_format(struct pipe_screen *screen,
                       const enum pipe_format formats[],
                       enum pipe_texture_target target,
                       unsigned sample_count,
+                      unsigned storage_sample_count,
                       unsigned bindings,
                       boolean allow_dxt)
 {
    uint i;
    for (i = 0; formats[i]; i++) {
       if (screen->is_format_supported(screen, formats[i], target,
-                                      sample_count, sample_count, bindings)) {
+                                      sample_count, storage_sample_count,
+                                      bindings)) {
          if (!allow_dxt && util_format_is_s3tc(formats[i])) {
             /* we can't return a dxt format, continue searching */
             continue;
          }
 
          return formats[i];
       }
    }
    return PIPE_FORMAT_NONE;
 }
@@ -2157,20 +2159,21 @@ find_exact_format(GLint internalFormat, GLenum format, GLenum type)
  * \param bindings  bitmask of PIPE_BIND_x flags.
  * \param allow_dxt  indicates whether it's OK to return a DXT format.  This
  *                   only matters when internalFormat names a generic or
  *                   specific compressed format.  And that should only happen
  *                   when we're getting called from gl[Copy]TexImage().
  */
 enum pipe_format
 st_choose_format(struct st_context *st, GLenum internalFormat,
                  GLenum format, GLenum type,
                  enum pipe_texture_target target, unsigned sample_count,
+                 unsigned storage_sample_count,
                  unsigned bindings, boolean allow_dxt)
 {
    struct pipe_screen *screen = st->pipe->screen;
    unsigned i;
    int j;
    enum pipe_format pf;
 
 #ifdef DEBUG
    {
       static boolean firstCall = TRUE;
@@ -2186,21 +2189,21 @@ st_choose_format(struct st_context *st, GLenum internalFormat,
    /* can't render to compressed formats at this time */
    if (_mesa_is_compressed_format(st->ctx, internalFormat)
        && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
       return PIPE_FORMAT_NONE;
    }
 
    /* search for exact matches */
    pf = find_exact_format(internalFormat, format, type);
    if (pf != PIPE_FORMAT_NONE &&
        screen->is_format_supported(screen, pf, target, sample_count,
-                                   sample_count, bindings)) {
+                                   storage_sample_count, bindings)) {
       goto success;
    }
 
    /* For an unsized GL_RGB but a 2_10_10_10 type, try to pick one of the
     * 2_10_10_10 formats.  This is important for
     * GL_EXT_texture_type_2_10_10_10_EXT support, which says that these
     * formats are not color-renderable.  Mesa's check for making those
     * non-color-renderable is based on our chosen format being 2101010.
     */
    if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
@@ -2212,21 +2215,22 @@ st_choose_format(struct st_context *st, GLenum internalFormat,
 
    /* search table for internalFormat */
    for (i = 0; i < ARRAY_SIZE(format_map); i++) {
       const struct format_mapping *mapping = &format_map[i];
       for (j = 0; mapping->glFormats[j]; j++) {
          if (mapping->glFormats[j] == internalFormat) {
             /* Found the desired internal format.  Find first pipe format
              * which is supported by the driver.
              */
             pf = find_supported_format(screen, mapping->pipeFormats,
-                                       target, sample_count, bindings,
+                                       target, sample_count,
+                                       storage_sample_count, bindings,
                                        allow_dxt);
             goto success;
          }
       }
    }
 
    _mesa_problem(NULL, "unhandled format!\n");
    return PIPE_FORMAT_NONE;
 
 success:
@@ -2240,29 +2244,31 @@ success:
    }
    return pf;
 }
 
 
 /**
  * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
  */
 enum pipe_format
 st_choose_renderbuffer_format(struct st_context *st,
-                              GLenum internalFormat, unsigned sample_count)
+                              GLenum internalFormat, unsigned sample_count,
+                              unsigned storage_sample_count)
 {
    unsigned bindings;
    if (_mesa_is_depth_or_stencil_format(internalFormat))
       bindings = PIPE_BIND_DEPTH_STENCIL;
    else
       bindings = PIPE_BIND_RENDER_TARGET;
    return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
-                           PIPE_TEXTURE_2D, sample_count, bindings, FALSE);
+                           PIPE_TEXTURE_2D, sample_count,
+                           storage_sample_count, bindings, FALSE);
 }
 
 
 /**
  * Given an OpenGL user-requested format and type, and swapBytes state,
  * return the format which exactly matches those parameters, so that
  * a memcpy-based transfer can be done.
  *
  * If no format is supported, return PIPE_FORMAT_NONE.
  */
@@ -2380,26 +2386,26 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
             pFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
                                                 format, type,
                                                 ctx->Unpack.SwapBytes);
             if (pFormat != PIPE_FORMAT_NONE)
                return st_pipe_format_to_mesa_format(pFormat);
          }
       }
    }
 
    pFormat = st_choose_format(st, internalFormat, format, type,
-                              pTarget, 0, bindings, GL_TRUE);
+                              pTarget, 0, 0, bindings, GL_TRUE);
 
    if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) {
       /* try choosing format again, this time without render target bindings */
       pFormat = st_choose_format(st, internalFormat, format, type,
-                                 pTarget, 0, PIPE_BIND_SAMPLER_VIEW,
+                                 pTarget, 0, 0, PIPE_BIND_SAMPLER_VIEW,
                                  GL_TRUE);
    }
 
    if (pFormat == PIPE_FORMAT_NONE) {
       mFormat = _mesa_glenum_to_compressed_format(internalFormat);
       if (st_compressed_format_fallback(st, mFormat))
           return mFormat;
 
       /* no luck at all */
       return MESA_FORMAT_NONE;
@@ -2443,21 +2449,21 @@ st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
    /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
     * formats.
     */
    if (!ctx->Extensions.EXT_framebuffer_sRGB) {
       internalFormat = _mesa_get_linear_internalformat(internalFormat);
    }
 
    /* Set sample counts in descending order. */
    for (i = 16; i > 1; i--) {
       format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
-                                PIPE_TEXTURE_2D, i, bind, FALSE);
+                                PIPE_TEXTURE_2D, i, i, bind, FALSE);
 
       if (format != PIPE_FORMAT_NONE) {
          samples[num_sample_counts++] = i;
       }
    }
 
    if (!num_sample_counts) {
       samples[num_sample_counts++] = 1;
    }
 
@@ -2502,21 +2508,21 @@ st_QueryInternalFormat(struct gl_context *ctx, GLenum target,
        */
       unsigned bindings;
       if (_mesa_is_depth_or_stencil_format(internalFormat))
          bindings = PIPE_BIND_DEPTH_STENCIL;
       else
          bindings = PIPE_BIND_RENDER_TARGET;
       enum pipe_format pformat = st_choose_format(st,
                                                   internalFormat,
                                                   GL_NONE,
                                                   GL_NONE,
-                                                  PIPE_TEXTURE_2D, 1,
+                                                  PIPE_TEXTURE_2D, 0, 0,
                                                   bindings, FALSE);
       if (pformat)
          params[0] = internalFormat;
       break;
    }
    default:
       /* For the rest of the pnames, we call back the Mesa's default
        * function for drivers that don't implement ARB_internalformat_query2.
        */
       _mesa_query_internal_format_default(ctx, target, internalFormat, pname,
diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
index 466b5d073fc..036d3378286 100644
--- a/src/mesa/state_tracker/st_format.h
+++ b/src/mesa/state_tracker/st_format.h
@@ -47,25 +47,27 @@ extern enum pipe_format
 st_mesa_format_to_pipe_format(const struct st_context *st, mesa_format mesaFormat);
 
 extern mesa_format
 st_pipe_format_to_mesa_format(enum pipe_format pipeFormat);
 
 
 extern enum pipe_format
 st_choose_format(struct st_context *st, GLenum internalFormat,
                  GLenum format, GLenum type,
                  enum pipe_texture_target target, unsigned sample_count,
+                 unsigned storage_sample_count,
                  unsigned bindings, boolean allow_dxt);
 
 extern enum pipe_format
 st_choose_renderbuffer_format(struct st_context *st,
-                              GLenum internalFormat, unsigned sample_count);
+                              GLenum internalFormat, unsigned sample_count,
+                              unsigned storage_sample_count);
 
 extern enum pipe_format
 st_choose_matching_format(struct st_context *st, unsigned bind,
 			  GLenum format, GLenum type, GLboolean swapBytes);
 
 extern mesa_format
 st_ChooseTextureFormat(struct gl_context * ctx, GLenum target,
                        GLint internalFormat,
                        GLenum format, GLenum type);
 
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index 5da98bd338f..9655eede5fe 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -408,21 +408,21 @@ st_texture_image_copy(struct pipe_context *pipe,
 struct pipe_resource *
 st_create_color_map_texture(struct gl_context *ctx)
 {
    struct st_context *st = st_context(ctx);
    struct pipe_resource *pt;
    enum pipe_format format;
    const uint texSize = 256; /* simple, and usually perfect */
 
    /* find an RGBA texture format */
    format = st_choose_format(st, GL_RGBA, GL_NONE, GL_NONE,
-                             PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW,
+                             PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW,
                              FALSE);
 
    /* create texture for color map/table */
    pt = st_texture_create(st, PIPE_TEXTURE_2D, format, 0,
                           texSize, texSize, 1, 1, 0, PIPE_BIND_SAMPLER_VIEW);
    return pt;
 }
 
 
 /**
-- 
2.17.1



More information about the mesa-dev mailing list