Remove stray defines of HAVE_RGBA
[mesa.git] / src / mesa / drivers / dri / r128 / r128_tris.c
index 34d7c7ffee753d52e2b9e76567d05fa8c664f157..9ea2a9d1624fd69a8db3a931326c11b5bacaaf8d 100644 (file)
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tris.c,v 1.8 2002/10/30 12:51:43 alanh Exp $ */ /* -*- c-basic-offset: 3 -*- */
+/* -*- c-basic-offset: 3 -*- */
 /**************************************************************************
 
 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
@@ -33,10 +33,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
  */
 
-#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"
@@ -75,7 +75,6 @@ static void r128RenderPrimitive( GLcontext *ctx, GLenum prim );
 #define HAVE_POINTS 1
 #define HAVE_LE32_VERTS 1
 #define CTX_ARG r128ContextPtr rmesa
-#define CTX_ARG2 rmesa
 #define GET_VERTEX_DWORDS() rmesa->vertex_size
 #define ALLOC_VERTS( n, size ) r128AllocDmaLow( rmesa, (n), (size) * 4 )
 #undef LOCAL_VARS
@@ -159,7 +158,6 @@ static struct {
 #define DO_POINTS    1
 #define DO_FULL_QUAD 1
 
-#define HAVE_RGBA   1
 #define HAVE_SPEC   1
 #define HAVE_BACK_COLORS  0
 #define HAVE_HW_FLATSHADE 1
@@ -217,7 +215,8 @@ do {                                                        \
 
 #define LOCAL_VARS(n)                                          \
    r128ContextPtr rmesa = R128_CONTEXT(ctx);                   \
-   GLuint color[n], spec[n];                                   \
+   GLuint color[n] = { 0 };                                    \
+   GLuint spec[n] = { 0 };                                     \
    GLuint coloroffset = rmesa->coloroffset;                    \
    GLuint specoffset = rmesa->specoffset;                      \
    GLboolean havespec = (rmesa->specoffset != 0);              \
@@ -350,7 +349,6 @@ r128_fallback_tri( r128ContextPtr rmesa,
    _swsetup_Translate( ctx, v0, &v[0] );
    _swsetup_Translate( ctx, v1, &v[1] );
    _swsetup_Translate( ctx, v2, &v[2] );
-   /* XXX: SpanRenderStart */
    _swrast_Triangle( ctx, &v[0], &v[1], &v[2] );
 }
 
@@ -422,13 +420,13 @@ r128_fallback_point( r128ContextPtr rmesa,
 /**********************************************************************/
 
 #define POINT_FALLBACK (DD_POINT_SMOOTH)
-#define LINE_FALLBACK (DD_LINE_STIPPLE|DD_LINE_SMOOTH)
+#define LINE_FALLBACK (DD_LINE_STIPPLE)
 #define TRI_FALLBACK (DD_TRI_SMOOTH)
 #define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)
 #define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)
 #define _R128_NEW_RENDER_STATE (ANY_FALLBACK_FLAGS | ANY_RASTER_FLAGS)
 
-static void r128ChooseRenderState(GLcontext *ctx)
+void r128ChooseRenderState(GLcontext *ctx)
 {
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
    GLuint flags = ctx->_TriangleCaps;
@@ -533,11 +531,36 @@ static void r128RasterPrimitive( GLcontext *ctx, GLuint hwprim )
    }
 }
 
+static void r128SetupAntialias( GLcontext *ctx, GLenum prim )
+{
+   r128ContextPtr rmesa = R128_CONTEXT(ctx);
+
+   GLuint currAA, wantAA;
+   
+   currAA = (rmesa->setup.pm4_vc_fpu_setup & R128_EDGE_ANTIALIAS) != 0;
+   if( prim >= GL_TRIANGLES )
+      wantAA = ctx->Polygon.SmoothFlag;
+   else if( prim >= GL_LINES )
+      wantAA = ctx->Line.SmoothFlag;
+   else
+      wantAA = 0;
+      
+   if( wantAA != currAA )
+   {
+     FLUSH_BATCH( rmesa );
+     rmesa->setup.pm4_vc_fpu_setup ^= R128_EDGE_ANTIALIAS;
+     rmesa->dirty |= R128_UPLOAD_SETUP;
+   }
+}
+
 static void r128RenderPrimitive( GLcontext *ctx, GLenum prim )
 {
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
    GLuint hw = hw_prim[prim];
    rmesa->render_primitive = prim;
+
+   r128SetupAntialias( ctx, prim );
+   
    if (prim >= GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED))
       return;
    r128RasterPrimitive( ctx, hw );
@@ -566,11 +589,13 @@ static void r128RenderStart( GLcontext *ctx )
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    struct vertex_buffer *VB = &tnl->vb;
-   GLuint index = tnl->render_inputs;
+   DECLARE_RENDERINPUTS(index_bitset);
    GLuint vc_frmt = 0;
    GLboolean fallback_projtex = GL_FALSE;
    GLuint offset = 0;
 
+   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );
+
    /* Important: */
    VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
    rmesa->vertex_attr_count = 0;
@@ -579,52 +604,69 @@ static void r128RenderStart( GLcontext *ctx )
    /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
     * build up a hardware vertex.
     */
-   if ( index & _TNL_BITS_TEX_ANY )
-      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, R128_CCE_VC_FRMT_RHW, 16 );
+   if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ))
+      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, R128_CCE_VC_FRMT_RHW, 4 );
    else
