OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrAADistanceFieldPathRenderer.h" | 8 #include "GrAADistanceFieldPathRenderer.h" |
9 | 9 |
10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 } | 165 } |
166 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 166 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
167 | 167 |
168 // setup batch properties | 168 // setup batch properties |
169 fBatch.fColorIgnored = !overrides.readsColor(); | 169 fBatch.fColorIgnored = !overrides.readsColor(); |
170 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 170 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
171 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 171 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
172 } | 172 } |
173 | 173 |
174 struct FlushInfo { | 174 struct FlushInfo { |
175 SkAutoTUnref<const GrBuffer> fVertexBuffer; | 175 SkAutoTUnref<const GrBuffer> fVertexBuffer; |
176 SkAutoTUnref<const GrBuffer> fIndexBuffer; | 176 SkAutoTUnref<const GrBuffer> fIndexBuffer; |
177 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; | 177 sk_sp<GrGeometryProcessor> fGeometryProcessor; |
178 int fVertexOffset; | 178 int fVertexOffset; |
179 int fInstancesToFlush; | 179 int fInstancesToFlush; |
180 }; | 180 }; |
181 | 181 |
182 void onPrepareDraws(Target* target) const override { | 182 void onPrepareDraws(Target* target) const override { |
183 int instanceCount = fGeoData.count(); | 183 int instanceCount = fGeoData.count(); |
184 | 184 |
185 SkMatrix invert; | 185 SkMatrix invert; |
186 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) { | 186 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) { |
187 SkDebugf("Could not invert viewmatrix\n"); | 187 SkDebugf("Could not invert viewmatrix\n"); |
188 return; | 188 return; |
189 } | 189 } |
190 | 190 |
191 const SkMatrix& ctm = this->viewMatrix(); | 191 const SkMatrix& ctm = this->viewMatrix(); |
192 uint32_t flags = 0; | 192 uint32_t flags = 0; |
193 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0
; | 193 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0
; |
194 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; | 194 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; |
195 flags |= fGammaCorrect ? kGammaCorrect_DistanceFieldEffectFlag : 0; | 195 flags |= fGammaCorrect ? kGammaCorrect_DistanceFieldEffectFlag : 0; |
196 | 196 |
197 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil
erp_FilterMode); | 197 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil
erp_FilterMode); |
198 | 198 |
199 FlushInfo flushInfo; | 199 FlushInfo flushInfo; |
200 | 200 |
201 // Setup GrGeometryProcessor | 201 // Setup GrGeometryProcessor |
202 GrBatchAtlas* atlas = fAtlas; | 202 GrBatchAtlas* atlas = fAtlas; |
203 flushInfo.fGeometryProcessor.reset( | 203 flushInfo.fGeometryProcessor = GrDistanceFieldPathGeoProc::Make(this->co
lor(), |
204 GrDistanceFieldPathGeoProc::Create(this->color(), | 204 this->vi
ewMatrix(), |
205 this->viewMatrix(), | 205 atlas->g
etTexture(), |
206 atlas->getTexture(), | 206 params, |
207 params, | 207 flags, |
208 flags, | 208 this->us
esLocalCoords()); |
209 this->usesLocalCoords())); | |
210 | 209 |
211 // allocate vertices | 210 // allocate vertices |
212 size_t vertexStride = flushInfo.fGeometryProcessor->getVertexStride(); | 211 size_t vertexStride = flushInfo.fGeometryProcessor->getVertexStride(); |
213 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor)); | 212 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor)); |
214 | 213 |
215 const GrBuffer* vertexBuffer; | 214 const GrBuffer* vertexBuffer; |
216 void* vertices = target->makeVertexSpace(vertexStride, | 215 void* vertices = target->makeVertexSpace(vertexStride, |
217 kVerticesPerQuad * instanceCoun
t, | 216 kVerticesPerQuad * instanceCoun
t, |
218 &vertexBuffer, | 217 &vertexBuffer, |
219 &flushInfo.fVertexOffset); | 218 &flushInfo.fVertexOffset); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 vertexStride); | 476 vertexStride); |
478 } | 477 } |
479 | 478 |
480 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { | 479 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { |
481 GrMesh mesh; | 480 GrMesh mesh; |
482 int maxInstancesPerDraw = | 481 int maxInstancesPerDraw = |
483 static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(u
int16_t) / 6); | 482 static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(u
int16_t) / 6); |
484 mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer, | 483 mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer, |
485 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, | 484 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, |
486 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); | 485 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); |
487 target->draw(flushInfo->fGeometryProcessor, mesh); | 486 target->draw(flushInfo->fGeometryProcessor.get(), mesh); |
488 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl
ush; | 487 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl
ush; |
489 flushInfo->fInstancesToFlush = 0; | 488 flushInfo->fInstancesToFlush = 0; |
490 } | 489 } |
491 | 490 |
492 GrColor color() const { return fGeoData[0].fColor; } | 491 GrColor color() const { return fGeoData[0].fColor; } |
493 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; } | 492 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; } |
494 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 493 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
495 | 494 |
496 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 495 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
497 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); | 496 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 geometry.fGenID = random->nextU(); | 645 geometry.fGenID = random->nextU(); |
647 | 646 |
648 return AADistanceFieldPathBatch::Create(geometry, viewMatrix, | 647 return AADistanceFieldPathBatch::Create(geometry, viewMatrix, |
649 gTestStruct.fAtlas, | 648 gTestStruct.fAtlas, |
650 &gTestStruct.fPathCache, | 649 &gTestStruct.fPathCache, |
651 &gTestStruct.fPathList, | 650 &gTestStruct.fPathList, |
652 gammaCorrect); | 651 gammaCorrect); |
653 } | 652 } |
654 | 653 |
655 #endif | 654 #endif |
OLD | NEW |