r300: Further reduced the radeon_span.c diff.
[mesa.git] / src / mesa / swrast / s_points.c
index 33b11e5d5ce00530d7d23c7985242ede4e474081..1401b772caf531445db958ac2ab93297d0300c57 100644 (file)
@@ -1,21 +1,19 @@
-/* $Id: s_points.c,v 1.10 2001/01/03 22:17:16 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
- * 
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
- * 
+ * Version:  6.1
+ *
+ * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
 
 #include "glheader.h"
+#include "colormac.h"
 #include "context.h"
 #include "macros.h"
-#include "mmath.h"
 #include "texstate.h"
 #include "s_context.h"
 #include "s_feedback.h"
-#include "s_pb.h"
 #include "s_points.h"
 #include "s_span.h"
 
 
 
-#define INDEX      0x0
 #define RGBA       0x1
-#define SMOOTH     0x2
-#define TEXTURE    0x4
-#define SPECULAR   0x8
-#define LARGE     0x10
-#define ATTENUATE 0x20
-#define SPRITE    0x40
+#define INDEX      0x2
+#define SMOOTH     0x4
+#define ATTRIBS    0x8
+#define SPECULAR  0x10
+#define LARGE     0x20
+#define ATTENUATE 0x40
+#define SPRITE    0x80
 
 
 /*
 
 
 /*
- * RGBA points with size == 1.0
+ * General CI points.
  */
-#define FLAGS (RGBA)
-#define NAME size1_rgba_point
+#define FLAGS (INDEX | LARGE)
+#define NAME general_ci_point
 #include "s_pointtemp.h"
 
 
 /*
- * General CI points.
+ * Antialiased CI points.
  */
-#define FLAGS (INDEX | LARGE)
-#define NAME general_ci_point
+#define FLAGS (INDEX | SMOOTH)
+#define NAME antialiased_ci_point
 #include "s_pointtemp.h"
 
 
 /*
- * General RGBA points.
+ * Distance attenuated, general CI points.
  */
-#define FLAGS (RGBA | LARGE)
-#define NAME general_rgba_point
+#define FLAGS (INDEX | ATTENUATE)
+#define NAME atten_general_ci_point
 #include "s_pointtemp.h"
 
 
 /*
- * Textured RGBA points.
+ * RGBA points with size == 1.0
  */
-#define FLAGS (RGBA | LARGE | TEXTURE)
-#define NAME textured_rgba_point
+#define FLAGS (RGBA)
+#define NAME size1_rgba_point
 #include "s_pointtemp.h"
 
 
 /*
- * Multitextured RGBA points.
+ * General RGBA points.
  */
-#define FLAGS (RGBA | LARGE | TEXTURE | SPECULAR)
-#define NAME multitextured_rgba_point
+#define FLAGS (RGBA | LARGE)
+#define NAME general_rgba_point
 #include "s_pointtemp.h"
 
 
 /*
- * Antialiased points with or without texture mapping.
+ * Antialiased RGBA points.
  */
-#define FLAGS (RGBA | SMOOTH | TEXTURE)
+#define FLAGS (RGBA | SMOOTH)
 #define NAME antialiased_rgba_point
 #include "s_pointtemp.h"
 
 
 /*
- * Distance attenuated, general CI points.
+ * Textured RGBA points.
  */
-#define FLAGS (INDEX | ATTENUATE)
-#define NAME atten_general_ci_point
+#define FLAGS (RGBA | LARGE | ATTRIBS | SPECULAR)
+#define NAME textured_rgba_point
+#include "s_pointtemp.h"
+
+
+/*
+ * Antialiased points with texture mapping.
+ */
+#define FLAGS (RGBA | SMOOTH | ATTRIBS | SPECULAR)
+#define NAME antialiased_tex_rgba_point
 #include "s_pointtemp.h"
 
 
 
 
 /*
- * Distance attenuated, Textured RGBA points.
+ * Distance attenuated, textured RGBA points.
  */
-#define FLAGS (RGBA | ATTENUATE | TEXTURE)
+#define FLAGS (RGBA | ATTENUATE | ATTRIBS | SPECULAR)
 #define NAME atten_textured_rgba_point
 #include "s_pointtemp.h"
 
 
 /*
- * Distance attenuated, Antialiased points with or without texture mapping.
+ * Distance attenuated, antialiased points with or without texture mapping.
  */
-#define FLAGS (RGBA | ATTENUATE | TEXTURE | SMOOTH)
+#define FLAGS (RGBA | ATTENUATE | ATTRIBS | SMOOTH)
 #define NAME atten_antialiased_rgba_point
 #include "s_pointtemp.h"
 
 /*
  * Sprite (textured point)
  */
-#define FLAGS (RGBA | TEXTURE | SPRITE)
+#define FLAGS (RGBA | SPRITE | SPECULAR)
 #define NAME sprite_point
 #include "s_pointtemp.h"
 
 
