rsdShaderCache.cpp revision 54929cce0bf44090424b1f91b676529a2422378f
1c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/* 2c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Copyright (C) 2009 The Android Open Source Project 3c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 4c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * you may not use this file except in compliance with the License. 6c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * You may obtain a copy of the License at 7c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 8c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 10c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Unless required by applicable law or agreed to in writing, software 11c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * See the License for the specific language governing permissions and 14c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * limitations under the License. 15c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */ 16c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include "rsContext.h" 19c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES/gl.h> 20c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h> 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST 25c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 26c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android; 27c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android::renderscript; 28c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 29c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 3054929cce0bf44090424b1f91b676529a2422378fAlex SakhartchoukShaderCache::ShaderCache() { 31889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.setCapacity(16); 32c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 33c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 3454929cce0bf44090424b1f91b676529a2422378fAlex SakhartchoukShaderCache::~ShaderCache() { 35889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk for (uint32_t ct=0; ct < mEntries.size(); ct++) { 36889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glDeleteProgram(mEntries[ct]->program); 37889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk free(mEntries[ct]); 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 40c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 4154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid ShaderCache::updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID, 4254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *data, const char* logTag, 4354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList, uint32_t uniListSize) { 4454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 4554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) { 4654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(data[ct].slot >= 0 && data[ct].arraySize > 1) { 4754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk //Iterate over the list of active GL uniforms and find highest array index 4854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for(uint32_t ui = 0; ui < uniListSize; ui ++) { 4954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(prog->getUniformName(ct) == uniformList[ui]->name) { 5054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk data[ct].arraySize = (uint32_t)uniformList[ui]->arraySize; 5154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk break; 5254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 5354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 5454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 5554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 5654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (rsc->props.mLogShaders) { 5754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGV("%s U, %s = %d, arraySize = %d\n", logTag, 5854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk prog->getUniformName(ct).string(), data[ct].slot, data[ct].arraySize); 5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 6354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid ShaderCache::populateUniformData(Program *prog, uint32_t linkedID, UniformData *data) { 6454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) { 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk data[ct].slot = glGetUniformLocation(linkedID, prog->getUniformName(ct)); 6654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk data[ct].arraySize = prog->getUniformArraySize(ct); 6754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 6954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 7054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukbool ShaderCache::hasArrayUniforms(ProgramVertex *vtx, ProgramFragment *frag) { 7154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *data = mCurrent->vtxUniforms; 7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) { 7354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(data[ct].slot >= 0 && data[ct].arraySize > 1) { 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk data = mCurrent->fragUniforms; 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < frag->getUniformCount(); ct++) { 7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(data[ct].slot >= 0 && data[ct].arraySize > 1) { 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 8454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 8554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 86cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsbool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag) 87c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 88c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!vtx->getShaderID()) { 89cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams vtx->loadShader(rsc); 90c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 91c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!frag->getShaderID()) { 92cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams frag->loadShader(rsc); 93c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 94886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 95886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk // Don't try to cache if shaders failed to load 96886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk if(!vtx->getShaderID() || !frag->getShaderID()) { 97886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk return false; 98886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 99f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("ShaderCache lookup vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID()); 100889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk uint32_t entryCount = mEntries.size(); 101889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk for(uint32_t ct = 0; ct < entryCount; ct ++) { 102889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if ((mEntries[ct]->vtx == vtx->getShaderID()) && 103889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk (mEntries[ct]->frag == frag->getShaderID())) { 104889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 105889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk //LOGV("SC using program %i", mEntries[ct]->program); 106889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glUseProgram(mEntries[ct]->program); 107889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mCurrent = mEntries[ct]; 108f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("ShaderCache hit, using %i", ct); 109433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ShaderCache::lookup (hit)"); 110c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams return true; 111c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 112c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 113c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 114889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk //LOGV("ShaderCache miss"); 115f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGE("e0 %x", glGetError()); 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(), 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtx->getUniformCount(), 11854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk frag->getUniformCount()); 119889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.push(e); 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mCurrent = e; 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->vtx = vtx->getShaderID(); 122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->frag = frag->getShaderID(); 123c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->program = glCreateProgram(); 124889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (e->program) { 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLuint pgm = e->program; 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glAttachShader(pgm, vtx->getShaderID()); 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e1 %x", glGetError()); 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glAttachShader(pgm, frag->getShaderID()); 129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 130433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (!vtx->isUserProgram()) { 13179f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 0, "ATTRIB_position"); 13279f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 1, "ATTRIB_color"); 13379f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 2, "ATTRIB_normal"); 134479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams glBindAttribLocation(pgm, 3, "ATTRIB_texture0"); 135433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 136c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e2 %x", glGetError()); 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glLinkProgram(pgm); 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e3 %x", glGetError()); 140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLint linkStatus = GL_FALSE; 141c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus); 142c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (linkStatus != GL_TRUE) { 143c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLint bufLength = 0; 144c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramiv(pgm, GL_INFO_LOG_LENGTH, &bufLength); 145c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (bufLength) { 146c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams char* buf = (char*) malloc(bufLength); 147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (buf) { 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramInfoLog(pgm, bufLength, NULL, buf); 149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams LOGE("Could not link program:\n%s\n", buf); 150c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams free(buf); 151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 153c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glDeleteProgram(pgm); 154a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams rsc->setError(RS_ERROR_BAD_SHADER, "Error linking GL Programs"); 155a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams return false; 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 157886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 158886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) { 15954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->vtxAttrs[ct].slot = glGetAttribLocation(pgm, vtx->getAttribName(ct)); 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->vtxAttrs[ct].name = vtx->getAttribName(ct).string(); 161886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk if (rsc->props.mLogShaders) { 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->vtxAttrs[ct].slot); 163cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 165886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk populateUniformData(vtx, pgm, e->vtxUniforms); 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk populateUniformData(frag, pgm, e->fragUniforms); 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only populate this list if we have arrays in our uniforms 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList = NULL; 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk GLint numUniforms = 0; 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bool hasArrays = hasArrayUniforms(vtx, frag); 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(hasArrays) { 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Get the number of active uniforms and the length of the longest name 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetProgramiv(pgm, GL_ACTIVE_UNIFORMS, &numUniforms); 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk GLint maxNameLength = 0; 17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetProgramiv(pgm, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(numUniforms > 0 && maxNameLength > 0) { 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList = new UniformQueryData*[numUniforms]; 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Iterate over all the uniforms and build the list we 18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // can later use to match our uniforms to 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for(uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList[ct] = new UniformQueryData(maxNameLength); 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetActiveUniform(pgm, ct, maxNameLength, &uniformList[ct]->writtenLength, 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk &uniformList[ct]->arraySize, &uniformList[ct]->type, 18654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList[ct]->name); 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk //LOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct, 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // uniformList[ct]->arraySize, uniformList[ct]->name); 18954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 190cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 191c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 19254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // We now know the highest index of all of the array uniforms 19454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // and we need to update our cache to reflect that 19554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // we may have declared [n], but only m < n elements are used 19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk updateUniformArrayData(rsc, vtx, pgm, e->vtxUniforms, "vtx", 19754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList, (uint32_t)numUniforms); 19854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk updateUniformArrayData(rsc, frag, pgm, e->fragUniforms, "frag", 19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList, (uint32_t)numUniforms); 20054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 20154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Clean up the uniform data from GL 20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(uniformList != NULL) { 20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for(uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { 20454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete uniformList[ct]; 205cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 20654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] uniformList; 20754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList = NULL; 208c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 209c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 210c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 211f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("SC made program %i", e->program); 212c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glUseProgram(e->program); 213433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ShaderCache::lookup (miss)"); 214c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams return true; 215c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 216c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 217886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchoukint32_t ShaderCache::vtxAttribSlot(const String8 &attrName) const { 218886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) { 21954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(attrName == mCurrent->vtxAttrs[ct].name) { 22054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return mCurrent->vtxAttrs[ct].slot; 221886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 222886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 223886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk return -1; 224886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk} 225886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 226c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ShaderCache::cleanupVertex(uint32_t id) 227c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 228889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk int32_t numEntries = (int32_t)mEntries.size(); 229889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk for(int32_t ct = 0; ct < numEntries; ct ++) { 230889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (mEntries[ct]->vtx == id) { 231889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glDeleteProgram(mEntries[ct]->program); 232889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 23354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete mEntries[ct]; 234889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.removeAt(ct); 235889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk numEntries = (int32_t)mEntries.size(); 236889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk ct --; 237889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 238889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 239c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 240c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 241c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ShaderCache::cleanupFragment(uint32_t id) 242c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 243889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk int32_t numEntries = (int32_t)mEntries.size(); 244889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk for(int32_t ct = 0; ct < numEntries; ct ++) { 245889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (mEntries[ct]->frag == id) { 246889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glDeleteProgram(mEntries[ct]->program); 247889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 24854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete mEntries[ct]; 249889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.removeAt(ct); 250889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk numEntries = (int32_t)mEntries.size(); 251889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk ct --; 252889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 253889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 254c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 255c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 256c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ShaderCache::cleanupAll() 257c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 258c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 259c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 260