OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 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 "GrContext.h" | 9 #include "GrContext.h" |
10 | 10 |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 GrSurfaceDesc rtDesc = desc; | 287 GrSurfaceDesc rtDesc = desc; |
288 rtDesc.fFlags = rtDesc.fFlags | | 288 rtDesc.fFlags = rtDesc.fFlags | |
289 kRenderTarget_GrSurfaceFlag | | 289 kRenderTarget_GrSurfaceFlag | |
290 kNoStencil_GrSurfaceFlag; | 290 kNoStencil_GrSurfaceFlag; |
291 rtDesc.fWidth = GrNextPow2(desc.fWidth); | 291 rtDesc.fWidth = GrNextPow2(desc.fWidth); |
292 rtDesc.fHeight = GrNextPow2(desc.fHeight); | 292 rtDesc.fHeight = GrNextPow2(desc.fHeight); |
293 | 293 |
294 GrTexture* texture = fGpu->createTexture(rtDesc, true, NULL, 0); | 294 GrTexture* texture = fGpu->createTexture(rtDesc, true, NULL, 0); |
295 | 295 |
296 if (texture) { | 296 if (texture) { |
297 GrDrawState drawState; | 297 GrPipelineBuilder pipelineBuilder; |
298 drawState.setRenderTarget(texture->asRenderTarget()); | 298 pipelineBuilder.setRenderTarget(texture->asRenderTarget()); |
299 | 299 |
300 // if filtering is not desired then we want to ensure all | 300 // if filtering is not desired then we want to ensure all |
301 // texels in the resampled image are copies of texels from | 301 // texels in the resampled image are copies of texels from |
302 // the original. | 302 // the original. |
303 GrTextureParams params(SkShader::kClamp_TileMode, | 303 GrTextureParams params(SkShader::kClamp_TileMode, |
304 filter ? GrTextureParams::kBilerp_FilterMode : | 304 filter ? GrTextureParams::kBilerp_FilterMode : |
305 GrTextureParams::kNone_FilterMode); | 305 GrTextureParams::kNone_FilterMode); |
306 drawState.addColorTextureProcessor(clampedTexture, SkMatrix::I(), params
); | 306 pipelineBuilder.addColorTextureProcessor(clampedTexture, SkMatrix::I(),
params); |
307 | 307 |
308 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | | 308 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | |
309 GrDefaultGeoProcFactory::kLocalCoord_GPType; | 309 GrDefaultGeoProcFactory::kLocalCoord_GPType; |
310 SkAutoTUnref<const GrGeometryProcessor> gp( | 310 SkAutoTUnref<const GrGeometryProcessor> gp( |
311 GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE)); | 311 GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE)); |
312 | 312 |
313 GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStrid
e(), 0); | 313 GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStrid
e(), 0); |
314 SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint)); | 314 SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint)); |
315 | 315 |
316 if (arg.succeeded()) { | 316 if (arg.succeeded()) { |
317 SkPoint* verts = (SkPoint*) arg.vertices(); | 317 SkPoint* verts = (SkPoint*) arg.vertices(); |
318 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(SkPoint)); | 318 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(SkPoint)); |
319 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint)); | 319 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint)); |
320 fDrawBuffer->drawNonIndexed(&drawState, gp, kTriangleFan_GrPrimitive
Type, 0, 4); | 320 fDrawBuffer->drawNonIndexed(&pipelineBuilder, gp, kTriangleFan_GrPri
mitiveType, 0, 4); |
321 } | 321 } |
322 } else { | 322 } else { |
323 // TODO: Our CPU stretch doesn't filter. But we create separate | 323 // TODO: Our CPU stretch doesn't filter. But we create separate |
324 // stretched textures when the texture params is either filtered or | 324 // stretched textures when the texture params is either filtered or |
325 // not. Either implement filtered stretch blit on CPU or just create | 325 // not. Either implement filtered stretch blit on CPU or just create |
326 // one when FBO case fails. | 326 // one when FBO case fails. |
327 | 327 |
328 rtDesc.fFlags = kNone_GrSurfaceFlags; | 328 rtDesc.fFlags = kNone_GrSurfaceFlags; |
329 // no longer need to clamp at min RT size. | 329 // no longer need to clamp at min RT size. |
330 rtDesc.fWidth = GrNextPow2(desc.fWidth); | 330 rtDesc.fWidth = GrNextPow2(desc.fWidth); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 inverse.mapRect(&r); | 564 inverse.mapRect(&r); |
565 this->drawRect(*paint, viewMatrix, r); | 565 this->drawRect(*paint, viewMatrix, r); |
566 } else { | 566 } else { |
567 SkMatrix localMatrix; | 567 SkMatrix localMatrix; |
568 if (!viewMatrix.invert(&localMatrix)) { | 568 if (!viewMatrix.invert(&localMatrix)) { |
569 SkDebugf("Could not invert matrix\n"); | 569 SkDebugf("Could not invert matrix\n"); |
570 return; | 570 return; |
571 } | 571 } |
572 | 572 |
573 AutoCheckFlush acf(this); | 573 AutoCheckFlush acf(this); |
574 GrDrawState drawState; | 574 GrPipelineBuilder pipelineBuilder; |
575 GrDrawTarget* target = this->prepareToDraw(&drawState, paint, &acf); | 575 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, paint, &acf
); |
576 if (NULL == target) { | 576 if (NULL == target) { |
577 return; | 577 return; |
578 } | 578 } |
579 | 579 |
580 GR_CREATE_TRACE_MARKER("GrContext::drawPaintWithPerspective", target); | 580 GR_CREATE_TRACE_MARKER("GrContext::drawPaintWithPerspective", target); |
581 target->drawRect(&drawState, paint->getColor(), SkMatrix::I(), r, NULL,
&localMatrix); | 581 target->drawRect(&pipelineBuilder, paint->getColor(), SkMatrix::I(), r,
NULL, &localMatrix); |
582 } | 582 } |
583 } | 583 } |
584 | 584 |
585 #ifdef SK_DEVELOPER | 585 #ifdef SK_DEVELOPER |
586 void GrContext::dumpFontCache() const { | 586 void GrContext::dumpFontCache() const { |
587 fFontCache->dump(); | 587 fFontCache->dump(); |
588 } | 588 } |
589 #endif | 589 #endif |
590 | 590 |
591 //////////////////////////////////////////////////////////////////////////////// | 591 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 19 matching lines...) Expand all Loading... |
611 verts[8] = verts[0]; | 611 verts[8] = verts[0]; |
612 verts[9] = verts[1]; | 612 verts[9] = verts[1]; |
613 } | 613 } |
614 | 614 |
615 static inline bool is_irect(const SkRect& r) { | 615 static inline bool is_irect(const SkRect& r) { |
616 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && | 616 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && |
617 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); | 617 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); |
618 } | 618 } |
619 | 619 |
620 static bool apply_aa_to_rect(GrDrawTarget* target, | 620 static bool apply_aa_to_rect(GrDrawTarget* target, |
621 GrDrawState* ds, | 621 GrPipelineBuilder* pipelineBuilder, |
622 SkRect* devBoundRect, | 622 SkRect* devBoundRect, |
623 const SkRect& rect, | 623 const SkRect& rect, |
624 SkScalar strokeWidth, | 624 SkScalar strokeWidth, |
625 const SkMatrix& combinedMatrix, | 625 const SkMatrix& combinedMatrix, |
626 GrColor color) { | 626 GrColor color) { |
627 if (!ds->canTweakAlphaForCoverage() && !ds->canUseFracCoveragePrimProc(color
, | 627 if (!pipelineBuilder->canTweakAlphaForCoverage() && |
628 *targ
et->caps())) { | 628 !pipelineBuilder->canUseFracCoveragePrimProc(color, *target->caps())) { |
629 #ifdef SK_DEBUG | 629 #ifdef SK_DEBUG |
630 //SkDebugf("Turning off AA to correctly apply blend.\n"); | 630 //SkDebugf("Turning off AA to correctly apply blend.\n"); |
631 #endif | 631 #endif |
632 return false; | 632 return false; |
633 } | 633 } |
634 | 634 |
635 if (ds->getRenderTarget()->isMultisampled()) { | 635 if (pipelineBuilder->getRenderTarget()->isMultisampled()) { |
636 return false; | 636 return false; |
637 } | 637 } |
638 | 638 |
639 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) | 639 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) |
640 if (strokeWidth >= 0) { | 640 if (strokeWidth >= 0) { |
641 #endif | 641 #endif |
642 if (!combinedMatrix.preservesAxisAlignment()) { | 642 if (!combinedMatrix.preservesAxisAlignment()) { |
643 return false; | 643 return false; |
644 } | 644 } |
645 | 645 |
(...skipping 27 matching lines...) Expand all Loading... |
673 const SkRect& rect, | 673 const SkRect& rect, |
674 const GrStrokeInfo* strokeInfo) { | 674 const GrStrokeInfo* strokeInfo) { |
675 if (strokeInfo && strokeInfo->isDashed()) { | 675 if (strokeInfo && strokeInfo->isDashed()) { |
676 SkPath path; | 676 SkPath path; |
677 path.addRect(rect); | 677 path.addRect(rect); |
678 this->drawPath(paint, viewMatrix, path, *strokeInfo); | 678 this->drawPath(paint, viewMatrix, path, *strokeInfo); |
679 return; | 679 return; |
680 } | 680 } |
681 | 681 |
682 AutoCheckFlush acf(this); | 682 AutoCheckFlush acf(this); |
683 GrDrawState drawState; | 683 GrPipelineBuilder pipelineBuilder; |
684 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 684 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
685 if (NULL == target) { | 685 if (NULL == target) { |
686 return; | 686 return; |
687 } | 687 } |
688 | 688 |
689 GR_CREATE_TRACE_MARKER("GrContext::drawRect", target); | 689 GR_CREATE_TRACE_MARKER("GrContext::drawRect", target); |
690 SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getStrokeRec().getWid
th(); | 690 SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getStrokeRec().getWid
th(); |
691 | 691 |
692 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking | 692 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking |
693 // cases where the RT is fully inside a stroke. | 693 // cases where the RT is fully inside a stroke. |
694 if (width < 0) { | 694 if (width < 0) { |
695 SkRect rtRect; | 695 SkRect rtRect; |
696 drawState.getRenderTarget()->getBoundsRect(&rtRect); | 696 pipelineBuilder.getRenderTarget()->getBoundsRect(&rtRect); |
697 SkRect clipSpaceRTRect = rtRect; | 697 SkRect clipSpaceRTRect = rtRect; |
698 bool checkClip = false; | 698 bool checkClip = false; |
699 if (this->getClip()) { | 699 if (this->getClip()) { |
700 checkClip = true; | 700 checkClip = true; |
701 clipSpaceRTRect.offset(SkIntToScalar(this->getClip()->fOrigin.fX), | 701 clipSpaceRTRect.offset(SkIntToScalar(this->getClip()->fOrigin.fX), |
702 SkIntToScalar(this->getClip()->fOrigin.fY)); | 702 SkIntToScalar(this->getClip()->fOrigin.fY)); |
703 } | 703 } |
704 // Does the clip contain the entire RT? | 704 // Does the clip contain the entire RT? |
705 if (!checkClip || target->getClip()->fClipStack->quickContains(clipSpace
RTRect)) { | 705 if (!checkClip || target->getClip()->fClipStack->quickContains(clipSpace
RTRect)) { |
706 SkMatrix invM; | 706 SkMatrix invM; |
(...skipping 12 matching lines...) Expand all Loading... |
719 if (paint.isOpaqueAndConstantColor(&clearColor)) { | 719 if (paint.isOpaqueAndConstantColor(&clearColor)) { |
720 target->clear(NULL, clearColor, true, fRenderTarget); | 720 target->clear(NULL, clearColor, true, fRenderTarget); |
721 return; | 721 return; |
722 } | 722 } |
723 } | 723 } |
724 } | 724 } |
725 } | 725 } |
726 | 726 |
727 GrColor color = paint.getColor(); | 727 GrColor color = paint.getColor(); |
728 SkRect devBoundRect; | 728 SkRect devBoundRect; |
729 bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisa
mpled(); | 729 bool needAA = paint.isAntiAlias() && !pipelineBuilder.getRenderTarget()->isM
ultisampled(); |
730 bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, re
ct, width, | 730 bool doAA = needAA && apply_aa_to_rect(target, &pipelineBuilder, &devBoundRe
ct, rect, width, |
731 viewMatrix, color); | 731 viewMatrix, color); |
732 | 732 |
733 if (doAA) { | 733 if (doAA) { |
734 if (width >= 0) { | 734 if (width >= 0) { |
735 const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec(); | 735 const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec(); |
736 fAARectRenderer->strokeAARect(target, | 736 fAARectRenderer->strokeAARect(target, |
737 &drawState, | 737 &pipelineBuilder, |
738 color, | 738 color, |
739 viewMatrix, | 739 viewMatrix, |
740 rect, | 740 rect, |
741 devBoundRect, | 741 devBoundRect, |
742 strokeRec); | 742 strokeRec); |
743 } else { | 743 } else { |
744 // filled AA rect | 744 // filled AA rect |
745 fAARectRenderer->fillAARect(target, | 745 fAARectRenderer->fillAARect(target, |
746 &drawState, | 746 &pipelineBuilder, |
747 color, | 747 color, |
748 viewMatrix, | 748 viewMatrix, |
749 rect, | 749 rect, |
750 devBoundRect); | 750 devBoundRect); |
751 } | 751 } |
752 return; | 752 return; |
753 } | 753 } |
754 | 754 |
755 if (width >= 0) { | 755 if (width >= 0) { |
756 // TODO: consider making static vertex buffers for these cases. | 756 // TODO: consider making static vertex buffers for these cases. |
(...skipping 29 matching lines...) Expand all Loading... |
786 // hairline | 786 // hairline |
787 vertCount = 5; | 787 vertCount = 5; |
788 primType = kLineStrip_GrPrimitiveType; | 788 primType = kLineStrip_GrPrimitiveType; |
789 vertex[0].set(rect.fLeft, rect.fTop); | 789 vertex[0].set(rect.fLeft, rect.fTop); |
790 vertex[1].set(rect.fRight, rect.fTop); | 790 vertex[1].set(rect.fRight, rect.fTop); |
791 vertex[2].set(rect.fRight, rect.fBottom); | 791 vertex[2].set(rect.fRight, rect.fBottom); |
792 vertex[3].set(rect.fLeft, rect.fBottom); | 792 vertex[3].set(rect.fLeft, rect.fBottom); |
793 vertex[4].set(rect.fLeft, rect.fTop); | 793 vertex[4].set(rect.fLeft, rect.fTop); |
794 } | 794 } |
795 | 795 |
796 target->drawNonIndexed(&drawState, gp, primType, 0, vertCount); | 796 target->drawNonIndexed(&pipelineBuilder, gp, primType, 0, vertCount); |
797 } else { | 797 } else { |
798 // filled BW rect | 798 // filled BW rect |
799 target->drawSimpleRect(&drawState, color, viewMatrix, rect); | 799 target->drawSimpleRect(&pipelineBuilder, color, viewMatrix, rect); |
800 } | 800 } |
801 } | 801 } |
802 | 802 |
803 void GrContext::drawNonAARectToRect(const GrPaint& paint, | 803 void GrContext::drawNonAARectToRect(const GrPaint& paint, |
804 const SkMatrix& viewMatrix, | 804 const SkMatrix& viewMatrix, |
805 const SkRect& rectToDraw, | 805 const SkRect& rectToDraw, |
806 const SkRect& localRect, | 806 const SkRect& localRect, |
807 const SkMatrix* localMatrix) { | 807 const SkMatrix* localMatrix) { |
808 AutoCheckFlush acf(this); | 808 AutoCheckFlush acf(this); |
809 GrDrawState drawState; | 809 GrPipelineBuilder pipelineBuilder; |
810 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 810 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
811 if (NULL == target) { | 811 if (NULL == target) { |
812 return; | 812 return; |
813 } | 813 } |
814 | 814 |
815 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); | 815 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); |
816 | 816 |
817 target->drawRect(&drawState, paint.getColor(), viewMatrix, rectToDraw, &loca
lRect, localMatrix); | 817 target->drawRect(&pipelineBuilder, paint.getColor(), viewMatrix, rectToDraw,
&localRect, |
| 818 localMatrix); |
818 } | 819 } |
819 | 820 |
820 static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords
, | 821 static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords
, |
821 const GrColor* colors, | 822 const GrColor* colors, |
822 int* colorOffset, | 823 int* colorOffset, |
823 int* texOffset, | 824 int* texOffset, |
824 GrColor color, | 825 GrColor color, |
825 const SkMatrix& viewMatr
ix) { | 826 const SkMatrix& viewMatr
ix) { |
826 *texOffset = -1; | 827 *texOffset = -1; |
827 *colorOffset = -1; | 828 *colorOffset = -1; |
(...skipping 16 matching lines...) Expand all Loading... |
844 void GrContext::drawVertices(const GrPaint& paint, | 845 void GrContext::drawVertices(const GrPaint& paint, |
845 const SkMatrix& viewMatrix, | 846 const SkMatrix& viewMatrix, |
846 GrPrimitiveType primitiveType, | 847 GrPrimitiveType primitiveType, |
847 int vertexCount, | 848 int vertexCount, |
848 const SkPoint positions[], | 849 const SkPoint positions[], |
849 const SkPoint texCoords[], | 850 const SkPoint texCoords[], |
850 const GrColor colors[], | 851 const GrColor colors[], |
851 const uint16_t indices[], | 852 const uint16_t indices[], |
852 int indexCount) { | 853 int indexCount) { |
853 AutoCheckFlush acf(this); | 854 AutoCheckFlush acf(this); |
854 GrDrawState drawState; | 855 GrPipelineBuilder pipelineBuilder; |
855 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop
e | 856 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop
e |
856 | 857 |
857 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 858 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
858 if (NULL == target) { | 859 if (NULL == target) { |
859 return; | 860 return; |
860 } | 861 } |
861 | 862 |
862 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); | 863 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); |
863 | 864 |
864 int colorOffset = -1, texOffset = -1; | 865 int colorOffset = -1, texOffset = -1; |
865 SkAutoTUnref<const GrGeometryProcessor> gp( | 866 SkAutoTUnref<const GrGeometryProcessor> gp( |
866 set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset, | 867 set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset, |
867 paint.getColor(), viewMatrix)); | 868 paint.getColor(), viewMatrix)); |
(...skipping 19 matching lines...) Expand all Loading... |
887 curVertex = (void*)((intptr_t)curVertex + vertexStride); | 888 curVertex = (void*)((intptr_t)curVertex + vertexStride); |
888 } | 889 } |
889 | 890 |
890 // we don't currently apply offscreen AA to this path. Need improved | 891 // we don't currently apply offscreen AA to this path. Need improved |
891 // management of GrDrawTarget's geometry to avoid copying points per-tile. | 892 // management of GrDrawTarget's geometry to avoid copying points per-tile. |
892 if (indices) { | 893 if (indices) { |
893 uint16_t* curIndex = (uint16_t*)geo.indices(); | 894 uint16_t* curIndex = (uint16_t*)geo.indices(); |
894 for (int i = 0; i < indexCount; ++i) { | 895 for (int i = 0; i < indexCount; ++i) { |
895 curIndex[i] = indices[i]; | 896 curIndex[i] = indices[i]; |
896 } | 897 } |
897 target->drawIndexed(&drawState, gp, primitiveType, 0, 0, vertexCount, in
dexCount); | 898 target->drawIndexed(&pipelineBuilder, gp, primitiveType, 0, 0, vertexCou
nt, indexCount); |
898 } else { | 899 } else { |
899 target->drawNonIndexed(&drawState, gp, primitiveType, 0, vertexCount); | 900 target->drawNonIndexed(&pipelineBuilder, gp, primitiveType, 0, vertexCou
nt); |
900 } | 901 } |
901 } | 902 } |
902 | 903 |
903 /////////////////////////////////////////////////////////////////////////////// | 904 /////////////////////////////////////////////////////////////////////////////// |
904 | 905 |
905 void GrContext::drawRRect(const GrPaint& paint, | 906 void GrContext::drawRRect(const GrPaint& paint, |
906 const SkMatrix& viewMatrix, | 907 const SkMatrix& viewMatrix, |
907 const SkRRect& rrect, | 908 const SkRRect& rrect, |
908 const GrStrokeInfo& strokeInfo) { | 909 const GrStrokeInfo& strokeInfo) { |
909 if (rrect.isEmpty()) { | 910 if (rrect.isEmpty()) { |
910 return; | 911 return; |
911 } | 912 } |
912 | 913 |
913 if (strokeInfo.isDashed()) { | 914 if (strokeInfo.isDashed()) { |
914 SkPath path; | 915 SkPath path; |
915 path.addRRect(rrect); | 916 path.addRRect(rrect); |
916 this->drawPath(paint, viewMatrix, path, strokeInfo); | 917 this->drawPath(paint, viewMatrix, path, strokeInfo); |
917 return; | 918 return; |
918 } | 919 } |
919 | 920 |
920 AutoCheckFlush acf(this); | 921 AutoCheckFlush acf(this); |
921 GrDrawState drawState; | 922 GrPipelineBuilder pipelineBuilder; |
922 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 923 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
923 if (NULL == target) { | 924 if (NULL == target) { |
924 return; | 925 return; |
925 } | 926 } |
926 | 927 |
927 GR_CREATE_TRACE_MARKER("GrContext::drawRRect", target); | 928 GR_CREATE_TRACE_MARKER("GrContext::drawRRect", target); |
928 | 929 |
929 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); | 930 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
930 | 931 |
931 GrColor color = paint.getColor(); | 932 GrColor color = paint.getColor(); |
932 if (!fOvalRenderer->drawRRect(target, &drawState, color, viewMatrix, paint.i
sAntiAlias(), rrect, | 933 if (!fOvalRenderer->drawRRect(target, &pipelineBuilder, color, viewMatrix, p
aint.isAntiAlias(), |
933 strokeRec)) { | 934 rrect, strokeRec)) { |
934 SkPath path; | 935 SkPath path; |
935 path.addRRect(rrect); | 936 path.addRRect(rrect); |
936 this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAn
tiAlias(), path, | 937 this->internalDrawPath(target, &pipelineBuilder, viewMatrix, color, pain
t.isAntiAlias(), |
937 strokeInfo); | 938 path, strokeInfo); |
938 } | 939 } |
939 } | 940 } |
940 | 941 |
941 /////////////////////////////////////////////////////////////////////////////// | 942 /////////////////////////////////////////////////////////////////////////////// |
942 | 943 |
943 void GrContext::drawDRRect(const GrPaint& paint, | 944 void GrContext::drawDRRect(const GrPaint& paint, |
944 const SkMatrix& viewMatrix, | 945 const SkMatrix& viewMatrix, |
945 const SkRRect& outer, | 946 const SkRRect& outer, |
946 const SkRRect& inner) { | 947 const SkRRect& inner) { |
947 if (outer.isEmpty()) { | 948 if (outer.isEmpty()) { |
948 return; | 949 return; |
949 } | 950 } |
950 | 951 |
951 AutoCheckFlush acf(this); | 952 AutoCheckFlush acf(this); |
952 GrDrawState drawState; | 953 GrPipelineBuilder pipelineBuilder; |
953 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 954 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
954 | 955 |
955 GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target); | 956 GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target); |
956 | 957 |
957 GrColor color = paint.getColor(); | 958 GrColor color = paint.getColor(); |
958 if (!fOvalRenderer->drawDRRect(target, &drawState, color, viewMatrix, paint.
isAntiAlias(), outer, inner)) { | 959 if (!fOvalRenderer->drawDRRect(target, &pipelineBuilder, color, viewMatrix,
paint.isAntiAlias(), |
| 960 outer, inner)) { |
959 SkPath path; | 961 SkPath path; |
960 path.addRRect(inner); | 962 path.addRRect(inner); |
961 path.addRRect(outer); | 963 path.addRRect(outer); |
962 path.setFillType(SkPath::kEvenOdd_FillType); | 964 path.setFillType(SkPath::kEvenOdd_FillType); |
963 | 965 |
964 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); | 966 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); |
965 this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAn
tiAlias(), path, | 967 this->internalDrawPath(target, &pipelineBuilder, viewMatrix, color, pain
t.isAntiAlias(), |
966 fillRec); | 968 path, fillRec); |
967 } | 969 } |
968 } | 970 } |
969 | 971 |
970 /////////////////////////////////////////////////////////////////////////////// | 972 /////////////////////////////////////////////////////////////////////////////// |
971 | 973 |
972 void GrContext::drawOval(const GrPaint& paint, | 974 void GrContext::drawOval(const GrPaint& paint, |
973 const SkMatrix& viewMatrix, | 975 const SkMatrix& viewMatrix, |
974 const SkRect& oval, | 976 const SkRect& oval, |
975 const GrStrokeInfo& strokeInfo) { | 977 const GrStrokeInfo& strokeInfo) { |
976 if (oval.isEmpty()) { | 978 if (oval.isEmpty()) { |
977 return; | 979 return; |
978 } | 980 } |
979 | 981 |
980 if (strokeInfo.isDashed()) { | 982 if (strokeInfo.isDashed()) { |
981 SkPath path; | 983 SkPath path; |
982 path.addOval(oval); | 984 path.addOval(oval); |
983 this->drawPath(paint, viewMatrix, path, strokeInfo); | 985 this->drawPath(paint, viewMatrix, path, strokeInfo); |
984 return; | 986 return; |
985 } | 987 } |
986 | 988 |
987 AutoCheckFlush acf(this); | 989 AutoCheckFlush acf(this); |
988 GrDrawState drawState; | 990 GrPipelineBuilder pipelineBuilder; |
989 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 991 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
990 if (NULL == target) { | 992 if (NULL == target) { |
991 return; | 993 return; |
992 } | 994 } |
993 | 995 |
994 GR_CREATE_TRACE_MARKER("GrContext::drawOval", target); | 996 GR_CREATE_TRACE_MARKER("GrContext::drawOval", target); |
995 | 997 |
996 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); | 998 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
997 | 999 |
998 GrColor color = paint.getColor(); | 1000 GrColor color = paint.getColor(); |
999 if (!fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.is
AntiAlias(), oval, | 1001 if (!fOvalRenderer->drawOval(target, &pipelineBuilder, color, viewMatrix, pa
int.isAntiAlias(), |
1000 strokeRec)) { | 1002 oval, strokeRec)) { |
1001 SkPath path; | 1003 SkPath path; |
1002 path.addOval(oval); | 1004 path.addOval(oval); |
1003 this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAn
tiAlias(), path, | 1005 this->internalDrawPath(target, &pipelineBuilder, viewMatrix, color, pain
t.isAntiAlias(), |
1004 strokeInfo); | 1006 path, strokeInfo); |
1005 } | 1007 } |
1006 } | 1008 } |
1007 | 1009 |
1008 // Can 'path' be drawn as a pair of filled nested rectangles? | 1010 // Can 'path' be drawn as a pair of filled nested rectangles? |
1009 static bool is_nested_rects(GrDrawTarget* target, | 1011 static bool is_nested_rects(GrDrawTarget* target, |
1010 GrDrawState* drawState, | 1012 GrPipelineBuilder* pipelineBuilder, |
1011 GrColor color, | 1013 GrColor color, |
1012 const SkMatrix& viewMatrix, | 1014 const SkMatrix& viewMatrix, |
1013 const SkPath& path, | 1015 const SkPath& path, |
1014 const SkStrokeRec& stroke, | 1016 const SkStrokeRec& stroke, |
1015 SkRect rects[2]) { | 1017 SkRect rects[2]) { |
1016 SkASSERT(stroke.isFillStyle()); | 1018 SkASSERT(stroke.isFillStyle()); |
1017 | 1019 |
1018 if (path.isInverseFillType()) { | 1020 if (path.isInverseFillType()) { |
1019 return false; | 1021 return false; |
1020 } | 1022 } |
1021 | 1023 |
1022 // TODO: this restriction could be lifted if we were willing to apply | 1024 // TODO: this restriction could be lifted if we were willing to apply |
1023 // the matrix to all the points individually rather than just to the rect | 1025 // the matrix to all the points individually rather than just to the rect |
1024 if (!viewMatrix.preservesAxisAlignment()) { | 1026 if (!viewMatrix.preservesAxisAlignment()) { |
1025 return false; | 1027 return false; |
1026 } | 1028 } |
1027 | 1029 |
1028 if (!drawState->canTweakAlphaForCoverage() && | 1030 if (!pipelineBuilder->canTweakAlphaForCoverage() && |
1029 !drawState->canUseFracCoveragePrimProc(color, *target->caps())) { | 1031 !pipelineBuilder->canUseFracCoveragePrimProc(color, *target->caps())) { |
1030 return false; | 1032 return false; |
1031 } | 1033 } |
1032 | 1034 |
1033 SkPath::Direction dirs[2]; | 1035 SkPath::Direction dirs[2]; |
1034 if (!path.isNestedRects(rects, dirs)) { | 1036 if (!path.isNestedRects(rects, dirs)) { |
1035 return false; | 1037 return false; |
1036 } | 1038 } |
1037 | 1039 |
1038 if (SkPath::kWinding_FillType == path.getFillType() && dirs[0] == dirs[1]) { | 1040 if (SkPath::kWinding_FillType == path.getFillType() && dirs[0] == dirs[1]) { |
1039 // The two rects need to be wound opposite to each other | 1041 // The two rects need to be wound opposite to each other |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1073 this->drawPaint(paint, viewMatrix); | 1075 this->drawPaint(paint, viewMatrix); |
1074 } | 1076 } |
1075 return; | 1077 return; |
1076 } | 1078 } |
1077 | 1079 |
1078 GrColor color = paint.getColor(); | 1080 GrColor color = paint.getColor(); |
1079 if (strokeInfo.isDashed()) { | 1081 if (strokeInfo.isDashed()) { |
1080 SkPoint pts[2]; | 1082 SkPoint pts[2]; |
1081 if (path.isLine(pts)) { | 1083 if (path.isLine(pts)) { |
1082 AutoCheckFlush acf(this); | 1084 AutoCheckFlush acf(this); |
1083 GrDrawState drawState; | 1085 GrPipelineBuilder pipelineBuilder; |
1084 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf)
; | 1086 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint,
&acf); |
1085 if (NULL == target) { | 1087 if (NULL == target) { |
1086 return; | 1088 return; |
1087 } | 1089 } |
1088 | 1090 |
1089 if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, v
iewMatrix, pts, | 1091 if (GrDashingEffect::DrawDashLine(fGpu, target, &pipelineBuilder, co
lor, viewMatrix, |
1090 paint, strokeInfo)) { | 1092 pts, paint, strokeInfo)) { |
1091 return; | 1093 return; |
1092 } | 1094 } |
1093 } | 1095 } |
1094 | 1096 |
1095 // Filter dashed path into new path with the dashing applied | 1097 // Filter dashed path into new path with the dashing applied |
1096 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); | 1098 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); |
1097 SkTLazy<SkPath> effectPath; | 1099 SkTLazy<SkPath> effectPath; |
1098 GrStrokeInfo newStrokeInfo(strokeInfo, false); | 1100 GrStrokeInfo newStrokeInfo(strokeInfo, false); |
1099 SkStrokeRec* stroke = newStrokeInfo.getStrokeRecPtr(); | 1101 SkStrokeRec* stroke = newStrokeInfo.getStrokeRecPtr(); |
1100 if (SkDashPath::FilterDashPath(effectPath.init(), path, stroke, NULL, in
fo)) { | 1102 if (SkDashPath::FilterDashPath(effectPath.init(), path, stroke, NULL, in
fo)) { |
1101 this->drawPath(paint, viewMatrix, *effectPath.get(), newStrokeInfo); | 1103 this->drawPath(paint, viewMatrix, *effectPath.get(), newStrokeInfo); |
1102 return; | 1104 return; |
1103 } | 1105 } |
1104 | 1106 |
1105 this->drawPath(paint, viewMatrix, path, newStrokeInfo); | 1107 this->drawPath(paint, viewMatrix, path, newStrokeInfo); |
1106 return; | 1108 return; |
1107 } | 1109 } |
1108 | 1110 |
1109 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 1111 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
1110 // Scratch textures can be recycled after they are returned to the texture | 1112 // Scratch textures can be recycled after they are returned to the texture |
1111 // cache. This presents a potential hazard for buffered drawing. However, | 1113 // cache. This presents a potential hazard for buffered drawing. However, |
1112 // the writePixels that uploads to the scratch will perform a flush so we're | 1114 // the writePixels that uploads to the scratch will perform a flush so we're |
1113 // OK. | 1115 // OK. |
1114 AutoCheckFlush acf(this); | 1116 AutoCheckFlush acf(this); |
1115 GrDrawState drawState; | 1117 GrPipelineBuilder pipelineBuilder; |
1116 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); | 1118 GrDrawTarget* target = this->prepareToDraw(&pipelineBuilder, &paint, &acf); |
1117 if (NULL == target) { | 1119 if (NULL == target) { |
1118 return; | 1120 return; |
1119 } | 1121 } |
1120 | 1122 |
1121 GR_CREATE_TRACE_MARKER1("GrContext::drawPath", target, "Is Convex", path.isC
onvex()); | 1123 GR_CREATE_TRACE_MARKER1("GrContext::drawPath", target, "Is Convex", path.isC
onvex()); |
1122 | 1124 |
1123 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); | 1125 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
1124 | 1126 |
1125 bool useCoverageAA = paint.isAntiAlias() && !drawState.getRenderTarget()->is
Multisampled(); | 1127 bool useCoverageAA = paint.isAntiAlias() && |
| 1128 !pipelineBuilder.getRenderTarget()->isMultisampled(); |
1126 | 1129 |
1127 if (useCoverageAA && strokeRec.getWidth() < 0 && !path.isConvex()) { | 1130 if (useCoverageAA && strokeRec.getWidth() < 0 && !path.isConvex()) { |
1128 // Concave AA paths are expensive - try to avoid them for special cases | 1131 // Concave AA paths are expensive - try to avoid them for special cases |
1129 SkRect rects[2]; | 1132 SkRect rects[2]; |
1130 | 1133 |
1131 if (is_nested_rects(target, &drawState, color, viewMatrix, path, strokeR
ec, rects)) { | 1134 if (is_nested_rects(target, &pipelineBuilder, color, viewMatrix, path, s
trokeRec, rects)) { |
1132 fAARectRenderer->fillAANestedRects(target, &drawState, color, viewMa
trix,rects); | 1135 fAARectRenderer->fillAANestedRects(target, &pipelineBuilder, color,
viewMatrix,rects); |
1133 return; | 1136 return; |
1134 } | 1137 } |
1135 } | 1138 } |
1136 | 1139 |
1137 SkRect ovalRect; | 1140 SkRect ovalRect; |
1138 bool isOval = path.isOval(&ovalRect); | 1141 bool isOval = path.isOval(&ovalRect); |
1139 | 1142 |
1140 if (!isOval || path.isInverseFillType() || | 1143 if (!isOval || path.isInverseFillType() || |
1141 !fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.is
AntiAlias(), | 1144 !fOvalRenderer->drawOval(target, &pipelineBuilder, color, viewMatrix, pa
int.isAntiAlias(), |
1142 ovalRect, strokeRec)) { | 1145 ovalRect, strokeRec)) { |
1143 this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAn
tiAlias(), path, | 1146 this->internalDrawPath(target, &pipelineBuilder, viewMatrix, color, pain
t.isAntiAlias(), |
1144 strokeInfo); | 1147 path, strokeInfo); |
1145 } | 1148 } |
1146 } | 1149 } |
1147 | 1150 |
1148 void GrContext::internalDrawPath(GrDrawTarget* target, | 1151 void GrContext::internalDrawPath(GrDrawTarget* target, |
1149 GrDrawState* drawState, | 1152 GrPipelineBuilder* pipelineBuilder, |
1150 const SkMatrix& viewMatrix, | 1153 const SkMatrix& viewMatrix, |
1151 GrColor color, | 1154 GrColor color, |
1152 bool useAA, | 1155 bool useAA, |
1153 const SkPath& path, | 1156 const SkPath& path, |
1154 const GrStrokeInfo& strokeInfo) { | 1157 const GrStrokeInfo& strokeInfo) { |
1155 SkASSERT(!path.isEmpty()); | 1158 SkASSERT(!path.isEmpty()); |
1156 | 1159 |
1157 GR_CREATE_TRACE_MARKER("GrContext::internalDrawPath", target); | 1160 GR_CREATE_TRACE_MARKER("GrContext::internalDrawPath", target); |
1158 | 1161 |
1159 | 1162 |
1160 // An Assumption here is that path renderer would use some form of tweaking | 1163 // An Assumption here is that path renderer would use some form of tweaking |
1161 // the src color (either the input alpha or in the frag shader) to implement | 1164 // the src color (either the input alpha or in the frag shader) to implement |
1162 // aa. If we have some future driver-mojo path AA that can do the right | 1165 // aa. If we have some future driver-mojo path AA that can do the right |
1163 // thing WRT to the blend then we'll need some query on the PR. | 1166 // thing WRT to the blend then we'll need some query on the PR. |
1164 bool useCoverageAA = useAA && | 1167 bool useCoverageAA = useAA && |
1165 !drawState->getRenderTarget()->isMultisampled() && | 1168 !pipelineBuilder->getRenderTarget()->isMultisampled() && |
1166 drawState->canUseFracCoveragePrimProc(color, *target->caps()); | 1169 pipelineBuilder->canUseFracCoveragePrimProc(color, *target->caps()); |
1167 | 1170 |
1168 | 1171 |
1169 GrPathRendererChain::DrawType type = | 1172 GrPathRendererChain::DrawType type = |
1170 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : | 1173 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : |
1171 GrPathRendererChain::kColor_DrawType; | 1174 GrPathRendererChain::kColor_DrawType; |
1172 | 1175 |
1173 const SkPath* pathPtr = &path; | 1176 const SkPath* pathPtr = &path; |
1174 SkTLazy<SkPath> tmpPath; | 1177 SkTLazy<SkPath> tmpPath; |
1175 SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec()); | 1178 SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec()); |
1176 | 1179 |
1177 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 1180 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
1178 GrPathRenderer* pr = this->getPathRenderer(target, drawState, viewMatrix, *p
athPtr, *stroke, | 1181 GrPathRenderer* pr = this->getPathRenderer(target, pipelineBuilder, viewMatr
ix, *pathPtr, |
1179 false, type); | 1182 *stroke, false, type); |
1180 | 1183 |
1181 if (NULL == pr) { | 1184 if (NULL == pr) { |
1182 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, viewMatrix, N
ULL)) { | 1185 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, viewMatrix, N
ULL)) { |
1183 // It didn't work the 1st time, so try again with the stroked path | 1186 // It didn't work the 1st time, so try again with the stroked path |
1184 if (stroke->applyToPath(tmpPath.init(), *pathPtr)) { | 1187 if (stroke->applyToPath(tmpPath.init(), *pathPtr)) { |
1185 pathPtr = tmpPath.get(); | 1188 pathPtr = tmpPath.get(); |
1186 stroke.writable()->setFillStyle(); | 1189 stroke.writable()->setFillStyle(); |
1187 if (pathPtr->isEmpty()) { | 1190 if (pathPtr->isEmpty()) { |
1188 return; | 1191 return; |
1189 } | 1192 } |
1190 } | 1193 } |
1191 } | 1194 } |
1192 | 1195 |
1193 // This time, allow SW renderer | 1196 // This time, allow SW renderer |
1194 pr = this->getPathRenderer(target, drawState, viewMatrix, *pathPtr, *str
oke, true, type); | 1197 pr = this->getPathRenderer(target, pipelineBuilder, viewMatrix, *pathPtr
, *stroke, true, |
| 1198 type); |
1195 } | 1199 } |
1196 | 1200 |
1197 if (NULL == pr) { | 1201 if (NULL == pr) { |
1198 #ifdef SK_DEBUG | 1202 #ifdef SK_DEBUG |
1199 SkDebugf("Unable to find path renderer compatible with path.\n"); | 1203 SkDebugf("Unable to find path renderer compatible with path.\n"); |
1200 #endif | 1204 #endif |
1201 return; | 1205 return; |
1202 } | 1206 } |
1203 | 1207 |
1204 pr->drawPath(target, drawState, color, viewMatrix, *pathPtr, *stroke, useCov
erageAA); | 1208 pr->drawPath(target, pipelineBuilder, color, viewMatrix, *pathPtr, *stroke,
useCoverageAA); |
1205 } | 1209 } |
1206 | 1210 |
1207 //////////////////////////////////////////////////////////////////////////////// | 1211 //////////////////////////////////////////////////////////////////////////////// |
1208 | 1212 |
1209 void GrContext::flush(int flagsBitfield) { | 1213 void GrContext::flush(int flagsBitfield) { |
1210 if (NULL == fDrawBuffer) { | 1214 if (NULL == fDrawBuffer) { |
1211 return; | 1215 return; |
1212 } | 1216 } |
1213 | 1217 |
1214 if (kDiscard_FlushBit & flagsBitfield) { | 1218 if (kDiscard_FlushBit & flagsBitfield) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); | 1336 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); |
1333 | 1337 |
1334 // This function can be called in the midst of drawing another object (e.g.,
when uploading a | 1338 // This function can be called in the midst of drawing another object (e.g.,
when uploading a |
1335 // SW-rasterized clip while issuing a draw). So we push the current geometry
state before | 1339 // SW-rasterized clip while issuing a draw). So we push the current geometry
state before |
1336 // drawing a rect to the render target. | 1340 // drawing a rect to the render target. |
1337 // The bracket ensures we pop the stack if we wind up flushing below. | 1341 // The bracket ensures we pop the stack if we wind up flushing below. |
1338 { | 1342 { |
1339 GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL); | 1343 GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL); |
1340 GrDrawTarget::AutoGeometryPush agp(drawTarget); | 1344 GrDrawTarget::AutoGeometryPush agp(drawTarget); |
1341 | 1345 |
1342 GrDrawState drawState; | 1346 GrPipelineBuilder pipelineBuilder; |
1343 drawState.addColorProcessor(fp); | 1347 pipelineBuilder.addColorProcessor(fp); |
1344 drawState.setRenderTarget(renderTarget); | 1348 pipelineBuilder.setRenderTarget(renderTarget); |
1345 drawTarget->drawSimpleRect(&drawState, GrColor_WHITE, matrix, | 1349 drawTarget->drawSimpleRect(&pipelineBuilder, GrColor_WHITE, matrix, |
1346 SkRect::MakeWH(SkIntToScalar(width), SkIntToS
calar(height))); | 1350 SkRect::MakeWH(SkIntToScalar(width), SkIntToS
calar(height))); |
1347 } | 1351 } |
1348 | 1352 |
1349 if (kFlushWrites_PixelOp & pixelOpsFlags) { | 1353 if (kFlushWrites_PixelOp & pixelOpsFlags) { |
1350 this->flushSurfaceWrites(surface); | 1354 this->flushSurfaceWrites(surface); |
1351 } | 1355 } |
1352 | 1356 |
1353 return true; | 1357 return true; |
1354 } | 1358 } |
1355 | 1359 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1451 src, swapRAndB, GrConfigConversionEffect::kNone_PMCo
nversion, | 1455 src, swapRAndB, GrConfigConversionEffect::kNone_PMCo
nversion, |
1452 textureMatrix)); | 1456 textureMatrix)); |
1453 } | 1457 } |
1454 swapRAndB = false; // we will handle the swap in the draw. | 1458 swapRAndB = false; // we will handle the swap in the draw. |
1455 | 1459 |
1456 // We protect the existing geometry here since it may not be | 1460 // We protect the existing geometry here since it may not be |
1457 // clear to the caller that a draw operation (i.e., drawSimpleRe
ct) | 1461 // clear to the caller that a draw operation (i.e., drawSimpleRe
ct) |
1458 // can be invoked in this method | 1462 // can be invoked in this method |
1459 { | 1463 { |
1460 GrDrawTarget::AutoGeometryPush agp(fDrawBuffer); | 1464 GrDrawTarget::AutoGeometryPush agp(fDrawBuffer); |
1461 GrDrawState drawState; | 1465 GrPipelineBuilder pipelineBuilder; |
1462 SkASSERT(fp); | 1466 SkASSERT(fp); |
1463 drawState.addColorProcessor(fp); | 1467 pipelineBuilder.addColorProcessor(fp); |
1464 | 1468 |
1465 drawState.setRenderTarget(tempTexture->asRenderTarget()); | 1469 pipelineBuilder.setRenderTarget(tempTexture->asRenderTarget(
)); |
1466 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToSc
alar(height)); | 1470 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToSc
alar(height)); |
1467 fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, SkMat
rix::I(), rect); | 1471 fDrawBuffer->drawSimpleRect(&pipelineBuilder, GrColor_WHITE,
SkMatrix::I(), |
| 1472 rect); |
1468 // we want to read back from the scratch's origin | 1473 // we want to read back from the scratch's origin |
1469 left = 0; | 1474 left = 0; |
1470 top = 0; | 1475 top = 0; |
1471 target = tempTexture->asRenderTarget(); | 1476 target = tempTexture->asRenderTarget(); |
1472 } | 1477 } |
1473 this->flushSurfaceWrites(target); | 1478 this->flushSurfaceWrites(target); |
1474 } | 1479 } |
1475 } | 1480 } |
1476 } | 1481 } |
1477 | 1482 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1545 this->flush(); | 1550 this->flush(); |
1546 } | 1551 } |
1547 } | 1552 } |
1548 | 1553 |
1549 void GrContext::flushSurfaceWrites(GrSurface* surface) { | 1554 void GrContext::flushSurfaceWrites(GrSurface* surface) { |
1550 if (surface->surfacePriv().hasPendingWrite()) { | 1555 if (surface->surfacePriv().hasPendingWrite()) { |
1551 this->flush(); | 1556 this->flush(); |
1552 } | 1557 } |
1553 } | 1558 } |
1554 | 1559 |
1555 GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, | 1560 GrDrawTarget* GrContext::prepareToDraw(GrPipelineBuilder* pipelineBuilder, |
1556 const GrPaint* paint, | 1561 const GrPaint* paint, |
1557 const AutoCheckFlush* acf) { | 1562 const AutoCheckFlush* acf) { |
1558 if (NULL == fGpu) { | 1563 if (NULL == fGpu) { |
1559 return NULL; | 1564 return NULL; |
1560 } | 1565 } |
1561 | 1566 |
1562 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); | 1567 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
1563 if (ds) { | 1568 if (pipelineBuilder) { |
1564 SkASSERT(paint && acf); | 1569 SkASSERT(paint && acf); |
1565 ds->setFromPaint(*paint, fRenderTarget.get()); | 1570 pipelineBuilder->setFromPaint(*paint, fRenderTarget.get()); |
1566 ds->setState(GrDrawState::kClip_StateBit, fClip && !fClip->fClipStack->i
sWideOpen()); | 1571 pipelineBuilder->setState(GrPipelineBuilder::kClip_StateBit, |
| 1572 fClip && !fClip->fClipStack->isWideOpen()); |
1567 } | 1573 } |
1568 fDrawBuffer->setClip(fClip); | 1574 fDrawBuffer->setClip(fClip); |
1569 return fDrawBuffer; | 1575 return fDrawBuffer; |
1570 } | 1576 } |
1571 | 1577 |
1572 /* | 1578 /* |
1573 * This method finds a path renderer that can draw the specified path on | 1579 * This method finds a path renderer that can draw the specified path on |
1574 * the provided target. | 1580 * the provided target. |
1575 * Due to its expense, the software path renderer has split out so it can | 1581 * Due to its expense, the software path renderer has split out so it can |
1576 * can be individually allowed/disallowed via the "allowSW" boolean. | 1582 * can be individually allowed/disallowed via the "allowSW" boolean. |
1577 */ | 1583 */ |
1578 GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target, | 1584 GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target, |
1579 const GrDrawState* drawState, | 1585 const GrPipelineBuilder* pipelineBuil
der, |
1580 const SkMatrix& viewMatrix, | 1586 const SkMatrix& viewMatrix, |
1581 const SkPath& path, | 1587 const SkPath& path, |
1582 const SkStrokeRec& stroke, | 1588 const SkStrokeRec& stroke, |
1583 bool allowSW, | 1589 bool allowSW, |
1584 GrPathRendererChain::DrawType drawTyp
e, | 1590 GrPathRendererChain::DrawType drawTyp
e, |
1585 GrPathRendererChain::StencilSupport*
stencilSupport) { | 1591 GrPathRendererChain::StencilSupport*
stencilSupport) { |
1586 | 1592 |
1587 if (NULL == fPathRendererChain) { | 1593 if (NULL == fPathRendererChain) { |
1588 fPathRendererChain = SkNEW_ARGS(GrPathRendererChain, (this)); | 1594 fPathRendererChain = SkNEW_ARGS(GrPathRendererChain, (this)); |
1589 } | 1595 } |
1590 | 1596 |
1591 GrPathRenderer* pr = fPathRendererChain->getPathRenderer(target, | 1597 GrPathRenderer* pr = fPathRendererChain->getPathRenderer(target, |
1592 drawState, | 1598 pipelineBuilder, |
1593 viewMatrix, | 1599 viewMatrix, |
1594 path, | 1600 path, |
1595 stroke, | 1601 stroke, |
1596 drawType, | 1602 drawType, |
1597 stencilSupport); | 1603 stencilSupport); |
1598 | 1604 |
1599 if (NULL == pr && allowSW) { | 1605 if (NULL == pr && allowSW) { |
1600 if (NULL == fSoftwarePathRenderer) { | 1606 if (NULL == fSoftwarePathRenderer) { |
1601 fSoftwarePathRenderer = SkNEW_ARGS(GrSoftwarePathRenderer, (this)); | 1607 fSoftwarePathRenderer = SkNEW_ARGS(GrSoftwarePathRenderer, (this)); |
1602 } | 1608 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1725 fResourceCache2->printStats(); | 1731 fResourceCache2->printStats(); |
1726 } | 1732 } |
1727 #endif | 1733 #endif |
1728 | 1734 |
1729 #if GR_GPU_STATS | 1735 #if GR_GPU_STATS |
1730 const GrContext::GPUStats* GrContext::gpuStats() const { | 1736 const GrContext::GPUStats* GrContext::gpuStats() const { |
1731 return fGpu->gpuStats(); | 1737 return fGpu->gpuStats(); |
1732 } | 1738 } |
1733 #endif | 1739 #endif |
1734 | 1740 |
OLD | NEW |