Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "GrPipelineBuilder.h"
      9 
     10 #include "GrBlend.h"
     11 #include "GrPaint.h"
     12 #include "GrPipeline.h"
     13 #include "GrProcOptInfo.h"
     14 #include "GrXferProcessor.h"
     15 #include "batches/GrBatch.h"
     16 #include "effects/GrPorterDuffXferProcessor.h"
     17 
     18 GrPipelineBuilder::GrPipelineBuilder()
     19     : fFlags(0x0), fDrawFace(kBoth_DrawFace) {
     20     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
     21 }
     22 
     23 GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, GrRenderTarget* rt, const GrClip& clip) {
     24     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
     25 
     26     for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
     27         fColorFragmentProcessors.push_back(SkRef(paint.getColorFragmentProcessor(i)));
     28     }
     29 
     30     for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
     31         fCoverageFragmentProcessors.push_back(SkRef(paint.getCoverageFragmentProcessor(i)));
     32     }
     33 
     34     fXPFactory.reset(SkSafeRef(paint.getXPFactory()));
     35 
     36     this->setRenderTarget(rt);
     37 
     38     // These have no equivalent in GrPaint, set them to defaults
     39     fDrawFace = kBoth_DrawFace;
     40     fStencilSettings.setDisabled();
     41     fFlags = 0;
     42 
     43     fClip = clip;
     44 
     45     this->setState(GrPipelineBuilder::kHWAntialias_Flag,
     46                    rt->isUnifiedMultisampled() && paint.isAntiAlias());
     47 }
     48 
     49 //////////////////////////////////////////////////////////////////////////////s
     50 
     51 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
     52                                              const GrPipelineOptimizations& optimizations) const {
     53     if (this->getXPFactory()) {
     54         return this->getXPFactory()->willNeedDstTexture(caps, optimizations,
     55                                                         this->hasMixedSamples());
     56     }
     57     return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations,
     58                                                             this->hasMixedSamples());
     59 }
     60 
     61 void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
     62                                                          const GrPipelineBuilder* pipelineBuilder) {
     63     if (fPipelineBuilder) {
     64         int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
     65         SkASSERT(m >= 0);
     66         for (int i = 0; i < m; ++i) {
     67             fPipelineBuilder->fColorFragmentProcessors.fromBack(i)->unref();
     68         }
     69         fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
     70 
     71         int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
     72         SkASSERT(n >= 0);
     73         for (int i = 0; i < n; ++i) {
     74             fPipelineBuilder->fCoverageFragmentProcessors.fromBack(i)->unref();
     75         }
     76         fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
     77         SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
     78     }
     79     fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
     80     if (nullptr != pipelineBuilder) {
     81         fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
     82         fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
     83         SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
     84     }
     85 }
     86 
     87 ////////////////////////////////////////////////////////////////////////////////
     88 
     89 GrPipelineBuilder::~GrPipelineBuilder() {
     90     SkASSERT(0 == fBlockEffectRemovalCnt);
     91     for (int i = 0; i < fColorFragmentProcessors.count(); ++i) {
     92         fColorFragmentProcessors[i]->unref();
     93     }
     94     for (int i = 0; i < fCoverageFragmentProcessors.count(); ++i) {
     95         fCoverageFragmentProcessors[i]->unref();
     96     }
     97 }
     98