-      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 12 );
+      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 3 );
 
    rmesa->coloroffset = offset;
+#if MESA_LITTLE_ENDIAN 
    EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA,
       R128_CCE_VC_FRMT_DIFFUSE_ARGB, 4 );
+#else
+   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ARGB,
+      R128_CCE_VC_FRMT_DIFFUSE_ARGB, 4 );
+#endif
 
-   if ( index & (_TNL_BIT_COLOR1|_TNL_BIT_FOG) ) {
-      if ( index & _TNL_BIT_COLOR1) {
+   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) ||
+       RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
+#if MESA_LITTLE_ENDIAN
+      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
         rmesa->specoffset = offset;
-        EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
+        EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
            R128_CCE_VC_FRMT_SPEC_FRGB, 3 );
       } else 
         EMIT_PAD( 3 );
 
-      if (index & _TNL_BIT_FOG)
+      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG ))
+        EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, R128_CCE_VC_FRMT_SPEC_FRGB,
+                   1 );
+      else
+        EMIT_PAD( 1 );
+#else
+      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG ))
         EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, R128_CCE_VC_FRMT_SPEC_FRGB,
                    1 );
       else
         EMIT_PAD( 1 );
+
+      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
+        rmesa->specoffset = offset;
+        EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
+           R128_CCE_VC_FRMT_SPEC_FRGB, 3 );
+      } else 
+        EMIT_PAD( 3 );
+#endif
    }
 
-   if ( index & _TNL_BIT_TEX(0) ) {
-      if ( VB->TexCoordPtr[0]->size > 2 )
+   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(rmesa->tmu_source[0]) )) {
+      if ( VB->AttribPtr[_TNL_ATTRIB_TEX0 + rmesa->tmu_source[0]]->size > 2 )
         fallback_projtex = GL_TRUE;
       EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, R128_CCE_VC_FRMT_S_T, 8 );
-      if ( index & _TNL_BIT_TEX(1) ) {
-        if ( VB->TexCoordPtr[1]->size > 2 )
-           fallback_projtex = GL_TRUE;
-        EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, R128_CCE_VC_FRMT_S2_T2, 8 );
-      }
-   } else if ( index & _TNL_BIT_TEX(1) ) {
-      if ( VB->TexCoordPtr[1]->size > 2 )
+   }
+   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(rmesa->tmu_source[1]) )) {
+      if ( VB->AttribPtr[_TNL_ATTRIB_TEX0 + rmesa->tmu_source[1]]->size > 2 )
         fallback_projtex = GL_TRUE;
-      EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, R128_CCE_VC_FRMT_S_T, 8 );
+      EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, R128_CCE_VC_FRMT_S2_T2, 8 );
    }
 
    /* projective textures are not supported by the hardware */
-   FALLBACK( rmesa, R128_FALLBACK_TEXTURE, fallback_projtex );
+   FALLBACK( rmesa, R128_FALLBACK_PROJTEX, fallback_projtex );
 
    /* Only need to change the vertex emit code if there has been a
     * statechange to a TNL index.
     */
-   if ( index != rmesa->tnl_state ) {
+   if (!RENDERINPUTS_EQUAL( index_bitset, rmesa->tnl_state_bitset )) {
       FLUSH_BATCH( rmesa );
       rmesa->dirty |= R128_UPLOAD_CONTEXT;
 
@@ -650,6 +692,31 @@ static void r128RenderFinish( 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",
+   "Projective texture",
+   "Rasterization disable",
+};
+
+
+static const char *getFallbackString(GLuint bit)
+{
+   int i = 0;
+   while (bit > 1) {
+      i++;
+      bit >>= 1;
+   }
+   return fallbackStrings[i];
+}
+
 void r128Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -662,6 +729,10 @@ void r128Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
         FLUSH_BATCH( rmesa );
         _swsetup_Wakeup( ctx );
         rmesa->RenderIndex = ~0;
+        if ( R128_DEBUG & DEBUG_VERBOSE_FALL ) {
+            fprintf(stderr, "R128 begin rasterization fallback: 0x%x %s\n",
+                    bit, getFallbackString(bit));
+        }
       }
    }
    else {
@@ -684,6 +755,10 @@ void r128Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
                             rmesa->hw_viewport, 0 ); 
 
         rmesa->NewGLState |= _R128_NEW_RENDER_STATE;
+        if ( R128_DEBUG & DEBUG_VERBOSE_FALL ) {
+            fprintf(stderr, "R128 end rasterization fallback: 0x%x %s\n",
+                    bit, getFallbackString(bit));
+        }
       }
    }
 }
@@ -716,9 +791,7 @@ void r128InitTriFuncs( GLcontext *ctx )
    _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, 
                       (6 + 2 * ctx->Const.MaxTextureUnits) * sizeof(GLfloat) );
    rmesa->verts = (char *)tnl->clipspace.vertex_buf;
-   rmesa->tnl_state = -1;
+   RENDERINPUTS_ONES( rmesa->tnl_state_bitset );
 
    rmesa->NewGLState |= _R128_NEW_RENDER_STATE;
-
-/*     r128Fallback( ctx, 0x100000, 1 ); */
 }