* [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing
@ 2018-09-10 10:03 Stanislav Lisovskiy
2018-09-10 16:29 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_fb: Added XYUV format support for testing (rev5) Patchwork
2018-09-11 8:26 ` [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Lisovskiy, Stanislav
0 siblings, 2 replies; 7+ messages in thread
From: Stanislav Lisovskiy @ 2018-09-10 10:03 UTC (permalink / raw)
To: igt-dev; +Cc: stanislav.lisovskiy, ville.syrjala, martin.peres
XYUV format support has been added to DRM, modified
IGT to reflect those changes.
v2: Fixed merge conflict, started to use new yuv<=>rgb
conversion functions.
v3: Fixed kms_available_modes_crc test to support new XYUV
format. Fixed a problem, where test complains that two
outputs might use same pipe at the same time.
v4: Fixed convertion procedure in igt_fb to support XYUV
properly.
v5: Fixed a coding typo.
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
---
include/drm-uapi/drm_fourcc.h | 1 +
lib/igt_fb.c | 89 +++++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+)
diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
index e04613d3..0bf66de2 100644
--- a/include/drm-uapi/drm_fourcc.h
+++ b/include/drm-uapi/drm_fourcc.h
@@ -112,6 +112,7 @@ extern "C" {
#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
+#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
/*
* 2 plane RGB + A
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index ae71d967..b60b73b4 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -72,6 +72,10 @@ static struct format_desc_struct {
.cairo_id = CAIRO_FORMAT_RGB16_565,
.num_planes = 1, .plane_bpp = { 16, },
},
+ { .name = "XYUV", .depth = 24, .drm_id = DRM_FORMAT_XYUV,
+ .cairo_id = CAIRO_FORMAT_RGB24,
+ .num_planes = 1, .plane_bpp = { 32, },
+ },
{ .name = "XRGB8888", .depth = 24, .drm_id = DRM_FORMAT_XRGB8888,
.cairo_id = CAIRO_FORMAT_RGB24,
.num_planes = 1, .plane_bpp = { 32, },
@@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int width, int height,
memset(ptr + offsets[1], 0x80,
calculated_stride * height/2);
break;
+ case DRM_FORMAT_XYUV:
+ wmemset(ptr, full_range ? 0x000f8080 : 0x000f8080,
+ calculated_stride * height / sizeof(wchar_t));
+ break;
case DRM_FORMAT_YUYV:
case DRM_FORMAT_YVYU:
wmemset(ptr, full_range ? 0x80008000 : 0x80108010,
@@ -1500,6 +1508,79 @@ static void convert_nv12_to_rgb24(struct igt_fb *fb, struct fb_convert_blit_uplo
free(buf);
}
+static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
+{
+ int i, j;
+ uint8_t *yuv24;
+ uint8_t *rgb24 = blit->rgb24.map;
+ unsigned rgb24_stride = blit->rgb24.stride, planar_stride = blit->linear.stride;
+ uint8_t *buf = malloc(blit->linear.size);
+ struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb->color_encoding,
+ fb->color_range);
+
+ /*
+ * Reading from the BO is awfully slow because of lack of read caching,
+ * it's faster to copy the whole BO to a temporary buffer and convert
+ * from there.
+ */
+ igt_memcpy_from_wc(buf, blit->linear.map, blit->linear.size);
+ yuv24 = &buf[blit->linear.offsets[0]];
+
+ for (i = 0; i < fb->plane_height[0]; i++) {
+ for (j = 0; j < fb->plane_width[0]; j++) {
+ float y, u, v;
+ struct igt_vec4 yuv;
+ struct igt_vec4 rgb;
+
+ v = yuv24[i * planar_stride + j*sizeof(uint32_t)];
+ u = yuv24[i * planar_stride + j*sizeof(uint32_t) + 1];
+ y = yuv24[i * planar_stride + j*sizeof(uint32_t) + 2];
+ yuv.d[0] = y;
+ yuv.d[1] = u;
+ yuv.d[2] = v;
+ yuv.d[3] = 1.0f;
+
+ rgb = igt_matrix_transform(&m, &yuv);
+
+ write_rgb(&rgb24[i * rgb24_stride + j*sizeof(uint32_t)], &rgb);
+ }
+ }
+
+ free(buf);
+}
+
+
+static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
+{
+ int i, j;
+ uint8_t *rgb24;
+ uint8_t *yuv444 = blit->linear.map;
+ unsigned rgb24_stride = blit->rgb24.stride, planar_stride = blit->linear.stride;
+ struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb->color_encoding,
+ fb->color_range);
+
+ rgb24 = blit->rgb24.map;
+
+ for (i = 0; i < fb->plane_height[0]; i++) {
+ for (j = 0; j < fb->plane_width[0]; j++) {
+ struct igt_vec4 rgb;
+ struct igt_vec4 yuv;
+ float y, u, v;
+
+ read_rgb(&rgb, &rgb24[i * rgb24_stride + j*sizeof(uint32_t)]);
+
+ yuv = igt_matrix_transform(&m, &rgb);
+
+ yuv444[i * planar_stride + j*sizeof(uint32_t)] = yuv.d[2];
+ yuv444[i * planar_stride + j*sizeof(uint32_t) + 1] = yuv.d[1];
+ yuv444[i * planar_stride + j*sizeof(uint32_t) + 2] = yuv.d[0];
+ }
+ }
+}
+
+
+
+
static void convert_rgb24_to_nv12(struct igt_fb *fb, struct fb_convert_blit_upload *blit)
{
int i, j;
@@ -1756,6 +1837,9 @@ static void destroy_cairo_surface__convert(void *arg)
case DRM_FORMAT_VYUY:
convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb->drm_format));
break;
+ case DRM_FORMAT_XYUV:
+ convert_rgb24_to_yuv444(fb, blit);
+ break;
default:
igt_assert_f(false, "Conversion not implemented for formats 0x%x\n",
fb->drm_format);
@@ -1809,6 +1893,9 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
case DRM_FORMAT_VYUY:
convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb->drm_format));
break;
+ case DRM_FORMAT_XYUV:
+ convert_yuv444_to_rgb24(fb, blit);
+ break;
default:
igt_assert_f(false, "Conversion not implemented for formats 0x%x\n",
fb->drm_format);
@@ -1825,6 +1912,7 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
blit, destroy_cairo_surface__convert);
}
+
/**
* igt_get_cairo_surface:
* @fd: open drm file descriptor
@@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t drm_format)
case DRM_FORMAT_YVYU:
case DRM_FORMAT_UYVY:
case DRM_FORMAT_VYUY:
+ case DRM_FORMAT_XYUV:
return true;
default:
return false;
--
2.17.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 7+ messages in thread* [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_fb: Added XYUV format support for testing (rev5) 2018-09-10 10:03 [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Stanislav Lisovskiy @ 2018-09-10 16:29 ` Patchwork 2018-09-11 8:26 ` [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Lisovskiy, Stanislav 1 sibling, 0 replies; 7+ messages in thread From: Patchwork @ 2018-09-10 16:29 UTC (permalink / raw) To: Lisovskiy, Stanislav; +Cc: igt-dev == Series Details == Series: lib/igt_fb: Added XYUV format support for testing (rev5) URL : https://patchwork.freedesktop.org/series/48789/ State : failure == Summary == = CI Bug Log - changes from CI_DRM_4791 -> IGTPW_1817 = == Summary - FAILURE == Serious unknown changes coming with IGTPW_1817 absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in IGTPW_1817, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI. External URL: https://patchwork.freedesktop.org/api/1.0/series/48789/revisions/5/mbox/ == Possible new issues == Here are the unknown changes that may have been introduced in IGTPW_1817: === IGT changes === ==== Possible regressions ==== igt@kms_flip@basic-flip-vs-dpms: fi-ilk-650: PASS -> FAIL +4 fi-pnv-d510: PASS -> FAIL +3 fi-skl-6770hq: PASS -> FAIL +3 fi-ivb-3520m: PASS -> FAIL +3 fi-snb-2520m: PASS -> FAIL +3 fi-gdg-551: PASS -> FAIL +3 fi-kbl-7500u: PASS -> FAIL +4 fi-bdw-gvtdvm: PASS -> FAIL +3 fi-glk-dsi: NOTRUN -> FAIL +3 igt@kms_flip@basic-flip-vs-modeset: fi-blb-e6850: NOTRUN -> FAIL +3 fi-byt-j1900: PASS -> FAIL +3 fi-ivb-3770: PASS -> FAIL +3 fi-glk-j4005: PASS -> FAIL +3 fi-bxt-j4205: PASS -> FAIL +3 fi-hsw-4770: PASS -> FAIL +3 fi-cfl-s3: PASS -> FAIL +3 igt@kms_flip@basic-flip-vs-wf_vblank: fi-icl-u: PASS -> FAIL +3 fi-snb-2600: PASS -> FAIL +3 fi-skl-6260u: PASS -> FAIL +3 fi-hsw-4770r: PASS -> FAIL +3 fi-bdw-samus: PASS -> FAIL +3 fi-cfl-8109u: PASS -> FAIL +4 fi-kbl-r: PASS -> FAIL +3 fi-bwr-2160: PASS -> FAIL +3 fi-bdw-5557u: PASS -> FAIL +3 fi-bsw-kefka: PASS -> FAIL +3 fi-skl-gvtdvm: PASS -> FAIL +3 fi-byt-clapper: PASS -> FAIL +3 igt@kms_flip@basic-plain-flip: fi-bsw-n3050: PASS -> FAIL +3 fi-byt-n2820: PASS -> FAIL +3 fi-cfl-guc: PASS -> FAIL +3 fi-skl-iommu: PASS -> FAIL +3 fi-cnl-psr: PASS -> FAIL +3 fi-bxt-dsi: PASS -> FAIL +3 fi-kbl-7560u: PASS -> FAIL +3 fi-skl-6600u: PASS -> FAIL +3 fi-whl-u: PASS -> FAIL +3 fi-cfl-8700k: PASS -> FAIL +3 fi-skl-guc: PASS -> FAIL +4 fi-kbl-7567u: PASS -> FAIL +3 fi-elk-e7500: PASS -> FAIL +3 igt@kms_setmode@basic-clone-single-crtc: fi-skl-6700k2: PASS -> FAIL +4 == Known issues == Here are the changes found in IGTPW_1817 that come from known issues: === IGT changes === ==== Issues hit ==== igt@amdgpu/amd_prime@amd-to-i915: fi-kbl-8809g: NOTRUN -> FAIL (fdo#107341) igt@drv_selftest@live_guc: fi-cfl-guc: PASS -> DMESG-WARN (fdo#107258) igt@drv_selftest@live_hangcheck: fi-skl-guc: PASS -> DMESG-FAIL (fdo#106685) igt@gem_exec_suspend@basic-s3: fi-skl-caroline: NOTRUN -> INCOMPLETE (fdo#107556, fdo#104108) fi-kbl-soraka: NOTRUN -> INCOMPLETE (fdo#107774, fdo#107556) igt@kms_chamelium@hdmi-hpd-fast: fi-kbl-7500u: SKIP -> FAIL (fdo#103841, fdo#102672) igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a: fi-byt-clapper: PASS -> FAIL (fdo#107362) igt@kms_psr@primary_page_flip: fi-kbl-r: PASS -> FAIL (fdo#107336) igt@pm_rpm@module-reload: fi-glk-j4005: PASS -> DMESG-WARN (fdo#106000) ==== Possible fixes ==== igt@amdgpu/amd_basic@cs-sdma: fi-skl-6700k2: FAIL (fdo#107888) -> SKIP +7 igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b: fi-byt-clapper: FAIL (fdo#103191, fdo#107362) -> PASS igt@kms_psr@primary_page_flip: fi-whl-u: FAIL (fdo#107336) -> PASS fdo#102672 https://bugs.freedesktop.org/show_bug.cgi?id=102672 fdo#103191 https://bugs.freedesktop.org/show_bug.cgi?id=103191 fdo#103841 https://bugs.freedesktop.org/show_bug.cgi?id=103841 fdo#104108 https://bugs.freedesktop.org/show_bug.cgi?id=104108 fdo#106000 https://bugs.freedesktop.org/show_bug.cgi?id=106000 fdo#106685 https://bugs.freedesktop.org/show_bug.cgi?id=106685 fdo#107258 https://bugs.freedesktop.org/show_bug.cgi?id=107258 fdo#107336 https://bugs.freedesktop.org/show_bug.cgi?id=107336 fdo#107341 https://bugs.freedesktop.org/show_bug.cgi?id=107341 fdo#107362 https://bugs.freedesktop.org/show_bug.cgi?id=107362 fdo#107556 https://bugs.freedesktop.org/show_bug.cgi?id=107556 fdo#107774 https://bugs.freedesktop.org/show_bug.cgi?id=107774 fdo#107888 https://bugs.freedesktop.org/show_bug.cgi?id=107888 == Participating hosts (46 -> 47) == Additional (5): fi-kbl-soraka fi-skl-caroline fi-blb-e6850 fi-glk-dsi fi-kbl-8809g Missing (4): fi-ilk-m540 fi-byt-squawks fi-bsw-cyan fi-hsw-4200u == Build changes == * IGT: IGT_4636 -> IGTPW_1817 CI_DRM_4791: 07cf212bc704357ee60aba52ec40bab538222040 @ git://anongit.freedesktop.org/gfx-ci/linux IGTPW_1817: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1817/ IGT_4636: 40de31df52ffed5e392d607a83e3aea4efb150e6 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1817/issues.html _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing 2018-09-10 10:03 [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Stanislav Lisovskiy 2018-09-10 16:29 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_fb: Added XYUV format support for testing (rev5) Patchwork @ 2018-09-11 8:26 ` Lisovskiy, Stanislav 2018-09-11 12:50 ` Ville Syrjälä 1 sibling, 1 reply; 7+ messages in thread From: Lisovskiy, Stanislav @ 2018-09-11 8:26 UTC (permalink / raw) To: igt-dev@lists.freedesktop.org; +Cc: Syrjala, Ville, Peres, Martin On Mon, 2018-09-10 at 13:03 +0300, Stanislav Lisovskiy wrote: > XYUV format support has been added to DRM, modified > IGT to reflect those changes. > > v2: Fixed merge conflict, started to use new yuv<=>rgb > conversion functions. > > v3: Fixed kms_available_modes_crc test to support new XYUV > format. Fixed a problem, where test complains that two > outputs might use same pipe at the same time. > > v4: Fixed convertion procedure in igt_fb to support XYUV > properly. > > v5: Fixed a coding typo. Minor comment: this change will fail all test cases where drmModeAddFB2 is called with DRM_FORMAT_XYUV until correspondent kernel patch is not in use, as many igt test cases do not check if that kernel format is supported or not, so drmModeAddFB2 will simply fail. > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> > --- > include/drm-uapi/drm_fourcc.h | 1 + > lib/igt_fb.c | 89 > +++++++++++++++++++++++++++++++++++ > 2 files changed, 90 insertions(+) > > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm- > uapi/drm_fourcc.h > index e04613d3..0bf66de2 100644 > --- a/include/drm-uapi/drm_fourcc.h > +++ b/include/drm-uapi/drm_fourcc.h > @@ -112,6 +112,7 @@ extern "C" { > #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ > > #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ > +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', 'U', > 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ > > /* > * 2 plane RGB + A > diff --git a/lib/igt_fb.c b/lib/igt_fb.c > index ae71d967..b60b73b4 100644 > --- a/lib/igt_fb.c > +++ b/lib/igt_fb.c > @@ -72,6 +72,10 @@ static struct format_desc_struct { > .cairo_id = CAIRO_FORMAT_RGB16_565, > .num_planes = 1, .plane_bpp = { 16, }, > }, > + { .name = "XYUV", .depth = 24, .drm_id = DRM_FORMAT_XYUV, > + .cairo_id = CAIRO_FORMAT_RGB24, > + .num_planes = 1, .plane_bpp = { 32, }, > + }, > { .name = "XRGB8888", .depth = 24, .drm_id = > DRM_FORMAT_XRGB8888, > .cairo_id = CAIRO_FORMAT_RGB24, > .num_planes = 1, .plane_bpp = { 32, }, > @@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int width, > int height, > memset(ptr + offsets[1], 0x80, > calculated_stride * > height/2); > break; > + case DRM_FORMAT_XYUV: > + wmemset(ptr, full_range ? 0x000f8080 > : 0x000f8080, > + calculated_stride * height / > sizeof(wchar_t)); > + break; > case DRM_FORMAT_YUYV: > case DRM_FORMAT_YVYU: > wmemset(ptr, full_range ? 0x80008000 > : 0x80108010, > @@ -1500,6 +1508,79 @@ static void convert_nv12_to_rgb24(struct > igt_fb *fb, struct fb_convert_blit_uplo > free(buf); > } > > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct > fb_convert_blit_upload *blit) > +{ > + int i, j; > + uint8_t *yuv24; > + uint8_t *rgb24 = blit->rgb24.map; > + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = > blit->linear.stride; > + uint8_t *buf = malloc(blit->linear.size); > + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb- > >color_encoding, > + fb- > >color_range); > + > + /* > + * Reading from the BO is awfully slow because of lack of > read caching, > + * it's faster to copy the whole BO to a temporary buffer > and convert > + * from there. > + */ > + igt_memcpy_from_wc(buf, blit->linear.map, blit- > >linear.size); > + yuv24 = &buf[blit->linear.offsets[0]]; > + > + for (i = 0; i < fb->plane_height[0]; i++) { > + for (j = 0; j < fb->plane_width[0]; j++) { > + float y, u, v; > + struct igt_vec4 yuv; > + struct igt_vec4 rgb; > + > + v = yuv24[i * planar_stride + > j*sizeof(uint32_t)]; > + u = yuv24[i * planar_stride + > j*sizeof(uint32_t) + 1]; > + y = yuv24[i * planar_stride + > j*sizeof(uint32_t) + 2]; > + yuv.d[0] = y; > + yuv.d[1] = u; > + yuv.d[2] = v; > + yuv.d[3] = 1.0f; > + > + rgb = igt_matrix_transform(&m, &yuv); > + > + write_rgb(&rgb24[i * rgb24_stride + > j*sizeof(uint32_t)], &rgb); > + } > + } > + > + free(buf); > +} > + > + > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct > fb_convert_blit_upload *blit) > +{ > + int i, j; > + uint8_t *rgb24; > + uint8_t *yuv444 = blit->linear.map; > + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = > blit->linear.stride; > + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb- > >color_encoding, > + fb- > >color_range); > + > + rgb24 = blit->rgb24.map; > + > + for (i = 0; i < fb->plane_height[0]; i++) { > + for (j = 0; j < fb->plane_width[0]; j++) { > + struct igt_vec4 rgb; > + struct igt_vec4 yuv; > + float y, u, v; > + > + read_rgb(&rgb, &rgb24[i * rgb24_stride + > j*sizeof(uint32_t)]); > + > + yuv = igt_matrix_transform(&m, &rgb); > + > + yuv444[i * planar_stride + > j*sizeof(uint32_t)] = yuv.d[2]; > + yuv444[i * planar_stride + > j*sizeof(uint32_t) + 1] = yuv.d[1]; > + yuv444[i * planar_stride + > j*sizeof(uint32_t) + 2] = yuv.d[0]; > + } > + } > +} > + > + > + > + > static void convert_rgb24_to_nv12(struct igt_fb *fb, struct > fb_convert_blit_upload *blit) > { > int i, j; > @@ -1756,6 +1837,9 @@ static void destroy_cairo_surface__convert(void > *arg) > case DRM_FORMAT_VYUY: > convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb- > >drm_format)); > break; > + case DRM_FORMAT_XYUV: > + convert_rgb24_to_yuv444(fb, blit); > + break; > default: > igt_assert_f(false, "Conversion not implemented for > formats 0x%x\n", > fb->drm_format); > @@ -1809,6 +1893,9 @@ static void create_cairo_surface__convert(int > fd, struct igt_fb *fb) > case DRM_FORMAT_VYUY: > convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb- > >drm_format)); > break; > + case DRM_FORMAT_XYUV: > + convert_yuv444_to_rgb24(fb, blit); > + break; > default: > igt_assert_f(false, "Conversion not implemented for > formats 0x%x\n", > fb->drm_format); > @@ -1825,6 +1912,7 @@ static void create_cairo_surface__convert(int > fd, struct igt_fb *fb) > blit, > destroy_cairo_surface__convert); > } > > + > /** > * igt_get_cairo_surface: > * @fd: open drm file descriptor > @@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t drm_format) > case DRM_FORMAT_YVYU: > case DRM_FORMAT_UYVY: > case DRM_FORMAT_VYUY: > + case DRM_FORMAT_XYUV: > return true; > default: > return false; -- Best Regards, Lisovskiy Stanislav _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing 2018-09-11 8:26 ` [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Lisovskiy, Stanislav @ 2018-09-11 12:50 ` Ville Syrjälä 2018-09-11 13:22 ` Lisovskiy, Stanislav 0 siblings, 1 reply; 7+ messages in thread From: Ville Syrjälä @ 2018-09-11 12:50 UTC (permalink / raw) To: Lisovskiy, Stanislav Cc: igt-dev@lists.freedesktop.org, Syrjala, Ville, Peres, Martin On Tue, Sep 11, 2018 at 08:26:29AM +0000, Lisovskiy, Stanislav wrote: > On Mon, 2018-09-10 at 13:03 +0300, Stanislav Lisovskiy wrote: > > XYUV format support has been added to DRM, modified > > IGT to reflect those changes. > > > > v2: Fixed merge conflict, started to use new yuv<=>rgb > > conversion functions. > > > > v3: Fixed kms_available_modes_crc test to support new XYUV > > format. Fixed a problem, where test complains that two > > outputs might use same pipe at the same time. > > > > v4: Fixed convertion procedure in igt_fb to support XYUV > > properly. > > > > v5: Fixed a coding typo. > > Minor comment: this change will fail all test cases where > drmModeAddFB2 is called with DRM_FORMAT_XYUV until correspondent > kernel patch is not in use, as many igt test cases do not check > if that kernel format is supported or not, so drmModeAddFB2 will > simply fail. Which tests are those? They should be fixed. > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> > > --- > > include/drm-uapi/drm_fourcc.h | 1 + > > lib/igt_fb.c | 89 > > +++++++++++++++++++++++++++++++++++ > > 2 files changed, 90 insertions(+) > > > > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm- > > uapi/drm_fourcc.h > > index e04613d3..0bf66de2 100644 > > --- a/include/drm-uapi/drm_fourcc.h > > +++ b/include/drm-uapi/drm_fourcc.h > > @@ -112,6 +112,7 @@ extern "C" { > > #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', > > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ > > > > #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', > > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ > > +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', 'U', > > 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ > > > > /* > > * 2 plane RGB + A > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c > > index ae71d967..b60b73b4 100644 > > --- a/lib/igt_fb.c > > +++ b/lib/igt_fb.c > > @@ -72,6 +72,10 @@ static struct format_desc_struct { > > .cairo_id = CAIRO_FORMAT_RGB16_565, > > .num_planes = 1, .plane_bpp = { 16, }, > > }, > > + { .name = "XYUV", .depth = 24, .drm_id = DRM_FORMAT_XYUV, > > + .cairo_id = CAIRO_FORMAT_RGB24, > > + .num_planes = 1, .plane_bpp = { 32, }, > > + }, > > { .name = "XRGB8888", .depth = 24, .drm_id = > > DRM_FORMAT_XRGB8888, > > .cairo_id = CAIRO_FORMAT_RGB24, > > .num_planes = 1, .plane_bpp = { 32, }, > > @@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int width, > > int height, > > memset(ptr + offsets[1], 0x80, > > calculated_stride * > > height/2); > > break; > > + case DRM_FORMAT_XYUV: > > + wmemset(ptr, full_range ? 0x000f8080 > > : 0x000f8080, > > + calculated_stride * height / > > sizeof(wchar_t)); > > + break; > > case DRM_FORMAT_YUYV: > > case DRM_FORMAT_YVYU: > > wmemset(ptr, full_range ? 0x80008000 > > : 0x80108010, > > @@ -1500,6 +1508,79 @@ static void convert_nv12_to_rgb24(struct > > igt_fb *fb, struct fb_convert_blit_uplo > > free(buf); > > } > > > > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct > > fb_convert_blit_upload *blit) > > +{ > > + int i, j; > > + uint8_t *yuv24; > > + uint8_t *rgb24 = blit->rgb24.map; > > + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = > > blit->linear.stride; > > + uint8_t *buf = malloc(blit->linear.size); > > + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb- > > >color_encoding, > > + fb- > > >color_range); > > + > > + /* > > + * Reading from the BO is awfully slow because of lack of > > read caching, > > + * it's faster to copy the whole BO to a temporary buffer > > and convert > > + * from there. > > + */ > > + igt_memcpy_from_wc(buf, blit->linear.map, blit- > > >linear.size); > > + yuv24 = &buf[blit->linear.offsets[0]]; > > + > > + for (i = 0; i < fb->plane_height[0]; i++) { > > + for (j = 0; j < fb->plane_width[0]; j++) { > > + float y, u, v; > > + struct igt_vec4 yuv; > > + struct igt_vec4 rgb; > > + > > + v = yuv24[i * planar_stride + > > j*sizeof(uint32_t)]; > > + u = yuv24[i * planar_stride + > > j*sizeof(uint32_t) + 1]; > > + y = yuv24[i * planar_stride + > > j*sizeof(uint32_t) + 2]; > > + yuv.d[0] = y; > > + yuv.d[1] = u; > > + yuv.d[2] = v; > > + yuv.d[3] = 1.0f; > > + > > + rgb = igt_matrix_transform(&m, &yuv); > > + > > + write_rgb(&rgb24[i * rgb24_stride + > > j*sizeof(uint32_t)], &rgb); > > + } > > + } > > + > > + free(buf); > > +} > > + > > + > > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct > > fb_convert_blit_upload *blit) > > +{ > > + int i, j; > > + uint8_t *rgb24; > > + uint8_t *yuv444 = blit->linear.map; > > + unsigned rgb24_stride = blit->rgb24.stride, planar_stride = > > blit->linear.stride; > > + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb- > > >color_encoding, > > + fb- > > >color_range); > > + > > + rgb24 = blit->rgb24.map; > > + > > + for (i = 0; i < fb->plane_height[0]; i++) { > > + for (j = 0; j < fb->plane_width[0]; j++) { > > + struct igt_vec4 rgb; > > + struct igt_vec4 yuv; > > + float y, u, v; > > + > > + read_rgb(&rgb, &rgb24[i * rgb24_stride + > > j*sizeof(uint32_t)]); > > + > > + yuv = igt_matrix_transform(&m, &rgb); > > + > > + yuv444[i * planar_stride + > > j*sizeof(uint32_t)] = yuv.d[2]; > > + yuv444[i * planar_stride + > > j*sizeof(uint32_t) + 1] = yuv.d[1]; > > + yuv444[i * planar_stride + > > j*sizeof(uint32_t) + 2] = yuv.d[0]; > > + } > > + } > > +} > > + > > + > > + > > + > > static void convert_rgb24_to_nv12(struct igt_fb *fb, struct > > fb_convert_blit_upload *blit) > > { > > int i, j; > > @@ -1756,6 +1837,9 @@ static void destroy_cairo_surface__convert(void > > *arg) > > case DRM_FORMAT_VYUY: > > convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb- > > >drm_format)); > > break; > > + case DRM_FORMAT_XYUV: > > + convert_rgb24_to_yuv444(fb, blit); > > + break; > > default: > > igt_assert_f(false, "Conversion not implemented for > > formats 0x%x\n", > > fb->drm_format); > > @@ -1809,6 +1893,9 @@ static void create_cairo_surface__convert(int > > fd, struct igt_fb *fb) > > case DRM_FORMAT_VYUY: > > convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb- > > >drm_format)); > > break; > > + case DRM_FORMAT_XYUV: > > + convert_yuv444_to_rgb24(fb, blit); > > + break; > > default: > > igt_assert_f(false, "Conversion not implemented for > > formats 0x%x\n", > > fb->drm_format); > > @@ -1825,6 +1912,7 @@ static void create_cairo_surface__convert(int > > fd, struct igt_fb *fb) > > blit, > > destroy_cairo_surface__convert); > > } > > > > + > > /** > > * igt_get_cairo_surface: > > * @fd: open drm file descriptor > > @@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t drm_format) > > case DRM_FORMAT_YVYU: > > case DRM_FORMAT_UYVY: > > case DRM_FORMAT_VYUY: > > + case DRM_FORMAT_XYUV: > > return true; > > default: > > return false; > -- > Best Regards, > > Lisovskiy Stanislav > _______________________________________________ > igt-dev mailing list > igt-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/igt-dev -- Ville Syrjälä Intel _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing 2018-09-11 12:50 ` Ville Syrjälä @ 2018-09-11 13:22 ` Lisovskiy, Stanislav 2018-09-11 15:47 ` Ville Syrjälä 0 siblings, 1 reply; 7+ messages in thread From: Lisovskiy, Stanislav @ 2018-09-11 13:22 UTC (permalink / raw) To: ville.syrjala@linux.intel.com Cc: igt-dev@lists.freedesktop.org, Syrjala, Ville, Peres, Martin On Tue, 2018-09-11 at 15:50 +0300, Ville Syrjälä wrote: > On Tue, Sep 11, 2018 at 08:26:29AM +0000, Lisovskiy, Stanislav wrote: > > On Mon, 2018-09-10 at 13:03 +0300, Stanislav Lisovskiy wrote: > > > XYUV format support has been added to DRM, modified > > > IGT to reflect those changes. > > > > > > v2: Fixed merge conflict, started to use new yuv<=>rgb > > > conversion functions. > > > > > > v3: Fixed kms_available_modes_crc test to support new XYUV > > > format. Fixed a problem, where test complains that two > > > outputs might use same pipe at the same time. > > > > > > v4: Fixed convertion procedure in igt_fb to support XYUV > > > properly. > > > > > > v5: Fixed a coding typo. > > > > Minor comment: this change will fail all test cases where > > drmModeAddFB2 is called with DRM_FORMAT_XYUV until correspondent > > kernel patch is not in use, as many igt test cases do not check > > if that kernel format is supported or not, so drmModeAddFB2 will > > simply fail. > > Which tests are those? They should be fixed. Those are: igt@kms_flip@basic-flip-vs-dpms igt@kms_flip@basic-flip-vs-modeset igt@kms_flip@basic-flip-vs-wf_vblank igt@kms_flip@basic-plain-flip igt@kms_setmode@basic-clone-single-crtc Probably good idea to fix it so that it chooses only formats specified in drm_plane->formats and igt_fb_supported_format, like in kms_plane. Otherwise for example in kms_flip, it uses igt_bpp_depth_to_drm_format which chooses any format with matching bpp and depth, which in case of XRGB8888, also is the same for XYUV. > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com > > > > > > > --- > > > include/drm-uapi/drm_fourcc.h | 1 + > > > lib/igt_fb.c | 89 > > > +++++++++++++++++++++++++++++++++++ > > > 2 files changed, 90 insertions(+) > > > > > > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm- > > > uapi/drm_fourcc.h > > > index e04613d3..0bf66de2 100644 > > > --- a/include/drm-uapi/drm_fourcc.h > > > +++ b/include/drm-uapi/drm_fourcc.h > > > @@ -112,6 +112,7 @@ extern "C" { > > > #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', > > > 'U', > > > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ > > > > > > #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', > > > 'U', > > > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ > > > +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', > > > 'U', > > > 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ > > > > > > /* > > > * 2 plane RGB + A > > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c > > > index ae71d967..b60b73b4 100644 > > > --- a/lib/igt_fb.c > > > +++ b/lib/igt_fb.c > > > @@ -72,6 +72,10 @@ static struct format_desc_struct { > > > .cairo_id = CAIRO_FORMAT_RGB16_565, > > > .num_planes = 1, .plane_bpp = { 16, }, > > > }, > > > + { .name = "XYUV", .depth = 24, .drm_id = > > > DRM_FORMAT_XYUV, > > > + .cairo_id = CAIRO_FORMAT_RGB24, > > > + .num_planes = 1, .plane_bpp = { 32, }, > > > + }, > > > { .name = "XRGB8888", .depth = 24, .drm_id = > > > DRM_FORMAT_XRGB8888, > > > .cairo_id = CAIRO_FORMAT_RGB24, > > > .num_planes = 1, .plane_bpp = { 32, }, > > > @@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int > > > width, > > > int height, > > > memset(ptr + offsets[1], 0x80, > > > calculated_stride * > > > height/2); > > > break; > > > + case DRM_FORMAT_XYUV: > > > + wmemset(ptr, full_range ? > > > 0x000f8080 > > > : 0x000f8080, > > > + calculated_stride * > > > height / > > > sizeof(wchar_t)); > > > + break; > > > case DRM_FORMAT_YUYV: > > > case DRM_FORMAT_YVYU: > > > wmemset(ptr, full_range ? > > > 0x80008000 > > > : 0x80108010, > > > @@ -1500,6 +1508,79 @@ static void convert_nv12_to_rgb24(struct > > > igt_fb *fb, struct fb_convert_blit_uplo > > > free(buf); > > > } > > > > > > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct > > > fb_convert_blit_upload *blit) > > > +{ > > > + int i, j; > > > + uint8_t *yuv24; > > > + uint8_t *rgb24 = blit->rgb24.map; > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > planar_stride = > > > blit->linear.stride; > > > + uint8_t *buf = malloc(blit->linear.size); > > > + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb- > > > > color_encoding, > > > > > > + fb- > > > > color_range); > > > > > > + > > > + /* > > > + * Reading from the BO is awfully slow because of lack > > > of > > > read caching, > > > + * it's faster to copy the whole BO to a temporary > > > buffer > > > and convert > > > + * from there. > > > + */ > > > + igt_memcpy_from_wc(buf, blit->linear.map, blit- > > > > linear.size); > > > > > > + yuv24 = &buf[blit->linear.offsets[0]]; > > > + > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > + float y, u, v; > > > + struct igt_vec4 yuv; > > > + struct igt_vec4 rgb; > > > + > > > + v = yuv24[i * planar_stride + > > > j*sizeof(uint32_t)]; > > > + u = yuv24[i * planar_stride + > > > j*sizeof(uint32_t) + 1]; > > > + y = yuv24[i * planar_stride + > > > j*sizeof(uint32_t) + 2]; > > > + yuv.d[0] = y; > > > + yuv.d[1] = u; > > > + yuv.d[2] = v; > > > + yuv.d[3] = 1.0f; > > > + > > > + rgb = igt_matrix_transform(&m, &yuv); > > > + > > > + write_rgb(&rgb24[i * rgb24_stride + > > > j*sizeof(uint32_t)], &rgb); > > > + } > > > + } > > > + > > > + free(buf); > > > +} > > > + > > > + > > > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct > > > fb_convert_blit_upload *blit) > > > +{ > > > + int i, j; > > > + uint8_t *rgb24; > > > + uint8_t *yuv444 = blit->linear.map; > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > planar_stride = > > > blit->linear.stride; > > > + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb- > > > > color_encoding, > > > > > > + fb- > > > > color_range); > > > > > > + > > > + rgb24 = blit->rgb24.map; > > > + > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > + struct igt_vec4 rgb; > > > + struct igt_vec4 yuv; > > > + float y, u, v; > > > + > > > + read_rgb(&rgb, &rgb24[i * rgb24_stride + > > > j*sizeof(uint32_t)]); > > > + > > > + yuv = igt_matrix_transform(&m, &rgb); > > > + > > > + yuv444[i * planar_stride + > > > j*sizeof(uint32_t)] = yuv.d[2]; > > > + yuv444[i * planar_stride + > > > j*sizeof(uint32_t) + 1] = yuv.d[1]; > > > + yuv444[i * planar_stride + > > > j*sizeof(uint32_t) + 2] = yuv.d[0]; > > > + } > > > + } > > > +} > > > + > > > + > > > + > > > + > > > static void convert_rgb24_to_nv12(struct igt_fb *fb, struct > > > fb_convert_blit_upload *blit) > > > { > > > int i, j; > > > @@ -1756,6 +1837,9 @@ static void > > > destroy_cairo_surface__convert(void > > > *arg) > > > case DRM_FORMAT_VYUY: > > > convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb- > > > > drm_format)); > > > > > > break; > > > + case DRM_FORMAT_XYUV: > > > + convert_rgb24_to_yuv444(fb, blit); > > > + break; > > > default: > > > igt_assert_f(false, "Conversion not implemented > > > for > > > formats 0x%x\n", > > > fb->drm_format); > > > @@ -1809,6 +1893,9 @@ static void > > > create_cairo_surface__convert(int > > > fd, struct igt_fb *fb) > > > case DRM_FORMAT_VYUY: > > > convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb- > > > > drm_format)); > > > > > > break; > > > + case DRM_FORMAT_XYUV: > > > + convert_yuv444_to_rgb24(fb, blit); > > > + break; > > > default: > > > igt_assert_f(false, "Conversion not implemented > > > for > > > formats 0x%x\n", > > > fb->drm_format); > > > @@ -1825,6 +1912,7 @@ static void > > > create_cairo_surface__convert(int > > > fd, struct igt_fb *fb) > > > blit, > > > destroy_cairo_surface__convert); > > > } > > > > > > + > > > /** > > > * igt_get_cairo_surface: > > > * @fd: open drm file descriptor > > > @@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t drm_format) > > > case DRM_FORMAT_YVYU: > > > case DRM_FORMAT_UYVY: > > > case DRM_FORMAT_VYUY: > > > + case DRM_FORMAT_XYUV: > > > return true; > > > default: > > > return false; > > > > -- > > Best Regards, > > > > Lisovskiy Stanislav > > _______________________________________________ > > igt-dev mailing list > > igt-dev@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/igt-dev > > -- Best Regards, Lisovskiy Stanislav _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing 2018-09-11 13:22 ` Lisovskiy, Stanislav @ 2018-09-11 15:47 ` Ville Syrjälä 2018-09-12 7:25 ` Lisovskiy, Stanislav 0 siblings, 1 reply; 7+ messages in thread From: Ville Syrjälä @ 2018-09-11 15:47 UTC (permalink / raw) To: Lisovskiy, Stanislav Cc: igt-dev@lists.freedesktop.org, Syrjala, Ville, Peres, Martin On Tue, Sep 11, 2018 at 01:22:23PM +0000, Lisovskiy, Stanislav wrote: > On Tue, 2018-09-11 at 15:50 +0300, Ville Syrjälä wrote: > > On Tue, Sep 11, 2018 at 08:26:29AM +0000, Lisovskiy, Stanislav wrote: > > > On Mon, 2018-09-10 at 13:03 +0300, Stanislav Lisovskiy wrote: > > > > XYUV format support has been added to DRM, modified > > > > IGT to reflect those changes. > > > > > > > > v2: Fixed merge conflict, started to use new yuv<=>rgb > > > > conversion functions. > > > > > > > > v3: Fixed kms_available_modes_crc test to support new XYUV > > > > format. Fixed a problem, where test complains that two > > > > outputs might use same pipe at the same time. > > > > > > > > v4: Fixed convertion procedure in igt_fb to support XYUV > > > > properly. > > > > > > > > v5: Fixed a coding typo. > > > > > > Minor comment: this change will fail all test cases where > > > drmModeAddFB2 is called with DRM_FORMAT_XYUV until correspondent > > > kernel patch is not in use, as many igt test cases do not check > > > if that kernel format is supported or not, so drmModeAddFB2 will > > > simply fail. > > > > Which tests are those? They should be fixed. > > Those are: > > igt@kms_flip@basic-flip-vs-dpms > > igt@kms_flip@basic-flip-vs-modeset > > igt@kms_flip@basic-flip-vs-wf_vblank > > igt@kms_flip@basic-plain-flip > > igt@kms_setmode@basic-clone-single-crtc > > Probably good idea to fix it so that it chooses only formats > specified in drm_plane->formats and igt_fb_supported_format, like in > kms_plane. > Otherwise for example in kms_flip, it uses igt_bpp_depth_to_drm_format > which chooses any format with matching bpp and depth, which in case of > XRGB8888, also is the same for XYUV. IIRC all YUV formats should have a depth of -1 in that table, pretty much exactly for this reason. You never want to pick an YUV format when just specifying depth/bpp. > > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com > > > > > > > > > --- > > > > include/drm-uapi/drm_fourcc.h | 1 + > > > > lib/igt_fb.c | 89 > > > > +++++++++++++++++++++++++++++++++++ > > > > 2 files changed, 90 insertions(+) > > > > > > > > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm- > > > > uapi/drm_fourcc.h > > > > index e04613d3..0bf66de2 100644 > > > > --- a/include/drm-uapi/drm_fourcc.h > > > > +++ b/include/drm-uapi/drm_fourcc.h > > > > @@ -112,6 +112,7 @@ extern "C" { > > > > #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', > > > > 'U', > > > > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ > > > > > > > > #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', > > > > 'U', > > > > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ > > > > +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', > > > > 'U', > > > > 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ > > > > > > > > /* > > > > * 2 plane RGB + A > > > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c > > > > index ae71d967..b60b73b4 100644 > > > > --- a/lib/igt_fb.c > > > > +++ b/lib/igt_fb.c > > > > @@ -72,6 +72,10 @@ static struct format_desc_struct { > > > > .cairo_id = CAIRO_FORMAT_RGB16_565, > > > > .num_planes = 1, .plane_bpp = { 16, }, > > > > }, > > > > + { .name = "XYUV", .depth = 24, .drm_id = > > > > DRM_FORMAT_XYUV, > > > > + .cairo_id = CAIRO_FORMAT_RGB24, > > > > + .num_planes = 1, .plane_bpp = { 32, }, > > > > + }, > > > > { .name = "XRGB8888", .depth = 24, .drm_id = > > > > DRM_FORMAT_XRGB8888, > > > > .cairo_id = CAIRO_FORMAT_RGB24, > > > > .num_planes = 1, .plane_bpp = { 32, }, > > > > @@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int > > > > width, > > > > int height, > > > > memset(ptr + offsets[1], 0x80, > > > > calculated_stride * > > > > height/2); > > > > break; > > > > + case DRM_FORMAT_XYUV: > > > > + wmemset(ptr, full_range ? > > > > 0x000f8080 > > > > : 0x000f8080, > > > > + calculated_stride * > > > > height / > > > > sizeof(wchar_t)); > > > > + break; > > > > case DRM_FORMAT_YUYV: > > > > case DRM_FORMAT_YVYU: > > > > wmemset(ptr, full_range ? > > > > 0x80008000 > > > > : 0x80108010, > > > > @@ -1500,6 +1508,79 @@ static void convert_nv12_to_rgb24(struct > > > > igt_fb *fb, struct fb_convert_blit_uplo > > > > free(buf); > > > > } > > > > > > > > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, struct > > > > fb_convert_blit_upload *blit) > > > > +{ > > > > + int i, j; > > > > + uint8_t *yuv24; > > > > + uint8_t *rgb24 = blit->rgb24.map; > > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > > planar_stride = > > > > blit->linear.stride; > > > > + uint8_t *buf = malloc(blit->linear.size); > > > > + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb- > > > > > color_encoding, > > > > > > > > + fb- > > > > > color_range); > > > > > > > > + > > > > + /* > > > > + * Reading from the BO is awfully slow because of lack > > > > of > > > > read caching, > > > > + * it's faster to copy the whole BO to a temporary > > > > buffer > > > > and convert > > > > + * from there. > > > > + */ > > > > + igt_memcpy_from_wc(buf, blit->linear.map, blit- > > > > > linear.size); > > > > > > > > + yuv24 = &buf[blit->linear.offsets[0]]; > > > > + > > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > > + float y, u, v; > > > > + struct igt_vec4 yuv; > > > > + struct igt_vec4 rgb; > > > > + > > > > + v = yuv24[i * planar_stride + > > > > j*sizeof(uint32_t)]; > > > > + u = yuv24[i * planar_stride + > > > > j*sizeof(uint32_t) + 1]; > > > > + y = yuv24[i * planar_stride + > > > > j*sizeof(uint32_t) + 2]; > > > > + yuv.d[0] = y; > > > > + yuv.d[1] = u; > > > > + yuv.d[2] = v; > > > > + yuv.d[3] = 1.0f; > > > > + > > > > + rgb = igt_matrix_transform(&m, &yuv); > > > > + > > > > + write_rgb(&rgb24[i * rgb24_stride + > > > > j*sizeof(uint32_t)], &rgb); > > > > + } > > > > + } > > > > + > > > > + free(buf); > > > > +} > > > > + > > > > + > > > > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, struct > > > > fb_convert_blit_upload *blit) > > > > +{ > > > > + int i, j; > > > > + uint8_t *rgb24; > > > > + uint8_t *yuv444 = blit->linear.map; > > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > > planar_stride = > > > > blit->linear.stride; > > > > + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb- > > > > > color_encoding, > > > > > > > > + fb- > > > > > color_range); > > > > > > > > + > > > > + rgb24 = blit->rgb24.map; > > > > + > > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > > + struct igt_vec4 rgb; > > > > + struct igt_vec4 yuv; > > > > + float y, u, v; > > > > + > > > > + read_rgb(&rgb, &rgb24[i * rgb24_stride + > > > > j*sizeof(uint32_t)]); > > > > + > > > > + yuv = igt_matrix_transform(&m, &rgb); > > > > + > > > > + yuv444[i * planar_stride + > > > > j*sizeof(uint32_t)] = yuv.d[2]; > > > > + yuv444[i * planar_stride + > > > > j*sizeof(uint32_t) + 1] = yuv.d[1]; > > > > + yuv444[i * planar_stride + > > > > j*sizeof(uint32_t) + 2] = yuv.d[0]; > > > > + } > > > > + } > > > > +} > > > > + > > > > + > > > > + > > > > + > > > > static void convert_rgb24_to_nv12(struct igt_fb *fb, struct > > > > fb_convert_blit_upload *blit) > > > > { > > > > int i, j; > > > > @@ -1756,6 +1837,9 @@ static void > > > > destroy_cairo_surface__convert(void > > > > *arg) > > > > case DRM_FORMAT_VYUY: > > > > convert_rgb24_to_yuyv(fb, blit, yuyv_swizzle(fb- > > > > > drm_format)); > > > > > > > > break; > > > > + case DRM_FORMAT_XYUV: > > > > + convert_rgb24_to_yuv444(fb, blit); > > > > + break; > > > > default: > > > > igt_assert_f(false, "Conversion not implemented > > > > for > > > > formats 0x%x\n", > > > > fb->drm_format); > > > > @@ -1809,6 +1893,9 @@ static void > > > > create_cairo_surface__convert(int > > > > fd, struct igt_fb *fb) > > > > case DRM_FORMAT_VYUY: > > > > convert_yuyv_to_rgb24(fb, blit, yuyv_swizzle(fb- > > > > > drm_format)); > > > > > > > > break; > > > > + case DRM_FORMAT_XYUV: > > > > + convert_yuv444_to_rgb24(fb, blit); > > > > + break; > > > > default: > > > > igt_assert_f(false, "Conversion not implemented > > > > for > > > > formats 0x%x\n", > > > > fb->drm_format); > > > > @@ -1825,6 +1912,7 @@ static void > > > > create_cairo_surface__convert(int > > > > fd, struct igt_fb *fb) > > > > blit, > > > > destroy_cairo_surface__convert); > > > > } > > > > > > > > + > > > > /** > > > > * igt_get_cairo_surface: > > > > * @fd: open drm file descriptor > > > > @@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t drm_format) > > > > case DRM_FORMAT_YVYU: > > > > case DRM_FORMAT_UYVY: > > > > case DRM_FORMAT_VYUY: > > > > + case DRM_FORMAT_XYUV: > > > > return true; > > > > default: > > > > return false; > > > > > > -- > > > Best Regards, > > > > > > Lisovskiy Stanislav > > > _______________________________________________ > > > igt-dev mailing list > > > igt-dev@lists.freedesktop.org > > > https://lists.freedesktop.org/mailman/listinfo/igt-dev > > > > > -- > Best Regards, > > Lisovskiy Stanislav -- Ville Syrjälä Intel _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing 2018-09-11 15:47 ` Ville Syrjälä @ 2018-09-12 7:25 ` Lisovskiy, Stanislav 0 siblings, 0 replies; 7+ messages in thread From: Lisovskiy, Stanislav @ 2018-09-12 7:25 UTC (permalink / raw) To: ville.syrjala@linux.intel.com Cc: igt-dev@lists.freedesktop.org, Syrjala, Ville, Peres, Martin On Tue, 2018-09-11 at 18:47 +0300, Ville Syrjälä wrote: > On Tue, Sep 11, 2018 at 01:22:23PM +0000, Lisovskiy, Stanislav wrote: > > On Tue, 2018-09-11 at 15:50 +0300, Ville Syrjälä wrote: > > > On Tue, Sep 11, 2018 at 08:26:29AM +0000, Lisovskiy, Stanislav > > > wrote: > > > > On Mon, 2018-09-10 at 13:03 +0300, Stanislav Lisovskiy wrote: > > > > > XYUV format support has been added to DRM, modified > > > > > IGT to reflect those changes. > > > > > > > > > > v2: Fixed merge conflict, started to use new yuv<=>rgb > > > > > conversion functions. > > > > > > > > > > v3: Fixed kms_available_modes_crc test to support new XYUV > > > > > format. Fixed a problem, where test complains that two > > > > > outputs might use same pipe at the same time. > > > > > > > > > > v4: Fixed convertion procedure in igt_fb to support XYUV > > > > > properly. > > > > > > > > > > v5: Fixed a coding typo. > > > > > > > > Minor comment: this change will fail all test cases where > > > > drmModeAddFB2 is called with DRM_FORMAT_XYUV until > > > > correspondent > > > > kernel patch is not in use, as many igt test cases do not check > > > > if that kernel format is supported or not, so drmModeAddFB2 > > > > will > > > > simply fail. > > > > > > Which tests are those? They should be fixed. > > > > Those are: > > > > igt@kms_flip@basic-flip-vs-dpms > > > > igt@kms_flip@basic-flip-vs-modeset > > > > igt@kms_flip@basic-flip-vs-wf_vblank > > > > igt@kms_flip@basic-plain-flip > > > > igt@kms_setmode@basic-clone-single-crtc > > > > Probably good idea to fix it so that it chooses only formats > > specified in drm_plane->formats and igt_fb_supported_format, like > > in > > kms_plane. > > Otherwise for example in kms_flip, it uses > > igt_bpp_depth_to_drm_format > > which chooses any format with matching bpp and depth, which in case > > of > > XRGB8888, also is the same for XYUV. > > IIRC all YUV formats should have a depth of -1 in that table, pretty > much exactly for this reason. You never want to pick an YUV format > when > just specifying depth/bpp. Ok, this sounds much easier. I will change it to -1 then and check that it still works after that. > > > > > > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel > > > > > .com > > > > > > > > > > > > > > > > --- > > > > > include/drm-uapi/drm_fourcc.h | 1 + > > > > > lib/igt_fb.c | 89 > > > > > +++++++++++++++++++++++++++++++++++ > > > > > 2 files changed, 90 insertions(+) > > > > > > > > > > diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm- > > > > > uapi/drm_fourcc.h > > > > > index e04613d3..0bf66de2 100644 > > > > > --- a/include/drm-uapi/drm_fourcc.h > > > > > +++ b/include/drm-uapi/drm_fourcc.h > > > > > @@ -112,6 +112,7 @@ extern "C" { > > > > > #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', > > > > > 'U', > > > > > 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ > > > > > > > > > > #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', > > > > > 'U', > > > > > 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ > > > > > +#define DRM_FORMAT_XYUV fourcc_code('X', 'Y', > > > > > 'U', > > > > > 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ > > > > > > > > > > /* > > > > > * 2 plane RGB + A > > > > > diff --git a/lib/igt_fb.c b/lib/igt_fb.c > > > > > index ae71d967..b60b73b4 100644 > > > > > --- a/lib/igt_fb.c > > > > > +++ b/lib/igt_fb.c > > > > > @@ -72,6 +72,10 @@ static struct format_desc_struct { > > > > > .cairo_id = CAIRO_FORMAT_RGB16_565, > > > > > .num_planes = 1, .plane_bpp = { 16, }, > > > > > }, > > > > > + { .name = "XYUV", .depth = 24, .drm_id = > > > > > DRM_FORMAT_XYUV, > > > > > + .cairo_id = CAIRO_FORMAT_RGB24, > > > > > + .num_planes = 1, .plane_bpp = { 32, }, > > > > > + }, > > > > > { .name = "XRGB8888", .depth = 24, .drm_id = > > > > > DRM_FORMAT_XRGB8888, > > > > > .cairo_id = CAIRO_FORMAT_RGB24, > > > > > .num_planes = 1, .plane_bpp = { 32, }, > > > > > @@ -415,6 +419,10 @@ static int create_bo_for_fb(int fd, int > > > > > width, > > > > > int height, > > > > > memset(ptr + offsets[1], > > > > > 0x80, > > > > > calculated_stride * > > > > > height/2); > > > > > break; > > > > > + case DRM_FORMAT_XYUV: > > > > > + wmemset(ptr, full_range ? > > > > > 0x000f8080 > > > > > : 0x000f8080, > > > > > + calculated_stride * > > > > > height / > > > > > sizeof(wchar_t)); > > > > > + break; > > > > > case DRM_FORMAT_YUYV: > > > > > case DRM_FORMAT_YVYU: > > > > > wmemset(ptr, full_range ? > > > > > 0x80008000 > > > > > : 0x80108010, > > > > > @@ -1500,6 +1508,79 @@ static void > > > > > convert_nv12_to_rgb24(struct > > > > > igt_fb *fb, struct fb_convert_blit_uplo > > > > > free(buf); > > > > > } > > > > > > > > > > +static void convert_yuv444_to_rgb24(struct igt_fb *fb, > > > > > struct > > > > > fb_convert_blit_upload *blit) > > > > > +{ > > > > > + int i, j; > > > > > + uint8_t *yuv24; > > > > > + uint8_t *rgb24 = blit->rgb24.map; > > > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > > > planar_stride = > > > > > blit->linear.stride; > > > > > + uint8_t *buf = malloc(blit->linear.size); > > > > > + struct igt_mat4 m = igt_ycbcr_to_rgb_matrix(fb- > > > > > > color_encoding, > > > > > > > > > > + fb- > > > > > > color_range); > > > > > > > > > > + > > > > > + /* > > > > > + * Reading from the BO is awfully slow because of > > > > > lack > > > > > of > > > > > read caching, > > > > > + * it's faster to copy the whole BO to a temporary > > > > > buffer > > > > > and convert > > > > > + * from there. > > > > > + */ > > > > > + igt_memcpy_from_wc(buf, blit->linear.map, blit- > > > > > > linear.size); > > > > > > > > > > + yuv24 = &buf[blit->linear.offsets[0]]; > > > > > + > > > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > > > + float y, u, v; > > > > > + struct igt_vec4 yuv; > > > > > + struct igt_vec4 rgb; > > > > > + > > > > > + v = yuv24[i * planar_stride + > > > > > j*sizeof(uint32_t)]; > > > > > + u = yuv24[i * planar_stride + > > > > > j*sizeof(uint32_t) + 1]; > > > > > + y = yuv24[i * planar_stride + > > > > > j*sizeof(uint32_t) + 2]; > > > > > + yuv.d[0] = y; > > > > > + yuv.d[1] = u; > > > > > + yuv.d[2] = v; > > > > > + yuv.d[3] = 1.0f; > > > > > + > > > > > + rgb = igt_matrix_transform(&m, > > > > > &yuv); > > > > > + > > > > > + write_rgb(&rgb24[i * rgb24_stride + > > > > > j*sizeof(uint32_t)], &rgb); > > > > > + } > > > > > + } > > > > > + > > > > > + free(buf); > > > > > +} > > > > > + > > > > > + > > > > > +static void convert_rgb24_to_yuv444(struct igt_fb *fb, > > > > > struct > > > > > fb_convert_blit_upload *blit) > > > > > +{ > > > > > + int i, j; > > > > > + uint8_t *rgb24; > > > > > + uint8_t *yuv444 = blit->linear.map; > > > > > + unsigned rgb24_stride = blit->rgb24.stride, > > > > > planar_stride = > > > > > blit->linear.stride; > > > > > + struct igt_mat4 m = igt_rgb_to_ycbcr_matrix(fb- > > > > > > color_encoding, > > > > > > > > > > + fb- > > > > > > color_range); > > > > > > > > > > + > > > > > + rgb24 = blit->rgb24.map; > > > > > + > > > > > + for (i = 0; i < fb->plane_height[0]; i++) { > > > > > + for (j = 0; j < fb->plane_width[0]; j++) { > > > > > + struct igt_vec4 rgb; > > > > > + struct igt_vec4 yuv; > > > > > + float y, u, v; > > > > > + > > > > > + read_rgb(&rgb, &rgb24[i * > > > > > rgb24_stride + > > > > > j*sizeof(uint32_t)]); > > > > > + > > > > > + yuv = igt_matrix_transform(&m, > > > > > &rgb); > > > > > + > > > > > + yuv444[i * planar_stride + > > > > > j*sizeof(uint32_t)] = yuv.d[2]; > > > > > + yuv444[i * planar_stride + > > > > > j*sizeof(uint32_t) + 1] = yuv.d[1]; > > > > > + yuv444[i * planar_stride + > > > > > j*sizeof(uint32_t) + 2] = yuv.d[0]; > > > > > + } > > > > > + } > > > > > +} > > > > > + > > > > > + > > > > > + > > > > > + > > > > > static void convert_rgb24_to_nv12(struct igt_fb *fb, struct > > > > > fb_convert_blit_upload *blit) > > > > > { > > > > > int i, j; > > > > > @@ -1756,6 +1837,9 @@ static void > > > > > destroy_cairo_surface__convert(void > > > > > *arg) > > > > > case DRM_FORMAT_VYUY: > > > > > convert_rgb24_to_yuyv(fb, blit, > > > > > yuyv_swizzle(fb- > > > > > > drm_format)); > > > > > > > > > > break; > > > > > + case DRM_FORMAT_XYUV: > > > > > + convert_rgb24_to_yuv444(fb, blit); > > > > > + break; > > > > > default: > > > > > igt_assert_f(false, "Conversion not > > > > > implemented > > > > > for > > > > > formats 0x%x\n", > > > > > fb->drm_format); > > > > > @@ -1809,6 +1893,9 @@ static void > > > > > create_cairo_surface__convert(int > > > > > fd, struct igt_fb *fb) > > > > > case DRM_FORMAT_VYUY: > > > > > convert_yuyv_to_rgb24(fb, blit, > > > > > yuyv_swizzle(fb- > > > > > > drm_format)); > > > > > > > > > > break; > > > > > + case DRM_FORMAT_XYUV: > > > > > + convert_yuv444_to_rgb24(fb, blit); > > > > > + break; > > > > > default: > > > > > igt_assert_f(false, "Conversion not > > > > > implemented > > > > > for > > > > > formats 0x%x\n", > > > > > fb->drm_format); > > > > > @@ -1825,6 +1912,7 @@ static void > > > > > create_cairo_surface__convert(int > > > > > fd, struct igt_fb *fb) > > > > > blit, > > > > > destroy_cairo_surface__convert); > > > > > } > > > > > > > > > > + > > > > > /** > > > > > * igt_get_cairo_surface: > > > > > * @fd: open drm file descriptor > > > > > @@ -2011,6 +2099,7 @@ bool igt_format_is_yuv(uint32_t > > > > > drm_format) > > > > > case DRM_FORMAT_YVYU: > > > > > case DRM_FORMAT_UYVY: > > > > > case DRM_FORMAT_VYUY: > > > > > + case DRM_FORMAT_XYUV: > > > > > return true; > > > > > default: > > > > > return false; > > > > > > > > -- > > > > Best Regards, > > > > > > > > Lisovskiy Stanislav > > > > _______________________________________________ > > > > igt-dev mailing list > > > > igt-dev@lists.freedesktop.org > > > > https://lists.freedesktop.org/mailman/listinfo/igt-dev > > > > > > > > > > -- > > Best Regards, > > > > Lisovskiy Stanislav > > -- Best Regards, Lisovskiy Stanislav _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-09-12 7:25 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-09-10 10:03 [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Stanislav Lisovskiy 2018-09-10 16:29 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_fb: Added XYUV format support for testing (rev5) Patchwork 2018-09-11 8:26 ` [igt-dev] [PATCH i-g-t v5] lib/igt_fb: Added XYUV format support for testing Lisovskiy, Stanislav 2018-09-11 12:50 ` Ville Syrjälä 2018-09-11 13:22 ` Lisovskiy, Stanislav 2018-09-11 15:47 ` Ville Syrjälä 2018-09-12 7:25 ` Lisovskiy, Stanislav
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox