Add support for multitexture and fix allocation ref counting bug in RS.  Add plaque to rollo and leave it disabled due to ugly appearance.
diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c
index 64a0d0f..f181e49 100644
--- a/libs/rs/java/Rollo/res/raw/rollo.c
+++ b/libs/rs/java/Rollo/res/raw/rollo.c
@@ -25,13 +25,13 @@
     int pressure;
 
 
-    iconCount = 38;//loadI32(0, 1);
     rotStep = 20 * 0x10000;
     pressure = loadI32(0, 2);
 
     rowCount = 4;
-    rot = (-20 + loadI32(0, 0)) * 0x10000;
 
+    iconCount = loadI32(0, 1);
+    rot = (-20 + loadI32(0, 0)) * 0x10000;
     while (iconCount) {
         tmpSin = sinx(rot);
         tmpCos = cosx(rot);
@@ -45,9 +45,7 @@
         for (y = 0; (y < rowCount) && iconCount; y++) {
             ty1 = (y * 0x30000) - 0x48000;
             ty2 = ty1 + 0x20000;
-
             pfBindTexture(NAMED_PF, 0, loadI32(1, y));
-
             drawQuad(tx1, ty1, tz1,
                      tx2, ty1, tz2,
                      tx2, ty2, tz2,
@@ -57,8 +55,6 @@
         rot = rot + rotStep;
     }
 
-    //renderTriangleMesh(con, NAMED_MeshCard);
-    //renderTriangleMesh(con, NAMED_MeshTab);
-    return 1;
+    return 0;
 }
 
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
index 003a2a0..91f25c2 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
@@ -69,6 +69,7 @@
     private RenderScript.ProgramVertex mPV;
     private ProgramVertexAlloc mPVAlloc;
     private RenderScript.Allocation[] mIcons;
+    private RenderScript.Allocation mIconPlate;
 
     private int[] mAllocStateBuf;
     private RenderScript.Allocation mAllocState;
@@ -79,7 +80,9 @@
     private void initNamed() {
         mRS.samplerBegin();
         mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN,
-                       RenderScript.SamplerValue.LINEAR_MIP_LINEAR);
+                       RenderScript.SamplerValue.LINEAR);//_MIP_LINEAR);
+        mRS.samplerSet(RenderScript.SamplerParam.FILTER_MAG,
+                       RenderScript.SamplerValue.LINEAR);
         mRS.samplerSet(RenderScript.SamplerParam.WRAP_MODE_S,
                        RenderScript.SamplerValue.CLAMP);
         mRS.samplerSet(RenderScript.SamplerParam.WRAP_MODE_T,
@@ -89,10 +92,13 @@
 
         mRS.programFragmentBegin(null, null);
         mRS.programFragmentSetTexEnable(0, true);
+        //mRS.programFragmentSetTexEnable(1, true);
         //mRS.programFragmentSetEnvMode(0, RS_TEX_ENV_MODE_REPLACE);
+        //mRS.programFragmentSetEnvMode(1, RS_TEX_ENV_MODE_MODULATE);
         mPFImages = mRS.programFragmentCreate();
         mPFImages.setName("PF");
         mPFImages.bindSampler(mSampler, 0);
+        mPFImages.bindSampler(mSampler, 1);
 
         mRS.programFragmentStoreBegin(null, null);
         mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
@@ -148,6 +154,34 @@
                 mAllocIconIDBuf[ct] = mIcons[ct].getID();
             }
             mAllocIconID.data(mAllocIconIDBuf);
+
+            RenderScript.Element e = mRS.elementGetPredefined(RenderScript.ElementPredefined.RGB_565);
+            mRS.typeBegin(e);
+            mRS.typeAdd(RenderScript.Dimension.X, 64);
+            mRS.typeAdd(RenderScript.Dimension.Y, 64);
+            RenderScript.Type t = mRS.typeCreate();
+            mIconPlate = mRS.allocationCreateTyped(t);
+            //t.destroy();
+            //e.destroy();
+
+            int tmp[] = new int[64 * 32];
+            for(int ct = 0; ct < (64*32); ct++) {
+                tmp[ct] = 7 | (13 << 5) | (7 << 11);
+                tmp[ct] = tmp[ct] | (tmp[ct] << 16);
+            }
+            for(int ct = 0; ct < 32; ct++) {
+                tmp[ct] = 0;
+                tmp[ct + (63*32)] = 0;
+            }
+            for(int ct = 0; ct < 64; ct++) {
+                tmp[ct * 32] = 0;
+                tmp[ct * 32 + 31] = 0;
+            }
+            mIconPlate.data(tmp);
+            Log.e("xx", "plate");
+            mIconPlate.uploadToTexture(0);
+            mIconPlate.setName("Plate");
+            mPFImages.bindTexture(mIconPlate, 0);
         }
 
     }
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index bc14eac..c143307 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -164,6 +164,7 @@
     const Type * type = static_cast<const Type *>(vtype);
 
     Allocation * alloc = new Allocation(type);
+    alloc->incRef();
     return alloc;
 }
 
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index f2e7095..628f93e 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -32,6 +32,7 @@
         mTextureDimensions[ct] = 2;
     }
     mTextureEnableMask = 0;
+    mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
 }
 
 ProgramFragment::~ProgramFragment()
@@ -42,10 +43,7 @@
 {
     for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
         glActiveTexture(GL_TEXTURE0 + ct);
-        if (!(mTextureEnableMask & (1 << ct)) ||
-            //!mSamplers[ct].get() ||
-            !mTextures[ct].get()) {
-
+        if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
             glDisable(GL_TEXTURE_2D);
             continue;
         }
@@ -55,13 +53,13 @@
 
         switch(mEnvModes[ct]) {
         case RS_TEX_ENV_MODE_REPLACE:
-            glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
             break;
         case RS_TEX_ENV_MODE_MODULATE:
-            glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
             break;
         case RS_TEX_ENV_MODE_DECAL:
-            glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_DECAL);
+            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
             break;
         }
 
@@ -70,10 +68,29 @@
         } 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_CLAMP_TO_EDGE);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
         }
+
+        // Gross hack.
+        if (ct == 2) {
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
+
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+        }
     }
+
+
     glActiveTexture(GL_TEXTURE0);
 }
 
@@ -85,6 +102,7 @@
         return;
     }
 
+    //LOGE("bindtex %i %p", slot, a);
     mTextures[slot].set(a);
 }
 
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 55daf7e..0ec6baf 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -334,12 +334,19 @@
     //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
 
     glEnableClientState(GL_VERTEX_ARRAY);
+    glVertexPointer(3, GL_FIXED, 0, vtx);
+
+    glClientActiveTexture(GL_TEXTURE0);
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glTexCoordPointer(2, GL_FIXED, 0, tex);
+    glClientActiveTexture(GL_TEXTURE1);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glTexCoordPointer(2, GL_FIXED, 0, tex);
+    glClientActiveTexture(GL_TEXTURE0);
+
     glDisableClientState(GL_NORMAL_ARRAY);
     glDisableClientState(GL_COLOR_ARRAY);
 
-    glVertexPointer(3, GL_FIXED, 0, vtx);
-    glTexCoordPointer(2, GL_FIXED, 0, tex);
     //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
 
     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);