blob: dbef6e8755046ccd026d6796241e810c49127b36 [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
egdanielb1cff032014-11-13 06:19:25 -080010#include "GrBlend.h"
egdaniel3658f382014-09-15 07:01:59 -070011#include "GrPaint.h"
egdaniel8dd688b2015-01-22 10:16:09 -080012#include "GrPipeline.h"
egdanielb6cbc382014-11-13 11:00:34 -080013#include "GrProcOptInfo.h"
egdaniel378092f2014-12-03 10:40:13 -080014#include "GrXferProcessor.h"
joshualitt74417822015-08-07 11:42:16 -070015#include "batches/GrBatch.h"
egdaniel378092f2014-12-03 10:40:13 -080016#include "effects/GrPorterDuffXferProcessor.h"
egdaniel3658f382014-09-15 07:01:59 -070017
egdaniel8dd688b2015-01-22 10:16:09 -080018GrPipelineBuilder::GrPipelineBuilder()
joshualittaf2533a2015-09-09 10:00:12 -070019 : fFlags(0x0), fDrawFace(kBoth_DrawFace) {
joshualitt2fdeda02015-01-22 07:11:44 -080020 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
egdaniel89af44a2014-09-26 06:15:04 -070021}
22
joshualitt7b670db2015-07-09 13:25:02 -070023GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, GrRenderTarget* rt, const GrClip& clip) {
24 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000025
bsalomonac856c92015-08-27 06:30:17 -070026 for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
27 fColorFragmentProcessors.push_back(SkRef(paint.getColorFragmentProcessor(i)));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000028 }
29
bsalomonac856c92015-08-27 06:30:17 -070030 for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
31 fCoverageFragmentProcessors.push_back(SkRef(paint.getCoverageFragmentProcessor(i)));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000032 }
33
egdaniel378092f2014-12-03 10:40:13 -080034 fXPFactory.reset(SkRef(paint.getXPFactory()));
35
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000036 this->setRenderTarget(rt);
bsalomon@google.comaf84e742012-10-05 13:23:24 +000037
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000038 // These have no equivalent in GrPaint, set them to defaults
bsalomon2ed5ef82014-07-07 08:44:05 -070039 fDrawFace = kBoth_DrawFace;
40 fStencilSettings.setDisabled();
bsalomond79c5492015-04-27 10:07:04 -070041 fFlags = 0;
commit-bot@chromium.orgbb6a3172013-05-28 17:25:49 +000042
joshualitt570d2f82015-02-25 13:19:48 -080043 fClip = clip;
bsalomon@google.com21c10c52013-06-13 17:44:07 +000044
bsalomond79c5492015-04-27 10:07:04 -070045 this->setState(GrPipelineBuilder::kDither_Flag, paint.isDither());
46 this->setState(GrPipelineBuilder::kHWAntialias_Flag,
vbuzinovdded6962015-06-12 08:59:45 -070047 rt->isUnifiedMultisampled() && paint.isAntiAlias());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000048}
bsalomon@google.com5b3e8902012-10-05 20:13:28 +000049
egdaniel21aed572014-08-26 12:24:06 -070050//////////////////////////////////////////////////////////////////////////////s
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000051
bsalomon6a44c6a2015-05-26 09:49:05 -070052bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
53 const GrProcOptInfo& colorPOI,
54 const GrProcOptInfo& coveragePOI) const {
cdalton86ae0a92015-06-08 15:11:04 -070055 return this->getXPFactory()->willNeedDstTexture(caps, colorPOI, coveragePOI,
56 this->hasMixedSamples());
egdaniel89af44a2014-09-26 06:15:04 -070057}
58
joshualitt4421a4c2015-07-13 09:36:41 -070059void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
joshualitt5e6ba212015-07-13 07:35:05 -070060 const GrPipelineBuilder* pipelineBuilder) {
egdaniel8dd688b2015-01-22 10:16:09 -080061 if (fPipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070062 int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070063 SkASSERT(m >= 0);
bsalomonac856c92015-08-27 06:30:17 -070064 for (int i = 0; i < m; ++i) {
65 fPipelineBuilder->fColorFragmentProcessors.fromBack(i)->unref();
66 }
67 fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000068
bsalomonac856c92015-08-27 06:30:17 -070069 int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070070 SkASSERT(n >= 0);
bsalomonac856c92015-08-27 06:30:17 -070071 for (int i = 0; i < n; ++i) {
72 fPipelineBuilder->fCoverageFragmentProcessors.fromBack(i)->unref();
73 }
74 fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
egdaniel8dd688b2015-01-22 10:16:09 -080075 SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000076 }
joshualitt5e6ba212015-07-13 07:35:05 -070077 fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
halcanary96fcdcc2015-08-27 07:41:13 -070078 if (nullptr != pipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070079 fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
80 fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
egdaniel8dd688b2015-01-22 10:16:09 -080081 SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
egdaniel21aed572014-08-26 12:24:06 -070082 }
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000083}
84
jvanverth@google.comcc782382013-01-28 20:39:48 +000085////////////////////////////////////////////////////////////////////////////////
86
egdaniel8dd688b2015-01-22 10:16:09 -080087GrPipelineBuilder::~GrPipelineBuilder() {
egdaniel170f90b2014-09-16 12:54:40 -070088 SkASSERT(0 == fBlockEffectRemovalCnt);
bsalomonac856c92015-08-27 06:30:17 -070089 for (int i = 0; i < fColorFragmentProcessors.count(); ++i) {
90 fColorFragmentProcessors[i]->unref();
91 }
92 for (int i = 0; i < fCoverageFragmentProcessors.count(); ++i) {
93 fCoverageFragmentProcessors[i]->unref();
94 }
egdaniel170f90b2014-09-16 12:54:40 -070095}
96
egdaniel89af44a2014-09-26 06:15:04 -070097////////////////////////////////////////////////////////////////////////////////
98
bsalomonabd30f52015-08-13 13:34:48 -070099void GrPipelineBuilder::calcColorInvariantOutput(const GrDrawBatch* batch) const {
bsalomonac856c92015-08-27 06:30:17 -0700100 fColorProcInfo.calcColorWithBatch(batch, fColorFragmentProcessors.begin(),
101 this->numColorFragmentProcessors());
joshualitt4d8da812015-01-28 12:53:54 -0800102}
103
bsalomonabd30f52015-08-13 13:34:48 -0700104void GrPipelineBuilder::calcCoverageInvariantOutput(const GrDrawBatch* batch) const {
bsalomonac856c92015-08-27 06:30:17 -0700105 fCoverageProcInfo.calcCoverageWithBatch(batch, fCoverageFragmentProcessors.begin(),
106 this->numCoverageFragmentProcessors());
joshualitt4d8da812015-01-28 12:53:54 -0800107}
egdaniel723b0502015-09-15 09:31:40 -0700108