mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-20 07:00:03 +01:00
Merge branch 'fix-nvidia-modesetting' into 'master'
glamor: Use EGL_LINUX_DMA_BUF_EXT to create GBM bo EGLImages See merge request xorg/xserver!2057
This commit is contained in:
commit
6ea784e973
1 changed files with 99 additions and 3 deletions
|
|
@ -231,12 +231,106 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap,
|
|||
Bool ret = FALSE;
|
||||
|
||||
glamor_egl = glamor_egl_get_screen_private(scrn);
|
||||
#ifdef GBM_BO_FD_FOR_PLANE
|
||||
uint64_t modifier = gbm_bo_get_modifier(bo);
|
||||
const int num_planes = gbm_bo_get_plane_count(bo);
|
||||
int fds[GBM_MAX_PLANES];
|
||||
int plane;
|
||||
int attr_num = 0;
|
||||
EGLint img_attrs[64] = {0};
|
||||
enum PlaneAttrs {
|
||||
PLANE_FD,
|
||||
PLANE_OFFSET,
|
||||
PLANE_PITCH,
|
||||
PLANE_MODIFIER_LO,
|
||||
PLANE_MODIFIER_HI,
|
||||
NUM_PLANE_ATTRS
|
||||
};
|
||||
static const EGLint planeAttrs[][NUM_PLANE_ATTRS] = {
|
||||
{
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT,
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT,
|
||||
EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT,
|
||||
EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT,
|
||||
},
|
||||
{
|
||||
EGL_DMA_BUF_PLANE1_FD_EXT,
|
||||
EGL_DMA_BUF_PLANE1_OFFSET_EXT,
|
||||
EGL_DMA_BUF_PLANE1_PITCH_EXT,
|
||||
EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT,
|
||||
EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT,
|
||||
},
|
||||
{
|
||||
EGL_DMA_BUF_PLANE2_FD_EXT,
|
||||
EGL_DMA_BUF_PLANE2_OFFSET_EXT,
|
||||
EGL_DMA_BUF_PLANE2_PITCH_EXT,
|
||||
EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT,
|
||||
EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT,
|
||||
},
|
||||
{
|
||||
EGL_DMA_BUF_PLANE3_FD_EXT,
|
||||
EGL_DMA_BUF_PLANE3_OFFSET_EXT,
|
||||
EGL_DMA_BUF_PLANE3_PITCH_EXT,
|
||||
EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT,
|
||||
EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT,
|
||||
},
|
||||
};
|
||||
|
||||
for (plane = 0; plane < num_planes; plane++) fds[plane] = -1;
|
||||
#endif
|
||||
|
||||
glamor_make_current(glamor_priv);
|
||||
|
||||
#ifdef GBM_BO_FD_FOR_PLANE
|
||||
if (glamor_egl->dmabuf_capable) {
|
||||
#define ADD_ATTR(attrs, num, attr) \
|
||||
do { \
|
||||
assert(((num) + 1) < (sizeof(attrs) / sizeof((attrs)[0]))); \
|
||||
(attrs)[(num)++] = (attr); \
|
||||
} while (0)
|
||||
ADD_ATTR(img_attrs, attr_num, EGL_WIDTH);
|
||||
ADD_ATTR(img_attrs, attr_num, gbm_bo_get_width(bo));
|
||||
ADD_ATTR(img_attrs, attr_num, EGL_HEIGHT);
|
||||
ADD_ATTR(img_attrs, attr_num, gbm_bo_get_height(bo));
|
||||
ADD_ATTR(img_attrs, attr_num, EGL_LINUX_DRM_FOURCC_EXT);
|
||||
ADD_ATTR(img_attrs, attr_num, gbm_bo_get_format(bo));
|
||||
|
||||
for (plane = 0; plane < num_planes; plane++) {
|
||||
fds[plane] = gbm_bo_get_fd_for_plane(bo, plane);
|
||||
ADD_ATTR(img_attrs, attr_num, planeAttrs[plane][PLANE_FD]);
|
||||
ADD_ATTR(img_attrs, attr_num, fds[plane]);
|
||||
ADD_ATTR(img_attrs, attr_num, planeAttrs[plane][PLANE_OFFSET]);
|
||||
ADD_ATTR(img_attrs, attr_num, gbm_bo_get_offset(bo, plane));
|
||||
ADD_ATTR(img_attrs, attr_num, planeAttrs[plane][PLANE_PITCH]);
|
||||
ADD_ATTR(img_attrs, attr_num, gbm_bo_get_stride_for_plane(bo, plane));
|
||||
ADD_ATTR(img_attrs, attr_num, planeAttrs[plane][PLANE_MODIFIER_LO]);
|
||||
ADD_ATTR(img_attrs, attr_num, (uint32_t)(modifier & 0xFFFFFFFFULL));
|
||||
ADD_ATTR(img_attrs, attr_num, planeAttrs[plane][PLANE_MODIFIER_HI]);
|
||||
ADD_ATTR(img_attrs, attr_num, (uint32_t)(modifier >> 32ULL));
|
||||
}
|
||||
ADD_ATTR(img_attrs, attr_num, EGL_NONE);
|
||||
#undef ADD_ATTR
|
||||
|
||||
image = eglCreateImageKHR(glamor_egl->display,
|
||||
EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT,
|
||||
NULL,
|
||||
img_attrs);
|
||||
|
||||
for (plane = 0; plane < num_planes; plane++) {
|
||||
close(fds[plane]);
|
||||
fds[plane] = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
image = eglCreateImageKHR(glamor_egl->display,
|
||||
EGL_NO_CONTEXT,
|
||||
EGL_NATIVE_PIXMAP_KHR, bo, NULL);
|
||||
}
|
||||
|
||||
if (image == EGL_NO_IMAGE_KHR) {
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
|
||||
goto done;
|
||||
|
|
@ -1223,6 +1317,8 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
|||
glamor_egl->dmabuf_capable = TRUE;
|
||||
else if (strstr((const char *)renderer, "zink"))
|
||||
glamor_egl->dmabuf_capable = TRUE;
|
||||
else if (strstr((const char *)renderer, "NVIDIA"))
|
||||
glamor_egl->dmabuf_capable = TRUE;
|
||||
else
|
||||
glamor_egl->dmabuf_capable = FALSE;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue