Refactor how Gr handles vertex and index data. GrGpu and GrInOrderDrawBuffer both GrBufferAllocPool to manage reserved and set-to-array vertex and index data.

rietveld issue 4188049

git-svn-id: http://skia.googlecode.com/svn/trunk@786 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrContext.cpp b/gpu/src/GrContext.cpp
index e224891..d14777e 100644
--- a/gpu/src/GrContext.cpp
+++ b/gpu/src/GrContext.cpp
@@ -14,7 +14,6 @@
     limitations under the License.

  */

 

-

 #include "GrContext.h"

 #include "GrTypes.h"

 #include "GrTextureCache.h"

@@ -23,23 +22,16 @@
 #include "GrPathIter.h"

 #include "GrClipIterator.h"

 #include "GrIndexBuffer.h"

+#include "GrInOrderDrawBuffer.h"

+#include "GrBufferAllocPool.h"

 

 #define DEFER_TEXT_RENDERING 1

 

 static const size_t MAX_TEXTURE_CACHE_COUNT = 128;

 static const size_t MAX_TEXTURE_CACHE_BYTES = 8 * 1024 * 1024;

 

-#if DEFER_TEXT_RENDERING

-    static const uint32_t POOL_VB_SIZE = 2048 *

-            GrDrawTarget::VertexSize(

-                GrDrawTarget::kTextFormat_VertexLayoutBit |

-                GrDrawTarget::StageTexCoordVertexLayoutBit(0,0));

-    static const uint32_t NUM_POOL_VBS = 8;

-#else

-    static const uint32_t POOL_VB_SIZE = 0;

-    static const uint32_t NUM_POOL_VBS = 0;

-

-#endif

+static const uint32_t TEXT_POOL_VB_SIZE = 1 << 18; // enough to draw 4K untextured glyphs

+static const uint32_t NUM_TEXT_POOL_VBS = 4;

 

 GrContext* GrContext::Create(GrGpu::Engine engine,

                              GrGpu::Platform3DContext context3D) {

@@ -60,6 +52,9 @@
     fGpu->unref();

     delete fTextureCache;

     delete fFontCache;

+    delete fTextDrawBuffer;

+    delete fTextVBAllocPool;

+    delete fTextIBAllocPool;

 }

 

 void GrContext::abandonAllTextures() {

@@ -487,7 +482,7 @@
                              const uint16_t indices[],

                              int indexCount) {

     GrVertexLayout layout = 0;

-    bool interLeave = false;

+    int vertexSize = sizeof(GrPoint);

 

     GrDrawTarget::AutoReleaseGeometry geo;

 

@@ -498,18 +493,16 @@
             layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(0);

         } else {

             layout |= GrDrawTarget::StageTexCoordVertexLayoutBit(0,0);

-            interLeave = true;

+            vertexSize += sizeof(GrPoint);

         }

     }

 

     if (NULL != colors) {

         layout |= GrDrawTarget::kColor_VertexLayoutBit;

+        vertexSize += sizeof(GrColor);

     }

 

-    static const GrVertexLayout interleaveMask =

-        (GrDrawTarget::StageTexCoordVertexLayoutBit(0,0) |

-         GrDrawTarget::kColor_VertexLayoutBit);

-    if (interleaveMask & layout) {

+    if (sizeof(GrPoint) != vertexSize) {

         if (!geo.set(fGpu, layout, vertexCount, 0)) {

             GrPrintf("Failed to get space for vertices!");

             return;

@@ -533,11 +526,11 @@
             curVertex = (void*)((intptr_t)curVertex + vsize);

         }

     } else {

-        fGpu->setVertexSourceToArray(positions, layout);

+        fGpu->setVertexSourceToArray(layout, positions, vertexCount);

     }

 

     if (NULL != indices) {

-        fGpu->setIndexSourceToArray(indices);

+        fGpu->setIndexSourceToArray(indices, indexCount);

         fGpu->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount);

     } else {

         fGpu->drawNonIndexed(primitiveType, 0, vertexCount);

@@ -816,7 +809,7 @@
             }

             case GrPathIter::kCubic_Command: {

                 generate_cubic_points(pts[0], pts[1], pts[2], pts[3],

-                                      tolSqd, &vert, 

+                                      tolSqd, &vert,

                                       cubic_point_count(pts, tol));

                 break;

             }

@@ -892,8 +885,10 @@
 }

 

 void GrContext::flushText() {

-    fTextDrawBuffer.playback(fGpu);

-    fTextDrawBuffer.reset();

+    if (NULL != fTextDrawBuffer) {

+        fTextDrawBuffer->playback(fGpu);

+        fTextDrawBuffer->reset();

+    }

 }

 

 bool GrContext::readPixels(int left, int top, int width, int height,

@@ -1026,16 +1021,28 @@
     fGpu->printStats();

 }

 

-GrContext::GrContext(GrGpu* gpu) :

-        fVBAllocPool(gpu,

-                     gpu->supportsBufferLocking() ? POOL_VB_SIZE : 0,

-                     gpu->supportsBufferLocking() ? NUM_POOL_VBS : 0),

-        fTextDrawBuffer(gpu->supportsBufferLocking() ? &fVBAllocPool : NULL) {

+GrContext::GrContext(GrGpu* gpu) {

     fGpu = gpu;

     fGpu->ref();

     fTextureCache = new GrTextureCache(MAX_TEXTURE_CACHE_COUNT,

                                        MAX_TEXTURE_CACHE_BYTES);

     fFontCache = new GrFontCache(fGpu);

+

+#if DEFER_TEXT_RENDERING

+    fTextVBAllocPool = new GrVertexBufferAllocPool(gpu,

+                                                   false,

+                                                   TEXT_POOL_VB_SIZE,

+                                                   NUM_TEXT_POOL_VBS);

+    fTextIBAllocPool = new GrIndexBufferAllocPool(gpu, false, 0, 0);

+

+    fTextDrawBuffer = new GrInOrderDrawBuffer(fTextVBAllocPool,

+                                              fTextIBAllocPool);

+#else

+    fTextDrawBuffer = NULL;

+    fTextVBAllocPool = NULL;

+    fTextIBAllocPool = NULL;

+#endif

+

 }

 

 bool GrContext::finalizeTextureKey(GrTextureKey* key,

@@ -1063,8 +1070,8 @@
 GrDrawTarget* GrContext::getTextTarget(const GrPaint& paint) {

     GrDrawTarget* target;

 #if DEFER_TEXT_RENDERING

-    fTextDrawBuffer.initializeDrawStateAndClip(*fGpu);

-    target = &fTextDrawBuffer;

+    fTextDrawBuffer->initializeDrawStateAndClip(*fGpu);

+    target = fTextDrawBuffer;

 #else

     target = fGpu;

 #endif