Index: src/gpu/GrBufferAllocPool.cpp |
diff --git a/src/gpu/GrBufferAllocPool.cpp b/src/gpu/GrBufferAllocPool.cpp |
index 03d43c9b9328cdbbf9514197f2b3fd7f111035f4..a197a6719f199a051c76ecc66a6b3f903b8e18bb 100644 |
--- a/src/gpu/GrBufferAllocPool.cpp |
+++ b/src/gpu/GrBufferAllocPool.cpp |
@@ -14,6 +14,8 @@ |
#include "GrTypes.h" |
#include "GrVertexBuffer.h" |
+#include "SkTraceEvent.h" |
+ |
#ifdef SK_DEBUG |
#define VALIDATE validate |
#else |
@@ -23,6 +25,16 @@ |
// page size |
#define GrBufferAllocPool_MIN_BLOCK_SIZE ((size_t)1 << 12) |
+#define UNMAP_BUFFER(block) \ |
+do { \ |
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), \ |
+ "GrBufferAllocPool Unmapping Buffer", \ |
+ TRACE_EVENT_SCOPE_THREAD, \ |
+ "percent_unwritten", \ |
+ (float)((block).fBytesFree) / (block).fBuffer->gpuMemorySize()); \ |
+ (block).fBuffer->unmap(); \ |
+} while (false) |
+ |
GrBufferAllocPool::GrBufferAllocPool(GrGpu* gpu, |
BufferType bufferType, |
bool frequentResetHint, |
@@ -57,7 +69,7 @@ GrBufferAllocPool::~GrBufferAllocPool() { |
if (fBlocks.count()) { |
GrGeometryBuffer* buffer = fBlocks.back().fBuffer; |
if (buffer->isMapped()) { |
- buffer->unmap(); |
+ UNMAP_BUFFER(fBlocks.back()); |
} |
} |
while (!fBlocks.empty()) { |
@@ -80,7 +92,7 @@ void GrBufferAllocPool::reset() { |
if (fBlocks.count()) { |
GrGeometryBuffer* buffer = fBlocks.back().fBuffer; |
if (buffer->isMapped()) { |
- buffer->unmap(); |
+ UNMAP_BUFFER(fBlocks.back()); |
} |
} |
// fPreallocBuffersInUse will be decremented down to zero in the while loop |
@@ -107,10 +119,10 @@ void GrBufferAllocPool::unmap() { |
if (NULL != fBufferPtr) { |
BufferBlock& block = fBlocks.back(); |
if (block.fBuffer->isMapped()) { |
- block.fBuffer->unmap(); |
+ UNMAP_BUFFER(block); |
} else { |
size_t flushSize = block.fBuffer->gpuMemorySize() - block.fBytesFree; |
- this->flushCpuData(fBlocks.back().fBuffer, flushSize); |
+ this->flushCpuData(fBlocks.back(), flushSize); |
} |
fBufferPtr = NULL; |
} |
@@ -238,7 +250,7 @@ void GrBufferAllocPool::putBack(size_t bytes) { |
// if we locked a vb to satisfy the make space and we're releasing |
// beyond it, then unmap it. |
if (block.fBuffer->isMapped()) { |
- block.fBuffer->unmap(); |
+ UNMAP_BUFFER(block); |
} |
this->destroyBlock(); |
} else { |
@@ -287,10 +299,9 @@ bool GrBufferAllocPool::createBlock(size_t requestSize) { |
SkASSERT(fBlocks.count() > 1); |
BufferBlock& prev = fBlocks.fromBack(1); |
if (prev.fBuffer->isMapped()) { |
- prev.fBuffer->unmap(); |
+ UNMAP_BUFFER(prev); |
} else { |
- flushCpuData(prev.fBuffer, |
- prev.fBuffer->gpuMemorySize() - prev.fBytesFree); |
+ this->flushCpuData(prev, prev.fBuffer->gpuMemorySize() - prev.fBytesFree); |
} |
fBufferPtr = NULL; |
} |
@@ -343,8 +354,8 @@ void GrBufferAllocPool::destroyBlock() { |
fBufferPtr = NULL; |
} |
-void GrBufferAllocPool::flushCpuData(GrGeometryBuffer* buffer, |
- size_t flushSize) { |
+void GrBufferAllocPool::flushCpuData(const BufferBlock& block, size_t flushSize) { |
+ GrGeometryBuffer* buffer = block.fBuffer; |
SkASSERT(NULL != buffer); |
SkASSERT(!buffer->isMapped()); |
SkASSERT(fCpuData.get() == fBufferPtr); |
@@ -356,7 +367,7 @@ void GrBufferAllocPool::flushCpuData(GrGeometryBuffer* buffer, |
void* data = buffer->map(); |
if (NULL != data) { |
memcpy(data, fBufferPtr, flushSize); |
- buffer->unmap(); |
+ UNMAP_BUFFER(block); |
return; |
} |
} |