xserver: Branch 'master'
Kristian Høgsberg
krh at kemper.freedesktop.org
Thu Feb 14 19:21:52 PST 2008
GL/glx/glxdri2.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/xfree86/dri2/dri2.c | 8 ++++++
hw/xfree86/dri2/dri2.h | 3 ++
3 files changed, 71 insertions(+)
New commits:
commit 0ffb6a3ad010e80fe8f973fc228d549f9dd3effd
Author: Kristian Høgsberg <krh at redhat.com>
Date: Thu Feb 14 22:20:56 2008 -0500
GLX: Implement support for TTM BO based TFP when available.
diff --git a/GL/glx/glxdri2.c b/GL/glx/glxdri2.c
index d8df604..d1c8d41 100644
--- a/GL/glx/glxdri2.c
+++ b/GL/glx/glxdri2.c
@@ -75,6 +75,7 @@ struct __GLXDRIscreen {
__DRIcopySubBufferExtension *copySubBuffer;
__DRIswapControlExtension *swapControl;
+ __DRItexBufferExtension *texBuffer;
unsigned char glx_enable_bits[__GLX_EXT_BYTES];
};
@@ -213,11 +214,41 @@ __glXDRIcontextForceCurrent(__GLXcontext *baseContext)
&read->driDrawable);
}
+#ifdef __DRI_TEX_BUFFER
+
+#define isPowerOfTwo(n) (((n) & ((n) - 1 )) == 0)
+
static int
__glXDRIbindTexImage(__GLXcontext *baseContext,
int buffer,
__GLXdrawable *glxPixmap)
{
+ ScreenPtr pScreen = glxPixmap->pDraw->pScreen;
+ __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen);
+ PixmapPtr pixmap;
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ unsigned int flags;
+ int w, h, target;
+
+ if (screen->texBuffer == NULL)
+ return Success;
+
+ pixmap = (PixmapPtr) glxPixmap->pDraw;
+ w = pixmap->drawable.width;
+ h = pixmap->drawable.height;
+
+ if (!isPowerOfTwo(w) || !isPowerOfTwo(h))
+ target = GL_TEXTURE_RECTANGLE_ARB;
+ else
+ target = GL_TEXTURE_2D;
+
+ screen->texBuffer->setTexBuffer(&context->driContext,
+ target,
+ DRI2GetPixmapHandle(pixmap, &flags),
+ pixmap->drawable.depth,
+ pixmap->devKind,
+ h);
+
return Success;
}
@@ -226,9 +257,30 @@ __glXDRIreleaseTexImage(__GLXcontext *baseContext,
int buffer,
__GLXdrawable *pixmap)
{
+ /* FIXME: Just unbind the texture? */
return Success;
}
+#else
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *glxPixmap)
+{
+ return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ return Success;
+}
+
+#endif
+
static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
__glXDRIbindTexImage,
__glXDRIreleaseTexImage
@@ -434,6 +486,14 @@ initializeExtensions(__GLXDRIscreen *screen)
LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
}
#endif
+
+#ifdef __DRI_TEX_BUFFER
+ if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
+ screen->texBuffer = (__DRItexBufferExtension *) extensions[i];
+ /* GLX_EXT_texture_from_pixmap is always enabled. */
+ LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
+ }
+#endif
/* Ignore unknown extensions */
}
}
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 7c703a7..3bc533e 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -348,6 +348,14 @@ DRI2Connect(ScreenPtr pScreen, int *fd, const char **driverName,
return TRUE;
}
+unsigned int
+DRI2GetPixmapHandle(PixmapPtr pPixmap, unsigned int *flags)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pPixmap->drawable.pScreen);
+
+ return ds->getPixmapHandle(pPixmap, flags);
+}
+
static void *
DRI2SetupSAREA(ScreenPtr pScreen, size_t driverSareaSize)
{
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index 65b4c6b..c687a93 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -62,6 +62,9 @@ Bool DRI2Connect(ScreenPtr pScreen,
int *ddxPatch,
unsigned int *sareaHandle);
+unsigned int DRI2GetPixmapHandle(PixmapPtr pPixmap,
+ unsigned int *flags);
+
void DRI2Lock(ScreenPtr pScreen);
void DRI2Unlock(ScreenPtr pScreen);
More information about the xorg-commit
mailing list