blob: 04967a780b50b9e9e59796fb232aed73e71116b7 [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()
robertphillips40ff8ed2016-05-28 08:51:06 -070019 : fFlags(0x0)
20 , fUserStencilSettings(&GrUserStencilSettings::kUnused)
21 , fDrawFace(kBoth_DrawFace) {
joshualitt2fdeda02015-01-22 07:11:44 -080022 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
egdaniel89af44a2014-09-26 06:15:04 -070023}
24
robertphillips40ff8ed2016-05-28 08:51:06 -070025GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, bool targetHasUnifiedMultisampling)
cdalton93a379b2016-05-11 13:58:08 -070026 : GrPipelineBuilder() {
joshualitt7b670db2015-07-09 13:25:02 -070027 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000028
bsalomonac856c92015-08-27 06:30:17 -070029 for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
30 fColorFragmentProcessors.push_back(SkRef(paint.getColorFragmentProcessor(i)));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000031 }
32
bsalomonac856c92015-08-27 06:30:17 -070033 for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
34 fCoverageFragmentProcessors.push_back(SkRef(paint.getCoverageFragmentProcessor(i)));
bsalomon@google.comaf84e742012-10-05 13:23:24 +000035 }
36
egdanielc4b72722015-11-23 13:20:41 -080037 fXPFactory.reset(SkSafeRef(paint.getXPFactory()));
egdaniel378092f2014-12-03 10:40:13 -080038
bsalomond79c5492015-04-27 10:07:04 -070039 this->setState(GrPipelineBuilder::kHWAntialias_Flag,
robertphillips40ff8ed2016-05-28 08:51:06 -070040 targetHasUnifiedMultisampling && paint.isAntiAlias());
brianosman64d094d2016-03-25 06:01:59 -070041 this->setState(GrPipelineBuilder::kDisableOutputConversionToSRGB_Flag,
42 paint.getDisableOutputConversionToSRGB());
brianosman898235c2016-04-06 07:38:23 -070043 this->setState(GrPipelineBuilder::kAllowSRGBInputs_Flag,
44 paint.getAllowSRGBInputs());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000045}
bsalomon@google.com5b3e8902012-10-05 20:13:28 +000046
egdaniel21aed572014-08-26 12:24:06 -070047//////////////////////////////////////////////////////////////////////////////s
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000048
bsalomon6a44c6a2015-05-26 09:49:05 -070049bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
ethannicholasde4166a2015-11-30 08:57:38 -080050 const GrPipelineOptimizations& optimizations) const {
egdanielc4b72722015-11-23 13:20:41 -080051 if (this->getXPFactory()) {
cdalton3ccf2e72016-05-06 09:41:16 -070052 return this->getXPFactory()->willNeedDstTexture(caps, optimizations);
egdanielc4b72722015-11-23 13:20:41 -080053 }
cdalton3ccf2e72016-05-06 09:41:16 -070054 return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations);
egdaniel89af44a2014-09-26 06:15:04 -070055}
56
joshualitt4421a4c2015-07-13 09:36:41 -070057void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
joshualitt5e6ba212015-07-13 07:35:05 -070058 const GrPipelineBuilder* pipelineBuilder) {
egdaniel8dd688b2015-01-22 10:16:09 -080059 if (fPipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070060 int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070061 SkASSERT(m >= 0);
bsalomonac856c92015-08-27 06:30:17 -070062 for (int i = 0; i < m; ++i) {
63 fPipelineBuilder->fColorFragmentProcessors.fromBack(i)->unref();
64 }
65 fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000066
bsalomonac856c92015-08-27 06:30:17 -070067 int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070068 SkASSERT(n >= 0);
bsalomonac856c92015-08-27 06:30:17 -070069 for (int i = 0; i < n; ++i) {
70 fPipelineBuilder->fCoverageFragmentProcessors.fromBack(i)->unref();
71 }
72 fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
egdaniel8dd688b2015-01-22 10:16:09 -080073 SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000074 }
joshualitt5e6ba212015-07-13 07:35:05 -070075 fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
halcanary96fcdcc2015-08-27 07:41:13 -070076 if (nullptr != pipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070077 fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
78 fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
egdaniel8dd688b2015-01-22 10:16:09 -080079 SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
egdaniel21aed572014-08-26 12:24:06 -070080 }
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000081}
82
jvanverth@google.comcc782382013-01-28 20:39:48 +000083////////////////////////////////////////////////////////////////////////////////
84
egdaniel8dd688b2015-01-22 10:16:09 -080085GrPipelineBuilder::~GrPipelineBuilder() {
egdaniel170f90b2014-09-16 12:54:40 -070086 SkASSERT(0 == fBlockEffectRemovalCnt);
bsalomonac856c92015-08-27 06:30:17 -070087 for (int i = 0; i < fColorFragmentProcessors.count(); ++i) {
88 fColorFragmentProcessors[i]->unref();
89 }
90 for (int i = 0; i < fCoverageFragmentProcessors.count(); ++i) {
91 fCoverageFragmentProcessors[i]->unref();
92 }
egdaniel170f90b2014-09-16 12:54:40 -070093}