Mesa (master): mesa: add tracking of reduction mode

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Mar 12 00:31:23 UTC 2021


Module: Mesa
Branch: master
Commit: 6384dcaf7ce91df8936f798e86caa6810b0a2607
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6384dcaf7ce91df8936f798e86caa6810b0a2607

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Tue Mar  9 15:34:22 2021 -0500

mesa: add tracking of reduction mode

This is used to expose ARB/EXT_texture_filter_minmax. Note that only the
EXT_* enable is provided since the ARB one would require proper handling
of some formats not being supported. For now this is force-enabled for
everything.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9487>

---

 src/mesa/main/extensions_table.h |  2 ++
 src/mesa/main/formatquery.c      | 18 +++++++++++++
 src/mesa/main/glthread_marshal.h |  1 +
 src/mesa/main/mtypes.h           |  2 ++
 src/mesa/main/samplerobj.c       | 57 ++++++++++++++++++++++++++++++++++++++++
 src/mesa/main/texobj.c           |  1 +
 src/mesa/main/texobj.h           |  4 +++
 src/mesa/main/texparam.c         | 31 ++++++++++++++++++++++
 8 files changed, 116 insertions(+)

diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 896f2ff63e0..45b4bda48ea 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -161,6 +161,7 @@ EXT(ARB_texture_env_combine                 , ARB_texture_env_combine
 EXT(ARB_texture_env_crossbar                , ARB_texture_env_crossbar               , GLL,  x ,  x ,  x , 2001)
 EXT(ARB_texture_env_dot3                    , ARB_texture_env_dot3                   , GLL,  x ,  x ,  x , 2001)
 EXT(ARB_texture_filter_anisotropic          , ARB_texture_filter_anisotropic         , GLL, GLC,  x ,  x , 2017)
+EXT(ARB_texture_filter_minmax               , EXT_texture_filter_minmax              , GLL, GLC,  x ,  x , 2015)
 EXT(ARB_texture_float                       , ARB_texture_float                      , GLL, GLC,  x ,  x , 2004)
 EXT(ARB_texture_gather                      , ARB_texture_gather                     , GLL, GLC,  x ,  x , 2009)
 EXT(ARB_texture_mirror_clamp_to_edge        , ARB_texture_mirror_clamp_to_edge       , GLL, GLC,  x ,  x , 2013)
@@ -312,6 +313,7 @@ EXT(EXT_texture_env_add                     , dummy_true
 EXT(EXT_texture_env_combine                 , dummy_true                             , GLL,  x ,  x ,  x , 2000)
 EXT(EXT_texture_env_dot3                    , EXT_texture_env_dot3                   , GLL,  x ,  x ,  x , 2000)
 EXT(EXT_texture_filter_anisotropic          , EXT_texture_filter_anisotropic         , GLL, GLC, ES1, ES2, 1999)
+EXT(EXT_texture_filter_minmax               , EXT_texture_filter_minmax              , GLL, GLC,  x ,  30, 2015)
 EXT(EXT_texture_format_BGRA8888             , dummy_true                             ,  x ,  x , ES1, ES2, 2005)
 EXT(EXT_texture_integer                     , EXT_texture_integer                    , GLL, GLC,  x ,  x , 2006)
 EXT(EXT_texture_lod_bias                    , dummy_true                             , GLL,  x , ES1,  x , 1999)
diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index d1a74fb0d22..19f13aae4bf 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -131,6 +131,15 @@ _legal_parameters(struct gl_context *ctx, GLenum target, GLenum internalformat,
    case GL_NUM_SAMPLE_COUNTS:
       break;
 
+   case GL_TEXTURE_REDUCTION_MODE_ARB:
+      if (!_mesa_has_ARB_texture_filter_minmax(ctx)) {
+         _mesa_error(ctx, GL_INVALID_ENUM,
+                     "glGetInternalformativ(pname=%s)",
+                     _mesa_enum_to_string(pname));
+         return false;
+      }
+      break;
+
    case GL_SRGB_DECODE_ARB:
       /* The ARB_internalformat_query2 spec says:
        *
@@ -375,6 +384,7 @@ _set_default_response(GLenum pname, GLint buffer[16])
    case GL_STENCIL_RENDERABLE:
    case GL_MIPMAP:
    case GL_TEXTURE_COMPRESSED:
+   case GL_TEXTURE_REDUCTION_MODE_ARB:
       buffer[0] = GL_FALSE;
       break;
 
@@ -1553,6 +1563,14 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
                                       buffer);
       break;
 
+   case GL_TEXTURE_REDUCTION_MODE_ARB:
+      /* We don't currently have a way of querying this information. A driver
+       * enabling this capability should handle all formats until this is
+       * addressed.
+       */
+      buffer[0] = (GLint)1;
+      break;
+
    default:
       unreachable("bad param");
    }
diff --git a/src/mesa/main/glthread_marshal.h b/src/mesa/main/glthread_marshal.h
index 033056bda39..c3dbebb1773 100644
--- a/src/mesa/main/glthread_marshal.h
+++ b/src/mesa/main/glthread_marshal.h
@@ -168,6 +168,7 @@ _mesa_tex_param_enum_to_count(GLenum pname)
    case GL_DEPTH_TEXTURE_MODE_ARB:
    case GL_DEPTH_STENCIL_TEXTURE_MODE:
    case GL_TEXTURE_SRGB_DECODE_EXT:
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
    case GL_TEXTURE_CUBE_MAP_SEAMLESS:
    case GL_TEXTURE_SWIZZLE_R:
    case GL_TEXTURE_SWIZZLE_G:
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index ecdf2d0de4e..58f58cea636 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -951,6 +951,7 @@ struct gl_sampler_attrib
    GLenum16 CompareMode;	/**< GL_ARB_shadow */
    GLenum16 CompareFunc;	/**< GL_ARB_shadow */
    GLboolean CubeMapSeamless;   /**< GL_AMD_seamless_cubemap_per_texture */
+   GLenum16 ReductionMode;      /**< GL_EXT_texture_filter_minmax */
 };
 
 /**
@@ -4486,6 +4487,7 @@ struct gl_extensions
    GLboolean EXT_texture_compression_s3tc_srgb;
    GLboolean EXT_texture_env_dot3;
    GLboolean EXT_texture_filter_anisotropic;
+   GLboolean EXT_texture_filter_minmax;
    GLboolean EXT_texture_integer;
    GLboolean EXT_texture_mirror_clamp;
    GLboolean EXT_texture_norm16;
diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
index 8a17fb6f14b..43f832fdab1 100644
--- a/src/mesa/main/samplerobj.c
+++ b/src/mesa/main/samplerobj.c
@@ -134,6 +134,7 @@ _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)
    sampObj->Attrib.CompareFunc = GL_LEQUAL;
    sampObj->Attrib.sRGBDecode = GL_DECODE_EXT;
    sampObj->Attrib.CubeMapSeamless = GL_FALSE;
+   sampObj->Attrib.ReductionMode = GL_WEIGHTED_AVERAGE_EXT;
    sampObj->HandleAllocated = GL_FALSE;
 
    /* GL_ARB_bindless_texture */
@@ -872,6 +873,24 @@ set_sampler_srgb_decode(struct gl_context *ctx,
    return GL_TRUE;
 }
 
+static GLuint
+set_sampler_reduction_mode(struct gl_context *ctx,
+                           struct gl_sampler_object *samp, GLenum param)
+{
+   if (!ctx->Extensions.EXT_texture_filter_minmax)
+      return INVALID_PNAME;
+
+   if (samp->Attrib.ReductionMode == param)
+      return GL_FALSE;
+
+   if (param != GL_WEIGHTED_AVERAGE_EXT && param != GL_MIN && param != GL_MAX)
+      return INVALID_PARAM;
+
+   flush(ctx);
+   samp->Attrib.ReductionMode = param;
+   return GL_TRUE;
+}
+
 static struct gl_sampler_object *
 sampler_parameter_error_check(struct gl_context *ctx, GLuint sampler,
                               bool get, const char *name)
@@ -957,6 +976,9 @@ _mesa_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, param);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, param);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       /* fall-through */
    default:
