Index: src/gpu/gl/GrGpuGL_program.cpp |
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp |
deleted file mode 100644 |
index 1a04341504d18081c4d1b4d7d81fc1f45c4ced4b..0000000000000000000000000000000000000000 |
--- a/src/gpu/gl/GrGpuGL_program.cpp |
+++ /dev/null |
@@ -1,198 +0,0 @@ |
-/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "GrGpuGL.h" |
- |
-#include "builders/GrGLProgramBuilder.h" |
-#include "GrProcessor.h" |
-#include "GrGLProcessor.h" |
-#include "GrGLPathRendering.h" |
-#include "GrOptDrawState.h" |
-#include "SkRTConf.h" |
-#include "SkTSearch.h" |
- |
-#ifdef PROGRAM_CACHE_STATS |
-SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, |
- "Display program cache usage."); |
-#endif |
- |
-typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
- |
-struct GrGLGpu::ProgramCache::Entry { |
- SK_DECLARE_INST_COUNT_ROOT(Entry); |
- Entry() : fProgram(NULL), fLRUStamp(0) {} |
- |
- SkAutoTUnref<GrGLProgram> fProgram; |
- unsigned int fLRUStamp; |
-}; |
- |
-struct GrGLGpu::ProgramCache::ProgDescLess { |
- bool operator() (const GrProgramDesc& desc, const Entry* entry) { |
- SkASSERT(entry->fProgram.get()); |
- return GrProgramDesc::Less(desc, entry->fProgram->getDesc()); |
- } |
- |
- bool operator() (const Entry* entry, const GrProgramDesc& desc) { |
- SkASSERT(entry->fProgram.get()); |
- return GrProgramDesc::Less(entry->fProgram->getDesc(), desc); |
- } |
-}; |
- |
-GrGLGpu::ProgramCache::ProgramCache(GrGLGpu* gpu) |
- : fCount(0) |
- , fCurrLRUStamp(0) |
- , fGpu(gpu) |
-#ifdef PROGRAM_CACHE_STATS |
- , fTotalRequests(0) |
- , fCacheMisses(0) |
- , fHashMisses(0) |
-#endif |
-{ |
- for (int i = 0; i < 1 << kHashBits; ++i) { |
- fHashTable[i] = NULL; |
- } |
-} |
- |
-GrGLGpu::ProgramCache::~ProgramCache() { |
- for (int i = 0; i < fCount; ++i){ |
- SkDELETE(fEntries[i]); |
- } |
- // dump stats |
-#ifdef PROGRAM_CACHE_STATS |
- if (c_DisplayCache) { |
- SkDebugf("--- Program Cache ---\n"); |
- SkDebugf("Total requests: %d\n", fTotalRequests); |
- SkDebugf("Cache misses: %d\n", fCacheMisses); |
- SkDebugf("Cache miss %%: %f\n", (fTotalRequests > 0) ? |
- 100.f * fCacheMisses / fTotalRequests : |
- 0.f); |
- int cacheHits = fTotalRequests - fCacheMisses; |
- SkDebugf("Hash miss %%: %f\n", (cacheHits > 0) ? 100.f * fHashMisses / cacheHits : 0.f); |
- SkDebugf("---------------------\n"); |
- } |
-#endif |
-} |
- |
-void GrGLGpu::ProgramCache::abandon() { |
- for (int i = 0; i < fCount; ++i) { |
- SkASSERT(fEntries[i]->fProgram.get()); |
- fEntries[i]->fProgram->abandon(); |
- SkDELETE(fEntries[i]); |
- } |
- fCount = 0; |
-} |
- |
-int GrGLGpu::ProgramCache::search(const GrProgramDesc& desc) const { |
- ProgDescLess less; |
- return SkTSearch(fEntries, fCount, desc, sizeof(Entry*), less); |
-} |
- |
-GrGLProgram* GrGLGpu::ProgramCache::getProgram(const GrOptDrawState& optState) { |
-#ifdef PROGRAM_CACHE_STATS |
- ++fTotalRequests; |
-#endif |
- |
- Entry* entry = NULL; |
- |
- uint32_t hashIdx = optState.programDesc().getChecksum(); |
- hashIdx ^= hashIdx >> 16; |
- if (kHashBits <= 8) { |
- hashIdx ^= hashIdx >> 8; |
- } |
- hashIdx &=((1 << kHashBits) - 1); |
- Entry* hashedEntry = fHashTable[hashIdx]; |
- if (hashedEntry && hashedEntry->fProgram->getDesc() == optState.programDesc()) { |
- SkASSERT(hashedEntry->fProgram); |
- entry = hashedEntry; |
- } |
- |
- int entryIdx; |
- if (NULL == entry) { |
- entryIdx = this->search(optState.programDesc()); |
- if (entryIdx >= 0) { |
- entry = fEntries[entryIdx]; |
-#ifdef PROGRAM_CACHE_STATS |
- ++fHashMisses; |
-#endif |
- } |
- } |
- |
- if (NULL == entry) { |
- // We have a cache miss |
-#ifdef PROGRAM_CACHE_STATS |
- ++fCacheMisses; |
-#endif |
- GrGLProgram* program = GrGLProgramBuilder::CreateProgram(optState, fGpu); |
- if (NULL == program) { |
- return NULL; |
- } |
- int purgeIdx = 0; |
- if (fCount < kMaxEntries) { |
- entry = SkNEW(Entry); |
- purgeIdx = fCount++; |
- fEntries[purgeIdx] = entry; |
- } else { |
- SkASSERT(fCount == kMaxEntries); |
- purgeIdx = 0; |
- for (int i = 1; i < kMaxEntries; ++i) { |
- if (fEntries[i]->fLRUStamp < fEntries[purgeIdx]->fLRUStamp) { |
- purgeIdx = i; |
- } |
- } |
- entry = fEntries[purgeIdx]; |
- int purgedHashIdx = entry->fProgram->getDesc().getChecksum() & ((1 << kHashBits) - 1); |
- if (fHashTable[purgedHashIdx] == entry) { |
- fHashTable[purgedHashIdx] = NULL; |
- } |
- } |
- SkASSERT(fEntries[purgeIdx] == entry); |
- entry->fProgram.reset(program); |
- // We need to shift fEntries around so that the entry currently at purgeIdx is placed |
- // just before the entry at ~entryIdx (in order to keep fEntries sorted by descriptor). |
- entryIdx = ~entryIdx; |
- if (entryIdx < purgeIdx) { |
- // Let E and P be the entries at index entryIdx and purgeIdx, respectively. |
- // If the entries array looks like this: |
- // aaaaEbbbbbPccccc |
- // we rearrange it to look like this: |
- // aaaaPEbbbbbccccc |
- size_t copySize = (purgeIdx - entryIdx) * sizeof(Entry*); |
- memmove(fEntries + entryIdx + 1, fEntries + entryIdx, copySize); |
- fEntries[entryIdx] = entry; |
- } else if (purgeIdx < entryIdx) { |
- // If the entries array looks like this: |
- // aaaaPbbbbbEccccc |
- // we rearrange it to look like this: |
- // aaaabbbbbPEccccc |
- size_t copySize = (entryIdx - purgeIdx - 1) * sizeof(Entry*); |
- memmove(fEntries + purgeIdx, fEntries + purgeIdx + 1, copySize); |
- fEntries[entryIdx - 1] = entry; |
- } |
-#ifdef SK_DEBUG |
- SkASSERT(fEntries[0]->fProgram.get()); |
- for (int i = 0; i < fCount - 1; ++i) { |
- SkASSERT(fEntries[i + 1]->fProgram.get()); |
- const GrProgramDesc& a = fEntries[i]->fProgram->getDesc(); |
- const GrProgramDesc& b = fEntries[i + 1]->fProgram->getDesc(); |
- SkASSERT(GrProgramDesc::Less(a, b)); |
- SkASSERT(!GrProgramDesc::Less(b, a)); |
- } |
-#endif |
- } |
- |
- fHashTable[hashIdx] = entry; |
- entry->fLRUStamp = fCurrLRUStamp; |
- |
- if (SK_MaxU32 == fCurrLRUStamp) { |
- // wrap around! just trash our LRU, one time hit. |
- for (int i = 0; i < fCount; ++i) { |
- fEntries[i]->fLRUStamp = 0; |
- } |
- } |
- ++fCurrLRUStamp; |
- return entry->fProgram; |
-} |