[Mesa-dev] [PATCH 12/15] mesa: Add a gles3 error condition for sized internalformat in glCopyTexImage*()

Jason Ekstrand jason at jlekstrand.net
Fri Aug 1 15:03:38 PDT 2014


On Wed, Jun 11, 2014 at 11:09 AM, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> Adding mesa-dev to the conversation.
>
> On Wed, Jun 11, 2014 at 10:52 AM, Anuj Phogat <anuj.phogat at gmail.com>
> wrote:
> >
> > On Wed, Jun 11, 2014 at 10:28 AM, Courtney Goeltzenleuchter
> > <courtney at lunarg.com> wrote:
> >>
> >> On Fri, Jun 6, 2014 at 5:57 PM, Anuj Phogat <anuj.phogat at gmail.com>
> wrote:
> >>>
> >>> Fixes many failures in gles3 Khronos CTS test: packed_pixels
> >>>
> >>> Cc: <mesa-stable at lists.freedesktop.org>
> >>> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> >>> ---
> >>>  src/mesa/main/teximage.c | 43
> >>> +++++++++++++++++++++++++++++++++++++++++++
> >>>  1 file changed, 43 insertions(+)
> >>>
> >>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> >>> index 6474dba..c926a2f 100644
> >>> --- a/src/mesa/main/teximage.c
> >>> +++ b/src/mesa/main/teximage.c
> >>> @@ -3582,6 +3582,25 @@ copytexsubimage_by_slice(struct gl_context *ctx,
> >>>     }
> >>>  }
> >>>
> >>> +static GLboolean
> >>> +formats_differ_in_component_sizes (mesa_format f1,
> >>> +                                   mesa_format f2)
> >>> +{
> >>> +   GLint f1_r_bits = _mesa_get_format_bits(f1, GL_RED_BITS);
> >>> +   GLint f1_g_bits = _mesa_get_format_bits(f1, GL_GREEN_BITS);
> >>> +   GLint f1_b_bits = _mesa_get_format_bits(f1, GL_BLUE_BITS);
> >>> +
> >>> +   GLint f2_r_bits = _mesa_get_format_bits(f2, GL_RED_BITS);
> >>> +   GLint f2_g_bits = _mesa_get_format_bits(f2, GL_GREEN_BITS);
> >>> +   GLint f2_b_bits = _mesa_get_format_bits(f2, GL_BLUE_BITS);
> >>> +
> >>> +   if ((f1_r_bits && f2_r_bits && f1_r_bits != f2_r_bits)
>

What about alpha?  We should also do something sensible if the destination
texture is luminance or luminance_alpha.


> >>
> >>
> >> I'm curious, why wouldn't a format with f1_r_bits = 0 and f2_r_bits != 0
> >> and everything else the same, not be considered different formats?
> >
> > If we include that condition, it will be equivalent using:
> > if(f1_r_bits != f2_r_bits || f1_g_bits != f2_g_bits || f1_b_bits !=
> > f2_b_bits)
> >
> > This won't work because gles allows dropping the components in internal
> > formats but doesn't allow adding new components. This check in
> > copytexture_error_check() takes care of this case when one component is
> > missing:
> >
> > [snip]
> >     if (_mesa_base_format_component_count(baseFormat) >
> >           _mesa_base_format_component_count(rb_base_format)) {
> >          valid = false;
> >       }
> >  [snip]
>

Also, this isn't 100% sufficient.  What about if the framebuffer is GL_RGB
but the texture is GL_ALPHA?  This check will pass but it's clearly a bad
combination.  Is there something dealing with this case?


> >>
> >>
> >>>
> >>> +       || (f1_g_bits && f2_g_bits && f1_g_bits != f2_g_bits)
> >>> +       || (f1_b_bits && f2_b_bits && f1_b_bits != f2_b_bits))
> >>> +      return GL_TRUE;
> >>> +
> >>> +   return GL_FALSE;
> >>> +}
> >>>
> >>>  /**
> >>>   * Implement the glCopyTexImage1/2D() functions.
> >>> @@ -3595,6 +3614,7 @@ copyteximage(struct gl_context *ctx, GLuint dims,
> >>>     struct gl_texture_image *texImage;
> >>>     const GLuint face = _mesa_tex_target_to_face(target);
> >>>     mesa_format texFormat;
> >>> +   struct gl_renderbuffer *rb;
> >>>
> >>>     FLUSH_VERTICES(ctx, 0);
> >>>
> >>> @@ -3624,6 +3644,29 @@ copyteximage(struct gl_context *ctx, GLuint
> dims,
> >>>
> >>>     texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
> >>>                                             internalFormat, GL_NONE,
> >>> GL_NONE);
> >>> +
> >>> +   rb = _mesa_get_read_renderbuffer_for_format(ctx, internalFormat);
> >>> +
> >>> +   /* From Page 139 of OpenGL ES 3.0 spec:
> >>> +    *    "If internalformat is sized, the internal format of the new
> >>> texel
> >>> +    *    array is internalformat, and this is also the new texel
> array’s
> >>> +    *    effective internal format. If the component sizes of
> >>> internalformat
> >>> +    *    do not exactly match the corresponding component sizes of the
> >>> source
> >>> +    *    buffer’s effective internal format, described below, an
> >>> +    *    INVALID_OPERATION error is generated. If internalformat is
> >>> unsized,
> >>> +    *    the internal format of the new texel array is the effective
> >>> internal
> >>> +    *    format of the source buffer, and this is also the new texel
> >>> array’s
> >>> +    *    effective internal format.
> >>> +    */
> >>> +   if (_mesa_is_gles3(ctx)
> >>> +       && !_mesa_is_enum_format_unsized(internalFormat)
> >>> +       && formats_differ_in_component_sizes (texFormat, rb->Format)) {
> >>> +      _mesa_error(ctx, GL_INVALID_OPERATION,
> >>> +                  "glCopyTexImage%uD(componenet size changed in"
> >>> +                  " internal format)", dims);
> >>> +      return;
> >>> +   }
> >>> +
> >>>     assert(texFormat != MESA_FORMAT_NONE);
> >>>
> >>>     if (!ctx->Driver.TestProxyTexImage(ctx, proxy_target(target),
> >>> --
> >>> 1.8.3.1
> >>>
> >>> _______________________________________________
> >>> mesa-stable mailing list
> >>> mesa-stable at lists.freedesktop.org
> >>> http://lists.freedesktop.org/mailman/listinfo/mesa-stable
> >>
> >>
> >> --
> >> Courtney Goeltzenleuchter
> >> LunarG
> >>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140801/56cf63d2/attachment.html>


More information about the mesa-dev mailing list