[PATCH weston v9 01/62] libweston: Add pixel-format helpers
Emil Velikov
emil.l.velikov at gmail.com
Thu Mar 9 22:57:51 UTC 2017
Hi Daniel,
So was feeling a bit bored and decided to remind myself about all the
crazy formats out there :-)
I believe you've got a couple of mistakes, plus there's a couple of
questions/ideas below.
Note that handful of those are inspired by now format info is stored in DRM.
On 3 March 2017 at 23:05, Daniel Stone <daniels at collabora.com> wrote:
> --- /dev/null
> +++ b/libweston/pixel-formats.c
+#include <drm/drm_fourcc.h>
Err... please don't.
This will include the kernel copy of the header while we want to use
the libdrm one -> <drm_fourcc.h>
> +static const struct pixel_format_info pixel_format_table[] = {
> + .format = DRM_FORMAT_YUYV,
> + .sampler_type = EGL_TEXTURE_Y_XUXV_WL,
> + .num_planes = 1,
> + .hsub = 2,
> + },
> + {
> + .format = DRM_FORMAT_YVYU,
> + .sampler_type = EGL_TEXTURE_Y_XUXV_WL,
> + .num_planes = 1,
> + .chroma_order = ORDER_VU,
> + .hsub = 2,
> + },
> + {
> + .format = DRM_FORMAT_UYVY,
> + .sampler_type = EGL_TEXTURE_Y_XUXV_WL,
> + .num_planes = 1,
> + .luma_chroma_order = ORDER_CHROMA_LUMA,
> + },
> + {
> + .format = DRM_FORMAT_VYUY,
> + .sampler_type = EGL_TEXTURE_Y_XUXV_WL,
> + .num_planes = 1,
> + .luma_chroma_order = ORDER_CHROMA_LUMA,
> + .chroma_order = ORDER_VU,
All of these four should all have hsub = 2, afaict. The only
difference between them is the order in which the components are
stored.
> + },
> + {
> + /* our one format with an alpha channel and no opaque equiv;
> + * also cannot be trivially converted to RGB without writing
> + * a new shader in gl-renderer */
> + .format = DRM_FORMAT_AYUV,
> + .sampler_type = EGL_TEXTURE_Y_XUXV_WL,
> + .num_planes = 1,
> + },
According to WL_bind_wayland_display and the i965/i915 drivers
(afaict) above five should have two planes. Then again, the FOURCC and
DRM formats are pretty clear that we're talking about a packed format
in a single plain... Did you test these, do we have a spec bug, is the
i915/i965 iimplementation working/been tested ?
Seems like DRM_FORMAT_AYUV is going to act strange with the
pixel_format_is_opaque() helper. As-in latter will return true,
despite the format has alpha.
> + {
> + .format = DRM_FORMAT_NV16,
> + .sampler_type = EGL_TEXTURE_Y_UV_WL,
> + .num_planes = 2,
> + .hsub = 2,
> + .vsub = 1,
> + },
> + {
> + .format = DRM_FORMAT_NV61,
> + .sampler_type = EGL_TEXTURE_Y_UV_WL,
> + .num_planes = 2,
> + .chroma_order = ORDER_VU,
> + .hsub = 2,
> + .vsub = 1,
> + },
Might be the only person, who finds the mixed use of 0 and 1 as
[hv]sub sampling confusing.
Strictly peaking 1x1 is equivalent no subsampling, hence why we have
0's below (NV24/42). At the same time, for the single plain packed
formats we only specify the hsub, even though we should also mention
vsub [=1].
For simplicity (?) the kernel provides 1, when there's no
{v,h}sub-sampling. Worth using same the approach here ?
> +struct pixel_format_info {
> + /** How the format should be sampled, expressed in terms of tokens
> + * from the EGL_WL_bind_wayland_display extension. If not set,
> + * assumed to be either RGB or RGBA, depending on whether or not
> + * the format contains an alpha channel. */
> + uint32_t sampler_type;
> +
If we have special field say "is_rgb_format" one can correctly deduct
the sampler_type. I will also help with the "DRM_FORMAT_AYUV does not
have alpha?" question above.
- RGB formats - has alpha - RGBA, RGB otherwise
- YUV formats - 1/2/3 num_planes ->
EGL_TEXTURE_Y_XUXV_WL/EGL_TEXTURE_Y_XUXV_WL/EGL_TEXTURE_Y_XUXV_WL
respectively
Considering DRM_IOCTL_MODE_ADDFB2 was introduced with kernel 3.3
(2012-03-18) do we really want to have the depth/bpp scruft ?
DRM_IOCTL_MODE_ADDFB supported only 5 formats from this table.
Thanks
Emil
More information about the wayland-devel
mailing list