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;