1af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com/*
28dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Copyright 2015 Google Inc.
3af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com *
4af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
5af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com * found in the LICENSE file.
6af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com */
7af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com
88dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#include "GrPipelineBuilder.h"
93658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
105bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt#include "GrBatch.h"
11b1cff03325c42bb1cd87204d9b0dd3d6b9678d3eegdaniel#include "GrBlend.h"
123658f382cc129e463d7f40a7e68214d04d50fe14egdaniel#include "GrPaint.h"
138dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#include "GrPipeline.h"
14b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h"
15378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#include "GrXferProcessor.h"
16378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#include "effects/GrPorterDuffXferProcessor.h"
173658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
188dd688b7569df569a672a8a67b2db86a9d376cfcegdanielGrPipelineBuilder::GrPipelineBuilder()
19d79c549467e5e7be025e38357f179b7965ed2ec3bsalomon    : fFlags(0x0)
202fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fDrawFace(kBoth_DrawFace)
212fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fColorProcInfoValid(false)
222fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fCoverageProcInfoValid(false)
232fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fColorCache(GrColor_ILLEGAL)
244d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    , fCoverageCache(GrColor_ILLEGAL) {
252fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
2689af44a0f1323dc136b238c00ccf143e15abb243egdaniel}
2789af44a0f1323dc136b238c00ccf143e15abb243egdaniel
288dd688b7569df569a672a8a67b2db86a9d376cfcegdanielGrPipelineBuilder& GrPipelineBuilder::operator=(const GrPipelineBuilder& that) {
29ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    fRenderTarget.reset(SkSafeRef(that.fRenderTarget.get()));
30d79c549467e5e7be025e38357f179b7965ed2ec3bsalomon    fFlags = that.fFlags;
318f7273399466c95c0c86b099de438d6ef1a15c88bsalomon    fStencilSettings = that.fStencilSettings;
328f7273399466c95c0c86b099de438d6ef1a15c88bsalomon    fDrawFace = that.fDrawFace;
33378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel    fXPFactory.reset(SkRef(that.getXPFactory()));
348cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel    fColorStages = that.fColorStages;
358cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel    fCoverageStages = that.fCoverageStages;
3644701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt    fClip = that.fClip;
378f7273399466c95c0c86b099de438d6ef1a15c88bsalomon
38b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fColorProcInfoValid = that.fColorProcInfoValid;
39b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fCoverageProcInfoValid = that.fCoverageProcInfoValid;
40f364b61dd86aa2a9d8cc7b01d9e78e066bd88334joshualitt    fColorCache = that.fColorCache;
41f364b61dd86aa2a9d8cc7b01d9e78e066bd88334joshualitt    fCoverageCache = that.fCoverageCache;
42b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    if (fColorProcInfoValid) {
43b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fColorProcInfo = that.fColorProcInfo;
44b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
45b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    if (fCoverageProcInfoValid) {
46b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fCoverageProcInfo = that.fCoverageProcInfo;
47b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
488f7273399466c95c0c86b099de438d6ef1a15c88bsalomon    return *this;
498f7273399466c95c0c86b099de438d6ef1a15c88bsalomon}
508f7273399466c95c0c86b099de438d6ef1a15c88bsalomon
51570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualittvoid GrPipelineBuilder::setFromPaint(const GrPaint& paint, GrRenderTarget* rt, const GrClip& clip) {
5256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt    SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numFragmentStages());
53eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com
548cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel    fColorStages.reset();
558cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel    fCoverageStages.reset();
56eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com
5742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org    for (int i = 0; i < paint.numColorStages(); ++i) {
588cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel        fColorStages.push_back(paint.getColorStage(i));
59af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com    }
60af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com
6142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org    for (int i = 0; i < paint.numCoverageStages(); ++i) {
628cbf3d5b17e5f95ed992c019fb6165f079c385adegdaniel        fCoverageStages.push_back(paint.getCoverageStage(i));
63af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com    }
64af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com
65378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel    fXPFactory.reset(SkRef(paint.getXPFactory()));
66378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
67bb6a3178c3e79c8549b332e4ce84c64b59964f1ecommit-bot@chromium.org    this->setRenderTarget(rt);
68bb6a3178c3e79c8549b332e4ce84c64b59964f1ecommit-bot@chromium.org
69bb6a3178c3e79c8549b332e4ce84c64b59964f1ecommit-bot@chromium.org    // These have no equivalent in GrPaint, set them to defaults
702ed5ef84a5609089ad9d8a8f3a52bf77e76476dbbsalomon    fDrawFace = kBoth_DrawFace;
712ed5ef84a5609089ad9d8a8f3a52bf77e76476dbbsalomon    fStencilSettings.setDisabled();
72d79c549467e5e7be025e38357f179b7965ed2ec3bsalomon    fFlags = 0;
73bb6a3178c3e79c8549b332e4ce84c64b59964f1ecommit-bot@chromium.org
74570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualitt    fClip = clip;
7521c10c5ff50cb8f2fd995fc9396d435d3396258bbsalomon@google.com
76d79c549467e5e7be025e38357f179b7965ed2ec3bsalomon    this->setState(GrPipelineBuilder::kDither_Flag, paint.isDither());
77d79c549467e5e7be025e38357f179b7965ed2ec3bsalomon    this->setState(GrPipelineBuilder::kHWAntialias_Flag,
78d0a840d4d8bb6ebc9981cc331b1b231a6c6e0928cdalton                   rt->isMultisampled() && paint.isAntiAlias());
79af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com
80b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fColorProcInfoValid = false;
81b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    fCoverageProcInfoValid = false;
822e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt
832e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    fColorCache = GrColor_ILLEGAL;
842e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    fCoverageCache = GrColor_ILLEGAL;
85af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com}
865b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com
8721aed57023bad4b04076c59e37097c7563efc028egdaniel//////////////////////////////////////////////////////////////////////////////s
88d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
89e36914cb205699526988127a827d1a76c9a98d39egdanielbool GrPipelineBuilder::willXPNeedDstCopy(const GrDrawTargetCaps& caps,
90e36914cb205699526988127a827d1a76c9a98d39egdaniel                                          const GrProcOptInfo& colorPOI,
91e36914cb205699526988127a827d1a76c9a98d39egdaniel                                          const GrProcOptInfo& coveragePOI) const {
92e36914cb205699526988127a827d1a76c9a98d39egdaniel    return this->getXPFactory()->willNeedDstCopy(caps, colorPOI, coveragePOI);
9389af44a0f1323dc136b238c00ccf143e15abb243egdaniel}
9489af44a0f1323dc136b238c00ccf143e15abb243egdaniel
956be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomonvoid GrPipelineBuilder::AutoRestoreFragmentProcessors::set(GrPipelineBuilder* pipelineBuilder) {
968dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    if (fPipelineBuilder) {
976be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon        int m = fPipelineBuilder->numColorFragmentStages() - fColorEffectCnt;
9821aed57023bad4b04076c59e37097c7563efc028egdaniel        SkASSERT(m >= 0);
998dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel        fPipelineBuilder->fColorStages.pop_back_n(m);
100d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
1016be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon        int n = fPipelineBuilder->numCoverageFragmentStages() - fCoverageEffectCnt;
10221aed57023bad4b04076c59e37097c7563efc028egdaniel        SkASSERT(n >= 0);
1038dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel        fPipelineBuilder->fCoverageStages.pop_back_n(n);
104b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        if (m + n > 0) {
1058dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel            fPipelineBuilder->fColorProcInfoValid = false;
1068dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel            fPipelineBuilder->fCoverageProcInfoValid = false;
107b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        }
1088dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel        SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
10921aed57023bad4b04076c59e37097c7563efc028egdaniel    }
1108dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    fPipelineBuilder = pipelineBuilder;
1118dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    if (NULL != pipelineBuilder) {
1126be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon        fColorEffectCnt = pipelineBuilder->numColorFragmentStages();
1136be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon        fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentStages();
1148dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel        SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
115d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com    }
116d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com}
117d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com
118cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com////////////////////////////////////////////////////////////////////////////////
119cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com
1208dd688b7569df569a672a8a67b2db86a9d376cfcegdanielGrPipelineBuilder::~GrPipelineBuilder() {
121170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel    SkASSERT(0 == fBlockEffectRemovalCnt);
122170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel}
123170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel
12489af44a0f1323dc136b238c00ccf143e15abb243egdaniel////////////////////////////////////////////////////////////////////////////////
12589af44a0f1323dc136b238c00ccf143e15abb243egdaniel
1268dd688b7569df569a672a8a67b2db86a9d376cfcegdanielbool GrPipelineBuilder::willBlendWithDst(const GrPrimitiveProcessor* pp) const {
12756995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt    this->calcColorInvariantOutput(pp);
12856995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt    this->calcCoverageInvariantOutput(pp);
1299e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel
1309e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    GrXPFactory::InvariantOutput output;
131080e673b10ac607305f140ddb245e140ccde40c6egdaniel    fXPFactory->getInvariantOutput(fColorProcInfo, fCoverageProcInfo, &output);
1329e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    return output.fWillBlendWithDst;
13356995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt}
13456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt
1358dd688b7569df569a672a8a67b2db86a9d376cfcegdanielvoid GrPipelineBuilder::calcColorInvariantOutput(const GrPrimitiveProcessor* pp) const {
1366be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon    fColorProcInfo.calcColorWithPrimProc(pp, fColorStages.begin(), this->numColorFragmentStages());
1374d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fColorProcInfoValid = false;
1384d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt
13989af44a0f1323dc136b238c00ccf143e15abb243egdaniel}
14089af44a0f1323dc136b238c00ccf143e15abb243egdaniel
1418dd688b7569df569a672a8a67b2db86a9d376cfcegdanielvoid GrPipelineBuilder::calcCoverageInvariantOutput(const GrPrimitiveProcessor* pp) const {
1424d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fCoverageProcInfo.calcCoverageWithPrimProc(pp, fCoverageStages.begin(),
1436be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                                               this->numCoverageFragmentStages());
1444d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fCoverageProcInfoValid = false;
145d5a7db4a867c7e6ccf8451a053d987b470099198joshualitt}
146d5a7db4a867c7e6ccf8451a053d987b470099198joshualitt
1474d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualittvoid GrPipelineBuilder::calcColorInvariantOutput(const GrBatch* batch) const {
1486be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon    fColorProcInfo.calcColorWithBatch(batch, fColorStages.begin(), this->numColorFragmentStages());
1494d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fColorProcInfoValid = false;
1504d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt}
1514d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt
1524d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualittvoid GrPipelineBuilder::calcCoverageInvariantOutput(const GrBatch* batch) const {
1534d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fCoverageProcInfo.calcCoverageWithBatch(batch, fCoverageStages.begin(),
1546be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                                            this->numCoverageFragmentStages());
1554d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    fCoverageProcInfoValid = false;
1564d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt}
1574d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt
1584d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt
1598dd688b7569df569a672a8a67b2db86a9d376cfcegdanielvoid GrPipelineBuilder::calcColorInvariantOutput(GrColor color) const {
1602e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    if (!fColorProcInfoValid || color != fColorCache) {
16156995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt        GrColorComponentFlags flags = kRGBA_GrColorComponentFlags;
1626be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon        fColorProcInfo.calcWithInitialValues(fColorStages.begin(),this->numColorFragmentStages(),
1636be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                                             color, flags, false);
164b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fColorProcInfoValid = true;
1652e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt        fColorCache = color;
166b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
167b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel}
168b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
1698dd688b7569df569a672a8a67b2db86a9d376cfcegdanielvoid GrPipelineBuilder::calcCoverageInvariantOutput(GrColor coverage) const {
1702e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    if (!fCoverageProcInfoValid || coverage != fCoverageCache) {
17156995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt        GrColorComponentFlags flags = kRGBA_GrColorComponentFlags;
17256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt        fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(),
1736be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                                                this->numCoverageFragmentStages(), coverage, flags,
17456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt                                                true);
175b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel        fCoverageProcInfoValid = true;
1762e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt        fCoverageCache = coverage;
177b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    }
178b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel}
179