[Mesa-dev] [PATCH 12/15] mesa: Add a gles3 error condition for sized internalformat in glCopyTexImage*()
Anuj Phogat
anuj.phogat at gmail.com
Thu Jul 31 14:17:49 PDT 2014
Courtney, Should I consider this r-b you?
On Wed, Jun 11, 2014 at 11:34 AM, Courtney Goeltzenleuchter <
courtney at lunarg.com> wrote:
> Very good. I thought there might be something limiting the inputs but
> wasn't immediately obvious.
>
>
> On Wed, Jun 11, 2014 at 12:09 PM, 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)
>> >>
>> >>
>> >> 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]
>> >>
>> >>
>> >>>
>> >>> + || (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
>> >>
>>
>
>
>
> --
> Courtney Goeltzenleuchter
> LunarG
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140731/597c95a1/attachment-0001.html>
More information about the mesa-dev
mailing list