Add DRI2 module.
This commit is contained in:
parent
005e31d3de
commit
b71dc54352
14
configure.ac
14
configure.ac
|
@ -368,6 +368,7 @@ AM_CONDITIONAL(PPC_VIDEO, [test "x$PPC_VIDEO" = xyes])
|
|||
AM_CONDITIONAL(SPARC64_VIDEO, [test "x$SPARC64_VIDEO" = xyes])
|
||||
|
||||
DRI=no
|
||||
DRI2=no
|
||||
KDRIVE_HW=no
|
||||
dnl it would be nice to autodetect these *CONS_SUPPORTs
|
||||
case $host_os in
|
||||
|
@ -380,6 +381,7 @@ case $host_os in
|
|||
AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
|
||||
AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console])
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
;;
|
||||
*netbsd*)
|
||||
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
|
||||
|
@ -387,6 +389,7 @@ case $host_os in
|
|||
AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
|
||||
AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
;;
|
||||
*openbsd*)
|
||||
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
|
||||
|
@ -395,6 +398,7 @@ case $host_os in
|
|||
;;
|
||||
*linux*)
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
KDRIVE_HW=yes
|
||||
;;
|
||||
*solaris*)
|
||||
|
@ -535,6 +539,7 @@ AC_ARG_ENABLE(xdmcp, AS_HELP_STRING([--disable-xdmcp], [Build XDMCP ext
|
|||
AC_ARG_ENABLE(xdm-auth-1, AS_HELP_STRING([--disable-xdm-auth-1], [Build XDM-Auth-1 extension (default: auto)]), [XDMAUTH=$enableval], [XDMAUTH=auto])
|
||||
AC_ARG_ENABLE(glx, AS_HELP_STRING([--disable-glx], [Build GLX extension (default: enabled)]), [GLX=$enableval], [GLX=yes])
|
||||
AC_ARG_ENABLE(dri, AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
|
||||
AC_ARG_ENABLE(dri2, AS_HELP_STRING([--enable-dri2], [Build DRI2 extension (default: auto)]), [DRI2=$enableval])
|
||||
AC_ARG_ENABLE(xinerama, AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
|
||||
AC_ARG_ENABLE(xf86vidmode, AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
|
||||
AC_ARG_ENABLE(xf86misc, AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
|
||||
|
@ -857,6 +862,14 @@ if test "x$DRI" = xyes; then
|
|||
AC_SUBST(GL_CFLAGS)
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(DRI2, test "x$DRI2" = xyes)
|
||||
if test "x$DRI2" = xyes; then
|
||||
# FIXME: Bump the versions once we have releases of these.
|
||||
AC_DEFINE(DRI2, 1, [Build DRI2 extension])
|
||||
PKG_CHECK_MODULES([DRIPROTO], [xf86driproto >= 2.0.3])
|
||||
PKG_CHECK_MODULES([LIBDRM], [libdrm >= 2.3.1])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
|
||||
if test "x$XINERAMA" = xyes; then
|
||||
AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
|
||||
|
@ -2129,6 +2142,7 @@ hw/xfree86/doc/devel/Makefile
|
|||
hw/xfree86/doc/man/Makefile
|
||||
hw/xfree86/doc/sgml/Makefile
|
||||
hw/xfree86/dri/Makefile
|
||||
hw/xfree86/dri2/Makefile
|
||||
hw/xfree86/dummylib/Makefile
|
||||
hw/xfree86/exa/Makefile
|
||||
hw/xfree86/fbdevhw/Makefile
|
||||
|
|
|
@ -4,6 +4,10 @@ if DRI
|
|||
DRI_SUBDIR = dri
|
||||
endif
|
||||
|
||||
if DRI2
|
||||
DRI2_SUBDIR = dri2
|
||||
endif
|
||||
|
||||
if XF86UTILS
|
||||
XF86UTILS_SUBDIR = utils
|
||||
endif
|
||||
|
@ -21,11 +25,11 @@ DOC_SUBDIR = doc
|
|||
SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support parser rac \
|
||||
ramdac shadowfb vbe vgahw xaa $(MFB_SUBDIR) $(CFB_SUBDIR) \
|
||||
xf8_16bpp loader dixmods exa modes \
|
||||
$(DRI_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
|
||||
$(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
|
||||
|
||||
DIST_SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support \
|
||||
parser rac ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp \
|
||||
xf8_16bpp xf8_32bpp loader dixmods dri exa modes \
|
||||
xf8_16bpp xf8_32bpp loader dixmods dri dri2 exa modes \
|
||||
utils doc
|
||||
|
||||
bin_PROGRAMS = Xorg
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
libdri2_la_LTLIBRARIES = libdri2.la
|
||||
libdri2_la_CFLAGS = \
|
||||
-DHAVE_XORG_CONFIG_H \
|
||||
-I@MESA_SOURCE@/include \
|
||||
@DIX_CFLAGS@ @DRIPROTO_CFLAGS@ @LIBDRM_CFLAGS@ \
|
||||
-I$(top_srcdir)/hw/xfree86/common \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support/bus
|
||||
|
||||
libdri2_la_LDFLAGS = -module -avoid-version @LIBDRM_LIBS@
|
||||
libdri2_ladir = $(moduledir)/extensions
|
||||
libdri2_la_SOURCES = \
|
||||
dri2.c \
|
||||
dri2.h
|
||||
|
||||
sdk_HEADERS = dri2.h
|
|
@ -0,0 +1,448 @@
|
|||
/*
|
||||
* Copyright © 2007 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@redhat.com)
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#include <xf86drm.h>
|
||||
#include "xf86Module.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "windowstr.h"
|
||||
#include "dri2.h"
|
||||
#include <GL/internal/dri_sarea.h>
|
||||
|
||||
#include "xf86.h"
|
||||
|
||||
static DevPrivateKey dri2ScreenPrivateKey = &dri2ScreenPrivateKey;
|
||||
static DevPrivateKey dri2WindowPrivateKey = &dri2WindowPrivateKey;
|
||||
static DevPrivateKey dri2PixmapPrivateKey = &dri2PixmapPrivateKey;
|
||||
|
||||
typedef struct _DRI2DrawablePriv {
|
||||
drm_drawable_t drawable;
|
||||
unsigned int handle;
|
||||
} DRI2DrawablePrivRec, *DRI2DrawablePrivPtr;
|
||||
|
||||
typedef struct _DRI2Screen {
|
||||
int fd;
|
||||
drmBO sareaBO;
|
||||
void *sarea;
|
||||
unsigned int sareaSize;
|
||||
const char *driverName;
|
||||
int ddxVersionMajor;
|
||||
int ddxVersionMinor;
|
||||
int ddxVersionPatch;
|
||||
|
||||
__DRIEventBuffer *buffer;
|
||||
int locked;
|
||||
|
||||
DRI2GetPixmapHandleProcPtr getPixmapHandle;
|
||||
DRI2BeginClipNotifyProcPtr beginClipNotify;
|
||||
DRI2EndClipNotifyProcPtr endClipNotify;
|
||||
|
||||
ClipNotifyProcPtr ClipNotify;
|
||||
HandleExposuresProcPtr HandleExposures;
|
||||
} DRI2ScreenRec, *DRI2ScreenPtr;
|
||||
|
||||
static DRI2ScreenPtr
|
||||
DRI2GetScreen(ScreenPtr pScreen)
|
||||
{
|
||||
return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
|
||||
}
|
||||
|
||||
static void *
|
||||
DRI2ScreenAllocEvent(DRI2ScreenPtr ds, size_t size)
|
||||
{
|
||||
unsigned int *pad, mask = ds->buffer->size - 1;
|
||||
size_t pad_size;
|
||||
void *p;
|
||||
|
||||
if ((ds->buffer->head & mask) + size > ds->buffer->size) {
|
||||
/* The requested event size would wrap the buffer, so pad to
|
||||
* the end and allocate the event from the start. */
|
||||
pad_size = ds->buffer->size - (ds->buffer->head & mask);
|
||||
pad = (unsigned int *)
|
||||
(ds->buffer->data + (ds->buffer->prealloc & mask));
|
||||
*pad = DRI2_EVENT_HEADER(DRI2_EVENT_PAD, pad_size);
|
||||
ds->buffer->prealloc += pad_size;
|
||||
}
|
||||
|
||||
p = ds->buffer->data + (ds->buffer->prealloc & mask);
|
||||
ds->buffer->prealloc += size;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static void
|
||||
DRI2ScreenCommitEvents(DRI2ScreenPtr ds)
|
||||
{
|
||||
ds->buffer->head = ds->buffer->prealloc;
|
||||
}
|
||||
|
||||
static void
|
||||
DRI2PostDrawableConfig(DrawablePtr pDraw)
|
||||
{
|
||||
ScreenPtr pScreen = pDraw->pScreen;
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
DRI2DrawablePrivPtr pPriv;
|
||||
WindowPtr pWin;
|
||||
PixmapPtr pPixmap;
|
||||
BoxPtr pBox;
|
||||
BoxRec pixmapBox;
|
||||
int nBox;
|
||||
int i;
|
||||
__DRIDrawableConfigEvent *e;
|
||||
size_t size;
|
||||
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
pWin = (WindowPtr) pDraw;
|
||||
pPriv = dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
|
||||
|
||||
nBox = REGION_NUM_RECTS(&pWin->clipList);
|
||||
pBox = REGION_RECTS(&pWin->clipList);
|
||||
|
||||
pPixmap = pScreen->GetWindowPixmap(pWin);
|
||||
} else {
|
||||
pPixmap = (PixmapPtr) pDraw;
|
||||
pPriv = dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
|
||||
|
||||
pixmapBox.x1 = 0;
|
||||
pixmapBox.y1 = 0;
|
||||
pixmapBox.x2 = pDraw->width;
|
||||
pixmapBox.y2 = pDraw->height;
|
||||
nBox = 1;
|
||||
pBox = &pixmapBox;
|
||||
}
|
||||
|
||||
if (!pPriv)
|
||||
return;
|
||||
|
||||
size = sizeof *e + nBox * sizeof e->rects[0];
|
||||
|
||||
e = DRI2ScreenAllocEvent(ds, size);
|
||||
e->event_header = DRI2_EVENT_HEADER(DRI2_EVENT_DRAWABLE_CONFIG, size);
|
||||
e->drawable = pPriv->drawable;
|
||||
e->x = pDraw->x - pPixmap->screen_x;
|
||||
e->y = pDraw->y - pPixmap->screen_y;
|
||||
e->width = pDraw->width;
|
||||
e->height = pDraw->height;
|
||||
|
||||
e->num_rects = nBox;
|
||||
for (i = 0; i < nBox; i++) {
|
||||
e->rects[i].x1 = pBox->x1 - pPixmap->screen_x;
|
||||
e->rects[i].y1 = pBox->y1 - pPixmap->screen_y;
|
||||
e->rects[i].x2 = pBox->x2 - pPixmap->screen_x;
|
||||
e->rects[i].y2 = pBox->y2 - pPixmap->screen_y;
|
||||
pBox++;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
DRI2PostBufferAttach(DrawablePtr pDraw)
|
||||
{
|
||||
ScreenPtr pScreen = pDraw->pScreen;
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
DRI2DrawablePrivPtr pPriv;
|
||||
WindowPtr pWin;
|
||||
PixmapPtr pPixmap;
|
||||
__DRIBufferAttachEvent *e;
|
||||
size_t size;
|
||||
unsigned int handle, flags;
|
||||
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
pWin = (WindowPtr) pDraw;
|
||||
pPixmap = pScreen->GetWindowPixmap(pWin);
|
||||
pPriv = dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
|
||||
} else {
|
||||
pPixmap = (PixmapPtr) pDraw;
|
||||
pPriv = dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
|
||||
}
|
||||
|
||||
if (!pPriv)
|
||||
return;
|
||||
|
||||
size = sizeof *e;
|
||||
|
||||
handle = ds->getPixmapHandle(pPixmap, &flags);
|
||||
if (handle == 0 || handle == pPriv->handle)
|
||||
return;
|
||||
|
||||
e = DRI2ScreenAllocEvent(ds, size);
|
||||
e->event_header = DRI2_EVENT_HEADER(DRI2_EVENT_BUFFER_ATTACH, size);
|
||||
e->drawable = pPriv->drawable;
|
||||
e->buffer.attachment = DRI_DRAWABLE_BUFFER_FRONT_LEFT;
|
||||
e->buffer.handle = handle;
|
||||
e->buffer.pitch = pPixmap->devKind;
|
||||
e->buffer.cpp = pPixmap->drawable.bitsPerPixel / 8;
|
||||
e->buffer.flags = flags;
|
||||
|
||||
pPriv->handle = handle;
|
||||
}
|
||||
|
||||
static void
|
||||
DRI2ClipNotify(WindowPtr pWin, int dx, int dy)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
|
||||
if (!ds->locked) {
|
||||
ds->beginClipNotify(pScreen);
|
||||
ds->locked = 1;
|
||||
}
|
||||
|
||||
if (ds->ClipNotify) {
|
||||
pScreen->ClipNotify = ds->ClipNotify;
|
||||
pScreen->ClipNotify(pWin, dx, dy);
|
||||
pScreen->ClipNotify = DRI2ClipNotify;
|
||||
}
|
||||
|
||||
DRI2PostDrawableConfig(&pWin->drawable);
|
||||
DRI2PostBufferAttach(&pWin->drawable);
|
||||
}
|
||||
|
||||
static void
|
||||
DRI2HandleExposures(WindowPtr pWin)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
|
||||
if (ds->HandleExposures) {
|
||||
pScreen->HandleExposures = ds->HandleExposures;
|
||||
pScreen->HandleExposures(pWin);
|
||||
pScreen->HandleExposures = DRI2HandleExposures;
|
||||
}
|
||||
|
||||
DRI2ScreenCommitEvents(ds);
|
||||
|
||||
if (ds->locked) {
|
||||
ds->endClipNotify(pScreen);
|
||||
ds->locked = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DRI2CloseScreen(ScreenPtr pScreen)
|
||||
{
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
|
||||
pScreen->ClipNotify = ds->ClipNotify;
|
||||
pScreen->HandleExposures = ds->HandleExposures;
|
||||
|
||||
drmBOUnmap(ds->fd, &ds->sareaBO);
|
||||
drmBOUnreference(ds->fd, &ds->sareaBO);
|
||||
|
||||
xfree(ds);
|
||||
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
|
||||
}
|
||||
|
||||
Bool
|
||||
DRI2CreateDrawable(ScreenPtr pScreen,
|
||||
DrawablePtr pDraw, drm_drawable_t *pDrmDrawable)
|
||||
{
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
WindowPtr pWin;
|
||||
PixmapPtr pPixmap;
|
||||
DRI2DrawablePrivPtr pPriv;
|
||||
DevPrivateKey key;
|
||||
PrivateRec **devPrivates;
|
||||
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
pWin = (WindowPtr) pDraw;
|
||||
devPrivates = &pWin->devPrivates;
|
||||
key = dri2WindowPrivateKey;
|
||||
} else {
|
||||
pPixmap = (PixmapPtr) pDraw;
|
||||
devPrivates = &pPixmap->devPrivates;
|
||||
key = dri2PixmapPrivateKey;
|
||||
}
|
||||
|
||||
pPriv = dixLookupPrivate(devPrivates, key);
|
||||
if (pPriv == NULL) {
|
||||
pPriv = xalloc(sizeof *pPriv);
|
||||
if (drmCreateDrawable(ds->fd, &pPriv->drawable))
|
||||
return FALSE;
|
||||
|
||||
dixSetPrivate(devPrivates, key, pPriv);
|
||||
}
|
||||
|
||||
*pDrmDrawable = pPriv->drawable;
|
||||
|
||||
DRI2PostDrawableConfig(pDraw);
|
||||
DRI2PostBufferAttach(pDraw);
|
||||
DRI2ScreenCommitEvents(ds);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
DRI2DestroyDrawable(ScreenPtr pScreen, DrawablePtr pDraw)
|
||||
{
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
PixmapPtr pPixmap;
|
||||
WindowPtr pWin;
|
||||
DRI2DrawablePrivPtr pPriv;
|
||||
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
pWin = (WindowPtr) pDraw;
|
||||
pPriv = dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
|
||||
dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, NULL);
|
||||
} else {
|
||||
pPixmap = (PixmapPtr) pDraw;
|
||||
pPriv = dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
|
||||
dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, NULL);
|
||||
}
|
||||
|
||||
if (pPriv == NULL)
|
||||
return;
|
||||
|
||||
drmDestroyDrawable(ds->fd, pPriv->drawable);
|
||||
xfree(pPriv);
|
||||
}
|
||||
|
||||
Bool
|
||||
DRI2Connect(ScreenPtr pScreen, int *fd, const char **driverName,
|
||||
int *ddxMajor, int *ddxMinor, int *ddxPatch,
|
||||
unsigned int *sareaHandle)
|
||||
{
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
|
||||
if (ds == NULL)
|
||||
return FALSE;
|
||||
|
||||
*fd = ds->fd;
|
||||
*driverName = ds->driverName;
|
||||
*ddxMajor = ds->ddxVersionMajor;
|
||||
*ddxMinor = ds->ddxVersionMinor;
|
||||
*ddxPatch = ds->ddxVersionPatch;
|
||||
*sareaHandle = ds->sareaBO.handle;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void *
|
||||
DRI2SetupSAREA(ScreenPtr pScreen, size_t driverSareaSize)
|
||||
{
|
||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||
unsigned long mask;
|
||||
const size_t event_buffer_size = 32 * 1024;
|
||||
|
||||
ds->sareaSize =
|
||||
sizeof(*ds->buffer) + event_buffer_size +
|
||||
driverSareaSize +
|
||||
sizeof (unsigned int);
|
||||
|
||||
mask = DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | DRM_BO_FLAG_MAPPABLE |
|
||||
DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_SHAREABLE;
|
||||
|
||||
if (drmBOCreate(ds->fd, ds->sareaSize, 1, NULL, mask, 0, &ds->sareaBO))
|
||||
return NULL;
|
||||
|
||||
if (drmBOMap(ds->fd, &ds->sareaBO,
|
||||
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &ds->sarea)) {
|
||||
drmBOUnreference(ds->fd, &ds->sareaBO);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xf86DrvMsg(pScreen->myNum, X_INFO,
|
||||
"[DRI2] Allocated %d byte SAREA, BO handle 0x%08x\n",
|
||||
ds->sareaSize, ds->sareaBO.handle);
|
||||
memset(ds->sarea, 0, ds->sareaSize);
|
||||
|
||||
ds->buffer = ds->sarea;
|
||||
ds->buffer->block_header =
|
||||
DRI2_SAREA_BLOCK_HEADER(DRI2_SAREA_BLOCK_EVENT_BUFFER,
|
||||
sizeof *ds->buffer + event_buffer_size);
|
||||
ds->buffer->size = event_buffer_size;
|
||||
|
||||
return DRI2_SAREA_BLOCK_NEXT(ds->buffer);
|
||||
}
|
||||
|
||||
void *
|
||||
DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||
{
|
||||
DRI2ScreenPtr ds;
|
||||
void *p;
|
||||
|
||||
ds = xalloc(sizeof *ds);
|
||||
if (!ds)
|
||||
return NULL;
|
||||
|
||||
ds->fd = info->fd;
|
||||
ds->driverName = info->driverName;
|
||||
ds->ddxVersionMajor = info->ddxVersionMajor;
|
||||
ds->ddxVersionMinor = info->ddxVersionMinor;
|
||||
ds->ddxVersionPatch = info->ddxVersionPatch;
|
||||
|
||||
ds->getPixmapHandle = info->getPixmapHandle;
|
||||
ds->beginClipNotify = info->beginClipNotify;
|
||||
ds->endClipNotify = info->endClipNotify;
|
||||
|
||||
ds->ClipNotify = pScreen->ClipNotify;
|
||||
pScreen->ClipNotify = DRI2ClipNotify;
|
||||
ds->HandleExposures = pScreen->HandleExposures;
|
||||
pScreen->HandleExposures = DRI2HandleExposures;
|
||||
|
||||
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
|
||||
|
||||
p = DRI2SetupSAREA(pScreen, info->driverSareaSize);
|
||||
if (p == NULL) {
|
||||
xfree(ds);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static pointer
|
||||
DRI2Setup(pointer module, pointer opts, int *errmaj, int *errmin)
|
||||
{
|
||||
return (pointer) 1;
|
||||
}
|
||||
|
||||
static XF86ModuleVersionInfo DRI2VersRec =
|
||||
{
|
||||
"dri2",
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
1, 0, 0,
|
||||
ABI_CLASS_EXTENSION,
|
||||
ABI_EXTENSION_VERSION,
|
||||
MOD_CLASS_NONE,
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
_X_EXPORT XF86ModuleData dri2ModuleData = { &DRI2VersRec, DRI2Setup, NULL };
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright © 2007 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@redhat.com)
|
||||
*/
|
||||
|
||||
#ifndef _DRI2_H_
|
||||
#define _DRI2_H_
|
||||
|
||||
typedef unsigned int (*DRI2GetPixmapHandleProcPtr)(PixmapPtr p,
|
||||
unsigned int *flags);
|
||||
typedef void (*DRI2BeginClipNotifyProcPtr)(ScreenPtr pScreen);
|
||||
typedef void (*DRI2EndClipNotifyProcPtr)(ScreenPtr pScreen);
|
||||
|
||||
typedef struct {
|
||||
unsigned int version; /* Version of this struct */
|
||||
int fd;
|
||||
size_t driverSareaSize;
|
||||
const char *driverName;
|
||||
int ddxVersionMajor, ddxVersionMinor, ddxVersionPatch;
|
||||
DRI2GetPixmapHandleProcPtr getPixmapHandle;
|
||||
DRI2BeginClipNotifyProcPtr beginClipNotify;
|
||||
DRI2EndClipNotifyProcPtr endClipNotify;
|
||||
} DRI2InfoRec, *DRI2InfoPtr;
|
||||
|
||||
void *DRI2ScreenInit(ScreenPtr pScreen,
|
||||
DRI2InfoPtr info);
|
||||
|
||||
void DRI2CloseScreen(ScreenPtr pScreen);
|
||||
|
||||
Bool DRI2Connect(ScreenPtr pScreen,
|
||||
int *fd,
|
||||
const char **driverName,
|
||||
int *ddxMajor,
|
||||
int *ddxMinor,
|
||||
int *ddxPatch,
|
||||
unsigned int *sareaHandle);
|
||||
|
||||
void DRI2Lock(ScreenPtr pScreen);
|
||||
void DRI2Unlock(ScreenPtr pScreen);
|
||||
|
||||
Bool DRI2CreateDrawable(ScreenPtr pScreen,
|
||||
DrawablePtr pDraw,
|
||||
drm_drawable_t *pDrmDrawable);
|
||||
|
||||
void DRI2DestroyDrawable(ScreenPtr pScreen,
|
||||
DrawablePtr pDraw);
|
||||
|
||||
void DRI2ExtensionInit(void);
|
||||
|
||||
#endif
|
|
@ -436,6 +436,9 @@
|
|||
|
||||
#undef XEPHYR_DRI
|
||||
|
||||
/* Build DRI2 extension */
|
||||
#undef DRI2
|
||||
|
||||
/* Build DBE support */
|
||||
#undef DBE
|
||||
|
||||
|
|
|
@ -54,6 +54,9 @@
|
|||
/* Building DRI-capable DDX. */
|
||||
#undef XF86DRI
|
||||
|
||||
/* Build DRI2 extension */
|
||||
#undef DRI2
|
||||
|
||||
/* Solaris 8 or later? */
|
||||
#undef __SOL8__
|
||||
|
||||
|
|
|
@ -142,6 +142,9 @@
|
|||
/* Build DRI extension */
|
||||
#undef XF86DRI
|
||||
|
||||
/* Build DRI2 extension */
|
||||
#undef DRI2
|
||||
|
||||
/* Build Xorg server */
|
||||
#undef XORGSERVER
|
||||
|
||||
|
|
Loading…
Reference in New Issue