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

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

Issue 1512533003: Remove uniform color for GrDistanceFieldGeoProc (Closed) Base URL: https://skia.googlesource.com/skia.git@cleanuptext4
Patch Set: mac warnings Created 5 years 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 | src/gpu/batches/GrAtlasTextBatch.cpp » ('j') | 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 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrAADistanceFieldPathRenderer.h" 9 #include "GrAADistanceFieldPathRenderer.h"
10 10
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 if (fStroke.getWidth() < 0) { 135 if (fStroke.getWidth() < 0) {
136 fStroke.setStrokeStyle(-1.0f); 136 fStroke.setStrokeStyle(-1.0f);
137 } 137 }
138 } 138 }
139 } 139 }
140 SkPath fPath; 140 SkPath fPath;
141 // The unique ID of the path involved in this draw. This may be differen t than the ID 141 // The unique ID of the path involved in this draw. This may be differen t than the ID
142 // in fPath since that path may have resulted from a SkStrokeRec::applyT oPath call. 142 // in fPath since that path may have resulted from a SkStrokeRec::applyT oPath call.
143 uint32_t fGenID; 143 uint32_t fGenID;
144 SkStrokeRec fStroke; 144 SkStrokeRec fStroke;
145 GrColor fColor;
145 bool fAntiAlias; 146 bool fAntiAlias;
146 }; 147 };
147 148
148 static GrDrawBatch* Create(const Geometry& geometry, GrColor color, const Sk Matrix& viewMatrix, 149 static GrDrawBatch* Create(const Geometry& geometry, const SkMatrix& viewMat rix,
149 GrBatchAtlas* atlas, PathCache* pathCache, PathDa taList* pathList) { 150 GrBatchAtlas* atlas, PathCache* pathCache, PathDa taList* pathList) {
150 return new AADistanceFieldPathBatch(geometry, color, viewMatrix, atlas, pathCache, 151 return new AADistanceFieldPathBatch(geometry, viewMatrix, atlas, pathCac he, pathList);
151 pathList);
152 } 152 }
153 153
154 const char* name() const override { return "AADistanceFieldPathBatch"; } 154 const char* name() const override { return "AADistanceFieldPathBatch"; }
155 155
156 void computePipelineOptimizations(GrInitInvariantOutput* color, 156 void computePipelineOptimizations(GrInitInvariantOutput* color,
157 GrInitInvariantOutput* coverage, 157 GrInitInvariantOutput* coverage,
158 GrBatchToXPOverrides* overrides) const ove rride { 158 GrBatchToXPOverrides* overrides) const ove rride {
159 color->setKnownFourComponents(fBatch.fColor); 159 color->setKnownFourComponents(fGeoData[0].fColor);
160 coverage->setUnknownSingleComponent(); 160 coverage->setUnknownSingleComponent();
161 overrides->fUsePLSDstRead = false; 161 overrides->fUsePLSDstRead = false;
162 } 162 }
163 163
164 private: 164 private:
165 void initBatchTracker(const GrXPOverridesForBatch& overrides) override { 165 void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
166 // Handle any color overrides 166 // Handle any color overrides
167 if (!overrides.readsColor()) { 167 if (!overrides.readsColor()) {
168 fBatch.fColor = GrColor_ILLEGAL; 168 fGeoData[0].fColor = GrColor_ILLEGAL;
169 } 169 }
170 overrides.getOverrideColorIfSet(&fBatch.fColor); 170 overrides.getOverrideColorIfSet(&fGeoData[0].fColor);
171 171
172 // setup batch properties 172 // setup batch properties
173 fBatch.fColorIgnored = !overrides.readsColor(); 173 fBatch.fColorIgnored = !overrides.readsColor();
174 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); 174 fBatch.fUsesLocalCoords = overrides.readsLocalCoords();
175 fBatch.fCoverageIgnored = !overrides.readsCoverage(); 175 fBatch.fCoverageIgnored = !overrides.readsCoverage();
176 } 176 }
177 177
178 struct FlushInfo { 178 struct FlushInfo {
179 SkAutoTUnref<const GrVertexBuffer> fVertexBuffer; 179 SkAutoTUnref<const GrVertexBuffer> fVertexBuffer;
180 SkAutoTUnref<const GrIndexBuffer> fIndexBuffer; 180 SkAutoTUnref<const GrIndexBuffer> fIndexBuffer;
(...skipping 24 matching lines...) Expand all
205 params, 205 params,
206 flags, 206 flags,
207 this->usesLocalCoords())); 207 this->usesLocalCoords()));
208 208
209 target->initDraw(dfProcessor, this->pipeline()); 209 target->initDraw(dfProcessor, this->pipeline());
210 210
211 FlushInfo flushInfo; 211 FlushInfo flushInfo;
212 212
213 // allocate vertices 213 // allocate vertices
214 size_t vertexStride = dfProcessor->getVertexStride(); 214 size_t vertexStride = dfProcessor->getVertexStride();
215 SkASSERT(vertexStride == 2 * sizeof(SkPoint)); 215 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor));
216 216
217 const GrVertexBuffer* vertexBuffer; 217 const GrVertexBuffer* vertexBuffer;
218 void* vertices = target->makeVertexSpace(vertexStride, 218 void* vertices = target->makeVertexSpace(vertexStride,
219 kVerticesPerQuad * instanceCoun t, 219 kVerticesPerQuad * instanceCoun t,
220 &vertexBuffer, 220 &vertexBuffer,
221 &flushInfo.fVertexOffset); 221 &flushInfo.fVertexOffset);
222 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); 222 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer));
223 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf fer()); 223 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf fer());
224 if (!vertices || !flushInfo.fIndexBuffer) { 224 if (!vertices || !flushInfo.fIndexBuffer) {
225 SkDebugf("Could not allocate vertices\n"); 225 SkDebugf("Could not allocate vertices\n");
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 SkDebugf("Can't rasterize path\n"); 271 SkDebugf("Can't rasterize path\n");
272 return; 272 return;
273 } 273 }
274 } 274 }
275 275
276 atlas->setLastUseToken(pathData->fID, target->currentToken()); 276 atlas->setLastUseToken(pathData->fID, target->currentToken());
277 277
278 // Now set vertices 278 // Now set vertices
279 intptr_t offset = reinterpret_cast<intptr_t>(vertices); 279 intptr_t offset = reinterpret_cast<intptr_t>(vertices);
280 offset += i * kVerticesPerQuad * vertexStride; 280 offset += i * kVerticesPerQuad * vertexStride;
281 SkPoint* positions = reinterpret_cast<SkPoint*>(offset);
282 this->writePathVertices(target, 281 this->writePathVertices(target,
283 atlas, 282 atlas,
284 this->pipeline(), 283 this->pipeline(),
285 dfProcessor, 284 dfProcessor,
286 positions, 285 offset,
286 args.fColor,
287 vertexStride, 287 vertexStride,
288 this->viewMatrix(), 288 this->viewMatrix(),
289 args.fPath, 289 args.fPath,
290 pathData); 290 pathData);
291 flushInfo.fInstancesToFlush++; 291 flushInfo.fInstancesToFlush++;
292 } 292 }
293 293
294 this->flush(target, &flushInfo); 294 this->flush(target, &flushInfo);
295 } 295 }
296 296
297 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } 297 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
298 298
299 AADistanceFieldPathBatch(const Geometry& geometry, GrColor color, const SkMa trix& viewMatrix, 299 AADistanceFieldPathBatch(const Geometry& geometry,
300 const SkMatrix& viewMatrix,
300 GrBatchAtlas* atlas, 301 GrBatchAtlas* atlas,
301 PathCache* pathCache, PathDataList* pathList) 302 PathCache* pathCache, PathDataList* pathList)
302 : INHERITED(ClassID()) { 303 : INHERITED(ClassID()) {
303 fBatch.fColor = color;
304 fBatch.fViewMatrix = viewMatrix; 304 fBatch.fViewMatrix = viewMatrix;
305 fGeoData.push_back(geometry); 305 fGeoData.push_back(geometry);
306 306
307 fAtlas = atlas; 307 fAtlas = atlas;
308 fPathCache = pathCache; 308 fPathCache = pathCache;
309 fPathList = pathList; 309 fPathList = pathList;
310 310
311 // Compute bounds 311 // Compute bounds
312 fBounds = geometry.fPath.getBounds(); 312 fBounds = geometry.fPath.getBounds();
313 viewMatrix.mapRect(&fBounds); 313 viewMatrix.mapRect(&fBounds);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 #ifdef DF_PATH_TRACKING 430 #ifdef DF_PATH_TRACKING
431 ++g_NumCachedPaths; 431 ++g_NumCachedPaths;
432 #endif 432 #endif
433 return true; 433 return true;
434 } 434 }
435 435
436 void writePathVertices(GrDrawBatch::Target* target, 436 void writePathVertices(GrDrawBatch::Target* target,
437 GrBatchAtlas* atlas, 437 GrBatchAtlas* atlas,
438 const GrPipeline* pipeline, 438 const GrPipeline* pipeline,
439 const GrGeometryProcessor* gp, 439 const GrGeometryProcessor* gp,
440 SkPoint* positions, 440 intptr_t offset,
441 GrColor color,
441 size_t vertexStride, 442 size_t vertexStride,
442 const SkMatrix& viewMatrix, 443 const SkMatrix& viewMatrix,
443 const SkPath& path, 444 const SkPath& path,
444 const PathData* pathData) const { 445 const PathData* pathData) const {
445 GrTexture* texture = atlas->getTexture(); 446 GrTexture* texture = atlas->getTexture();
446 447
447 SkScalar dx = pathData->fBounds.fLeft; 448 SkScalar dx = pathData->fBounds.fLeft;
448 SkScalar dy = pathData->fBounds.fTop; 449 SkScalar dy = pathData->fBounds.fTop;
449 SkScalar width = pathData->fBounds.width(); 450 SkScalar width = pathData->fBounds.width();
450 SkScalar height = pathData->fBounds.height(); 451 SkScalar height = pathData->fBounds.height();
451 452
452 SkScalar invScale = 1.0f / pathData->fScale; 453 SkScalar invScale = 1.0f / pathData->fScale;
453 dx *= invScale; 454 dx *= invScale;
454 dy *= invScale; 455 dy *= invScale;
455 width *= invScale; 456 width *= invScale;
456 height *= invScale; 457 height *= invScale;
457 458
458 SkFixed tx = SkIntToFixed(pathData->fAtlasLocation.fX); 459 SkFixed tx = SkIntToFixed(pathData->fAtlasLocation.fX);
459 SkFixed ty = SkIntToFixed(pathData->fAtlasLocation.fY); 460 SkFixed ty = SkIntToFixed(pathData->fAtlasLocation.fY);
460 SkFixed tw = SkScalarToFixed(pathData->fBounds.width()); 461 SkFixed tw = SkScalarToFixed(pathData->fBounds.width());
461 SkFixed th = SkScalarToFixed(pathData->fBounds.height()); 462 SkFixed th = SkScalarToFixed(pathData->fBounds.height());
462 463
464 SkPoint* positions = reinterpret_cast<SkPoint*>(offset);
465
463 // vertex positions 466 // vertex positions
464 // TODO make the vertex attributes a struct 467 // TODO make the vertex attributes a struct
465 SkRect r = SkRect::MakeXYWH(dx, dy, width, height); 468 SkRect r = SkRect::MakeXYWH(dx, dy, width, height);
466 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertexSt ride); 469 positions->setRectFan(r.left(), r.top(), r.right(), r.bottom(), vertexSt ride);
467 470
471 // colors
472 for (int i = 0; i < kVerticesPerQuad; i++) {
473 GrColor* colorPtr = (GrColor*)(offset + sizeof(SkPoint) + i * vertex Stride);
474 *colorPtr = color;
475 }
476
468 // vertex texture coords 477 // vertex texture coords
469 SkPoint* textureCoords = positions + 1; 478 SkPoint* textureCoords = (SkPoint*)(offset + sizeof(SkPoint) + sizeof(Gr Color));
470 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx)), 479 textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx)),
471 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty)), 480 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty)),
472 SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx + tw)), 481 SkFixedToFloat(texture->texturePriv().normaliz eFixedX(tx + tw)),
473 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty + th)), 482 SkFixedToFloat(texture->texturePriv().normaliz eFixedY(ty + th)),
474 vertexStride); 483 vertexStride);
475 } 484 }
476 485
477 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { 486 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const {
478 GrVertices vertices; 487 GrVertices vertices;
479 int maxInstancesPerDraw = flushInfo->fIndexBuffer->maxQuads(); 488 int maxInstancesPerDraw = flushInfo->fIndexBuffer->maxQuads();
480 vertices.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuf fer, 489 vertices.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuf fer,
481 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, 490 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad,
482 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); 491 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw);
483 target->draw(vertices); 492 target->draw(vertices);
484 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl ush; 493 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl ush;
485 flushInfo->fInstancesToFlush = 0; 494 flushInfo->fInstancesToFlush = 0;
486 } 495 }
487 496
488 GrColor color() const { return fBatch.fColor; } 497 GrColor color() const { return fGeoData[0].fColor; }
489 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; } 498 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; }
490 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } 499 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
491 500
492 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { 501 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
493 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); 502 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>();
494 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi peline(), 503 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi peline(),
495 that->bounds(), caps)) { 504 that->bounds(), caps)) {
496 return false; 505 return false;
497 } 506 }
498 507
499 // TODO we could actually probably do a bunch of this work on the CPU, i e map viewMatrix, 508 // TODO We can position on the cpu
500 // maybe upload color via attribute
501 if (this->color() != that->color()) {
502 return false;
503 }
504
505 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { 509 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
506 return false; 510 return false;
507 } 511 }
508 512
509 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()) ; 513 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()) ;
510 this->joinBounds(that->bounds()); 514 this->joinBounds(that->bounds());
511 return true; 515 return true;
512 } 516 }
513 517
514 struct BatchTracker { 518 struct BatchTracker {
515 GrColor fColor;
516 SkMatrix fViewMatrix; 519 SkMatrix fViewMatrix;
517 bool fUsesLocalCoords; 520 bool fUsesLocalCoords;
518 bool fColorIgnored; 521 bool fColorIgnored;
519 bool fCoverageIgnored; 522 bool fCoverageIgnored;
520 }; 523 };
521 524
522 BatchTracker fBatch; 525 BatchTracker fBatch;
523 SkSTArray<1, Geometry, true> fGeoData; 526 SkSTArray<1, Geometry, true> fGeoData;
524 GrBatchAtlas* fAtlas; 527 GrBatchAtlas* fAtlas;
525 PathCache* fPathCache; 528 PathCache* fPathCache;
(...skipping 18 matching lines...) Expand all
544 return false; 547 return false;
545 } 548 }
546 } 549 }
547 550
548 AADistanceFieldPathBatch::Geometry geometry(*args.fStroke); 551 AADistanceFieldPathBatch::Geometry geometry(*args.fStroke);
549 if (SkStrokeRec::kFill_Style == args.fStroke->getStyle()) { 552 if (SkStrokeRec::kFill_Style == args.fStroke->getStyle()) {
550 geometry.fPath = *args.fPath; 553 geometry.fPath = *args.fPath;
551 } else { 554 } else {
552 args.fStroke->applyToPath(&geometry.fPath, *args.fPath); 555 args.fStroke->applyToPath(&geometry.fPath, *args.fPath);
553 } 556 }
557 geometry.fColor = args.fColor;
554 geometry.fAntiAlias = args.fAntiAlias; 558 geometry.fAntiAlias = args.fAntiAlias;
555 // Note: this is the generation ID of the _original_ path. When a new path i s 559 // Note: this is the generation ID of the _original_ path. When a new path i s
556 // generated due to stroking it is important that the original path's id is used 560 // generated due to stroking it is important that the original path's id is used
557 // for caching. 561 // for caching.
558 geometry.fGenID = args.fPath->getGenerationID(); 562 geometry.fGenID = args.fPath->getGenerationID();
559 563
560 SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry, a rgs.fColor, 564 SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry,
561 *args.fView Matrix, fAtlas, 565 *args.fView Matrix, fAtlas,
562 &fPathCache , &fPathList)); 566 &fPathCache , &fPathList));
563 args.fTarget->drawBatch(*args.fPipelineBuilder, batch); 567 args.fTarget->drawBatch(*args.fPipelineBuilder, batch);
564 568
565 return true; 569 return true;
566 } 570 }
567 571
568 //////////////////////////////////////////////////////////////////////////////// /////////////////// 572 //////////////////////////////////////////////////////////////////////////////// ///////////////////
569 573
570 #ifdef GR_TEST_UTILS 574 #ifdef GR_TEST_UTILS
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 ATLAS_TEXTURE_WIDTH, ATLAS_ TEXTURE_HEIGHT, 626 ATLAS_TEXTURE_WIDTH, ATLAS_ TEXTURE_HEIGHT,
623 NUM_PLOTS_X, NUM_PLOTS_Y, 627 NUM_PLOTS_X, NUM_PLOTS_Y,
624 &PathTestStruct::HandleEvic tion, 628 &PathTestStruct::HandleEvic tion,
625 (void*)&gTestStruct); 629 (void*)&gTestStruct);
626 } 630 }
627 631
628 SkMatrix viewMatrix = GrTest::TestMatrix(random); 632 SkMatrix viewMatrix = GrTest::TestMatrix(random);
629 GrColor color = GrRandomColor(random); 633 GrColor color = GrRandomColor(random);
630 634
631 AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random)); 635 AADistanceFieldPathBatch::Geometry geometry(GrTest::TestStrokeRec(random));
636 geometry.fColor = color;
632 geometry.fPath = GrTest::TestPath(random); 637 geometry.fPath = GrTest::TestPath(random);
633 geometry.fAntiAlias = random->nextBool(); 638 geometry.fAntiAlias = random->nextBool();
634 geometry.fGenID = random->nextU(); 639 geometry.fGenID = random->nextU();
635 640
636 return AADistanceFieldPathBatch::Create(geometry, color, viewMatrix, 641 return AADistanceFieldPathBatch::Create(geometry, viewMatrix,
637 gTestStruct.fAtlas, 642 gTestStruct.fAtlas,
638 &gTestStruct.fPathCache, 643 &gTestStruct.fPathCache,
639 &gTestStruct.fPathList); 644 &gTestStruct.fPathList);
640 } 645 }
641 646
642 #endif 647 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/batches/GrAtlasTextBatch.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698