OLD | NEW |
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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 } | 170 } |
171 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 171 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
172 | 172 |
173 // setup batch properties | 173 // setup batch properties |
174 fBatch.fColorIgnored = !overrides.readsColor(); | 174 fBatch.fColorIgnored = !overrides.readsColor(); |
175 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 175 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
176 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 176 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
177 } | 177 } |
178 | 178 |
179 struct FlushInfo { | 179 struct FlushInfo { |
180 SkAutoTUnref<const GrBuffer> fVertexBuffer; | 180 SkAutoTUnref<const GrBuffer> fVertexBuffer; |
181 SkAutoTUnref<const GrBuffer> fIndexBuffer; | 181 SkAutoTUnref<const GrBuffer> fIndexBuffer; |
| 182 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; |
182 int fVertexOffset; | 183 int fVertexOffset; |
183 int fInstancesToFlush; | 184 int fInstancesToFlush; |
184 }; | 185 }; |
185 | 186 |
186 void onPrepareDraws(Target* target) const override { | 187 void onPrepareDraws(Target* target) const override { |
187 int instanceCount = fGeoData.count(); | 188 int instanceCount = fGeoData.count(); |
188 | 189 |
189 SkMatrix invert; | 190 SkMatrix invert; |
190 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) { | 191 if (this->usesLocalCoords() && !this->viewMatrix().invert(&invert)) { |
191 SkDebugf("Could not invert viewmatrix\n"); | 192 SkDebugf("Could not invert viewmatrix\n"); |
192 return; | 193 return; |
193 } | 194 } |
194 | 195 |
195 const SkMatrix& ctm = this->viewMatrix(); | 196 const SkMatrix& ctm = this->viewMatrix(); |
196 uint32_t flags = 0; | 197 uint32_t flags = 0; |
197 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0
; | 198 flags |= ctm.isScaleTranslate() ? kScaleOnly_DistanceFieldEffectFlag : 0
; |
198 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; | 199 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; |
199 | 200 |
200 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil
erp_FilterMode); | 201 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil
erp_FilterMode); |
201 | 202 |
| 203 FlushInfo flushInfo; |
| 204 |
202 // Setup GrGeometryProcessor | 205 // Setup GrGeometryProcessor |
203 GrBatchAtlas* atlas = fAtlas; | 206 GrBatchAtlas* atlas = fAtlas; |
204 SkAutoTUnref<GrGeometryProcessor> dfProcessor( | 207 flushInfo.fGeometryProcessor.reset( |
205 GrDistanceFieldPathGeoProc::Create(this->color(), | 208 GrDistanceFieldPathGeoProc::Create(this->color(), |
206 this->viewMatrix(), | 209 this->viewMatrix(), |
207 atlas->getTexture(), | 210 atlas->getTexture(), |
208 params, | 211 params, |
209 flags, | 212 flags, |
210 this->usesLocalCoords())); | 213 this->usesLocalCoords())); |
211 | 214 |
212 target->initDraw(dfProcessor); | |
213 | |
214 FlushInfo flushInfo; | |
215 | |
216 // allocate vertices | 215 // allocate vertices |
217 size_t vertexStride = dfProcessor->getVertexStride(); | 216 size_t vertexStride = flushInfo.fGeometryProcessor->getVertexStride(); |
218 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor)); | 217 SkASSERT(vertexStride == 2 * sizeof(SkPoint) + sizeof(GrColor)); |
219 | 218 |
220 const GrBuffer* vertexBuffer; | 219 const GrBuffer* vertexBuffer; |
221 void* vertices = target->makeVertexSpace(vertexStride, | 220 void* vertices = target->makeVertexSpace(vertexStride, |
222 kVerticesPerQuad * instanceCoun
t, | 221 kVerticesPerQuad * instanceCoun
t, |
223 &vertexBuffer, | 222 &vertexBuffer, |
224 &flushInfo.fVertexOffset); | 223 &flushInfo.fVertexOffset); |
225 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); | 224 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); |
226 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf
fer()); | 225 flushInfo.fIndexBuffer.reset(target->resourceProvider()->refQuadIndexBuf
fer()); |
227 if (!vertices || !flushInfo.fIndexBuffer) { | 226 if (!vertices || !flushInfo.fIndexBuffer) { |
(...skipping 25 matching lines...) Expand all Loading... |
253 if (nullptr == pathData || !atlas->hasID(pathData->fID)) { | 252 if (nullptr == pathData || !atlas->hasID(pathData->fID)) { |
254 // Remove the stale cache entry | 253 // Remove the stale cache entry |
255 if (pathData) { | 254 if (pathData) { |
256 fPathCache->remove(pathData->fKey); | 255 fPathCache->remove(pathData->fKey); |
257 fPathList->remove(pathData); | 256 fPathList->remove(pathData); |
258 delete pathData; | 257 delete pathData; |
259 } | 258 } |
260 SkScalar scale = desiredDimension/maxDim; | 259 SkScalar scale = desiredDimension/maxDim; |
261 pathData = new PathData; | 260 pathData = new PathData; |
262 if (!this->addPathToAtlas(target, | 261 if (!this->addPathToAtlas(target, |
263 dfProcessor, | |
264 this->pipeline(), | |
265 &flushInfo, | 262 &flushInfo, |
266 atlas, | 263 atlas, |
267 pathData, | 264 pathData, |
268 args.fPath, | 265 args.fPath, |
269 args.fGenID, | 266 args.fGenID, |
270 args.fStroke, | 267 args.fStroke, |
271 args.fAntiAlias, | 268 args.fAntiAlias, |
272 desiredDimension, | 269 desiredDimension, |
273 scale)) { | 270 scale)) { |
274 SkDebugf("Can't rasterize path\n"); | 271 SkDebugf("Can't rasterize path\n"); |
275 return; | 272 return; |
276 } | 273 } |
277 } | 274 } |
278 | 275 |
279 atlas->setLastUseToken(pathData->fID, target->currentToken()); | 276 atlas->setLastUseToken(pathData->fID, target->nextDrawToken()); |
280 | 277 |
281 // Now set vertices | 278 // Now set vertices |
282 intptr_t offset = reinterpret_cast<intptr_t>(vertices); | 279 intptr_t offset = reinterpret_cast<intptr_t>(vertices); |
283 offset += i * kVerticesPerQuad * vertexStride; | 280 offset += i * kVerticesPerQuad * vertexStride; |
284 this->writePathVertices(target, | 281 this->writePathVertices(target, |
285 atlas, | 282 atlas, |
286 this->pipeline(), | |
287 dfProcessor, | |
288 offset, | 283 offset, |
289 args.fColor, | 284 args.fColor, |
290 vertexStride, | 285 vertexStride, |
291 this->viewMatrix(), | 286 this->viewMatrix(), |
292 args.fPath, | 287 args.fPath, |
293 pathData); | 288 pathData); |
294 flushInfo.fInstancesToFlush++; | 289 flushInfo.fInstancesToFlush++; |
295 } | 290 } |
296 | 291 |
297 this->flush(target, &flushInfo); | 292 this->flush(target, &flushInfo); |
(...skipping 12 matching lines...) Expand all Loading... |
310 fAtlas = atlas; | 305 fAtlas = atlas; |
311 fPathCache = pathCache; | 306 fPathCache = pathCache; |
312 fPathList = pathList; | 307 fPathList = pathList; |
313 | 308 |
314 // Compute bounds | 309 // Compute bounds |
315 fBounds = geometry.fPath.getBounds(); | 310 fBounds = geometry.fPath.getBounds(); |
316 viewMatrix.mapRect(&fBounds); | 311 viewMatrix.mapRect(&fBounds); |
317 } | 312 } |
318 | 313 |
319 bool addPathToAtlas(GrVertexBatch::Target* target, | 314 bool addPathToAtlas(GrVertexBatch::Target* target, |
320 const GrGeometryProcessor* dfProcessor, | |
321 const GrPipeline* pipeline, | |
322 FlushInfo* flushInfo, | 315 FlushInfo* flushInfo, |
323 GrBatchAtlas* atlas, | 316 GrBatchAtlas* atlas, |
324 PathData* pathData, | 317 PathData* pathData, |
325 const SkPath& path, | 318 const SkPath& path, |
326 uint32_t genID, | 319 uint32_t genID, |
327 const SkStrokeRec& stroke, | 320 const SkStrokeRec& stroke, |
328 bool antiAlias, | 321 bool antiAlias, |
329 uint32_t dimension, | 322 uint32_t dimension, |
330 SkScalar scale) const { | 323 SkScalar scale) const { |
331 const SkRect& bounds = path.getBounds(); | 324 const SkRect& bounds = path.getBounds(); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 (const unsigned char*)dst.addr(), | 393 (const unsigned char*)dst.addr(), |
401 dst.width(), dst.height(), dst.rowByt
es()); | 394 dst.width(), dst.height(), dst.rowByt
es()); |
402 | 395 |
403 // add to atlas | 396 // add to atlas |
404 SkIPoint16 atlasLocation; | 397 SkIPoint16 atlasLocation; |
405 GrBatchAtlas::AtlasID id; | 398 GrBatchAtlas::AtlasID id; |
406 bool success = atlas->addToAtlas(&id, target, width, height, dfStorage.g
et(), | 399 bool success = atlas->addToAtlas(&id, target, width, height, dfStorage.g
et(), |
407 &atlasLocation); | 400 &atlasLocation); |
408 if (!success) { | 401 if (!success) { |
409 this->flush(target, flushInfo); | 402 this->flush(target, flushInfo); |
410 target->initDraw(dfProcessor); | |
411 | 403 |
412 SkDEBUGCODE(success =) atlas->addToAtlas(&id, target, width, height, | 404 SkDEBUGCODE(success =) atlas->addToAtlas(&id, target, width, height, |
413 dfStorage.get(), &atlasLoca
tion); | 405 dfStorage.get(), &atlasLoca
tion); |
414 SkASSERT(success); | 406 SkASSERT(success); |
415 | 407 |
416 } | 408 } |
417 | 409 |
418 // add to cache | 410 // add to cache |
419 pathData->fKey = PathData::Key(genID, dimension, stroke); | 411 pathData->fKey = PathData::Key(genID, dimension, stroke); |
420 pathData->fScale = scale; | 412 pathData->fScale = scale; |
(...skipping 16 matching lines...) Expand all Loading... |
437 fPathCache->add(pathData); | 429 fPathCache->add(pathData); |
438 fPathList->addToTail(pathData); | 430 fPathList->addToTail(pathData); |
439 #ifdef DF_PATH_TRACKING | 431 #ifdef DF_PATH_TRACKING |
440 ++g_NumCachedPaths; | 432 ++g_NumCachedPaths; |
441 #endif | 433 #endif |
442 return true; | 434 return true; |
443 } | 435 } |
444 | 436 |
445 void writePathVertices(GrDrawBatch::Target* target, | 437 void writePathVertices(GrDrawBatch::Target* target, |
446 GrBatchAtlas* atlas, | 438 GrBatchAtlas* atlas, |
447 const GrPipeline* pipeline, | |
448 const GrGeometryProcessor* gp, | |
449 intptr_t offset, | 439 intptr_t offset, |
450 GrColor color, | 440 GrColor color, |
451 size_t vertexStride, | 441 size_t vertexStride, |
452 const SkMatrix& viewMatrix, | 442 const SkMatrix& viewMatrix, |
453 const SkPath& path, | 443 const SkPath& path, |
454 const PathData* pathData) const { | 444 const PathData* pathData) const { |
455 GrTexture* texture = atlas->getTexture(); | 445 GrTexture* texture = atlas->getTexture(); |
456 | 446 |
457 SkScalar dx = pathData->fBounds.fLeft; | 447 SkScalar dx = pathData->fBounds.fLeft; |
458 SkScalar dy = pathData->fBounds.fTop; | 448 SkScalar dy = pathData->fBounds.fTop; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 vertexStride); | 480 vertexStride); |
491 } | 481 } |
492 | 482 |
493 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { | 483 void flush(GrVertexBatch::Target* target, FlushInfo* flushInfo) const { |
494 GrMesh mesh; | 484 GrMesh mesh; |
495 int maxInstancesPerDraw = | 485 int maxInstancesPerDraw = |
496 static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(u
int16_t) / 6); | 486 static_cast<int>(flushInfo->fIndexBuffer->gpuMemorySize() / sizeof(u
int16_t) / 6); |
497 mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer, | 487 mesh.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer, |
498 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, | 488 flushInfo->fIndexBuffer, flushInfo->fVertexOffset, kVerticesPerQuad, |
499 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); | 489 kIndicesPerQuad, flushInfo->fInstancesToFlush, maxInstancesPerDraw); |
500 target->draw(mesh); | 490 target->draw(flushInfo->fGeometryProcessor, mesh); |
501 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl
ush; | 491 flushInfo->fVertexOffset += kVerticesPerQuad * flushInfo->fInstancesToFl
ush; |
502 flushInfo->fInstancesToFlush = 0; | 492 flushInfo->fInstancesToFlush = 0; |
503 } | 493 } |
504 | 494 |
505 GrColor color() const { return fGeoData[0].fColor; } | 495 GrColor color() const { return fGeoData[0].fColor; } |
506 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; } | 496 const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; } |
507 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 497 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
508 | 498 |
509 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 499 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
510 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); | 500 AADistanceFieldPathBatch* that = t->cast<AADistanceFieldPathBatch>(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 geometry.fAntiAlias = random->nextBool(); | 638 geometry.fAntiAlias = random->nextBool(); |
649 geometry.fGenID = random->nextU(); | 639 geometry.fGenID = random->nextU(); |
650 | 640 |
651 return AADistanceFieldPathBatch::Create(geometry, viewMatrix, | 641 return AADistanceFieldPathBatch::Create(geometry, viewMatrix, |
652 gTestStruct.fAtlas, | 642 gTestStruct.fAtlas, |
653 &gTestStruct.fPathCache, | 643 &gTestStruct.fPathCache, |
654 &gTestStruct.fPathList); | 644 &gTestStruct.fPathList); |
655 } | 645 } |
656 | 646 |
657 #endif | 647 #endif |
OLD | NEW |