xserver: Branch 'master' - 2 commits
Kristian Høgsberg
krh at kemper.freedesktop.org
Fri Jul 7 08:46:26 EEST 2006
GL/glx/g_disptab.h | 9 +++++++
GL/glx/glxcmds.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++-
GL/glx/glxcmdsswap.c | 29 ++++++++++++++++++++++-
GL/glx/glxdrawable.h | 2 +
GL/glx/glxdri.c | 48 ++++++++++++++++++++++++++++++++++----
GL/glx/glxscreens.c | 1
6 files changed, 145 insertions(+), 7 deletions(-)
New commits:
diff-tree 5416f90e9c939027005fc01fa3ce3df56919ae0d (from b84374b2917a91a7732e780ffab6a29c807a3ecc)
Author: Kristian Høgsberg <krh at redhat.com>
Date: Thu Jul 6 21:22:34 2006 -0400
Implement GLX_MESA_copy_sub_buffer.
diff --git a/GL/glx/glxcmds.c b/GL/glx/glxcmds.c
index 3ec796c..e2aaf3a 100644
--- a/GL/glx/glxcmds.c
+++ b/GL/glx/glxcmds.c
@@ -1605,8 +1605,13 @@ int __glXReleaseTexImageEXT(__GLXclientS
int __glXCopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
{
xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ GLXContextTag tag = req->contextTag;
+ __GLXcontext *glxc = NULL;
+ __GLXdrawable *pGlxDraw;
+ __GLXpixmap *pPixmap;
ClientPtr client = cl->client;
GLXDrawable drawId;
+ int error;
int x, y, width, height;
(void) client;
@@ -1620,7 +1625,40 @@ int __glXCopySubBufferMESA(__GLXclientSt
width = *((INT32 *) (pc + 12));
height = *((INT32 *) (pc + 16));
- return BadRequest;
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc) {
+ return __glXError(GLXBadContextTag);
+ }
+ /*
+ ** The calling thread is swapping its current drawable. In this case,
+ ** glxSwapBuffers is in both GL and X streams, in terms of
+ ** sequentiality.
+ */
+ if (__glXForceCurrent(cl, tag, &error)) {
+ /*
+ ** Do whatever is needed to make sure that all preceding requests
+ ** in both streams are completed before the swap is executed.
+ */
+ CALL_Finish( GET_DISPATCH(), () );
+ __GLX_NOTE_FLUSHED_CMDS(glxc);
+ } else {
+ return error;
+ }
+ }
+
+ error = GetDrawableOrPixmap(glxc, drawId, &pGlxDraw, &pPixmap, client);
+ if (error != Success)
+ return error;
+
+ if (pGlxDraw == NULL ||
+ pGlxDraw->type != DRAWABLE_WINDOW ||
+ pGlxDraw->copySubBuffer == NULL)
+ return __glXError(GLXBadDrawable);
+
+ (*pGlxDraw->copySubBuffer)(pGlxDraw, x, y, width, height);
+
+ return Success;
}
/*
diff --git a/GL/glx/glxdrawable.h b/GL/glx/glxdrawable.h
index 4514e26..e6d2cd6 100644
--- a/GL/glx/glxdrawable.h
+++ b/GL/glx/glxdrawable.h
@@ -58,6 +58,8 @@ struct __GLXdrawable {
void (*destroy)(__GLXdrawable *private);
GLboolean (*resize)(__GLXdrawable *private);
GLboolean (*swapBuffers)(__GLXdrawable *);
+ void (*copySubBuffer)(__GLXdrawable *drawable,
+ int x, int y, int w, int h);
/*
** list of drawable private structs
diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index 4239229..6a10554 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -112,12 +112,28 @@ struct __GLXDRIdrawable {
* months ago. :(
* 20050727 - Gut all the old interfaces. This breaks compatability with
* any DRI driver built to any previous version.
+ * 20060314 - Added support for GLX_MESA_copy_sub_buffer.
*/
+
#define INTERNAL_VERSION 20050727
static const char CREATE_NEW_SCREEN_FUNC[] =
"__driCreateNewScreen_" STRINGIFY (INTERNAL_VERSION);
+/* The DRI driver entry point version wasn't bumped when the
+ * copySubBuffer functionality was added to the DRI drivers, but the
+ * functionality is still conditional on the value of the
+ * internal_api_version passed to __driCreateNewScreen. However, the
+ * screen constructor doesn't fail for a DRI driver that's older than
+ * the passed in version number, so there's no way we can know for
+ * sure that we can actually use the copySubBuffer functionality. But
+ * since the earliest (and at this point only) released mesa version
+ * (6.5) that uses the 20050727 entry point does have copySubBuffer,
+ * we'll just settle for that. We still have to pass in a higher to
+ * the screen constructor to enable the functionality.
+ */
+#define COPY_SUB_BUFFER_INTERNAL_VERSION 20060314
+
static void
__glXDRIleaveServer(void)
{
@@ -178,6 +194,27 @@ __glXDRIdrawableSwapBuffers(__GLXdrawabl
}
static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
+ int x, int y, int w, int h)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+ __GLXDRIscreen *screen;
+
+ /* FIXME: We're jumping through hoops here to get the DRIdrawable
+ * which the dri driver tries to keep to it self... cf. FIXME in
+ * createDrawable. */
+
+ screen = (__GLXDRIscreen *) __glXgetActiveScreen(private->base.pDraw->pScreen->myNum);
+ private->driDrawable = (screen->driScreen.getDrawable)(NULL,
+ private->base.drawId,
+ screen->driScreen.private);
+
+ (*private->driDrawable->copySubBuffer)(NULL,
+ private->driDrawable->private,
+ x, y, w, h);
+}
+
+static void
__glXDRIcontextDestroy(__GLXcontext *baseContext)
{
__GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
@@ -474,10 +511,11 @@ __glXDRIscreenCreateDrawable(__GLXscreen
return NULL;
}
- private->base.destroy = __glXDRIdrawableDestroy;
- private->base.resize = __glXDRIdrawableResize;
- private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
-
+ private->base.destroy = __glXDRIdrawableDestroy;
+ private->base.resize = __glXDRIdrawableResize;
+ private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
+ private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+
#if 0
/* FIXME: It would only be natural that we called
* driScreen->createNewDrawable here but the DRI drivers manage
@@ -770,7 +808,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
__DRIframebuffer framebuffer;
int fd = -1;
int status;
- int api_ver = INTERNAL_VERSION;
+ int api_ver = COPY_SUB_BUFFER_INTERNAL_VERSION;
drm_magic_t magic;
drmVersionPtr version;
char *driverName;
diff-tree b84374b2917a91a7732e780ffab6a29c807a3ecc (from 2152e2d364bdd179cf218cde446c763d8c8bb833)
Author: Kristian Høgsberg <krh at redhat.com>
Date: Thu Jul 6 02:28:55 2006 -0400
Add GLX_MESA_copy_sub_buffer marshalling support.
diff --git a/GL/glx/g_disptab.h b/GL/glx/g_disptab.h
index 9be5bdf..a83c7a8 100644
--- a/GL/glx/g_disptab.h
+++ b/GL/glx/g_disptab.h
@@ -48,6 +48,7 @@ extern int __glXCopyContext(__GLXclientS
extern int __glXSwapBuffers(__GLXclientState*, GLbyte*);
extern int __glXBindTexImageEXT(__GLXclientState *cl, GLbyte *pc);
extern int __glXReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc);
+extern int __glXCopySubBufferMESA(__GLXclientState *cl, GLbyte *pc);
extern int __glXGetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc);
extern int __glXUseXFont(__GLXclientState*, GLbyte*);
extern int __glXCreateGLXPixmap(__GLXclientState*, GLbyte*);
@@ -85,6 +86,7 @@ extern int __glXSwapCopyContext(__GLXcli
extern int __glXSwapSwapBuffers(__GLXclientState*, GLbyte*);
extern int __glXSwapBindTexImageEXT(__GLXclientState *cl, GLbyte *pc);
extern int __glXSwapReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc);
+extern int __glXSwapReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc);
extern int __glXSwapGetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc);
extern int __glXSwapUseXFont(__GLXclientState*, GLbyte*);
extern int __glXSwapCreateGLXPixmap(__GLXclientState*, GLbyte*);
@@ -124,4 +126,11 @@ extern __GLXdispatchRenderProcPtr __glXR
extern __GLXdispatchSingleProcPtr __glXSingleTable[__GLX_SINGLE_TABLE_SIZE];
extern __GLXdispatchRenderProcPtr __glXSwapRenderTable[__GLX_RENDER_TABLE_SIZE];
extern __GLXdispatchSingleProcPtr __glXSwapSingleTable[__GLX_SINGLE_TABLE_SIZE];
+
+/* Copied from mesa src/glx/x11/glxcmds.c
+ *
+ * Apparently there's no standardized opcode for this extension.
+ */
+#define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
+
#endif /* _GLX_g_disptab_h_ */
diff --git a/GL/glx/glxcmds.c b/GL/glx/glxcmds.c
index 8033f5d..3ec796c 100644
--- a/GL/glx/glxcmds.c
+++ b/GL/glx/glxcmds.c
@@ -1602,6 +1602,27 @@ int __glXReleaseTexImageEXT(__GLXclientS
pGlxPixmap);
}
+int __glXCopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ ClientPtr client = cl->client;
+ GLXDrawable drawId;
+ int x, y, width, height;
+
+ (void) client;
+ (void) req;
+
+ pc += __GLX_VENDPRIV_HDR_SIZE;
+
+ drawId = *((CARD32 *) (pc));
+ x = *((INT32 *) (pc + 4));
+ y = *((INT32 *) (pc + 8));
+ width = *((INT32 *) (pc + 12));
+ height = *((INT32 *) (pc + 16));
+
+ return BadRequest;
+}
+
/*
** Get drawable attributes
*/
@@ -2238,7 +2259,9 @@ int __glXVendorPrivate(__GLXclientState
case X_GLXvop_BindTexImageEXT:
return __glXBindTexImageEXT(cl, pc);
case X_GLXvop_ReleaseTexImageEXT:
- return __glXReleaseTexImageEXT(cl, pc);
+ return __glXReleaseTexImageEXT(cl, pc);
+ case X_GLXvop_CopySubBufferMESA:
+ return __glXCopySubBufferMESA(cl, pc);
}
#endif
diff --git a/GL/glx/glxcmdsswap.c b/GL/glx/glxcmdsswap.c
index b8f958b..4ce53b7 100644
--- a/GL/glx/glxcmdsswap.c
+++ b/GL/glx/glxcmdsswap.c
@@ -494,6 +494,31 @@ int __glXSwapReleaseTexImageEXT(__GLXcli
return __glXReleaseTexImageEXT(cl, (GLbyte *)pc);
}
+int __glXSwapCopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ GLXDrawable *drawId;
+ int *buffer;
+
+ (void) drawId;
+ (void) buffer;
+
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ pc += __GLX_VENDPRIV_HDR_SIZE;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+ __GLX_SWAP_INT(pc);
+ __GLX_SWAP_INT(pc + 4);
+ __GLX_SWAP_INT(pc + 8);
+ __GLX_SWAP_INT(pc + 12);
+ __GLX_SWAP_INT(pc + 16);
+
+ return __glXCopySubBufferMESA(cl, pc);
+
+}
+
int __glXSwapGetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
{
xGLXVendorPrivateWithReplyReq *req = (xGLXVendorPrivateWithReplyReq *)pc;
@@ -973,7 +998,9 @@ int __glXSwapVendorPrivate(__GLXclientSt
case X_GLXvop_BindTexImageEXT:
return __glXSwapBindTexImageEXT(cl, pc);
case X_GLXvop_ReleaseTexImageEXT:
- return __glXSwapReleaseTexImageEXT(cl, pc);
+ return __glXSwapReleaseTexImageEXT(cl, pc);
+ case X_GLXvop_CopySubBufferMESA:
+ return __glXSwapCopySubBufferMESA(cl, pc);
}
#endif
diff --git a/GL/glx/glxscreens.c b/GL/glx/glxscreens.c
index 77654d3..3809af3 100644
--- a/GL/glx/glxscreens.c
+++ b/GL/glx/glxscreens.c
@@ -139,6 +139,7 @@ static char GLXServerExtensions[] =
"GLX_SGIX_swap_barrier "
#endif
"GLX_SGIX_fbconfig "
+ "GLX_MESA_copy_sub_buffer "
;
__GLXscreen **__glXActiveScreens;
More information about the xorg-commit
mailing list