| Index: src/gpu/GrAARectRenderer.cpp
|
| diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
|
| index e5d1593bc060e06e751a9ec27d1acc5c1f305b26..3b4fd63788286e38fdc7f9b601055d6c8d7d30fa 100644
|
| --- a/src/gpu/GrAARectRenderer.cpp
|
| +++ b/src/gpu/GrAARectRenderer.cpp
|
| @@ -311,6 +311,42 @@
|
| static const int kVertsPerAAFillRect = 8;
|
| static const int kNumAAFillRectsInIndexBuffer = 256;
|
|
|
| +GrIndexBuffer* GrAARectRenderer::aaFillRectIndexBuffer(GrGpu* gpu) {
|
| + static const size_t kAAFillRectIndexBufferSize = kIndicesPerAAFillRect *
|
| + sizeof(uint16_t) *
|
| + kNumAAFillRectsInIndexBuffer;
|
| +
|
| + if (NULL == fAAFillRectIndexBuffer) {
|
| + fAAFillRectIndexBuffer = gpu->createIndexBuffer(kAAFillRectIndexBufferSize, false);
|
| + if (fAAFillRectIndexBuffer) {
|
| + uint16_t* data = (uint16_t*) fAAFillRectIndexBuffer->map();
|
| + bool useTempData = (NULL == data);
|
| + if (useTempData) {
|
| + data = SkNEW_ARRAY(uint16_t, kNumAAFillRectsInIndexBuffer * kIndicesPerAAFillRect);
|
| + }
|
| + for (int i = 0; i < kNumAAFillRectsInIndexBuffer; ++i) {
|
| + // Each AA filled rect is drawn with 8 vertices and 10 triangles (8 around
|
| + // the inner rect (for AA) and 2 for the inner rect.
|
| + int baseIdx = i * kIndicesPerAAFillRect;
|
| + uint16_t baseVert = (uint16_t)(i * kVertsPerAAFillRect);
|
| + for (int j = 0; j < kIndicesPerAAFillRect; ++j) {
|
| + data[baseIdx+j] = baseVert + gFillAARectIdx[j];
|
| + }
|
| + }
|
| + if (useTempData) {
|
| + if (!fAAFillRectIndexBuffer->updateData(data, kAAFillRectIndexBufferSize)) {
|
| + SkFAIL("Can't get AA Fill Rect indices into buffer!");
|
| + }
|
| + SkDELETE_ARRAY(data);
|
| + } else {
|
| + fAAFillRectIndexBuffer->unmap();
|
| + }
|
| + }
|
| + }
|
| +
|
| + return fAAFillRectIndexBuffer;
|
| +}
|
| +
|
| static const uint16_t gMiterStrokeAARectIdx[] = {
|
| 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0,
|
| 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0,
|
| @@ -327,10 +363,6 @@
|
| 2 + 8, 3 + 8, 7 + 8, 7 + 8, 6 + 8, 2 + 8,
|
| 3 + 8, 0 + 8, 4 + 8, 4 + 8, 7 + 8, 3 + 8,
|
| };
|
| -
|
| -static const int kIndicesPerMiterStrokeRect = SK_ARRAY_COUNT(gMiterStrokeAARectIdx);
|
| -static const int kVertsPerMiterStrokeRect = 16;
|
| -static const int kNumMiterStrokeRectsInIndexBuffer = 256;
|
|
|
| /**
|
| * As in miter-stroke, index = a + b, and a is the current index, b is the shift
|
| @@ -389,10 +421,6 @@
|
| 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
|
| };
|
|
|
| -static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
|
| -static const int kVertsPerBevelStrokeRect = 24;
|
| -static const int kNumBevelStrokeRectsInIndexBuffer = 256;
|
| -
|
| int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) {
|
| return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) :
|
| SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
|
| @@ -402,19 +430,29 @@
|
| if (miterStroke) {
|
| if (NULL == fAAMiterStrokeRectIndexBuffer) {
|
| fAAMiterStrokeRectIndexBuffer =
|
| - gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx,
|
| - kIndicesPerMiterStrokeRect,
|
| - kNumMiterStrokeRectsInIndexBuffer,
|
| - kVertsPerMiterStrokeRect);
|
| + gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false);
|
| + if (fAAMiterStrokeRectIndexBuffer) {
|
| +#ifdef SK_DEBUG
|
| + bool updated =
|
| +#endif
|
| + fAAMiterStrokeRectIndexBuffer->updateData(gMiterStrokeAARectIdx,
|
| + sizeof(gMiterStrokeAARectIdx));
|
| + GR_DEBUGASSERT(updated);
|
| + }
|
| }
|
| return fAAMiterStrokeRectIndexBuffer;
|
| } else {
|
| if (NULL == fAABevelStrokeRectIndexBuffer) {
|
| fAABevelStrokeRectIndexBuffer =
|
| - gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
|
| - kIndicesPerBevelStrokeRect,
|
| - kNumBevelStrokeRectsInIndexBuffer,
|
| - kVertsPerBevelStrokeRect);
|
| + gpu->createIndexBuffer(sizeof(gBevelStrokeAARectIdx), false);
|
| + if (fAABevelStrokeRectIndexBuffer) {
|
| +#ifdef SK_DEBUG
|
| + bool updated =
|
| +#endif
|
| + fAABevelStrokeRectIndexBuffer->updateData(gBevelStrokeAARectIdx,
|
| + sizeof(gBevelStrokeAARectIdx));
|
| + GR_DEBUGASSERT(updated);
|
| + }
|
| }
|
| return fAABevelStrokeRectIndexBuffer;
|
| }
|
| @@ -440,13 +478,7 @@
|
| return;
|
| }
|
|
|
| - if (NULL == fAAFillRectIndexBuffer) {
|
| - fAAFillRectIndexBuffer = gpu->createInstancedIndexBuffer(gFillAARectIdx,
|
| - kIndicesPerAAFillRect,
|
| - kNumAAFillRectsInIndexBuffer,
|
| - kVertsPerAAFillRect);
|
| - }
|
| - GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer;
|
| + GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu);
|
| if (NULL == indexBuffer) {
|
| GrPrintf("Failed to create index buffer!\n");
|
| return;
|
| @@ -901,9 +933,8 @@
|
| }
|
|
|
| target->setIndexSourceToBuffer(indexBuffer);
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1,
|
| - totalVertexNum, aaStrokeRectIndexCount(miterStroke));
|
| - target->resetIndexSource();
|
| + target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0,
|
| + totalVertexNum, aaStrokeRectIndexCount(miterStroke));
|
| }
|
|
|
| void GrAARectRenderer::fillAANestedRects(GrGpu* gpu,
|
|
|