@@ -1040,6 +1062,9 @@ _mesa_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) param);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) param);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       /* fall-through */
    default:
@@ -1122,6 +1147,9 @@ _mesa_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, params[0]);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, params[0]);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       {
          GLfloat c[4];
@@ -1212,6 +1240,9 @@ _mesa_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       res = set_sampler_border_colorf(ctx, sampObj, params);
       break;
@@ -1295,6 +1326,9 @@ _mesa_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       res = set_sampler_border_colori(ctx, sampObj, params);
       break;
@@ -1379,6 +1413,9 @@ _mesa_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params)
    case GL_TEXTURE_SRGB_DECODE_EXT:
       res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
+      break;
    case GL_TEXTURE_BORDER_COLOR:
       res = set_sampler_border_colorui(ctx, sampObj, params);
       break;
@@ -1492,6 +1529,11 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
          goto invalid_pname;
       *params = (GLenum) sampObj->Attrib.sRGBDecode;
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      if (!ctx->Extensions.EXT_texture_filter_minmax)
+         goto invalid_pname;
+      *params = (GLenum) sampObj->Attrib.ReductionMode;
+      break;
    default:
       goto invalid_pname;
    }
@@ -1564,6 +1606,11 @@ _mesa_GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
          goto invalid_pname;
       *params = (GLfloat) sampObj->Attrib.sRGBDecode;
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      if (!ctx->Extensions.EXT_texture_filter_minmax)
+         goto invalid_pname;
+      *params = (GLfloat) sampObj->Attrib.ReductionMode;
+      break;
    default:
       goto invalid_pname;
    }
@@ -1636,6 +1683,11 @@ _mesa_GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
          goto invalid_pname;
       *params = (GLenum) sampObj->Attrib.sRGBDecode;
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      if (!ctx->Extensions.EXT_texture_filter_minmax)
+         goto invalid_pname;
+      *params = (GLenum) sampObj->Attrib.ReductionMode;
+      break;
    default:
       goto invalid_pname;
    }
