diff --git a/src/amdgpu_dri3.c b/src/amdgpu_dri3.c index e27ae5b..f675c8c 100644 --- a/src/amdgpu_dri3.c +++ b/src/amdgpu_dri3.c @@ -566,17 +566,28 @@ amdgpu_dri3_get_modifiers(ScreenPtr screen, uint32_t format, return count; } -static int +static Bool amdgpu_dri3_get_drawable_modifiers(DrawablePtr draw, uint32_t format, uint32_t *num_modifiers, uint64_t **modifiers) { - ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); - AMDGPUInfoPtr info = AMDGPUPTR(scrn); + ScrnInfoPtr scrn; + AMDGPUInfoPtr info; uint64_t *mods; uint32_t count; int asic_family; - /* Get the ASIC family to determine which modifiers to advertise */ + /* Validate input parameters */ + if (!draw || !draw->pScreen || !num_modifiers || !modifiers) + return FALSE; + + scrn = xf86ScreenToScrn(draw->pScreen); + if (!scrn) + return FALSE; + + info = AMDGPUPTR(scrn); + if (!info) + return FALSE; + asic_family = info->family; /* Determine which set of modifiers to return based on ASIC family. @@ -636,15 +647,14 @@ static dri3_screen_info_rec amdgpu_dri3_screen_info = { .version = 2, .open = amdgpu_dri3_open, .pixmap_from_fd = amdgpu_dri3_pixmap_from_fd, - // Version 1.1 + /* Version 1.1 */ .fd_from_pixmap = amdgpu_dri3_fd_from_pixmap, - // Version 1.2 + /* Version 1.2 */ .pixmap_from_fds = amdgpu_dri3_pixmap_from_fds, .fds_from_pixmap = amdgpu_dri3_fds_from_pixmap, .get_formats = amdgpu_dri3_get_formats, - .get_modifiers = amdgpu_dri3_get_modifiers, - .get_drawable_modifiers = amdgpu_dri3_get_drawable_modifiers - // Version 1.4 + .get_modifiers = amdgpu_dri3_get_modifiers + /* Version 1.4 - get_drawable_modifiers set via glamor callback */ }; Bool diff --git a/src/amdgpu_glamor.h b/src/amdgpu_glamor.h index 829de2f..b373454 100644 --- a/src/amdgpu_glamor.h +++ b/src/amdgpu_glamor.h @@ -80,4 +80,12 @@ extern int glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds, uint64_t *modifier); #endif +/* DRI3 drawable modifiers callback */ +#ifdef GBM_BO_WITH_MODIFIERS +extern Bool amdgpu_dri3_get_drawable_modifiers(DrawablePtr draw, + uint32_t format, + uint32_t *num_modifiers, + uint64_t **modifiers); +#endif + #endif /* AMDGPU_GLAMOR_H */ diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 3994f93..d4c0848 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -2038,6 +2038,10 @@ Bool AMDGPUScreenInit_KMS(ScreenPtr pScreen, int argc, char **argv) if (amdgpu_glamor_init(pScreen)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Acceleration enabled\n"); +#ifdef GBM_BO_WITH_MODIFIERS + glamor_set_drawable_modifiers_func(pScreen, + amdgpu_dri3_get_drawable_modifiers); +#endif } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Acceleration initialization failed\n");