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