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