blob: 43f278d5dca084ceb266e9cb5de82e1307ec31ed [file] [log] [blame]
egdaniel3658f382014-09-15 07:01:59 -07001/*
egdaniel8dd688b2015-01-22 10:16:09 -08002 * Copyright 2015 Google Inc.
egdaniel3658f382014-09-15 07:01:59 -07003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
egdaniel8dd688b2015-01-22 10:16:09 -08008#ifndef GrPipeline_DEFINED
9#define GrPipeline_DEFINED
egdaniel3658f382014-09-15 07:01:59 -070010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkMatrix.h"
12#include "include/core/SkRefCnt.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040013#include "src/gpu/GrColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrFragmentProcessor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/gpu/GrProcessorSet.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "src/gpu/GrScissorState.h"
Greg Daniel524e28b2019-11-01 11:48:53 -040017#include "src/gpu/GrSurfaceProxyView.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "src/gpu/GrUserStencilSettings.h"
19#include "src/gpu/GrWindowRectsState.h"
20#include "src/gpu/effects/GrCoverageSetOpXP.h"
21#include "src/gpu/effects/GrDisableColorXP.h"
22#include "src/gpu/effects/GrPorterDuffXferProcessor.h"
Brian Salomonb8f098d2020-01-07 11:15:44 -050023#include "src/gpu/effects/GrTextureEffect.h"
Michael Ludwig663afe52019-06-03 16:46:19 -040024#include "src/gpu/geometry/GrRect.h"
robertphillips5fa7f302016-07-21 09:21:04 -070025
Brian Salomon652ecb52017-01-17 12:39:53 -050026class GrAppliedClip;
Chris Daltonb832ce62020-01-06 19:49:37 -070027class GrAppliedHardClip;
Brian Salomon25a88092016-12-01 09:36:50 -050028class GrOp;
Brian Salomon25a88092016-12-01 09:36:50 -050029class GrRenderTargetContext;
egdaniel3658f382014-09-15 07:01:59 -070030
Brian Salomon92aee3d2016-12-21 09:20:25 -050031/**
Brian Salomone5b399e2017-07-19 13:50:54 -040032 * This immutable object contains information needed to set build a shader program and set API
33 * state for a draw. It is used along with a GrPrimitiveProcessor and a source of geometric
Chris Daltoneb694b72020-03-16 09:25:50 -060034 * data to draw.
egdaniel3658f382014-09-15 07:01:59 -070035 */
Brian Salomon16351462017-07-19 16:35:31 -040036class GrPipeline {
egdaniel3658f382014-09-15 07:01:59 -070037public:
bsalomoncb02b382015-08-12 11:14:50 -070038 ///////////////////////////////////////////////////////////////////////////
39 /// @name Creation
40
Chris Daltonbaa1b352019-04-03 12:03:00 -060041 // Pipeline options that the caller may enable.
42 // NOTE: This enum is extended later by GrPipeline::Flags.
43 enum class InputFlags : uint8_t {
44 kNone = 0,
Brian Salomon189098e72017-01-19 09:55:19 -050045 /**
46 * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
47 * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
48 * the 3D API.
49 */
Chris Daltonbaa1b352019-04-03 12:03:00 -060050 kHWAntialias = (1 << 0),
Brian Salomon189098e72017-01-19 09:55:19 -050051 /**
Chris Daltonce425af2019-12-16 10:39:03 -070052 * Cause every pixel to be rasterized that is touched by the triangle anywhere (not just at
53 * pixel center). Additionally, if using MSAA, the sample mask will always have 100%
54 * coverage.
55 * NOTE: The primitive type must be a triangle type.
56 */
57 kConservativeRaster = (1 << 1),
58 /**
Chris Dalton1215cda2019-12-17 21:44:04 -070059 * Draws triangles as outlines.
60 */
61 kWireframe = (1 << 2),
62 /**
Brian Salomon189098e72017-01-19 09:55:19 -050063 * Modifies the vertex shader so that vertices will be positioned at pixel centers.
64 */
Chris Dalton1215cda2019-12-17 21:44:04 -070065 kSnapVerticesToPixelCenters = (1 << 3), // This value must be last. (See kLastInputFlag.)
Brian Salomon189098e72017-01-19 09:55:19 -050066 };
67
Brian Salomonb5cb6832017-02-24 11:01:15 -050068 struct InitArgs {
Chris Daltonbaa1b352019-04-03 12:03:00 -060069 InputFlags fInputFlags = InputFlags::kNone;
Brian Salomon189098e72017-01-19 09:55:19 -050070 const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused;
Brian Salomon189098e72017-01-19 09:55:19 -050071 const GrCaps* fCaps = nullptr;
Greg Daniel524e28b2019-11-01 11:48:53 -040072 GrXferProcessor::DstProxyView fDstProxyView;
Brian Salomon982f5462020-03-30 12:52:33 -040073 GrSwizzle fWriteSwizzle;
bsalomona387a112015-08-11 14:47:42 -070074 };
75
Brian Salomonb5cb6832017-02-24 11:01:15 -050076 /**
csmartdalton119fb2b2017-02-08 14:41:05 -050077 * Creates a simple pipeline with default settings and no processors. The provided blend mode
Chris Dalton916c4982018-08-15 00:53:25 -060078 * must be "Porter Duff" (<= kLastCoeffMode). If using GrScissorTest::kEnabled, the caller must
Chris Dalton46983b72017-06-06 12:27:16 -060079 * specify a scissor rectangle through the DynamicState struct.
csmartdalton119fb2b2017-02-08 14:41:05 -050080 **/
Brian Salomon982f5462020-03-30 12:52:33 -040081 GrPipeline(GrScissorTest scissor,
82 SkBlendMode blend,
83 const GrSwizzle& writeSwizzle,
Chris Daltonc3318f02019-07-19 14:20:53 -060084 InputFlags flags = InputFlags::kNone,
85 const GrUserStencilSettings* stencil = &GrUserStencilSettings::kUnused)
Brian Salomon982f5462020-03-30 12:52:33 -040086 : GrPipeline(scissor,
87 GrPorterDuffXPFactory::MakeNoCoverageXP(blend),
88 writeSwizzle,
89 flags,
90 stencil) {}
Chris Daltonc3318f02019-07-19 14:20:53 -060091
Brian Salomon982f5462020-03-30 12:52:33 -040092 GrPipeline(GrScissorTest,
93 sk_sp<const GrXferProcessor>,
94 const GrSwizzle& writeSwizzle,
Greg Daniel2c3398d2019-06-19 11:58:01 -040095 InputFlags = InputFlags::kNone,
Chris Daltond7291ba2019-03-07 14:17:03 -070096 const GrUserStencilSettings* = &GrUserStencilSettings::kUnused);
csmartdalton119fb2b2017-02-08 14:41:05 -050097
Chris Daltonb832ce62020-01-06 19:49:37 -070098 GrPipeline(const InitArgs& args, sk_sp<const GrXferProcessor>, const GrAppliedHardClip&);
Brian Salomonbfd18cd2017-08-09 16:27:09 -040099 GrPipeline(const InitArgs&, GrProcessorSet&&, GrAppliedClip&&);
Brian Salomon6d4b65e2017-05-03 17:06:09 -0400100
Brian Salomon16351462017-07-19 16:35:31 -0400101 GrPipeline(const GrPipeline&) = delete;
102 GrPipeline& operator=(const GrPipeline&) = delete;
103
egdaniel89af44a2014-09-26 06:15:04 -0700104 /// @}
105
106 ///////////////////////////////////////////////////////////////////////////
bsalomon6be6f7c2015-02-26 13:05:21 -0800107 /// @name GrFragmentProcessors
egdaniel89af44a2014-09-26 06:15:04 -0700108
bsalomonac856c92015-08-27 06:30:17 -0700109 int numFragmentProcessors() const { return fFragmentProcessors.count(); }
John Stilesd3feb6f2020-07-23 18:18:12 -0400110 bool isColorFragmentProcessor(int idx) const { return idx < fNumColorProcessors; }
111 bool isCoverageFragmentProcessor(int idx) const { return idx >= fNumColorProcessors; }
egdaniel89af44a2014-09-26 06:15:04 -0700112
Brian Salomond90b3d32020-07-09 12:04:31 -0400113 void visitTextureEffects(const std::function<void(const GrTextureEffect&)>&) const;
114
bsalomon2047b782015-12-21 13:12:54 -0800115 const GrXferProcessor& getXferProcessor() const {
Brian Salomond61c9d92017-04-10 10:54:25 -0400116 if (fXferProcessor) {
John Stilesa008b0f2020-08-16 08:48:02 -0400117 return *fXferProcessor;
bsalomon2047b782015-12-21 13:12:54 -0800118 } else {
119 // A null xp member means the common src-over case. GrXferProcessor's ref'ing
120 // mechanism is not thread safe so we do not hold a ref on this global.
121 return GrPorterDuffXPFactory::SimpleSrcOverXP();
122 }
123 }
egdaniel378092f2014-12-03 10:40:13 -0800124
Greg Danield358cbe2020-09-11 09:33:54 -0400125 GrDstSampleType dstSampleType() const {
126 return fDstSampleType;
127 }
128
129 // Helper functions to quickly know if this GrPipeline will access the dst as a texture or an
130 // input attachment.
131 bool usesDstTexture() const {
132 return GrDstSampleTypeUsesTexture(fDstSampleType);
133 }
134 bool usesInputAttachment() const {
135 return fDstSampleType == GrDstSampleType::kAsInputAttachment;
136 }
137
Brian Salomon18dfa982017-04-03 16:57:43 -0400138 /**
Greg Daniel524e28b2019-11-01 11:48:53 -0400139 * This returns the GrSurfaceProxyView for the texture used to access the dst color. If the
140 * GrXferProcessor does not use the dst color then the proxy on the GrSurfaceProxyView will be
141 * nullptr.
142 */
Greg Danield358cbe2020-09-11 09:33:54 -0400143 const GrSurfaceProxyView& dstProxyView() const { return fDstProxyView; }
Greg Daniel524e28b2019-11-01 11:48:53 -0400144
145 /**
Brian Salomon18dfa982017-04-03 16:57:43 -0400146 * If the GrXferProcessor uses a texture to access the dst color, then this returns that
147 * texture and the offset to the dst contents within that texture.
148 */
Greg Daniel524e28b2019-11-01 11:48:53 -0400149 GrTexture* peekDstTexture(SkIPoint* offset = nullptr) const {
Greg Danield358cbe2020-09-11 09:33:54 -0400150 if (!this->usesDstTexture()) {
151 return nullptr;
152 }
Brian Salomon18dfa982017-04-03 16:57:43 -0400153 if (offset) {
154 *offset = fDstTextureOffset;
155 }
Robert Phillips3d4cac52019-06-11 08:08:08 -0400156
Greg Daniel524e28b2019-11-01 11:48:53 -0400157 if (GrTextureProxy* dstProxy = fDstProxyView.asTextureProxy()) {
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400158 return dstProxy->peekTexture();
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400159 }
160
161 return nullptr;
Brian Salomon18dfa982017-04-03 16:57:43 -0400162 }
163
bsalomonac856c92015-08-27 06:30:17 -0700164 const GrFragmentProcessor& getFragmentProcessor(int idx) const {
John Stilesa008b0f2020-08-16 08:48:02 -0400165 return *fFragmentProcessors[idx];
bsalomonae59b772014-11-19 08:23:49 -0800166 }
egdaniel89af44a2014-09-26 06:15:04 -0700167
168 /// @}
169
csmartdaltonc633abb2016-11-01 08:55:55 -0700170 const GrUserStencilSettings* getUserStencil() const { return fUserStencilSettings; }
Chris Dalton4328e922020-01-29 13:16:14 -0700171 void setUserStencil(const GrUserStencilSettings* stencil) {
172 fUserStencilSettings = stencil;
173 if (!fUserStencilSettings->isDisabled(fFlags & Flags::kHasStencilClip)) {
174 fFlags |= Flags::kStencilEnabled;
175 }
176 }
egdaniel89af44a2014-09-26 06:15:04 -0700177
Chris Dalton2e7ed262020-02-21 15:17:59 -0700178 bool isScissorTestEnabled() const {
179 return SkToBool(fFlags & Flags::kScissorTestEnabled);
Brian Salomon49348902018-06-26 09:12:38 -0400180 }
joshualitt54e0c122014-11-19 09:38:51 -0800181
csmartdaltonbf4a8f92016-09-06 10:01:06 -0700182 const GrWindowRectsState& getWindowRectsState() const { return fWindowRectsState; }
csmartdalton28341fa2016-08-17 10:00:21 -0700183
Chris Daltonce425af2019-12-16 10:39:03 -0700184 bool isHWAntialiasState() const { return fFlags & InputFlags::kHWAntialias; }
185 bool usesConservativeRaster() const { return fFlags & InputFlags::kConservativeRaster; }
Chris Dalton1215cda2019-12-17 21:44:04 -0700186 bool isWireframe() const { return fFlags & InputFlags::kWireframe; }
Brian Salomon189098e72017-01-19 09:55:19 -0500187 bool snapVerticesToPixelCenters() const {
Chris Daltonce425af2019-12-16 10:39:03 -0700188 return fFlags & InputFlags::kSnapVerticesToPixelCenters;
Brian Salomon189098e72017-01-19 09:55:19 -0500189 }
cdalton193d9cf2016-05-12 11:52:02 -0700190 bool hasStencilClip() const {
Chris Daltonbaa1b352019-04-03 12:03:00 -0600191 return SkToBool(fFlags & Flags::kHasStencilClip);
cdalton193d9cf2016-05-12 11:52:02 -0700192 }
csmartdaltonc633abb2016-11-01 08:55:55 -0700193 bool isStencilEnabled() const {
Chris Daltonbaa1b352019-04-03 12:03:00 -0600194 return SkToBool(fFlags & Flags::kStencilEnabled);
csmartdaltonc633abb2016-11-01 08:55:55 -0700195 }
Robert Phillips8053c972019-11-21 10:44:53 -0500196#ifdef SK_DEBUG
197 bool allProxiesInstantiated() const {
198 for (int i = 0; i < fFragmentProcessors.count(); ++i) {
199 if (!fFragmentProcessors[i]->isInstantiated()) {
200 return false;
201 }
202 }
203 if (fDstProxyView.proxy()) {
204 return fDstProxyView.proxy()->isInstantiated();
205 }
206
207 return true;
208 }
209#endif
bsalomonae59b772014-11-19 08:23:49 -0800210
Greg Danield358cbe2020-09-11 09:33:54 -0400211 GrXferBarrierType xferBarrierType(const GrCaps&) const;
bsalomoncb02b382015-08-12 11:14:50 -0700212
Jim Van Verth1223e7f2019-02-28 17:38:35 -0500213 // Used by Vulkan and Metal to cache their respective pipeline objects
Chris Daltonb204e4c2019-11-07 12:43:13 -0700214 void genKey(GrProcessorKeyBuilder*, const GrCaps&) const;
Jim Van Verth1223e7f2019-02-28 17:38:35 -0500215
Brian Salomon982f5462020-03-30 12:52:33 -0400216 const GrSwizzle& writeSwizzle() const { return fWriteSwizzle; }
Greg Daniel2c3398d2019-06-19 11:58:01 -0400217
Brian Salomonc241b582019-11-27 08:57:17 -0500218 void visitProxies(const GrOp::VisitProxyFunc&) const;
Robert Phillips8053c972019-11-21 10:44:53 -0500219
bsalomonae59b772014-11-19 08:23:49 -0800220private:
Chris Daltonbaa1b352019-04-03 12:03:00 -0600221 static constexpr uint8_t kLastInputFlag = (uint8_t)InputFlags::kSnapVerticesToPixelCenters;
222
223 /** This is a continuation of the public "InputFlags" enum. */
224 enum class Flags : uint8_t {
225 kHasStencilClip = (kLastInputFlag << 1),
226 kStencilEnabled = (kLastInputFlag << 2),
Chris Dalton2e7ed262020-02-21 15:17:59 -0700227 kScissorTestEnabled = (kLastInputFlag << 3),
bsalomon04ddf892014-11-19 12:36:22 -0800228 };
229
Chris Daltonbaa1b352019-04-03 12:03:00 -0600230 GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags);
231
232 friend bool operator&(Flags, InputFlags);
233
John Stiles59e18dc2020-07-22 18:18:12 -0400234 // A pipeline can contain up to three processors: color, paint coverage, and clip coverage.
235 using FragmentProcessorArray = SkAutoSTArray<3, std::unique_ptr<const GrFragmentProcessor>>;
Brian Salomon18dfa982017-04-03 16:57:43 -0400236
Greg Daniel524e28b2019-11-01 11:48:53 -0400237 GrSurfaceProxyView fDstProxyView;
Brian Salomon18dfa982017-04-03 16:57:43 -0400238 SkIPoint fDstTextureOffset;
Greg Danield358cbe2020-09-11 09:33:54 -0400239 // This is the GrDstSampleType that is used for the render pass that this GrPipeline will be
240 // used in (i.e. if this GrPipeline does read the dst, it will do so using this
241 // GrDstSampleType).
242 GrDstSampleType fDstSampleType = GrDstSampleType::kNone;
Brian Salomon18dfa982017-04-03 16:57:43 -0400243 GrWindowRectsState fWindowRectsState;
244 const GrUserStencilSettings* fUserStencilSettings;
Chris Daltonbaa1b352019-04-03 12:03:00 -0600245 Flags fFlags;
Brian Salomond61c9d92017-04-10 10:54:25 -0400246 sk_sp<const GrXferProcessor> fXferProcessor;
Brian Salomon18dfa982017-04-03 16:57:43 -0400247 FragmentProcessorArray fFragmentProcessors;
egdanield9aa2182014-10-09 13:47:05 -0700248
bsalomonac856c92015-08-27 06:30:17 -0700249 // This value is also the index in fFragmentProcessors where coverage processors begin.
Chris Daltonb832ce62020-01-06 19:49:37 -0700250 int fNumColorProcessors = 0;
Greg Daniel2c3398d2019-06-19 11:58:01 -0400251
Brian Salomon982f5462020-03-30 12:52:33 -0400252 GrSwizzle fWriteSwizzle;
egdaniel3658f382014-09-15 07:01:59 -0700253};
254
Chris Daltonbaa1b352019-04-03 12:03:00 -0600255GR_MAKE_BITFIELD_CLASS_OPS(GrPipeline::InputFlags);
256GR_MAKE_BITFIELD_CLASS_OPS(GrPipeline::Flags);
257
258inline bool operator&(GrPipeline::Flags flags, GrPipeline::InputFlags inputFlag) {
259 return (flags & (GrPipeline::Flags)inputFlag);
260}
261
egdaniel3658f382014-09-15 07:01:59 -0700262#endif