Point Sprites
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index 3f75069..aeec739 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -111,7 +111,8 @@
         NX (15),
         NY (16),
         NZ (17),
-        INDEX (18);
+        INDEX (18),
+        POINT_SIZE(19);
 
         int mID;
         DataKind(int id) {
@@ -241,13 +242,18 @@
             add(DataType.FLOAT, DataKind.Z, false, 32, null);
             return this;
         }
-        
+
         public Builder addFloatST() {
             add(DataType.FLOAT, DataKind.S, false, 32, null);
             add(DataType.FLOAT, DataKind.T, false, 32, null);
             return this;
         }
 
+        public Builder addFloatPointSize() {
+            add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, null);
+            return this;
+        }
+
         public Builder addFloatRGB() {
             add(DataType.FLOAT, DataKind.RED, false, 32, null);
             add(DataType.FLOAT, DataKind.GREEN, false, 32, null);
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index aad09f6..392d93d 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -68,6 +68,7 @@
         RenderScript mRS;
         Element mIn;
         Element mOut;
+        boolean mPointSpriteEnable;
 
         private class Slot {
             Type mType;
@@ -85,6 +86,7 @@
             mIn = in;
             mOut = out;
             mSlots = new Slot[MAX_SLOT];
+            mPointSpriteEnable = false;
             for(int ct=0; ct < MAX_SLOT; ct++) {
                 mSlots[ct] = new Slot();
             }
@@ -117,6 +119,9 @@
             mSlots[slot].mEnv = env;
         }
 
+        public void setPointSpriteTexCoordinateReplacement(boolean enable) {
+            mPointSpriteEnable = enable;
+        }
 
         static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) {
             int inID = 0;
@@ -127,21 +132,18 @@
             if (b.mOut != null) {
                 outID = b.mOut.mID;
             }
-            rs.nProgramFragmentBegin(inID, outID);
+            rs.nProgramFragmentBegin(inID, outID, b.mPointSpriteEnable);
             for(int ct=0; ct < MAX_SLOT; ct++) {
                 if(b.mSlots[ct].mTexEnable) {
                     Slot s = b.mSlots[ct];
+                    int typeID = 0;
                     if(s.mType != null) {
-                        rs.nProgramFragmentSetType(ct, s.mType.mID);
+                        typeID = s.mType.mID;
                     }
-                    rs.nProgramFragmentSetTexEnable(ct, true);
-                    if(s.mEnv != null) {
-                        rs.nProgramFragmentSetEnvMode(ct, s.mEnv.mID);
-                    }
+                    rs.nProgramFragmentSetSlot(ct, true, s.mEnv.mID, typeID);
                 }
             }
 
-
             int id = rs.nProgramFragmentCreate();
             return new ProgramFragment(id, rs);
         }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index fca1c7a..076a5d4 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -158,12 +158,10 @@
     native void nProgramFragmentStoreDither(boolean enable);
     native int  nProgramFragmentStoreCreate();
 
-    native void nProgramFragmentBegin(int in, int out);
+    native void nProgramFragmentBegin(int in, int out, boolean pointSpriteEnable);
     native void nProgramFragmentBindTexture(int vpf, int slot, int a);
     native void nProgramFragmentBindSampler(int vpf, int slot, int s);
-    native void nProgramFragmentSetType(int slot, int vt);
-    native void nProgramFragmentSetEnvMode(int slot, int env);
-    native void nProgramFragmentSetTexEnable(int slot, boolean enable);
+    native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
     native int  nProgramFragmentCreate();
 
     native void nProgramVertexBindAllocation(int pv, int mID);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 001ecd0..fede0e50 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -952,11 +952,11 @@
 // ---------------------------------------------------------------------------
 
 static void
