Index: src/gpu/GrMemoryPool.cpp |
diff --git a/src/gpu/GrMemoryPool.cpp b/src/gpu/GrMemoryPool.cpp |
index 6bc0f54602f68eaea4f99475f28a3e7988679fc8..c95b59fc8c878d9546dd81f33dfaeb3558f741d9 100644 |
--- a/src/gpu/GrMemoryPool.cpp |
+++ b/src/gpu/GrMemoryPool.cpp |
@@ -13,17 +13,19 @@ |
#define VALIDATE |
#endif |
+constexpr size_t GrMemoryPool::kSmallestMinAllocSize; |
+ |
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); |
+ minAllocSize = SkTMax<size_t>(GrSizeAlignUp(minAllocSize, kAlignment), kSmallestMinAllocSize); |
+ preallocSize = SkTMax<size_t>(GrSizeAlignUp(preallocSize, kAlignment), minAllocSize); |
+ |
+ fMinAllocSize = minAllocSize; |
fSize = 0; |
- fHead = CreateBlock(fPreallocSize); |
+ fHead = CreateBlock(preallocSize); |
fTail = fHead; |
fHead->fNext = nullptr; |
fHead->fPrev = nullptr; |
@@ -43,7 +45,7 @@ void* GrMemoryPool::allocate(size_t size) { |
size += kPerAllocPad; |
size = GrSizeAlignUp(size, kAlignment); |
if (fTail->fFreeSize < size) { |
- size_t blockSize = size; |
+ size_t blockSize = size + kHeaderSize; |
blockSize = SkTMax<size_t>(blockSize, fMinAllocSize); |
BlockHeader* block = CreateBlock(blockSize); |
@@ -87,7 +89,7 @@ void GrMemoryPool::release(void* p) { |
if (fHead == block) { |
fHead->fCurrPtr = reinterpret_cast<intptr_t>(fHead) + kHeaderSize; |
fHead->fLiveCount = 0; |
- fHead->fFreeSize = fPreallocSize; |
+ fHead->fFreeSize = fHead->fSize - kHeaderSize; |
} else { |
BlockHeader* prev = block->fPrev; |
BlockHeader* next = block->fNext; |
@@ -115,18 +117,18 @@ void GrMemoryPool::release(void* p) { |
VALIDATE; |
} |
-GrMemoryPool::BlockHeader* GrMemoryPool::CreateBlock(size_t size) { |
- size_t paddedSize = size + kHeaderSize; |
+GrMemoryPool::BlockHeader* GrMemoryPool::CreateBlock(size_t blockSize) { |
+ blockSize = SkTMax<size_t>(blockSize, kHeaderSize); |
BlockHeader* block = |
- reinterpret_cast<BlockHeader*>(sk_malloc_throw(paddedSize)); |
+ reinterpret_cast<BlockHeader*>(sk_malloc_throw(blockSize)); |
// we assume malloc gives us aligned memory |
SkASSERT(!(reinterpret_cast<intptr_t>(block) % kAlignment)); |
SkDEBUGCODE(block->fBlockSentinal = kAssignedMarker); |
block->fLiveCount = 0; |
- block->fFreeSize = size; |
+ block->fFreeSize = blockSize - kHeaderSize; |
block->fCurrPtr = reinterpret_cast<intptr_t>(block) + kHeaderSize; |
block->fPrevPtr = 0; // gcc warns on assigning nullptr to an intptr_t. |
- block->fSize = paddedSize; |
+ block->fSize = blockSize; |
return block; |
} |
@@ -153,18 +155,16 @@ void GrMemoryPool::validate() { |
intptr_t b = reinterpret_cast<intptr_t>(block); |
size_t ptrOffset = block->fCurrPtr - b; |
size_t totalSize = ptrOffset + block->fFreeSize; |
- size_t userSize = totalSize - kHeaderSize; |
intptr_t userStart = b + kHeaderSize; |
SkASSERT(!(b % kAlignment)); |
SkASSERT(!(totalSize % kAlignment)); |
- SkASSERT(!(userSize % kAlignment)); |
SkASSERT(!(block->fCurrPtr % kAlignment)); |
if (fHead != block) { |
SkASSERT(block->fLiveCount); |
- SkASSERT(userSize >= fMinAllocSize); |
+ SkASSERT(totalSize >= fMinAllocSize); |
} else { |
- SkASSERT(userSize == fPreallocSize); |
+ SkASSERT(totalSize == block->fSize); |
} |
if (!block->fLiveCount) { |
SkASSERT(ptrOffset == kHeaderSize); |