Program* ProgramCache::get(const ProgramDescription& description) { programid key = description.key(); ssize_t index = mCache.indexOfKey(key); Program* program = NULL; if (index < 0) { description.log("Could not find program"); program = generateProgram(description, key); mCache.add(key, program); } else { program = mCache.valueAt(index); } return program; }
Program* ProgramCache::get(const ProgramDescription& description) { programid key = description.key(); if (key == (PROGRAM_KEY_TEXTURE | PROGRAM_KEY_A8_TEXTURE)) { // program for A8, unmodulated, texture w/o shader (black text/path textures) is equivalent // to standard texture program (bitmaps, patches). Consider them equivalent. key = PROGRAM_KEY_TEXTURE; } ssize_t index = mCache.indexOfKey(key); Program* program = NULL; if (index < 0) { description.log("Could not find program"); program = generateProgram(description, key); mCache.add(key, program); } else { program = mCache.valueAt(index); } return program; }
void ProgramCache::useProgram(const Description& description) { // generate the key for the shader based on the description Key needs(computeKey(description)); // look-up the program in the cache Program* program = mCache.valueFor(needs); if (program == NULL) { // we didn't find our program, so generate one... nsecs_t time = -systemTime(); program = generateProgram(needs); mCache.add(needs, program); time += systemTime(); //ALOGD(">>> generated new program: needs=%08X, time=%u ms (%d programs)", // needs.mNeeds, uint32_t(ns2ms(time)), mCache.size()); } // here we have a suitable program for this description if (program->isValid()) { program->use(); program->setUniforms(description); } }