/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrSimpleMeshDrawOpHelperWithStencil_DEFINED #define GrSimpleMeshDrawOpHelperWithStencil_DEFINED #include "include/core/SkString.h" #include "include/private/SkColorData.h" #include "src/gpu/ganesh/GrCaps.h" #include "src/gpu/ganesh/GrPaint.h" #include "src/gpu/ganesh/GrProcessorSet.h" #include "src/gpu/ganesh/ops/GrDrawOp.h" #include "src/gpu/ganesh/ops/GrOp.h" #include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelper.h" #include #include class GrAppliedClip; class GrDstProxyView; class GrGeometryProcessor; class GrProcessorAnalysisColor; class GrProgramInfo; class GrRecordingContext; class GrSurfaceProxyView; class SkArenaAlloc; enum class GrAAType : unsigned int; enum class GrClampType; enum class GrLoadOp; enum class GrPrimitiveType : uint8_t; enum class GrProcessorAnalysisCoverage; enum class GrXferBarrierFlags; struct GrUserStencilSettings; struct SkRect; /** * This class extends GrSimpleMeshDrawOpHelper to support an optional GrUserStencilSettings. This * uses private inheritance because it non-virtually overrides methods in the base class and should * never be used with a GrSimpleMeshDrawOpHelper pointer or reference. */ class GrSimpleMeshDrawOpHelperWithStencil : private GrSimpleMeshDrawOpHelper { public: using InputFlags = GrSimpleMeshDrawOpHelper::InputFlags; using GrSimpleMeshDrawOpHelper::visitProxies; using GrSimpleMeshDrawOpHelper::createPipeline; GrProgramInfo* createProgramInfoWithStencil(const GrCaps*, SkArenaAlloc*, const GrSurfaceProxyView& writeView, bool usesMSAASurface, GrAppliedClip&&, const GrDstProxyView&, GrGeometryProcessor*, GrPrimitiveType, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp); // using declarations can't be templated, so this is a pass through function instead. template static GrOp::Owner FactoryHelper(GrRecordingContext* context, GrPaint&& paint, OpArgs... opArgs) { return GrSimpleMeshDrawOpHelper::FactoryHelper( context, std::move(paint), std::forward(opArgs)...); } GrSimpleMeshDrawOpHelperWithStencil(GrProcessorSet*, GrAAType, const GrUserStencilSettings*, InputFlags = InputFlags::kNone); GrDrawOp::FixedFunctionFlags fixedFunctionFlags() const; GrProcessorSet::Analysis finalizeProcessors(const GrCaps& caps, const GrAppliedClip* clip, GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage, GrProcessorAnalysisColor* geometryColor) { return this->INHERITED::finalizeProcessors(caps, clip, fStencilSettings, clampType, geometryCoverage, geometryColor); } GrProcessorSet::Analysis finalizeProcessors(const GrCaps&, const GrAppliedClip*, GrClampType, GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor, bool* wideColor); using GrSimpleMeshDrawOpHelper::aaType; using GrSimpleMeshDrawOpHelper::setAAType; using GrSimpleMeshDrawOpHelper::isTrivial; using GrSimpleMeshDrawOpHelper::usesLocalCoords; using GrSimpleMeshDrawOpHelper::compatibleWithCoverageAsAlpha; using GrSimpleMeshDrawOpHelper::detachProcessorSet; using GrSimpleMeshDrawOpHelper::pipelineFlags; bool isCompatible(const GrSimpleMeshDrawOpHelperWithStencil& that, const GrCaps&, const SkRect& thisBounds, const SkRect& thatBounds, bool ignoreAAType = false) const; #if defined(GPU_TEST_UTILS) SkString dumpInfo() const; #endif const GrUserStencilSettings* stencilSettings() const { return fStencilSettings; } private: const GrUserStencilSettings* fStencilSettings; using INHERITED = GrSimpleMeshDrawOpHelper; }; #endif