[PATCH 2/4] modesetting: Use a gbm buffer for shadow if we can
Jason Ekstrand
jason at jlekstrand.net
Fri Dec 19 14:11:43 PST 2014
Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
---
hw/xfree86/drivers/modesetting/driver.c | 4 +--
hw/xfree86/drivers/modesetting/drmmode_display.c | 43 +++++++++++++++---------
hw/xfree86/drivers/modesetting/drmmode_display.h | 3 +-
3 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 77da2cc..47ca382 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -897,8 +897,8 @@ CreateScreenResources(ScreenPtr pScreen)
rootPixmap = pScreen->GetScreenPixmap(pScreen);
- if (ms->drmmode.shadow_enable)
- pixels = ms->drmmode.shadow_fb;
+ if (ms->drmmode.shadow_enable && !ms->drmmode.gbm)
+ pixels = drmmode_map_shadow_bo(&ms->drmmode);
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, pixels))
FatalError("Couldn't adjust screen pixmap\n");
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 30ee79d..f4b0f1d 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -1168,7 +1168,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
drmmode_crtc_private_ptr
drmmode_crtc = xf86_config->crtc[0]->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
- drmmode_bo old_front;
+ drmmode_bo old_front, old_shadow;
Bool ret;
ScreenPtr screen = xf86ScrnToScreen(scrn);
uint32_t old_fb_id;
@@ -1193,6 +1193,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
old_pitch = drmmode_bo_get_pitch(&drmmode->front_bo);
old_fb_id = drmmode->fb_id;
old_front = drmmode->front_bo;
+ old_shadow = drmmode->shadow_bo;
if (!drmmode_create_bo(drmmode, &drmmode->front_bo,
width, height, scrn->bitsPerPixel))
@@ -1218,13 +1219,9 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
}
if (drmmode->shadow_enable) {
- uint32_t size = scrn->displayWidth * scrn->virtualY *
- ((scrn->bitsPerPixel + 7) >> 3);
- new_pixels = calloc(1, size);
- if (new_pixels == NULL)
+ if (!drmmode_create_bo(drmmode, &drmmode->shadow_bo,
+ width, height, scrn->bitsPerPixel))
goto fail;
- free(drmmode->shadow_fb);
- drmmode->shadow_fb = new_pixels;
}
screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch, new_pixels);
@@ -1252,6 +1249,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
fail:
drmmode_bo_destroy(drmmode, &drmmode->front_bo);
drmmode->front_bo = old_front;
+ drmmode->shadow_bo = old_shadow;
scrn->virtualX = old_width;
scrn->virtualY = old_height;
scrn->displayWidth = old_pitch / cpp;
@@ -1540,13 +1538,10 @@ drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
return FALSE;
pScrn->displayWidth = drmmode_bo_get_pitch(&drmmode->front_bo) / cpp;
- if (drmmode->shadow_enable) {
- drmmode->shadow_fb =
- calloc(1,
- pScrn->displayWidth * pScrn->virtualY *
- ((pScrn->bitsPerPixel + 7) >> 3));
- if (!drmmode->shadow_fb)
- drmmode->shadow_enable = FALSE;
+ if (drmmode->shadow_enable &&
+ !drmmode_create_bo(drmmode, &drmmode->shadow_bo, width, height, bpp)) {
+ drmmode_bo_destroy(drmmode, &drmmode->front_bo);
+ return FALSE;
}
width = ms->cursor_width;
@@ -1579,6 +1574,22 @@ drmmode_map_front_bo(drmmode_ptr drmmode)
}
void *
+drmmode_map_shadow_bo(drmmode_ptr drmmode)
+{
+ int ret;
+
+ if (drmmode->shadow_bo.dumb->ptr)
+ return drmmode->shadow_bo.dumb->ptr;
+
+ ret = dumb_bo_map(drmmode->fd, drmmode->shadow_bo.dumb);
+ if (ret)
+ return NULL;
+
+ return drmmode->shadow_bo.dumb->ptr;
+
+}
+
+void *
drmmode_map_slave_bo(drmmode_ptr drmmode, msPixmapPrivPtr ppriv)
{
int ret;
@@ -1624,8 +1635,8 @@ drmmode_free_bos(ScreenPtr pScreen, drmmode_ptr drmmode)
if (drmmode->shadow_enable) {
shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen));
- free(drmmode->shadow_fb);
- drmmode->shadow_fb = NULL;
+ drmmode_bo_destroy(drmmode, &drmmode->shadow_bo);
+ drmmode->shadow_enable = FALSE;
}
drmmode_bo_destroy(drmmode, &drmmode->front_bo);
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
index c67809b..0e6560e 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.h
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
@@ -64,7 +64,7 @@ typedef struct {
Bool glamor;
Bool shadow_enable;
- void *shadow_fb;
+ drmmode_bo shadow_bo;
/**
* A screen-sized pixmap when we're doing triple-buffered DRI2
@@ -154,6 +154,7 @@ extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void *drmmode_map_front_bo(drmmode_ptr drmmode);
+void *drmmode_map_shadow_bo(drmmode_ptr drmmode);
Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void drmmode_free_bos(ScreenPtr pScreen, drmmode_ptr drmmode);
void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode,
--
2.2.0
More information about the xorg-devel
mailing list