GrProcessorSet.cpp revision 8d2f90b37b9caa120599a71530545dd11853c0bc
192ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon/*
292ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon * Copyright 2017 Google Inc.
392ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon *
492ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon * Use of this source code is governed by a BSD-style license that can be
592ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon * found in the LICENSE file.
692ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon */
792ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon
892ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon#include "GrProcessorSet.h"
95298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon#include "GrAppliedClip.h"
105298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon#include "GrCaps.h"
115298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon#include "GrProcOptInfo.h"
1292ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon
1392ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian SalomonGrProcessorSet::GrProcessorSet(GrPaint&& paint) {
1492ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon    fXPFactory = paint.fXPFactory;
15f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    fFlags = 0;
168d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    if (paint.numColorFragmentProcessors() <= kMaxColorProcessors) {
178d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fColorFragmentProcessorCnt = paint.numColorFragmentProcessors();
188d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fFragmentProcessors.reset(paint.numTotalFragmentProcessors());
198d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        int i = 0;
208d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        for (auto& fp : paint.fColorFragmentProcessors) {
218d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon            fFragmentProcessors[i++] = fp.release();
228d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        }
238d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        for (auto& fp : paint.fCoverageFragmentProcessors) {
248d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon            fFragmentProcessors[i++] = fp.release();
258d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        }
268d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        if (paint.usesDistanceVectorField()) {
278d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon            fFlags |= kUseDistanceVectorField_Flag;
288d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        }
298d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    } else {
308d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        SkDebugf("Insane number of color fragment processors in paint. Dropping all processors.");
318d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fColorFragmentProcessorCnt = 0;
32f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    }
33f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    if (paint.getDisableOutputConversionToSRGB()) {
34f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon        fFlags |= kDisableOutputConversionToSRGB_Flag;
35f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    }
36f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    if (paint.getAllowSRGBInputs()) {
37f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon        fFlags |= kAllowSRGBInputs_Flag;
38f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    }
3992ce5946855aa8d55bb4a0dd0a47d58746d67d0aBrian Salomon}
405298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
415298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon//////////////////////////////////////////////////////////////////////////////
425298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
438d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomonvoid GrProcessorSet::FragmentProcessorAnalysis::internalInit(const GrPipelineInput& colorInput,
448d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                             const GrPipelineInput coverageInput,
458d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                             const GrProcessorSet& processors,
468d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                             const GrFragmentProcessor* clipFP,
478d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                             const GrCaps& caps) {
485298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    GrProcOptInfo colorInfo(colorInput);
495298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    fCompatibleWithCoverageAsAlpha = !coverageInput.isLCDCoverage();
508d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    fValidInputColor = colorInput.isConstant(&fInputColor);
515298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
525298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    const GrFragmentProcessor* const* fps = processors.fFragmentProcessors.get();
535298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    colorInfo.analyzeProcessors(fps, processors.fColorFragmentProcessorCnt);
545298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    fCompatibleWithCoverageAsAlpha &= colorInfo.allProcessorsCompatibleWithCoverageAsAlpha();
555298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    fps += processors.fColorFragmentProcessorCnt;
565298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    int n = processors.numCoverageFragmentProcessors();
575298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    bool hasCoverageFP = n > 0;
58bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon    fUsesLocalCoords = colorInfo.usesLocalCoords();
59bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon    for (int i = 0; i < n; ++i) {
605298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        if (!fps[i]->compatibleWithCoverageAsAlpha()) {
615298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon            fCompatibleWithCoverageAsAlpha = false;
625298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon            // Other than tests that exercise atypical behavior we expect all coverage FPs to be
635298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon            // compatible with the coverage-as-alpha optimization.
645298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon            GrCapsDebugf(&caps, "Coverage FP is not compatible with coverage as alpha.\n");
655298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        }
66bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon        fUsesLocalCoords |= fps[i]->usesLocalCoords();
675298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    }
685298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
695298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    if (clipFP) {
705298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        fCompatibleWithCoverageAsAlpha &= clipFP->compatibleWithCoverageAsAlpha();
71bfafcba05a54e1bc9c3074353a155d61119d095cBrian Salomon        fUsesLocalCoords |= clipFP->usesLocalCoords();
725298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        hasCoverageFP = true;
735298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    }
748d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    fInitialColorProcessorsToEliminate = colorInfo.initialProcessorsToEliminate(&fInputColor);
758d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    fValidInputColor |= SkToBool(fInitialColorProcessorsToEliminate);
765298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
775298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    bool opaque = colorInfo.isOpaque();
785298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    if (colorInfo.hasKnownOutputColor(&fKnownOutputColor)) {
798d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fOutputColorType = static_cast<unsigned>(opaque ? ColorType::kOpaqueConstant
808d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                        : ColorType::kConstant);
815298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    } else if (opaque) {
828d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fOutputColorType = static_cast<unsigned>(ColorType::kOpaque);
835298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    } else {
848d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fOutputColorType = static_cast<unsigned>(ColorType::kUnknown);
855298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    }
865298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
875298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    if (coverageInput.isLCDCoverage()) {
888d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fOutputCoverageType = static_cast<unsigned>(CoverageType::kLCD);
895298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    } else {
908d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon        fOutputCoverageType = hasCoverageFP || !coverageInput.isSolidWhite()
918d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                      ? static_cast<unsigned>(CoverageType::kSingleChannel)
928d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                      : static_cast<unsigned>(CoverageType::kNone);
935298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    }
945298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon}
955298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
968d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomonvoid GrProcessorSet::FragmentProcessorAnalysis::init(const GrPipelineInput& colorInput,
978d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                     const GrPipelineInput coverageInput,
988d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                     const GrProcessorSet& processors,
998d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                     const GrAppliedClip* appliedClip,
1008d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon                                                     const GrCaps& caps) {
1018d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    const GrFragmentProcessor* clipFP =
1028d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon            appliedClip ? appliedClip->clipCoverageFragmentProcessor() : nullptr;
1038d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    this->internalInit(colorInput, coverageInput, processors, clipFP, caps);
1048d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    fIsInitializedWithProcessorSet = true;
1055298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon}
1065298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon
1075298dc8bf30f580f551d130346c007efaf4b2098Brian SalomonGrProcessorSet::FragmentProcessorAnalysis::FragmentProcessorAnalysis(
1085298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        const GrPipelineInput& colorInput, const GrPipelineInput coverageInput, const GrCaps& caps)
1095298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon        : FragmentProcessorAnalysis() {
1108d2f90b37b9caa120599a71530545dd11853c0bcBrian Salomon    this->internalInit(colorInput, coverageInput, GrProcessorSet(GrPaint()), nullptr, caps);
1115298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon}
112