OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 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 | 9 |
10 | 10 |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 | 300 |
301 this->geometrySourceWillPop(fGeoSrcStateStack.fromBack(1)); | 301 this->geometrySourceWillPop(fGeoSrcStateStack.fromBack(1)); |
302 this->releasePreviousVertexSource(); | 302 this->releasePreviousVertexSource(); |
303 this->releasePreviousIndexSource(); | 303 this->releasePreviousIndexSource(); |
304 fGeoSrcStateStack.pop_back(); | 304 fGeoSrcStateStack.pop_back(); |
305 } | 305 } |
306 | 306 |
307 //////////////////////////////////////////////////////////////////////////////// | 307 //////////////////////////////////////////////////////////////////////////////// |
308 | 308 |
309 bool GrDrawTarget::checkDraw(const GrDrawState& drawState, | 309 bool GrDrawTarget::checkDraw(const GrDrawState& drawState, |
310 const GrGeometryProcessor* gp, | |
311 GrPrimitiveType type, | 310 GrPrimitiveType type, |
312 int startVertex, | 311 int startVertex, |
313 int startIndex, | 312 int startIndex, |
314 int vertexCount, | 313 int vertexCount, |
315 int indexCount) const { | 314 int indexCount) const { |
316 #ifdef SK_DEBUG | 315 #ifdef SK_DEBUG |
317 const GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); | 316 const GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
318 int maxVertex = startVertex + vertexCount; | 317 int maxVertex = startVertex + vertexCount; |
319 int maxValidVertex; | 318 int maxValidVertex; |
320 switch (geoSrc.fVertexSrc) { | 319 switch (geoSrc.fVertexSrc) { |
(...skipping 22 matching lines...) Expand all Loading... |
343 maxValidIndex = static_cast<int>(geoSrc.fIndexBuffer->gpuMemoryS
ize() / sizeof(uint16_t)); | 342 maxValidIndex = static_cast<int>(geoSrc.fIndexBuffer->gpuMemoryS
ize() / sizeof(uint16_t)); |
344 break; | 343 break; |
345 } | 344 } |
346 if (maxIndex > maxValidIndex) { | 345 if (maxIndex > maxValidIndex) { |
347 SkFAIL("Index reads outside valid index range."); | 346 SkFAIL("Index reads outside valid index range."); |
348 } | 347 } |
349 } | 348 } |
350 | 349 |
351 SkASSERT(drawState.getRenderTarget()); | 350 SkASSERT(drawState.getRenderTarget()); |
352 | 351 |
353 if (gp) { | 352 if (drawState.hasGeometryProcessor()) { |
| 353 const GrGeometryProcessor* gp = drawState.getGeometryProcessor(); |
354 int numTextures = gp->numTextures(); | 354 int numTextures = gp->numTextures(); |
355 for (int t = 0; t < numTextures; ++t) { | 355 for (int t = 0; t < numTextures; ++t) { |
356 GrTexture* texture = gp->texture(t); | 356 GrTexture* texture = gp->texture(t); |
357 SkASSERT(texture->asRenderTarget() != drawState.getRenderTarget()); | 357 SkASSERT(texture->asRenderTarget() != drawState.getRenderTarget()); |
358 } | 358 } |
359 } | 359 } |
360 | 360 |
361 for (int s = 0; s < drawState.numColorStages(); ++s) { | 361 for (int s = 0; s < drawState.numColorStages(); ++s) { |
362 const GrProcessor* effect = drawState.getColorStage(s).getProcessor(); | 362 const GrProcessor* effect = drawState.getColorStage(s).getProcessor(); |
363 int numTextures = effect->numTextures(); | 363 int numTextures = effect->numTextures(); |
(...skipping 12 matching lines...) Expand all Loading... |
376 } | 376 } |
377 | 377 |
378 #endif | 378 #endif |
379 if (NULL == drawState.getRenderTarget()) { | 379 if (NULL == drawState.getRenderTarget()) { |
380 return false; | 380 return false; |
381 } | 381 } |
382 return true; | 382 return true; |
383 } | 383 } |
384 | 384 |
385 bool GrDrawTarget::setupDstReadIfNecessary(GrDrawState* ds, | 385 bool GrDrawTarget::setupDstReadIfNecessary(GrDrawState* ds, |
386 const GrPrimitiveProcessor* primProc, | 386 GrColor color, |
| 387 uint8_t coverage, |
387 GrDeviceCoordTexture* dstCopy, | 388 GrDeviceCoordTexture* dstCopy, |
388 const SkRect* drawBounds) { | 389 const SkRect* drawBounds) { |
389 if (this->caps()->dstReadInShaderSupport() || !ds->willEffectReadDstColor(pr
imProc)) { | 390 GrColor c = GrColorPackRGBA(coverage, coverage, coverage, coverage); |
| 391 if (this->caps()->dstReadInShaderSupport() || !ds->willEffectReadDstColor(co
lor, c)) { |
390 return true; | 392 return true; |
391 } | 393 } |
392 SkIRect copyRect; | 394 SkIRect copyRect; |
393 const GrClipData* clip = this->getClip(); | 395 const GrClipData* clip = this->getClip(); |
394 GrRenderTarget* rt = ds->getRenderTarget(); | 396 GrRenderTarget* rt = ds->getRenderTarget(); |
395 clip->getConservativeBounds(rt, ©Rect); | 397 clip->getConservativeBounds(rt, ©Rect); |
396 | 398 |
397 if (drawBounds) { | 399 if (drawBounds) { |
398 SkIRect drawIBounds; | 400 SkIRect drawIBounds; |
399 drawBounds->roundOut(&drawIBounds); | 401 drawBounds->roundOut(&drawIBounds); |
(...skipping 27 matching lines...) Expand all Loading... |
427 if (this->copySurface(copy, rt, copyRect, dstPoint)) { | 429 if (this->copySurface(copy, rt, copyRect, dstPoint)) { |
428 dstCopy->setTexture(copy); | 430 dstCopy->setTexture(copy); |
429 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); | 431 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); |
430 return true; | 432 return true; |
431 } else { | 433 } else { |
432 return false; | 434 return false; |
433 } | 435 } |
434 } | 436 } |
435 | 437 |
436 void GrDrawTarget::drawIndexed(GrDrawState* ds, | 438 void GrDrawTarget::drawIndexed(GrDrawState* ds, |
437 const GrGeometryProcessor* gp, | |
438 GrPrimitiveType type, | 439 GrPrimitiveType type, |
439 int startVertex, | 440 int startVertex, |
440 int startIndex, | 441 int startIndex, |
441 int vertexCount, | 442 int vertexCount, |
442 int indexCount, | 443 int indexCount, |
443 const SkRect* devBounds) { | 444 const SkRect* devBounds) { |
444 SkASSERT(ds); | 445 SkASSERT(ds); |
445 if (indexCount > 0 && | 446 if (indexCount > 0 && |
446 this->checkDraw(*ds, gp, type, startVertex, startIndex, vertexCount, ind
exCount)) { | 447 this->checkDraw(*ds, type, startVertex, startIndex, vertexCount, indexCo
unt)) { |
447 | 448 |
448 // Setup clip | 449 // Setup clip |
449 GrClipMaskManager::ScissorState scissorState; | 450 GrClipMaskManager::ScissorState scissorState; |
450 GrDrawState::AutoRestoreEffects are; | 451 GrDrawState::AutoRestoreEffects are; |
451 GrDrawState::AutoRestoreStencil ars; | 452 GrDrawState::AutoRestoreStencil ars; |
452 if (!this->setupClip(devBounds, &are, &ars, ds, &scissorState)) { | 453 if (!this->setupClip(devBounds, &are, &ars, ds, &scissorState)) { |
453 return; | 454 return; |
454 } | 455 } |
455 | 456 |
456 DrawInfo info; | 457 DrawInfo info; |
457 info.fPrimitiveType = type; | 458 info.fPrimitiveType = type; |
458 info.fStartVertex = startVertex; | 459 info.fStartVertex = startVertex; |
459 info.fStartIndex = startIndex; | 460 info.fStartIndex = startIndex; |
460 info.fVertexCount = vertexCount; | 461 info.fVertexCount = vertexCount; |
461 info.fIndexCount = indexCount; | 462 info.fIndexCount = indexCount; |
462 | 463 |
463 info.fInstanceCount = 0; | 464 info.fInstanceCount = 0; |
464 info.fVerticesPerInstance = 0; | 465 info.fVerticesPerInstance = 0; |
465 info.fIndicesPerInstance = 0; | 466 info.fIndicesPerInstance = 0; |
466 | 467 |
467 if (devBounds) { | 468 if (devBounds) { |
468 info.setDevBounds(*devBounds); | 469 info.setDevBounds(*devBounds); |
469 } | 470 } |
470 | 471 |
471 // TODO: We should continue with incorrect blending. | 472 // TODO: We should continue with incorrect blending. |
472 GrDeviceCoordTexture dstCopy; | 473 GrDeviceCoordTexture dstCopy; |
473 if (!this->setupDstReadIfNecessary(ds, gp, &dstCopy, devBounds)) { | 474 const GrGeometryProcessor* gp = ds->getGeometryProcessor(); |
| 475 if (!this->setupDstReadIfNecessary(ds, gp->getColor(), gp->getCoverage()
, &dstCopy, |
| 476 devBounds)) { |
474 return; | 477 return; |
475 } | 478 } |
476 this->setDrawBuffers(&info, gp->getVertexStride()); | 479 this->setDrawBuffers(&info, gp->getVertexStride()); |
477 | 480 |
478 this->onDraw(*ds, gp, info, scissorState, dstCopy.texture() ? &dstCopy :
NULL); | 481 this->onDraw(*ds, info, scissorState, dstCopy.texture() ? &dstCopy : NUL
L); |
479 } | 482 } |
480 } | 483 } |
481 | 484 |
482 void GrDrawTarget::drawNonIndexed(GrDrawState* ds, | 485 void GrDrawTarget::drawNonIndexed(GrDrawState* ds, |
483 const GrGeometryProcessor* gp, | |
484 GrPrimitiveType type, | 486 GrPrimitiveType type, |
485 int startVertex, | 487 int startVertex, |
486 int vertexCount, | 488 int vertexCount, |
487 const SkRect* devBounds) { | 489 const SkRect* devBounds) { |
488 SkASSERT(ds); | 490 SkASSERT(ds); |
489 if (vertexCount > 0 && this->checkDraw(*ds, gp, type, startVertex, -1, verte
xCount, -1)) { | 491 if (vertexCount > 0 && this->checkDraw(*ds, type, startVertex, -1, vertexCou
nt, -1)) { |
490 | 492 |
491 // Setup clip | 493 // Setup clip |
492 GrClipMaskManager::ScissorState scissorState; | 494 GrClipMaskManager::ScissorState scissorState; |
493 GrDrawState::AutoRestoreEffects are; | 495 GrDrawState::AutoRestoreEffects are; |
494 GrDrawState::AutoRestoreStencil ars; | 496 GrDrawState::AutoRestoreStencil ars; |
495 if (!this->setupClip(devBounds, &are, &ars, ds, &scissorState)) { | 497 if (!this->setupClip(devBounds, &are, &ars, ds, &scissorState)) { |
496 return; | 498 return; |
497 } | 499 } |
498 | 500 |
499 DrawInfo info; | 501 DrawInfo info; |
500 info.fPrimitiveType = type; | 502 info.fPrimitiveType = type; |
501 info.fStartVertex = startVertex; | 503 info.fStartVertex = startVertex; |
502 info.fStartIndex = 0; | 504 info.fStartIndex = 0; |
503 info.fVertexCount = vertexCount; | 505 info.fVertexCount = vertexCount; |
504 info.fIndexCount = 0; | 506 info.fIndexCount = 0; |
505 | 507 |
506 info.fInstanceCount = 0; | 508 info.fInstanceCount = 0; |
507 info.fVerticesPerInstance = 0; | 509 info.fVerticesPerInstance = 0; |
508 info.fIndicesPerInstance = 0; | 510 info.fIndicesPerInstance = 0; |
509 | 511 |
510 if (devBounds) { | 512 if (devBounds) { |
511 info.setDevBounds(*devBounds); | 513 info.setDevBounds(*devBounds); |
512 } | 514 } |
513 | 515 |
514 // TODO: We should continue with incorrect blending. | 516 // TODO: We should continue with incorrect blending. |
515 GrDeviceCoordTexture dstCopy; | 517 GrDeviceCoordTexture dstCopy; |
516 if (!this->setupDstReadIfNecessary(ds, gp, &dstCopy, devBounds)) { | 518 const GrGeometryProcessor* gp = ds->getGeometryProcessor(); |
| 519 if (!this->setupDstReadIfNecessary(ds, gp->getColor(), gp->getCoverage()
, &dstCopy, |
| 520 devBounds)) { |
517 return; | 521 return; |
518 } | 522 } |
519 | 523 |
520 this->setDrawBuffers(&info, gp->getVertexStride()); | 524 this->setDrawBuffers(&info, gp->getVertexStride()); |
521 | 525 |
522 this->onDraw(*ds, gp, info, scissorState, dstCopy.texture() ? &dstCopy :
NULL); | 526 this->onDraw(*ds, info, scissorState, dstCopy.texture() ? &dstCopy : NUL
L); |
523 } | 527 } |
524 } | 528 } |
525 | 529 |
526 static const GrStencilSettings& winding_path_stencil_settings() { | 530 static const GrStencilSettings& winding_path_stencil_settings() { |
527 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | 531 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, |
528 kIncClamp_StencilOp, | 532 kIncClamp_StencilOp, |
529 kIncClamp_StencilOp, | 533 kIncClamp_StencilOp, |
530 kAlwaysIfInClip_StencilFunc, | 534 kAlwaysIfInClip_StencilFunc, |
531 0xFFFF, 0xFFFF, 0xFFFF); | 535 0xFFFF, 0xFFFF, 0xFFFF); |
532 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | 536 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
(...skipping 19 matching lines...) Expand all Loading... |
552 *outStencilSettings = winding_path_stencil_settings(); | 556 *outStencilSettings = winding_path_stencil_settings(); |
553 break; | 557 break; |
554 case GrPathRendering::kEvenOdd_FillType: | 558 case GrPathRendering::kEvenOdd_FillType: |
555 *outStencilSettings = even_odd_path_stencil_settings(); | 559 *outStencilSettings = even_odd_path_stencil_settings(); |
556 break; | 560 break; |
557 } | 561 } |
558 this->clipMaskManager()->adjustPathStencilParams(sb, outStencilSettings); | 562 this->clipMaskManager()->adjustPathStencilParams(sb, outStencilSettings); |
559 } | 563 } |
560 | 564 |
561 void GrDrawTarget::stencilPath(GrDrawState* ds, | 565 void GrDrawTarget::stencilPath(GrDrawState* ds, |
562 const GrPathProcessor* pathProc, | |
563 const GrPath* path, | 566 const GrPath* path, |
564 GrPathRendering::FillType fill) { | 567 GrPathRendering::FillType fill) { |
565 // TODO: extract portions of checkDraw that are relevant to path stenciling. | 568 // TODO: extract portions of checkDraw that are relevant to path stenciling. |
566 SkASSERT(path); | 569 SkASSERT(path); |
567 SkASSERT(this->caps()->pathRenderingSupport()); | 570 SkASSERT(this->caps()->pathRenderingSupport()); |
568 SkASSERT(ds); | 571 SkASSERT(ds); |
569 | 572 |
570 // Setup clip | 573 // Setup clip |
571 GrClipMaskManager::ScissorState scissorState; | 574 GrClipMaskManager::ScissorState scissorState; |
572 GrDrawState::AutoRestoreEffects are; | 575 GrDrawState::AutoRestoreEffects are; |
573 GrDrawState::AutoRestoreStencil ars; | 576 GrDrawState::AutoRestoreStencil ars; |
574 if (!this->setupClip(NULL, &are, &ars, ds, &scissorState)) { | 577 if (!this->setupClip(NULL, &are, &ars, ds, &scissorState)) { |
575 return; | 578 return; |
576 } | 579 } |
577 | 580 |
578 // set stencil settings for path | 581 // set stencil settings for path |
579 GrStencilSettings stencilSettings; | 582 GrStencilSettings stencilSettings; |
580 this->getPathStencilSettingsForFilltype(fill, | 583 this->getPathStencilSettingsForFilltype(fill, |
581 ds->getRenderTarget()->getStencilBuf
fer(), | 584 ds->getRenderTarget()->getStencilBuf
fer(), |
582 &stencilSettings); | 585 &stencilSettings); |
583 | 586 |
584 this->onStencilPath(*ds, pathProc, path, scissorState, stencilSettings); | 587 this->onStencilPath(*ds, path, scissorState, stencilSettings); |
585 } | 588 } |
586 | 589 |
587 void GrDrawTarget::drawPath(GrDrawState* ds, | 590 void GrDrawTarget::drawPath(GrDrawState* ds, |
588 const GrPathProcessor* pathProc, | 591 GrColor color, |
589 const GrPath* path, | 592 const GrPath* path, |
590 GrPathRendering::FillType fill) { | 593 GrPathRendering::FillType fill) { |
591 // TODO: extract portions of checkDraw that are relevant to path rendering. | 594 // TODO: extract portions of checkDraw that are relevant to path rendering. |
592 SkASSERT(path); | 595 SkASSERT(path); |
593 SkASSERT(this->caps()->pathRenderingSupport()); | 596 SkASSERT(this->caps()->pathRenderingSupport()); |
594 SkASSERT(ds); | 597 SkASSERT(ds); |
595 | 598 |
596 SkRect devBounds = path->getBounds(); | 599 SkRect devBounds = path->getBounds(); |
597 SkMatrix viewM = ds->getViewMatrix(); | 600 SkMatrix viewM = ds->getViewMatrix(); |
598 viewM.mapRect(&devBounds); | 601 viewM.mapRect(&devBounds); |
599 | 602 |
600 // Setup clip | 603 // Setup clip |
601 GrClipMaskManager::ScissorState scissorState; | 604 GrClipMaskManager::ScissorState scissorState; |
602 GrDrawState::AutoRestoreEffects are; | 605 GrDrawState::AutoRestoreEffects are; |
603 GrDrawState::AutoRestoreStencil ars; | 606 GrDrawState::AutoRestoreStencil ars; |
604 if (!this->setupClip(&devBounds, &are, &ars, ds, &scissorState)) { | 607 if (!this->setupClip(&devBounds, &are, &ars, ds, &scissorState)) { |
605 return; | 608 return; |
606 } | 609 } |
607 | 610 |
608 // set stencil settings for path | 611 // set stencil settings for path |
609 GrStencilSettings stencilSettings; | 612 GrStencilSettings stencilSettings; |
610 this->getPathStencilSettingsForFilltype(fill, | 613 this->getPathStencilSettingsForFilltype(fill, |
611 ds->getRenderTarget()->getStencilBuf
fer(), | 614 ds->getRenderTarget()->getStencilBuf
fer(), |
612 &stencilSettings); | 615 &stencilSettings); |
613 | 616 |
614 GrDeviceCoordTexture dstCopy; | 617 GrDeviceCoordTexture dstCopy; |
615 if (!this->setupDstReadIfNecessary(ds, pathProc, &dstCopy, &devBounds)) { | 618 if (!this->setupDstReadIfNecessary(ds, color, 0xff, &dstCopy, &devBounds)) { |
616 return; | 619 return; |
617 } | 620 } |
618 | 621 |
619 this->onDrawPath(*ds, pathProc, path, scissorState, stencilSettings, dstCopy
.texture() ? &dstCopy : | 622 this->onDrawPath(*ds, color, path, scissorState, stencilSettings, dstCopy.te
xture() ? &dstCopy : |
620
NULL); | 623
NULL); |
621 } | 624 } |
622 | 625 |
623 void GrDrawTarget::drawPaths(GrDrawState* ds, | 626 void GrDrawTarget::drawPaths(GrDrawState* ds, |
624 const GrPathProcessor* pathProc, | 627 GrColor color, |
625 const GrPathRange* pathRange, | 628 const GrPathRange* pathRange, |
626 const void* indices, | 629 const void* indices, |
627 PathIndexType indexType, | 630 PathIndexType indexType, |
628 const float transformValues[], | 631 const float transformValues[], |
629 PathTransformType transformType, | 632 PathTransformType transformType, |
630 int count, | 633 int count, |
631 GrPathRendering::FillType fill) { | 634 GrPathRendering::FillType fill) { |
632 SkASSERT(this->caps()->pathRenderingSupport()); | 635 SkASSERT(this->caps()->pathRenderingSupport()); |
633 SkASSERT(pathRange); | 636 SkASSERT(pathRange); |
634 SkASSERT(indices); | 637 SkASSERT(indices); |
(...skipping 14 matching lines...) Expand all Loading... |
649 GrStencilSettings stencilSettings; | 652 GrStencilSettings stencilSettings; |
650 this->getPathStencilSettingsForFilltype(fill, | 653 this->getPathStencilSettingsForFilltype(fill, |
651 ds->getRenderTarget()->getStencilBuf
fer(), | 654 ds->getRenderTarget()->getStencilBuf
fer(), |
652 &stencilSettings); | 655 &stencilSettings); |
653 | 656 |
654 // Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt | 657 // Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt |
655 // instead for it to just copy the entire dst. Realistically this is a moot | 658 // instead for it to just copy the entire dst. Realistically this is a moot |
656 // point, because any context that supports NV_path_rendering will also | 659 // point, because any context that supports NV_path_rendering will also |
657 // support NV_blend_equation_advanced. | 660 // support NV_blend_equation_advanced. |
658 GrDeviceCoordTexture dstCopy; | 661 GrDeviceCoordTexture dstCopy; |
659 if (!this->setupDstReadIfNecessary(ds, pathProc, &dstCopy, NULL)) { | 662 if (!this->setupDstReadIfNecessary(ds, color, 0xff, &dstCopy, NULL)) { |
660 return; | 663 return; |
661 } | 664 } |
662 | 665 |
663 this->onDrawPaths(*ds, pathProc, pathRange, indices, indexType, transformVal
ues, transformType, | 666 this->onDrawPaths(*ds, color, pathRange, indices, indexType, transformValues
, transformType, |
664 count, scissorState, stencilSettings, dstCopy.texture() ?
&dstCopy : NULL); | 667 count, scissorState, stencilSettings, dstCopy.texture() ?
&dstCopy : NULL); |
665 } | 668 } |
666 | 669 |
667 void GrDrawTarget::clear(const SkIRect* rect, | 670 void GrDrawTarget::clear(const SkIRect* rect, |
668 GrColor color, | 671 GrColor color, |
669 bool canIgnoreRect, | 672 bool canIgnoreRect, |
670 GrRenderTarget* renderTarget) { | 673 GrRenderTarget* renderTarget) { |
671 if (fCaps->useDrawInsteadOfClear()) { | 674 if (fCaps->useDrawInsteadOfClear()) { |
672 // This works around a driver bug with clear by drawing a rect instead. | 675 // This works around a driver bug with clear by drawing a rect instead. |
673 // The driver will ignore a clear if it is the only thing rendered to a | 676 // The driver will ignore a clear if it is the only thing rendered to a |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 if (this->caps()->gpuTracingSupport()) { | 726 if (this->caps()->gpuTracingSupport()) { |
724 SkASSERT(fGpuTraceMarkerCount >= 1); | 727 SkASSERT(fGpuTraceMarkerCount >= 1); |
725 this->fActiveTraceMarkers.remove(*marker); | 728 this->fActiveTraceMarkers.remove(*marker); |
726 --fGpuTraceMarkerCount; | 729 --fGpuTraceMarkerCount; |
727 } | 730 } |
728 } | 731 } |
729 | 732 |
730 //////////////////////////////////////////////////////////////////////////////// | 733 //////////////////////////////////////////////////////////////////////////////// |
731 | 734 |
732 void GrDrawTarget::drawIndexedInstances(GrDrawState* ds, | 735 void GrDrawTarget::drawIndexedInstances(GrDrawState* ds, |
733 const GrGeometryProcessor* gp, | |
734 GrPrimitiveType type, | 736 GrPrimitiveType type, |
735 int instanceCount, | 737 int instanceCount, |
736 int verticesPerInstance, | 738 int verticesPerInstance, |
737 int indicesPerInstance, | 739 int indicesPerInstance, |
738 const SkRect* devBounds) { | 740 const SkRect* devBounds) { |
739 SkASSERT(ds); | 741 SkASSERT(ds); |
740 | 742 |
741 if (!verticesPerInstance || !indicesPerInstance) { | 743 if (!verticesPerInstance || !indicesPerInstance) { |
742 return; | 744 return; |
743 } | 745 } |
(...skipping 18 matching lines...) Expand all Loading... |
762 info.fIndicesPerInstance = indicesPerInstance; | 764 info.fIndicesPerInstance = indicesPerInstance; |
763 info.fVerticesPerInstance = verticesPerInstance; | 765 info.fVerticesPerInstance = verticesPerInstance; |
764 | 766 |
765 // Set the same bounds for all the draws. | 767 // Set the same bounds for all the draws. |
766 if (devBounds) { | 768 if (devBounds) { |
767 info.setDevBounds(*devBounds); | 769 info.setDevBounds(*devBounds); |
768 } | 770 } |
769 | 771 |
770 // TODO: We should continue with incorrect blending. | 772 // TODO: We should continue with incorrect blending. |
771 GrDeviceCoordTexture dstCopy; | 773 GrDeviceCoordTexture dstCopy; |
772 if (!this->setupDstReadIfNecessary(ds, gp, &dstCopy,devBounds)) { | 774 const GrGeometryProcessor* gp = ds->getGeometryProcessor(); |
| 775 if (!this->setupDstReadIfNecessary(ds, gp->getColor(), gp->getCoverage(), &d
stCopy,devBounds)) { |
773 return; | 776 return; |
774 } | 777 } |
775 | 778 |
776 while (instanceCount) { | 779 while (instanceCount) { |
777 info.fInstanceCount = SkTMin(instanceCount, maxInstancesPerDraw); | 780 info.fInstanceCount = SkTMin(instanceCount, maxInstancesPerDraw); |
778 info.fVertexCount = info.fInstanceCount * verticesPerInstance; | 781 info.fVertexCount = info.fInstanceCount * verticesPerInstance; |
779 info.fIndexCount = info.fInstanceCount * indicesPerInstance; | 782 info.fIndexCount = info.fInstanceCount * indicesPerInstance; |
780 | 783 |
781 if (this->checkDraw(*ds, | 784 if (this->checkDraw(*ds, |
782 gp, | |
783 type, | 785 type, |
784 info.fStartVertex, | 786 info.fStartVertex, |
785 info.fStartIndex, | 787 info.fStartIndex, |
786 info.fVertexCount, | 788 info.fVertexCount, |
787 info.fIndexCount)) { | 789 info.fIndexCount)) { |
788 this->setDrawBuffers(&info, gp->getVertexStride()); | 790 this->setDrawBuffers(&info, gp->getVertexStride()); |
789 this->onDraw(*ds, gp, info, scissorState, dstCopy.texture() ? &dstCo
py : NULL); | 791 this->onDraw(*ds, info, scissorState, dstCopy.texture() ? &dstCopy :
NULL); |
790 } | 792 } |
791 info.fStartVertex += info.fVertexCount; | 793 info.fStartVertex += info.fVertexCount; |
792 instanceCount -= info.fInstanceCount; | 794 instanceCount -= info.fInstanceCount; |
793 } | 795 } |
794 } | 796 } |
795 | 797 |
796 //////////////////////////////////////////////////////////////////////////////// | 798 //////////////////////////////////////////////////////////////////////////////// |
797 | 799 |
798 GrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry( | 800 GrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry( |
799 GrDrawTarget* target, | 801 GrDrawTarget* target, |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1215 GrDrawState::AutoRestoreStencil* ars, | 1217 GrDrawState::AutoRestoreStencil* ars, |
1216 GrDrawState* ds, | 1218 GrDrawState* ds, |
1217 GrClipMaskManager::ScissorState* scissorState) { | 1219 GrClipMaskManager::ScissorState* scissorState) { |
1218 return fClipMaskManager.setupClipping(ds, | 1220 return fClipMaskManager.setupClipping(ds, |
1219 are, | 1221 are, |
1220 ars, | 1222 ars, |
1221 scissorState, | 1223 scissorState, |
1222 this->getClip(), | 1224 this->getClip(), |
1223 devBounds); | 1225 devBounds); |
1224 } | 1226 } |
OLD | NEW |