SOURCES: xorg-xserver-xgl-mesa-dri-copy-sub-buffer-1.patch (NEW) h...
wolf
wolf at pld-linux.org
Sat Mar 18 13:18:09 CET 2006
Author: wolf Date: Sat Mar 18 12:18:09 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
http://freedesktop.org/~davidr/mesa-dri-copy-sub-buffer-1.patch
---- Files affected:
SOURCES:
xorg-xserver-xgl-mesa-dri-copy-sub-buffer-1.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/xorg-xserver-xgl-mesa-dri-copy-sub-buffer-1.patch
diff -u /dev/null SOURCES/xorg-xserver-xgl-mesa-dri-copy-sub-buffer-1.patch:1.1
--- /dev/null Sat Mar 18 13:18:09 2006
+++ SOURCES/xorg-xserver-xgl-mesa-dri-copy-sub-buffer-1.patch Sat Mar 18 13:18:04 2006
@@ -0,0 +1,818 @@
+--- include/GL/internal/dri_interface.h 29 Nov 2005 23:01:43 -0000 1.17
++++ include/GL/internal/dri_interface.h 12 Mar 2006 15:58:04 -0000
+@@ -472,6 +472,9 @@
+ * \since Internal API version 20030317.
+ */
+ unsigned swap_interval;
++
++ void (*copySubBuffer)(__DRInativeDisplay *dpy, void *drawablePrivate,
++ int x, int y, int w, int h);
+ };
+
+ #endif
+--- src/glx/x11/glxcmds.c 9 Mar 2006 16:25:46 -0000 1.13
++++ src/glx/x11/glxcmds.c 12 Mar 2006 15:58:41 -0000
+@@ -2570,18 +2570,69 @@
+ return 0;
+ }
+
+-
++#define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
+ PUBLIC void glXCopySubBufferMESA(Display *dpy, GLXDrawable drawable,
+ int x, int y, int width, int height)
+ {
+- (void) dpy;
+- (void) drawable;
+- (void) x;
+- (void) y;
+- (void) width;
+- (void) height;
+-}
++ xGLXVendorPrivateReq *req;
++ GLXContext gc;
++ GLXContextTag tag;
++ CARD32 *drawable_ptr;
++ INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
++ CARD8 opcode;
++
++#ifdef GLX_DIRECT_RENDERING
++ int screen;
++ __DRIdrawable *pdraw = GetDRIDrawable( dpy, drawable, & screen );
++ if ( pdraw != NULL ) {
++ __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, screen );
++ if ( __glXExtensionBitIsEnabled( psc, MESA_copy_sub_buffer_bit ) ) {
++ (*pdraw->copySubBuffer)(dpy, pdraw->private, x, y, width, height);
++ }
++
++ return;
++ }
++#endif
++
++ opcode = __glXSetupForCommand(dpy);
++ if (!opcode)
++ return;
++
++ /*
++ ** The calling thread may or may not have a current context. If it
++ ** does, send the context tag so the server can do a flush.
++ */
++ gc = __glXGetCurrentContext();
++ if ((gc != NULL) && (dpy == gc->currentDpy) &&
++ ((drawable == gc->currentDrawable) ||
++ (drawable == gc->currentReadable)) ) {
++ tag = gc->currentContextTag;
++ } else {
++ tag = 0;
++ }
++
++ LockDisplay(dpy);
++ GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4,req);
++ req->reqType = opcode;
++ req->glxCode = X_GLXVendorPrivate;
++ req->vendorCode = X_GLXvop_CopySubBufferMESA;
++ req->contextTag = tag;
+
++ drawable_ptr = (CARD32 *) (req + 1);
++ x_ptr = (INT32 *) (drawable_ptr + 1);
++ y_ptr = (INT32 *) (drawable_ptr + 2);
++ w_ptr = (INT32 *) (drawable_ptr + 3);
++ h_ptr = (INT32 *) (drawable_ptr + 4);
++
++ *drawable_ptr = drawable;
++ *x_ptr = x;
++ *y_ptr = y;
++ *w_ptr = width;
++ *h_ptr = height;
++
++ UnlockDisplay(dpy);
++ SyncHandle();
++}
+
+ PUBLIC Bool glXSet3DfxModeMESA( int mode )
+ {
+--- src/glx/x11/glxextensions.c 24 Feb 2006 15:36:24 -0000 1.13
++++ src/glx/x11/glxextensions.c 12 Mar 2006 15:58:41 -0000
+@@ -79,7 +79,7 @@
+ { GLX(EXT_visual_rating), VER(0,0), Y, Y, N, N },
+ { GLX(MESA_agp_offset), VER(0,0), N, N, N, Y }, /* Deprecated */
+ { GLX(MESA_allocate_memory), VER(0,0), Y, N, N, Y },
+- { GLX(MESA_copy_sub_buffer), VER(0,0), N, N, N, N }, /* Deprecated? */
++ { GLX(MESA_copy_sub_buffer), VER(0,0), Y, Y, N, N }, /* Deprecated? */
+ { GLX(MESA_pixmap_colormap), VER(0,0), N, N, N, N }, /* Deprecated */
+ { GLX(MESA_release_buffers), VER(0,0), N, N, N, N }, /* Deprecated */
+ { GLX(MESA_set_3dfx_mode), VER(0,0), N, N, N, N }, /* Deprecated */
+--- src/mesa/drivers/dri/common/dri_util.c 29 Nov 2005 23:01:43 -0000 1.29
++++ src/mesa/drivers/dri/common/dri_util.c 12 Mar 2006 15:58:46 -0000
+@@ -547,6 +547,13 @@
+ remainder );
+ }
+
++static void driCopySubBuffer( __DRInativeDisplay *dpy, void *drawablePrivate,
++ int x, int y, int w, int h)
++{
++ __DRIdrawablePrivate *dPriv = (__DRIdrawablePrivate *) drawablePrivate;
++ dPriv->driScreenPriv->DriverAPI.CopySubBuffer(dPriv, x, y, w, h);
++ (void) dpy;
++}
+
+ /**
+ * This is called via __DRIscreenRec's createNewDrawable pointer.
+@@ -622,6 +629,7 @@
+ pdraw->swapBuffersMSC = driSwapBuffersMSC;
+ pdraw->frameTracking = NULL;
+ pdraw->queryFrameTracking = driQueryFrameTracking;
++ pdraw->copySubBuffer = driCopySubBuffer;
+
+ /* This special default value is replaced with the configured
+ * default value when the drawable is first bound to a direct
+--- src/mesa/drivers/dri/common/dri_util.h 29 Nov 2005 23:01:43 -0000 1.21
++++ src/mesa/drivers/dri/common/dri_util.h 12 Mar 2006 15:58:46 -0000
+@@ -189,6 +189,8 @@
+ int64_t (*SwapBuffersMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
+ int64_t divisor, int64_t remainder );
+ /*@}*/
++ void (*CopySubBuffer)(__DRIdrawablePrivate *driDrawPriv,
++ int x, int y, int w, int h);
+ };
+
+
+--- src/mesa/drivers/dri/i915/intel_batchbuffer.c 6 Feb 2006 00:09:58 -0000 1.6
++++ src/mesa/drivers/dri/i915/intel_batchbuffer.c 12 Mar 2006 15:58:54 -0000
+@@ -366,7 +366,8 @@
+ /*
+ * Copy the back buffer to the front buffer.
+ */
+-void intelCopyBuffer( const __DRIdrawablePrivate *dPriv )
++void intelCopyBuffer( const __DRIdrawablePrivate *dPriv,
++ const drm_clip_rect_t *rect)
+ {
+ intelContextPtr intel;
+ GLboolean missed_target;
+@@ -385,15 +386,19 @@
+
+ LOCK_HARDWARE( intel );
+ intelWaitForFrameCompletion( intel );
+- UNLOCK_HARDWARE( intel );
+- driWaitForVBlank( dPriv, &intel->vbl_seq, intel->vblank_flags, & missed_target );
+
+- LOCK_HARDWARE( intel );
++ if (!rect)
++ {
++ UNLOCK_HARDWARE( intel );
++ driWaitForVBlank( dPriv, &intel->vbl_seq, intel->vblank_flags, & missed_target );
++ LOCK_HARDWARE( intel );
++ }
+ {
+ const intelScreenPrivate *intelScreen = intel->intelScreen;
+ const __DRIdrawablePrivate *dPriv = intel->driDrawable;
+ const int nbox = dPriv->numClipRects;
+ const drm_clip_rect_t *pbox = dPriv->pClipRects;
++ drm_clip_rect_t box;
+ const int cpp = intelScreen->cpp;
+ const int pitch = intelScreen->front.pitch; /* in bytes */
+ int i;
+@@ -429,18 +434,35 @@
+ continue;
+ }
+
++ box = *pbox;
++
++ if (rect)
++ {
++ if (rect->x1 > box.x1)
++ box.x1 = rect->x1;
++ if (rect->y1 > box.y1)
++ box.y1 = rect->y1;
++ if (rect->x2 < box.x2)
++ box.x2 = rect->x2;
++ if (rect->y2 < box.y2)
++ box.y2 = rect->y2;
++
++ if (box.x1 > box.x2 || box.y1 > box.y2)
++ continue;
++ }
++
+ BEGIN_BATCH( 8);
+ OUT_BATCH( CMD );
+ OUT_BATCH( BR13 );
+- OUT_BATCH( (pbox->y1 << 16) | pbox->x1 );
+- OUT_BATCH( (pbox->y2 << 16) | pbox->x2 );
++ OUT_BATCH( (box.y1 << 16) | box.x1 );
++ OUT_BATCH( (box.y2 << 16) | box.x2 );
+
+ if (intel->sarea->pf_current_page == 0)
+ OUT_BATCH( intelScreen->front.offset );
+ else
+ OUT_BATCH( intelScreen->back.offset );
+
+- OUT_BATCH( (pbox->y1 << 16) | pbox->x1 );
++ OUT_BATCH( (box.y1 << 16) | box.x1 );
+ OUT_BATCH( BR13 & 0xffff );
+
+ if (intel->sarea->pf_current_page == 0)
+@@ -454,14 +476,17 @@
+ intelFlushBatchLocked( intel, GL_TRUE, GL_TRUE, GL_TRUE );
+ UNLOCK_HARDWARE( intel );
+
+- intel->swap_count++;
+- (*dri_interface->getUST)(&ust);
+- if (missed_target) {
+- intel->swap_missed_count++;
+- intel->swap_missed_ust = ust - intel->swap_ust;
+- }
++ if (!rect)
++ {
++ intel->swap_count++;
++ (*dri_interface->getUST)(&ust);
++ if (missed_target) {
++ intel->swap_missed_count++;
++ intel->swap_missed_ust = ust - intel->swap_ust;
++ }
+
+- intel->swap_ust = ust;
++ intel->swap_ust = ust;
++ }
+ }
+
+
+--- src/mesa/drivers/dri/i915/intel_batchbuffer.h 23 Jan 2006 10:10:48 -0000 1.3
++++ src/mesa/drivers/dri/i915/intel_batchbuffer.h 12 Mar 2006 15:58:54 -0000
+@@ -75,7 +75,8 @@
+ extern GLuint *intelEmitInlinePrimitiveLocked(intelContextPtr intel,
+ int primitive, int dwords,
+ int vertex_size);
+-extern void intelCopyBuffer( const __DRIdrawablePrivate *dpriv );
++extern void intelCopyBuffer( const __DRIdrawablePrivate *dpriv,
++ const drm_clip_rect_t *rect);
+ extern void intelClearWithBlit(GLcontext *ctx, GLbitfield mask, GLboolean all,
+ GLint cx1, GLint cy1, GLint cw, GLint ch);
+
+--- src/mesa/drivers/dri/i915/intel_context.c 6 Feb 2006 00:09:58 -0000 1.22
++++ src/mesa/drivers/dri/i915/intel_context.c 12 Mar 2006 15:58:54 -0000
+@@ -722,7 +722,7 @@
+ if ( 0 /*intel->doPageFlip*/ ) { /* doPageFlip is never set !!! */
+ intelPageFlip( dPriv );
+ } else {
+- intelCopyBuffer( dPriv );
++ intelCopyBuffer( dPriv, NULL );
+ }
+ if (screen->current_rotation != 0) {
+ intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);
+@@ -734,6 +734,29 @@
+ }
+ }
+
++void intelCopySubBuffer( __DRIdrawablePrivate *dPriv,
++ int x, int y, int w, int h )
++{
++ if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
++ intelContextPtr intel;
++ GLcontext *ctx;
++ intel = (intelContextPtr) dPriv->driContextPriv->driverPrivate;
++ ctx = &intel->ctx;
++ if (ctx->Visual.doubleBufferMode) {
++ intelScreenPrivate *screen = intel->intelScreen;
++ drm_clip_rect_t rect;
++ rect.x1 = x + dPriv->x;
++ rect.y1 = (dPriv->h - y - h) + dPriv->y;
++ rect.x2 = rect.x1 + w;
++ rect.y2 = rect.y1 + h;
++ _mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */
++ intelCopyBuffer( dPriv, &rect );
++ }
++ } else {
++ /* XXX this shouldn't be an error but we can't handle it for now */
++ fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
++ }
++}
+
+ void intelInitState( GLcontext *ctx )
+ {
+--- src/mesa/drivers/dri/i915/intel_screen.c 8 Feb 2006 22:05:42 -0000 1.35
++++ src/mesa/drivers/dri/i915/intel_screen.c 12 Mar 2006 15:58:54 -0000
+@@ -341,6 +341,7 @@
+ (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+ (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
+ (*glx_enable_extension)( psc, "GLX_MESA_allocate_memory" );
++ (*glx_enable_extension)( psc, "GLX_MESA_copy_sub_buffer" );
+ }
+
+ sPriv->psc->allocateMemory = (void *) intelAllocateMemoryMESA;
+@@ -534,7 +535,8 @@
+ .GetMSC = driGetMSC32,
+ .WaitForMSC = driWaitForMSC32,
+ .WaitForSBC = NULL,
+- .SwapBuffersMSC = NULL
++ .SwapBuffersMSC = NULL,
++ .CopySubBuffer = intelCopySubBuffer
+ };
+
+
+--- src/mesa/drivers/dri/i915/intel_screen.h 23 Jan 2006 10:10:48 -0000 1.6
++++ src/mesa/drivers/dri/i915/intel_screen.h 12 Mar 2006 15:58:54 -0000
+@@ -106,4 +106,7 @@
+ extern void
+ intelSwapBuffers(__DRIdrawablePrivate *dPriv);
+
++extern void
++intelCopySubBuffer( __DRIdrawablePrivate *dPriv, int x, int y, int w, int h );
++
+ #endif
+--- src/mesa/drivers/dri/r200/r200_context.c 3 Feb 2006 13:29:11 -0000 1.55
++++ src/mesa/drivers/dri/r200/r200_context.c 12 Mar 2006 15:58:59 -0000
+@@ -637,7 +637,7 @@
+ r200PageFlip( dPriv );
+ }
+ else {
+- r200CopyBuffer( dPriv );
++ r200CopyBuffer( dPriv, NULL );
+ }
+ }
+ }
+@@ -647,6 +647,30 @@
+ }
+ }
+
++void
++r200CopySubBuffer( __DRIdrawablePrivate *dPriv,
++ int x, int y, int w, int h )
++{
++ if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
++ r200ContextPtr rmesa;
++ GLcontext *ctx;
++ rmesa = (r200ContextPtr) dPriv->driContextPriv->driverPrivate;
++ ctx = rmesa->glCtx;
++ if (ctx->Visual.doubleBufferMode) {
++ drm_clip_rect_t rect;
++ rect.x1 = x + dPriv->x;
++ rect.y1 = (dPriv->h - y - h) + dPriv->y;
++ rect.x2 = rect.x1 + w;
++ rect.y2 = rect.y1 + h;
++ _mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */
++ r200CopyBuffer( dPriv, &rect );
++ }
++ }
++ else {
++ /* XXX this shouldn't be an error but we can't handle it for now */
++ _mesa_problem(NULL, "%s: drawable has no context!", __FUNCTION__);
++ }
++}
+
+ /* Force the context `c' to be the current context and associate with it
+ * buffer `b'.
+--- src/mesa/drivers/dri/r200/r200_context.h 2 Nov 2005 01:15:08 -0000 1.37
++++ src/mesa/drivers/dri/r200/r200_context.h 12 Mar 2006 15:58:59 -0000
+@@ -1002,6 +1002,8 @@
+ __DRIcontextPrivate *driContextPriv,
+ void *sharedContextPrivate);
+ extern void r200SwapBuffers( __DRIdrawablePrivate *dPriv );
++extern void r200CopySubBuffer( __DRIdrawablePrivate * dPriv,
++ int x, int y, int w, int h );
+ extern GLboolean r200MakeCurrent( __DRIcontextPrivate *driContextPriv,
+ __DRIdrawablePrivate *driDrawPriv,
+ __DRIdrawablePrivate *driReadPriv );
+--- src/mesa/drivers/dri/r200/r200_ioctl.c 2 Nov 2005 01:15:08 -0000 1.32
++++ src/mesa/drivers/dri/r200/r200_ioctl.c 12 Mar 2006 15:58:59 -0000
+@@ -420,7 +420,8 @@
+
+ /* Copy the back color buffer to the front color buffer.
+ */
+-void r200CopyBuffer( const __DRIdrawablePrivate *dPriv )
++void r200CopyBuffer( const __DRIdrawablePrivate *dPriv,
++ const drm_clip_rect_t *rect)
+ {
+ r200ContextPtr rmesa;
+ GLint nbox, i, ret;
+@@ -446,9 +447,12 @@
+ * request at a time.
+ */
+ r200WaitForFrameCompletion( rmesa );
+- UNLOCK_HARDWARE( rmesa );
+- driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
+- LOCK_HARDWARE( rmesa );
++ if (!rect)
++ {
++ UNLOCK_HARDWARE( rmesa );
++ driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
++ LOCK_HARDWARE( rmesa );
++ }
+
+ nbox = dPriv->numClipRects; /* must be in locked region */
+
+@@ -459,8 +463,27 @@
+ GLint n = 0;
+
+ for ( ; i < nr ; i++ ) {
+- *b++ = box[i];
+- n++;
++
++ *b = box[i];
++
++ if (rect)
++ {
++ if (rect->x1 > b->x1)
++ b->x1 = rect->x1;
++ if (rect->y1 > b->y1)
++ b->y1 = rect->y1;
++ if (rect->x2 < b->x2)
++ b->x2 = rect->x2;
++ if (rect->y2 < b->y2)
++ b->y2 = rect->y2;
++
++ if (b->x1 < b->x2 && b->y1 < b->y2)
++ b++;
++ }
++ else
++ b++;
++
++ n++;
+ }
+ rmesa->sarea->nbox = n;
+
+@@ -474,18 +497,21 @@
+ }
+
+ UNLOCK_HARDWARE( rmesa );
+- rmesa->hw.all_dirty = GL_TRUE;
++ if (!rect)
++ {
++ rmesa->hw.all_dirty = GL_TRUE;
+
+- rmesa->swap_count++;
+- (*dri_interface->getUST)( & ust );
+- if ( missed_target ) {
+- rmesa->swap_missed_count++;
+- rmesa->swap_missed_ust = ust - rmesa->swap_ust;
+- }
++ rmesa->swap_count++;
++ (*dri_interface->getUST)( & ust );
++ if ( missed_target ) {
++ rmesa->swap_missed_count++;
++ rmesa->swap_missed_ust = ust - rmesa->swap_ust;
++ }
+
+- rmesa->swap_ust = ust;
++ rmesa->swap_ust = ust;
+
+- sched_yield();
++ sched_yield();
++ }
+ }
+
+ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
+--- src/mesa/drivers/dri/r200/r200_ioctl.h 11 Oct 2005 17:55:54 -0000 1.14
++++ src/mesa/drivers/dri/r200/r200_ioctl.h 12 Mar 2006 15:58:59 -0000
+@@ -90,7 +90,8 @@
+ struct r200_dma_region *region,
+ const char *caller );
+
+-extern void r200CopyBuffer( const __DRIdrawablePrivate *drawable );
++extern void r200CopyBuffer( const __DRIdrawablePrivate *drawable,
++ const drm_clip_rect_t *rect);
+ extern void r200PageFlip( const __DRIdrawablePrivate *drawable );
+ extern void r200Flush( GLcontext *ctx );
+ extern void r200Finish( GLcontext *ctx );
+--- src/mesa/drivers/dri/r300/radeon_context.c 17 Dec 2005 11:39:40 -0000 1.8
++++ src/mesa/drivers/dri/r300/radeon_context.c 12 Mar 2006 15:59:04 -0000
+@@ -229,7 +229,7 @@
+ if (radeon->doPageFlip) {
+ radeonPageFlip(dPriv);
+ } else {
+- radeonCopyBuffer(dPriv);
++ radeonCopyBuffer(dPriv, NULL);
+ }
+ }
+ } else {
+@@ -239,6 +239,31 @@
+ }
+ }
+
++void radeonCopySubBuffer(__DRIdrawablePrivate * dPriv,
++ int x, int y, int w, int h )
++{
++ if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
++ radeonContextPtr radeon;
++ GLcontext *ctx;
++
++ radeon = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
++ ctx = radeon->glCtx;
++
++ if (ctx->Visual.doubleBufferMode) {
++ drm_clip_rect_t rect;
++ rect.x1 = x + dPriv->x;
++ rect.y1 = (dPriv->h - y - h) + dPriv->y;
++ rect.x2 = rect.x1 + w;
++ rect.y2 = rect.y1 + h;
++ _mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
++ radeonCopyBuffer(dPriv, &rect);
++ }
++ } else {
++ /* XXX this shouldn't be an error but we can't handle it for now */
++ _mesa_problem(NULL, "%s: drawable has no context!",
++ __FUNCTION__);
++ }
++}
+
+ /* Force the context `c' to be the current context and associate with it
+ * buffer `b'.
+--- src/mesa/drivers/dri/r300/radeon_context.h 3 Sep 2005 16:40:44 -0000 1.7
++++ src/mesa/drivers/dri/r300/radeon_context.h 12 Mar 2006 15:59:04 -0000
+@@ -203,6 +203,8 @@
+ #define RADEON_CONTEXT(glctx) ((radeonContextPtr)(ctx->DriverCtx))
+
+ extern void radeonSwapBuffers(__DRIdrawablePrivate * dPriv);
++extern void radeonCopySubBuffer(__DRIdrawablePrivate * dPriv,
++ int x, int y, int w, int h);
+ extern GLboolean radeonInitContext(radeonContextPtr radeon,
+ struct dd_function_table* functions,
+ const __GLcontextModes * glVisual,
+--- src/mesa/drivers/dri/r300/radeon_ioctl.c 2 Nov 2005 01:15:08 -0000 1.9
++++ src/mesa/drivers/dri/r300/radeon_ioctl.c 12 Mar 2006 15:59:04 -0000
+@@ -145,7 +145,8 @@
+
+ /* Copy the back color buffer to the front color buffer.
+ */
+-void radeonCopyBuffer(const __DRIdrawablePrivate * dPriv)
++void radeonCopyBuffer(const __DRIdrawablePrivate * dPriv,
++ const drm_clip_rect_t * rect)
+ {
+ radeonContextPtr radeon;
+ GLint nbox, i, ret;
+@@ -174,10 +175,13 @@
+ * request at a time.
+ */
+ radeonWaitForFrameCompletion(radeon);
+- UNLOCK_HARDWARE(radeon);
+- driWaitForVBlank(dPriv, &radeon->vbl_seq, radeon->vblank_flags,
+- &missed_target);
+- LOCK_HARDWARE(radeon);
++ if (!rect)
++ {
++ UNLOCK_HARDWARE(radeon);
++ driWaitForVBlank(dPriv, &radeon->vbl_seq, radeon->vblank_flags,
++ &missed_target);
++ LOCK_HARDWARE(radeon);
++ }
+
+ nbox = dPriv->numClipRects; /* must be in locked region */
+
+@@ -187,9 +191,28 @@
+ drm_clip_rect_t *b = radeon->sarea->boxes;
+ GLint n = 0;
+
+- for (; i < nr; i++) {
+- *b++ = box[i];
+- n++;
++ for ( ; i < nr ; i++ ) {
++
++ *b = box[i];
++
++ if (rect)
++ {
++ if (rect->x1 > b->x1)
++ b->x1 = rect->x1;
++ if (rect->y1 > b->y1)
++ b->y1 = rect->y1;
++ if (rect->x2 < b->x2)
++ b->x2 = rect->x2;
++ if (rect->y2 < b->y2)
++ b->y2 = rect->y2;
++
++ if (b->x1 < b->x2 && b->y1 < b->y2)
++ b++;
++ }
++ else
++ b++;
++
++ n++;
+ }
+ radeon->sarea->nbox = n;
+
+@@ -204,22 +227,24 @@
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list