Fix some minor bugs with GL state setup that were exposed by Droids driver.
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index 00f19ae..15f3269 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -109,7 +109,7 @@
         }
 
         if (mSamplers[ct].get()) {
-            mSamplers[ct]->setupGL();
+            mSamplers[ct]->setupGL(rsc);
         } else {
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -141,32 +141,35 @@
 
 void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc)
 {
+
     //LOGE("sgl2 frag1 %x", glGetError());
     if ((state->mLast.get() == this) && !mDirty) {
         //return;
     }
     state->mLast.set(this);
 
+    rsc->checkError("ProgramFragment::setupGL2 start");
     for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
         glActiveTexture(GL_TEXTURE0 + ct);
         if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
-            glDisable(GL_TEXTURE_2D);
             continue;
         }
 
         mTextures[ct]->uploadCheck(rsc);
         glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
+        rsc->checkError("ProgramFragment::setupGL2 tex bind");
         if (mSamplers[ct].get()) {
-            mSamplers[ct]->setupGL();
+            mSamplers[ct]->setupGL(rsc);
         } else {
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+            rsc->checkError("ProgramFragment::setupGL2 tex env");
         }
 
-        glEnable(GL_TEXTURE_2D);
         glUniform1i(sc->fragUniformSlot(ct), ct);
+        rsc->checkError("ProgramFragment::setupGL2 uniforms");
     }
 
     glActiveTexture(GL_TEXTURE0);
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index 2c9bdaa..28f13d4 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -204,6 +204,7 @@
         //return;
     }
 
+    rsc->checkError("ProgramVertex::setupGL2 start");
     glVertexAttrib4f(1, state->color[0], state->color[1], state->color[2], state->color[3]);
 
     const float *f = static_cast<const float *>(mConstants[0]->getPtr());
@@ -220,6 +221,7 @@
                            &f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET]);
     }
 
+    rsc->checkError("ProgramVertex::setupGL2 begin uniforms");
     uint32_t uidx = 1;
     for (uint32_t ct=0; ct < mConstantCount; ct++) {
         Allocation *alloc = mConstants[ct+1].get();
diff --git a/rsSampler.cpp b/rsSampler.cpp
index f9bdb2e..7552d54 100644
--- a/rsSampler.cpp
+++ b/rsSampler.cpp
@@ -53,7 +53,7 @@
 {
 }
 
-void Sampler::setupGL()
+void Sampler::setupGL(const Context *rsc)
 {
     GLenum trans[] = {
         GL_NEAREST, //RS_SAMPLER_NEAREST,
@@ -69,6 +69,7 @@
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, trans[mWrapT]);
 
+    rsc->checkError("ProgramFragment::setupGL2 tex env");
 }
 
 void Sampler::bindToContext(SamplerState *ss, uint32_t slot)
@@ -83,18 +84,18 @@
     mBoundSlot = -1;
     ss->mSamplers[slot].clear();
 }
-
+/*
 void SamplerState::setupGL()
 {
     for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) {
         Sampler *s = mSamplers[ct].get();
         if (s) {
-            s->setupGL();
+            s->setupGL(rsc);
         } else {
             glBindTexture(GL_TEXTURE_2D, 0);
         }
     }
-}
+}*/
 
 ////////////////////////////////
 
diff --git a/rsSampler.h b/rsSampler.h
index ccf9b4d..9e20a2f 100644
--- a/rsSampler.h
+++ b/rsSampler.h
@@ -41,7 +41,7 @@
     virtual ~Sampler();
 
     void bind(Allocation *);
-    void setupGL();
+    void setupGL(const Context *);
 
     void bindToContext(SamplerState *, uint32_t slot);
     void unbindFromContext(SamplerState *);
@@ -74,7 +74,7 @@
 
     ObjectBaseRef<Sampler> mSamplers[RS_MAX_SAMPLER_SLOT];
 
-    void setupGL();
+    //void setupGL();
 
 };
 
diff --git a/rsSimpleMesh.cpp b/rsSimpleMesh.cpp
index a819c07..53ce5cd 100644
--- a/rsSimpleMesh.cpp
+++ b/rsSimpleMesh.cpp
@@ -63,7 +63,7 @@
             va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
             mVertexTypes[ct]->enableGLVertexBuffer2(&va);
         }
-        va.setupGL2(rsc, 0, &rsc->mShaderCache);
+        va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
     } else {
         for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
             mVertexBuffers[ct]->uploadCheck(rsc);
diff --git a/rsVertexArray.cpp b/rsVertexArray.cpp
index a1fd744..d0c0414 100644
--- a/rsVertexArray.cpp
+++ b/rsVertexArray.cpp
@@ -180,10 +180,12 @@
 
 void VertexArray::setupGL2(const Context *rsc, class VertexArrayState *state, ShaderCache *sc) const
 {
-    for (int ct=1; ct < RS_MAX_ATTRIBS; ct++) {
+    rsc->checkError("VertexArray::setupGL2 start");
+    for (uint32_t ct=1; ct <= state->mLastEnableCount; ct++) {
         glDisableVertexAttribArray(ct);
     }
 
+    rsc->checkError("VertexArray::setupGL2 disabled");
     for (uint32_t ct=0; ct < mCount; ct++) {
         uint32_t slot = 0;
         if (sc->isUserVertexProgram()) {
@@ -203,10 +205,12 @@
                               mAttribs[ct].stride,
                               (void *)mAttribs[ct].offset);
     }
-    rsc->checkError("VertexArray::setupGL2");
+    state->mLastEnableCount = mCount;
+    rsc->checkError("VertexArray::setupGL2 done");
 }
 ////////////////////////////////////////////
 
 void VertexArrayState::init(Context *) {
+    mLastEnableCount = 0;
 }
 
diff --git a/rsVertexArray.h b/rsVertexArray.h
index 66b3ab0..3904cb6 100644
--- a/rsVertexArray.h
+++ b/rsVertexArray.h
@@ -73,6 +73,7 @@
 public:
     void init(Context *);
 
+    uint32_t mLastEnableCount;
     //VertexArray::Attrib mAttribs[VertexArray::_LAST];
 };