Move GrGpuGL::ProgramCache declaration to header

Review URL: http://codereview.appspot.com/6245083/



git-svn-id: http://skia.googlecode.com/svn/trunk@4113 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index 2448fa4..b8fcb1b 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -10,7 +10,6 @@
 #include "effects/GrConvolutionEffect.h"
 #include "effects/GrMorphologyEffect.h"
 
-#include "GrBinHashKey.h"
 #include "GrCustomStage.h"
 #include "GrGLProgramStage.h"
 #include "GrGLSL.h"
@@ -23,109 +22,76 @@
 #define SKIP_CACHE_CHECK    true
 #define GR_UINT32_MAX   static_cast<uint32_t>(-1)
 
-#include "../GrTHashCache.h"
+void GrGpuGL::ProgramCache::Entry::copyAndTakeOwnership(Entry& entry) {
+    fProgramData.copyAndTakeOwnership(entry.fProgramData);
+    fKey = entry.fKey; // ownership transfer
+    fLRUStamp = entry.fLRUStamp;
+}
 
-class GrGpuGL::ProgramCache : public ::GrNoncopyable {
-private:
-    class Entry;
+GrGpuGL::ProgramCache::ProgramCache(const GrGLContextInfo& gl)
+    : fCount(0)
+    , fCurrLRUStamp(0)
+    , fGL(gl) {
+}
 
-    typedef GrBinHashKey<Entry, GrGLProgram::kProgramKeySize> ProgramHashKey;
-
-    class Entry : public ::GrNoncopyable {
-    public:
-        Entry() {}
-        void copyAndTakeOwnership(Entry& entry) {
-            fProgramData.copyAndTakeOwnership(entry.fProgramData);
-            fKey = entry.fKey; // ownership transfer
-            fLRUStamp = entry.fLRUStamp;
-        }
-
-    public:
-        int compare(const ProgramHashKey& key) const { return fKey.compare(key); }
-
-    public:
-        GrGLProgram::CachedData fProgramData;
-        ProgramHashKey          fKey;
-        unsigned int            fLRUStamp;
-    };
-
-    GrTHashTable<Entry, ProgramHashKey, 8> fHashCache;
-
-    // We may have kMaxEntries+1 shaders in the GL context because
-    // we create a new shader before evicting from the cache.
-    enum {
-        kMaxEntries = 32
-    };
-    Entry                       fEntries[kMaxEntries];
-    int                         fCount;
-    unsigned int                fCurrLRUStamp;
-    const GrGLContextInfo&      fGL;
-
-public:
-    ProgramCache(const GrGLContextInfo& gl)
-        : fCount(0)
-        , fCurrLRUStamp(0)
-        , fGL(gl) {
+GrGpuGL::ProgramCache::~ProgramCache() {
+    for (int i = 0; i < fCount; ++i) {
+        GrGpuGL::DeleteProgram(fGL.interface(),
+                                        &fEntries[i].fProgramData);
     }
+}
 
-    ~ProgramCache() {
-        for (int i = 0; i < fCount; ++i) {
-            GrGpuGL::DeleteProgram(fGL.interface(),
-                                          &fEntries[i].fProgramData);
-        }
+void GrGpuGL::ProgramCache::abandon() {
+    fCount = 0;
+}
+
+void GrGpuGL::ProgramCache::invalidateViewMatrices() {
+    for (int i = 0; i < fCount; ++i) {
+        // set to illegal matrix
+        fEntries[i].fProgramData.fViewMatrix = GrMatrix::InvalidMatrix();
     }
+}
 
-    void abandon() {
-        fCount = 0;
-    }
-
-    void invalidateViewMatrices() {
-        for (int i = 0; i < fCount; ++i) {
-            // set to illegal matrix
-            fEntries[i].fProgramData.fViewMatrix = GrMatrix::InvalidMatrix();
-        }
-    }
-
-    GrGLProgram::CachedData* getProgramData(const GrGLProgram& desc,
-                                            GrCustomStage** stages) {
-        Entry newEntry;
-        newEntry.fKey.setKeyData(desc.keyData());
+GrGLProgram::CachedData* GrGpuGL::ProgramCache::getProgramData(
+                                        const GrGLProgram& desc,
+                                        GrCustomStage** stages) {
+    Entry newEntry;
+    newEntry.fKey.setKeyData(desc.keyData());
         
-        Entry* entry = fHashCache.find(newEntry.fKey);
-        if (NULL == entry) {
-            if (!desc.genProgram(fGL, stages, &newEntry.fProgramData)) {
-                return NULL;
-            }
-            if (fCount < kMaxEntries) {
-                entry = fEntries + fCount;
-                ++fCount;
-            } else {
-                GrAssert(kMaxEntries == fCount);
-                entry = fEntries;
-                for (int i = 1; i < kMaxEntries; ++i) {
-                    if (fEntries[i].fLRUStamp < entry->fLRUStamp) {
-                        entry = fEntries + i;
-                    }
+    Entry* entry = fHashCache.find(newEntry.fKey);
+    if (NULL == entry) {
+        if (!desc.genProgram(fGL, stages, &newEntry.fProgramData)) {
+            return NULL;
+        }
+        if (fCount < kMaxEntries) {
+            entry = fEntries + fCount;
+            ++fCount;
+        } else {
+            GrAssert(kMaxEntries == fCount);
+            entry = fEntries;
+            for (int i = 1; i < kMaxEntries; ++i) {
+                if (fEntries[i].fLRUStamp < entry->fLRUStamp) {
+                    entry = fEntries + i;
                 }
-                fHashCache.remove(entry->fKey, entry);
-                GrGpuGL::DeleteProgram(fGL.interface(),
-                                              &entry->fProgramData);
             }
-            entry->copyAndTakeOwnership(newEntry);
-            fHashCache.insert(entry->fKey, entry);
+            fHashCache.remove(entry->fKey, entry);
+            GrGpuGL::DeleteProgram(fGL.interface(),
+                                            &entry->fProgramData);
         }
-
-        entry->fLRUStamp = fCurrLRUStamp;
-        if (GR_UINT32_MAX == fCurrLRUStamp) {
-            // wrap around! just trash our LRU, one time hit.
-            for (int i = 0; i < fCount; ++i) {
-                fEntries[i].fLRUStamp = 0;
-            }
-        }
-        ++fCurrLRUStamp;
-        return &entry->fProgramData;
+        entry->copyAndTakeOwnership(newEntry);
+        fHashCache.insert(entry->fKey, entry);
     }
-};
+
+    entry->fLRUStamp = fCurrLRUStamp;
+    if (GR_UINT32_MAX == fCurrLRUStamp) {
+        // wrap around! just trash our LRU, one time hit.
+        for (int i = 0; i < fCount; ++i) {
+            fEntries[i].fLRUStamp = 0;
+        }
+    }
+    ++fCurrLRUStamp;
+    return &entry->fProgramData;
+}
 
 void GrGpuGL::DeleteProgram(const GrGLInterface* gl,
                                    CachedData* programData) {
@@ -140,17 +106,6 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-void GrGpuGL::createProgramCache() {
-    fProgramData = NULL;
-    fProgramCache = new ProgramCache(this->glContextInfo());
-}
-
-void GrGpuGL::deleteProgramCache() {
-    delete fProgramCache;
-    fProgramCache = NULL;
-    fProgramData = NULL;
-}
-
 void GrGpuGL::abandonResources(){
     INHERITED::abandonResources();
     fProgramCache->abandon();