changes towards GL_ARB_point_sprite (two-zero)
diff --git a/progs/demos/spriteblast.c b/progs/demos/spriteblast.c
index f1eee69..4e1d86c 100644
--- a/progs/demos/spriteblast.c
+++ b/progs/demos/spriteblast.c
@@ -56,7 +56,7 @@
 static GLfloat pointVelocity[MAX_POINTS][2];
 static GLfloat pointDirection[MAX_POINTS][2];
 static int colorList[MAX_POINTS];
-static int animate = 1, motion = 0;
+static int animate = 1, motion = 0, org = 0, sprite = 1, smooth = 1;
 
 static GLfloat colorSet[][4] = {
   /* Shades of red. */
@@ -240,17 +240,19 @@
   if (blend)
      glEnable(GL_BLEND);
 
-  glEnable(GL_TEXTURE_2D);
+  if (sprite) {
+     glEnable(GL_TEXTURE_2D);
 #ifdef GL_ARB_point_sprite
-  glEnable(GL_POINT_SPRITE_ARB);
+     glEnable(GL_POINT_SPRITE_ARB);
 #endif
+  }
 
   glColor3f(1,1,1);
   glBegin(GL_POINTS);
     for (i=0; i<numPoints; i++) {
       /* Draw alive particles. */
       if (colorList[i] != DEAD) {
-         /*glColor4fv(colorSet[colorList[i]]);*/
+        if (!sprite) glColor4fv(colorSet[colorList[i]]);
         glVertex3fv(pointList[i]);
       }
     }
@@ -326,9 +328,11 @@
 #endif
   case 8:
     glEnable(GL_POINT_SMOOTH);
+    smooth = 1;
     break;
   case 9:
     glDisable(GL_POINT_SMOOTH);
+    smooth = 0;
     break;
   case 10:
     glPointSize(4.0);
@@ -383,6 +387,47 @@
     makePointList();
     glutIdleFunc(idle);
     break;
+  case 'o':
+  case 'O':
+    org ^= 1;
+#if GL_VERSION_2_0
+#if GL_ARB_point_parameters
+    glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN,
+                      org ? GL_LOWER_LEFT : GL_UPPER_LEFT);
+#endif
+#endif
+    glutPostRedisplay();
+    break;
+  case 't':
+  case 'T':
+    sprite ^= 1;
+    glutPostRedisplay();
+    break;
+  case 's':
+  case 'S':
+    (smooth ^= 1) ? glEnable(GL_POINT_SMOOTH) : glDisable(GL_POINT_SMOOTH);
+    glutPostRedisplay();
+    break;
+  case '0':
+    glPointSize(1.0);
+    glutPostRedisplay();
+    break;
+  case '1':
+    glPointSize(2.0);
+    glutPostRedisplay();
+    break;
+  case '2':
+    glPointSize(4.0);
+    glutPostRedisplay();
+    break;
+  case '3':
+    glPointSize(8.0);
+    glutPostRedisplay();
+    break;
+  case '4':
+    glPointSize(16.0);
+    glutPostRedisplay();
+    break;
   case 27:
     exit(0);
   }
diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index 339c40b..dabb622 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -1017,6 +1017,10 @@
                   _mesa_set_enable(ctx, GL_POINT_SPRITE_NV,point->PointSprite);
                   _mesa_PointParameteriNV(GL_POINT_SPRITE_R_MODE_NV,
                                           ctx->Point.SpriteRMode);
+#if GL_VERSION_2_0
+                  _mesa_PointParameterfEXT(GL_POINT_SPRITE_COORD_ORIGIN,
+                                           (GLfloat)ctx->Point.SpriteOrigin);
+#endif
                }
             }
             break;
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 38ae4df..aaff717 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -1390,6 +1390,12 @@
          CHECK_EXTENSION_B(NV_point_sprite, pname);
          *params = ENUM_TO_BOOL(ctx->Point.SpriteRMode);
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_B(ARB_point_sprite, pname);
+         *params = ENUM_TO_BOOL(ctx->Point.SpriteOrigin);
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -2942,6 +2948,12 @@
          CHECK_EXTENSION_D(NV_point_sprite, pname);
          *params = (GLdouble) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_D(ARB_point_sprite, pname);
+         *params = (GLdouble) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -4468,6 +4480,12 @@
          CHECK_EXTENSION_F(NV_point_sprite, pname);
          *params = (GLfloat) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_F(ARB_point_sprite, pname);
+         *params = (GLfloat) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -6032,6 +6050,12 @@
          CHECK_EXTENSION_I(NV_point_sprite, pname);
          *params = (GLint) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_I(ARB_point_sprite, pname);
+         *params = (GLint) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 8fe8831..ba32faa 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -890,6 +890,7 @@
    GLboolean PointSprite;	/**< GL_NV_point_sprite / GL_NV_point_sprite */
    GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /**< GL_NV_point_sprite / GL_NV_point_sprite */
    GLenum SpriteRMode;		/**< GL_NV_point_sprite (only!) */
+   GLenum SpriteOrigin;		/**< GL_ARB_point_sprite */
 };
 
 
diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c
index cbb9155..5f5e010 100644
--- a/src/mesa/main/points.c
+++ b/src/mesa/main/points.c
@@ -229,6 +229,27 @@
             return;
          }
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         if (ctx->Extensions.ARB_point_sprite) {
+            GLenum value = (GLenum) params[0];
+            if (value != GL_LOWER_LEFT && value != GL_UPPER_LEFT) {
+               _mesa_error(ctx, GL_INVALID_VALUE,
+                           "glPointParameterf[v]{EXT,ARB}(param)");
+               return;
+            }
+            if (ctx->Point.SpriteOrigin == value)
+               return;
+            FLUSH_VERTICES(ctx, _NEW_POINT);
+            ctx->Point.SpriteOrigin = value;
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glPointParameterf[v]{EXT,ARB}(pname)");
+            return;
+         }
+         break;
+#endif
       default:
          _mesa_error( ctx, GL_INVALID_ENUM,
                       "glPointParameterf[v]{EXT,ARB}(pname)" );
@@ -266,6 +287,9 @@
    ctx->Point.Threshold = 1.0;
    ctx->Point.PointSprite = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */
    ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */
+#if GL_VERSION_2_0
+   ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */
+#endif
    for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
       ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */
    }
diff --git a/src/mesa/swrast/s_pointtemp.h b/src/mesa/swrast/s_pointtemp.h
index 3686e6a..1cfdf00 100644
--- a/src/mesa/swrast/s_pointtemp.h
+++ b/src/mesa/swrast/s_pointtemp.h
@@ -292,7 +292,13 @@
                if (ctx->Texture.Unit[u]._ReallyEnabled) {
                   if (ctx->Point.CoordReplace[u]) {
                      GLfloat s = 0.5F + (x + 0.5F - vert->win[0]) / size;
-                     GLfloat t = 0.5F - (y + 0.5F - vert->win[1]) / size;
+                     GLfloat t;
+#if GL_VERSION_2_0
+                     if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
+                        t = 0.5F + (y + 0.5F - vert->win[1]) / size;
+                     else /* GL_UPPER_LEFT */
+#endif
+                        t = 0.5F - (y + 0.5F - vert->win[1]) / size;
                      span->array->texcoords[u][count][0] = s;
                      span->array->texcoords[u][count][1] = t;
                      span->array->texcoords[u][count][3] = 1.0F;