diff options
author | Lyude Paul <lyude@redhat.com> | 2018-06-20 19:12:31 -0400 |
---|---|---|
committer | Lyude Paul <lyude@redhat.com> | 2018-06-27 15:07:56 -0400 |
commit | 186a21c4bac744ffe645c8d1a6dda2d41c6d33d8 (patch) | |
tree | f27740acea4fc3513187dbd6b68353f595710292 /glamor/glamor.c | |
parent | c12f1bd4b76088ea66e3bec9ab9721a52b20cdf2 (diff) |
glamor: Unbreak glamor_fd_from_pixmap()
When support for allocating GBM BOs with modifiers was added,
glamor_fd_from_pixmap() was changed so that it would return an error if
it got a bo with modifiers set from glamor_fds_from_pixmap(). The
problem is that on systems that support BOs with modifiers,
glamor_fds_from_pixmap() will always return BOs with modifiers.
This means that glamor_fd_from_pixmap() was broken entirely, which broke
a number of other things including glamor_shareable_fd_from_pixmap(),
which meant that modesetting using multiple GPUs with the modesetting
DDX was also broken. Easy reproducer:
- Find a laptop with DRI prime that has outputs connected to the
dedicated GPU and integrated GPU
- Try to enable one display on each using the modesetting DDX
- Fail
Since there isn't a way to ask for no modifiers from
glamor_fds_from_pixmap, we create a shared _glamor_fds_from_pixmap()
function used by both glamor_fds_from_pixmap() and
glamor_fd_from_pixmap() that calls down to the appropriate
glamor_egl_fd*_from_pixmap() function.
Signed-off-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Cc: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Fixes: c8c276c956 ("glamor: Implement PixmapFromBuffers and BuffersFromPixmap")
Diffstat (limited to 'glamor/glamor.c')
-rw-r--r-- | glamor/glamor.c | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/glamor/glamor.c b/glamor/glamor.c index 54ca0db35..9bf1707de 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -826,10 +826,10 @@ glamor_get_drawable_modifiers(DrawablePtr draw, uint32_t format, return TRUE; } -_X_EXPORT int -glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, - uint32_t *strides, uint32_t *offsets, - uint64_t *modifier) +static int +_glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, + uint32_t *strides, uint32_t *offsets, + CARD32 *size, uint64_t *modifier) { glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); glamor_screen_private *glamor_priv = @@ -843,9 +843,19 @@ glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, if (!glamor_pixmap_ensure_fbo(pixmap, pixmap->drawable.depth == 30 ? GL_RGB10_A2 : GL_RGBA, 0)) return 0; - return glamor_egl_fds_from_pixmap(screen, pixmap, fds, - strides, offsets, - modifier); + + if (modifier) { + return glamor_egl_fds_from_pixmap(screen, pixmap, fds, + strides, offsets, + modifier); + } else { + CARD16 stride; + + fds[0] = glamor_egl_fd_from_pixmap(screen, pixmap, &stride, size); + strides[0] = stride; + + return fds[0] >= 0; + } default: break; } @@ -853,29 +863,29 @@ glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, } _X_EXPORT int +glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, + uint32_t *strides, uint32_t *offsets, + uint64_t *modifier) +{ + return _glamor_fds_from_pixmap(screen, pixmap, fds, strides, offsets, + NULL, modifier); +} + +_X_EXPORT int glamor_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, CARD16 *stride, CARD32 *size) { + int fd; int ret; - int fds[4]; - uint32_t strides[4], offsets[4]; - uint64_t modifier; - - ret = glamor_fds_from_pixmap(screen, pixmap, fds, strides, offsets, - &modifier); + uint32_t stride32; - /* Pixmaps with multi-planes/modifier are not supported in this interface */ - if (ret != 1 || offsets[0] != 0) { - while (ret > 0) - close(fds[--ret]); + ret = _glamor_fds_from_pixmap(screen, pixmap, &fd, &stride32, NULL, size, + NULL); + if (ret != 1) return -1; - } - ret = fds[0]; - *stride = strides[0]; - *size = pixmap->drawable.height * *stride; - - return ret; + *stride = stride32; + return fd; } _X_EXPORT int |