Point Sprites
diff --git a/RenderScript.h b/RenderScript.h
index e4cf00f..2f60c9f 100644
--- a/RenderScript.h
+++ b/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/rs.spec b/rs.spec
index 1a81021..e275f27 100644
--- a/rs.spec
+++ b/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/rsComponent.cpp b/rsComponent.cpp
index b88710c..4a043f3 100644
--- a/rsComponent.cpp
+++ b/rsComponent.cpp
@@ -24,7 +24,7 @@
 Component::Component()
 {
     mType = FLOAT;
-    mKind = NONE;
+    mKind = USER;
     mIsNormalized = false;
     mBits = 0;
 }
diff --git a/rsComponent.h b/rsComponent.h
index 6342f1b..5856524 100644
--- a/rsComponent.h
+++ b/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/rsProgramFragment.cpp b/rsProgramFragment.cpp
index 9df07bf..4ef6835 100644
--- a/rsProgramFragment.cpp
+++ b/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/rsProgramFragment.h b/rsProgramFragment.h
index 57fb6a5..bd45342 100644
--- a/rsProgramFragment.h
+++ b/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/rsSampler.cpp b/rsSampler.cpp
index c14c371..332d532 100644
--- a/rsSampler.cpp
+++ b/rsSampler.cpp
@@ -143,6 +143,7 @@
                               ss->mWrapS,
                               ss->mWrapT,
                               ss->mWrapR);
+    s->incRef();
     return s;
 }
 
diff --git a/rsTriangleMesh.cpp b/rsTriangleMesh.cpp
index 8c7bc92..99f8adb 100644
--- a/rsTriangleMesh.cpp
+++ b/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/rsType.cpp b/rsType.cpp
index a40a152..5a9090e 100644
--- a/rsType.cpp
+++ b/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/rsType.h b/rsType.h
index 60d75d7..6c39a4c 100644
--- a/rsType.h
+++ b/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();