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