-#define FLAGS (RGBA | ATTENUATE | TEXTURE | SPRITE)
+#define FLAGS (RGBA | SPRITE | SPECULAR | ATTENUATE)
 #define NAME atten_sprite_point
 #include "s_pointtemp.h"
 
 
 
+void _swrast_add_spec_terms_point( GLcontext *ctx,
+                                  const SWvertex *v0 )
+{
+   SWvertex *ncv0 = (SWvertex *)v0;
+   GLchan c[1][4];
+   COPY_CHAN4( c[0], ncv0->color );
+   ACC_3V( ncv0->color, ncv0->specular );
+   SWRAST_CONTEXT(ctx)->SpecPoint( ctx, ncv0 );
+   COPY_CHAN4( ncv0->color, c[0] );
+}
+
+
 
 /* record the current point function name */
 #ifdef DEBUG
@@ -174,68 +191,85 @@ do {                                   \
  * Examine the current context to determine which point drawing function
  * should be used.
  */
-void 
+void
 _swrast_choose_point( GLcontext *ctx )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   GLboolean rgbmode = ctx->Visual.RGBAflag;
+   GLboolean rgbMode = ctx->Visual.rgbMode;
 
    if (ctx->RenderMode==GL_RENDER) {
-      if (ctx->Point.SpriteMode) {
+      if (ctx->Point.PointSprite) {
+         /* GL_ARB_point_sprite / GL_NV_point_sprite */
          /* XXX this might not be good enough */
          if (ctx->Point._Attenuated)
             USE(atten_sprite_point);
          else
             USE(sprite_point);
       }
-      else if (!ctx->Point._Attenuated) {
-         if (ctx->Point.SmoothFlag && rgbmode) {
-            USE(antialiased_rgba_point);
+      else if (ctx->Point.SmoothFlag) {
+         /* Smooth points */
+         if (rgbMode) {
+            if (ctx->Point._Attenuated || ctx->VertexProgram.PointSizeEnabled) {
+               USE(atten_antialiased_rgba_point);
+            }
+            else if (ctx->Texture._EnabledCoordUnits) {
+               USE(antialiased_tex_rgba_point);
+            }
+            else {
+               USE(antialiased_rgba_point);
+            }
          }
-         else if (ctx->Texture._ReallyEnabled) {
-            if (swrast->_MultiTextureEnabled ||
-                ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR ||
-               ctx->Fog.ColorSumEnabled) {
-              USE(multitextured_rgba_point);
+         else {
+            USE(antialiased_ci_point);
+         }
+      }
+      else if (ctx->Point._Attenuated || ctx->VertexProgram.PointSizeEnabled) {
+         if (rgbMode) {
+            if (ctx->Texture._EnabledCoordUnits) {
+               if (ctx->Point.SmoothFlag) {
+                  USE(atten_antialiased_rgba_point);
+               }
+               else {
+                  USE(atten_textured_rgba_point);
+               }
             }
             else {
-               USE(textured_rgba_point);
+               USE(atten_general_rgba_point);
             }
          }
-         else if (ctx->Point._Size == 1.0) {
-            /* size=1, any raster ops */
-            if (rgbmode)
-               USE(size1_rgba_point);
-            else
-               USE(size1_ci_point);
+         else {
+            /* ci, atten */
+            USE(atten_general_ci_point);
+         }
+      }
+      else if (ctx->Texture._EnabledCoordUnits && rgbMode) {
+         /* textured */
+         USE(textured_rgba_point);
+      }
+      else if (ctx->Point._Size != 1.0) {
+         /* large points */
+         if (rgbMode) {
+            USE(general_rgba_point);
          }
          else {
-           /* every other kind of point rendering */
-            if (rgbmode)
-               USE(general_rgba_point);
-            else
-               USE(general_ci_point);
+            USE(general_ci_point);
          }
-      } 
-      else if (ctx->Point.SmoothFlag && rgbmode) {
-         USE(atten_antialiased_rgba_point);
       }
-      else if (ctx->Texture._ReallyEnabled) {
-         USE(atten_textured_rgba_point);
-      } 
       else {
-         /* every other kind of point rendering */
-         if (rgbmode)
-            USE(atten_general_rgba_point);
-         else
-            USE(atten_general_ci_point);
-     }
+         /* single pixel points */
+         if (rgbMode) {
+            USE(size1_rgba_point);
+         }
+         else {
+            USE(size1_ci_point);
+         }
+      }
    }
    else if (ctx->RenderMode==GL_FEEDBACK) {
-      USE(gl_feedback_point);
+      USE(_swrast_feedback_point);
    }
    else {
       /* GL_SELECT mode */
-      USE(gl_select_point);
+      USE(_swrast_select_point);
    }
 }