diff options
Diffstat (limited to 'meta/recipes-graphics/wayland/weston/weston-gl-renderer-Set-pitch-correctly-for-subsampled-textures.patch')
-rw-r--r-- | meta/recipes-graphics/wayland/weston/weston-gl-renderer-Set-pitch-correctly-for-subsampled-textures.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/meta/recipes-graphics/wayland/weston/weston-gl-renderer-Set-pitch-correctly-for-subsampled-textures.patch b/meta/recipes-graphics/wayland/weston/weston-gl-renderer-Set-pitch-correctly-for-subsampled-textures.patch new file mode 100644 index 0000000000..c188018557 --- /dev/null +++ b/meta/recipes-graphics/wayland/weston/weston-gl-renderer-Set-pitch-correctly-for-subsampled-textures.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | Multi-plane sub-sampled textures have partial width/height, e.g. | ||
2 | YUV420/I420 has a full-size Y plane, followed by a half-width/height U | ||
3 | plane, and a half-width/height V plane. | ||
4 | |||
5 | zwp_linux_dmabuf_v1 allows clients to pass an explicit pitch for each | ||
6 | plane, but for wl_shm this must be inferred. gl-renderer was correctly | ||
7 | accounting for the width and height when subsampling, but the pitch was | ||
8 | being taken as the pitch for the first plane. | ||
9 | |||
10 | This does not match the requirements for GStreamer's waylandsink, in | ||
11 | particular, as well as other clients. Fix the SHM upload path to | ||
12 | correctly set the pitch for each plane, according to subsampling. | ||
13 | |||
14 | Tested with: | ||
15 | $ gst-launch-1.0 videotestsrc ! waylandsink | ||
16 | |||
17 | Upstream-Status: Backport [https://patchwork.freedesktop.org/patch/180767/] | ||
18 | |||
19 | Signed-off-by: Daniel Stone <daniels@collabora.com> | ||
20 | Fixes: fdeefe42418 ("gl-renderer: add support of WL_SHM_FORMAT_YUV420") | ||
21 | Reported-by: Fabien Lahoudere <fabien.lahoudere@collabora.co.uk> | ||
22 | Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103063 | ||
23 | |||
24 | --- | ||
25 | libweston/gl-renderer.c | 4 ++-- | ||
26 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
27 | |||
28 | diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c | ||
29 | index 244ce309..40bf0bb6 100644 | ||
30 | --- a/libweston/gl-renderer.c | ||
31 | +++ b/libweston/gl-renderer.c | ||
32 | @@ -1285,14 +1285,13 @@ gl_renderer_flush_damage(struct weston_surface *surface) | ||
33 | goto done; | ||
34 | } | ||
35 | |||
36 | - glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, gs->pitch); | ||
37 | - | ||
38 | if (gs->needs_full_upload) { | ||
39 | glPixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, 0); | ||
40 | glPixelStorei(GL_UNPACK_SKIP_ROWS_EXT, 0); | ||
41 | wl_shm_buffer_begin_access(buffer->shm_buffer); | ||
42 | for (j = 0; j < gs->num_textures; j++) { | ||
43 | glBindTexture(GL_TEXTURE_2D, gs->textures[j]); | ||
44 | + glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, gs->pitch / gs->hsub[j]); | ||
45 | glTexImage2D(GL_TEXTURE_2D, 0, | ||
46 | gs->gl_format[j], | ||
47 | gs->pitch / gs->hsub[j], | ||
48 | @@ -1317,6 +1316,7 @@ gl_renderer_flush_damage(struct weston_surface *surface) | ||
49 | glPixelStorei(GL_UNPACK_SKIP_ROWS_EXT, r.y1); | ||
50 | for (j = 0; j < gs->num_textures; j++) { | ||
51 | glBindTexture(GL_TEXTURE_2D, gs->textures[j]); | ||
52 | + glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, gs->pitch / gs->hsub[j]); | ||
53 | glTexSubImage2D(GL_TEXTURE_2D, 0, | ||
54 | r.x1 / gs->hsub[j], | ||
55 | r.y1 / gs->vsub[j], | ||