From: "José Expósito" <jose.exposito89@gmail.com>
To: Louis Chauvet <louis.chauvet@bootlin.com>
Cc: airlied@gmail.com, arthurgrillo@riseup.net, corbet@lwn.net,
dri-devel@lists.freedesktop.org, hamohammed.sa@gmail.com,
jeremie.dautheribes@bootlin.com, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, maarten.lankhorst@linux.intel.com,
mairacanal@riseup.net, marcheu@google.com, melissa.srw@gmail.com,
miquel.raynal@bootlin.com, mripard@kernel.org,
nicolejadeyee@google.com, pekka.paalanen@collabora.com,
pekka.paalanen@haloniitty.fi, rdunlap@infradead.org,
rodrigosiqueiramelo@gmail.com, seanpaul@google.com,
simona.vetter@ffwll.ch, simona@ffwll.ch,
thomas.petazzoni@bootlin.com, tzimmermann@suse.de
Subject: Re: [PATCH v16 5/7] drm/vkms: Create KUnit tests for YUV conversions
Date: Fri, 31 Jan 2025 17:57:35 +0100 [thread overview]
Message-ID: <Z50A_0AlcLokJ4sD@fedora> (raw)
In-Reply-To: <Z5zJ1pEk3v-1V5Uu@louis-chauvet-laptop>
On Fri, Jan 31, 2025 at 02:02:14PM +0100, Louis Chauvet wrote:
> On 31/01/25 - 09:41, José Expósito wrote:
> > Hi Louis,
> >
> > > From: Arthur Grillo <arthurgrillo@riseup.net>
> > >
> > > Create KUnit tests to test the conversion between YUV and RGB. Test each
> > > conversion and range combination with some common colors.
> > >
> > > The code used to compute the expected result can be found in comment.
> > >
> > > [Louis Chauvet:
> > > - fix minor formating issues (whitespace, double line)
> > > - change expected alpha from 0x0000 to 0xffff
> > > - adapt to the new get_conversion_matrix usage
> > > - apply the changes from Arthur
> > > - move struct pixel_yuv_u8 to the test itself]
> > >
> > > Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> > > Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
> > > Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> > > ---
>
> [...]
>
> > > + /*
> > > + * colour.RGB_to_YCbCr(<rgb color in 16 bit form>,
> > > + * K=colour.WEIGHTS_YCBCR["ITU-R BT.709"],
> > > + * in_bits = 16,
> > > + * in_legal = False,
> > > + * in_int = True,
> > > + * out_bits = 8,
> > > + * out_legal = False,
> > > + * out_int = True)
> > > + * Test cases for conversion between YUV BT709 full range and RGB
> > > + * using the ITU-R BT.709 weights.
> > > + */
> > > + {
> > > + .encoding = DRM_COLOR_YCBCR_BT709,
> > > + .range = DRM_COLOR_YCBCR_FULL_RANGE,
> > > + .n_colors = 4,
> >
> > If I understood correctly, "n_colors" here indicates the number of items in
> > "colors", but there is a mismatch between both lengths.
> >
> > It also applies to the other test cases where "n_colors = 4".
>
> I don't know how I miss it, I am 100% sure I did the exact same comment to
> Arthur few mounth ago, thanks!
>
> > > + .colors = {
> > > + { "white", { 0xff, 0x80, 0x80 }, { 0xffff, 0xffff, 0xffff, 0xffff }},
> > > + { "gray", { 0x80, 0x80, 0x80 }, { 0xffff, 0x8080, 0x8080, 0x8080 }},
> > > + { "black", { 0x00, 0x80, 0x80 }, { 0xffff, 0x0000, 0x0000, 0x0000 }},
> > > + { "red", { 0x36, 0x63, 0xff }, { 0xffff, 0xffff, 0x0000, 0x0000 }},
> > > + { "green", { 0xb6, 0x1e, 0x0c }, { 0xffff, 0x0000, 0xffff, 0x0000 }},
> > > + { "blue", { 0x12, 0xff, 0x74 }, { 0xffff, 0x0000, 0x0000, 0xffff }},
> > > + },
> > > + },
> > > + /*
>
> [...]
>
> > > +/*
> > > + * vkms_format_test_yuv_u8_to_argb_u16 - Testing the conversion between YUV
> > > + * colors to ARGB colors in VKMS
> > > + *
> > > + * This test will use the functions get_conversion_matrix_to_argb_u16 and
> > > + * argb_u16_from_yuv888 to convert YUV colors (stored in
> > > + * yuv_u8_to_argb_u16_cases) into ARGB colors.
> > > + *
> > > + * The conversion between YUV and RGB is not totally reversible, so there may be
> > > + * some difference between the expected value and the result.
> > > + * In addition, there may be some rounding error as the input color is 8 bits
> > > + * and output color is 16 bits.
> > > + */
> > > +static void vkms_format_test_yuv_u8_to_argb_u16(struct kunit *test)
> > > +{
> > > + const struct yuv_u8_to_argb_u16_case *param = test->param_value;
> > > + struct pixel_argb_u16 argb;
> > > +
> > > + for (size_t i = 0; i < param->n_colors; i++) {
> > > + const struct format_pair *color = ¶m->colors[i];
> > > + struct conversion_matrix matrix;
> > > +
> > > + get_conversion_matrix_to_argb_u16
> > > + (DRM_FORMAT_NV12, param->encoding, param->range, &matrix);
> > > +
> > > + argb = argb_u16_from_yuv888(color->yuv.y, color->yuv.u, color->yuv.v, &matrix);
> >
> > Running the test on ppc64 (big endian) doesn't fail. For reference:
> >
> > $ sudo dnf install powerpc64-linux-gnu-gcc
> > $ sudo dnf install qemu-system-ppc64
> > $ ./tools/testing/kunit/kunit.py run \
> > --kunitconfig=drivers/gpu/drm/vkms/tests \
> > --arch=powerpc --cross_compile=powerpc64-linux-gnu- \
> > --make_options CF=-D__CHECK_ENDIAN__ \
> > --kconfig_add CONFIG_KASAN=y \
> > --kconfig_add CONFIG_KASAN_VMALLOC=y
> >
> > However, I wonder if endianness is correctly handled. I always find endianness
> > difficult to reason about, but I'll try my best to explain it.
> >
> > On a big endian architecture, color->yuv is stored in big endian. This might not
> > be an issue, because its components (y, u and v) are u8.
> > However, I think that the return value of argb_u16_from_yuv888(), which is the
> > result of argb_u16_from_u16161616(), is returned in big endian while it should
> > be little endian.
>
> The goal of `struct argb_u16` is to hide machine-specific issues. We want
> to be able to do addition, multiplication... without
> `le_from_cpu`/`cpu_to_le` everywhere.
>
> If you look at the rest of the vkms driver, we never do bit manipulation
> on `struct argb_u16`, only mathematical operations.
>
> > Since you are comparing argb.a (big endian) with color->argb.a (big endian) the
> > test succedess, but in this case it should fail because, if I remember
> > correctly, colors must be stored in little endian and therefore, the color
> > returned by argb_u16_from_yuv888() should be little endian.
>
> The colors are stored in a specific endian only in framebuffers, but in
> our case, this is not a framebuffer. For the `argb_u16_to_ARGB16161616`,
> you can see we use `cpu_to_le16` to store the data in the proper order.
>
> > If you replace this 4 KUNIT_EXPECT_LE_MSG() with KUNIT_EXPECT_MEMEQ(), all test
> > will fail, but you'll notice that the buffers printed in the error log are
> > different depending on the endianness (x86_64 vs ppc64).
> >
> > What do you think? Did I overlook the conversion?
>
> I think yes, but thanks to make me think about it, I will steal your
> command line to test on powerPC :)
Well, at least the command was useful :P Thanks for the explanation.
I have been looking with more detail into get_pixel_write_function()
and what you mention makes sense now.
Thanks!
> > Have a look to the tests present in drm_format_helper_test.c. They use different
> > functions (cpubuf_to_le32, le32buf_to_cpu, etc) to make sure that colors are
> > represented in little endian and that comparing the expected and actual results
> > happens in the same endian.
>
> Those tests are testing conversion "buffer to buffer", so yes, there is
> some endian-dependant issues.
>
> [...]
next prev parent reply other threads:[~2025-01-31 16:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-21 10:48 [PATCH v16 0/7] drm/vkms: Add support for YUV and DRM_FORMAT_R* Louis Chauvet
2025-01-21 10:48 ` [PATCH v16 1/7] drm/vkms: Add YUV support Louis Chauvet
2025-01-21 10:48 ` [PATCH v16 2/7] drm/vkms: Add range and encoding properties to the plane Louis Chauvet
2025-01-21 10:48 ` [PATCH v16 3/7] drm/vkms: Drop YUV formats TODO Louis Chauvet
2025-01-31 8:40 ` José Expósito
2025-01-31 13:02 ` Louis Chauvet
2025-01-31 16:53 ` José Expósito
2025-01-21 10:48 ` [PATCH v16 4/7] drm: Export symbols to use in tests Louis Chauvet
2025-01-31 8:40 ` José Expósito
2025-01-21 10:48 ` [PATCH v16 5/7] drm/vkms: Create KUnit tests for YUV conversions Louis Chauvet
2025-01-26 17:06 ` Maxime Ripard
2025-01-27 10:48 ` Louis Chauvet
2025-02-05 8:55 ` Maxime Ripard
2025-02-05 15:32 ` Louis Chauvet
2025-02-19 10:15 ` Maxime Ripard
2025-02-19 13:35 ` Louis Chauvet
2025-03-07 10:20 ` Maxime Ripard
2025-03-07 14:50 ` Louis Chauvet
2025-03-10 9:12 ` Pekka Paalanen
2025-03-13 14:29 ` Maxime Ripard
2025-01-31 8:41 ` José Expósito
2025-01-31 13:02 ` Louis Chauvet
2025-01-31 16:57 ` José Expósito [this message]
2025-01-21 10:48 ` [PATCH v16 6/7] drm/vkms: Add how to run the Kunit tests Louis Chauvet
2025-01-31 8:41 ` José Expósito
2025-01-21 10:48 ` [PATCH v16 7/7] drm/vkms: Add support for DRM_FORMAT_R* Louis Chauvet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z50A_0AlcLokJ4sD@fedora \
--to=jose.exposito89@gmail.com \
--cc=airlied@gmail.com \
--cc=arthurgrillo@riseup.net \
--cc=corbet@lwn.net \
--cc=dri-devel@lists.freedesktop.org \
--cc=hamohammed.sa@gmail.com \
--cc=jeremie.dautheribes@bootlin.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=louis.chauvet@bootlin.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mairacanal@riseup.net \
--cc=marcheu@google.com \
--cc=melissa.srw@gmail.com \
--cc=miquel.raynal@bootlin.com \
--cc=mripard@kernel.org \
--cc=nicolejadeyee@google.com \
--cc=pekka.paalanen@collabora.com \
--cc=pekka.paalanen@haloniitty.fi \
--cc=rdunlap@infradead.org \
--cc=rodrigosiqueiramelo@gmail.com \
--cc=seanpaul@google.com \
--cc=simona.vetter@ffwll.ch \
--cc=simona@ffwll.ch \
--cc=thomas.petazzoni@bootlin.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.