From 7293fc12feeee0b32a2781c6da308c11371e4162 Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Wed, 19 Nov 2025 12:25:37 +0200 Subject: [PATCH] modesetting: map gbm bo's if possible Signed-off-by: stefan11111 --- .../video/modesetting/drmmode_display.c | 31 +++++++++++++------ .../video/modesetting/drmmode_display.h | 1 + 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/hw/xfree86/drivers/video/modesetting/drmmode_display.c b/hw/xfree86/drivers/video/modesetting/drmmode_display.c index 423a115b1..f3616b127 100644 --- a/hw/xfree86/drivers/video/modesetting/drmmode_display.c +++ b/hw/xfree86/drivers/video/modesetting/drmmode_display.c @@ -1064,21 +1064,34 @@ drmmode_bo_get_handle(drmmode_bo *bo) static void * drmmode_bo_map(drmmode_ptr drmmode, drmmode_bo *bo) { - int ret; + if (bo->map) { + return bo->map; + } #ifdef GLAMOR_HAS_GBM - if (bo->gbm) - return NULL; + if (bo->gbm) { + /* We shouldn't read from gpu memory */ + uint32_t stride; + void* unused; + void* map = gbm_bo_map(bo->gbm, 0, 0, bo->width, bo->height, GBM_BO_TRANSFER_WRITE, &stride, &unused); + if (map) { + bo->map = map; + return bo->map; + } + } #endif - if (bo->dumb->ptr) - return bo->dumb->ptr; + if (bo->dumb) { + int ret = dumb_bo_map(drmmode->fd, bo->dumb); + if (ret) { + return NULL; + } - ret = dumb_bo_map(drmmode->fd, bo->dumb); - if (ret) - return NULL; + bo->map = bo->dumb->ptr; + return bo->map; + } - return bo->dumb->ptr; + return NULL; } int diff --git a/hw/xfree86/drivers/video/modesetting/drmmode_display.h b/hw/xfree86/drivers/video/modesetting/drmmode_display.h index 21b6b18f6..577df60d1 100644 --- a/hw/xfree86/drivers/video/modesetting/drmmode_display.h +++ b/hw/xfree86/drivers/video/modesetting/drmmode_display.h @@ -85,6 +85,7 @@ typedef struct { Bool used_modifiers; struct gbm_bo *gbm; #endif + void* map; } drmmode_bo; typedef struct {