summaryrefslogtreecommitdiff
path: root/glamor
diff options
context:
space:
mode:
authorLyude Paul <lyude@redhat.com>2018-06-20 19:12:31 -0400
committerLyude Paul <lyude@redhat.com>2018-06-27 15:07:56 -0400
commit186a21c4bac744ffe645c8d1a6dda2d41c6d33d8 (patch)
treef27740acea4fc3513187dbd6b68353f595710292 /glamor
parentc12f1bd4b76088ea66e3bec9ab9721a52b20cdf2 (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')
-rw-r--r--glamor/glamor.c56
-rw-r--r--glamor/glamor.h3
-rw-r--r--glamor/glamor_egl.c2
-rw-r--r--glamor/glamor_egl_stubs.c7
4 files changed, 43 insertions, 25 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
diff --git a/glamor/glamor.h b/glamor/glamor.h
index 06e11506f..09e9c895c 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -141,7 +141,7 @@ extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front,
extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front,
PixmapPtr back);
-/* The DDX is not supposed to call these three functions */
+/* The DDX is not supposed to call these four functions */
extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen);
extern _X_EXPORT int glamor_egl_fds_from_pixmap(ScreenPtr, PixmapPtr, int *,
uint32_t *, uint32_t *,
@@ -150,6 +150,7 @@ extern _X_EXPORT int glamor_egl_fd_name_from_pixmap(ScreenPtr, PixmapPtr,
CARD16 *, CARD32 *);
extern _X_EXPORT struct gbm_device *glamor_egl_get_gbm_device(ScreenPtr screen);
+extern _X_EXPORT int glamor_egl_fd_from_pixmap(ScreenPtr, PixmapPtr, CARD16 *, CARD32 *);
/* @glamor_supports_pixmap_import_export: Returns whether
* glamor_fds_from_pixmap(), glamor_name_from_pixmap(), and
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 4a4ca4bd8..5a3b7f193 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -402,7 +402,7 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
#endif
}
-static int
+_X_EXPORT int
glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
CARD16 *stride, CARD32 *size)
{
diff --git a/glamor/glamor_egl_stubs.c b/glamor/glamor_egl_stubs.c
index aae909e9f..91ab9a7ae 100644
--- a/glamor/glamor_egl_stubs.c
+++ b/glamor/glamor_egl_stubs.c
@@ -51,3 +51,10 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
{
return 0;
}
+
+int
+glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
+ CARD16 *stride, CARD32 *size)
+{
+ return -1;
+}