blob: df9a1c85ee18a72777ee773982fe47e51456dac3 [file] [log] [blame]
tomhudson@google.com93813632011-10-27 20:21:16 +00001/*
egdaniel8dd688b2015-01-22 10:16:09 -08002 * Copyright 2015 Google Inc.
tomhudson@google.com93813632011-10-27 20:21:16 +00003 *
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 GrPipelineBuilder_DEFINED
9#define GrPipelineBuilder_DEFINED
tomhudson@google.com93813632011-10-27 20:21:16 +000010
joshualittd5a7db42015-01-27 15:39:06 -080011#include "GrBatch.h"
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000012#include "GrBlend.h"
egdanielc0648242014-09-22 13:17:02 -070013#include "GrDrawTargetCaps.h"
bsalomon6251d172014-10-15 10:50:36 -070014#include "GrGeometryProcessor.h"
bsalomonf96ba022014-09-17 08:05:40 -070015#include "GrGpuResourceRef.h"
bsalomonae59b772014-11-19 08:23:49 -080016#include "GrFragmentStage.h"
egdanielb6cbc382014-11-13 11:00:34 -080017#include "GrProcOptInfo.h"
egdaniel89af44a2014-09-26 06:15:04 -070018#include "GrRenderTarget.h"
19#include "GrStencil.h"
egdaniel95131432014-12-09 11:15:43 -080020#include "GrXferProcessor.h"
egdaniel89af44a2014-09-26 06:15:04 -070021#include "SkMatrix.h"
egdaniel87509242014-12-17 13:37:13 -080022#include "effects/GrCoverageSetOpXP.h"
egdaniel080e6732014-12-22 07:35:52 -080023#include "effects/GrDisableColorXP.h"
egdaniel95131432014-12-09 11:15:43 -080024#include "effects/GrPorterDuffXferProcessor.h"
bsalomon@google.com68b58c92013-01-17 16:50:08 +000025#include "effects/GrSimpleTextureEffect.h"
tomhudson@google.com93813632011-10-27 20:21:16 +000026
egdaniel89af44a2014-09-26 06:15:04 -070027class GrDrawTargetCaps;
egdaniel89af44a2014-09-26 06:15:04 -070028class GrPaint;
29class GrTexture;
egdaniel170f90b2014-09-16 12:54:40 -070030
egdaniel8dd688b2015-01-22 10:16:09 -080031class GrPipelineBuilder {
bsalomon@google.com2e3d1442012-03-26 20:33:54 +000032public:
egdaniel8dd688b2015-01-22 10:16:09 -080033 GrPipelineBuilder();
34
35 GrPipelineBuilder(const GrPipelineBuilder& pipelineBuilder) {
commit-bot@chromium.org1acc3d72013-09-06 23:13:05 +000036 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
egdaniel8dd688b2015-01-22 10:16:09 -080037 *this = pipelineBuilder;
bsalomon@google.com46f7afb2012-01-18 19:51:55 +000038 }
39
egdaniel8dd688b2015-01-22 10:16:09 -080040 virtual ~GrPipelineBuilder();
bsalomon@google.com137f1342013-05-29 21:27:53 +000041
bsalomon@google.com52a5dcb2012-01-17 16:01:37 +000042 /**
egdaniel8dd688b2015-01-22 10:16:09 -080043 * Initializes the GrPipelineBuilder based on a GrPaint, view matrix and render target. Note
44 * that GrPipelineBuilder encompasses more than GrPaint. Aspects of GrPipelineBuilder that have
45 * no GrPaint equivalents are set to default values with the exception of vertex attribute state
46 * which is unmodified by this function and clipping which will be enabled.
bsalomon@google.comaf84e742012-10-05 13:23:24 +000047 */
joshualitt8059eb92014-12-29 15:10:07 -080048 void setFromPaint(const GrPaint&, GrRenderTarget*);
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +000049
jvanverth@google.com9b855c72013-03-01 18:21:22 +000050 /// @}
51
jvanverth@google.com9b855c72013-03-01 18:21:22 +000052 /**
bsalomon62c447d2014-08-08 08:08:50 -070053 * Depending on features available in the underlying 3D API and the color blend mode requested
54 * it may or may not be possible to correctly blend with fractional pixel coverage generated by
55 * the fragment shader.
56 *
egdaniel8dd688b2015-01-22 10:16:09 -080057 * This function considers the current GrPipelineBuilder and the draw target's capabilities to
bsalomon62c447d2014-08-08 08:08:50 -070058 * determine whether coverage can be handled correctly. This function assumes that the caller
joshualitt2e3b3e32014-12-09 13:31:14 -080059 * intends to specify fractional pixel coverage via a primitive processor but may not have
60 * specified it yet.
bsalomon62c447d2014-08-08 08:08:50 -070061 */
joshualitt2e3b3e32014-12-09 13:31:14 -080062 bool canUseFracCoveragePrimProc(GrColor color, const GrDrawTargetCaps& caps) const;
bsalomon62c447d2014-08-08 08:08:50 -070063
egdaniel89af44a2014-09-26 06:15:04 -070064 /**
egdanielcd8b6302014-11-11 14:46:05 -080065 * This function returns true if the render target destination pixel values will be read for
66 * blending during draw.
67 */
joshualitt56995b52014-12-11 15:44:02 -080068 bool willBlendWithDst(const GrPrimitiveProcessor*) const;
joshualittbd769d02014-09-04 08:56:46 -070069
bsalomon@google.com2401ae82012-01-17 21:03:05 +000070 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.comadc65362013-01-28 14:26:09 +000071 /// @name Effect Stages
joshualittb0a8a372014-09-23 09:50:21 -070072 /// Each stage hosts a GrProcessor. The effect produces an output color or coverage in the
73 /// fragment shader. Its inputs are the output from the previous stage as well as some variables
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000074 /// available to it in the fragment and vertex shader (e.g. the vertex position, the dst color,
75 /// the fragment position, local coordinates).
76 ///
77 /// The stages are divided into two sets, color-computing and coverage-computing. The final
78 /// color stage produces the final pixel color. The coverage-computing stages function exactly
79 /// as the color-computing but the output of the final coverage stage is treated as a fractional
80 /// pixel coverage rather than as input to the src/dst color blend step.
81 ///
82 /// The input color to the first color-stage is either the constant color or interpolated
83 /// per-vertex colors. The input to the first coverage stage is either a constant coverage
84 /// (usually full-coverage) or interpolated per-vertex coverage.
85 ///
86 /// See the documentation of kCoverageDrawing_StateBit for information about disabling the
87 /// the color / coverage distinction.
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +000088 ////
89
egdaniel89af44a2014-09-26 06:15:04 -070090 int numColorStages() const { return fColorStages.count(); }
91 int numCoverageStages() const { return fCoverageStages.count(); }
joshualitt4dd99882014-11-11 08:51:30 -080092 int numFragmentStages() const { return this->numColorStages() + this->numCoverageStages(); }
egdaniel378092f2014-12-03 10:40:13 -080093
joshualitt2fdeda02015-01-22 07:11:44 -080094 const GrXPFactory* getXPFactory() const {
95 if (!fXPFactory) {
96 fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode));
97 }
98 return fXPFactory.get();
99 }
egdaniel378092f2014-12-03 10:40:13 -0800100
egdaniel89af44a2014-09-26 06:15:04 -0700101 const GrFragmentStage& getColorStage(int idx) const { return fColorStages[idx]; }
102 const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageStages[idx]; }
103
104 /**
egdaniel71e236c2015-01-20 06:34:51 -0800105 * Checks whether the xp will read the dst pixel color.
106 * TODO: remove when we have dstCpy contained inside of GrXP
egdaniel89af44a2014-09-26 06:15:04 -0700107 */
egdaniel71e236c2015-01-20 06:34:51 -0800108 bool willEffectReadDstColor() const;
egdaniel89af44a2014-09-26 06:15:04 -0700109
egdaniel95131432014-12-09 11:15:43 -0800110 /**
111 * The xfer processor factory.
112 */
113 const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) {
114 fXPFactory.reset(SkRef(xpFactory));
115 return xpFactory;
116 }
117
118 void setPorterDuffXPFactory(SkXfermode::Mode mode) {
119 fXPFactory.reset(GrPorterDuffXPFactory::Create(mode));
120 }
121
122 void setPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst) {
123 fXPFactory.reset(GrPorterDuffXPFactory::Create(src, dst));
124 }
125
egdaniel87509242014-12-17 13:37:13 -0800126 void setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage = false) {
127 fXPFactory.reset(GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage));
128 }
129
egdaniel080e6732014-12-22 07:35:52 -0800130 void setDisableColorXPFactory() {
131 fXPFactory.reset(GrDisableColorXPFactory::Create());
132 }
133
joshualittb0a8a372014-09-23 09:50:21 -0700134 const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* effect) {
bsalomon49f085d2014-09-05 13:34:00 -0700135 SkASSERT(effect);
joshualittb0a8a372014-09-23 09:50:21 -0700136 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrFragmentStage, (effect));
egdanielb6cbc382014-11-13 11:00:34 -0800137 fColorProcInfoValid = false;
jvanverth@google.com65eb4d52013-03-19 18:51:02 +0000138 return effect;
139 }
skia.committer@gmail.com01c34ee2013-03-20 07:01:02 +0000140
joshualittb0a8a372014-09-23 09:50:21 -0700141 const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* effect) {
bsalomon49f085d2014-09-05 13:34:00 -0700142 SkASSERT(effect);
joshualittb0a8a372014-09-23 09:50:21 -0700143 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrFragmentStage, (effect));
egdanielb6cbc382014-11-13 11:00:34 -0800144 fCoverageProcInfoValid = false;
bsalomon@google.comadc65362013-01-28 14:26:09 +0000145 return effect;
146 }
147
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000148 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000149 * Creates a GrSimpleTextureEffect that uses local coords as texture coordinates.
tomhudson@google.com1e8f0162012-07-20 16:25:18 +0000150 */
joshualittb0a8a372014-09-23 09:50:21 -0700151 void addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
152 this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
bsalomon@google.comdfdb7e52012-10-16 15:19:45 +0000153 }
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000154
joshualittb0a8a372014-09-23 09:50:21 -0700155 void addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
156 this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000157 }
158
joshualittb0a8a372014-09-23 09:50:21 -0700159 void addColorTextureProcessor(GrTexture* texture,
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000160 const SkMatrix& matrix,
161 const GrTextureParams& params) {
joshualittb0a8a372014-09-23 09:50:21 -0700162 this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
163 }
164
165 void addCoverageTextureProcessor(GrTexture* texture,
166 const SkMatrix& matrix,
167 const GrTextureParams& params) {
168 this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000169 }
tomhudson@google.com676e6602012-07-10 17:21:48 +0000170
robertphillips@google.com972265d2012-06-13 18:49:30 +0000171 /**
egdaniel8dd688b2015-01-22 10:16:09 -0800172 * When this object is destroyed it will remove any color/coverage effects from the pipeline
173 * builder that were added after its constructor.
bsalomon9b536522014-09-05 09:18:51 -0700174 *
egdaniel8dd688b2015-01-22 10:16:09 -0800175 * This class has strange behavior around geometry processor. If there is a GP on the
176 * GrPipelineBuilder it will assert that the GP is not modified until after the destructor of
177 * the ARE. If the GrPipelineBuilder has a NULL GP when the ARE is constructed then it will reset
178 * it to null in the destructor.
robertphillips@google.com972265d2012-06-13 18:49:30 +0000179 */
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000180 class AutoRestoreEffects : public ::SkNoncopyable {
robertphillips@google.com972265d2012-06-13 18:49:30 +0000181 public:
bsalomon9b536522014-09-05 09:18:51 -0700182 AutoRestoreEffects()
egdaniel8dd688b2015-01-22 10:16:09 -0800183 : fPipelineBuilder(NULL)
bsalomon9b536522014-09-05 09:18:51 -0700184 , fColorEffectCnt(0)
185 , fCoverageEffectCnt(0) {}
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000186
egdaniel8dd688b2015-01-22 10:16:09 -0800187 AutoRestoreEffects(GrPipelineBuilder* ds)
188 : fPipelineBuilder(NULL)
bsalomon9b536522014-09-05 09:18:51 -0700189 , fColorEffectCnt(0)
190 , fCoverageEffectCnt(0) {
skia.committer@gmail.com5c493d52013-06-14 07:00:49 +0000191 this->set(ds);
robertphillips@google.comf09b87d2013-06-13 20:06:44 +0000192 }
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000193
194 ~AutoRestoreEffects() { this->set(NULL); }
195
egdaniel8dd688b2015-01-22 10:16:09 -0800196 void set(GrPipelineBuilder* ds);
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000197
egdaniel8dd688b2015-01-22 10:16:09 -0800198 bool isSet() const { return SkToBool(fPipelineBuilder); }
bsalomon8af05232014-06-03 06:34:58 -0700199
robertphillips@google.com972265d2012-06-13 18:49:30 +0000200 private:
egdaniel8dd688b2015-01-22 10:16:09 -0800201 GrPipelineBuilder* fPipelineBuilder;
bsalomon9b536522014-09-05 09:18:51 -0700202 int fColorEffectCnt;
203 int fCoverageEffectCnt;
robertphillips@google.com972265d2012-06-13 18:49:30 +0000204 };
205
joshualitta58fe352014-10-27 08:39:00 -0700206 /**
207 * AutoRestoreStencil
208 *
209 * This simple struct saves and restores the stencil settings
210 */
211 class AutoRestoreStencil : public ::SkNoncopyable {
212 public:
egdaniel8dd688b2015-01-22 10:16:09 -0800213 AutoRestoreStencil() : fPipelineBuilder(NULL) {}
joshualitta58fe352014-10-27 08:39:00 -0700214
egdaniel8dd688b2015-01-22 10:16:09 -0800215 AutoRestoreStencil(GrPipelineBuilder* ds) : fPipelineBuilder(NULL) { this->set(ds); }
joshualitta58fe352014-10-27 08:39:00 -0700216
217 ~AutoRestoreStencil() { this->set(NULL); }
218
egdaniel8dd688b2015-01-22 10:16:09 -0800219 void set(GrPipelineBuilder* ds) {
220 if (fPipelineBuilder) {
221 fPipelineBuilder->setStencil(fStencilSettings);
joshualitta58fe352014-10-27 08:39:00 -0700222 }
egdaniel8dd688b2015-01-22 10:16:09 -0800223 fPipelineBuilder = ds;
joshualitta58fe352014-10-27 08:39:00 -0700224 if (ds) {
225 fStencilSettings = ds->getStencil();
226 }
227 }
228
egdaniel8dd688b2015-01-22 10:16:09 -0800229 bool isSet() const { return SkToBool(fPipelineBuilder); }
joshualitta58fe352014-10-27 08:39:00 -0700230
231 private:
egdaniel8dd688b2015-01-22 10:16:09 -0800232 GrPipelineBuilder* fPipelineBuilder;
233 GrStencilSettings fStencilSettings;
joshualitta58fe352014-10-27 08:39:00 -0700234 };
235
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000236 /// @}
237
238 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000239 /// @name Blending
240 ////
241
egdaniel89af44a2014-09-26 06:15:04 -0700242 /**
243 * Determines whether multiplying the computed per-pixel color by the pixel's fractional
244 * coverage before the blend will give the correct final destination color. In general it
245 * will not as coverage is applied after blending.
246 */
247 bool canTweakAlphaForCoverage() const;
248
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000249 /// @}
250
joshualittd27f73e2014-12-29 07:43:36 -0800251
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000252 /// @}
253
254 ///////////////////////////////////////////////////////////////////////////
255 /// @name Render Target
256 ////
257
258 /**
egdaniel89af44a2014-09-26 06:15:04 -0700259 * Retrieves the currently set render-target.
260 *
261 * @return The currently set render target.
262 */
bsalomon37dd3312014-11-03 08:47:23 -0800263 GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
egdaniel89af44a2014-09-26 06:15:04 -0700264
265 /**
bsalomon@google.comca432082013-01-23 19:53:46 +0000266 * Sets the render-target used at the next drawing call
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000267 *
268 * @param target The render target to set.
269 */
bsalomonae59b772014-11-19 08:23:49 -0800270 void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef(target)); }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000271
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000272 /// @}
273
274 ///////////////////////////////////////////////////////////////////////////
275 /// @name Stencil
276 ////
277
egdaniel89af44a2014-09-26 06:15:04 -0700278 const GrStencilSettings& getStencil() const { return fStencilSettings; }
279
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000280 /**
281 * Sets the stencil settings to use for the next draw.
282 * Changing the clip has the side-effect of possibly zeroing
283 * out the client settable stencil bits. So multipass algorithms
284 * using stencil should not change the clip between passes.
285 * @param settings the stencil settings to use.
286 */
bsalomon04ddf892014-11-19 12:36:22 -0800287 void setStencil(const GrStencilSettings& settings) { fStencilSettings = settings; }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000288
289 /**
290 * Shortcut to disable stencil testing and ops.
291 */
bsalomon04ddf892014-11-19 12:36:22 -0800292 void disableStencil() { fStencilSettings.setDisabled(); }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000293
bsalomon2ed5ef82014-07-07 08:44:05 -0700294 GrStencilSettings* stencil() { return &fStencilSettings; }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000295
296 /// @}
297
298 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000299 /// @name State Flags
300 ////
tomhudson@google.com62b09682011-11-09 16:39:17 +0000301
egdaniel89af44a2014-09-26 06:15:04 -0700302 /**
303 * Flags that affect rendering. Controlled using enable/disableState(). All
304 * default to disabled.
305 */
306 enum StateBits {
307 /**
308 * Perform dithering. TODO: Re-evaluate whether we need this bit
309 */
310 kDither_StateBit = 0x01,
311 /**
312 * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
313 * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
314 * the 3D API.
315 */
316 kHWAntialias_StateBit = 0x02,
317 /**
318 * Draws will respect the clip, otherwise the clip is ignored.
319 */
320 kClip_StateBit = 0x04,
egdaniel89af44a2014-09-26 06:15:04 -0700321
egdaniel080e6732014-12-22 07:35:52 -0800322 kLast_StateBit = kClip_StateBit,
egdaniel89af44a2014-09-26 06:15:04 -0700323 };
324
egdaniel89af44a2014-09-26 06:15:04 -0700325 bool isClipState() const { return 0 != (fFlagBits & kClip_StateBit); }
bsalomon04ddf892014-11-19 12:36:22 -0800326 bool isDither() const { return 0 != (fFlagBits & kDither_StateBit); }
327 bool isHWAntialias() const { return 0 != (fFlagBits & kHWAntialias_StateBit); }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000328
329 /**
330 * Enable render state settings.
331 *
bsalomon@google.com1e269b52012-10-15 14:25:31 +0000332 * @param stateBits bitfield of StateBits specifying the states to enable
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000333 */
bsalomon04ddf892014-11-19 12:36:22 -0800334 void enableState(uint32_t stateBits) { fFlagBits |= stateBits; }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000335
336 /**
337 * Disable render state settings.
338 *
bsalomon@google.com1e269b52012-10-15 14:25:31 +0000339 * @param stateBits bitfield of StateBits specifying the states to disable
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000340 */
bsalomon04ddf892014-11-19 12:36:22 -0800341 void disableState(uint32_t stateBits) { fFlagBits &= ~(stateBits); }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000342
bsalomon@google.comd5d69ff2012-10-04 19:42:00 +0000343 /**
344 * Enable or disable stateBits based on a boolean.
345 *
bsalomon@google.com1e269b52012-10-15 14:25:31 +0000346 * @param stateBits bitfield of StateBits to enable or disable
bsalomon@google.comd5d69ff2012-10-04 19:42:00 +0000347 * @param enable if true enable stateBits, otherwise disable
348 */
349 void setState(uint32_t stateBits, bool enable) {
350 if (enable) {
351 this->enableState(stateBits);
352 } else {
353 this->disableState(stateBits);
354 }
355 }
356
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000357 /// @}
358
359 ///////////////////////////////////////////////////////////////////////////
360 /// @name Face Culling
361 ////
362
egdaniel89af44a2014-09-26 06:15:04 -0700363 enum DrawFace {
364 kInvalid_DrawFace = -1,
365
366 kBoth_DrawFace,
367 kCCW_DrawFace,
368 kCW_DrawFace,
369 };
370
371 /**
372 * Gets whether the target is drawing clockwise, counterclockwise,
373 * or both faces.
374 * @return the current draw face(s).
375 */
376 DrawFace getDrawFace() const { return fDrawFace; }
377
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000378 /**
379 * Controls whether clockwise, counterclockwise, or both faces are drawn.
380 * @param face the face(s) to draw.
381 */
382 void setDrawFace(DrawFace face) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000383 SkASSERT(kInvalid_DrawFace != face);
bsalomon2ed5ef82014-07-07 08:44:05 -0700384 fDrawFace = face;
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000385 }
386
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000387 /// @}
388
389 ///////////////////////////////////////////////////////////////////////////
tomhudson@google.com62b09682011-11-09 16:39:17 +0000390
egdaniel8dd688b2015-01-22 10:16:09 -0800391 GrPipelineBuilder& operator= (const GrPipelineBuilder& that);
bsalomon@google.com3d0835b2011-12-08 16:12:03 +0000392
393private:
joshualittd5a7db42015-01-27 15:39:06 -0800394 // Calculating invariant color / coverage information is expensive, so we partially cache the
395 // results.
396 //
397 // canUseFracCoveragePrimProc() - Called in regular skia draw, caches results but only for a
398 // specific color and coverage. May be called multiple times
399 // willBlendWithDst() - only called by Nvpr, does not cache results
400 // GrOptDrawState constructor - never caches results
401
402 // TODO delete when we have Batch
joshualitt56995b52014-12-11 15:44:02 -0800403 const GrProcOptInfo& colorProcInfo(const GrPrimitiveProcessor* pp) const {
404 this->calcColorInvariantOutput(pp);
egdaniel912b3d22014-11-17 07:45:53 -0800405 return fColorProcInfo;
406 }
407
joshualitt56995b52014-12-11 15:44:02 -0800408 const GrProcOptInfo& coverageProcInfo(const GrPrimitiveProcessor* pp) const {
409 this->calcCoverageInvariantOutput(pp);
egdaniel912b3d22014-11-17 07:45:53 -0800410 return fCoverageProcInfo;
411 }
412
joshualittd5a7db42015-01-27 15:39:06 -0800413 const GrProcOptInfo& colorProcInfo(const GrBatch* batch) const {
414 this->calcColorInvariantOutput(batch);
415 return fColorProcInfo;
416 }
417
418 const GrProcOptInfo& coverageProcInfo(const GrBatch* batch) const {
419 this->calcCoverageInvariantOutput(batch);
420 return fCoverageProcInfo;
421 }
egdaniel89af44a2014-09-26 06:15:04 -0700422
egdanielb6cbc382014-11-13 11:00:34 -0800423 /**
joshualittd5a7db42015-01-27 15:39:06 -0800424 * Primproc variants of the calc functions
425 * TODO remove these when batch is everywhere
joshualittd15e4e42015-01-26 13:30:10 -0800426 */
joshualittd5a7db42015-01-27 15:39:06 -0800427 void calcColorInvariantOutput(const GrPrimitiveProcessor*) const;
joshualittca0a1792015-01-27 06:41:33 -0800428 void calcCoverageInvariantOutput(const GrPrimitiveProcessor*) const;
joshualittd15e4e42015-01-26 13:30:10 -0800429
430 /**
joshualittd5a7db42015-01-27 15:39:06 -0800431 * GrBatch provides the initial seed for these loops based off of its initial geometry data
432 */
433 void calcColorInvariantOutput(const GrBatch*) const;
434 void calcCoverageInvariantOutput(const GrBatch*) const;
435
436 /**
egdanielb6cbc382014-11-13 11:00:34 -0800437 * If fColorProcInfoValid is false, function calculates the invariant output for the color
438 * stages and results are stored in fColorProcInfo.
439 */
joshualitt2e3b3e32014-12-09 13:31:14 -0800440 void calcColorInvariantOutput(GrColor) const;
egdanielb6cbc382014-11-13 11:00:34 -0800441
442 /**
443 * If fCoverageProcInfoValid is false, function calculates the invariant output for the coverage
444 * stages and results are stored in fCoverageProcInfo.
445 */
joshualitt2e3b3e32014-12-09 13:31:14 -0800446 void calcCoverageInvariantOutput(GrColor) const;
egdanielb6cbc382014-11-13 11:00:34 -0800447
bsalomon@google.comeb6879f2013-06-13 19:34:18 +0000448 // Some of the auto restore objects assume that no effects are removed during their lifetime.
449 // This is used to assert that this condition holds.
commit-bot@chromium.org1acc3d72013-09-06 23:13:05 +0000450 SkDEBUGCODE(int fBlockEffectRemovalCnt;)
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000451
joshualitta5305a12014-10-10 17:47:00 -0700452 typedef SkSTArray<4, GrFragmentStage> FragmentStageArray;
egdaniel89af44a2014-09-26 06:15:04 -0700453
bsalomonae59b772014-11-19 08:23:49 -0800454 SkAutoTUnref<GrRenderTarget> fRenderTarget;
bsalomonae59b772014-11-19 08:23:49 -0800455 uint32_t fFlagBits;
bsalomonae59b772014-11-19 08:23:49 -0800456 GrStencilSettings fStencilSettings;
bsalomonae59b772014-11-19 08:23:49 -0800457 DrawFace fDrawFace;
joshualitt2fdeda02015-01-22 07:11:44 -0800458 mutable SkAutoTUnref<const GrXPFactory> fXPFactory;
bsalomonae59b772014-11-19 08:23:49 -0800459 FragmentStageArray fColorStages;
460 FragmentStageArray fCoverageStages;
egdaniel89af44a2014-09-26 06:15:04 -0700461
egdanielb6cbc382014-11-13 11:00:34 -0800462 mutable GrProcOptInfo fColorProcInfo;
463 mutable GrProcOptInfo fCoverageProcInfo;
464 mutable bool fColorProcInfoValid;
465 mutable bool fCoverageProcInfoValid;
joshualitt2e3b3e32014-12-09 13:31:14 -0800466 mutable GrColor fColorCache;
467 mutable GrColor fCoverageCache;
egdanielb6cbc382014-11-13 11:00:34 -0800468
egdaniel8dd688b2015-01-22 10:16:09 -0800469 friend class GrPipeline;
tomhudson@google.com93813632011-10-27 20:21:16 +0000470};
471
472#endif