[PATCH xserver 3/3] modesetting: Implement DRI2InfoRec version 9 callbacks
Hans de Goede
hdegoede at redhat.com
Tue Aug 16 09:10:08 UTC 2016
Implement the CreateBuffer2 / DestroyBuffer2 / CopyRegion2 DRI2InfoRec
version 9 callbacks, this is necessary for being an offload source
provider with DRI2.
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
hw/xfree86/drivers/modesetting/dri2.c | 64 ++++++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 9 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index 9bc56c2..ed94d63 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -118,10 +118,9 @@ get_drawable_pixmap(DrawablePtr drawable)
}
static DRI2Buffer2Ptr
-ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
- unsigned int format)
+ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
+ unsigned int attachment, unsigned int format)
{
- ScreenPtr screen = drawable->pScreen;
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
DRI2Buffer2Ptr buffer;
PixmapPtr pixmap;
@@ -218,6 +217,14 @@ ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
return buffer;
}
+static DRI2Buffer2Ptr
+ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
+ unsigned int format)
+{
+ return ms_dri2_create_buffer2(drawable->pScreen, drawable, attachment,
+ format);
+}
+
static void
ms_dri2_reference_buffer(DRI2Buffer2Ptr buffer)
{
@@ -227,7 +234,8 @@ ms_dri2_reference_buffer(DRI2Buffer2Ptr buffer)
}
}
-static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+static void ms_dri2_destroy_buffer2(ScreenPtr unused, DrawablePtr unused2,
+ DRI2Buffer2Ptr buffer)
{
if (!buffer)
return;
@@ -245,28 +253,55 @@ static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
}
}
+static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+{
+ ms_dri2_destroy_buffer2(NULL, drawable, buffer);
+}
+
static void
-ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
- DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+ms_dri2_copy_region2(ScreenPtr screen, DrawablePtr drawable, RegionPtr pRegion,
+ DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
{
ms_dri2_buffer_private_ptr src_priv = sourceBuffer->driverPrivate;
ms_dri2_buffer_private_ptr dst_priv = destBuffer->driverPrivate;
PixmapPtr src_pixmap = src_priv->pixmap;
PixmapPtr dst_pixmap = dst_priv->pixmap;
- ScreenPtr screen = drawable->pScreen;
DrawablePtr src = (sourceBuffer->attachment == DRI2BufferFrontLeft)
? drawable : &src_pixmap->drawable;
DrawablePtr dst = (destBuffer->attachment == DRI2BufferFrontLeft)
? drawable : &dst_pixmap->drawable;
+ int off_x = 0, off_y = 0;
+ Bool translate = FALSE;
RegionPtr pCopyClip;
GCPtr gc;
+ if (destBuffer->attachment == DRI2BufferFrontLeft &&
+ drawable->pScreen != screen) {
+ dst = DRI2UpdatePrime(drawable, destBuffer);
+ if (!dst)
+ return;
+ if (dst != drawable)
+ translate = TRUE;
+ }
+
+ if (translate && drawable->type == DRAWABLE_WINDOW) {
+#ifdef COMPOSITE
+ PixmapPtr pixmap = get_drawable_pixmap(drawable);
+ off_x = -pixmap->screen_x;
+ off_y = -pixmap->screen_y;
+#endif
+ off_x += drawable->x;
+ off_y += drawable->y;
+ }
+
gc = GetScratchGC(dst->depth, screen);
if (!gc)
return;
pCopyClip = REGION_CREATE(screen, NULL, 0);
REGION_COPY(screen, pCopyClip, pRegion);
+ if (translate)
+ REGION_TRANSLATE(screen, pCopyClip, off_x, off_y);
(*gc->funcs->ChangeClip) (gc, CT_REGION, pCopyClip, 0);
ValidateGC(dst, gc);
@@ -282,11 +317,19 @@ ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
gc->ops->CopyArea(src, dst, gc,
0, 0,
drawable->width, drawable->height,
- 0, 0);
+ off_x, off_y);
FreeScratchGC(gc);
}
+static void
+ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
+ DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+{
+ ms_dri2_copy_region2(drawable->pScreen, drawable, pRegion, destBuffer,
+ sourceBuffer);
+}
+
static uint64_t
gettime_us(void)
{
@@ -827,13 +870,16 @@ ms_dri2_screen_init(ScreenPtr screen)
info.driverName = NULL; /* Compat field, unused. */
info.deviceName = drmGetDeviceNameFromFd(ms->fd);
- info.version = 4;
+ info.version = 9;
info.CreateBuffer = ms_dri2_create_buffer;
info.DestroyBuffer = ms_dri2_destroy_buffer;
info.CopyRegion = ms_dri2_copy_region;
info.ScheduleSwap = ms_dri2_schedule_swap;
info.GetMSC = ms_dri2_get_msc;
info.ScheduleWaitMSC = ms_dri2_schedule_wait_msc;
+ info.CreateBuffer2 = ms_dri2_create_buffer2;
+ info.DestroyBuffer2 = ms_dri2_destroy_buffer2;
+ info.CopyRegion2 = ms_dri2_copy_region2;
/* These two will be filled in by dri2.c */
info.numDrivers = 0;
--
2.7.4
More information about the xorg-devel
mailing list