fix GL_LINE_LOOP with drivers using own render pipeline stage (#12410, #13527)
[mesa.git] / src / mesa / drivers / dri / mga / mgaspan.c
index 62dccc6169f0d9b0755b16642ef69bdb34764f3d..05dcbb852639efbcbc94043d7fad8cc915dd2932 100644 (file)
@@ -24,7 +24,6 @@
  * Authors:
  *    Keith Whitwell <keith@tungstengraphics.com>
  */
-/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaspan.c,v 1.11 2002/10/30 12:51:36 alanh Exp $ */
 
 #include "mtypes.h"
 #include "mgadd.h"
 
 #define DBG 0
 
-
 #define LOCAL_VARS                                     \
-   __DRIdrawablePrivate *dPriv = mmesa->mesa_drawable; \
-   mgaScreenPrivate *mgaScreen = mmesa->mgaScreen;     \
+   mgaContextPtr mmesa = MGA_CONTEXT(ctx);             \
    __DRIscreenPrivate *sPriv = mmesa->driScreen;       \
-   GLuint pitch = mgaScreen->frontPitch;               \
+   driRenderbuffer *drb = (driRenderbuffer *) rb;      \
+   const __DRIdrawablePrivate *dPriv = drb->dPriv;     \
+   GLuint pitch = drb->pitch;                          \
    GLuint height = dPriv->h;                           \
-   char *read_buf = (char *)(sPriv->pFB +              \
-                       mmesa->readOffset +             \
-                       dPriv->x * mgaScreen->cpp +     \
-                       dPriv->y * pitch);              \
    char *buf = (char *)(sPriv->pFB +                   \
-                       mmesa->drawOffset +             \
-                       dPriv->x * mgaScreen->cpp +     \
+                       drb->offset +                   \
+                       dPriv->x * drb->cpp +           \
                        dPriv->y * pitch);              \
    GLuint p;                                           \
-   (void) read_buf; (void) buf; (void) p
-   
+   (void) buf; (void) p
+
 
 
 #define LOCAL_DEPTH_VARS                                               \
-   __DRIdrawablePrivate *dPriv = mmesa->mesa_drawable;                 \
-   mgaScreenPrivate *mgaScreen = mmesa->mgaScreen;                     \
+   mgaContextPtr mmesa = MGA_CONTEXT(ctx);                             \
    __DRIscreenPrivate *sPriv = mmesa->driScreen;                       \
-   GLuint pitch = mgaScreen->frontPitch;                               \
+   driRenderbuffer *drb = (driRenderbuffer *) rb;                      \
+   const __DRIdrawablePrivate *dPriv = drb->dPriv;                     \
+   GLuint pitch = drb->pitch;                                          \
    GLuint height = dPriv->h;                                           \
    char *buf = (char *)(sPriv->pFB +                                   \
-                       mgaScreen->depthOffset +                        \
-                       dPriv->x * mgaScreen->cpp +                     \
+                       drb->offset +                                   \
+                       dPriv->x * drb->cpp +                           \
                        dPriv->y * pitch)
 
 #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS 
 
-#define CLIPPIXEL(_x,_y) (_x >= minx && _x < maxx && \
-                         _y >= miny && _y < maxy)
-
-#define CLIPSPAN( _x, _y, _n, _x1, _n1, _i )                           \
-   if ( _y < miny || _y >= maxy ) {                                    \
-      _n1 = 0, _x1 = x;                                                        \
-   } else {                                                            \
-      _n1 = _n;                                                                \
-      _x1 = _x;                                                                \
-      if ( _x1 < minx ) _i += (minx-_x1), n1 -= (minx-_x1), _x1 = minx; \
-      if ( _x1 + _n1 >= maxx ) n1 -= (_x1 + n1 - maxx);                        \
-   }
-
-
-#define HW_LOCK()                              \
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);     \
-   FLUSH_BATCH(mmesa);                         \
-   LOCK_HARDWARE_QUIESCENT(mmesa);
-
+#define HW_LOCK()
 
