Support for cubemaps.

Change-Id: Iaf6087f614451a8e233b3e5bc49c834ab0ad08ee
diff --git a/rsProgram.cpp b/rsProgram.cpp
index 1c44e71..39b85e3 100644
--- a/rsProgram.cpp
+++ b/rsProgram.cpp
@@ -48,13 +48,14 @@
         if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
             mConstantCount++;
         }
-        if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_COUNT) {
-            mTextureCount = params[ct+1];
+        if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) {
+            mTextureCount++;
         }
     }
 
     mTextures = new ObjectBaseRef<Allocation>[mTextureCount];
     mSamplers = new ObjectBaseRef<Sampler>[mTextureCount];
+    mTextureTargets = new RsTextureTarget[mTextureCount];
     mInputElements = new ObjectBaseRef<Element>[mInputCount];
     mOutputElements = new ObjectBaseRef<Element>[mOutputCount];
     mConstantTypes = new ObjectBaseRef<Type>[mConstantCount];
@@ -63,6 +64,7 @@
     uint32_t input = 0;
     uint32_t output = 0;
     uint32_t constant = 0;
+    uint32_t texture = 0;
     for (uint32_t ct=0; ct < paramLength; ct+=2) {
         if (params[ct] == RS_PROGRAM_PARAM_INPUT) {
             mInputElements[input++].set(reinterpret_cast<Element *>(params[ct+1]));
@@ -73,6 +75,9 @@
         if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
             mConstantTypes[constant++].set(reinterpret_cast<Type *>(params[ct+1]));
         }
+        if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) {
+            mTextureTargets[texture++] = (RsTextureTarget)params[ct+1];
+        }
     }
     mIsInternal = false;
     uint32_t internalTokenLen = strlen(RS_SHADER_INTERNAL);
@@ -106,6 +111,7 @@
     }
     delete[] mTextures;
     delete[] mSamplers;
+    delete[] mTextureTargets;
     delete[] mInputElements;
     delete[] mOutputElements;
     delete[] mConstantTypes;
@@ -127,6 +133,7 @@
 
     mTextures = NULL;
     mSamplers = NULL;
+    mTextureTargets = NULL;
     mInputElements = NULL;
     mOutputElements = NULL;
     mConstantTypes = NULL;
@@ -176,6 +183,12 @@
         return;
     }
 
+    if (a && a->getType()->getDimFaces() && mTextureTargets[slot] != RS_TEXTURE_CUBE) {
+        LOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot);
+        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind cubemap to 2d texture slot");
+        return;
+    }
+
     //LOGE("bindtex %i %p", slot, a);
     mTextures[slot].set(a);
     mDirty = true;