On Mon, 4 Jul 2016 16:25:16 +0300 Pekka Paalanen <[email protected]> wrote:
> From: Pekka Paalanen <[email protected]> > > Invert the Y_INVERT flag for the EGL import fo dmabufs. This fixes > weston-simple-dmabuf-intel to show the same image on both GL-composited > and with direct scanout on a hardware plane. Before, the image would > y-flip when switching between these two cases. Now the orientation also > matches the color values written in simple-dmabuf-intel.c. > > The GL-renderer uses the OpenGL convention of texture coordinates, where > the origin is at the bottom-left of an image. This can be observed in > texture_region() where the texcoords are inverted if y_invert is false, > since the surface coordinates have origin at top-left. Both wl_shm and > dmabuf buffers have origin at the top-left. > > When wl_shm buffer is imported with glTexImage2D, it gets inverted > because glTexImage2D is defined to read in the bottom row first. The shm > data is top row first. This incidentally also means, that buffer pixel > 0,0 ends up at texture coordinates 0,0. This is now inverted compared to > the GL coordinate convention, and therefore gl_renderer_attach_shm() > sets y_inverted to true. This causes texture_region() to NOT invert the > texcoords. Wayland surface coordinates have origin at top-left, hence > the double-inversion. > > Dmabuf buffers also have the origin at top-left. However, they are > imported via EGL to GL, where they should get the GL oriented > coordinates but they do not. It is as if pixel 0,0 ends up at texcoords > 0,0 - the same thing as with wl_shm buffers. Therefore we need to invert > the invert flag. > > Too bad EGL_EXT_image_dma_buf_import does not seem to specify the image > orientation. The GL spec implied result seems to conflict with the > reality in Mesa 11.2.2. > > I asked about this in the Mesa developer mailing list. The question with > no answers: > https://lists.freedesktop.org/archives/mesa-dev/2016-June/120249.html > and the thread I hijacked to get some answers: > https://lists.freedesktop.org/archives/mesa-dev/2016-June/120733.html > which culminated to the conclusion: > https://lists.freedesktop.org/archives/mesa-dev/2016-June/120955.html > that supports this patch. > > simple-dmabuf-v4l is equally fixed to not add Y_INVERT. There is no > rational reason to have it, and removing is necessary together with the > GL-renderer change to keep the image the right way up. This has been > tested with VIVID. > > Signed-off-by: Pekka Paalanen <[email protected]> Hi, forgot to add that this patch is a partial fix to https://phabricator.freedesktop.org/T7475 Thanks, pq > --- > clients/simple-dmabuf-v4l.c | 7 ++++++- > libweston/gl-renderer.c | 8 +++++++- > 2 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/clients/simple-dmabuf-v4l.c b/clients/simple-dmabuf-v4l.c > index 060b4fa..6ef0eb3 100644 > --- a/clients/simple-dmabuf-v4l.c > +++ b/clients/simple-dmabuf-v4l.c > @@ -353,7 +353,12 @@ create_dmabuf_buffer(struct display *display, struct > buffer *buffer) > unsigned i; > > modifier = 0; > - flags = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT; > + flags = 0; > + > + /* XXX: apparently some webcams may actually provide y-inverted images, > + * in which case we should set > + * flags = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT > + */ > > params = zwp_linux_dmabuf_v1_create_params(display->dmabuf); > for (i = 0; i < display->format.num_planes; ++i) > diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c > index 28c0b50..a404e7e 100644 > --- a/libweston/gl-renderer.c > +++ b/libweston/gl-renderer.c > @@ -1837,8 +1837,14 @@ gl_renderer_attach_dmabuf(struct weston_surface > *surface, > > buffer->width = dmabuf->attributes.width; > buffer->height = dmabuf->attributes.height; > + > + /* > + * GL-renderer uses the OpenGL convention of texture coordinates, where > + * the origin is at bottom-left. Because dmabuf buffers have the origin > + * at top-left, we must invert the Y_INVERT flag to get the image right. > + */ > buffer->y_inverted = > - !!(dmabuf->attributes.flags & > ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT); > + !(dmabuf->attributes.flags & > ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT); > > for (i = 0; i < gs->num_images; i++) > egl_image_unref(gs->images[i]); _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
