Module: Mesa Branch: master Commit: 6384dcaf7ce91df8936f798e86caa6810b0a2607 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6384dcaf7ce91df8936f798e86caa6810b0a2607
Author: Ilia Mirkin <[email protected]> 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 <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Reviewed-by: Karol Herbst <[email protected]> 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; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
