fix up radeon span functions using latest r200 code from Brian,
[mesa.git] / src / mesa / drivers / dri / mga / mgatris.c
index 054c7f0635d2c24cee340f04faebc010b0479e9b..2b7ea05b142cbba262508e660c13e4494ed1ea06 100644 (file)
@@ -328,10 +328,10 @@ mga_fallback_point( mgaContextPtr mmesa,
 #define MGA_MAX_TRIFUNC     0x20
 
 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[MGA_MAX_TRIFUNC];
 
 #define DO_FALLBACK (IND & MGA_FALLBACK_BIT)
@@ -352,20 +352,6 @@ static struct {
 #define VERTEX mgaVertex
 #define TAB rast_tab
 
-#define MGA_COLOR( dst, src )                  \
-do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-   dst[3] = src[3];                            \
-} while (0)
-
-#define MGA_SPEC( dst, src )                   \
-do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-} while (0)
 
 #define DEPTH_SCALE mmesa->depth_scale
 #define UNFILLED_TRI unfilled_tri
@@ -374,17 +360,37 @@ 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 VERT_SET_RGBA( v, c )                                          \
+do {                                                           \
+   mga_color_t *color = (mga_color_t *)&((v)->ui[4]);  \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);               \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);             \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);              \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);             \
+} while (0)
 
-#define VERT_SET_RGBA( v, c )  MGA_COLOR( v->ub4[4], c )
 #define VERT_COPY_RGBA( v0, v1 ) v0->ui[4] = v1->ui[4]
-#define VERT_SAVE_RGBA( idx )  color[idx] = v[idx]->ui[4]
-#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[4] = color[idx]   
 
-#define VERT_SET_SPEC( v, c )  MGA_SPEC( v->ub4[5], c )
-#define VERT_COPY_SPEC( v0, v1 ) COPY_3V(v0->ub4[5], v1->ub4[5])
-#define VERT_SAVE_SPEC( idx )  spec[idx] = v[idx]->ui[5]
-#define VERT_RESTORE_SPEC( idx ) v[idx]->ui[5] = spec[idx]   
+#define VERT_SET_SPEC( v0, c )                                 \
+do {                                                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.red, (c)[0]);       \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.green, (c)[1]);     \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.blue, (c)[2]);      \
+} while (0)
+
+#define VERT_COPY_SPEC( v0, v1 )               \
+do {                                           \
+   v0->v.specular.red   = v1->v.specular.red;  \
+   v0->v.specular.green = v1->v.specular.green;        \
+   v0->v.specular.blue  = v1->v.specular.blue; \
+} while (0)
+
+#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[4]
+#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[4] = color[idx]
+#define VERT_SAVE_SPEC( idx )    spec[idx] = v[idx]->ui[5]
+#define VERT_RESTORE_SPEC( idx ) v[idx]->ui[5] = spec[idx]
 
 #define LOCAL_VARS(n)                                  \
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);             \
@@ -585,7 +591,7 @@ static void init_rast_tab( void )
 /**********************************************************************/
 
 
-#define VERT(x) (mgaVertex *)(vertptr + ((x)<<vertshift))
+#define VERT(x) (mgaVertex *)(vertptr + ((x)*vertex_size*sizeof(int)))
 #define RENDER_POINTS( start, count )          \
    for ( ; start < count ; start++)            \
       mga_draw_point( mmesa, VERT(ELT(start)) );
@@ -600,7 +606,7 @@ static void init_rast_tab( void )
 #define LOCAL_VARS                                             \
     mgaContextPtr mmesa = MGA_CONTEXT(ctx);                    \
     GLubyte *vertptr = (GLubyte *)mmesa->verts;                        \
-    const GLuint vertshift = mmesa->vertex_stride_shift;               \
+    const GLuint vertex_size = mmesa->vertex_size;             \
     const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;      \
     (void) elt;
 #define RESET_STIPPLE 
@@ -657,7 +663,6 @@ static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
    GLuint vertex_size = mmesa->vertex_size;
    GLuint *vb = mgaAllocDmaLow( mmesa, (n-2) * 3 * 4 * vertex_size );
    GLubyte *vertptr = (GLubyte *)mmesa->verts;                 
-   const GLuint vertshift = mmesa->vertex_stride_shift;        
    const GLuint *start = (const GLuint *)VERT(elts[0]);
    int i,j;
 
@@ -676,8 +681,7 @@ static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
 #define POINT_FALLBACK (DD_POINT_SMOOTH)
 #define LINE_FALLBACK (DD_LINE_SMOOTH | DD_LINE_STIPPLE)
 #define TRI_FALLBACK (DD_TRI_SMOOTH | DD_TRI_UNFILLED)
-#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK| \
-                            DD_TRI_STIPPLE)
+#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)
 #define ANY_RASTER_FLAGS (DD_FLATSHADE|DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET| \
                           DD_TRI_UNFILLED)
 
@@ -688,7 +692,7 @@ void mgaChooseRenderState(GLcontext *ctx)
    GLuint flags = ctx->_TriangleCaps;
    GLuint index = 0;
 
-   if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) {
+   if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS|DD_TRI_STIPPLE)) {
       if (flags & ANY_RASTER_FLAGS) {
         if (flags & DD_TRI_LIGHT_TWOSIDE)    index |= MGA_TWOSIDE_BIT;
         if (flags & DD_TRI_OFFSET)           index |= MGA_OFFSET_BIT;
@@ -713,9 +717,11 @@ void mgaChooseRenderState(GLcontext *ctx)
         if (flags & TRI_FALLBACK) 
            mmesa->draw_tri = mga_fallback_tri;
         
-        if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple)
-           mmesa->draw_tri = mga_fallback_tri;
-      
+        index |= MGA_FALLBACK_BIT;
+      }
+
+      if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple) {
+        mmesa->draw_tri = mga_fallback_tri;
         index |= MGA_FALLBACK_BIT;
       }
    }
@@ -782,10 +788,9 @@ void mgaRasterPrimitive( GLcontext *ctx, GLenum prim, GLuint hwprim )
    if (ctx->Polygon.StippleFlag && mmesa->haveHwStipple)
    {
       mmesa->dirty |= MGA_UPLOAD_CONTEXT;
+      mmesa->setup.dwgctl &= ~(0xf<<20);
       if (mmesa->raster_primitive == GL_TRIANGLES)
         mmesa->setup.dwgctl |= mmesa->poly_stipple;
-      else
-        mmesa->setup.dwgctl &= ~(0xf<<20);
    }
 }
 
@@ -830,11 +835,12 @@ static const char * const fallbackStrings[] = {
    "Texture mode",
    "glDrawBuffer(GL_FRONT_AND_BACK)",
    "read buffer",
-   "LogicOp != GL_COPY",
+   "glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ZERO)",
    "glRenderMode(selection or feedback)",
    "No hardware stencil",
    "glDepthFunc( GL_NEVER )",
-   "Mixing GL_CLAMP_TO_EDGE and GL_CLAMP"
+   "Mixing GL_CLAMP_TO_EDGE and GL_CLAMP",
+   "rasterization fallback option"
 };
 
 static const char *getFallbackString(GLuint bit)