From 6b672e342a367c11c23690c5b309617a0b6e9c40 Mon Sep 17 00:00:00 2001 From: Illia Iorin Date: Tue, 13 Aug 2019 11:57:37 +0300 Subject: [PATCH] mesa/main: Ignore filter state for MS texture completeness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the discussion in https://github.com/KhronosGroup/OpenGL-API/issues/45 the section 8.17 (texture completeness) of the OpenGL 4.6 core profile was changed to explicitly say that multisample texture completeness ignores filter state of the texture. "Using the preceding definitions, a texture is complete unless any of the following conditions hold true: ... - The minification filter requires a mipmap (is neither NEAREST nor LINEAR), the texture is not multisample, and the texture is not mipmap complete. - The texture is not multisample; either the magnification filter is not NEAREST, or the minification filter is neither NEAREST nor NEAREST_- MIPMAP_NEAREST; and any of – The internal format of the texture is integer (see table 8.12). – The internal format is STENCIL_INDEX. – The internal format is DEPTH_STENCIL, and the value of DEPTH_- STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX." Signed-off-by: Danylo Piliaiev Signed-off-by: Illia Iorin Reviewed-by: Marek Olšák --- src/mesa/main/texobj.h | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index 19f715159a2..be8c6e4e6c2 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -124,14 +124,28 @@ static inline GLboolean _mesa_is_texture_complete(const struct gl_texture_object *texObj, const struct gl_sampler_object *sampler) { + struct gl_texture_image *img = texObj->Image[0][texObj->BaseLevel]; + bool isMultisample = img && img->NumSamples >= 2; + /* * According to ARB_stencil_texturing, NEAREST_MIPMAP_NEAREST would * be forbidden, however it is allowed per GL 4.5 rules, allow it * even without GL 4.5 since it was a spec mistake. */ - if ((texObj->_IsIntegerFormat || + /* Section 8.17 (texture completeness) of the OpenGL 4.6 core profile spec: + * + * "The texture is not multisample; either the magnification filter is not + * NEAREST, or the minification filter is neither NEAREST nor NEAREST_- + * MIPMAP_NEAREST; and any of + * – The internal format of the texture is integer. + * – The internal format is STENCIL_INDEX. + * – The internal format is DEPTH_STENCIL, and the value of DEPTH_- + * STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX."" + */ + if (!isMultisample && + (texObj->_IsIntegerFormat || (texObj->StencilSampling && - texObj->Image[0][texObj->BaseLevel]->_BaseFormat == GL_DEPTH_STENCIL)) && + img->_BaseFormat == GL_DEPTH_STENCIL)) && (sampler->MagFilter != GL_NEAREST || (sampler->MinFilter != GL_NEAREST && sampler->MinFilter != GL_NEAREST_MIPMAP_NEAREST))) { @@ -139,7 +153,12 @@ _mesa_is_texture_complete(const struct gl_texture_object *texObj, return GL_FALSE; } - if (_mesa_is_mipmap_filter(sampler)) + /* Section 8.17 (texture completeness) of the OpenGL 4.6 core profile spec: + * + * "The minification filter requires a mipmap (is neither NEAREST nor LINEAR), + * the texture is not multisample, and the texture is not mipmap complete."" + */ + if (!isMultisample &&_mesa_is_mipmap_filter(sampler)) return texObj->_MipmapComplete; else return texObj->_BaseComplete;