OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrBatchTest.h" | 8 #include "GrBatchTest.h" |
9 #include "GrColor.h" | 9 #include "GrColor.h" |
10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 } | 365 } |
366 | 366 |
367 SkPath path; | 367 SkPath path; |
368 path.setIsVolatile(true); | 368 path.setIsVolatile(true); |
369 path.addRect(rect); | 369 path.addRect(rect); |
370 this->internalDrawPath(clip, paint, viewMatrix, path, | 370 this->internalDrawPath(clip, paint, viewMatrix, path, |
371 strokeInfo ? *strokeInfo : GrStrokeInfo::FillInfo()); | 371 strokeInfo ? *strokeInfo : GrStrokeInfo::FillInfo()); |
372 } | 372 } |
373 | 373 |
374 bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, | 374 bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, |
375 const GrStencilSettings& ss, | 375 const GrUserStencilSettings* ss, |
376 SkRegion::Op op, | 376 SkRegion::Op op, |
377 bool invert, | 377 bool invert, |
378 bool doAA, | 378 bool doAA, |
379 const SkMatrix& viewMatrix, | 379 const SkMatrix& viewMatrix, |
380 const SkRect& rect) { | 380 const SkRect& rect) { |
381 ASSERT_SINGLE_OWNER_PRIV | 381 ASSERT_SINGLE_OWNER_PRIV |
382 RETURN_FALSE_IF_ABANDONED_PRIV | 382 RETURN_FALSE_IF_ABANDONED_PRIV |
383 SkDEBUGCODE(fDrawContext->validate();) | 383 SkDEBUGCODE(fDrawContext->validate();) |
384 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::stencil
Rect"); | 384 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::stencil
Rect"); |
385 | 385 |
386 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 386 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
387 | 387 |
388 GrPaint paint; | 388 GrPaint paint; |
389 paint.setAntiAlias(doAA); | 389 paint.setAntiAlias(doAA); |
390 paint.setCoverageSetOpXPFactory(op, invert); | 390 paint.setCoverageSetOpXPFactory(op, invert); |
391 | 391 |
392 SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMa
trix, rect)); | 392 SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMa
trix, rect)); |
393 if (batch) { | 393 if (batch) { |
394 GrPipelineBuilder pipelineBuilder(paint, | 394 GrPipelineBuilder pipelineBuilder(paint, |
395 fDrawContext->accessRenderTarget(), | 395 fDrawContext->accessRenderTarget(), |
396 GrClip::WideOpen()); | 396 GrClip::WideOpen()); |
397 pipelineBuilder.setStencil(ss); | 397 pipelineBuilder.setUserStencil(ss); |
398 | 398 |
399 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, batch, scissor
Rect); | 399 fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, batch, scissor
Rect); |
400 return true; | 400 return true; |
401 } | 401 } |
402 | 402 |
403 SkPath path; | 403 SkPath path; |
404 path.setIsVolatile(true); | 404 path.setIsVolatile(true); |
405 path.addRect(rect); | 405 path.addRect(rect); |
406 return this->drawAndStencilPath(scissorRect, ss, op, invert, doAA, viewMatri
x, path); | 406 return this->drawAndStencilPath(scissorRect, ss, op, invert, doAA, viewMatri
x, path); |
407 } | 407 } |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 | 849 |
850 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 850 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
851 // Scratch textures can be recycled after they are returned to the texture | 851 // Scratch textures can be recycled after they are returned to the texture |
852 // cache. This presents a potential hazard for buffered drawing. However, | 852 // cache. This presents a potential hazard for buffered drawing. However, |
853 // the writePixels that uploads to the scratch will perform a flush so we're | 853 // the writePixels that uploads to the scratch will perform a flush so we're |
854 // OK. | 854 // OK. |
855 this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo); | 855 this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo); |
856 } | 856 } |
857 | 857 |
858 bool GrDrawContextPriv::drawAndStencilPath(const SkIRect* scissorRect, | 858 bool GrDrawContextPriv::drawAndStencilPath(const SkIRect* scissorRect, |
859 const GrStencilSettings& ss, | 859 const GrUserStencilSettings* ss, |
860 SkRegion::Op op, | 860 SkRegion::Op op, |
861 bool invert, | 861 bool invert, |
862 bool doAA, | 862 bool doAA, |
863 const SkMatrix& viewMatrix, | 863 const SkMatrix& viewMatrix, |
864 const SkPath& path) { | 864 const SkPath& path) { |
865 ASSERT_SINGLE_OWNER_PRIV | 865 ASSERT_SINGLE_OWNER_PRIV |
866 RETURN_FALSE_IF_ABANDONED_PRIV | 866 RETURN_FALSE_IF_ABANDONED_PRIV |
867 SkDEBUGCODE(fDrawContext->validate();) | 867 SkDEBUGCODE(fDrawContext->validate();) |
868 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); | 868 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPat
h"); |
869 | 869 |
870 if (path.isEmpty() && path.isInverseFillType()) { | 870 if (path.isEmpty() && path.isInverseFillType()) { |
871 this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I
(), | 871 this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I
(), |
872 SkRect::MakeIWH(fDrawContext->width(), | 872 SkRect::MakeIWH(fDrawContext->width(), |
873 fDrawContext->height())); | 873 fDrawContext->height())); |
874 return true; | 874 return true; |
875 } | 875 } |
876 | 876 |
877 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 877 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
878 | 878 |
879 // An Assumption here is that path renderer would use some form of tweaking | 879 // An Assumption here is that path renderer would use some form of tweaking |
880 // the src color (either the input alpha or in the frag shader) to implement | 880 // the src color (either the input alpha or in the frag shader) to implement |
881 // aa. If we have some future driver-mojo path AA that can do the right | 881 // aa. If we have some future driver-mojo path AA that can do the right |
882 // thing WRT to the blend then we'll need some query on the PR. | 882 // thing WRT to the blend then we'll need some query on the PR. |
883 bool useCoverageAA = doAA && !fDrawContext->fRenderTarget->isUnifiedMultisam
pled(); | 883 bool useCoverageAA = doAA && !fDrawContext->fRenderTarget->isUnifiedMultisam
pled(); |
884 bool isStencilDisabled = true; | 884 bool hasUserStencilSettings = (&GrUserStencilSettings::kUnused != ss); |
885 bool isStencilBufferMSAA = fDrawContext->fRenderTarget->isStencilBufferMulti
sampled(); | 885 bool isStencilBufferMSAA = fDrawContext->fRenderTarget->isStencilBufferMulti
sampled(); |
886 | 886 |
887 const GrPathRendererChain::DrawType type = | 887 const GrPathRendererChain::DrawType type = |
888 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType | 888 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
889 : GrPathRendererChain::kColor_DrawType; | 889 : GrPathRendererChain::kColor_DrawType; |
890 | 890 |
891 GrPathRenderer::CanDrawPathArgs canDrawArgs; | 891 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
892 canDrawArgs.fShaderCaps = fDrawContext->fDrawingManager->getContext()->caps(
)->shaderCaps(); | 892 canDrawArgs.fShaderCaps = fDrawContext->fDrawingManager->getContext()->caps(
)->shaderCaps(); |
893 canDrawArgs.fViewMatrix = &viewMatrix; | 893 canDrawArgs.fViewMatrix = &viewMatrix; |
894 canDrawArgs.fPath = &path; | 894 canDrawArgs.fPath = &path; |
895 canDrawArgs.fStroke = &GrStrokeInfo::FillInfo(); | 895 canDrawArgs.fStroke = &GrStrokeInfo::FillInfo(); |
896 canDrawArgs.fAntiAlias = useCoverageAA; | 896 canDrawArgs.fAntiAlias = useCoverageAA; |
897 canDrawArgs.fIsStencilDisabled = isStencilDisabled; | 897 canDrawArgs.fHasUserStencilSettings = hasUserStencilSettings; |
898 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; | 898 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
899 | 899 |
900 // Don't allow the SW renderer | 900 // Don't allow the SW renderer |
901 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); | 901 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); |
902 if (!pr) { | 902 if (!pr) { |
903 return false; | 903 return false; |
904 } | 904 } |
905 | 905 |
906 GrPaint paint; | 906 GrPaint paint; |
907 paint.setCoverageSetOpXPFactory(op, invert); | 907 paint.setCoverageSetOpXPFactory(op, invert); |
908 | 908 |
909 // TODO: it is unfortunate that we have to convert this to a GrClip to | 909 // TODO: it is unfortunate that we have to convert this to a GrClip to |
910 // call drawPath. | 910 // call drawPath. |
911 GrClip clip; | 911 GrClip clip; |
912 if (scissorRect) { | 912 if (scissorRect) { |
913 clip.setIRect(*scissorRect); | 913 clip.setIRect(*scissorRect); |
914 } | 914 } |
915 | 915 |
916 GrPipelineBuilder pipelineBuilder(paint, fDrawContext->accessRenderTarget(),
clip); | 916 GrPipelineBuilder pipelineBuilder(paint, fDrawContext->accessRenderTarget(),
clip); |
917 pipelineBuilder.setStencil(ss); | 917 pipelineBuilder.setUserStencil(ss); |
918 | 918 |
919 GrPathRenderer::DrawPathArgs args; | 919 GrPathRenderer::DrawPathArgs args; |
920 args.fTarget = fDrawContext->getDrawTarget(); | 920 args.fTarget = fDrawContext->getDrawTarget(); |
921 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); | 921 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); |
922 args.fPipelineBuilder = &pipelineBuilder; | 922 args.fPipelineBuilder = &pipelineBuilder; |
923 args.fColor = GrColor_WHITE; | 923 args.fColor = GrColor_WHITE; |
924 args.fViewMatrix = &viewMatrix; | 924 args.fViewMatrix = &viewMatrix; |
925 args.fPath = &path; | 925 args.fPath = &path; |
926 args.fStroke = &GrStrokeInfo::FillInfo(); | 926 args.fStroke = &GrStrokeInfo::FillInfo(); |
927 args.fAntiAlias = useCoverageAA; | 927 args.fAntiAlias = useCoverageAA; |
928 args.fGammaCorrect = fDrawContext->isGammaCorrect(); | 928 args.fGammaCorrect = fDrawContext->isGammaCorrect(); |
929 pr->drawPath(args); | 929 pr->drawPath(args); |
930 return true; | 930 return true; |
931 } | 931 } |
932 | 932 |
933 void GrDrawContext::internalDrawPath(const GrClip& clip, | 933 void GrDrawContext::internalDrawPath(const GrClip& clip, |
934 const GrPaint& paint, | 934 const GrPaint& paint, |
935 const SkMatrix& viewMatrix, | 935 const SkMatrix& viewMatrix, |
936 const SkPath& path, | 936 const SkPath& path, |
937 const GrStrokeInfo& strokeInfo) { | 937 const GrStrokeInfo& strokeInfo) { |
938 ASSERT_SINGLE_OWNER | 938 ASSERT_SINGLE_OWNER |
939 RETURN_IF_ABANDONED | 939 RETURN_IF_ABANDONED |
940 SkASSERT(!path.isEmpty()); | 940 SkASSERT(!path.isEmpty()); |
941 | 941 |
942 // An Assumption here is that path renderer would use some form of tweaking | 942 // An Assumption here is that path renderer would use some form of tweaking |
943 // the src color (either the input alpha or in the frag shader) to implement | 943 // the src color (either the input alpha or in the frag shader) to implement |
944 // aa. If we have some future driver-mojo path AA that can do the right | 944 // aa. If we have some future driver-mojo path AA that can do the right |
945 // thing WRT to the blend then we'll need some query on the PR. | 945 // thing WRT to the blend then we'll need some query on the PR. |
946 bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget.get()); | 946 bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget.get()); |
947 const bool isStencilDisabled = true; | 947 constexpr bool kHasUserStencilSettings = false; |
948 bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled(); | 948 bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled(); |
949 | 949 |
950 const GrPathRendererChain::DrawType type = | 950 const GrPathRendererChain::DrawType type = |
951 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType | 951 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
952 : GrPathRendererChain::kColor_DrawType; | 952 : GrPathRendererChain::kColor_DrawType; |
953 | 953 |
954 const SkPath* pathPtr = &path; | 954 const SkPath* pathPtr = &path; |
955 SkTLazy<SkPath> tmpPath; | 955 SkTLazy<SkPath> tmpPath; |
956 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; | 956 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; |
957 | 957 |
958 GrPathRenderer::CanDrawPathArgs canDrawArgs; | 958 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
959 canDrawArgs.fShaderCaps = fDrawingManager->getContext()->caps()->shaderCaps(
); | 959 canDrawArgs.fShaderCaps = fDrawingManager->getContext()->caps()->shaderCaps(
); |
960 canDrawArgs.fViewMatrix = &viewMatrix; | 960 canDrawArgs.fViewMatrix = &viewMatrix; |
961 canDrawArgs.fPath = pathPtr; | 961 canDrawArgs.fPath = pathPtr; |
962 canDrawArgs.fStroke = strokeInfoPtr; | 962 canDrawArgs.fStroke = strokeInfoPtr; |
963 canDrawArgs.fAntiAlias = useCoverageAA; | 963 canDrawArgs.fAntiAlias = useCoverageAA; |
964 canDrawArgs.fIsStencilDisabled = isStencilDisabled; | 964 canDrawArgs.fHasUserStencilSettings = kHasUserStencilSettings; |
965 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; | 965 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
966 | 966 |
967 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 967 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
968 GrPathRenderer* pr = fDrawingManager->getPathRenderer(canDrawArgs, false, ty
pe); | 968 GrPathRenderer* pr = fDrawingManager->getPathRenderer(canDrawArgs, false, ty
pe); |
969 | 969 |
970 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); | 970 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); |
971 if (nullptr == pr && strokeInfo.isDashed()) { | 971 if (nullptr == pr && strokeInfo.isDashed()) { |
972 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. | 972 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. |
973 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { | 973 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { |
974 return; | 974 return; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 } | 1034 } |
1035 | 1035 |
1036 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 1036 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
1037 ASSERT_SINGLE_OWNER | 1037 ASSERT_SINGLE_OWNER |
1038 RETURN_IF_ABANDONED | 1038 RETURN_IF_ABANDONED |
1039 SkDEBUGCODE(this->validate();) | 1039 SkDEBUGCODE(this->validate();) |
1040 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1040 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
1041 | 1041 |
1042 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 1042 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
1043 } | 1043 } |
OLD | NEW |