blob: be28c54143c6b6879fb91b8fac94a3fcd63c395e [file] [log] [blame]
/*
* 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 "src/core/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 <cstdint>
#include <utility>
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 <typename Op, typename... OpArgs>
static GrOp::Owner FactoryHelper(GrRecordingContext* context, GrPaint&& paint,
OpArgs... opArgs) {
return GrSimpleMeshDrawOpHelper::FactoryHelper<Op, OpArgs...>(
context, std::move(paint), std::forward<OpArgs>(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