[Mesa-dev] [PATCH 03/25] vl: rewrite vl DRI backend using XCB
Christian König
deathsimple at vodafone.de
Mon Feb 27 08:25:31 PST 2012
Signed-off-by: Christian König <deathsimple at vodafone.de>
---
configure.ac | 6 +-
src/gallium/targets/Makefile.vdpau | 2 +-
src/gallium/targets/Makefile.xvmc | 2 +-
src/gallium/winsys/g3dvl/dri/Makefile | 1 -
src/gallium/winsys/g3dvl/dri/dri2.c | 666 -----------------------------
src/gallium/winsys/g3dvl/dri/dri2.h | 106 -----
src/gallium/winsys/g3dvl/dri/dri_winsys.c | 227 +++++++----
7 files changed, 149 insertions(+), 861 deletions(-)
delete mode 100644 src/gallium/winsys/g3dvl/dri/dri2.c
delete mode 100644 src/gallium/winsys/g3dvl/dri/dri2.h
diff --git a/configure.ac b/configure.ac
index 0caa1b1..c6bc4e1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1581,19 +1581,19 @@ if test "x$enable_gallium_g3dvl" = xyes; then
fi
if test "x$enable_xvmc" = xyes; then
- PKG_CHECK_MODULES([XVMC], [xvmc >= 1.0.6])
+ PKG_CHECK_MODULES([XVMC], [xvmc >= 1.0.6 x11-xcb xcb-dri2 xcb-xfixes])
GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS xvmc"
HAVE_ST_XVMC="yes"
fi
if test "x$enable_vdpau" = xyes; then
- PKG_CHECK_MODULES([VDPAU], [vdpau >= 0.4.1])
+ PKG_CHECK_MODULES([VDPAU], [vdpau >= 0.4.1 x11-xcb xcb-dri2 xcb-xfixes])
GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS vdpau"
HAVE_ST_VDPAU="yes"
fi
if test "x$enable_va" = xyes; then
- PKG_CHECK_MODULES([LIBVA], [libva = 0.31.1])
+ PKG_CHECK_MODULES([LIBVA], [libva = 0.31.1 x11-xcb xcb-dri2 xcb-xfixes])
AC_MSG_WARN([vaapi state tracker currently unmaintained])
GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS va"
HAVE_ST_VA="yes"
diff --git a/src/gallium/targets/Makefile.vdpau b/src/gallium/targets/Makefile.vdpau
index 7206164..a304a87 100644
--- a/src/gallium/targets/Makefile.vdpau
+++ b/src/gallium/targets/Makefile.vdpau
@@ -11,7 +11,7 @@ INCLUDES = -I$(TOP)/src/gallium/include \
-I$(TOP)/src/gallium/winsys/g3dvl \
$(DRIVER_INCLUDES)
DEFINES = -DGALLIUM_TRACE -DVER_MAJOR=$(VDPAU_MAJOR) -DVER_MINOR=$(VDPAU_MINOR) $(DRIVER_DEFINES)
-LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lvdpau -lXext -lX11 -lm -lrt
+LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lvdpau -lX11-xcb -lxcb-dri2 -lxcb-xfixes -lm -lrt
STATE_TRACKER_LIB = $(TOP)/src/gallium/state_trackers/vdpau/libvdpautracker.a
ifeq ($(MESA_LLVM),1)
diff --git a/src/gallium/targets/Makefile.xvmc b/src/gallium/targets/Makefile.xvmc
index 44da660..05c5425 100644
--- a/src/gallium/targets/Makefile.xvmc
+++ b/src/gallium/targets/Makefile.xvmc
@@ -11,7 +11,7 @@ INCLUDES = -I$(TOP)/src/gallium/include \
-I$(TOP)/src/gallium/winsys/g3dvl \
$(DRIVER_INCLUDES)
DEFINES = -DGALLIUM_TRACE $(DRIVER_DEFINES)
-LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lXv -lX11 -lm
+LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lXv -lX11-xcb -lxcb-dri2 -lxcb-xfixes -lm
STATE_TRACKER_LIB = $(TOP)/src/gallium/state_trackers/xvmc/libxvmctracker.a
ifeq ($(MESA_LLVM),1)
diff --git a/src/gallium/winsys/g3dvl/dri/Makefile b/src/gallium/winsys/g3dvl/dri/Makefile
index 7a9b38f..43abcd9 100644
--- a/src/gallium/winsys/g3dvl/dri/Makefile
+++ b/src/gallium/winsys/g3dvl/dri/Makefile
@@ -7,7 +7,6 @@ LIBRARY_INCLUDES = -I$(TOP)/src/gallium/winsys/g3dvl \
$(shell $(PKG_CONFIG) libdrm --cflags-only-I)
C_SOURCES = \
- dri2.c \
dri_winsys.c
include ../../../Makefile.template
diff --git a/src/gallium/winsys/g3dvl/dri/dri2.c b/src/gallium/winsys/g3dvl/dri/dri2.c
deleted file mode 100644
index 12ed6d0..0000000
--- a/src/gallium/winsys/g3dvl/dri/dri2.c
+++ /dev/null
@@ -1,666 +0,0 @@
-/*
- * Copyright © 2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- * Kristian Høgsberg (krh at redhat.com)
- */
-
-
-#define NEED_REPLIES
-#include <stdio.h>
-#include <X11/Xlibint.h>
-#include <X11/extensions/Xext.h>
-#include <X11/extensions/extutil.h>
-#include <X11/extensions/dri2proto.h>
-#include "xf86drm.h"
-#include "dri2.h"
-#if 0
-#include "glxclient.h"
-#include "GL/glxext.h"
-#endif
-
-/* Allow the build to work with an older versions of dri2proto.h and
- * dri2tokens.h.
- */
-#if DRI2_MINOR < 1
-#undef DRI2_MINOR
-#define DRI2_MINOR 1
-#define X_DRI2GetBuffersWithFormat 7
-#endif
-
-
-static char dri2ExtensionName[] = DRI2_NAME;
-static XExtensionInfo *dri2Info;
-static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
-
-static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire);
-static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire);
-
-static /* const */ XExtensionHooks dri2ExtensionHooks = {
- NULL, /* create_gc */
- NULL, /* copy_gc */
- NULL, /* flush_gc */
- NULL, /* free_gc */
- NULL, /* create_font */
- NULL, /* free_font */
- DRI2CloseDisplay, /* close_display */
- DRI2WireToEvent, /* wire_to_event */
- DRI2EventToWire, /* event_to_wire */
- NULL, /* error */
- NULL, /* error_string */
-};
-
-static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
- dri2Info,
- dri2ExtensionName,
- &dri2ExtensionHooks,
- 0, NULL)
-
-static Bool
-DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
-{
-#if 0
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- XExtDisplayInfo *glx_info = __glXFindDisplay(dpy);
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- switch ((wire->u.u.type & 0x7f) - info->codes->first_event) {
-
-#ifdef X_DRI2SwapBuffers
- case DRI2_BufferSwapComplete:
- {
- GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
- xDRI2BufferSwapComplete *awire = (xDRI2BufferSwapComplete *)wire;
- aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire);
- aevent->type =
- (glx_info->codes->first_event + GLX_BufferSwapComplete) & 0x75;
- aevent->send_event = (awire->type & 0x80) != 0;
- aevent->display = dpy;
- aevent->drawable = awire->drawable;
- switch (awire->event_type) {
- case DRI2_EXCHANGE_COMPLETE:
- aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL;
- break;
- case DRI2_BLIT_COMPLETE:
- aevent->event_type = GLX_BLIT_COMPLETE_INTEL;
- break;
- case DRI2_FLIP_COMPLETE:
- aevent->event_type = GLX_FLIP_COMPLETE_INTEL;
- break;
- default:
- /* unknown swap completion type */
- return False;
- }
- aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
- aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
- aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo;
- return True;
- }
-#endif
-#ifdef DRI2_InvalidateBuffers
- case DRI2_InvalidateBuffers:
- {
- xDRI2InvalidateBuffers *awire = (xDRI2InvalidateBuffers *)wire;
-
- dri2InvalidateBuffers(dpy, awire->drawable);
- return False;
- }
-#endif
- default:
- /* client doesn't support server event */
- break;
- }
-#endif
- return False;
-}
-
-/* We don't actually support this. It doesn't make sense for clients to
- * send each other DRI2 events.
- */
-static Status
-DRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- switch (event->type) {
- default:
- /* client doesn't support server event */
- break;
- }
-
- return Success;
-}
-
-Bool
-DRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-
- if (XextHasExtension(info)) {
- *eventBase = info->codes->first_event;
- *errorBase = info->codes->first_error;
- return True;
- }
-
- return False;
-}
-
-Bool
-DRI2QueryVersion(Display * dpy, int *major, int *minor)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2QueryVersionReply rep;
- xDRI2QueryVersionReq *req;
- int i, nevents;
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2QueryVersion, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2QueryVersion;
- req->majorVersion = DRI2_MAJOR;
- req->minorVersion = DRI2_MINOR;
- if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
- *major = rep.majorVersion;
- *minor = rep.minorVersion;
- UnlockDisplay(dpy);
- SyncHandle();
-
- switch (rep.minorVersion) {
- case 1:
- nevents = 0;
- break;
- case 2:
- nevents = 1;
- break;
- case 3:
- default:
- nevents = 2;
- break;
- }
-
- for (i = 0; i < nevents; i++) {
- XESetWireToEvent (dpy, info->codes->first_event + i, DRI2WireToEvent);
- XESetEventToWire (dpy, info->codes->first_event + i, DRI2EventToWire);
- }
-
- return True;
-}
-
-Bool
-DRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2ConnectReply rep;
- xDRI2ConnectReq *req;
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2Connect, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2Connect;
- req->window = window;
- req->driverType = DRI2DriverDRI;
- if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- *driverName = Xmalloc(rep.driverNameLength + 1);
- if (*driverName == NULL) {
- _XEatData(dpy,
- ((rep.driverNameLength + 3) & ~3) +
- ((rep.deviceNameLength + 3) & ~3));
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
- _XReadPad(dpy, *driverName, rep.driverNameLength);
- (*driverName)[rep.driverNameLength] = '\0';
-
- *deviceName = Xmalloc(rep.deviceNameLength + 1);
- if (*deviceName == NULL) {
- Xfree(*driverName);
- _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
- _XReadPad(dpy, *deviceName, rep.deviceNameLength);
- (*deviceName)[rep.deviceNameLength] = '\0';
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return True;
-}
-
-Bool
-DRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2AuthenticateReq *req;
- xDRI2AuthenticateReply rep;
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2Authenticate, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2Authenticate;
- req->window = window;
- req->magic = magic;
-
- if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return rep.authenticated;
-}
-
-void
-DRI2CreateDrawable(Display * dpy, XID drawable)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2CreateDrawableReq *req;
-
- XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
- LockDisplay(dpy);
- GetReq(DRI2CreateDrawable, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2CreateDrawable;
- req->drawable = drawable;
- UnlockDisplay(dpy);
- SyncHandle();
-}
-
-void
-DRI2DestroyDrawable(Display * dpy, XID drawable)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2DestroyDrawableReq *req;
-
- XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
- XSync(dpy, False);
-
- LockDisplay(dpy);
- GetReq(DRI2DestroyDrawable, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2DestroyDrawable;
- req->drawable = drawable;
- UnlockDisplay(dpy);
- SyncHandle();
-}
-
-DRI2Buffer *
-DRI2GetBuffers(Display * dpy, XID drawable,
- int *width, int *height,
- unsigned int *attachments, int count, int *outCount)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2GetBuffersReply rep;
- xDRI2GetBuffersReq *req;
- DRI2Buffer *buffers;
- xDRI2Buffer repBuffer;
- CARD32 *p;
- int i;
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReqExtra(DRI2GetBuffers, count * 4, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2GetBuffers;
- req->drawable = drawable;
- req->count = count;
- p = (CARD32 *) & req[1];
- for (i = 0; i < count; i++)
- p[i] = attachments[i];
-
- if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return NULL;
- }
-
- *width = rep.width;
- *height = rep.height;
- *outCount = rep.count;
-
- buffers = Xmalloc(rep.count * sizeof buffers[0]);
- if (buffers == NULL) {
- _XEatData(dpy, rep.count * sizeof repBuffer);
- UnlockDisplay(dpy);
- SyncHandle();
- return NULL;
- }
-
- for (i = 0; i < rep.count; i++) {
- _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
- buffers[i].attachment = repBuffer.attachment;
- buffers[i].name = repBuffer.name;
- buffers[i].pitch = repBuffer.pitch;
- buffers[i].cpp = repBuffer.cpp;
- buffers[i].flags = repBuffer.flags;
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return buffers;
-}
-
-
-DRI2Buffer *
-DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
- int *width, int *height,
- unsigned int *attachments, int count, int *outCount)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2GetBuffersReply rep;
- xDRI2GetBuffersReq *req;
- DRI2Buffer *buffers;
- xDRI2Buffer repBuffer;
- CARD32 *p;
- int i;
-
- XextCheckExtension(dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2GetBuffersWithFormat;
- req->drawable = drawable;
- req->count = count;
- p = (CARD32 *) & req[1];
- for (i = 0; i < (count * 2); i++)
- p[i] = attachments[i];
-
- if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return NULL;
- }
-
- *width = rep.width;
- *height = rep.height;
- *outCount = rep.count;
-
- buffers = Xmalloc(rep.count * sizeof buffers[0]);
- if (buffers == NULL) {
- _XEatData(dpy, rep.count * sizeof repBuffer);
- UnlockDisplay(dpy);
- SyncHandle();
- return NULL;
- }
-
- for (i = 0; i < rep.count; i++) {
- _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
- buffers[i].attachment = repBuffer.attachment;
- buffers[i].name = repBuffer.name;
- buffers[i].pitch = repBuffer.pitch;
- buffers[i].cpp = repBuffer.cpp;
- buffers[i].flags = repBuffer.flags;
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return buffers;
-}
-
-
-void
-DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
- CARD32 dest, CARD32 src)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2CopyRegionReq *req;
-
- XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
-
- LockDisplay(dpy);
- GetReq(DRI2CopyRegion, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2CopyRegion;
- req->drawable = drawable;
- req->region = region;
- req->dest = dest;
- req->src = src;
-
- UnlockDisplay(dpy);
- SyncHandle();
-}
-
-#ifdef X_DRI2SwapBuffers
-static void
-load_swap_req(xDRI2SwapBuffersReq *req, CARD64 target, CARD64 divisor,
- CARD64 remainder)
-{
- req->target_msc_hi = target >> 32;
- req->target_msc_lo = target & 0xffffffff;
- req->divisor_hi = divisor >> 32;
- req->divisor_lo = divisor & 0xffffffff;
- req->remainder_hi = remainder >> 32;
- req->remainder_lo = remainder & 0xffffffff;
-}
-
-static CARD64
-vals_to_card64(CARD32 lo, CARD32 hi)
-{
- return (CARD64)hi << 32 | lo;
-}
-
-void DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc,
- CARD64 divisor, CARD64 remainder, CARD64 *count)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2SwapBuffersReq *req;
- xDRI2SwapBuffersReply rep;
-
- XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
- LockDisplay(dpy);
- GetReq(DRI2SwapBuffers, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2SwapBuffers;
- req->drawable = drawable;
- load_swap_req(req, target_msc, divisor, remainder);
-
- _XReply(dpy, (xReply *)&rep, 0, xFalse);
-
- *count = vals_to_card64(rep.swap_lo, rep.swap_hi);
-
- UnlockDisplay(dpy);
- SyncHandle();
-}
-#endif
-
-#ifdef X_DRI2GetMSC
-Bool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc,
- CARD64 *sbc)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2GetMSCReq *req;
- xDRI2MSCReply rep;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2GetMSC, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2GetMSC;
- req->drawable = drawable;
-
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- *ust = vals_to_card64(rep.ust_lo, rep.ust_hi);
- *msc = vals_to_card64(rep.msc_lo, rep.msc_hi);
- *sbc = vals_to_card64(rep.sbc_lo, rep.sbc_hi);
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return True;
-}
-#endif
-
-#ifdef X_DRI2WaitMSC
-static void
-load_msc_req(xDRI2WaitMSCReq *req, CARD64 target, CARD64 divisor,
- CARD64 remainder)
-{
- req->target_msc_hi = target >> 32;
- req->target_msc_lo = target & 0xffffffff;
- req->divisor_hi = divisor >> 32;
- req->divisor_lo = divisor & 0xffffffff;
- req->remainder_hi = remainder >> 32;
- req->remainder_lo = remainder & 0xffffffff;
-}
-
-Bool DRI2WaitMSC(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor,
- CARD64 remainder, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2WaitMSCReq *req;
- xDRI2MSCReply rep;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2WaitMSC, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2WaitMSC;
- req->drawable = drawable;
- load_msc_req(req, target_msc, divisor, remainder);
-
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- *ust = ((CARD64)rep.ust_hi << 32) | (CARD64)rep.ust_lo;
- *msc = ((CARD64)rep.msc_hi << 32) | (CARD64)rep.msc_lo;
- *sbc = ((CARD64)rep.sbc_hi << 32) | (CARD64)rep.sbc_lo;
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return True;
-}
-#endif
-
-#ifdef X_DRI2WaitSBC
-static void
-load_sbc_req(xDRI2WaitSBCReq *req, CARD64 target)
-{
- req->target_sbc_hi = target >> 32;
- req->target_sbc_lo = target & 0xffffffff;
-}
-
-Bool DRI2WaitSBC(Display *dpy, XID drawable, CARD64 target_sbc, CARD64 *ust,
- CARD64 *msc, CARD64 *sbc)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2WaitSBCReq *req;
- xDRI2MSCReply rep;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2WaitSBC, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2WaitSBC;
- req->drawable = drawable;
- load_sbc_req(req, target_sbc);
-
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
-
- *ust = ((CARD64)rep.ust_hi << 32) | rep.ust_lo;
- *msc = ((CARD64)rep.msc_hi << 32) | rep.msc_lo;
- *sbc = ((CARD64)rep.sbc_hi << 32) | rep.sbc_lo;
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return True;
-}
-#endif
-
-#ifdef X_DRI2SwapInterval
-void DRI2SwapInterval(Display *dpy, XID drawable, int interval)
-{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2SwapIntervalReq *req;
-
- XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
- LockDisplay(dpy);
- GetReq(DRI2SwapInterval, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2SwapInterval;
- req->drawable = drawable;
- req->interval = interval;
- UnlockDisplay(dpy);
- SyncHandle();
-}
-#endif
diff --git a/src/gallium/winsys/g3dvl/dri/dri2.h b/src/gallium/winsys/g3dvl/dri/dri2.h
deleted file mode 100644
index 114e9f8..0000000
--- a/src/gallium/winsys/g3dvl/dri/dri2.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright © 2007,2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- * Kristian Høgsberg (krh at redhat.com)
- */
-
-#ifndef _DRI2_H_
-#define _DRI2_H_
-
-#include <X11/extensions/Xfixes.h>
-#include <X11/extensions/dri2tokens.h>
-
-typedef struct
-{
- unsigned int attachment;
- unsigned int name;
- unsigned int pitch;
- unsigned int cpp;
- unsigned int flags;
-} DRI2Buffer;
-
-extern Bool
-DRI2QueryExtension(Display * display, int *eventBase, int *errorBase);
-
-extern Bool
-DRI2QueryVersion(Display * display, int *major, int *minor);
-
-extern Bool
-DRI2Connect(Display * display, XID window,
- char **driverName, char **deviceName);
-
-extern Bool
-DRI2Authenticate(Display * display, XID window, drm_magic_t magic);
-
-extern void
-DRI2CreateDrawable(Display * display, XID drawable);
-
-extern void
-DRI2DestroyDrawable(Display * display, XID handle);
-
-extern DRI2Buffer*
-DRI2GetBuffers(Display * dpy, XID drawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *outCount);
-
-/**
- * \note
- * This function is only supported with DRI2 version 1.1 or later.
- */
-extern DRI2Buffer*
-DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
- int *width, int *height,
- unsigned int *attachments,
- int count, int *outCount);
-
-extern void
-DRI2CopyRegion(Display * dpy, XID drawable,
- XserverRegion region,
- CARD32 dest, CARD32 src);
-
-extern void
-DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor,
- CARD64 remainder, CARD64 *count);
-
-extern Bool
-DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc, CARD64 *sbc);
-
-extern Bool
-DRI2WaitMSC(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor,
- CARD64 remainder, CARD64 *ust, CARD64 *msc, CARD64 *sbc);
-
-extern Bool
-DRI2WaitSBC(Display *dpy, XID drawable, CARD64 target_sbc, CARD64 *ust,
- CARD64 *msc, CARD64 *sbc);
-
-extern void
-DRI2SwapInterval(Display *dpy, XID drawable, int interval);
-
-#endif
diff --git a/src/gallium/winsys/g3dvl/dri/dri_winsys.c b/src/gallium/winsys/g3dvl/dri/dri_winsys.c
index 904a6d7..6f74310 100644
--- a/src/gallium/winsys/g3dvl/dri/dri_winsys.c
+++ b/src/gallium/winsys/g3dvl/dri/dri_winsys.c
@@ -29,8 +29,9 @@
#include <sys/stat.h>
#include <fcntl.h>
-#include <X11/Xlibint.h>
-#include <X11/extensions/dri2tokens.h>
+#include <X11/Xlib-xcb.h>
+#include <xcb/xfixes.h>
+#include <xcb/dri2.h>
#include <xf86drm.h>
#include "pipe/p_screen.h"
@@ -44,14 +45,16 @@
#include "util/u_inlines.h"
#include "vl_winsys.h"
-#include "dri2.h"
struct vl_dri_screen
{
struct vl_screen base;
- Display *display;
- struct util_hash_table *drawable_table;
- Drawable last_seen_drawable;
+ xcb_connection_t *conn;
+ xcb_drawable_t drawable;
+ xcb_xfixes_region_t region;
+
+ bool flushed;
+ xcb_dri2_copy_region_cookie_t flush_cookie;
};
static void
@@ -60,67 +63,92 @@ vl_dri2_flush_frontbuffer(struct pipe_screen *screen,
unsigned level, unsigned layer,
void *context_private)
{
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)context_private;
- XserverRegion region;
+ struct vl_dri_screen *scrn = (struct vl_dri_screen*)context_private;
assert(screen);
assert(resource);
assert(context_private);
- region = XFixesCreateRegionFromWindow(vl_dri_scrn->display, vl_dri_scrn->last_seen_drawable, WindowRegionBounding);
- DRI2CopyRegion(vl_dri_scrn->display, vl_dri_scrn->last_seen_drawable, region,
- DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
- XFixesDestroyRegion(vl_dri_scrn->display, region);
+ if (scrn->flushed)
+ free(xcb_dri2_copy_region_reply(scrn->conn, scrn->flush_cookie, NULL));
+ else
+ scrn->flushed = true;
+
+ scrn->flush_cookie = xcb_dri2_copy_region_unchecked(scrn->conn, scrn->drawable, scrn->region,
+ XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT,
+ XCB_DRI2_ATTACHMENT_BUFFER_FAKE_FRONT_LEFT);
+}
+
+static void
+vl_dri2_destroy_drawable(struct vl_dri_screen *scrn)
+{
+ xcb_void_cookie_t destroy_cookie;
+ if (scrn->drawable) {
+ destroy_cookie = xcb_dri2_destroy_drawable_checked(scrn->conn, scrn->drawable);
+ /* ignore any error here, since the drawable can be destroyed long ago */
+ free(xcb_request_check(scrn->conn, destroy_cookie));
+ }
}
struct pipe_resource*
vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable drawable)
{
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vscreen;
- unsigned int attachments[1] = {DRI2BufferFrontLeft};
+ static const unsigned int attachments[1] = { XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT };
+ struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
+
struct winsys_handle dri2_front_handle;
struct pipe_resource template, *tex;
- DRI2Buffer *dri2_front;
- int w, h, count;
-
- assert(vl_dri_scrn);
-
- if (vl_dri_scrn->last_seen_drawable != drawable) {
- /* Hash table business depends on this equality */
- assert(None == NULL);
- Drawable lookup_drawable = (Drawable)util_hash_table_get(vl_dri_scrn->drawable_table, (void*)drawable);
- if (lookup_drawable == None) {
- DRI2CreateDrawable(vl_dri_scrn->display, drawable);
- util_hash_table_set(vl_dri_scrn->drawable_table, (void*)drawable, (void*)drawable);
- }
- vl_dri_scrn->last_seen_drawable = drawable;
+
+ xcb_dri2_get_buffers_cookie_t cookie;
+ xcb_dri2_get_buffers_reply_t *reply;
+ xcb_dri2_dri2_buffer_t *buffers;
+
+ assert(scrn);
+
+ if (scrn->drawable != drawable) {
+ vl_dri2_destroy_drawable(scrn);
+ xcb_dri2_create_drawable(scrn->conn, drawable);
+ scrn->drawable = drawable;
}
- dri2_front = DRI2GetBuffers(vl_dri_scrn->display, drawable, &w, &h, attachments, 1, &count);
+ if (scrn->region)
+ xcb_xfixes_destroy_region(scrn->conn, scrn->region);
+ else
+ scrn->region = xcb_generate_id(scrn->conn);
+
+ xcb_xfixes_create_region_from_window(scrn->conn, scrn->region, drawable, XCB_SHAPE_SK_BOUNDING);
- assert(count == 1);
+ cookie = xcb_dri2_get_buffers_unchecked(scrn->conn, drawable, 1, 1, attachments);
+ reply = xcb_dri2_get_buffers_reply(scrn->conn, cookie, NULL);
+ if (!reply)
+ return NULL;
- if (!dri2_front)
+ buffers = xcb_dri2_get_buffers_buffers(reply);
+ if (!buffers) {
+ free(reply);
return NULL;
+ }
+
+ assert(reply->count == 1);
memset(&dri2_front_handle, 0, sizeof(dri2_front_handle));
dri2_front_handle.type = DRM_API_HANDLE_TYPE_SHARED;
- dri2_front_handle.handle = dri2_front->name;
- dri2_front_handle.stride = dri2_front->pitch;
+ dri2_front_handle.handle = buffers[0].name;
+ dri2_front_handle.stride = buffers[0].pitch;
memset(&template, 0, sizeof(template));
template.target = PIPE_TEXTURE_2D;
template.format = PIPE_FORMAT_B8G8R8X8_UNORM;
template.last_level = 0;
- template.width0 = w;
- template.height0 = h;
+ template.width0 = reply->width;
+ template.height0 = reply->height;
template.depth0 = 1;
template.usage = PIPE_USAGE_STATIC;
template.bind = PIPE_BIND_RENDER_TARGET;
template.flags = 0;
- tex = vl_dri_scrn->base.pscreen->resource_from_handle(vl_dri_scrn->base.pscreen, &template, &dri2_front_handle);
- Xfree(dri2_front);
+ tex = scrn->base.pscreen->resource_from_handle(scrn->base.pscreen, &template, &dri2_front_handle);
+ free(reply);
return tex;
}
@@ -131,44 +159,67 @@ vl_screen_get_private(struct vl_screen *vscreen)
return vscreen;
}
-static unsigned drawable_hash(void *key)
-{
- Drawable drawable = (Drawable)key;
- assert(drawable != None);
- return util_hash_crc32(&drawable, sizeof(Drawable));
-}
-
-static int drawable_cmp(void *key1, void *key2)
-{
- Drawable d1 = (Drawable)key1;
- Drawable d2 = (Drawable)key2;
- assert(d1 != None);
- assert(d2 != None);
- return d1 != d2;
-}
-
struct vl_screen*
vl_screen_create(Display *display, int screen)
{
- struct vl_dri_screen *vl_dri_scrn;
- drm_magic_t magic;
- char *drvName;
- char *devName;
+ struct vl_dri_screen *scrn;
+ const xcb_query_extension_reply_t *extension;
+ xcb_xfixes_query_version_cookie_t xfixes_query_cookie;
+ xcb_xfixes_query_version_reply_t *xfixes_query = NULL;
+ xcb_dri2_query_version_cookie_t dri2_query_cookie;
+ xcb_dri2_query_version_reply_t *dri2_query = NULL;
+ xcb_dri2_connect_cookie_t connect_cookie;
+ xcb_dri2_connect_reply_t *connect = NULL;
+ xcb_dri2_authenticate_cookie_t authenticate_cookie;
+ xcb_dri2_authenticate_reply_t *authenticate = NULL;
+ xcb_screen_iterator_t s;
+ xcb_generic_error_t *error = NULL;
+ char *device_name;
int fd;
+ drm_magic_t magic;
+
assert(display);
- vl_dri_scrn = CALLOC_STRUCT(vl_dri_screen);
- if (!vl_dri_scrn)
- goto no_struct;
+ scrn = CALLOC_STRUCT(vl_dri_screen);
+ if (!scrn)
+ return NULL;
+
+ scrn->conn = XGetXCBConnection(display);
+ if (!scrn->conn)
+ goto free_screen;
+
+ xcb_prefetch_extension_data(scrn->conn, &xcb_xfixes_id);
+ xcb_prefetch_extension_data(scrn->conn, &xcb_dri2_id);
+
+ extension = xcb_get_extension_data(scrn->conn, &xcb_xfixes_id);
+ if (!(extension && extension->present))
+ goto free_screen;
+
+ extension = xcb_get_extension_data(scrn->conn, &xcb_dri2_id);
+ if (!(extension && extension->present))
+ goto free_screen;
+
+ xfixes_query_cookie = xcb_xfixes_query_version(scrn->conn, XCB_XFIXES_MAJOR_VERSION, XCB_XFIXES_MINOR_VERSION);
+ xfixes_query = xcb_xfixes_query_version_reply (scrn->conn, xfixes_query_cookie, &error);
+ if (xfixes_query == NULL || error != NULL || xfixes_query->major_version < 2)
+ goto free_screen;
+
+ dri2_query_cookie = xcb_dri2_query_version (scrn->conn, XCB_DRI2_MAJOR_VERSION, XCB_DRI2_MINOR_VERSION);
+ dri2_query = xcb_dri2_query_version_reply (scrn->conn, dri2_query_cookie, &error);
+ if (dri2_query == NULL || error != NULL)
+ goto free_screen;
- vl_dri_scrn->display = display;
- if (!DRI2Connect(display, XRootWindow(display, screen), &drvName, &devName))
+ s = xcb_setup_roots_iterator(xcb_get_setup(scrn->conn));
+ connect_cookie = xcb_dri2_connect_unchecked(scrn->conn, s.data->root, XCB_DRI2_DRIVER_TYPE_DRI);
+ connect = xcb_dri2_connect_reply(scrn->conn, connect_cookie, NULL);
+ if (connect == NULL || connect->driver_name_length + connect->device_name_length == 0)
goto free_screen;
- fd = open(devName, O_RDWR);
- Xfree(drvName);
- Xfree(devName);
+ device_name = xcb_dri2_connect_device_name(connect);
+ device_name = strndup(device_name, xcb_dri2_connect_device_name_length(connect));
+ fd = open(device_name, O_RDWR);
+ free(device_name);
if (fd < 0)
goto free_screen;
@@ -176,38 +227,48 @@ vl_screen_create(Display *display, int screen)
if (drmGetMagic(fd, &magic))
goto free_screen;
- if (!DRI2Authenticate(display, RootWindow(display, screen), magic))
- goto free_screen;
+ authenticate_cookie = xcb_dri2_authenticate_unchecked(scrn->conn, s.data->root, magic);
+ authenticate = xcb_dri2_authenticate_reply(scrn->conn, authenticate_cookie, NULL);
- vl_dri_scrn->base.pscreen = driver_descriptor.create_screen(fd);
+ if (authenticate == NULL || !authenticate->authenticated)
+ goto free_screen;
- if (!vl_dri_scrn->base.pscreen)
+ scrn->base.pscreen = driver_descriptor.create_screen(fd);
+ if (!scrn->base.pscreen)
goto free_screen;
- vl_dri_scrn->drawable_table = util_hash_table_create(&drawable_hash, &drawable_cmp);
- if (!vl_dri_scrn->drawable_table)
- goto no_hash;
+ scrn->base.pscreen->flush_frontbuffer = vl_dri2_flush_frontbuffer;
- vl_dri_scrn->last_seen_drawable = None;
- vl_dri_scrn->base.pscreen->flush_frontbuffer = vl_dri2_flush_frontbuffer;
+ free(xfixes_query);
+ free(dri2_query);
+ free(connect);
+ free(authenticate);
- return &vl_dri_scrn->base;
+ return &scrn->base;
-no_hash:
- vl_dri_scrn->base.pscreen->destroy(vl_dri_scrn->base.pscreen);
free_screen:
- FREE(vl_dri_scrn);
-no_struct:
+ FREE(scrn);
+
+ free(xfixes_query);
+ free(dri2_query);
+ free(connect);
+ free(authenticate);
+ free(error);
+
return NULL;
}
void vl_screen_destroy(struct vl_screen *vscreen)
{
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vscreen;
+ struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
assert(vscreen);
- util_hash_table_destroy(vl_dri_scrn->drawable_table);
- vl_dri_scrn->base.pscreen->destroy(vl_dri_scrn->base.pscreen);
- FREE(vl_dri_scrn);
+ if (scrn->flushed)
+ free(xcb_dri2_copy_region_reply(scrn->conn, scrn->flush_cookie, NULL));
+ if (scrn->region)
+ xcb_xfixes_destroy_region(scrn->conn, scrn->region);
+ vl_dri2_destroy_drawable(scrn);
+ scrn->base.pscreen->destroy(scrn->base.pscreen);
+ FREE(scrn);
}
--
1.7.5.4
More information about the mesa-dev
mailing list