| Index: src/gpu/GrClipMaskManager.cpp
|
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
|
| index 445c6dbc788c9c50e8af99b008c11d6607a92c74..9617e0dc659d16b4086c5afceff919ccb2f7b9bc 100644
|
| --- a/src/gpu/GrClipMaskManager.cpp
|
| +++ b/src/gpu/GrClipMaskManager.cpp
|
| @@ -7,6 +7,7 @@
|
|
|
| #include "GrClipMaskManager.h"
|
| #include "GrCaps.h"
|
| +#include "GrDrawingManager.h"
|
| #include "GrDrawContext.h"
|
| #include "GrDrawTarget.h"
|
| #include "GrGpuResourcePriv.h"
|
| @@ -49,12 +50,13 @@ static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const Sk
|
| // Does the path in 'element' require SW rendering? If so, return true (and,
|
| // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set
|
| // 'prOut' to the non-SW path renderer that will do the job).
|
| -static bool path_needs_SW_renderer(GrContext* context,
|
| - const GrPipelineBuilder& pipelineBuilder,
|
| - const SkMatrix& viewMatrix,
|
| - const Element* element,
|
| - GrPathRenderer** prOut,
|
| - bool needsStencil) {
|
| +bool GrClipMaskManager::PathNeedsSWRenderer(GrContext* context,
|
| + bool isStencilDisabled,
|
| + const GrRenderTarget* rt,
|
| + const SkMatrix& viewMatrix,
|
| + const Element* element,
|
| + GrPathRenderer** prOut,
|
| + bool needsStencil) {
|
| if (Element::kRect_Type == element->getType()) {
|
| // rects can always be drawn directly w/o using the software path
|
| // TODO: skip rrects once we're drawing them directly.
|
| @@ -86,9 +88,17 @@ static bool path_needs_SW_renderer(GrContext* context,
|
| : GrPathRendererChain::kColor_DrawType;
|
| }
|
|
|
| + GrPathRenderer::CanDrawPathArgs canDrawArgs;
|
| + canDrawArgs.fShaderCaps = context->caps()->shaderCaps();
|
| + canDrawArgs.fViewMatrix = &viewMatrix;
|
| + canDrawArgs.fPath = &path;
|
| + canDrawArgs.fStroke = &stroke;
|
| + canDrawArgs.fAntiAlias = element->isAA();
|
| + canDrawArgs.fIsStencilDisabled = isStencilDisabled;
|
| + canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampled();
|
| +
|
| // the 'false' parameter disallows use of the SW path renderer
|
| - GrPathRenderer* pr = context->getPathRenderer(pipelineBuilder, viewMatrix, path,
|
| - stroke, false, type);
|
| + GrPathRenderer* pr = context->drawingManager()->getPathRenderer(canDrawArgs, false, type);
|
| if (prOut) {
|
| *prOut = pr;
|
| }
|
| @@ -99,13 +109,20 @@ static bool path_needs_SW_renderer(GrContext* context,
|
| // Determines whether it is possible to draw the element to both the stencil buffer and the
|
| // alpha mask simultaneously. If so and the element is a path a compatible path renderer is
|
| // also returned.
|
| -static GrPathRenderer* get_path_renderer(GrContext* context,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| - const SkMatrix& viewMatrix,
|
| - const SkClipStack::Element* element) {
|
| +GrPathRenderer* GrClipMaskManager::GetPathRenderer(GrContext* context,
|
| + GrTexture* texture,
|
| + const SkMatrix& viewMatrix,
|
| + const SkClipStack::Element* element) {
|
| GrPathRenderer* pr;
|
| static const bool kNeedsStencil = true;
|
| - path_needs_SW_renderer(context, *pipelineBuilder, viewMatrix, element, &pr, kNeedsStencil);
|
| + static const bool kStencilIsDisabled = true;
|
| + PathNeedsSWRenderer(context,
|
| + kStencilIsDisabled,
|
| + texture->asRenderTarget(),
|
| + viewMatrix,
|
| + element,
|
| + &pr,
|
| + kNeedsStencil);
|
| return pr;
|
| }
|
|
|
| @@ -131,6 +148,7 @@ GrResourceProvider* GrClipMaskManager::resourceProvider() {
|
| * entire clip should be rendered in SW and then uploaded en masse to the gpu.
|
| */
|
| bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder,
|
| + const GrRenderTarget* rt,
|
| const SkVector& clipToMaskOffset,
|
| const GrReducedClip::ElementList& elements) {
|
| // TODO: generalize this function so that when
|
| @@ -149,8 +167,8 @@ bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder,
|
| bool needsStencil = invert ||
|
| SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op;
|
|
|
| - if (path_needs_SW_renderer(this->getContext(), pipelineBuilder, translate,
|
| - element, nullptr, needsStencil)) {
|
| + if (PathNeedsSWRenderer(this->getContext(), pipelineBuilder.getStencil().isDisabled(),
|
| + rt, translate, element, nullptr, needsStencil)) {
|
| return true;
|
| }
|
| }
|
| @@ -360,7 +378,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
| SkIntToScalar(-clipSpaceIBounds.fTop)
|
| };
|
|
|
| - if (this->useSWOnlyPath(pipelineBuilder, clipToMaskOffset, elements)) {
|
| + if (this->useSWOnlyPath(pipelineBuilder, rt, clipToMaskOffset, elements)) {
|
| // The clip geometry is complex enough that it will be more efficient to create it
|
| // entirely in software
|
| result.reset(this->createSoftwareClipMask(genID,
|
| @@ -426,7 +444,8 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| const SkClipStack::Element* element,
|
| GrPathRenderer* pr) {
|
|
|
| - pipelineBuilder->setRenderTarget(target->asRenderTarget());
|
| + GrRenderTarget* rt = target->asRenderTarget();
|
| + pipelineBuilder->setRenderTarget(rt);
|
|
|
| // The color we use to draw does not matter since we will always be using a GrCoverageSetOpXP
|
| // which ignores color.
|
| @@ -462,8 +481,17 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| GrPathRendererChain::DrawType type;
|
| type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_DrawType :
|
| GrPathRendererChain::kColor_DrawType;
|
| - pr = this->getContext()->getPathRenderer(*pipelineBuilder, viewMatrix,
|
| - path, stroke, false, type);
|
| +
|
| + GrPathRenderer::CanDrawPathArgs canDrawArgs;
|
| + canDrawArgs.fShaderCaps = this->getContext()->caps()->shaderCaps();
|
| + canDrawArgs.fViewMatrix = &viewMatrix;
|
| + canDrawArgs.fPath = &path;
|
| + canDrawArgs.fStroke = &stroke;
|
| + canDrawArgs.fAntiAlias = element->isAA();;
|
| + canDrawArgs.fIsStencilDisabled = pipelineBuilder->getStencil().isDisabled();
|
| + canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampled();
|
| +
|
| + pr = this->getContext()->drawingManager()->getPathRenderer(canDrawArgs, false, type);
|
| }
|
| if (nullptr == pr) {
|
| return false;
|
| @@ -566,8 +594,9 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| pipelineBuilder.setClip(clip);
|
| pipelineBuilder.setRenderTarget(texture->asRenderTarget());
|
|
|
| - GrPathRenderer* pr = get_path_renderer(this->getContext(), &pipelineBuilder,
|
| - translate, element);
|
| + SkASSERT(pipelineBuilder.getStencil().isDisabled());
|
| + GrPathRenderer* pr = GetPathRenderer(this->getContext(),
|
| + texture, translate, element);
|
| if (Element::kRect_Type != element->getType() && !pr) {
|
| // useSWOnlyPath should now filter out all cases where gpu-side mask merging would
|
| // be performed (i.e., pr would be NULL for a non-rect path). See skbug.com/4519
|
| @@ -701,13 +730,21 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt,
|
| if (fillInverted) {
|
| clipPath.toggleInverseFillType();
|
| }
|
| - pr = this->getContext()->getPathRenderer(pipelineBuilder,
|
| - viewMatrix,
|
| - clipPath,
|
| - stroke,
|
| - false,
|
| - GrPathRendererChain::kStencilOnly_DrawType,
|
| - &stencilSupport);
|
| +
|
| + SkASSERT(pipelineBuilder.getStencil().isDisabled());
|
| +
|
| + GrPathRenderer::CanDrawPathArgs canDrawArgs;
|
| + canDrawArgs.fShaderCaps = this->getContext()->caps()->shaderCaps();
|
| + canDrawArgs.fViewMatrix = &viewMatrix;
|
| + canDrawArgs.fPath = &clipPath;
|
| + canDrawArgs.fStroke = &stroke;
|
| + canDrawArgs.fAntiAlias = false;
|
| + canDrawArgs.fIsStencilDisabled = pipelineBuilder.getStencil().isDisabled();
|
| + canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampled();
|
| +
|
| + pr = this->getContext()->drawingManager()->getPathRenderer(canDrawArgs, false,
|
| + GrPathRendererChain::kStencilOnly_DrawType,
|
| + &stencilSupport);
|
| if (nullptr == pr) {
|
| return false;
|
| }
|
|
|