@@ -1708,6 +1760,11 @@ _mesa_GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
          goto invalid_pname;
       *params = (GLenum) sampObj->Attrib.sRGBDecode;
       break;
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      if (!ctx->Extensions.EXT_texture_filter_minmax)
+         goto invalid_pname;
+      *params = (GLenum) sampObj->Attrib.ReductionMode;
+      break;
    default:
       goto invalid_pname;
    }
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 137ffaa3c77..4b8a1260593 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -361,6 +361,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
    obj->Attrib.Swizzle[3] = GL_ALPHA;
    obj->Attrib._Swizzle = SWIZZLE_NOOP;
    obj->Sampler.Attrib.sRGBDecode = GL_DECODE_EXT;
+   obj->Sampler.Attrib.ReductionMode = GL_WEIGHTED_AVERAGE_EXT;
    obj->BufferObjectFormat = GL_R8;
    obj->_BufferObjectFormat = MESA_FORMAT_R_UNORM8;
    obj->Attrib.ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
index 313be779ddc..22e98d9684e 100644
--- a/src/mesa/main/texobj.h
+++ b/src/mesa/main/texobj.h
@@ -141,10 +141,14 @@ _mesa_is_texture_complete(const struct gl_texture_object *texObj,
     *  – The internal format is DEPTH_STENCIL, and the value of DEPTH_-
     *    STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX.""
     */
+   /* GL_EXT_texture_filter_minmax further modifies this to explain it does
+    * not apply to MIN/MAX reduction, only WEIGHTED_AVERAGE (i.e. default)
+    */
    if (!isMultisample &&
        (texObj->_IsIntegerFormat ||
         (texObj->StencilSampling &&
          img->_BaseFormat == GL_DEPTH_STENCIL)) &&
+       sampler->Attrib.ReductionMode == GL_WEIGHTED_AVERAGE_EXT &&
        (sampler->Attrib.MagFilter != GL_NEAREST ||
         (sampler->Attrib.MinFilter != GL_NEAREST &&
          sampler->Attrib.MinFilter != GL_NEAREST_MIPMAP_NEAREST))) {
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 07de903fb3b..16c0f282b7f 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -596,6 +596,23 @@ set_tex_parameteri(struct gl_context *ctx,
       }
       goto invalid_pname;
 
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
+      if (ctx->Extensions.EXT_texture_filter_minmax) {
+         GLenum mode = params[0];
+
+         if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
+            goto invalid_dsa;
+
+         if (mode == GL_WEIGHTED_AVERAGE_EXT || mode == GL_MIN || mode == GL_MAX) {
+            if (texObj->Sampler.Attrib.ReductionMode != mode) {
+               flush(ctx);
+               texObj->Sampler.Attrib.ReductionMode = mode;
+            }
+            return GL_TRUE;
+         }
+      }
+      goto invalid_pname;
+
    case GL_TEXTURE_CUBE_MAP_SEAMLESS:
       if (_mesa_is_desktop_gl(ctx)
           && ctx->Extensions.AMD_seamless_cubemap_per_texture) {
@@ -834,6 +851,7 @@ _mesa_texture_parameterf(struct gl_context *ctx,
    case GL_DEPTH_TEXTURE_MODE_ARB:
    case GL_DEPTH_STENCIL_TEXTURE_MODE:
    case GL_TEXTURE_SRGB_DECODE_EXT:
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
    case GL_TEXTURE_CUBE_MAP_SEAMLESS:
    case GL_TEXTURE_SWIZZLE_R_EXT:
    case GL_TEXTURE_SWIZZLE_G_EXT:
@@ -890,6 +908,7 @@ _mesa_texture_parameterfv(struct gl_context *ctx,
    case GL_DEPTH_TEXTURE_MODE_ARB:
    case GL_DEPTH_STENCIL_TEXTURE_MODE:
    case GL_TEXTURE_SRGB_DECODE_EXT:
+   case GL_TEXTURE_REDUCTION_MODE_EXT:
    case GL_TEXTURE_CUBE_MAP_SEAMLESS:
       {
          /* convert float param to int */
@@ -2357,6 +2376,12 @@ get_tex_parameterfv(struct gl_context *ctx,
          *params = (GLfloat) obj->Sampler.Attrib.sRGBDecode;
          break;
 
+      case GL_TEXTURE_REDUCTION_MODE_EXT:
+         if (!ctx->Extensions.EXT_texture_filter_minmax)
+            goto invalid_pname;
+         *params = (GLfloat) obj->Sampler.Attrib.ReductionMode;
+         break;
+
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
          if (!ctx->Extensions.ARB_shader_image_load_store)
             goto invalid_pname;
@@ -2623,6 +2648,12 @@ get_tex_parameteriv(struct gl_context *ctx,
          *params = obj->Sampler.Attrib.sRGBDecode;
          break;
 
+      case GL_TEXTURE_REDUCTION_MODE_EXT:
+         if (!ctx->Extensions.EXT_texture_filter_minmax)
+            goto invalid_pname;
+         *params = obj->Sampler.Attrib.ReductionMode;
+         break;
+
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
          if (!ctx->Extensions.ARB_shader_image_load_store)
             goto invalid_pname;



More information about the mesa-commit mailing list