| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrAAStrokeRectBatch.h" | 8 #include "GrAAStrokeRectBatch.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" |
| 10 #include "GrDefaultGeoProcFactory.h" | 11 #include "GrDefaultGeoProcFactory.h" |
| 11 #include "GrResourceKey.h" | 12 #include "GrResourceKey.h" |
| 12 #include "GrResourceProvider.h" | 13 #include "GrResourceProvider.h" |
| 13 | 14 |
| 14 GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey); | 15 GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey); |
| 15 GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey); | 16 GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey); |
| 16 | 17 |
| 17 static void set_inset_fan(SkPoint* pts, size_t stride, | 18 static void set_inset_fan(SkPoint* pts, size_t stride, |
| 18 const SkRect& r, SkScalar dx, SkScalar dy) { | 19 const SkRect& r, SkScalar dx, SkScalar dy) { |
| 19 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 20 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 53 |
| 53 // setup batch properties | 54 // setup batch properties |
| 54 fBatch.fColorIgnored = !opt.readsColor(); | 55 fBatch.fColorIgnored = !opt.readsColor(); |
| 55 fBatch.fColor = fGeoData[0].fColor; | 56 fBatch.fColor = fGeoData[0].fColor; |
| 56 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 57 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 57 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 58 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 58 fBatch.fMiterStroke = fGeoData[0].fMiterStroke; | 59 fBatch.fMiterStroke = fGeoData[0].fMiterStroke; |
| 59 fBatch.fCanTweakAlphaForCoverage = opt.canTweakAlphaForCoverage(); | 60 fBatch.fCanTweakAlphaForCoverage = opt.canTweakAlphaForCoverage(); |
| 60 } | 61 } |
| 61 | 62 |
| 62 void GrAAStrokeRectBatch::generateGeometry(GrBatchTarget* batchTarget) { | 63 void GrAAStrokeRectBatch::onPrepareDraws(Target* target) { |
| 63 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); | 64 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); |
| 64 | 65 |
| 65 SkAutoTUnref<const GrGeometryProcessor> gp(create_stroke_rect_gp(canTweakAlp
haForCoverage, | 66 SkAutoTUnref<const GrGeometryProcessor> gp(create_stroke_rect_gp(canTweakAlp
haForCoverage, |
| 66 this->viewM
atrix(), | 67 this->viewM
atrix(), |
| 67 this->usesL
ocalCoords(), | 68 this->usesL
ocalCoords(), |
| 68 this->cover
ageIgnored())); | 69 this->cover
ageIgnored())); |
| 69 if (!gp) { | 70 if (!gp) { |
| 70 SkDebugf("Couldn't create GrGeometryProcessor\n"); | 71 SkDebugf("Couldn't create GrGeometryProcessor\n"); |
| 71 return; | 72 return; |
| 72 } | 73 } |
| 73 | 74 |
| 74 batchTarget->initDraw(gp, this->pipeline()); | 75 target->initDraw(gp, this->pipeline()); |
| 75 | 76 |
| 76 size_t vertexStride = gp->getVertexStride(); | 77 size_t vertexStride = gp->getVertexStride(); |
| 77 | 78 |
| 78 SkASSERT(canTweakAlphaForCoverage ? | 79 SkASSERT(canTweakAlphaForCoverage ? |
| 79 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)
: | 80 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)
: |
| 80 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCovera
geAttr)); | 81 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCovera
geAttr)); |
| 81 int innerVertexNum = 4; | 82 int innerVertexNum = 4; |
| 82 int outerVertexNum = this->miterStroke() ? 4 : 8; | 83 int outerVertexNum = this->miterStroke() ? 4 : 8; |
| 83 int verticesPerInstance = (outerVertexNum + innerVertexNum) * 2; | 84 int verticesPerInstance = (outerVertexNum + innerVertexNum) * 2; |
| 84 int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIndexC
nt; | 85 int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIndexC
nt; |
| 85 int instanceCount = fGeoData.count(); | 86 int instanceCount = fGeoData.count(); |
| 86 | 87 |
| 87 const SkAutoTUnref<const GrIndexBuffer> indexBuffer( | 88 const SkAutoTUnref<const GrIndexBuffer> indexBuffer( |
| 88 GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke())); | 89 GetIndexBuffer(target->resourceProvider(), this->miterStroke())); |
| 89 InstancedHelper helper; | 90 InstancedHelper helper; |
| 90 void* vertices = helper.init(batchTarget, kTriangles_GrPrimitiveType, vertex
Stride, | 91 void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStrid
e, |
| 91 indexBuffer, verticesPerInstance, indicesPerIn
stance, | 92 indexBuffer, verticesPerInstance, indicesPerIn
stance, |
| 92 instanceCount); | 93 instanceCount); |
| 93 if (!vertices || !indexBuffer) { | 94 if (!vertices || !indexBuffer) { |
| 94 SkDebugf("Could not allocate vertices\n"); | 95 SkDebugf("Could not allocate vertices\n"); |
| 95 return; | 96 return; |
| 96 } | 97 } |
| 97 | 98 |
| 98 for (int i = 0; i < instanceCount; i++) { | 99 for (int i = 0; i < instanceCount; i++) { |
| 99 const Geometry& args = fGeoData[i]; | 100 const Geometry& args = fGeoData[i]; |
| 100 this->generateAAStrokeRectGeometry(vertices, | 101 this->generateAAStrokeRectGeometry(vertices, |
| 101 i * verticesPerInstance * vertexStrid
e, | 102 i * verticesPerInstance * vertexStrid
e, |
| 102 vertexStride, | 103 vertexStride, |
| 103 outerVertexNum, | 104 outerVertexNum, |
| 104 innerVertexNum, | 105 innerVertexNum, |
| 105 args.fColor, | 106 args.fColor, |
| 106 args.fDevOutside, | 107 args.fDevOutside, |
| 107 args.fDevOutsideAssist, | 108 args.fDevOutsideAssist, |
| 108 args.fDevInside, | 109 args.fDevInside, |
| 109 args.fMiterStroke, | 110 args.fMiterStroke, |
| 110 canTweakAlphaForCoverage); | 111 canTweakAlphaForCoverage); |
| 111 } | 112 } |
| 112 helper.issueDraw(batchTarget); | 113 helper.recordDraw(target); |
| 113 } | 114 } |
| 114 | 115 |
| 115 const GrIndexBuffer* GrAAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* res
ourceProvider, | 116 const GrIndexBuffer* GrAAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* res
ourceProvider, |
| 116 bool miterStroke) { | 117 bool miterStroke) { |
| 117 | 118 |
| 118 if (miterStroke) { | 119 if (miterStroke) { |
| 119 static const uint16_t gMiterIndices[] = { | 120 static const uint16_t gMiterIndices[] = { |
| 120 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, | 121 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, |
| 121 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, | 122 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, |
| 122 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, | 123 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 geo.fColor = GrRandomColor(random); | 373 geo.fColor = GrRandomColor(random); |
| 373 geo.fDevOutside = outside; | 374 geo.fDevOutside = outside; |
| 374 geo.fDevOutsideAssist = outsideAssist; | 375 geo.fDevOutsideAssist = outsideAssist; |
| 375 geo.fDevInside = inside; | 376 geo.fDevInside = inside; |
| 376 geo.fMiterStroke = miterStroke; | 377 geo.fMiterStroke = miterStroke; |
| 377 | 378 |
| 378 return GrAAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random)); | 379 return GrAAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random)); |
| 379 } | 380 } |
| 380 | 381 |
| 381 #endif | 382 #endif |
| OLD | NEW |