| 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 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 // aa. If we have some future driver-mojo path AA that can do the right | 918 // aa. If we have some future driver-mojo path AA that can do the right |
| 919 // thing WRT to the blend then we'll need some query on the PR. | 919 // thing WRT to the blend then we'll need some query on the PR. |
| 920 bool useCoverageAA = doAA && !fDrawContext->fRenderTarget->isUnifiedMultisam
pled(); | 920 bool useCoverageAA = doAA && !fDrawContext->fRenderTarget->isUnifiedMultisam
pled(); |
| 921 bool hasUserStencilSettings = !ss->isUnused(); | 921 bool hasUserStencilSettings = !ss->isUnused(); |
| 922 bool isStencilBufferMSAA = fDrawContext->fRenderTarget->isStencilBufferMulti
sampled(); | 922 bool isStencilBufferMSAA = fDrawContext->fRenderTarget->isStencilBufferMulti
sampled(); |
| 923 | 923 |
| 924 const GrPathRendererChain::DrawType type = | 924 const GrPathRendererChain::DrawType type = |
| 925 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType | 925 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
| 926 : GrPathRendererChain::kColor_DrawType; | 926 : GrPathRendererChain::kColor_DrawType; |
| 927 | 927 |
| 928 GrShape shape(path, GrStyle::SimpleFill()); |
| 928 GrPathRenderer::CanDrawPathArgs canDrawArgs; | 929 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
| 929 canDrawArgs.fShaderCaps = fDrawContext->fDrawingManager->getContext()->caps(
)->shaderCaps(); | 930 canDrawArgs.fShaderCaps = fDrawContext->fDrawingManager->getContext()->caps(
)->shaderCaps(); |
| 930 canDrawArgs.fViewMatrix = &viewMatrix; | 931 canDrawArgs.fViewMatrix = &viewMatrix; |
| 931 canDrawArgs.fPath = &path; | 932 canDrawArgs.fShape = &shape; |
| 932 canDrawArgs.fStyle = &GrStyle::SimpleFill(); | |
| 933 canDrawArgs.fAntiAlias = useCoverageAA; | 933 canDrawArgs.fAntiAlias = useCoverageAA; |
| 934 canDrawArgs.fHasUserStencilSettings = hasUserStencilSettings; | 934 canDrawArgs.fHasUserStencilSettings = hasUserStencilSettings; |
| 935 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; | 935 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
| 936 | 936 |
| 937 // Don't allow the SW renderer | 937 // Don't allow the SW renderer |
| 938 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); | 938 GrPathRenderer* pr = fDrawContext->fDrawingManager->getPathRenderer(canDrawA
rgs, false, type); |
| 939 if (!pr) { | 939 if (!pr) { |
| 940 return false; | 940 return false; |
| 941 } | 941 } |
| 942 | 942 |
| 943 GrPaint paint; | 943 GrPaint paint; |
| 944 paint.setCoverageSetOpXPFactory(op, invert); | 944 paint.setCoverageSetOpXPFactory(op, invert); |
| 945 | 945 |
| 946 GrPathRenderer::DrawPathArgs args; | 946 GrPathRenderer::DrawPathArgs args; |
| 947 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); | 947 args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resour
ceProvider(); |
| 948 args.fPaint = &paint; | 948 args.fPaint = &paint; |
| 949 args.fUserStencilSettings = ss; | 949 args.fUserStencilSettings = ss; |
| 950 args.fDrawContext = fDrawContext; | 950 args.fDrawContext = fDrawContext; |
| 951 args.fClip = &clip; | 951 args.fClip = &clip; |
| 952 args.fColor = GrColor_WHITE; | 952 args.fColor = GrColor_WHITE; |
| 953 args.fViewMatrix = &viewMatrix; | 953 args.fViewMatrix = &viewMatrix; |
| 954 args.fPath = &path; | 954 args.fShape = &shape; |
| 955 args.fStyle = &GrStyle::SimpleFill(); | |
| 956 args.fAntiAlias = useCoverageAA; | 955 args.fAntiAlias = useCoverageAA; |
| 957 args.fGammaCorrect = fDrawContext->isGammaCorrect(); | 956 args.fGammaCorrect = fDrawContext->isGammaCorrect(); |
| 958 pr->drawPath(args); | 957 pr->drawPath(args); |
| 959 return true; | 958 return true; |
| 960 } | 959 } |
| 961 | 960 |
| 962 void GrDrawContext::internalDrawPath(const GrClip& clip, | 961 void GrDrawContext::internalDrawPath(const GrClip& clip, |
| 963 const GrPaint& paint, | 962 const GrPaint& paint, |
| 964 const SkMatrix& viewMatrix, | 963 const SkMatrix& viewMatrix, |
| 965 const SkPath& origPath, | 964 const SkPath& path, |
| 966 const GrStyle& origStyle) { | 965 const GrStyle& style) { |
| 967 ASSERT_SINGLE_OWNER | 966 ASSERT_SINGLE_OWNER |
| 968 RETURN_IF_ABANDONED | 967 RETURN_IF_ABANDONED |
| 969 SkASSERT(!origPath.isEmpty()); | 968 SkASSERT(!path.isEmpty()); |
| 970 | 969 |
| 971 bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget.get()); | 970 bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget.get()); |
| 972 constexpr bool kHasUserStencilSettings = false; | 971 constexpr bool kHasUserStencilSettings = false; |
| 973 bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled(); | 972 bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled(); |
| 974 | 973 |
| 975 const GrPathRendererChain::DrawType type = | 974 const GrPathRendererChain::DrawType type = |
| 976 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType | 975 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType |
| 977 : GrPathRendererChain::kColor_DrawType; | 976 : GrPathRendererChain::kColor_DrawType; |
| 978 | 977 |
| 979 SkTLazy<SkPath> tmpPath; | 978 GrShape shape(path, style); |
| 980 SkTLazy<GrStyle> tmpStyle; | |
| 981 | |
| 982 GrPathRenderer::CanDrawPathArgs canDrawArgs; | 979 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
| 983 canDrawArgs.fShaderCaps = fDrawingManager->getContext()->caps()->shaderCaps(
); | 980 canDrawArgs.fShaderCaps = fDrawingManager->getContext()->caps()->shaderCaps(
); |
| 984 canDrawArgs.fViewMatrix = &viewMatrix; | 981 canDrawArgs.fViewMatrix = &viewMatrix; |
| 985 canDrawArgs.fPath = &origPath; | 982 canDrawArgs.fShape = &shape; |
| 986 canDrawArgs.fStyle = &origStyle; | |
| 987 canDrawArgs.fAntiAlias = useCoverageAA; | 983 canDrawArgs.fAntiAlias = useCoverageAA; |
| 988 canDrawArgs.fHasUserStencilSettings = kHasUserStencilSettings; | 984 canDrawArgs.fHasUserStencilSettings = kHasUserStencilSettings; |
| 989 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; | 985 canDrawArgs.fIsStencilBufferMSAA = isStencilBufferMSAA; |
| 990 | 986 |
| 991 // Try a 1st time without applying any of the style to the geometry (and bar
ring sw) | 987 // Try a 1st time without applying any of the style to the geometry (and bar
ring sw) |
| 992 GrPathRenderer* pr = fDrawingManager->getPathRenderer(canDrawArgs, false, ty
pe); | 988 GrPathRenderer* pr = fDrawingManager->getPathRenderer(canDrawArgs, false, ty
pe); |
| 993 SkScalar styleScale = GrStyle::MatrixToScaleFactor(viewMatrix); | 989 SkScalar styleScale = GrStyle::MatrixToScaleFactor(viewMatrix); |
| 994 | 990 |
| 995 if (!pr && canDrawArgs.fStyle->pathEffect()) { | 991 if (!pr && shape.style().pathEffect()) { |
| 996 // It didn't work above, so try again with the path effect applied. | 992 // It didn't work above, so try again with the path effect applied. |
| 997 SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); | 993 shape = shape.applyStyle(GrStyle::Apply::kPathEffectOnly, styleScale); |
| 998 if (!canDrawArgs.fStyle->applyPathEffectToPath(tmpPath.init(), &rec, *ca
nDrawArgs.fPath, | 994 if (shape.isEmpty()) { |
| 999 styleScale)) { | |
| 1000 GrStyle noPathEffect(canDrawArgs.fStyle->strokeRec(), nullptr); | |
| 1001 this->internalDrawPath(clip, paint, viewMatrix, *canDrawArgs.fPath,
noPathEffect); | |
| 1002 return; | 995 return; |
| 1003 } | 996 } |
| 1004 tmpStyle.init(rec, nullptr); | |
| 1005 canDrawArgs.fPath = tmpPath.get(); | |
| 1006 canDrawArgs.fStyle = tmpStyle.get(); | |
| 1007 if (canDrawArgs.fPath->isEmpty()) { | |
| 1008 return; | |
| 1009 } | |
| 1010 | |
| 1011 pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); | 997 pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); |
| 1012 } | 998 } |
| 1013 if (!pr) { | 999 if (!pr) { |
| 1014 SkASSERT(!canDrawArgs.fStyle->pathEffect()); | 1000 if (shape.style().applies()) { |
| 1015 if (canDrawArgs.fStyle->strokeRec().needToApply()) { | 1001 shape = shape.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, st
yleScale); |
| 1016 if (!tmpPath.isValid()) { | 1002 if (shape.isEmpty()) { |
| 1017 tmpPath.init(); | |
| 1018 } | |
| 1019 // It didn't work above, so try again by applying the stroke to the
geometry. | |
| 1020 SkStrokeRec::InitStyle fillOrHairline; | |
| 1021 if (!canDrawArgs.fStyle->applyToPath(tmpPath.get(), &fillOrHairline, | |
| 1022 *canDrawArgs.fPath, styleScale)
) { | |
| 1023 return; | 1003 return; |
| 1024 } | 1004 } |
| 1025 if (!tmpStyle.isValid()) { | |
| 1026 tmpStyle.init(fillOrHairline); | |
| 1027 } else { | |
| 1028 tmpStyle.get()->resetToInitStyle(fillOrHairline); | |
| 1029 } | |
| 1030 canDrawArgs.fPath = tmpPath.get(); | |
| 1031 canDrawArgs.fStyle = tmpStyle.get(); | |
| 1032 if (canDrawArgs.fPath->isEmpty()) { | |
| 1033 return; | |
| 1034 } | |
| 1035 | |
| 1036 pr = fDrawingManager->getPathRenderer(canDrawArgs, false, type); | |
| 1037 } | 1005 } |
| 1038 | |
| 1039 // This time, allow SW renderer | 1006 // This time, allow SW renderer |
| 1040 pr = fDrawingManager->getPathRenderer(canDrawArgs, true, type); | 1007 pr = fDrawingManager->getPathRenderer(canDrawArgs, true, type); |
| 1041 } | 1008 } |
| 1042 | 1009 |
| 1043 if (nullptr == pr) { | 1010 if (!pr) { |
| 1044 #ifdef SK_DEBUG | 1011 #ifdef SK_DEBUG |
| 1045 SkDebugf("Unable to find path renderer compatible with path.\n"); | 1012 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 1046 #endif | 1013 #endif |
| 1047 return; | 1014 return; |
| 1048 } | 1015 } |
| 1049 | 1016 |
| 1050 GrPathRenderer::DrawPathArgs args; | 1017 GrPathRenderer::DrawPathArgs args; |
| 1051 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); | 1018 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); |
| 1052 args.fPaint = &paint; | 1019 args.fPaint = &paint; |
| 1053 args.fUserStencilSettings = &GrUserStencilSettings::kUnused; | 1020 args.fUserStencilSettings = &GrUserStencilSettings::kUnused; |
| 1054 args.fDrawContext = this; | 1021 args.fDrawContext = this; |
| 1055 args.fClip = &clip; | 1022 args.fClip = &clip; |
| 1056 args.fColor = paint.getColor(); | 1023 args.fColor = paint.getColor(); |
| 1057 args.fViewMatrix = &viewMatrix; | 1024 args.fViewMatrix = &viewMatrix; |
| 1058 args.fPath = canDrawArgs.fPath; | 1025 args.fShape = canDrawArgs.fShape; |
| 1059 args.fStyle = canDrawArgs.fStyle; | |
| 1060 args.fAntiAlias = useCoverageAA; | 1026 args.fAntiAlias = useCoverageAA; |
| 1061 args.fGammaCorrect = this->isGammaCorrect(); | 1027 args.fGammaCorrect = this->isGammaCorrect(); |
| 1062 pr->drawPath(args); | 1028 pr->drawPath(args); |
| 1063 } | 1029 } |
| 1064 | 1030 |
| 1065 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, | 1031 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, |
| 1066 GrDrawBatch* batch) { | 1032 GrDrawBatch* batch) { |
| 1067 ASSERT_SINGLE_OWNER | 1033 ASSERT_SINGLE_OWNER |
| 1068 RETURN_IF_ABANDONED | 1034 RETURN_IF_ABANDONED |
| 1069 SkDEBUGCODE(this->validate();) | 1035 SkDEBUGCODE(this->validate();) |
| 1070 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1036 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 1071 | 1037 |
| 1072 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); | 1038 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| 1073 } | 1039 } |
| OLD | NEW |