From 0ffb6a3ad010e80fe8f973fc228d549f9dd3effd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 14 Feb 2008 22:20:56 -0500 Subject: [PATCH] GLX: Implement support for TTM BO based TFP when available. --- GL/glx/glxdri2.c | 60 ++++++++++++++++++++++++++++++++++++++++++ hw/xfree86/dri2/dri2.c | 8 ++++++ hw/xfree86/dri2/dri2.h | 3 +++ 3 files changed, 71 insertions(+) diff --git a/GL/glx/glxdri2.c b/GL/glx/glxdri2.c index d8df604c2..d1c8d417e 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,6 +214,55 @@ __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; +} + +static int +__glXDRIreleaseTexImage(__GLXcontext *baseContext, + int buffer, + __GLXdrawable *pixmap) +{ + /* FIXME: Just unbind the texture? */ + return Success; +} + +#else + static int __glXDRIbindTexImage(__GLXcontext *baseContext, int buffer, @@ -229,6 +279,8 @@ __glXDRIreleaseTexImage(__GLXcontext *baseContext, 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 7c703a72c..3bc533ede 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 65b4c6b76..c687a93f6 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);