blob: fc67c332fba8267a1310f3b88a8155f80e6b88b3 [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"
15#include "effects/GrPorterDuffXferProcessor.h"
Brian Salomon89527432016-12-16 09:52:16 -050016#include "ops/GrOp.h"
egdaniel3658f382014-09-15 07:01:59 -070017
Brian Salomon82f44312017-01-11 13:42:54 -050018GrPipelineBuilder::GrPipelineBuilder(GrPaint&& paint, GrAAType aaType)
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050019 : fFlags(0x0)
20 , fUserStencilSettings(&GrUserStencilSettings::kUnused)
21 , fDrawFace(GrDrawFace::kBoth) {
joshualitt7b670db2015-07-09 13:25:02 -070022 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
bsalomon@google.comeb6879f2013-06-13 19:34:18 +000023
bsalomonac856c92015-08-27 06:30:17 -070024 for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
Brian Salomon82f44312017-01-11 13:42:54 -050025 fColorFragmentProcessors.emplace_back(paint.fColorFragmentProcessors[i].release());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000026 }
27
bsalomonac856c92015-08-27 06:30:17 -070028 for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
Brian Salomon82f44312017-01-11 13:42:54 -050029 fCoverageFragmentProcessors.emplace_back(paint.fCoverageFragmentProcessors[i].release());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000030 }
31
Brian Salomona1633922017-01-09 11:46:10 -050032 fXPFactory = paint.getXPFactory();
egdaniel378092f2014-12-03 10:40:13 -080033
Brian Salomon0abc8b42016-12-13 10:22:54 -050034 this->setState(GrPipelineBuilder::kHWAntialias_Flag, GrAATypeIsHW(aaType));
brianosman64d094d2016-03-25 06:01:59 -070035 this->setState(GrPipelineBuilder::kDisableOutputConversionToSRGB_Flag,
36 paint.getDisableOutputConversionToSRGB());
brianosman898235c2016-04-06 07:38:23 -070037 this->setState(GrPipelineBuilder::kAllowSRGBInputs_Flag,
38 paint.getAllowSRGBInputs());
dvonbeck9b03e7b2016-08-01 11:01:56 -070039 this->setState(GrPipelineBuilder::kUsesDistanceVectorField_Flag,
40 paint.usesDistanceVectorField());
bsalomon@google.comaf84e742012-10-05 13:23:24 +000041}
bsalomon@google.com5b3e8902012-10-05 20:13:28 +000042
egdaniel21aed572014-08-26 12:24:06 -070043//////////////////////////////////////////////////////////////////////////////s
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000044
bsalomon6a44c6a2015-05-26 09:49:05 -070045bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
Brian Salomon92aee3d2016-12-21 09:20:25 -050046 const GrPipelineAnalysis& analysis) const {
egdanielc4b72722015-11-23 13:20:41 -080047 if (this->getXPFactory()) {
Brian Salomon92aee3d2016-12-21 09:20:25 -050048 return this->getXPFactory()->willNeedDstTexture(caps, analysis);
egdanielc4b72722015-11-23 13:20:41 -080049 }
Brian Salomon92aee3d2016-12-21 09:20:25 -050050 return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, analysis);
egdaniel89af44a2014-09-26 06:15:04 -070051}
52
joshualitt4421a4c2015-07-13 09:36:41 -070053void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
joshualitt5e6ba212015-07-13 07:35:05 -070054 const GrPipelineBuilder* pipelineBuilder) {
egdaniel8dd688b2015-01-22 10:16:09 -080055 if (fPipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070056 int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070057 SkASSERT(m >= 0);
bsalomonac856c92015-08-27 06:30:17 -070058 fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000059
bsalomonac856c92015-08-27 06:30:17 -070060 int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
egdaniel21aed572014-08-26 12:24:06 -070061 SkASSERT(n >= 0);
bsalomonac856c92015-08-27 06:30:17 -070062 fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
bungeman06ca8ec2016-06-09 08:01:03 -070063
egdaniel8dd688b2015-01-22 10:16:09 -080064 SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000065 }
joshualitt5e6ba212015-07-13 07:35:05 -070066 fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
halcanary96fcdcc2015-08-27 07:41:13 -070067 if (nullptr != pipelineBuilder) {
bsalomonac856c92015-08-27 06:30:17 -070068 fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
69 fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
egdaniel8dd688b2015-01-22 10:16:09 -080070 SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
egdaniel21aed572014-08-26 12:24:06 -070071 }
bsalomon@google.comd62e88e2013-02-01 14:19:27 +000072}
73
jvanverth@google.comcc782382013-01-28 20:39:48 +000074////////////////////////////////////////////////////////////////////////////////
75
egdaniel8dd688b2015-01-22 10:16:09 -080076GrPipelineBuilder::~GrPipelineBuilder() {
egdaniel170f90b2014-09-16 12:54:40 -070077 SkASSERT(0 == fBlockEffectRemovalCnt);
78}