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