+/* FIXME could/should we use dPriv->numClipRects like the other drivers? */
 #define HW_CLIPLOOP()                                          \
   do {                                                         \
     int _nc = mmesa->numClipRects;                             \
     }                                          \
   } while (0)
 
-#define HW_UNLOCK()                            \
-    UNLOCK_HARDWARE(mmesa);
-
-
-
+#define HW_UNLOCK()
 
 
 
 
 /* 16 bit, RGB565 color spanline and pixel functions
  */
-
-#define GET_SRC_PTR(_x, _y) (read_buf + _x * 2 + _y * pitch)
-#define GET_DST_PTR(_x, _y) (     buf + _x * 2 + _y * pitch)
 #define SPANTMP_PIXEL_FMT GL_RGB
 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
 
 
 /* 32 bit, ARGB8888 color spanline and pixel functions
  */
-
-#define GET_SRC_PTR(_x, _y) (read_buf + _x * 4 + _y * pitch)
-#define GET_DST_PTR(_x, _y) (     buf + _x * 4 + _y * pitch)
 #define SPANTMP_PIXEL_FMT GL_BGRA
 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
 
 /* 16 bit depthbuffer functions.
  */
 #define WRITE_DEPTH( _x, _y, d )       \
-   *(GLushort *)(buf + _x*2 + _y*pitch) = d;
+   *(GLushort *)(buf + (_x)*2 + (_y)*pitch) = d;
 
 #define READ_DEPTH( d, _x, _y )                \
-   d = *(GLushort *)(buf + _x*2 + _y*pitch);
+   d = *(GLushort *)(buf + (_x)*2 + (_y)*pitch);
 
-#define TAG(x) mga##x##_16
+#define TAG(x) mga##x##_z16
 #include "depthtmp.h"
 
 
 /* 32 bit depthbuffer functions.
  */
 #define WRITE_DEPTH( _x, _y, d )       \
-   *(GLuint *)(buf + _x*4 + _y*pitch) = d;
+   *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = d;
 
 #define READ_DEPTH( d, _x, _y )                \
-   d = *(GLuint *)(buf + _x*4 + _y*pitch);
+   d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch);
 
-#define TAG(x) mga##x##_32
+#define TAG(x) mga##x##_z32
 #include "depthtmp.h"
 
 
 /* 24/8 bit interleaved depth/stencil functions
  */
 #define WRITE_DEPTH( _x, _y, d ) {                     \
-   GLuint tmp = *(GLuint *)(buf + _x*4 + _y*pitch);    \
+   GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*pitch);        \
    tmp &= 0xff;                                                \
    tmp |= (d) << 8;                                    \
-   *(GLuint *)(buf + _x*4 + _y*pitch) = tmp;           \
+   *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = tmp;               \
 }
 
 #define READ_DEPTH( d, _x, _y )        {                               \
-   d = (*(GLuint *)(buf + _x*4 + _y*pitch) & ~0xff) >> 8;      \
+   d = (*(GLuint *)(buf + (_x)*4 + (_y)*pitch) & ~0xff) >> 8;  \
 }
 
-#define TAG(x) mga##x##_24_8
+#define TAG(x) mga##x##_z24_s8
 #include "depthtmp.h"
 
 #define WRITE_STENCIL( _x, _y, d ) {                   \
 #define READ_STENCIL( d, _x, _y )              \
    d = *(GLuint *)(buf + _x*4 + _y*pitch) & 0xff;
 
-#define TAG(x) mga##x##_24_8
+#define TAG(x) mga##x##_z24_s8
 #include "stenciltmp.h"
 
 
