Add trace event when GrBufferAllocPool unmaps a buffer indicating what % of the buffe...
authorbsalomon <bsalomon@google.com>
Thu, 26 Jun 2014 19:56:22 +0000 (12:56 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 26 Jun 2014 19:56:22 +0000 (12:56 -0700)
R=egdaniel@google.com
TBR=egdaniel@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/339433009

src/gpu/GrBufferAllocPool.cpp
src/gpu/GrBufferAllocPool.h

index 03d43c9..a197a67 100644 (file)
@@ -14,6 +14,8 @@
 #include "GrTypes.h"
 #include "GrVertexBuffer.h"
 
+#include "SkTraceEvent.h"
+
 #ifdef SK_DEBUG
     #define VALIDATE validate
 #else
 // 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;
         }
     }
index 291d781..e3d3982 100644 (file)
@@ -155,7 +155,7 @@ private:
 
     bool createBlock(size_t requestSize);
     void destroyBlock();
-    void flushCpuData(GrGeometryBuffer* buffer, size_t flushSize);
+    void flushCpuData(const BufferBlock& block, size_t flushSize);
 #ifdef SK_DEBUG
     void validate(bool unusedBlockAllowed = false) const;
 #endif