gallium/draw: initial code to properly support llvm in the draw module
[mesa.git] / src / mesa / drivers / dri / mach64 / mach64_tris.c
index 9692b3cae02e4a06f3323f24a2ca63121aa1aa6f..c2a0adfef02e0a25d6df2d53a48ea8e2dcbb34b5 100644 (file)
@@ -1,4 +1,4 @@
-/* $XFree86$ */ /* -*- mode: c; c-basic-offset: 3 -*- */
+/* -*- mode: c; c-basic-offset: 3 -*- */
 /*
  * Copyright 2000 Gareth Hughes
  * All Rights Reserved.
  *     José Fonseca <j_r_fonseca@yahoo.co.uk>
  */
 
-#include "glheader.h"
-#include "mtypes.h"
-#include "colormac.h"
-#include "macros.h"
+#include "main/glheader.h"
+#include "main/mtypes.h"
+#include "main/colormac.h"
+#include "main/macros.h"
 
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
@@ -113,7 +113,7 @@ do {                                                                        \
 #define COPY_VERTEX_OOA( vb, vertsize, v, n )  DO_COPY_VERTEX( vb, vertsize, v, n, 1 )
 
 
-static __inline void mach64_draw_quad( mach64ContextPtr mmesa,
+static INLINE void mach64_draw_quad( mach64ContextPtr mmesa,
                                       mach64VertexPtr v0,
                                       mach64VertexPtr v1,
                                       mach64VertexPtr v2,
@@ -419,7 +419,7 @@ static __inline void mach64_draw_quad( mach64ContextPtr mmesa,
 #endif
 }
 
-static __inline void mach64_draw_triangle( mach64ContextPtr mmesa,
+static INLINE void mach64_draw_triangle( mach64ContextPtr mmesa,
                                           mach64VertexPtr v0,
                                           mach64VertexPtr v1,
                                           mach64VertexPtr v2 )
@@ -666,14 +666,17 @@ static __inline void mach64_draw_triangle( mach64ContextPtr mmesa,
 #endif
 }
 
-static __inline void mach64_draw_line( mach64ContextPtr mmesa,
+static INLINE void mach64_draw_line( mach64ContextPtr mmesa,
                                     mach64VertexPtr v0,
                                     mach64VertexPtr v1 )
 {
 #if MACH64_NATIVE_VTXFMT
    GLcontext *ctx = mmesa->glCtx;
    const GLuint vertsize = mmesa->vertex_size;
-   GLint width = (GLint)(mmesa->glCtx->Line._Width * 2.0); /* 2 fractional bits for hardware */
+   /* 2 fractional bits for hardware: */
+   const int width = (int) (2.0 * CLAMP(mmesa->glCtx->Line.Width,
+                                        mmesa->glCtx->Const.MinLineWidth,
+                                        mmesa->glCtx->Const.MaxLineWidth));
    GLfloat ooa;
    GLuint *pxy0, *pxy1;
    GLuint xy0old, xy0, xy1old, xy1;
@@ -691,9 +694,6 @@ static __inline void mach64_draw_line( mach64ContextPtr mmesa,
       mach64_print_vertex( ctx, v1 );
    }
   
-   if( !width )
-      width = 1;       /* round to the nearest supported width */
-      
    pxy0 = &v0->ui[xyoffset];
    xy0old = *pxy0;
    xy0 = LE32_IN( &xy0old );
@@ -955,13 +955,16 @@ static __inline void mach64_draw_line( mach64ContextPtr mmesa,
 #endif
 }
 
-static __inline void mach64_draw_point( mach64ContextPtr mmesa,
+static INLINE void mach64_draw_point( mach64ContextPtr mmesa,
                                      mach64VertexPtr v0 )
 {
 #if MACH64_NATIVE_VTXFMT
    GLcontext *ctx = mmesa->glCtx;
    const GLuint vertsize = mmesa->vertex_size;
-   GLint sz = (GLint)(mmesa->glCtx->Point._Size * 2.0); /* 2 fractional bits for hardware */
+   /* 2 fractional bits for hardware: */
+   GLint sz = (GLint) (2.0 * CLAMP(mmesa->glCtx->Point.Size,
+                                   ctx->Const.MinPointSize,
+                                   ctx->Const.MaxPointSize));
    GLfloat ooa;
    GLuint *pxy;
    GLuint xyold, xy;
@@ -1227,10 +1230,10 @@ do {                                            \
 #define MACH64_MAX_TRIFUNC     0x10
 
 static struct {
-   points_func         points;
-   line_func           line;
-   triangle_func       triangle;
-   quad_func           quad;
+   tnl_points_func             points;
+   tnl_line_func               line;
+   tnl_triangle_func   triangle;
+   tnl_quad_func               quad;
 } rast_tab[MACH64_MAX_TRIFUNC];
 
 
@@ -1265,21 +1268,21 @@ static struct {
 #define VERT_SET_Z(_v,val) LE32_OUT( &(_v)->ui[zoffset], (GLuint)(val) )
 #define VERT_Z_ADD(_v,val) LE32_OUT( &(_v)->ui[zoffset], LE32_IN( &(_v)->ui[zoffset] ) + (GLuint)(val) )
 #define AREA_IS_CCW( a ) ((a) < 0)
-#define GET_VERTEX(e) (mmesa->verts + ((e)<<mmesa->vertex_stride_shift))
+#define GET_VERTEX(e) (mmesa->verts + ((e) * mmesa->vertex_size * sizeof(int)))
 
 #define MACH64_COLOR( dst, src )                \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-   dst[3] = src[3];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[3], src[3]);                           \
 } while (0)
 
 #define MACH64_SPEC( dst, src )                        \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);   \
 } while (0)
 
 #define VERT_SET_RGBA( v, c )    MACH64_COLOR( v->ub4[coloroffset], c )
@@ -1294,7 +1297,8 @@ do {                                              \
 
 #define LOCAL_VARS(n)                                          \
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);               \
-   GLuint color[n], spec[n];                                   \
+   GLuint color[n] = { 0 };                                    \
+   GLuint spec[n] = { 0 };                                     \
    GLuint vertex_size = mmesa->vertex_size;                    \
    const GLuint xyoffset = 9;                                  \
    const GLuint coloroffset = 8;                               \
@@ -1314,21 +1318,21 @@ do {                                            \
 #define VERT_Y(_v) _v->v.y
 #define VERT_Z(_v) _v->v.z
 #define AREA_IS_CCW( a ) (a > 0)
-#define GET_VERTEX(e) (mmesa->verts + (e<<mmesa->vertex_stride_shift))
+#define GET_VERTEX(e) (mmesa->verts + ((e) * mmesa->vertex_size * sizeof(int)))
 
 #define MACH64_COLOR( dst, src )                \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-   dst[3] = src[3];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[3], src[3]);                           \
 } while (0)
 
 #define MACH64_SPEC( dst, src )                        \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);   \
 } while (0)
 
 #define VERT_SET_RGBA( v, c )    MACH64_COLOR( v->ub4[coloroffset], c )
@@ -1508,7 +1512,7 @@ mach64_fallback_point( mach64ContextPtr mmesa,
 /*               Render unclipped begin/end objects                   */
 /**********************************************************************/
 
-#define VERT(x) (mach64Vertex *)(mach64verts + ((x) << shift))
+#define VERT(x) (mach64Vertex *)(mach64verts + ((x) * vertsize * sizeof(int)))
 #define RENDER_POINTS( start, count )          \
    for ( ; start < count ; start++)            \
       mach64_draw_point( mmesa, VERT(start) )
@@ -1525,7 +1529,7 @@ mach64_fallback_point( mach64ContextPtr mmesa,
 #undef LOCAL_VARS
 #define LOCAL_VARS                                             \
     mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);              \
-    const GLuint shift = mmesa->vertex_stride_shift;           \
+    const GLuint vertsize = mmesa->vertex_size;                 \
     const char *mach64verts = (char *)mmesa->verts;            \
     const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;      \
     (void) elt;
@@ -1583,14 +1587,16 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
    mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
    const GLuint vertsize = mmesa->vertex_size;
    GLint a;
-   GLfloat ooa;
+   union {
+      GLfloat f;
+      CARD32 u;
+   } ooa;
    GLuint xy;
    const GLuint xyoffset = 9;
    GLint xx[3], yy[3]; /* 2 fractional bits for hardware */
    unsigned vbsiz = (vertsize + (vertsize > 7 ? 2 : 1)) * n + (n-2);
    CARD32 *vb, *vbchk;
    GLubyte *mach64verts = (GLubyte *)mmesa->verts;
-   const GLuint shift = mmesa->vertex_stride_shift;
    mach64VertexPtr v0, v1, v2;
    int i;
    
@@ -1622,7 +1628,7 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
       return;
    }
    
-   ooa = 16.0 / a;
+   ooa.f = 16.0 / a;
    
    vb = (CARD32 *)mach64AllocDmaLow( mmesa, vbsiz * sizeof(CARD32) );
    vbchk = vb + vbsiz;
@@ -1630,7 +1636,7 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
    COPY_VERTEX( vb, vertsize, v0, 1 );
    COPY_VERTEX( vb, vertsize, v1, 2 );
    COPY_VERTEX_OOA( vb, vertsize, v2, 3 );
-   LE32_OUT( vb++, *(CARD32 *)&ooa );
+   LE32_OUT( vb++, ooa.u );
 
    i = 3;
    while (1) {
@@ -1645,10 +1651,10 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
              
       a = (xx[0] - xx[2]) * (yy[1] - yy[2]) -
          (yy[0] - yy[2]) * (xx[1] - xx[2]);
-      ooa = 16.0 / a;
+      ooa.f = 16.0 / a;
    
       COPY_VERTEX_OOA( vb, vertsize, v0, 1 );
-      LE32_OUT( vb++, *(CARD32 *)&ooa );
+      LE32_OUT( vb++, ooa.u );
       
       if (i >= n)
         break;
@@ -1661,10 +1667,10 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
              
       a = (xx[0] - xx[2]) * (yy[1] - yy[2]) -
          (yy[0] - yy[2]) * (xx[1] - xx[2]);
-      ooa = 16.0 / a;
+      ooa.f = 16.0 / a;
    
       COPY_VERTEX_OOA( vb, vertsize, v1, 2 );
-      LE32_OUT( vb++, *(CARD32 *)&ooa );
+      LE32_OUT( vb++, ooa.u );
    }
 
    assert( vb == vbchk );
@@ -1674,8 +1680,8 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
                                         GLuint n )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
+   const GLuint vertsize = mmesa->vertex_size;
    GLubyte *mach64verts = (GLubyte *)mmesa->verts;
-   const GLuint shift = mmesa->vertex_stride_shift;
    const GLuint *start = (const GLuint *)VERT(elts[0]);
    int i;
 
@@ -1839,6 +1845,30 @@ static void mach64RenderFinish( GLcontext *ctx )
 /*           Transition to/from hardware rasterization.               */
 /**********************************************************************/
 
+static const char * const fallbackStrings[] = {
+   "Texture mode",
+   "glDrawBuffer(GL_FRONT_AND_BACK)",
+   "glReadBuffer",
+   "glEnable(GL_STENCIL) without hw stencil buffer",
+   "glRenderMode(selection or feedback)",
+   "glLogicOp (mode != GL_COPY)",
+   "GL_SEPARATE_SPECULAR_COLOR",
+   "glBlendEquation (mode != ADD)",
+   "glBlendFunc",
+   "Rasterization disable",
+};
+
+
+static const char *getFallbackString(GLuint bit)
+{
+   int i = 0;
+   while (bit > 1) {
+      i++;
+      bit >>= 1;
+   }
+   return fallbackStrings[i];
+}
+
 void mach64Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -1846,18 +1876,18 @@ void mach64Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
    GLuint oldfallback = mmesa->Fallback;
 
    if (mode) {
-      if (MACH64_DEBUG & DEBUG_VERBOSE_MSG)
-        fprintf(stderr,"Set Fallback: %d\n", bit);
       mmesa->Fallback |= bit;
       if (oldfallback == 0) {
         FLUSH_BATCH( mmesa );
         _swsetup_Wakeup( ctx );
         mmesa->RenderIndex = ~0;
+        if (MACH64_DEBUG & DEBUG_VERBOSE_FALLBACK) {
+           fprintf(stderr, "Mach64 begin rasterization fallback: 0x%x %s\n",
+                   bit, getFallbackString(bit));
+        }
       }
    }
    else {
-      if (MACH64_DEBUG & DEBUG_VERBOSE_MSG)
-        fprintf(stderr,"Clear Fallback: %d\n", bit);
       mmesa->Fallback &= ~bit;
       if (oldfallback == bit) {
         _swrast_flush( ctx );
@@ -1867,6 +1897,10 @@ void mach64Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
         tnl->Driver.Render.BuildVertices = mach64BuildVertices;
         mmesa->NewGLState |= (_MACH64_NEW_RENDER_STATE|
                               _MACH64_NEW_VERTEX_STATE);
+        if (MACH64_DEBUG & DEBUG_VERBOSE_FALLBACK) {
+           fprintf(stderr, "Mach64 end rasterization fallback: 0x%x %s\n",
+                   bit, getFallbackString(bit));
+        }
       }
    }
 }
@@ -1891,6 +1925,4 @@ void mach64InitTriFuncs( GLcontext *ctx )
    tnl->Driver.Render.PrimitiveNotify = mach64RenderPrimitive;
    tnl->Driver.Render.ResetLineStipple = _swrast_ResetLineStipple;
    tnl->Driver.Render.BuildVertices = mach64BuildVertices;
-
-/*     mach64Fallback( ctx, 0x100000, 1 ); */
 }