Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(275)

Unified Diff: src/gpu/GrMemoryPool.cpp

Issue 1055843002: Adding a cache + memory pool for GPU TextBlobs (Closed) Base URL: https://skia.googlesource.com/skia.git@atlastext2
Patch Set: feedback inc Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrMemoryPool.h ('k') | src/gpu/GrTextBlobCache.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrMemoryPool.cpp
diff --git a/src/gpu/GrMemoryPool.cpp b/src/gpu/GrMemoryPool.cpp
index 5009f20152d5d7813956d4539f7e86c21adc7a48..e59ed83d275866c58d81dafd1d7c12cd5534ab53 100644
--- a/src/gpu/GrMemoryPool.cpp
+++ b/src/gpu/GrMemoryPool.cpp
@@ -15,11 +15,13 @@
GrMemoryPool::GrMemoryPool(size_t preallocSize, size_t minAllocSize) {
SkDEBUGCODE(fAllocationCnt = 0);
+ SkDEBUGCODE(fAllocBlockCnt = 0);
minAllocSize = SkTMax<size_t>(minAllocSize, 1 << 10);
fMinAllocSize = GrSizeAlignUp(minAllocSize + kPerAllocPad, kAlignment),
fPreallocSize = GrSizeAlignUp(preallocSize + kPerAllocPad, kAlignment);
fPreallocSize = SkTMax(fPreallocSize, fMinAllocSize);
+ fSize = fPreallocSize;
fHead = CreateBlock(fPreallocSize);
fTail = fHead;
@@ -50,6 +52,8 @@ void* GrMemoryPool::allocate(size_t size) {
SkASSERT(NULL == fTail->fNext);
fTail->fNext = block;
fTail = block;
+ fSize += block->fSize;
+ SkDEBUGCODE(++fAllocBlockCnt);
}
SkASSERT(fTail->fFreeSize >= size);
intptr_t ptr = fTail->fCurrPtr;
@@ -61,6 +65,7 @@ void* GrMemoryPool::allocate(size_t size) {
fTail->fCurrPtr += size;
fTail->fFreeSize -= size;
fTail->fLiveCount += 1;
+
SkDEBUGCODE(++fAllocationCnt);
VALIDATE;
return reinterpret_cast<void*>(ptr);
@@ -73,8 +78,7 @@ void GrMemoryPool::release(void* p) {
if (1 == block->fLiveCount) {
// the head block is special, it is reset rather than deleted
if (fHead == block) {
- fHead->fCurrPtr = reinterpret_cast<intptr_t>(fHead) +
- kHeaderSize;
+ fHead->fCurrPtr = reinterpret_cast<intptr_t>(fHead) + kHeaderSize;
fHead->fLiveCount = 0;
fHead->fFreeSize = fPreallocSize;
} else {
@@ -88,7 +92,9 @@ void GrMemoryPool::release(void* p) {
SkASSERT(fTail == block);
fTail = prev;
}
+ fSize -= block->fSize;
DeleteBlock(block);
+ SkDEBUGCODE(fAllocBlockCnt--);
}
} else {
--block->fLiveCount;
@@ -103,14 +109,16 @@ void GrMemoryPool::release(void* p) {
}
GrMemoryPool::BlockHeader* GrMemoryPool::CreateBlock(size_t size) {
+ size_t paddedSize = size + kHeaderSize;
BlockHeader* block =
- reinterpret_cast<BlockHeader*>(sk_malloc_throw(size + kHeaderSize));
+ reinterpret_cast<BlockHeader*>(sk_malloc_throw(paddedSize));
// we assume malloc gives us aligned memory
SkASSERT(!(reinterpret_cast<intptr_t>(block) % kAlignment));
block->fLiveCount = 0;
block->fFreeSize = size;
block->fCurrPtr = reinterpret_cast<intptr_t>(block) + kHeaderSize;
block->fPrevPtr = 0; // gcc warns on assigning NULL to an intptr_t.
+ block->fSize = paddedSize;
return block;
}
@@ -157,5 +165,6 @@ void GrMemoryPool::validate() {
} while ((block = block->fNext));
SkASSERT(allocCount == fAllocationCnt);
SkASSERT(prev == fTail);
+ SkASSERT(fAllocBlockCnt != 0 || fSize == fPreallocSize);
#endif
}
« no previous file with comments | « src/gpu/GrMemoryPool.h ('k') | src/gpu/GrTextBlobCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698