R300: set the number of GB pipes on all r3xx-r5xx chips
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_lock.c
index 591595e63212d209c695c32ebde19d707d81b080..9a7e76b245ec86832b0b4af3267c715bf7222cb5 100644 (file)
@@ -1,8 +1,12 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_lock.c,v 1.5 2002/10/30 12:51:55 alanh Exp $ */
 /**************************************************************************
 
 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
                      VA Linux Systems Inc., Fremont, California.
+Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
+
+The Weather Channel (TM) funded Tungsten Graphics to develop the
+initial release of the Radeon 8500 driver under the XFree86 license.
+This notice must be preserved.
 
 All Rights Reserved.
 
@@ -30,20 +34,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 /*
  * Authors:
- *   Kevin E. Martin <martin@valinux.com>
  *   Gareth Hughes <gareth@valinux.com>
+ *   Keith Whitwell <keith@tungstengraphics.com>
+ *   Kevin E. Martin <martin@valinux.com>
  */
 
-#include "glheader.h"
-#include "radeon_context.h"
+#include "main/glheader.h"
+#include "main/mtypes.h"
+#include "main/colormac.h"
+#include "dri_util.h"
+#include "radeon_screen.h"
+#include "radeon_common.h"
 #include "radeon_lock.h"
-#include "radeon_tex.h"
-#include "radeon_state.h"
-#include "radeon_ioctl.h"
-
 #include "drirenderbuffer.h"
 
-
 #if DEBUG_LOCKING
 char *prevLockFile = NULL;
 int prevLockLine = 0;
@@ -51,16 +55,30 @@ int prevLockLine = 0;
 
 /* Turn on/off page flipping according to the flags in the sarea:
  */
-static void
-radeonUpdatePageFlipping( radeonContextPtr rmesa )
+void radeonUpdatePageFlipping(radeonContextPtr rmesa)
 {
-   rmesa->doPageFlip = rmesa->sarea->pfState;
-   driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer,
-                        rmesa->sarea->pfCurrentPage);
+       int use_back;
+       __DRIdrawablePrivate *const drawable = rmesa->dri.drawable;
+       GLframebuffer *fb = drawable->driverPrivate;
+
+       rmesa->doPageFlip = rmesa->sarea->pfState;
+       if (rmesa->glCtx->WinSysDrawBuffer) {
+               rmesa->vtbl.update_draw_buffer(rmesa->glCtx);
+       }
+
+       use_back = rmesa->glCtx->DrawBuffer ?
+           (rmesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0] ==
+            BUFFER_BACK_LEFT) : 1;
+       use_back ^= (rmesa->sarea->pfCurrentPage == 1);
+
+       if (use_back)
+               rmesa->state.color.rrb = (void *)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+       else
+               rmesa->state.color.rrb = (void *)fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+
+       rmesa->state.depth.rrb = (void *)fb->Attachment[BUFFER_DEPTH].Renderbuffer;
 }
 
-
-
 /* Update the hardware state.  This is called if another context has
  * grabbed the hardware lock, which includes the X server.  This
  * function also updates the driver's window state after the X server
@@ -69,47 +87,38 @@ radeonUpdatePageFlipping( radeonContextPtr rmesa )
  * the hardware lock when it changes the window state, this routine will
  * automatically be called after such a change.
  */
-void radeonGetLock( radeonContextPtr rmesa, GLuint flags )
+void radeonGetLock(radeonContextPtr rmesa, GLuint flags)
 {
-   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
-   __DRIscreenPrivate *sPriv = rmesa->dri.screen;
-   drm_radeon_sarea_t *sarea = rmesa->sarea;
-
-   drmGetLock( rmesa->dri.fd, rmesa->dri.hwContext, flags );
-
-   /* The window might have moved, so we might need to get new clip
-    * rects.
-    *
-    * NOTE: This releases and regrabs the hw lock to allow the X server
-    * to respond to the DRI protocol request for new drawable info.
-    * Since the hardware state depends on having the latest drawable
-    * clip rects, all state checking must be done _after_ this call.
-    */
-   DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv );
-
-   if ( rmesa->lastStamp != dPriv->lastStamp ) {
-      radeonUpdatePageFlipping( rmesa );
-      radeonSetCliprects( rmesa );
-      radeonUpdateViewportOffset( rmesa->glCtx );
-      rmesa->lastStamp = dPriv->lastStamp;
-   }
-
-   RADEON_STATECHANGE( rmesa, ctx );
-   if (rmesa->sarea->tiling_enabled) {
-      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE;
-   }
-   else {
-      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] &= ~RADEON_COLOR_TILE_ENABLE;
-   }
-
-   if ( sarea->ctx_owner != rmesa->dri.hwContext ) {
-      int i;
-      sarea->ctx_owner = rmesa->dri.hwContext;
-
-      for ( i = 0 ; i < rmesa->nr_heaps ; i++ ) {
-        DRI_AGE_TEXTURES( rmesa->texture_heaps[ i ] );
-      }
-   }
-
-   rmesa->lost_context = GL_TRUE;
+       __DRIdrawablePrivate *const drawable = rmesa->dri.drawable;
+       __DRIdrawablePrivate *const readable = rmesa->dri.readable;
+       __DRIscreenPrivate *sPriv = rmesa->dri.screen;
+       drm_radeon_sarea_t *sarea = rmesa->sarea;
+
+       assert(drawable != NULL);
+
+       drmGetLock(rmesa->dri.fd, rmesa->dri.hwContext, flags);
+
+       /* The window might have moved, so we might need to get new clip
+        * rects.
+        *
+        * NOTE: This releases and regrabs the hw lock to allow the X server
+        * to respond to the DRI protocol request for new drawable info.
+        * Since the hardware state depends on having the latest drawable
+        * clip rects, all state checking must be done _after_ this call.
+        */
+       DRI_VALIDATE_DRAWABLE_INFO(sPriv, drawable);
+       if (drawable != readable) {
+               DRI_VALIDATE_DRAWABLE_INFO(sPriv, readable);
+       }
+
+       if (rmesa->lastStamp != drawable->lastStamp) {
+               radeonUpdatePageFlipping(rmesa);
+               radeonSetCliprects(rmesa);
+               rmesa->vtbl.update_viewport_offset(rmesa->glCtx);
+               driUpdateFramebufferSize(rmesa->glCtx, drawable);
+       }
+
+       rmesa->vtbl.get_lock(rmesa);
+
+       rmesa->lost_context = GL_TRUE;
 }