[Mesa-dev] [PATCH] mesa: Require mipmap completeness for glCopyImageSubData() at times.

Andres Gomez agomez at igalia.com
Sat Jul 8 14:01:30 UTC 2017


Kenneth, worth cherry-picking for -stable?

On Wed, 2017-06-28 at 02:44 -0700, Kenneth Graunke wrote:
> This patch makes glCopyImageSubData require mipmap completeness when the
> texture object's built-in sampler object has a mipmapping MinFilter.
> This is apparently the de facto behavior and mandated by Android's CTS.
> 
> One exception is that we ignore format based completeness rules
> (specifically integer formats with linear filtering), as this is
> also the de facto behavior that until recently was mandated by the
> OpenGL 4.5 CTS.
> 
> This was discussed with both the OpenGL and OpenGL ES working groups,
> and while everyone agrees this behavior is unfortunate and complicated,
> it is what it is at this point.  There was little appetite for relaxing
> restrictions given that all conformant Android drivers followed the
> mipmapping rule, and all conformant GL 4.5 implementations ignored the
> integer/linear rule.
> 
> Fixes (on i965):
> dEQP-GLES31.functional.debug.negative_coverage.*.buffer.copy_image_sub_data
> 
> Bugzilla: https://cvs.khronos.org/bugzilla/show_bug.cgi?id=16224
> Cc: Roland Scheidegger <sroland at vmware.com>
> ---
>  src/mesa/main/copyimage.c | 59 +++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/main/copyimage.c b/src/mesa/main/copyimage.c
> index 2cb617ca811..10777cfdf05 100644
> --- a/src/mesa/main/copyimage.c
> +++ b/src/mesa/main/copyimage.c
> @@ -149,9 +149,64 @@ prepare_target_err(struct gl_context *ctx, GLuint name, GLenum target,
>           return false;
>        }
>  
> +      /* The ARB_copy_image specification says:
> +       *
> +       *    "INVALID_OPERATION is generated if either object is a texture and
> +       *     the texture is not complete (as defined in section 3.9.14)"
> +       *
> +       * The cited section says:
> +       *
> +       *    "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), and the texture is not mipmap complete."
> +       *
> +       * This imposes the bizarre restriction that glCopyImageSubData requires
> +       * mipmap completion based on the sampler minification filter, even
> +       * though the call fundamentally ignores the sampler.  Additionally, it
> +       * doesn't work with texture units, so it can't consider any bound
> +       * separate sampler objects.  It appears that you're supposed to use
> +       * the sampler object which is built-in to the texture object.
> +       *
> +       * dEQP and the Android CTS mandate this behavior, and the Khronos
> +       * GL and ES working groups both affirmed that this is unfortunate but
> +       * correct.  See https://cvs.khronos.org/bugzilla/show_bug.cgi?id=16224.
> +       *
> +       * Integer textures with filtering cause another completeness snag:
> +       *
> +       *    "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.
> +       *     and either the magnification filter is not NEAREST, or the
> +       *     minification filter is neither NEAREST nor
> +       *     NEAREST_MIPMAP_NEAREST."
> +       *
> +       * However, applications in the wild (such as "Total War: WARHAMMER")
> +       * appear to call glCopyImageSubData with integer textures and the
> +       * default mipmap filters of GL_LINEAR and GL_NEAREST_MIPMAP_LINEAR,
> +       * which would be considered incomplete, but expect this to work.  In
> +       * fact, until VK-GL-CTS commit fef80039ff875a51806b54d151c5f2d0c12da,
> +       * the GL 4.5 CTS contained three tests which did the exact same thing
> +       * by accident, and all conformant implementations allowed it.
> +       *
> +       * A proposal was made to amend the spec to say "is not complete (as
> +       * defined in section <X>, but ignoring format-based completeness
> +       * rules)" to allow this case.  It makes some sense, given that
> +       * glCopyImageSubData copies raw data without considering format.
> +       * While the official edits have not yet been made, the OpenGL
> +       * working group agreed with the idea of allowing this behavior.
> +       *
> +       * To ignore formats, we check texObj->_MipmapComplete directly
> +       * rather than calling _mesa_is_texture_complete().
> +       */
>        _mesa_test_texobj_completeness(ctx, texObj);
> -      if (!texObj->_BaseComplete ||
> -          (level != 0 && !texObj->_MipmapComplete)) {
> +      const bool texture_complete_aside_from_formats =
> +         _mesa_is_mipmap_filter(&texObj->Sampler) ? texObj->_MipmapComplete
> +                                                  : texObj->_BaseComplete;
> +      if (!texture_complete_aside_from_formats) {
>           _mesa_error(ctx, GL_INVALID_OPERATION,
>                       "glCopyImageSubData(%sName incomplete)", dbg_prefix);
>           return false;
-- 
Br,

Andres


More information about the mesa-dev mailing list