blob: 97e7229af27ef57823aa08d1c26ee4fe5391c2fd [file] [log] [blame]
bsalomon@google.comaf84e742012-10-05 13:23:24 +00001/*
egdaniel8dd688b2015-01-22 10:16:09 -08002 * Copyright 2015 Google Inc.
bsalomon@google.comaf84e742012-10-05 13:23:24 +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#include "GrPipelineBuilder.h"
egdaniel3658f382014-09-15 07:01:59 -07009
joshualitt5bf99f12015-03-13 11:47:42 -070010#include "GrBatch.h"
egdanielb1cff032014-11-13 06:19:25 -080011#include "GrBlend.h"
egdaniel3658f382014-09-15 07:01:59 -070012#include "GrPaint.h"
egdaniel8dd688b2015-01-22 10:16:09 -080013#include "GrPipeline.h"
egdanielb6cbc382014-11-13 11:00:34 -080014#include "GrProcOptInfo.h"
egdaniel378092f2014-12-03 10:40:13 -080015#include "GrXferProcessor.h"
16#include "effects/GrPorterDuffXferProcessor.h"
egdaniel3658f382014-09-15 07:01:59 -070017
egdaniel8dd688b2015-01-22 10:16:09 -080018GrPipelineBuilder::GrPipelineBuilder()
joshualitt5b4f05f2015-07-10 07:26:21 -070019 : fProcDataManager(SkNEW(GrProcessorDataManager))
20 , fFlags(0x0)
joshualitt2fdeda02015-01-22 07:11:44 -080021 , fDrawFace(kBoth_DrawFace)
22 , fColorProcInfoValid(false)
23 , fCoverageProcInfoValid(false)
24 , fColorCache(GrColor_ILLEGAL)
joshualitt4d8da812015-01-28 12:53:54 -080025 , fCoverageCache(GrColor_ILLEGAL) {
joshualitt2fdeda02015-01-22 07:11:44 -080026 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
egdaniel89af44a2014-09-26 06:15:04 -070027}
28
egdaniel8dd688b2015-01-22 10:16:09 -080029GrPipelineBuilder& GrPipelineBuilder::operator=(const GrPipelineBuilder& that) {
joshualitt5b4f05f2015-07-10 07:26:21 -070030 fProcDataManager.reset(SkNEW_ARGS(GrProcessorDataManager, (*that.processorDataManager())));
bsalomonae59b772014-11-19 08:23:49 -080031 fRenderTarget.reset(SkSafeRef(that.fRenderTarget.get()));
bsalomond79c5492015-04-27 10:07:04 -070032 fFlags = that.fFlags;
bsalomon8f727332014-08-05 07:50:06 -070033 fStencilSettings = that.fStencilSettings;
bsalomon8f727332014-08-05 07:50:06 -070034 fDrawFace = that.fDrawFace;
egdaniel378092f2014-12-03 10:40:13 -080035 fXPFactory.reset(SkRef(that.getXPFactory()));
egdaniel8cbf3d52014-08-21 06:27:22 -070036 fColorStages = that.fColorStages;
37 fCoverageStages = that.fCoverageStages;
joshualitt44701df2015-02-23 14:44:57 -080038 fClip = that.fClip;
bsalomon8f727332014-08-05 07:50:06 -070039
egdanielb6cbc382014-11-13 11:00:34 -080040 fColorProcInfoValid = that.fColorProcInfoValid;
41 fCoverageProcInfoValid = that.fCoverageProcInfoValid;
joshualittf364b612014-12-11 06:52:01 -080042 fColorCache = that.fColorCache;
43 fCoverageCache = that.fCoverageCache;
egdanielb6cbc382014-11-13 11:00:34 -080044 if (fColorProcInfoValid) {
45 fColorProcInfo = that.fColorProcInfo;
46 }
47 if (fCoverageProcInfoValid) {
48 fCoverageProcInfo = that.fCoverageProcInfo;
49 }
bsalomon8f727332014-08-05 07:50:06 -070050 return *this;
51}
52
joshualitt7b670db2015-07-09 13:25:02 -070053GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, GrRenderTarget* rt, const GrClip& clip) {
54 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000055
joshualitt5b4f05f2015-07-10 07:26:21 -070056 // TODO keep this logically const using an AutoReset
57 fProcDataManager.reset(
58 const_cast<GrProcessorDataManager*>(SkRef(paint.processorDataManager())));
59
egdaniel8cbf3d52014-08-21 06:27:22 -070060 fColorStages.reset();
61 fCoverageStages.reset();
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000062
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000063 for (int i = 0; i < paint.numColorStages(); ++i) {
egdaniel8cbf3d52014-08-21 06:27:22 -070064 fColorStages.push_back(paint.getColorStage(i));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000065 }
66
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000067 for (int i = 0; i < paint.numCoverageStages(); ++i) {
egdaniel8cbf3d52014-08-21 06:27:22 -070068 fCoverageStages.push_back(paint.getCoverageStage(i));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000069 }
70
egdaniel378092f2014-12-03 10:40:13 -080071 fXPFactory.reset(SkRef(paint.getXPFactory()));
72
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000073 this->setRenderTarget(rt);
bsalomon@google.comaf84e742012-10-05 13:23:24 +000074
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000075 // These have no equivalent in GrPaint, set them to defaults
bsalomon2ed5ef82014-07-07 08:44:05 -070076 fDrawFace = kBoth_DrawFace;
77 fStencilSettings.setDisabled();
bsalomond79c5492015-04-27 10:07:04 -070078 fFlags = 0;
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000079
joshualitt570d2f82015-02-25 13:19:48 -080080 fClip = clip;
bsalomon@google.com21c10c52013-06-13 17:44:07 +000081
bsalomond79c5492015-04-27 10:07:04 -070082 this->setState(GrPipelineBuilder::kDither_Flag, paint.isDither());
83 this->setState(GrPipelineBuilder::kHWAntialias_Flag,
vbuzinovdded6962015-06-12 08:59:45 -070084 rt->isUnifiedMultisampled() && paint.isAntiAlias());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000085
egdanielb6cbc382014-11-13 11:00:34 -080086 fColorProcInfoValid = false;
87 fCoverageProcInfoValid = false;
joshualitt2e3b3e32014-12-09 13:31:14 -080088
89 fColorCache = GrColor_ILLEGAL;
90 fCoverageCache = GrColor_ILLEGAL;
bsalomon@google.comaf84e742012-10-05 13:23:24 +000091}
bsalomon@google.com5b3e8902012-10-05 20:13:28 +000092
egdaniel21aed572014-08-26 12:24:06 -070093//////////////////////////////////////////////////////////////////////////////s
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000094
bsalomon6a44c6a2015-05-26 09:49:05 -070095bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
96 const GrProcOptInfo& colorPOI,
97 const GrProcOptInfo& coveragePOI) const {
cdalton86ae0a92015-06-08 15:11:04 -070098 return this->getXPFactory()->willNeedDstTexture(caps, colorPOI, coveragePOI,
99 this->hasMixedSamples());
egdaniel89af44a2014-09-26 06:15:04 -0700100}
101
joshualitt5e6ba212015-07-13 07:35:05 -0700102void GrPipelineBuilder::AutoRestoreFragmentProcessors::set(
103 const GrPipelineBuilder* pipelineBuilder) {
egdaniel8dd688b2015-01-22 10:16:09 -0800104 if (fPipelineBuilder) {
bsalomon6be6f7c2015-02-26 13:05:21 -0800105 int m = fPipelineBuilder->numColorFragmentStages() - fColorEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -0700106 SkASSERT(m >= 0);
egdaniel8dd688b2015-01-22 10:16:09 -0800107 fPipelineBuilder->fColorStages.pop_back_n(m);
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000108
bsalomon6be6f7c2015-02-26 13:05:21 -0800109 int n = fPipelineBuilder->numCoverageFragmentStages() - fCoverageEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -0700110 SkASSERT(n >= 0);
egdaniel8dd688b2015-01-22 10:16:09 -0800111 fPipelineBuilder->fCoverageStages.pop_back_n(n);
egdanielb6cbc382014-11-13 11:00:34 -0800112 if (m + n > 0) {
egdaniel8dd688b2015-01-22 10:16:09 -0800113 fPipelineBuilder->fColorProcInfoValid = false;
114 fPipelineBuilder->fCoverageProcInfoValid = false;
egdanielb6cbc382014-11-13 11:00:34 -0800115 }
egdaniel8dd688b2015-01-22 10:16:09 -0800116 SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000117 }
joshualitt5e6ba212015-07-13 07:35:05 -0700118 fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
egdaniel8dd688b2015-01-22 10:16:09 -0800119 if (NULL != pipelineBuilder) {
bsalomon6be6f7c2015-02-26 13:05:21 -0800120 fColorEffectCnt = pipelineBuilder->numColorFragmentStages();
121 fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentStages();
egdaniel8dd688b2015-01-22 10:16:09 -0800122 SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
egdaniel21aed572014-08-26 12:24:06 -0700123 }
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000124}
125
jvanverth@google.comcc782382013-01-28 20:39:48 +0000126////////////////////////////////////////////////////////////////////////////////
127
egdaniel8dd688b2015-01-22 10:16:09 -0800128GrPipelineBuilder::~GrPipelineBuilder() {
egdaniel170f90b2014-09-16 12:54:40 -0700129 SkASSERT(0 == fBlockEffectRemovalCnt);
130}
131
egdaniel89af44a2014-09-26 06:15:04 -0700132////////////////////////////////////////////////////////////////////////////////
133
cdalton1fa45722015-06-02 10:43:39 -0700134bool GrPipelineBuilder::willColorBlendWithDst(const GrPrimitiveProcessor* pp) const {
joshualitt56995b52014-12-11 15:44:02 -0800135 this->calcColorInvariantOutput(pp);
egdaniel9e4ecdc2014-12-18 12:44:55 -0800136
cdalton1fa45722015-06-02 10:43:39 -0700137 GrXPFactory::InvariantBlendedColor blendedColor;
138 fXPFactory->getInvariantBlendedColor(fColorProcInfo, &blendedColor);
139 return blendedColor.fWillBlendWithDst;
egdanielcd8b6302014-11-11 14:46:05 -0800140}
141
egdaniel8dd688b2015-01-22 10:16:09 -0800142void GrPipelineBuilder::calcColorInvariantOutput(const GrPrimitiveProcessor* pp) const {
bsalomon6be6f7c2015-02-26 13:05:21 -0800143 fColorProcInfo.calcColorWithPrimProc(pp, fColorStages.begin(), this->numColorFragmentStages());
joshualitt4d8da812015-01-28 12:53:54 -0800144 fColorProcInfoValid = false;
145
joshualitt56995b52014-12-11 15:44:02 -0800146}
147
egdaniel8dd688b2015-01-22 10:16:09 -0800148void GrPipelineBuilder::calcCoverageInvariantOutput(const GrPrimitiveProcessor* pp) const {
joshualitt4d8da812015-01-28 12:53:54 -0800149 fCoverageProcInfo.calcCoverageWithPrimProc(pp, fCoverageStages.begin(),
bsalomon6be6f7c2015-02-26 13:05:21 -0800150 this->numCoverageFragmentStages());
joshualitt4d8da812015-01-28 12:53:54 -0800151 fCoverageProcInfoValid = false;
joshualitt56995b52014-12-11 15:44:02 -0800152}
153
joshualitt4d8da812015-01-28 12:53:54 -0800154void GrPipelineBuilder::calcColorInvariantOutput(const GrBatch* batch) const {
bsalomon6be6f7c2015-02-26 13:05:21 -0800155 fColorProcInfo.calcColorWithBatch(batch, fColorStages.begin(), this->numColorFragmentStages());
joshualitt4d8da812015-01-28 12:53:54 -0800156 fColorProcInfoValid = false;
157}
158
159void GrPipelineBuilder::calcCoverageInvariantOutput(const GrBatch* batch) const {
160 fCoverageProcInfo.calcCoverageWithBatch(batch, fCoverageStages.begin(),
bsalomon6be6f7c2015-02-26 13:05:21 -0800161 this->numCoverageFragmentStages());
joshualitt4d8da812015-01-28 12:53:54 -0800162 fCoverageProcInfoValid = false;
163}
164
165
egdaniel8dd688b2015-01-22 10:16:09 -0800166void GrPipelineBuilder::calcColorInvariantOutput(GrColor color) const {
joshualitt2e3b3e32014-12-09 13:31:14 -0800167 if (!fColorProcInfoValid || color != fColorCache) {
joshualitt56995b52014-12-11 15:44:02 -0800168 GrColorComponentFlags flags = kRGBA_GrColorComponentFlags;
bsalomon6be6f7c2015-02-26 13:05:21 -0800169 fColorProcInfo.calcWithInitialValues(fColorStages.begin(),this->numColorFragmentStages(),
170 color, flags, false);
egdanielb6cbc382014-11-13 11:00:34 -0800171 fColorProcInfoValid = true;
joshualitt2e3b3e32014-12-09 13:31:14 -0800172 fColorCache = color;
egdanielb6cbc382014-11-13 11:00:34 -0800173 }
174}
175
egdaniel8dd688b2015-01-22 10:16:09 -0800176void GrPipelineBuilder::calcCoverageInvariantOutput(GrColor coverage) const {
joshualitt2e3b3e32014-12-09 13:31:14 -0800177 if (!fCoverageProcInfoValid || coverage != fCoverageCache) {
joshualitt56995b52014-12-11 15:44:02 -0800178 GrColorComponentFlags flags = kRGBA_GrColorComponentFlags;
179 fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(),
bsalomon6be6f7c2015-02-26 13:05:21 -0800180 this->numCoverageFragmentStages(), coverage, flags,
joshualitt56995b52014-12-11 15:44:02 -0800181 true);
egdanielb6cbc382014-11-13 11:00:34 -0800182 fCoverageProcInfoValid = true;
joshualitt2e3b3e32014-12-09 13:31:14 -0800183 fCoverageCache = coverage;
egdanielb6cbc382014-11-13 11:00:34 -0800184 }
185}