Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: src/gpu/batches/GrAAFillRectBatch.cpp

Issue 1289803005: broken bots war (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrAAFillRectBatch.h" 8 #include "GrAAFillRectBatch.h"
9 9
10 #include "GrBatch.h" 10 #include "GrBatch.h"
11 #include "GrColor.h" 11 #include "GrColor.h"
12 #include "GrDefaultGeoProcFactory.h" 12 #include "GrDefaultGeoProcFactory.h"
13 #include "GrResourceKey.h" 13 #include "GrResourceKey.h"
14 #include "GrResourceProvider.h" 14 #include "GrResourceProvider.h"
15 #include "GrTypes.h" 15 #include "GrTypes.h"
16 #include "SkMatrix.h" 16 #include "SkMatrix.h"
17 #include "SkRect.h" 17 #include "SkRect.h"
18 18
19 GR_DECLARE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey); 19 GR_DECLARE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
20 20
21 static void set_inset_fan(SkPoint* pts, size_t stride, 21 static void set_inset_fan(SkPoint* pts, size_t stride,
22 const SkRect& r, SkScalar dx, SkScalar dy) { 22 const SkRect& r, SkScalar dx, SkScalar dy) {
23 pts->setRectFan(r.fLeft + dx, r.fTop + dy, 23 pts->setRectFan(r.fLeft + dx, r.fTop + dy,
24 r.fRight - dx, r.fBottom - dy, stride); 24 r.fRight - dx, r.fBottom - dy, stride);
25 } 25 }
26 26
27 static const int kNumAAFillRectsInIndexBuffer = 256;
28 static const int kVertsPerAAFillRect = 8;
29 static const int kIndicesPerAAFillRect = 30;
30
31 const GrIndexBuffer* get_index_buffer(GrResourceProvider* resourceProvider) {
32 GR_DEFINE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
33
34 static const uint16_t gFillAARectIdx[] = {
35 0, 1, 5, 5, 4, 0,
36 1, 2, 6, 6, 5, 1,
37 2, 3, 7, 7, 6, 2,
38 3, 0, 4, 4, 7, 3,
39 4, 5, 6, 6, 7, 4,
40 };
41 GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFillAARectIdx) == kIndicesPerAAFillRect);
42 return resourceProvider->findOrCreateInstancedIndexBuffer(gFillAARectIdx,
43 kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer, kVertsPerAAFillRect ,
44 gAAFillRectIndexBufferKey);
45 }
46
27 /* 47 /*
28 * AAFillRectBatch is templated to optionally allow the insertion of an addition al 48 * AAFillRectBatch is templated to optionally allow the insertion of an addition al
29 * attribute for explicit local coordinates. 49 * attribute for explicit local coordinates.
30 * To use this template, an implementation must define the following static func tions: 50 * To use this template, an implementation must define the following static func tions:
31 * A Geometry struct 51 * A Geometry struct
32 * 52 *
33 * bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatrix& theirs, 53 * bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatrix& theirs,
34 * bool usesLocalCoords) 54 * bool usesLocalCoords)
35 * 55 *
36 * GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType() 56 * GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType()
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 return; 109 return;
90 } 110 }
91 111
92 batchTarget->initDraw(gp, this->pipeline()); 112 batchTarget->initDraw(gp, this->pipeline());
93 113
94 size_t vertexStride = gp->getVertexStride(); 114 size_t vertexStride = gp->getVertexStride();
95 SkASSERT(Base::StrideCheck(vertexStride, canTweakAlphaForCoverage, 115 SkASSERT(Base::StrideCheck(vertexStride, canTweakAlphaForCoverage,
96 this->usesLocalCoords())); 116 this->usesLocalCoords()));
97 int instanceCount = fGeoData.count(); 117 int instanceCount = fGeoData.count();
98 118
99 SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer( 119 SkAutoTUnref<const GrIndexBuffer> indexBuffer(get_index_buffer(
100 batchTarget->resourceProvider())); 120 batchTarget->resourceProvider()));
101 InstancedHelper helper; 121 InstancedHelper helper;
102 void* vertices = helper.init(batchTarget, kTriangles_GrPrimitiveType, ve rtexStride, 122 void* vertices = helper.init(batchTarget, kTriangles_GrPrimitiveType, ve rtexStride,
103 indexBuffer, kVertsPerAAFillRect, kIndicesP erAAFillRect, 123 indexBuffer, kVertsPerAAFillRect, kIndicesP erAAFillRect,
104 instanceCount); 124 instanceCount);
105 if (!vertices || !indexBuffer) { 125 if (!vertices || !indexBuffer) {
106 SkDebugf("Could not allocate vertices\n"); 126 SkDebugf("Could not allocate vertices\n");
107 return; 127 return;
108 } 128 }
109 129
(...skipping 20 matching lines...) Expand all
130 150
131 151
132 private: 152 private:
133 AAFillRectBatch() { 153 AAFillRectBatch() {
134 this->initClassID<AAFillRectBatch<Base>>(); 154 this->initClassID<AAFillRectBatch<Base>>();
135 155
136 // Push back an initial geometry 156 // Push back an initial geometry
137 fGeoData.push_back(); 157 fGeoData.push_back();
138 } 158 }
139 159
140 static const int kNumAAFillRectsInIndexBuffer = 256;
141 static const int kVertsPerAAFillRect = 8;
142 static const int kIndicesPerAAFillRect = 30;
143
144 const GrIndexBuffer* getIndexBuffer(GrResourceProvider* resourceProvider) {
145 GR_DEFINE_STATIC_UNIQUE_KEY(gAAFillRectIndexBufferKey);
146
147 static const uint16_t gFillAARectIdx[] = {
148 0, 1, 5, 5, 4, 0,
149 1, 2, 6, 6, 5, 1,
150 2, 3, 7, 7, 6, 2,
151 3, 0, 4, 4, 7, 3,
152 4, 5, 6, 6, 7, 4,
153 };
154 GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFillAARectIdx) == kIndicesPerAAFillRect );
155 return resourceProvider->findOrCreateInstancedIndexBuffer(gFillAARectIdx ,
156 kIndicesPerAAFillRect, kNumAAFillRectsInIndexBuffer, kVertsPerAAFill Rect,
157 gAAFillRectIndexBufferKey);
158 }
159
160 GrColor color() const { return fBatch.fColor; } 160 GrColor color() const { return fBatch.fColor; }
161 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } 161 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
162 bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCover age; } 162 bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCover age; }
163 bool colorIgnored() const { return fBatch.fColorIgnored; } 163 bool colorIgnored() const { return fBatch.fColorIgnored; }
164 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } 164 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; }
165 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } 165 bool coverageIgnored() const { return fBatch.fCoverageIgnored; }
166 166
167 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { 167 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
168 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *t->pipel ine(), t->bounds(), 168 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *t->pipel ine(), t->bounds(),
169 caps)) { 169 caps)) {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 /*if (coverageIgnored) { 297 /*if (coverageIgnored) {
298 coverageType = Coverage::kNone_Type; 298 coverageType = Coverage::kNone_Type;
299 } else*/ if (tweakAlphaForCoverage) { 299 } else*/ if (tweakAlphaForCoverage) {
300 coverageType = Coverage::kSolid_Type; 300 coverageType = Coverage::kSolid_Type;
301 } else { 301 } else {
302 coverageType = Coverage::kAttribute_Type; 302 coverageType = Coverage::kAttribute_Type;
303 } 303 }
304 Coverage coverage(coverageType); 304 Coverage coverage(coverageType);
305 305
306 // We assume the caller has inverted the viewmatrix 306 // We assume the caller has inverted the viewmatrix
307 LocalCoords localCoords(usesLocalCoords ? localCoordsType : LocalCoords: :kUnused_Type);
308 if (LocalCoords::kHasExplicit_Type == localCoordsType) { 307 if (LocalCoords::kHasExplicit_Type == localCoordsType) {
308 LocalCoords localCoords(localCoordsType);
309 return GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I()); 309 return GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I());
310 } else { 310 } else {
311 LocalCoords localCoords(usesLocalCoords ? localCoordsType : LocalCoo rds::kUnused_Type);
311 return CreateForDeviceSpace(color, coverage, localCoords, viewMatrix ); 312 return CreateForDeviceSpace(color, coverage, localCoords, viewMatrix );
312 } 313 }
313 } 314 }
314 315
315 struct BatchTracker { 316 struct BatchTracker {
316 GrColor fColor; 317 GrColor fColor;
317 bool fUsesLocalCoords; 318 bool fUsesLocalCoords;
318 bool fColorIgnored; 319 bool fColorIgnored;
319 bool fCoverageIgnored; 320 bool fCoverageIgnored;
320 bool fCanTweakAlphaForCoverage; 321 bool fCanTweakAlphaForCoverage;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 return true; 371 return true;
371 } 372 }
372 373
373 inline static GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType() { 374 inline static GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType() {
374 return GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type; 375 return GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type;
375 } 376 }
376 377
377 inline static bool StrideCheck(size_t vertexStride, bool canTweakAlphaForCov erage, 378 inline static bool StrideCheck(size_t vertexStride, bool canTweakAlphaForCov erage,
378 bool usesLocalCoords) { 379 bool usesLocalCoords) {
379 // Whomever created us should not have done so if there are no local coo rds 380 // Whomever created us should not have done so if there are no local coo rds
380 SkASSERT(usesLocalCoords);
381 return canTweakAlphaForCoverage ? 381 return canTweakAlphaForCoverage ?
382 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLo calCoordAttr) : 382 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLo calCoordAttr) :
383 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLo calCoordCoverage); 383 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLo calCoordCoverage);
384 } 384 }
385 385
386 inline static void FillInAttributes(intptr_t vertices, size_t vertexStride, 386 inline static void FillInAttributes(intptr_t vertices, size_t vertexStride,
387 SkPoint* fan0Pos, const Geometry& args) { 387 SkPoint* fan0Pos, const Geometry& args) {
388 SkMatrix invViewMatrix; 388 SkMatrix invViewMatrix;
389 if (!args.fViewMatrix.invert(&invViewMatrix)) { 389 if (!args.fViewMatrix.invert(&invViewMatrix)) {
390 SkASSERT(false); 390 SkASSERT(false);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 geo.fColor = GrRandomColor(random); 457 geo.fColor = GrRandomColor(random);
458 geo.fViewMatrix = GrTest::TestMatrix(random); 458 geo.fViewMatrix = GrTest::TestMatrix(random);
459 geo.fLocalMatrix = GrTest::TestMatrix(random); 459 geo.fLocalMatrix = GrTest::TestMatrix(random);
460 geo.fRect = GrTest::TestRect(random); 460 geo.fRect = GrTest::TestRect(random);
461 geo.fDevRect = GrTest::TestRect(random); 461 geo.fDevRect = GrTest::TestRect(random);
462 batch->init(); 462 batch->init();
463 return batch; 463 return batch;
464 } 464 }
465 465
466 #endif 466 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698