fix GL_LINE_LOOP with drivers using own render pipeline stage (#12410, #13527)
[mesa.git] / src / mesa / drivers / dri / mga / mgaspan.c
index 8487f4b83f6ea33a67e2eb246c2a5bf64fce25be..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                                     \
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);                             \
-   __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                                               \
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);                             \
-   __DRIdrawablePrivate *dPriv = mmesa->mesa_drawable;                 \
-   mgaScreenPrivate *mgaScreen = mmesa->mgaScreen;                     \
    __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()
 
+/* FIXME could/should we use dPriv->numClipRects like the other drivers? */
 #define HW_CLIPLOOP()                                          \
   do {                                                         \
     int _nc = mmesa->numClipRects;                             \
 
 
 
-
 #define Y_FLIP(_y) (height - _y - 1)
 
 /* 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
 
 #define READ_DEPTH( d, _x, _y )                \
    d = *(GLushort *)(buf + (_x)*2 + (_y)*pitch);
 
-#define TAG(x) mga##x##_16
+#define TAG(x) mga##x##_z16
 #include "depthtmp.h"
 
 
 #define READ_DEPTH( d, _x, _y )                \
    d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch);
 
-#define TAG(x) mga##x##_32
+#define TAG(x) mga##x##_z32
 #include "depthtmp.h"
 
 
    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)
-{
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
-   unsigned int   offset;
-
-   assert((bufferBit == BUFFER_BIT_FRONT_LEFT) || (bufferBit == BUFFER_BIT_BACK_LEFT));
-
-   offset = (bufferBit == BUFFER_BIT_FRONT_LEFT)
-       ? mmesa->mgaScreen->frontOffset
-       : mmesa->mgaScreen->backOffset;
-
-   mmesa->drawOffset = offset;
-   mmesa->readOffset = offset;
-
-   assert( (buffer == mmesa->driDrawable->driverPrivate)
-          || (buffer == mmesa->driReadable->driverPrivate) );
-
-   mmesa->mesa_drawable = (buffer == mmesa->driDrawable->driverPrivate)
-       ? mmesa->driDrawable : mmesa->driReadable;
-}
-
-void mgaSpanRenderStart( GLcontext *ctx )
+static void
+mgaSpanRenderStart( GLcontext *ctx )
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    FLUSH_BATCH( mmesa );
    LOCK_HARDWARE_QUIESCENT( mmesa );
 }
 
-void mgaSpanRenderFinish( GLcontext *ctx )
+static void
+mgaSpanRenderFinish( GLcontext *ctx )
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    _swrast_flush( ctx );
@@ -239,45 +188,7 @@ void mgaSpanRenderFinish( GLcontext *ctx )
  */
 void mgaDDInitSpanFuncs( GLcontext *ctx )
 {
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx);
-
-   swdd->SetBuffer = mgaDDSetBuffer;
-
-   switch (mmesa->mgaScreen->cpp) {
-   case 2:
-#if 0
-      mgaInitPointers_565( swdd );
-      swdd->ReadDepthSpan = mgaReadDepthSpan_16;
-      swdd->WriteDepthSpan = mgaWriteDepthSpan_16;
-      swdd->ReadDepthPixels = mgaReadDepthPixels_16;
-      swdd->WriteDepthPixels = mgaWriteDepthPixels_16;
-#endif
-      break;
-
-   case 4:
-#if 0
-      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;
-      }
-#endif
-      break;
-   }
    swdd->SpanRenderStart = mgaSpanRenderStart;
    swdd->SpanRenderFinish = mgaSpanRenderFinish;
 }
@@ -298,35 +209,15 @@ mgaSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
       }
    }
    else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16) {
-      drb->Base.GetRow        = mgaReadDepthSpan_16;
-      drb->Base.GetValues     = mgaReadDepthPixels_16;
-      drb->Base.PutRow        = mgaWriteDepthSpan_16;
-      drb->Base.PutMonoRow    = mgaWriteMonoDepthSpan_16;
-      drb->Base.PutValues     = mgaWriteDepthPixels_16;
-      drb->Base.PutMonoValues = NULL;
+      mgaInitDepthPointers_z16(&drb->Base);
    }
    else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) {
-      drb->Base.GetRow        = mgaReadDepthSpan_24_8;
-      drb->Base.GetValues     = mgaReadDepthPixels_24_8;
-      drb->Base.PutRow        = mgaWriteDepthSpan_24_8;
-      drb->Base.PutMonoRow    = mgaWriteMonoDepthSpan_24_8;
-      drb->Base.PutValues     = mgaWriteDepthPixels_24_8;
-      drb->Base.PutMonoValues = NULL;
+      mgaInitDepthPointers_z24_s8(&drb->Base);
    }
    else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT32) {
-      drb->Base.GetRow        = mgaReadDepthSpan_32;
-      drb->Base.GetValues     = mgaReadDepthPixels_32;
-      drb->Base.PutRow        = mgaWriteDepthSpan_32;
-      drb->Base.PutMonoRow    = mgaWriteMonoDepthSpan_32;
-      drb->Base.PutValues     = mgaWriteDepthPixels_32;
-      drb->Base.PutMonoValues = NULL;
+      mgaInitDepthPointers_z32(&drb->Base);
    }
    else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) {
-      drb->Base.GetRow        = mgaReadStencilSpan_24_8;
-      drb->Base.GetValues     = mgaReadStencilPixels_24_8;
-      drb->Base.PutRow        = mgaWriteStencilSpan_24_8;
-      drb->Base.PutMonoRow    = mgaWriteMonoStencilSpan_24_8;
-      drb->Base.PutValues     = mgaWriteStencilPixels_24_8;
-      drb->Base.PutMonoValues = NULL;
+      mgaInitStencilPointers_z24_s8(&drb->Base);
    }
 }