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

Side by Side Diff: src/gpu/GrAARectRenderer.cpp

Issue 1122673002: Start on simplifying generateGeometry() overrides (Closed) Base URL: https://skia.googlesource.com/skia.git@ibcache
Patch Set: whitespace, remove debug return Created 5 years, 7 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 | « src/gpu/GrAAHairLinePathRenderer.cpp ('k') | src/gpu/GrAtlasTextContext.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 * Copyright 2012 Google Inc. 2 * Copyright 2012 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 "GrAARectRenderer.h" 8 #include "GrAARectRenderer.h"
9 #include "GrBatch.h" 9 #include "GrBatch.h"
10 #include "GrBatchTarget.h" 10 #include "GrBatchTarget.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 // TODO this is hacky, but the only way we have to initialize the GP is to use the 105 // TODO this is hacky, but the only way we have to initialize the GP is to use the
106 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch 106 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
107 // everywhere we can remove this nastiness 107 // everywhere we can remove this nastiness
108 GrPipelineInfo init; 108 GrPipelineInfo init;
109 init.fColorIgnored = fBatch.fColorIgnored; 109 init.fColorIgnored = fBatch.fColorIgnored;
110 init.fOverrideColor = GrColor_ILLEGAL; 110 init.fOverrideColor = GrColor_ILLEGAL;
111 init.fCoverageIgnored = fBatch.fCoverageIgnored; 111 init.fCoverageIgnored = fBatch.fCoverageIgnored;
112 init.fUsesLocalCoords = this->usesLocalCoords(); 112 init.fUsesLocalCoords = this->usesLocalCoords();
113 gp->initBatchTracker(batchTarget->currentBatchTracker(), init); 113 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
114 114
115 SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer(
116 batchTarget->resourceProvider()));
117
118 size_t vertexStride = gp->getVertexStride(); 115 size_t vertexStride = gp->getVertexStride();
119 SkASSERT(canTweakAlphaForCoverage ? 116 SkASSERT(canTweakAlphaForCoverage ?
120 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt tr) : 117 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt tr) :
121 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo verageAttr)); 118 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo verageAttr));
122 int instanceCount = fGeoData.count(); 119 int instanceCount = fGeoData.count();
123 int vertexCount = kVertsPerAAFillRect * instanceCount;
124 const GrVertexBuffer* vertexBuffer;
125 int firstVertex;
126 void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
127 vertexCount,
128 &vertexBuffer,
129 &firstVertex);
130 120
121 SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer(
122 batchTarget->resourceProvider()));
123 InstancedHelper helper;
124 void* vertices = helper.init(batchTarget, kTriangles_GrPrimitiveType, ve rtexStride,
125 indexBuffer, kVertsPerAAFillRect, kIndicesP erAAFillRect,
126 instanceCount);
131 if (!vertices || !indexBuffer) { 127 if (!vertices || !indexBuffer) {
132 SkDebugf("Could not allocate vertices\n"); 128 SkDebugf("Could not allocate vertices\n");
133 return; 129 return;
134 } 130 }
135 131
136 for (int i = 0; i < instanceCount; i++) { 132 for (int i = 0; i < instanceCount; i++) {
137 const Geometry& args = fGeoData[i]; 133 const Geometry& args = fGeoData[i];
138 this->generateAAFillRectGeometry(vertices, 134 this->generateAAFillRectGeometry(vertices,
139 i * kVertsPerAAFillRect * vertexStr ide, 135 i * kVertsPerAAFillRect * vertexStr ide,
140 vertexStride, 136 vertexStride,
141 args.fColor, 137 args.fColor,
142 args.fViewMatrix, 138 args.fViewMatrix,
143 args.fRect, 139 args.fRect,
144 args.fDevRect, 140 args.fDevRect,
145 canTweakAlphaForCoverage); 141 canTweakAlphaForCoverage);
146 } 142 }
147 143
148 GrDrawTarget::DrawInfo drawInfo; 144 helper.issueDraws(batchTarget);
149 drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
150 drawInfo.setStartVertex(0);
151 drawInfo.setStartIndex(0);
152 drawInfo.setVerticesPerInstance(kVertsPerAAFillRect);
153 drawInfo.setIndicesPerInstance(kIndicesPerAAFillRect);
154 drawInfo.adjustStartVertex(firstVertex);
155 drawInfo.setVertexBuffer(vertexBuffer);
156 drawInfo.setIndexBuffer(indexBuffer);
157
158 int maxInstancesPerDraw = kNumAAFillRectsInIndexBuffer;
159
160 while (instanceCount) {
161 drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw) );
162 drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.vertices PerInstance());
163 drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPe rInstance());
164
165 batchTarget->draw(drawInfo);
166
167 drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCoun t());
168 instanceCount -= drawInfo.instanceCount();
169 }
170 } 145 }
171 146
172 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } 147 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
173 148
174 private: 149 private:
175 AAFillRectBatch(const Geometry& geometry) { 150 AAFillRectBatch(const Geometry& geometry) {
176 this->initClassID<AAFillRectBatch>(); 151 this->initClassID<AAFillRectBatch>();
177 fGeoData.push_back(geometry); 152 fGeoData.push_back(geometry);
178 153
179 this->setBounds(geometry.fDevRect); 154 this->setBounds(geometry.fDevRect);
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 if (this->usesLocalCoords() && !this->viewMatrix().invert(&localMatrix)) { 453 if (this->usesLocalCoords() && !this->viewMatrix().invert(&localMatrix)) {
479 SkDebugf("Cannot invert\n"); 454 SkDebugf("Cannot invert\n");
480 return; 455 return;
481 } 456 }
482 457
483 SkAutoTUnref<const GrGeometryProcessor> gp(create_fill_rect_gp(canTweakA lphaForCoverage, 458 SkAutoTUnref<const GrGeometryProcessor> gp(create_fill_rect_gp(canTweakA lphaForCoverage,
484 localMatr ix)); 459 localMatr ix));
485 460
486 batchTarget->initDraw(gp, pipeline); 461 batchTarget->initDraw(gp, pipeline);
487 462
488 const SkAutoTUnref<const GrIndexBuffer> indexBuffer(
489 GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke()) );
490
491 // TODO this is hacky, but the only way we have to initialize the GP is to use the 463 // TODO this is hacky, but the only way we have to initialize the GP is to use the
492 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch 464 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
493 // everywhere we can remove this nastiness 465 // everywhere we can remove this nastiness
494 GrPipelineInfo init; 466 GrPipelineInfo init;
495 init.fColorIgnored = fBatch.fColorIgnored; 467 init.fColorIgnored = fBatch.fColorIgnored;
496 init.fOverrideColor = GrColor_ILLEGAL; 468 init.fOverrideColor = GrColor_ILLEGAL;
497 init.fCoverageIgnored = fBatch.fCoverageIgnored; 469 init.fCoverageIgnored = fBatch.fCoverageIgnored;
498 init.fUsesLocalCoords = this->usesLocalCoords(); 470 init.fUsesLocalCoords = this->usesLocalCoords();
499 gp->initBatchTracker(batchTarget->currentBatchTracker(), init); 471 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
500 472
501 size_t vertexStride = gp->getVertexStride(); 473 size_t vertexStride = gp->getVertexStride();
502 474
503 SkASSERT(canTweakAlphaForCoverage ? 475 SkASSERT(canTweakAlphaForCoverage ?
504 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt tr) : 476 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt tr) :
505 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo verageAttr)); 477 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo verageAttr));
506 int innerVertexNum = 4; 478 int innerVertexNum = 4;
507 int outerVertexNum = this->miterStroke() ? 4 : 8; 479 int outerVertexNum = this->miterStroke() ? 4 : 8;
508 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; 480 int verticesPerInstance = (outerVertexNum + innerVertexNum) * 2;
481 int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIn dexCnt;
482 int instanceCount = fGeoData.count();
509 483
510 int instanceCount = fGeoData.count(); 484 const SkAutoTUnref<const GrIndexBuffer> indexBuffer(
511 int vertexCount = totalVertexNum * instanceCount; 485 GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke()) );
512 486 InstancedHelper helper;
513 const GrVertexBuffer* vertexBuffer; 487 void* vertices = helper.init(batchTarget, kTriangles_GrPrimitiveType, ve rtexStride,
514 int firstVertex; 488 indexBuffer, verticesPerInstance, indicesP erInstance,
515 489 instanceCount);
516 void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
517 vertexCount,
518 &vertexBuffer,
519 &firstVertex);
520
521 if (!vertices || !indexBuffer) { 490 if (!vertices || !indexBuffer) {
522 SkDebugf("Could not allocate vertices\n"); 491 SkDebugf("Could not allocate vertices\n");
523 return; 492 return;
524 } 493 }
525 494
526 for (int i = 0; i < instanceCount; i++) { 495 for (int i = 0; i < instanceCount; i++) {
527 const Geometry& args = fGeoData[i]; 496 const Geometry& args = fGeoData[i];
528 this->generateAAStrokeRectGeometry(vertices, 497 this->generateAAStrokeRectGeometry(vertices,
529 i * totalVertexNum * vertexStride , 498 i * verticesPerInstance * vertexS tride,
530 vertexStride, 499 vertexStride,
531 outerVertexNum, 500 outerVertexNum,
532 innerVertexNum, 501 innerVertexNum,
533 args.fColor, 502 args.fColor,
534 args.fDevOutside, 503 args.fDevOutside,
535 args.fDevOutsideAssist, 504 args.fDevOutsideAssist,
536 args.fDevInside, 505 args.fDevInside,
537 args.fMiterStroke, 506 args.fMiterStroke,
538 canTweakAlphaForCoverage); 507 canTweakAlphaForCoverage);
539 } 508 }
540 int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIn dexCnt; 509 helper.issueDraws(batchTarget);
541 GrDrawTarget::DrawInfo drawInfo;
542 drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
543 drawInfo.setStartVertex(0);
544 drawInfo.setStartIndex(0);
545 drawInfo.setVerticesPerInstance(totalVertexNum);
546 drawInfo.setIndicesPerInstance(indicesPerInstance);
547 drawInfo.adjustStartVertex(firstVertex);
548 drawInfo.setVertexBuffer(vertexBuffer);
549 drawInfo.setIndexBuffer(indexBuffer);
550
551 int maxInstancesPerDraw = this->miterStroke() ? kNumMiterRectsInIndexBuf fer :
552 kNumBevelRectsInIndexBuf fer;
553
554 while (instanceCount) {
555 drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw) );
556 drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.vertices PerInstance());
557 drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPe rInstance());
558
559 batchTarget->draw(drawInfo);
560
561 drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCoun t());
562 instanceCount -= drawInfo.instanceCount();
563 }
564 } 510 }
565 511
566 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } 512 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
567 513
568 private: 514 private:
569 AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix) { 515 AAStrokeRectBatch(const Geometry& geometry, const SkMatrix& viewMatrix) {
570 this->initClassID<AAStrokeRectBatch>(); 516 this->initClassID<AAStrokeRectBatch>();
571 fBatch.fViewMatrix = viewMatrix; 517 fBatch.fViewMatrix = viewMatrix;
572 fGeoData.push_back(geometry); 518 fGeoData.push_back(geometry);
573 519
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 geo.fColor = GrRandomColor(random); 856 geo.fColor = GrRandomColor(random);
911 geo.fDevOutside = outside; 857 geo.fDevOutside = outside;
912 geo.fDevOutsideAssist = outsideAssist; 858 geo.fDevOutsideAssist = outsideAssist;
913 geo.fDevInside = inside; 859 geo.fDevInside = inside;
914 geo.fMiterStroke = miterStroke; 860 geo.fMiterStroke = miterStroke;
915 861
916 return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random)); 862 return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random));
917 } 863 }
918 864
919 #endif 865 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrAAHairLinePathRenderer.cpp ('k') | src/gpu/GrAtlasTextContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698