-
-/*
- * This function is called to specify which buffer to read and write
- * for software rasterization (swrast) fallbacks.  This doesn't necessarily
- * correspond to glDrawBuffer() or glReadBuffer() calls.
- */
-static void mgaDDSetBuffer(GLcontext *ctx, GLframebuffer *buffer,
-                           GLuint bufferBit)
+static void
+mgaSpanRenderStart( GLcontext *ctx )
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
-   unsigned int   offset;
-
-   assert((bufferBit == DD_FRONT_LEFT_BIT) || (bufferBit == DD_BACK_LEFT_BIT));
-
-   offset = (bufferBit == DD_FRONT_LEFT_BIT)
-       ? mmesa->mgaScreen->frontOffset
-       : mmesa->mgaScreen->backOffset;
-
-   mmesa->drawOffset = offset;
-   mmesa->readOffset = offset;
-
-   assert( (buffer == mmesa->driDrawable->driverPrivate)
-          || (buffer == mmesa->driReadable->driverPrivate) );
+   FLUSH_BATCH( mmesa );
+   LOCK_HARDWARE_QUIESCENT( mmesa );
+}
 
-   mmesa->mesa_drawable = (buffer == mmesa->driDrawable->driverPrivate)
-       ? mmesa->driDrawable : mmesa->driReadable;
+static void
+mgaSpanRenderFinish( GLcontext *ctx )
+{
+   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
+   _swrast_flush( ctx );
+   UNLOCK_HARDWARE( mmesa );
 }
 
 /**
@@ -231,40 +188,36 @@ static void mgaDDSetBuffer(GLcontext *ctx, GLframebuffer *buffer,
  */
 void mgaDDInitSpanFuncs( GLcontext *ctx )
 {
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx);
+   swdd->SpanRenderStart = mgaSpanRenderStart;
+   swdd->SpanRenderFinish = mgaSpanRenderFinish;
+}
+
 
-   swdd->SetBuffer = mgaDDSetBuffer;
-
-   switch (mmesa->mgaScreen->cpp) {
-   case 2:
-      mgaInitPointers_565( swdd );
-
-      swdd->ReadDepthSpan = mgaReadDepthSpan_16;
-      swdd->WriteDepthSpan = mgaWriteDepthSpan_16;
-      swdd->ReadDepthPixels = mgaReadDepthPixels_16;
-      swdd->WriteDepthPixels = mgaWriteDepthPixels_16;
-      break;
-
-   case 4:
-      mgaInitPointers_8888( swdd );
-      
-      if (!mmesa->hw_stencil) {
-        swdd->ReadDepthSpan = mgaReadDepthSpan_32;
-        swdd->WriteDepthSpan = mgaWriteDepthSpan_32;
-        swdd->ReadDepthPixels = mgaReadDepthPixels_32;
-        swdd->WriteDepthPixels = mgaWriteDepthPixels_32;
-      } else {
-        swdd->ReadDepthSpan = mgaReadDepthSpan_24_8;
-        swdd->WriteDepthSpan = mgaWriteDepthSpan_24_8;
-        swdd->ReadDepthPixels = mgaReadDepthPixels_24_8;
-        swdd->WriteDepthPixels = mgaWriteDepthPixels_24_8;
-
-        swdd->ReadStencilSpan = mgaReadStencilSpan_24_8;
-        swdd->WriteStencilSpan = mgaWriteStencilSpan_24_8;
-        swdd->ReadStencilPixels = mgaReadStencilPixels_24_8;
-        swdd->WriteStencilPixels = mgaWriteStencilPixels_24_8;
+/**
+ * Plug in the Get/Put routines for the given driRenderbuffer.
+ */
+void
+mgaSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
+{
+   if (drb->Base.InternalFormat == GL_RGBA) {
+      if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) {
+         mgaInitPointers_565(&drb->Base);
+      }
+      else {
+         mgaInitPointers_8888(&drb->Base);
       }
-      break;
+   }
+   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16) {
+      mgaInitDepthPointers_z16(&drb->Base);
+   }
+   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) {
+      mgaInitDepthPointers_z24_s8(&drb->Base);
+   }
+   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT32) {
+      mgaInitDepthPointers_z32(&drb->Base);
+   }
+   else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) {
+      mgaInitStencilPointers_z24_s8(&drb->Base);
    }
 }