diff options
author | Brian Salomon <bsalomon@google.com> | 2017-05-08 10:43:33 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-10 14:48:47 +0000 |
commit | ac70f84e7f4fc9ddd344753b92cdf4be540d32bf (patch) | |
tree | 4b813dd3d6fae01afe6727a6897faf4c31fb240c | |
parent | 0418a888d31689f5358b6b90fd09287aeba368db (diff) |
Move all non-AA fill rect ops off of GrLegacyMeshDrawOp.
This adds perspective to GrNewNonAAFillRectOp, renames it to GrNonAAFillRectOp, and deletes the previous version of that namespace.
Change-Id: I20f35bf019f9c9105e6ec83dda11328451138109
Reviewed-on: https://skia-review.googlesource.com/15634
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
-rw-r--r-- | gm/bigrrectaaeffect.cpp | 10 | ||||
-rw-r--r-- | gm/constcolorprocessor.cpp | 10 | ||||
-rw-r--r-- | gm/etc1.cpp | 8 | ||||
-rw-r--r-- | gm/rrects.cpp | 14 | ||||
-rw-r--r-- | gm/texturedomaineffect.cpp | 10 | ||||
-rw-r--r-- | gm/yuvtorgbeffect.cpp | 16 | ||||
-rw-r--r-- | gn/gpu.gni | 3 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.cpp | 18 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContextPriv.h | 2 | ||||
-rw-r--r-- | src/gpu/GrSWMaskHelper.cpp | 10 | ||||
-rw-r--r-- | src/gpu/GrSoftwarePathRenderer.cpp | 11 | ||||
-rw-r--r-- | src/gpu/ops/GrDefaultPathRenderer.cpp | 12 | ||||
-rw-r--r-- | src/gpu/ops/GrMSAAPathRenderer.cpp | 13 | ||||
-rw-r--r-- | src/gpu/ops/GrNewNonAAFillRectOp.cpp | 198 | ||||
-rw-r--r-- | src/gpu/ops/GrNewNonAAFillRectOp.h | 31 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAFillRectOp.cpp | 293 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAFillRectOp.h | 28 | ||||
-rw-r--r-- | src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp | 258 | ||||
-rw-r--r-- | src/gpu/ops/GrRectOpFactory.h | 14 | ||||
-rw-r--r-- | src/gpu/ops/GrStencilAndCoverPathRenderer.cpp | 14 | ||||
-rw-r--r-- | tests/ProcessorTest.cpp | 12 | ||||
-rw-r--r-- | tools/gpu/GrTest.cpp | 16 |
22 files changed, 324 insertions, 677 deletions
diff --git a/gm/bigrrectaaeffect.cpp b/gm/bigrrectaaeffect.cpp index 786e1775c1..92c3a24252 100644 --- a/gm/bigrrectaaeffect.cpp +++ b/gm/bigrrectaaeffect.cpp @@ -13,7 +13,7 @@ #include "SkRRect.h" #include "effects/GrRRectEffect.h" #include "ops/GrDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" namespace skiagm { @@ -81,16 +81,16 @@ protected: SkASSERT(fp); if (fp) { GrPaint grPaint; + grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f)); grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc)); grPaint.addCoverageFragmentProcessor(std::move(fp)); SkRect bounds = testBounds; bounds.offset(SkIntToScalar(x), SkIntToScalar(y)); - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - 0xff000000, SkMatrix::I(), bounds, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), SkMatrix::I(), bounds, + nullptr, nullptr, GrAAType::kNone)); } canvas->restore(); x = x + fTestOffsetX; diff --git a/gm/constcolorprocessor.cpp b/gm/constcolorprocessor.cpp index 2e0fde2861..bbfca008bd 100644 --- a/gm/constcolorprocessor.cpp +++ b/gm/constcolorprocessor.cpp @@ -18,7 +18,7 @@ #include "SkGradientShader.h" #include "effects/GrConstColorProcessor.h" #include "ops/GrDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" namespace skiagm { /** @@ -109,11 +109,9 @@ protected: sk_sp<GrFragmentProcessor> fp(GrConstColorProcessor::Make(color, mode)); grPaint.addColorFragmentProcessor(std::move(fp)); - - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - grPaint.getColor(), viewMatrix, renderRect, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), viewMatrix, renderRect, + nullptr, nullptr, GrAAType::kNone)); // Draw labels for the input to the processor and the processor to the right of // the test rect. The input label appears above the processor label. diff --git a/gm/etc1.cpp b/gm/etc1.cpp index 0c99e50371..cc01a0e35e 100644 --- a/gm/etc1.cpp +++ b/gm/etc1.cpp @@ -17,7 +17,7 @@ #include "GrRenderTargetContextPriv.h" #include "GrTextureProxy.h" #include "effects/GrSimpleTextureEffect.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" // Basic test of Ganesh's ETC1 support class ETC1GM : public skiagm::GM { @@ -97,10 +97,8 @@ protected: SkRect rect = SkRect::MakeXYWH(kPad, kPad, kTexWidth, kTexHeight); - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - GrColor_WHITE, SkMatrix::I(), rect, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp(GrNonAAFillRectOp::Make( + std::move(grPaint), SkMatrix::I(), rect, nullptr, nullptr, GrAAType::kNone)); } private: diff --git a/gm/rrects.cpp b/gm/rrects.cpp index 8219681b14..23f576b5e9 100644 --- a/gm/rrects.cpp +++ b/gm/rrects.cpp @@ -12,7 +12,7 @@ #include "GrRenderTargetContextPriv.h" #include "effects/GrRRectEffect.h" #include "ops/GrDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" #endif #include "SkRRect.h" @@ -111,14 +111,18 @@ protected: GrPaint grPaint; grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc)); grPaint.addCoverageFragmentProcessor(std::move(fp)); + grPaint.setColor4f(GrColor4f(0, 0, 0, 1.f)); SkRect bounds = rrect.getBounds(); bounds.outset(2.f, 2.f); - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - 0xff000000, SkMatrix::I(), bounds, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), + SkMatrix::I(), + bounds, + nullptr, + nullptr, + GrAAType::kNone)); } else { drew = false; } diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp index 6a296f4d1f..d49e059c56 100644 --- a/gm/texturedomaineffect.cpp +++ b/gm/texturedomaineffect.cpp @@ -18,7 +18,7 @@ #include "SkGradientShader.h" #include "effects/GrTextureDomain.h" #include "ops/GrDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" namespace skiagm { /** @@ -133,11 +133,9 @@ protected: } const SkMatrix viewMatrix = SkMatrix::MakeTrans(x, y); grPaint.addColorFragmentProcessor(std::move(fp)); - - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), viewMatrix, renderRect, + nullptr, nullptr, GrAAType::kNone)); x += renderRect.width() + kTestPad; } y += renderRect.height() + kTestPad; diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp index 87d76cb2ac..eb2e422286 100644 --- a/gm/yuvtorgbeffect.cpp +++ b/gm/yuvtorgbeffect.cpp @@ -19,7 +19,7 @@ #include "SkGradientShader.h" #include "effects/GrYUVEffect.h" #include "ops/GrDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" #define YSIZE 8 #define USIZE 4 @@ -132,10 +132,9 @@ protected: grPaint.addColorFragmentProcessor(std::move(fp)); SkMatrix viewMatrix; viewMatrix.setTranslate(x, y); - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), viewMatrix, renderRect, + nullptr, nullptr, GrAAType::kNone)); } x += renderRect.width() + kTestPad; } @@ -257,10 +256,9 @@ protected: SkMatrix viewMatrix; viewMatrix.setTranslate(x, y); grPaint.addColorFragmentProcessor(fp); - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr)); - renderTargetContext->priv().testingOnly_addLegacyMeshDrawOp( - std::move(grPaint), GrAAType::kNone, std::move(op)); + renderTargetContext->priv().testingOnly_addDrawOp( + GrNonAAFillRectOp::Make(std::move(grPaint), viewMatrix, renderRect, nullptr, + nullptr, GrAAType::kNone)); } } } diff --git a/gn/gpu.gni b/gn/gpu.gni index fde979d007..b2515f0fdc 100644 --- a/gn/gpu.gni +++ b/gn/gpu.gni @@ -263,9 +263,6 @@ skia_gpu_sources = [ "$_src/gpu/ops/GrMSAAPathRenderer.h", "$_src/gpu/ops/GrNonAAFillRectOp.h", "$_src/gpu/ops/GrNonAAFillRectOp.cpp", - "$_src/gpu/ops/GrNewNonAAFillRectOp.h", - "$_src/gpu/ops/GrNewNonAAFillRectOp.cpp", - "$_src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp", "$_src/gpu/ops/GrNonAAStrokeRectOp.cpp", "$_src/gpu/ops/GrNonAAStrokeRectOp.h", "$_src/gpu/ops/GrLatticeOp.cpp", diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp index fc1ab6850f..12ddb96450 100644 --- a/src/gpu/GrRenderTargetContext.cpp +++ b/src/gpu/GrRenderTargetContext.cpp @@ -32,7 +32,7 @@ #include "ops/GrDrawOp.h" #include "ops/GrDrawVerticesOp.h" #include "ops/GrLatticeOp.h" -#include "ops/GrNewNonAAFillRectOp.h" +#include "ops/GrNonAAFillRectOp.h" #include "ops/GrOp.h" #include "ops/GrOvalOpFactory.h" #include "ops/GrRectOpFactory.h" @@ -1274,19 +1274,9 @@ void GrRenderTargetContext::drawNonAAFilledRect(const GrClip& clip, GrAAType hwOrNoneAAType) { SkASSERT(GrAAType::kCoverage != hwOrNoneAAType); SkASSERT(GrAAType::kNone == hwOrNoneAAType || this->isStencilBufferMultisampled()); - if (!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective())) { - std::unique_ptr<GrDrawOp> op = GrNewNonAAFillRectOp::Make( - std::move(paint), viewMatrix, rect, localRect, localMatrix, hwOrNoneAAType, ss); - this->addDrawOp(clip, std::move(op)); - return; - } - std::unique_ptr<GrLegacyMeshDrawOp> op = GrRectOpFactory::MakeNonAAFill( - paint.getColor(), viewMatrix, rect, localRect, localMatrix); - GrPipelineBuilder pipelineBuilder(std::move(paint), hwOrNoneAAType); - if (ss) { - pipelineBuilder.setUserStencil(ss); - } - this->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, std::move(op)); + std::unique_ptr<GrDrawOp> op = GrNonAAFillRectOp::Make( + std::move(paint), viewMatrix, rect, localRect, localMatrix, hwOrNoneAAType, ss); + this->addDrawOp(clip, std::move(op)); } // Can 'path' be drawn as a pair of filled nested rectangles? diff --git a/src/gpu/GrRenderTargetContextPriv.h b/src/gpu/GrRenderTargetContextPriv.h index e889317de4..2acda23a59 100644 --- a/src/gpu/GrRenderTargetContextPriv.h +++ b/src/gpu/GrRenderTargetContextPriv.h @@ -107,6 +107,8 @@ public: const GrUserStencilSettings* = nullptr, bool snapToCenters = false); + uint32_t testingOnly_addDrawOp(std::unique_ptr<GrDrawOp>); + bool refsWrappedObjects() const { return fRenderTargetContext->fRenderTargetProxy->refsWrappedObjects(); } diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp index 2068734614..141f35710e 100644 --- a/src/gpu/GrSWMaskHelper.cpp +++ b/src/gpu/GrSWMaskHelper.cpp @@ -19,7 +19,7 @@ #include "SkDistanceFieldGen.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" /* * Convert a boolean operation into a transfer mode code @@ -173,12 +173,10 @@ void GrSWMaskHelper::DrawToTargetWithShapeMask(sk_sp<GrTextureProxy> proxy, SkMatrix maskMatrix = SkMatrix::MakeTrans(SkIntToScalar(-textureOriginInDeviceSpace.fX), SkIntToScalar(-textureOriginInDeviceSpace.fY)); maskMatrix.preConcat(viewMatrix); - std::unique_ptr<GrLegacyMeshDrawOp> op = GrRectOpFactory::MakeNonAAFill( - paint.getColor(), SkMatrix::I(), dstRect, nullptr, &invert); paint.addCoverageFragmentProcessor(GrSimpleTextureEffect::Make( resourceProvider, std::move(proxy), nullptr, maskMatrix, GrSamplerParams::kNone_FilterMode)); - GrPipelineBuilder pipelineBuilder(std::move(paint), GrAAType::kNone); - pipelineBuilder.setUserStencil(&userStencilSettings); - renderTargetContext->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, std::move(op)); + renderTargetContext->addDrawOp( + clip, GrNonAAFillRectOp::Make(std::move(paint), SkMatrix::I(), dstRect, nullptr, + &invert, GrAAType::kNone, &userStencilSettings)); } diff --git a/src/gpu/GrSoftwarePathRenderer.cpp b/src/gpu/GrSoftwarePathRenderer.cpp index a9613b4273..f823e13704 100644 --- a/src/gpu/GrSoftwarePathRenderer.cpp +++ b/src/gpu/GrSoftwarePathRenderer.cpp @@ -12,7 +12,7 @@ #include "GrPipelineBuilder.h" #include "GrResourceProvider.h" #include "GrSWMaskHelper.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" //////////////////////////////////////////////////////////////////////////////// bool GrSoftwarePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { @@ -76,12 +76,9 @@ void GrSoftwarePathRenderer::DrawNonAARect(GrRenderTargetContext* renderTargetCo const SkMatrix& viewMatrix, const SkRect& rect, const SkMatrix& localMatrix) { - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - paint.getColor(), viewMatrix, rect, nullptr, &localMatrix)); - - GrPipelineBuilder pipelineBuilder(std::move(paint), GrAAType::kNone); - pipelineBuilder.setUserStencil(&userStencilSettings); - renderTargetContext->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, std::move(op)); + renderTargetContext->addDrawOp( + clip, GrNonAAFillRectOp::Make(std::move(paint), viewMatrix, rect, nullptr, &localMatrix, + GrAAType::kNone, &userStencilSettings)); } void GrSoftwarePathRenderer::DrawAroundInvPath(GrRenderTargetContext* renderTargetContext, diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp index ef925b6234..c683c33cf4 100644 --- a/src/gpu/ops/GrDefaultPathRenderer.cpp +++ b/src/gpu/ops/GrDefaultPathRenderer.cpp @@ -22,7 +22,7 @@ #include "SkTraceEvent.h" #include "ops/GrMeshDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" GrDefaultPathRenderer::GrDefaultPathRenderer() { } @@ -523,12 +523,10 @@ bool GrDefaultPathRenderer::internalDrawPath(GrRenderTargetContext* renderTarget } const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? SkMatrix::I() : viewMatrix; - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - paint.getColor(), viewM, bounds, nullptr, &localMatrix)); - GrPipelineBuilder pipelineBuilder(std::move(paint), aaType); - pipelineBuilder.setUserStencil(passes[p]); - renderTargetContext->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, - std::move(op)); + renderTargetContext->addDrawOp( + clip, + GrNonAAFillRectOp::Make(std::move(paint), viewM, bounds, nullptr, &localMatrix, + aaType, passes[p])); } else { std::unique_ptr<GrLegacyMeshDrawOp> op = DefaultPathOp::Make(paint.getColor(), path, srcSpaceTol, newCoverage, diff --git a/src/gpu/ops/GrMSAAPathRenderer.cpp b/src/gpu/ops/GrMSAAPathRenderer.cpp index 49f82596f5..e2f12cfb2a 100644 --- a/src/gpu/ops/GrMSAAPathRenderer.cpp +++ b/src/gpu/ops/GrMSAAPathRenderer.cpp @@ -26,7 +26,7 @@ #include "glsl/GrGLSLUtil.h" #include "glsl/GrGLSLVertexShaderBuilder.h" #include "ops/GrMeshDrawOp.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" static const float kTolerance = 0.5f; @@ -668,13 +668,10 @@ bool GrMSAAPathRenderer::internalDrawPath(GrRenderTargetContext* renderTargetCon } const SkMatrix& viewM = (reverse && viewMatrix.hasPerspective()) ? SkMatrix::I() : viewMatrix; - std::unique_ptr<GrLegacyMeshDrawOp> op(GrRectOpFactory::MakeNonAAFill( - paint.getColor(), viewM, bounds, nullptr, &localMatrix)); - - GrPipelineBuilder pipelineBuilder(std::move(paint), aaType); - pipelineBuilder.setUserStencil(passes[1]); - - renderTargetContext->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, std::move(op)); + renderTargetContext->addDrawOp( + clip, + GrNonAAFillRectOp::Make(std::move(paint), viewM, bounds, nullptr, &localMatrix, + aaType, passes[1])); } return true; } diff --git a/src/gpu/ops/GrNewNonAAFillRectOp.cpp b/src/gpu/ops/GrNewNonAAFillRectOp.cpp deleted file mode 100644 index 328f01b4fb..0000000000 --- a/src/gpu/ops/GrNewNonAAFillRectOp.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "GrNewNonAAFillRectOp.h" -#include "GrAppliedClip.h" -#include "GrColor.h" -#include "GrDefaultGeoProcFactory.h" -#include "GrMeshDrawOp.h" -#include "GrOpFlushState.h" -#include "GrPrimitiveProcessor.h" -#include "GrQuad.h" -#include "GrResourceProvider.h" -#include "GrSimpleMeshDrawOpHelper.h" -#include "SkMatrixPriv.h" - -static const int kVertsPerRect = 4; -static const int kIndicesPerRect = 6; - -/** We always use per-vertex colors so that rects can be combined across color changes. Sometimes - we have explicit local coords and sometimes not. We *could* always provide explicit local - coords and just duplicate the positions when the caller hasn't provided a local coord rect, - but we haven't seen a use case which frequently switches between local rect and no local - rect draws. - - The vertex attrib order is always pos, color, [local coords]. - */ -static sk_sp<GrGeometryProcessor> make_gp() { - using namespace GrDefaultGeoProcFactory; - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, - LocalCoords::kHasExplicit_Type, SkMatrix::I()); -} - -static void tesselate(intptr_t vertices, - size_t vertexStride, - GrColor color, - const SkMatrix* viewMatrix, - const SkRect& rect, - const GrQuad* localQuad) { - SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); - - positions->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride); - - if (viewMatrix) { - SkMatrixPriv::MapPointsWithStride(*viewMatrix, positions, vertexStride, kVertsPerRect); - } - - // Setup local coords - // TODO we should only do this if local coords are being read - if (localQuad) { - static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); - for (int i = 0; i < kVertsPerRect; i++) { - SkPoint* coords = - reinterpret_cast<SkPoint*>(vertices + kLocalOffset + i * vertexStride); - *coords = localQuad->point(i); - } - } - - static const int kColorOffset = sizeof(SkPoint); - GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset); - for (int j = 0; j < 4; ++j) { - *vertColor = color; - vertColor = (GrColor*)((intptr_t)vertColor + vertexStride); - } -} - -class NewNonAAFillRectOp final : public GrMeshDrawOp { -private: - using Helper = GrSimpleMeshDrawOpHelperWithStencil; - -public: - DEFINE_OP_CLASS_ID - NewNonAAFillRectOp() = delete; - - static std::unique_ptr<GrDrawOp> Make(GrPaint&& paint, const SkMatrix& viewMatrix, - const SkRect& rect, const SkRect* localRect, - const SkMatrix* localMatrix, GrAAType aaType, - const GrUserStencilSettings* stencilSettings) { - SkASSERT(GrAAType::kCoverage != aaType); - return Helper::FactoryHelper<NewNonAAFillRectOp>(std::move(paint), viewMatrix, rect, - localRect, localMatrix, aaType, - stencilSettings); - } - - const char* name() const override { return "NonAAFillRectOp"; } - - SkString dumpInfo() const override { - SkString str; - str.append(GrMeshDrawOp::dumpInfo()); - str.appendf("# combined: %d\n", fRects.count()); - for (int i = 0; i < fRects.count(); ++i) { - const RectInfo& info = fRects[i]; - str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i, - info.fColor, info.fRect.fLeft, info.fRect.fTop, info.fRect.fRight, - info.fRect.fBottom); - } - return str; - } - - bool xpRequiresDstTexture(const GrCaps& caps, const GrAppliedClip* clip) override { - GrColor* color = &fRects.front().fColor; - return fHelper.xpRequiresDstTexture(caps, clip, GrProcessorAnalysisCoverage::kNone, color); - } - - FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); } - - NewNonAAFillRectOp(const Helper::MakeArgs& args, GrColor color, const SkMatrix& viewMatrix, - const SkRect& rect, const SkRect* localRect, const SkMatrix* localMatrix, - GrAAType aaType, const GrUserStencilSettings* stencilSettings) - : INHERITED(ClassID()), fHelper(args, aaType, stencilSettings) { - SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective())); - RectInfo& info = fRects.push_back(); - info.fColor = color; - info.fViewMatrix = viewMatrix; - info.fRect = rect; - if (localRect && localMatrix) { - info.fLocalQuad.setFromMappedRect(*localRect, *localMatrix); - } else if (localRect) { - info.fLocalQuad.set(*localRect); - } else if (localMatrix) { - info.fLocalQuad.setFromMappedRect(rect, *localMatrix); - } else { - info.fLocalQuad.set(rect); - } - this->setTransformedBounds(fRects[0].fRect, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); - } - -private: - void onPrepareDraws(Target* target) const override { - sk_sp<GrGeometryProcessor> gp = make_gp(); - if (!gp) { - SkDebugf("Couldn't create GrGeometryProcessor\n"); - return; - } - SkASSERT(gp->getVertexStride() == - sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)); - - size_t vertexStride = gp->getVertexStride(); - int rectCount = fRects.count(); - - sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - PatternHelper helper; - void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, - indexBuffer.get(), kVertsPerRect, kIndicesPerRect, rectCount); - if (!vertices || !indexBuffer) { - SkDebugf("Could not allocate vertices\n"); - return; - } - - for (int i = 0; i < rectCount; i++) { - intptr_t verts = - reinterpret_cast<intptr_t>(vertices) + i * kVertsPerRect * vertexStride; - tesselate(verts, vertexStride, fRects[i].fColor, &fRects[i].fViewMatrix, - fRects[i].fRect, &fRects[i].fLocalQuad); - } - helper.recordDraw(target, gp.get(), fHelper.makePipeline(target)); - } - - bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { - NewNonAAFillRectOp* that = t->cast<NewNonAAFillRectOp>(); - if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) { - return false; - } - fRects.push_back_n(that->fRects.count(), that->fRects.begin()); - this->joinBounds(*that); - return true; - } - - struct RectInfo { - GrColor fColor; - SkMatrix fViewMatrix; - SkRect fRect; - GrQuad fLocalQuad; - }; - - Helper fHelper; - SkSTArray<1, RectInfo, true> fRects; - typedef GrMeshDrawOp INHERITED; -}; - -namespace GrNewNonAAFillRectOp { - -std::unique_ptr<GrDrawOp> Make(GrPaint&& paint, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix, - GrAAType aaType, - const GrUserStencilSettings* stencilSettings) { - return NewNonAAFillRectOp::Make(std::move(paint), viewMatrix, rect, localRect, localMatrix, - aaType, stencilSettings); -} -}; // namespace GrNewNonAAFillRectOp - -/////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/ops/GrNewNonAAFillRectOp.h b/src/gpu/ops/GrNewNonAAFillRectOp.h deleted file mode 100644 index 8f78707854..0000000000 --- a/src/gpu/ops/GrNewNonAAFillRectOp.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef GrNewNonAAFillRectOp_DEFINED -#define GrNewNonAAFillRectOp_DEFINED - -#include <memory> -#include "GrColor.h" - -class GrDrawOp; -class GrPaint; -class SkMatrix; -struct SkRect; -struct GrUserStencilSettings; -enum class GrAAType : unsigned; - -namespace GrNewNonAAFillRectOp { -std::unique_ptr<GrDrawOp> Make(GrPaint&&, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix, - GrAAType, - const GrUserStencilSettings* = nullptr); -}; - -#endif diff --git a/src/gpu/ops/GrNonAAFillRectOp.cpp b/src/gpu/ops/GrNonAAFillRectOp.cpp index b9c20e146a..384856aec7 100644 --- a/src/gpu/ops/GrNonAAFillRectOp.cpp +++ b/src/gpu/ops/GrNonAAFillRectOp.cpp @@ -1,12 +1,12 @@ /* - * Copyright 2015 Google Inc. + * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrNonAAFillRectOp.h" - +#include "GrAppliedClip.h" #include "GrColor.h" #include "GrDefaultGeoProcFactory.h" #include "GrMeshDrawOp.h" @@ -14,11 +14,11 @@ #include "GrPrimitiveProcessor.h" #include "GrQuad.h" #include "GrResourceProvider.h" - +#include "GrSimpleMeshDrawOpHelper.h" #include "SkMatrixPriv.h" -static const int kVertsPerInstance = 4; -static const int kIndicesPerInstance = 6; +static const int kVertsPerRect = 4; +static const int kIndicesPerRect = 6; /** We always use per-vertex colors so that rects can be combined across color changes. Sometimes we have explicit local coords and sometimes not. We *could* always provide explicit local @@ -34,6 +34,35 @@ static sk_sp<GrGeometryProcessor> make_gp() { LocalCoords::kHasExplicit_Type, SkMatrix::I()); } +static sk_sp<GrGeometryProcessor> make_perspective_gp(const SkMatrix& viewMatrix, + bool hasExplicitLocalCoords, + const SkMatrix* localMatrix) { + SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); + + using namespace GrDefaultGeoProcFactory; + + // If we have perspective on the viewMatrix then we won't map on the CPU, nor will we map + // the local rect on the cpu (in case the localMatrix also has perspective). + // Otherwise, if we have a local rect, then we apply the localMatrix directly to the localRect + // to generate vertex local coords + if (viewMatrix.hasPerspective()) { + LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type + : LocalCoords::kUsePosition_Type, + localMatrix); + return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, + Coverage::kSolid_Type, localCoords, viewMatrix); + } else if (hasExplicitLocalCoords) { + LocalCoords localCoords(LocalCoords::kHasExplicit_Type, localMatrix); + return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, + Coverage::kSolid_Type, localCoords, SkMatrix::I()); + } else { + LocalCoords localCoords(LocalCoords::kUsePosition_Type, localMatrix); + return GrDefaultGeoProcFactory::MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, + Coverage::kSolid_Type, localCoords, + viewMatrix); + } +} + static void tesselate(intptr_t vertices, size_t vertexStride, GrColor color, @@ -45,14 +74,14 @@ static void tesselate(intptr_t vertices, positions->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride); if (viewMatrix) { - SkMatrixPriv::MapPointsWithStride(*viewMatrix, positions, vertexStride, kVertsPerInstance); + SkMatrixPriv::MapPointsWithStride(*viewMatrix, positions, vertexStride, kVertsPerRect); } // Setup local coords // TODO we should only do this if local coords are being read if (localQuad) { static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); - for (int i = 0; i < kVertsPerInstance; i++) { + for (int i = 0; i < kVertsPerRect; i++) { SkPoint* coords = reinterpret_cast<SkPoint*>(vertices + kLocalOffset + i * vertexStride); *coords = localQuad->point(i); @@ -67,13 +96,28 @@ static void tesselate(intptr_t vertices, } } -class NonAAFillRectOp final : public GrLegacyMeshDrawOp { +namespace { + +class NonAAFillRectOp final : public GrMeshDrawOp { +private: + using Helper = GrSimpleMeshDrawOpHelperWithStencil; + public: - DEFINE_OP_CLASS_ID + static std::unique_ptr<GrDrawOp> Make(GrPaint&& paint, const SkMatrix& viewMatrix, + const SkRect& rect, const SkRect* localRect, + const SkMatrix* localMatrix, GrAAType aaType, + const GrUserStencilSettings* stencilSettings) { + SkASSERT(GrAAType::kCoverage != aaType); + return Helper::FactoryHelper<NonAAFillRectOp>(std::move(paint), viewMatrix, rect, localRect, + localMatrix, aaType, stencilSettings); + } - NonAAFillRectOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, - const SkRect* localRect, const SkMatrix* localMatrix) - : INHERITED(ClassID()) { + NonAAFillRectOp() = delete; + + NonAAFillRectOp(const Helper::MakeArgs& args, GrColor color, const SkMatrix& viewMatrix, + const SkRect& rect, const SkRect* localRect, const SkMatrix* localMatrix, + GrAAType aaType, const GrUserStencilSettings* stencilSettings) + : INHERITED(ClassID()), fHelper(args, aaType, stencilSettings) { SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective())); RectInfo& info = fRects.push_back(); info.fColor = color; @@ -95,7 +139,7 @@ public: SkString dumpInfo() const override { SkString str; - str.append(INHERITED::dumpInfo()); + str.append(GrMeshDrawOp::dumpInfo()); str.appendf("# combined: %d\n", fRects.count()); for (int i = 0; i < fRects.count(); ++i) { const RectInfo& info = fRects[i]; @@ -103,23 +147,19 @@ public: info.fColor, info.fRect.fLeft, info.fRect.fTop, info.fRect.fRight, info.fRect.fBottom); } - str.append(DumpPipelineInfo(*this->pipeline())); return str; } -private: - NonAAFillRectOp() : INHERITED(ClassID()) {} - - void getProcessorAnalysisInputs(GrProcessorAnalysisColor* color, - GrProcessorAnalysisCoverage* coverage) const override { - color->setToConstant(fRects[0].fColor); - *coverage = GrProcessorAnalysisCoverage::kNone; + bool xpRequiresDstTexture(const GrCaps& caps, const GrAppliedClip* clip) override { + GrColor* color = &fRects.front().fColor; + return fHelper.xpRequiresDstTexture(caps, clip, GrProcessorAnalysisCoverage::kNone, color); } - void applyPipelineOptimizations(const PipelineOptimizations& optimizations) override { - optimizations.getOverrideColorIfSet(&fRects[0].fColor); - } + FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); } + + DEFINE_OP_CLASS_ID +private: void onPrepareDraws(Target* target) const override { sk_sp<GrGeometryProcessor> gp = make_gp(); if (!gp) { @@ -130,34 +170,31 @@ private: sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)); size_t vertexStride = gp->getVertexStride(); - int instanceCount = fRects.count(); + int rectCount = fRects.count(); sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); PatternHelper helper; - void* vertices = - helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), - kVertsPerInstance, kIndicesPerInstance, instanceCount); + void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, + indexBuffer.get(), kVertsPerRect, kIndicesPerRect, rectCount); if (!vertices || !indexBuffer) { SkDebugf("Could not allocate vertices\n"); return; } - for (int i = 0; i < instanceCount; i++) { + for (int i = 0; i < rectCount; i++) { intptr_t verts = - reinterpret_cast<intptr_t>(vertices) + i * kVertsPerInstance * vertexStride; + reinterpret_cast<intptr_t>(vertices) + i * kVertsPerRect * vertexStride; tesselate(verts, vertexStride, fRects[i].fColor, &fRects[i].fViewMatrix, fRects[i].fRect, &fRects[i].fLocalQuad); } - helper.recordDraw(target, gp.get(), this->pipeline()); + helper.recordDraw(target, gp.get(), fHelper.makePipeline(target)); } bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { NonAAFillRectOp* that = t->cast<NonAAFillRectOp>(); - if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(), - that->bounds(), caps)) { + if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) { return false; } - fRects.push_back_n(that->fRects.count(), that->fRects.begin()); this->joinBounds(*that); return true; @@ -170,43 +207,173 @@ private: GrQuad fLocalQuad; }; + Helper fHelper; SkSTArray<1, RectInfo, true> fRects; - - typedef GrLegacyMeshDrawOp INHERITED; + typedef GrMeshDrawOp INHERITED; }; -namespace GrNonAAFillRectOp { +// We handle perspective in the local matrix or viewmatrix with special ops. +class NonAAFillRectPerspectiveOp final : public GrMeshDrawOp { +private: + using Helper = GrSimpleMeshDrawOpHelperWithStencil; -std::unique_ptr<GrLegacyMeshDrawOp> Make(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix) { - return std::unique_ptr<GrLegacyMeshDrawOp>( - new NonAAFillRectOp(color, viewMatrix, rect, localRect, localMatrix)); -} -}; +public: + static std::unique_ptr<GrDrawOp> Make(GrPaint&& paint, const SkMatrix& viewMatrix, + const SkRect& rect, const SkRect* localRect, + const SkMatrix* localMatrix, GrAAType aaType, + const GrUserStencilSettings* stencilSettings) { + SkASSERT(GrAAType::kCoverage != aaType); + return Helper::FactoryHelper<NonAAFillRectPerspectiveOp>(std::move(paint), viewMatrix, rect, + localRect, localMatrix, aaType, + stencilSettings); + } -/////////////////////////////////////////////////////////////////////////////////////////////////// + NonAAFillRectPerspectiveOp() = delete; + + NonAAFillRectPerspectiveOp(const Helper::MakeArgs& args, GrColor color, + const SkMatrix& viewMatrix, const SkRect& rect, + const SkRect* localRect, const SkMatrix* localMatrix, + GrAAType aaType, const GrUserStencilSettings* stencilSettings) + : INHERITED(ClassID()) + , fHelper(args, aaType, stencilSettings) + , fViewMatrix(viewMatrix) { + SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); + RectInfo& info = fRects.push_back(); + info.fColor = color; + info.fRect = rect; + fHasLocalRect = SkToBool(localRect); + fHasLocalMatrix = SkToBool(localMatrix); + if (fHasLocalMatrix) { + fLocalMatrix = *localMatrix; + } + if (fHasLocalRect) { + info.fLocalRect = *localRect; + } + this->setTransformedBounds(rect, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); + } + + const char* name() const override { return "NonAAFillRectPerspectiveOp"; } + + SkString dumpInfo() const override { + SkString str; + str.appendf("# combined: %d\n", fRects.count()); + for (int i = 0; i < fRects.count(); ++i) { + const RectInfo& geo = fRects[0]; + str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i, + geo.fColor, geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, + geo.fRect.fBottom); + } + str.append(INHERITED::dumpInfo()); + return str; + } + + bool xpRequiresDstTexture(const GrCaps& caps, const GrAppliedClip* clip) override { + GrColor* color = &fRects.front().fColor; + return fHelper.xpRequiresDstTexture(caps, clip, GrProcessorAnalysisCoverage::kNone, color); + } + + FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); } -#if GR_TEST_UTILS + DEFINE_OP_CLASS_ID + +private: + void onPrepareDraws(Target* target) const override { + sk_sp<GrGeometryProcessor> gp = make_perspective_gp( + fViewMatrix, fHasLocalRect, fHasLocalMatrix ? &fLocalMatrix : nullptr); + if (!gp) { + SkDebugf("Couldn't create GrGeometryProcessor\n"); + return; + } + SkASSERT(fHasLocalRect + ? gp->getVertexStride() == + sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) + : gp->getVertexStride() == + sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); + + size_t vertexStride = gp->getVertexStride(); + int rectCount = fRects.count(); + + sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); + PatternHelper helper; + void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, + indexBuffer.get(), kVertsPerRect, kIndicesPerRect, rectCount); + if (!vertices || !indexBuffer) { + SkDebugf("Could not allocate vertices\n"); + return; + } -#include "GrDrawOpTest.h" + for (int i = 0; i < rectCount; i++) { + const RectInfo& info = fRects[i]; + intptr_t verts = + reinterpret_cast<intptr_t>(vertices) + i * kVertsPerRect * vertexStride; + if (fHasLocalRect) { + GrQuad quad(info.fLocalRect); + tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, &quad); + } else { + tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, nullptr); + } + } + helper.recordDraw(target, gp.get(), fHelper.makePipeline(target)); + } -DRAW_OP_TEST_DEFINE(NonAAFillRectOp) { - GrColor color = GrRandomColor(random); - SkRect rect = GrTest::TestRect(random); - SkRect localRect = GrTest::TestRect(random); - SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); - SkMatrix localMatrix = GrTest::TestMatrix(random); + bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { + NonAAFillRectPerspectiveOp* that = t->cast<NonAAFillRectPerspectiveOp>(); + if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) { + return false; + } - bool hasLocalRect = random->nextBool(); - bool hasLocalMatrix = random->nextBool(); - return GrNonAAFillRectOp::Make(color, - viewMatrix, - rect, - hasLocalRect ? &localRect : nullptr, - hasLocalMatrix ? &localMatrix : nullptr); + // We could combine across perspective vm changes if we really wanted to. + if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) { + return false; + } + if (fHasLocalRect != that->fHasLocalRect) { + return false; + } + if (fHasLocalMatrix && !fLocalMatrix.cheapEqualTo(that->fLocalMatrix)) { + return false; + } + + fRects.push_back_n(that->fRects.count(), that->fRects.begin()); + this->joinBounds(*that); + return true; + } + + struct RectInfo { + SkRect fRect; + GrColor fColor; + SkRect fLocalRect; + }; + + SkSTArray<1, RectInfo, true> fRects; + Helper fHelper; + bool fHasLocalMatrix; + bool fHasLocalRect; + SkMatrix fLocalMatrix; + SkMatrix fViewMatrix; + + typedef GrMeshDrawOp INHERITED; +}; + +} // anonymous namespace + +namespace GrNonAAFillRectOp { + +std::unique_ptr<GrDrawOp> Make(GrPaint&& paint, + const SkMatrix& viewMatrix, + const SkRect& rect, + const SkRect* localRect, + const SkMatrix* localMatrix, + GrAAType aaType, + const GrUserStencilSettings* stencilSettings) { + if (!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective())) { + return NonAAFillRectOp::Make(std::move(paint), viewMatrix, rect, localRect, localMatrix, + aaType, stencilSettings); + } else { + return NonAAFillRectPerspectiveOp::Make(std::move(paint), viewMatrix, rect, localRect, + localMatrix, aaType, stencilSettings); + } } -#endif +}; // namespace GrNonAAFillRectOp + +/////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/ops/GrNonAAFillRectOp.h b/src/gpu/ops/GrNonAAFillRectOp.h index 8972281847..c936f2efa2 100644 --- a/src/gpu/ops/GrNonAAFillRectOp.h +++ b/src/gpu/ops/GrNonAAFillRectOp.h @@ -1,5 +1,5 @@ /* - * Copyright 2015 Google Inc. + * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. @@ -8,26 +8,24 @@ #ifndef GrNonAAFillRectOp_DEFINED #define GrNonAAFillRectOp_DEFINED +#include <memory> #include "GrColor.h" -#include "SkRefCnt.h" -class GrLegacyMeshDrawOp; +class GrDrawOp; +class GrPaint; class SkMatrix; struct SkRect; +struct GrUserStencilSettings; +enum class GrAAType : unsigned; namespace GrNonAAFillRectOp { - -std::unique_ptr<GrLegacyMeshDrawOp> Make(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix); - -std::unique_ptr<GrLegacyMeshDrawOp> MakeWithPerspective(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix); +std::unique_ptr<GrDrawOp> Make(GrPaint&&, + const SkMatrix& viewMatrix, + const SkRect& rect, + const SkRect* localRect, + const SkMatrix* localMatrix, + GrAAType, + const GrUserStencilSettings* = nullptr); }; #endif diff --git a/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp b/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp deleted file mode 100644 index 647f69e907..0000000000 --- a/src/gpu/ops/GrNonAAFillRectPerspectiveOp.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright 2015 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "GrNonAAFillRectOp.h" - -#include "GrColor.h" -#include "GrDefaultGeoProcFactory.h" -#include "GrMeshDrawOp.h" -#include "GrOpFlushState.h" -#include "GrPrimitiveProcessor.h" -#include "GrQuad.h" -#include "GrResourceProvider.h" - -static const int kVertsPerInstance = 4; -static const int kIndicesPerInstance = 6; - -/** We always use per-vertex colors so that rects can be combined across color changes. Sometimes - we have explicit local coords and sometimes not. We *could* always provide explicit local - coords and just duplicate the positions when the caller hasn't provided a local coord rect, - but we haven't seen a use case which frequently switches between local rect and no local - rect draws. - - The vertex attrib order is always pos, color, [local coords]. - */ -static sk_sp<GrGeometryProcessor> make_persp_gp(const SkMatrix& viewMatrix, - bool hasExplicitLocalCoords, - const SkMatrix* localMatrix) { - SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); - - using namespace GrDefaultGeoProcFactory; - - // If we have perspective on the viewMatrix then we won't map on the CPU, nor will we map - // the local rect on the cpu (in case the localMatrix also has perspective). - // Otherwise, if we have a local rect, then we apply the localMatrix directly to the localRect - // to generate vertex local coords - if (viewMatrix.hasPerspective()) { - LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type - : LocalCoords::kUsePosition_Type, - localMatrix); - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, - Coverage::kSolid_Type, localCoords, viewMatrix); - } else if (hasExplicitLocalCoords) { - LocalCoords localCoords(LocalCoords::kHasExplicit_Type, localMatrix); - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, - Coverage::kSolid_Type, localCoords, SkMatrix::I()); - } else { - LocalCoords localCoords(LocalCoords::kUsePosition_Type, localMatrix); - return GrDefaultGeoProcFactory::MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, - Coverage::kSolid_Type, localCoords, - viewMatrix); - } -} - -static void tesselate(intptr_t vertices, - size_t vertexStride, - GrColor color, - const SkMatrix* viewMatrix, - const SkRect& rect, - const GrQuad* localQuad) { - SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); - - positions->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vertexStride); - - if (viewMatrix) { - viewMatrix->mapPointsWithStride(positions, vertexStride, kVertsPerInstance); - } - - // Setup local coords - // TODO we should only do this if local coords are being read - if (localQuad) { - static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); - for (int i = 0; i < kVertsPerInstance; i++) { - SkPoint* coords = - reinterpret_cast<SkPoint*>(vertices + kLocalOffset + i * vertexStride); - *coords = localQuad->point(i); - } - } - - static const int kColorOffset = sizeof(SkPoint); - GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset); - for (int j = 0; j < 4; ++j) { - *vertColor = color; - vertColor = (GrColor*)((intptr_t)vertColor + vertexStride); - } -} - -// We handle perspective in the local matrix or viewmatrix with special ops. -class NonAAFillRectPerspectiveOp final : public GrLegacyMeshDrawOp { -public: - DEFINE_OP_CLASS_ID - - NonAAFillRectPerspectiveOp(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, - const SkRect* localRect, const SkMatrix* localMatrix) - : INHERITED(ClassID()), fViewMatrix(viewMatrix) { - SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); - RectInfo& info = fRects.push_back(); - info.fColor = color; - info.fRect = rect; - fHasLocalRect = SkToBool(localRect); - fHasLocalMatrix = SkToBool(localMatrix); - if (fHasLocalMatrix) { - fLocalMatrix = *localMatrix; - } - if (fHasLocalRect) { - info.fLocalRect = *localRect; - } - this->setTransformedBounds(rect, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); - } - - const char* name() const override { return "NonAAFillRectPerspectiveOp"; } - - SkString dumpInfo() const override { - SkString str; - str.appendf("# combined: %d\n", fRects.count()); - for (int i = 0; i < fRects.count(); ++i) { - const RectInfo& geo = fRects[0]; - str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n", i, - geo.fColor, geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, - geo.fRect.fBottom); - } - str.append(DumpPipelineInfo(*this->pipeline())); - str.append(INHERITED::dumpInfo()); - return str; - } - -private: - NonAAFillRectPerspectiveOp() : INHERITED(ClassID()) {} - - void getProcessorAnalysisInputs(GrProcessorAnalysisColor* color, - GrProcessorAnalysisCoverage* coverage) const override { - color->setToConstant(fRects[0].fColor); - *coverage = GrProcessorAnalysisCoverage::kNone; - } - - void applyPipelineOptimizations(const PipelineOptimizations& optimizations) override { - optimizations.getOverrideColorIfSet(&fRects[0].fColor); - } - - void onPrepareDraws(Target* target) const override { - sk_sp<GrGeometryProcessor> gp = make_persp_gp(fViewMatrix, - fHasLocalRect, - fHasLocalMatrix ? &fLocalMatrix : nullptr); - if (!gp) { - SkDebugf("Couldn't create GrGeometryProcessor\n"); - return; - } - SkASSERT(fHasLocalRect - ? gp->getVertexStride() == - sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) - : gp->getVertexStride() == - sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); - - size_t vertexStride = gp->getVertexStride(); - int instanceCount = fRects.count(); - - sk_sp<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer()); - PatternHelper helper; - void* vertices = - helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexBuffer.get(), - kVertsPerInstance, kIndicesPerInstance, instanceCount); - if (!vertices || !indexBuffer) { - SkDebugf("Could not allocate vertices\n"); - return; - } - - for (int i = 0; i < instanceCount; i++) { - const RectInfo& info = fRects[i]; - intptr_t verts = - reinterpret_cast<intptr_t>(vertices) + i * kVertsPerInstance * vertexStride; - if (fHasLocalRect) { - GrQuad quad(info.fLocalRect); - tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, &quad); - } else { - tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, nullptr); - } - } - helper.recordDraw(target, gp.get(), this->pipeline()); - } - - bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { - NonAAFillRectPerspectiveOp* that = t->cast<NonAAFillRectPerspectiveOp>(); - if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(), - that->bounds(), caps)) { - return false; - } - - // We could combine across perspective vm changes if we really wanted to. - if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) { - return false; - } - if (fHasLocalRect != that->fHasLocalRect) { - return false; - } - if (fHasLocalMatrix && !fLocalMatrix.cheapEqualTo(that->fLocalMatrix)) { - return false; - } - - fRects.push_back_n(that->fRects.count(), that->fRects.begin()); - this->joinBounds(*that); - return true; - } - - struct RectInfo { - SkRect fRect; - GrColor fColor; - SkRect fLocalRect; - }; - - SkSTArray<1, RectInfo, true> fRects; - bool fHasLocalMatrix; - bool fHasLocalRect; - SkMatrix fLocalMatrix; - SkMatrix fViewMatrix; - - typedef GrLegacyMeshDrawOp INHERITED; -}; - -namespace GrNonAAFillRectOp { - -std::unique_ptr<GrLegacyMeshDrawOp> MakeWithPerspective(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix) { - return std::unique_ptr<GrLegacyMeshDrawOp>( - new NonAAFillRectPerspectiveOp(color, viewMatrix, rect, localRect, localMatrix)); -} -}; - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -#if GR_TEST_UTILS - -#include "GrDrawOpTest.h" - -DRAW_OP_TEST_DEFINE(NonAAFillRectPerspectiveOp) { - GrColor color = GrRandomColor(random); - SkRect rect = GrTest::TestRect(random); - SkRect localRect = GrTest::TestRect(random); - SkMatrix viewMatrix = GrTest::TestMatrix(random); - bool hasLocalMatrix = random->nextBool(); - SkMatrix localMatrix; - if (!viewMatrix.hasPerspective()) { - localMatrix = GrTest::TestMatrixPerspective(random); - hasLocalMatrix = true; - } - - bool hasLocalRect = random->nextBool(); - return GrNonAAFillRectOp::MakeWithPerspective(color, viewMatrix, rect, - hasLocalRect ? &localRect : nullptr, - hasLocalMatrix ? &localMatrix : nullptr); -} - -#endif diff --git a/src/gpu/ops/GrRectOpFactory.h b/src/gpu/ops/GrRectOpFactory.h index fef88e6d31..f4b1b803fb 100644 --- a/src/gpu/ops/GrRectOpFactory.h +++ b/src/gpu/ops/GrRectOpFactory.h @@ -13,7 +13,6 @@ #include "GrAnalyticRectOp.h" #include "GrColor.h" #include "GrMeshDrawOp.h" -#include "GrNonAAFillRectOp.h" #include "GrNonAAStrokeRectOp.h" #include "GrPaint.h" #include "SkMatrix.h" @@ -27,19 +26,6 @@ class SkStrokeRec; */ namespace GrRectOpFactory { -inline std::unique_ptr<GrLegacyMeshDrawOp> MakeNonAAFill(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect* localRect, - const SkMatrix* localMatrix) { - if (viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())) { - return GrNonAAFillRectOp::MakeWithPerspective(color, viewMatrix, rect, localRect, - localMatrix); - } else { - return GrNonAAFillRectOp::Make(color, viewMatrix, rect, localRect, localMatrix); - } -} - inline std::unique_ptr<GrLegacyMeshDrawOp> MakeAAFill(const GrPaint& paint, const SkMatrix& viewMatrix, const SkRect& rect, diff --git a/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp b/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp index 983235942b..4822850d60 100644 --- a/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp +++ b/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp @@ -18,7 +18,7 @@ #include "GrResourceProvider.h" #include "GrStencilPathOp.h" #include "GrStyle.h" -#include "ops/GrRectOpFactory.h" +#include "ops/GrNonAAFillRectOp.h" GrPathRenderer* GrStencilAndCoverPathRenderer::Create(GrResourceProvider* resourceProvider, const GrCaps& caps) { @@ -112,9 +112,6 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) { } const SkMatrix& viewM = viewMatrix.hasPerspective() ? SkMatrix::I() : viewMatrix; - std::unique_ptr<GrLegacyMeshDrawOp> coverOp(GrRectOpFactory::MakeNonAAFill( - args.fPaint.getColor(), viewM, bounds, nullptr, &invert)); - // fake inverse with a stencil and cover args.fRenderTargetContext->priv().stencilPath(*args.fClip, args.fAAType, viewMatrix, path.get()); @@ -138,11 +135,10 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) { if (GrAAType::kMixedSamples == coverAAType) { coverAAType = GrAAType::kNone; } - GrPipelineBuilder pipelineBuilder(std::move(args.fPaint), coverAAType); - pipelineBuilder.setUserStencil(&kInvertedCoverPass); - - args.fRenderTargetContext->addLegacyMeshDrawOp(std::move(pipelineBuilder), *args.fClip, - std::move(coverOp)); + args.fRenderTargetContext->addDrawOp( + *args.fClip, + GrNonAAFillRectOp::Make(std::move(args.fPaint), viewM, bounds, nullptr, &invert, + coverAAType, &kInvertedCoverPass)); } } else { std::unique_ptr<GrDrawOp> op = diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp index 29ea29f9a2..ee89ff3739 100644 --- a/tests/ProcessorTest.cpp +++ b/tests/ProcessorTest.cpp @@ -9,6 +9,7 @@ #include "Test.h" #if SK_SUPPORT_GPU +#include <random> #include "GrClip.h" #include "GrContext.h" #include "GrGpuResource.h" @@ -20,7 +21,6 @@ #include "glsl/GrGLSLFragmentShaderBuilder.h" #include "ops/GrNonAAFillRectOp.h" #include "ops/GrTestMeshDrawOp.h" -#include <random> namespace { class TestOp : public GrTestMeshDrawOp { @@ -266,11 +266,11 @@ void test_draw_op(GrRenderTargetContext* rtc, sk_sp<GrFragmentProcessor> fp, nullptr, SkMatrix::I()); paint.addColorFragmentProcessor(std::move(fp)); paint.setPorterDuffXPFactory(SkBlendMode::kSrc); - GrPipelineBuilder pb(std::move(paint), GrAAType::kNone); - auto op = - GrNonAAFillRectOp::Make(GrColor_WHITE, SkMatrix::I(), - SkRect::MakeWH(rtc->width(), rtc->height()), nullptr, nullptr); - rtc->addLegacyMeshDrawOp(std::move(pb), GrNoClip(), std::move(op)); + + auto op = GrNonAAFillRectOp::Make(std::move(paint), SkMatrix::I(), + SkRect::MakeWH(rtc->width(), rtc->height()), nullptr, nullptr, + GrAAType::kNone); + rtc->addDrawOp(GrNoClip(), std::move(op)); } #include "SkCommandLineFlags.h" diff --git a/tools/gpu/GrTest.cpp b/tools/gpu/GrTest.cpp index cd21e83ab1..73ceab435c 100644 --- a/tools/gpu/GrTest.cpp +++ b/tools/gpu/GrTest.cpp @@ -254,8 +254,9 @@ uint32_t GrRenderTargetContextPriv::testingOnly_addLegacyMeshDrawOp( if (fRenderTargetContext->drawingManager()->wasAbandoned()) { return SK_InvalidUniqueID; } - SkDEBUGCODE(fRenderTargetContext->validate();) GR_AUDIT_TRAIL_AUTO_FRAME( - fRenderTargetContext->fAuditTrail, "GrRenderTargetContext::testingOnly_addMeshDrawOp"); + SkDEBUGCODE(fRenderTargetContext->validate()); + GR_AUDIT_TRAIL_AUTO_FRAME(fRenderTargetContext->fAuditTrail, + "GrRenderTargetContext::testingOnly_addLegacyMeshDrawOp"); GrPipelineBuilder pipelineBuilder(std::move(paint), aaType); if (uss) { @@ -267,6 +268,17 @@ uint32_t GrRenderTargetContextPriv::testingOnly_addLegacyMeshDrawOp( std::move(op)); } +uint32_t GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) { + ASSERT_SINGLE_OWNER + if (fRenderTargetContext->drawingManager()->wasAbandoned()) { + return SK_InvalidUniqueID; + } + SkDEBUGCODE(fRenderTargetContext->validate()); + GR_AUDIT_TRAIL_AUTO_FRAME(fRenderTargetContext->fAuditTrail, + "GrRenderTargetContext::testingOnly_addDrawOp"); + return fRenderTargetContext->addDrawOp(GrNoClip(), std::move(op)); +} + #undef ASSERT_SINGLE_OWNER /////////////////////////////////////////////////////////////////////////////// |