| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /* |  | 
| 2  * Copyright 2015 Google Inc. |  | 
| 3  * |  | 
| 4  * Use of this source code is governed by a BSD-style license that can be |  | 
| 5  * found in the LICENSE file. |  | 
| 6  */ |  | 
| 7 |  | 
| 8 #include "GrBatch.h" |  | 
| 9 #include "GrBatchTarget.h" |  | 
| 10 #include "GrResourceProvider.h" |  | 
| 11 |  | 
| 12 #include "GrMemoryPool.h" |  | 
| 13 #include "SkSpinlock.h" |  | 
| 14 |  | 
| 15 // TODO I noticed a small benefit to using a larger exclusive pool for batches. 
     Its very small, |  | 
| 16 // but seems to be mostly consistent.  There is a lot in flux right now, but we 
    should really |  | 
| 17 // revisit this when batch is everywhere |  | 
| 18 |  | 
| 19 |  | 
| 20 // We use a global pool protected by a mutex(spinlock). Chrome may use the same 
    GrContext on |  | 
| 21 // different threads. The GrContext is not used concurrently on different thread
    s and there is a |  | 
| 22 // memory barrier between accesses of a context on different threads. Also, ther
    e may be multiple |  | 
| 23 // GrContexts and those contexts may be in use concurrently on different threads
    . |  | 
| 24 namespace { |  | 
| 25 SK_DECLARE_STATIC_SPINLOCK(gBatchSpinlock); |  | 
| 26 class MemoryPoolAccessor { |  | 
| 27 public: |  | 
| 28     MemoryPoolAccessor() { gBatchSpinlock.acquire(); } |  | 
| 29 |  | 
| 30     ~MemoryPoolAccessor() { gBatchSpinlock.release(); } |  | 
| 31 |  | 
| 32     GrMemoryPool* pool() const { |  | 
| 33         static GrMemoryPool gPool(16384, 16384); |  | 
| 34         return &gPool; |  | 
| 35     } |  | 
| 36 }; |  | 
| 37 } |  | 
| 38 |  | 
| 39 int32_t GrBatch::gCurrBatchClassID = GrBatch::kIllegalBatchID; |  | 
| 40 |  | 
| 41 GrBATCH_SPEW(int32_t GrBatch::gCurrBatchUniqueID = GrBatch::kIllegalBatchID;) |  | 
| 42 |  | 
| 43 void* GrBatch::operator new(size_t size) { |  | 
| 44     return MemoryPoolAccessor().pool()->allocate(size); |  | 
| 45 } |  | 
| 46 |  | 
| 47 void GrBatch::operator delete(void* target) { |  | 
| 48     return MemoryPoolAccessor().pool()->release(target); |  | 
| 49 } |  | 
| 50 |  | 
| 51 void* GrBatch::InstancedHelper::init(GrBatchTarget* batchTarget, GrPrimitiveType
     primType, |  | 
| 52                                      size_t vertexStride, const GrIndexBuffer* i
    ndexBuffer, |  | 
| 53                                      int verticesPerInstance, int indicesPerInst
    ance, |  | 
| 54                                      int instancesToDraw) { |  | 
| 55     SkASSERT(batchTarget); |  | 
| 56     if (!indexBuffer) { |  | 
| 57         return NULL; |  | 
| 58     } |  | 
| 59     const GrVertexBuffer* vertexBuffer; |  | 
| 60     int firstVertex; |  | 
| 61     int vertexCount = verticesPerInstance * instancesToDraw; |  | 
| 62     void* vertices = batchTarget->makeVertSpace(vertexStride, vertexCount, |  | 
| 63                                                 &vertexBuffer, &firstVertex); |  | 
| 64     if (!vertices) { |  | 
| 65         SkDebugf("Vertices could not be allocated for instanced rendering."); |  | 
| 66         return NULL; |  | 
| 67     } |  | 
| 68     SkASSERT(vertexBuffer); |  | 
| 69     size_t ibSize = indexBuffer->gpuMemorySize(); |  | 
| 70     int maxInstancesPerDraw = static_cast<int>(ibSize / (sizeof(uint16_t) * indi
    cesPerInstance)); |  | 
| 71 |  | 
| 72     fVertices.initInstanced(primType, vertexBuffer, indexBuffer, |  | 
| 73         firstVertex, verticesPerInstance, indicesPerInstance, instancesToDraw, |  | 
| 74         maxInstancesPerDraw); |  | 
| 75     return vertices; |  | 
| 76 } |  | 
| 77 |  | 
| 78 void* GrBatch::QuadHelper::init(GrBatchTarget* batchTarget, size_t vertexStride,
     int quadsToDraw) { |  | 
| 79     SkAutoTUnref<const GrIndexBuffer> quadIndexBuffer( |  | 
| 80         batchTarget->resourceProvider()->refQuadIndexBuffer()); |  | 
| 81     if (!quadIndexBuffer) { |  | 
| 82         SkDebugf("Could not get quad index buffer."); |  | 
| 83         return NULL; |  | 
| 84     } |  | 
| 85     return this->INHERITED::init(batchTarget, kTriangles_GrPrimitiveType, vertex
    Stride, |  | 
| 86                                  quadIndexBuffer, kVerticesPerQuad, kIndicesPerQ
    uad, quadsToDraw); |  | 
| 87 } |  | 
| OLD | NEW | 
|---|