-nProgramFragmentBegin(JNIEnv *_env, jobject _this, jint in, jint out)
+nProgramFragmentBegin(JNIEnv *_env, jobject _this, jint in, jint out, jboolean pointSpriteEnable)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out);
-    rsProgramFragmentBegin(con, (RsElement)in, (RsElement)out);
+    LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p) PointSprite(%i)", con, (RsElement)in, (RsElement)out, pointSpriteEnable);
+    rsProgramFragmentBegin(con, (RsElement)in, (RsElement)out, pointSpriteEnable);
 }
 
 static void
@@ -976,27 +976,11 @@
 }
 
 static void
-nProgramFragmentSetType(JNIEnv *_env, jobject _this, jint slot, jint vt)
+nProgramFragmentSetSlot(JNIEnv *_env, jobject _this, jint slot, jboolean enable, jint env, jint vt)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentSetType, con(%p), slot(%i), vt(%p)", con, slot, (RsType)vt);
-    rsProgramFragmentSetType(con, slot, (RsType)vt);
-}
-
-static void
-nProgramFragmentSetEnvMode(JNIEnv *_env, jobject _this, jint slot, jint env)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentSetEnvMode, con(%p), slot(%i), vt(%i)", con, slot, env);
-    rsProgramFragmentSetEnvMode(con, slot, (RsTexEnvMode)env);
-}
-
-static void
-nProgramFragmentSetTexEnable(JNIEnv *_env, jobject _this, jint slot, jboolean enable)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramFragmentSetTexEnable, con(%p), slot(%i), enable(%i)", con, slot, enable);
-    rsProgramFragmentSetTexEnable(con, slot, enable);
+    LOG_API("nProgramFragmentSetType, con(%p), slot(%i), enable(%i), env(%i), vt(%p)", con, slot, enable, env, (RsType)vt);
+    rsProgramFragmentSetSlot(con, slot, enable, (RsTexEnvMode)env, (RsType)vt);
 }
 
 static jint
@@ -1305,12 +1289,10 @@
 {"nProgramFragmentStoreDither",    "(Z)V",                                 (void*)nProgramFragmentStoreDither },
 {"nProgramFragmentStoreCreate",    "()I",                                  (void*)nProgramFragmentStoreCreate },
 
-{"nProgramFragmentBegin",          "(II)V",                                (void*)nProgramFragmentBegin },
+{"nProgramFragmentBegin",          "(IIZ)V",                               (void*)nProgramFragmentBegin },
 {"nProgramFragmentBindTexture",    "(III)V",                               (void*)nProgramFragmentBindTexture },
 {"nProgramFragmentBindSampler",    "(III)V",                               (void*)nProgramFragmentBindSampler },
-{"nProgramFragmentSetType",        "(II)V",                                (void*)nProgramFragmentSetType },
-{"nProgramFragmentSetEnvMode",     "(II)V",                                (void*)nProgramFragmentSetEnvMode },
-{"nProgramFragmentSetTexEnable",   "(IZ)V",                                (void*)nProgramFragmentSetTexEnable },
+{"nProgramFragmentSetSlot",        "(IZII)V",                              (void*)nProgramFragmentSetSlot },
 {"nProgramFragmentCreate",         "()I",                                  (void*)nProgramFragmentCreate },
 
 {"nProgramVertexBindAllocation",   "(II)V",                                (void*)nProgramVertexBindAllocation },
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index e4cf00f..2f60c9f 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -80,7 +80,8 @@
     RS_KIND_NX,
     RS_KIND_NY,
     RS_KIND_NZ,
