diff options
Diffstat (limited to 'libs/rs/driver/rsdShaderCache.cpp')
| -rw-r--r-- | libs/rs/driver/rsdShaderCache.cpp | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/libs/rs/driver/rsdShaderCache.cpp b/libs/rs/driver/rsdShaderCache.cpp index 89d3c45..69b43fc 100644 --- a/libs/rs/driver/rsdShaderCache.cpp +++ b/libs/rs/driver/rsdShaderCache.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2011-2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,22 +108,17 @@ bool RsdShaderCache::link(const Context *rsc) { RsdShader *vtx = mVertex; RsdShader *frag = mFragment; - if (!vtx->getShaderID()) { - vtx->loadShader(rsc); - } - if (!frag->getShaderID()) { - frag->loadShader(rsc); - } + + uint32_t vID = vtx->getStateBasedShaderID(rsc); + uint32_t fID = frag->getStateBasedShaderID(rsc); // Don't try to cache if shaders failed to load - if (!vtx->getShaderID() || !frag->getShaderID()) { + if (!vID || !fID) { return false; } - //ALOGV("rsdShaderCache lookup vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID()); uint32_t entryCount = mEntries.size(); for (uint32_t ct = 0; ct < entryCount; ct ++) { - if ((mEntries[ct]->vtx == vtx->getShaderID()) && - (mEntries[ct]->frag == frag->getShaderID())) { + if ((mEntries[ct]->vtx == vID) && (mEntries[ct]->frag == fID)) { //ALOGV("SC using program %i", mEntries[ct]->program); glUseProgram(mEntries[ct]->program); @@ -134,21 +129,19 @@ bool RsdShaderCache::link(const Context *rsc) { } } - //ALOGV("RsdShaderCache miss"); - //ALOGE("e0 %x", glGetError()); ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(), vtx->getUniformCount(), frag->getUniformCount()); mEntries.push(e); mCurrent = e; - e->vtx = vtx->getShaderID(); - e->frag = frag->getShaderID(); + e->vtx = vID; + e->frag = fID; e->program = glCreateProgram(); if (e->program) { GLuint pgm = e->program; - glAttachShader(pgm, vtx->getShaderID()); + glAttachShader(pgm, vID); //ALOGE("e1 %x", glGetError()); - glAttachShader(pgm, frag->getShaderID()); + glAttachShader(pgm, fID); glBindAttribLocation(pgm, 0, "ATTRIB_position"); glBindAttribLocation(pgm, 1, "ATTRIB_color"); @@ -244,30 +237,38 @@ int32_t RsdShaderCache::vtxAttribSlot(const String8 &attrName) const { return -1; } -void RsdShaderCache::cleanupVertex(uint32_t id) { +void RsdShaderCache::cleanupVertex(RsdShader *s) { int32_t numEntries = (int32_t)mEntries.size(); - for (int32_t ct = 0; ct < numEntries; ct ++) { - if (mEntries[ct]->vtx == id) { - glDeleteProgram(mEntries[ct]->program); - - delete mEntries[ct]; - mEntries.removeAt(ct); - numEntries = (int32_t)mEntries.size(); - ct --; + uint32_t numShaderIDs = s->getStateBasedIDCount(); + for (uint32_t sId = 0; sId < numShaderIDs; sId ++) { + uint32_t id = s->getStateBasedID(sId); + for (int32_t ct = 0; ct < numEntries; ct ++) { + if (mEntries[ct]->vtx == id) { + glDeleteProgram(mEntries[ct]->program); + + delete mEntries[ct]; + mEntries.removeAt(ct); + numEntries = (int32_t)mEntries.size(); + ct --; + } } } } -void RsdShaderCache::cleanupFragment(uint32_t id) { +void RsdShaderCache::cleanupFragment(RsdShader *s) { int32_t numEntries = (int32_t)mEntries.size(); - for (int32_t ct = 0; ct < numEntries; ct ++) { - if (mEntries[ct]->frag == id) { - glDeleteProgram(mEntries[ct]->program); - - delete mEntries[ct]; - mEntries.removeAt(ct); - numEntries = (int32_t)mEntries.size(); - ct --; + uint32_t numShaderIDs = s->getStateBasedIDCount(); + for (uint32_t sId = 0; sId < numShaderIDs; sId ++) { + uint32_t id = s->getStateBasedID(sId); + for (int32_t ct = 0; ct < numEntries; ct ++) { + if (mEntries[ct]->frag == id) { + glDeleteProgram(mEntries[ct]->program); + + delete mEntries[ct]; + mEntries.removeAt(ct); + numEntries = (int32_t)mEntries.size(); + ct --; + } } } } |
