rsdShaderCache.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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++) { 46afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex 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 48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ui = 0; ui < uniListSize; ui ++) { 49afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex 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++) { 73afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex 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++) { 79afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex 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 86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag) { 87c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!vtx->getShaderID()) { 88cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams vtx->loadShader(rsc); 89c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 90c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!frag->getShaderID()) { 91cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams frag->loadShader(rsc); 92c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 93886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 94886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk // Don't try to cache if shaders failed to load 95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!vtx->getShaderID() || !frag->getShaderID()) { 96886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk return false; 97886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 98f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("ShaderCache lookup vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID()); 99889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk uint32_t entryCount = mEntries.size(); 100afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < entryCount; ct ++) { 101889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if ((mEntries[ct]->vtx == vtx->getShaderID()) && 102889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk (mEntries[ct]->frag == frag->getShaderID())) { 103889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 104889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk //LOGV("SC using program %i", mEntries[ct]->program); 105889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glUseProgram(mEntries[ct]->program); 106889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mCurrent = mEntries[ct]; 107f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("ShaderCache hit, using %i", ct); 108433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ShaderCache::lookup (hit)"); 109c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams return true; 110c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 111c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 112c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 113889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk //LOGV("ShaderCache miss"); 114f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGE("e0 %x", glGetError()); 11554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(), 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtx->getUniformCount(), 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk frag->getUniformCount()); 118889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.push(e); 119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mCurrent = e; 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->vtx = vtx->getShaderID(); 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->frag = frag->getShaderID(); 122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams e->program = glCreateProgram(); 123889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (e->program) { 124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLuint pgm = e->program; 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glAttachShader(pgm, vtx->getShaderID()); 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e1 %x", glGetError()); 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glAttachShader(pgm, frag->getShaderID()); 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 129433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (!vtx->isUserProgram()) { 13079f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 0, "ATTRIB_position"); 13179f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 1, "ATTRIB_color"); 13279f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams glBindAttribLocation(pgm, 2, "ATTRIB_normal"); 133479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams glBindAttribLocation(pgm, 3, "ATTRIB_texture0"); 134433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 135c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 136c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e2 %x", glGetError()); 137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glLinkProgram(pgm); 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("e3 %x", glGetError()); 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLint linkStatus = GL_FALSE; 140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus); 141c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (linkStatus != GL_TRUE) { 142c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams GLint bufLength = 0; 143c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramiv(pgm, GL_INFO_LOG_LENGTH, &bufLength); 144c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (bufLength) { 145c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams char* buf = (char*) malloc(bufLength); 146c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (buf) { 147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glGetProgramInfoLog(pgm, bufLength, NULL, buf); 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams LOGE("Could not link program:\n%s\n", buf); 149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams free(buf); 150c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glDeleteProgram(pgm); 153a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams rsc->setError(RS_ERROR_BAD_SHADER, "Error linking GL Programs"); 154a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams return false; 155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 156886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 157886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) { 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->vtxAttrs[ct].slot = glGetAttribLocation(pgm, vtx->getAttribName(ct)); 15954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->vtxAttrs[ct].name = vtx->getAttribName(ct).string(); 160886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk if (rsc->props.mLogShaders) { 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->vtxAttrs[ct].slot); 162cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 164886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk populateUniformData(vtx, pgm, e->vtxUniforms); 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk populateUniformData(frag, pgm, e->fragUniforms); 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only populate this list if we have arrays in our uniforms 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList = NULL; 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk GLint numUniforms = 0; 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bool hasArrays = hasArrayUniforms(vtx, frag); 172afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (hasArrays) { 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Get the number of active uniforms and the length of the longest name 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetProgramiv(pgm, GL_ACTIVE_UNIFORMS, &numUniforms); 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk GLint maxNameLength = 0; 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetProgramiv(pgm, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); 177afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numUniforms > 0 && maxNameLength > 0) { 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList = new UniformQueryData*[numUniforms]; 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Iterate over all the uniforms and build the list we 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // can later use to match our uniforms to 181afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList[ct] = new UniformQueryData(maxNameLength); 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk glGetActiveUniform(pgm, ct, maxNameLength, &uniformList[ct]->writtenLength, 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk &uniformList[ct]->arraySize, &uniformList[ct]->type, 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList[ct]->name); 18654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk //LOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct, 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // uniformList[ct]->arraySize, uniformList[ct]->name); 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 189cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 190c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 19154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // We now know the highest index of all of the array uniforms 19354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // and we need to update our cache to reflect that 19454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // we may have declared [n], but only m < n elements are used 19554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk updateUniformArrayData(rsc, vtx, pgm, e->vtxUniforms, "vtx", 19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList, (uint32_t)numUniforms); 19754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk updateUniformArrayData(rsc, frag, pgm, e->fragUniforms, "frag", 19854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList, (uint32_t)numUniforms); 19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 20054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Clean up the uniform data from GL 201afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (uniformList != NULL) { 202afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { 20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete uniformList[ct]; 204cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams } 20554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] uniformList; 20654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uniformList = NULL; 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 208c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 209c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 210f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams //LOGV("SC made program %i", e->program); 211c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glUseProgram(e->program); 212433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ShaderCache::lookup (miss)"); 213c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams return true; 214c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 215c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 216886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchoukint32_t ShaderCache::vtxAttribSlot(const String8 &attrName) const { 217886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) { 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (attrName == mCurrent->vtxAttrs[ct].name) { 21954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return mCurrent->vtxAttrs[ct].slot; 220886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 221886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 222886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk return -1; 223886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk} 224886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk 225afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ShaderCache::cleanupVertex(uint32_t id) { 226889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk int32_t numEntries = (int32_t)mEntries.size(); 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (int32_t ct = 0; ct < numEntries; ct ++) { 228889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (mEntries[ct]->vtx == id) { 229889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glDeleteProgram(mEntries[ct]->program); 230889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 23154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete mEntries[ct]; 232889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.removeAt(ct); 233889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk numEntries = (int32_t)mEntries.size(); 234889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk ct --; 235889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 236889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 237c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 238c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 239afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ShaderCache::cleanupFragment(uint32_t id) { 240889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk int32_t numEntries = (int32_t)mEntries.size(); 241afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (int32_t ct = 0; ct < numEntries; ct ++) { 242889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if (mEntries[ct]->frag == id) { 243889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk glDeleteProgram(mEntries[ct]->program); 244889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk 24554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete mEntries[ct]; 246889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mEntries.removeAt(ct); 247889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk numEntries = (int32_t)mEntries.size(); 248889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk ct --; 249889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 250889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 251c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 252c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 253afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ShaderCache::cleanupAll() { 254c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 255c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 256