-    RS_KIND_INDEX
+    RS_KIND_INDEX,
+    RS_KIND_POINT_SIZE
 };
 
 enum RsElementPredefined {
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 1a81021..e275f27 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -361,6 +361,7 @@
 ProgramFragmentBegin {
 	param RsElement in
 	param RsElement out
+	param bool pointSpriteEnable
 	}
 
 ProgramFragmentBindTexture {
@@ -375,19 +376,11 @@
 	param RsSampler s
 	}
 
-ProgramFragmentSetType {
-	param uint32_t slot
-	param RsType t
-	}
-
-ProgramFragmentSetEnvMode {
-	param uint32_t slot
-	param RsTexEnvMode env
-	}
-
-ProgramFragmentSetTexEnable {
+ProgramFragmentSetSlot {
 	param uint32_t slot
 	param bool enable
+	param RsTexEnvMode env
+	param RsType t
 	}
 
 ProgramFragmentCreate {
diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp
index b88710c..4a043f3 100644
--- a/libs/rs/rsComponent.cpp
+++ b/libs/rs/rsComponent.cpp
@@ -24,7 +24,7 @@
 Component::Component()
 {
     mType = FLOAT;
-    mKind = NONE;
+    mKind = USER;
     mIsNormalized = false;
     mBits = 0;
 }
diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h
index 6342f1b..5856524 100644
--- a/libs/rs/rsComponent.h
+++ b/libs/rs/rsComponent.h
@@ -34,13 +34,13 @@
     };
 
     enum DataKind {
-        NONE,
+        USER,
         RED, GREEN, BLUE, ALPHA, LUMINANCE, INTENSITY,
         X, Y, Z, W,
         S, T, Q, R,
         NX, NY, NZ,
         INDEX,
-        USER
+        POINT_SIZE
     };
 
 
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 9df07bfd..4ef6835 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -24,7 +24,7 @@
 using namespace android::renderscript;
 
 
-ProgramFragment::ProgramFragment(Element *in, Element *out) :
+ProgramFragment::ProgramFragment(Element *in, Element *out, bool pointSpriteEnable) :
     Program(in, out)
 {
     for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
@@ -32,6 +32,7 @@
         mTextureDimensions[ct] = 2;
     }
     mTextureEnableMask = 0;
+    mPointSpriteEnable = pointSpriteEnable;
     mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
 }
 
@@ -54,6 +55,7 @@
         }
 
         glEnable(GL_TEXTURE_2D);
+        //glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
         glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
 
         switch(mEnvModes[ct]) {
@@ -94,7 +96,6 @@
             glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
         }
     }
-
     glActiveTexture(GL_TEXTURE0);
     mDirty = false;
 }
@@ -178,7 +179,7 @@
 
 void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
 {
-    ProgramFragment *pf = new ProgramFragment(NULL, NULL);
+    ProgramFragment *pf = new ProgramFragment(NULL, NULL, false);
     mDefault.set(pf);
 }
 
@@ -186,10 +187,10 @@
 namespace android {
 namespace renderscript {
 
-void rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out)
+void rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out, bool pointSpriteEnable)
 {
     delete rsc->mStateFragment.mPF;
-    rsc->mStateFragment.mPF = new ProgramFragment((Element *)in, (Element *)out);
+    rsc->mStateFragment.mPF = new ProgramFragment((Element *)in, (Element *)out, pointSpriteEnable);
 }
 
 void rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a)
@@ -204,27 +205,20 @@
     pf->bindSampler(slot, static_cast<Sampler *>(s));
 }
 
-void rsi_ProgramFragmentSetType(Context *rsc, uint32_t slot, RsType vt)
+void rsi_ProgramFragmentSetSlot(Context *rsc, uint32_t slot, bool enable, RsTexEnvMode env, RsType vt)
 {
     const Type *t = static_cast<const Type *>(vt);
-    uint32_t dim = 1;
-    if (t->getDimY()) {
-        dim ++;
-        if (t->getDimZ()) {
+    if (t) {
+        uint32_t dim = 1;
+        if (t->getDimY()) {
             dim ++;
+            if (t->getDimZ()) {
+                dim ++;
+            }
         }
+        rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim);
     }
-
-    rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim);
-}
-
-void rsi_ProgramFragmentSetEnvMode(Context *rsc, uint32_t slot, RsTexEnvMode env)
-{
     rsc->mStateFragment.mPF->setEnvMode(slot, env);
-}
-
-void rsi_ProgramFragmentSetTexEnable(Context *rsc, uint32_t slot, bool enable)
-{
     rsc->mStateFragment.mPF->setTexEnable(slot, enable);
 }
 
diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h
index 57fb6a5..bd45342 100644
--- a/libs/rs/rsProgramFragment.h
+++ b/libs/rs/rsProgramFragment.h
@@ -32,7 +32,7 @@
 
 
 
-    ProgramFragment(Element *in, Element *out);
+    ProgramFragment(Element *in, Element *out, bool pointSpriteEnable);
     virtual ~ProgramFragment();
 
     virtual void setupGL(ProgramFragmentState *);
@@ -64,6 +64,7 @@
     // Hacks to create a program for now
     RsTexEnvMode mEnvModes[MAX_TEXTURE];
     uint32_t mTextureEnableMask;
+    bool mPointSpriteEnable;
 };
 
 class ProgramFragmentState
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index c14c371..332d532 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -143,6 +143,7 @@
                               ss->mWrapS,
                               ss->mWrapT,
                               ss->mWrapR);
+    s->incRef();
     return s;
 }
 
diff --git a/libs/rs/rsTriangleMesh.cpp b/libs/rs/rsTriangleMesh.cpp
index 8c7bc92..99f8adb 100644
--- a/libs/rs/rsTriangleMesh.cpp
+++ b/libs/rs/rsTriangleMesh.cpp
@@ -199,6 +199,7 @@
     memcpy(tm->mIndexData, tmc->mIndexData.array(), tm->mIndexDataSize);
     tm->analyzeElement();
 
+    tm->incRef();
     return tm;
 }
 
@@ -248,16 +249,16 @@
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
 
     glEnableClientState(GL_VERTEX_ARRAY);
-    glVertexPointer(tm->mSizeCoord, 
-                    GL_FLOAT, 
-                    tm->mVertexElement->getSizeBytes(), 
+    glVertexPointer(tm->mSizeCoord,
+                    GL_FLOAT,
+                    tm->mVertexElement->getSizeBytes(),
                     (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetCoord));
 
     if (tm->mSizeTex) {
         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-        glTexCoordPointer(tm->mSizeTex, 
-                          GL_FLOAT, 
-                          tm->mVertexElement->getSizeBytes(), 
+        glTexCoordPointer(tm->mSizeTex,
+                          GL_FLOAT,
+                          tm->mVertexElement->getSizeBytes(),
                           (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetTex));
     } else {
         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -265,8 +266,8 @@
 
     if (tm->mSizeNorm) {
         glEnableClientState(GL_NORMAL_ARRAY);
-        glNormalPointer(GL_FLOAT, 
-                        tm->mVertexElement->getSizeBytes(), 
+        glNormalPointer(GL_FLOAT,
+                        tm->mVertexElement->getSizeBytes(),
                         (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetNorm));
     } else {
         glDisableClientState(GL_NORMAL_ARRAY);
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index a40a152..5a9090e 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -230,6 +230,13 @@
             mGL.mTex[texNum].size = 4;
         break;
 
+        case Component::POINT_SIZE:
+            rsAssert(!mGL.mPointSize.size);
+            mGL.mPointSize.size = 1;
+            mGL.mPointSize.offset = mElement->getComponentOffsetBytes(ct);
+            mGL.mPointSize.type = c->getGLType();
+        break;
+
         default:
             break;
         }
@@ -280,6 +287,13 @@
     }
     glClientActiveTexture(GL_TEXTURE0);
 
+    if (mGL.mPointSize.size) {
+        glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
+        glPointSizePointerOES(mGL.mPointSize.type,
+                              stride,
+                              (void *)mGL.mPointSize.offset);
+    }
+
 }
 
 
diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h
index 60d75d7..6c39a4c 100644
--- a/libs/rs/rsType.h
+++ b/libs/rs/rsType.h
@@ -118,6 +118,7 @@
         VertexComponent_t mNorm;
         VertexComponent_t mColor;
         VertexComponent_t mTex[RS_MAX_TEXTURE];
+        VertexComponent_t mPointSize;
     };
     GLState_t mGL;
     void makeGLComponents();