blob: 3b2bbaea577b2cf35a87aac5a2206164317df852 [file] [log] [blame]
egdaniel3658f382014-09-15 07:01:59 -07001/*
egdaniel8dd688b2015-01-22 10:16:09 -08002 * Copyright 2015 Google Inc.
egdaniel3658f382014-09-15 07:01:59 -07003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/GrPipeline.h"
egdaniel3658f382014-09-15 07:01:59 -07009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/gpu/GrAppliedClip.h"
11#include "src/gpu/GrCaps.h"
12#include "src/gpu/GrGpu.h"
Brian Salomoneebe7352020-12-09 16:37:04 -050013#include "src/gpu/GrSurfaceDrawContext.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrXferProcessor.h"
John Stiles010d0882021-06-03 20:28:41 -040015#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
16#include "src/gpu/glsl/GrGLSLUniformHandler.h"
egdaniel3658f382014-09-15 07:01:59 -070017
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "src/gpu/ops/GrOp.h"
joshualitt74417822015-08-07 11:42:16 -070019
Brian Salomon982f5462020-03-30 12:52:33 -040020GrPipeline::GrPipeline(const InitArgs& args,
21 sk_sp<const GrXferProcessor> xferProcessor,
Chris Daltonb832ce62020-01-06 19:49:37 -070022 const GrAppliedHardClip& hardClip)
Greg Daniel87fab9f2021-06-07 15:18:23 -040023 : fDstProxy(args.fDstProxyView)
24 , fWindowRectsState(hardClip.windowRectsState())
25 , fXferProcessor(std::move(xferProcessor))
26 , fWriteSwizzle(args.fWriteSwizzle) {
Chris Daltonbaa1b352019-04-03 12:03:00 -060027 fFlags = (Flags)args.fInputFlags;
Chris Daltonb832ce62020-01-06 19:49:37 -070028 if (hardClip.hasStencilClip()) {
Chris Daltonbaa1b352019-04-03 12:03:00 -060029 fFlags |= Flags::kHasStencilClip;
Brian Salomon54d212e2017-03-21 14:22:38 -040030 }
Chris Daltonb832ce62020-01-06 19:49:37 -070031 if (hardClip.scissorState().enabled()) {
Chris Dalton2e7ed262020-02-21 15:17:59 -070032 fFlags |= Flags::kScissorTestEnabled;
Brian Salomon49348902018-06-26 09:12:38 -040033 }
Greg Daniel87fab9f2021-06-07 15:18:23 -040034 // If we have any special dst sample flags we better also have a dst proxy
35 SkASSERT(this->dstSampleFlags() == GrDstSampleFlags::kNone || this->dstProxyView());
Chris Daltonb832ce62020-01-06 19:49:37 -070036}
Brian Salomon31853842017-03-28 16:32:05 -040037
Chris Daltonb832ce62020-01-06 19:49:37 -070038GrPipeline::GrPipeline(const InitArgs& args, GrProcessorSet&& processors,
39 GrAppliedClip&& appliedClip)
40 : GrPipeline(args, processors.refXferProcessor(), appliedClip.hardClip()) {
41 SkASSERT(processors.isFinalized());
Brian Salomone5b399e2017-07-19 13:50:54 -040042 // Copy GrFragmentProcessors from GrProcessorSet to Pipeline
John Stiles29d3e222020-07-21 17:28:12 -040043 fNumColorProcessors = processors.hasColorFragmentProcessor() ? 1 : 0;
Chris Dalton69824002017-10-31 00:37:52 -060044 int numTotalProcessors = fNumColorProcessors +
John Stiles29d3e222020-07-21 17:28:12 -040045 (processors.hasCoverageFragmentProcessor() ? 1 : 0) +
John Stiles59e18dc2020-07-22 18:18:12 -040046 (appliedClip.hasCoverageFragmentProcessor() ? 1 : 0);
Brian Salomonb5cb6832017-02-24 11:01:15 -050047 fFragmentProcessors.reset(numTotalProcessors);
Robert Phillips82774f82019-06-20 14:38:27 -040048
bsalomonac856c92015-08-27 06:30:17 -070049 int currFPIdx = 0;
John Stiles29d3e222020-07-21 17:28:12 -040050 if (processors.hasColorFragmentProcessor()) {
51 fFragmentProcessors[currFPIdx++] = processors.detachColorFragmentProcessor();
bsalomonae59b772014-11-19 08:23:49 -080052 }
John Stiles29d3e222020-07-21 17:28:12 -040053 if (processors.hasCoverageFragmentProcessor()) {
54 fFragmentProcessors[currFPIdx++] = processors.detachCoverageFragmentProcessor();
egdaniel9cf45bf2014-10-08 06:49:10 -070055 }
John Stiles59e18dc2020-07-22 18:18:12 -040056 if (appliedClip.hasCoverageFragmentProcessor()) {
57 fFragmentProcessors[currFPIdx++] = appliedClip.detachCoverageFragmentProcessor();
Robert Phillips82774f82019-06-20 14:38:27 -040058 }
egdanielc0648242014-09-22 13:17:02 -070059}
60
Greg Danield358cbe2020-09-11 09:33:54 -040061GrXferBarrierType GrPipeline::xferBarrierType(const GrCaps& caps) const {
Greg Daniel87fab9f2021-06-07 15:18:23 -040062 if (this->dstSampleFlags() & GrDstSampleFlags::kRequiresTextureBarrier) {
Robert Phillipsc9c06d42017-06-12 10:58:31 -040063 return kTexture_GrXferBarrierType;
64 }
65 return this->getXferProcessor().xferBarrierType(caps);
66}
67
Brian Salomon982f5462020-03-30 12:52:33 -040068GrPipeline::GrPipeline(GrScissorTest scissorTest,
69 sk_sp<const GrXferProcessor> xp,
70 const GrSwizzle& writeSwizzle,
Chris Dalton1b6a43c2020-09-25 12:21:18 -060071 InputFlags inputFlags)
Robert Phillipsd0fe8752019-01-31 14:13:59 -050072 : fWindowRectsState()
Chris Daltonbaa1b352019-04-03 12:03:00 -060073 , fFlags((Flags)inputFlags)
Chris Daltonc3318f02019-07-19 14:20:53 -060074 , fXferProcessor(std::move(xp))
Brian Salomon982f5462020-03-30 12:52:33 -040075 , fWriteSwizzle(writeSwizzle) {
Chris Dalton916c4982018-08-15 00:53:25 -060076 if (GrScissorTest::kEnabled == scissorTest) {
Chris Dalton2e7ed262020-02-21 15:17:59 -070077 fFlags |= Flags::kScissorTestEnabled;
Chris Dalton46983b72017-06-06 12:27:16 -060078 }
79}
Jim Van Verth1223e7f2019-02-28 17:38:35 -050080
Chris Daltonb204e4c2019-11-07 12:43:13 -070081void GrPipeline::genKey(GrProcessorKeyBuilder* b, const GrCaps& caps) const {
82 // kSnapVerticesToPixelCenters is implemented in a shader.
83 InputFlags ignoredFlags = InputFlags::kSnapVerticesToPixelCenters;
84 if (!caps.multisampleDisableSupport()) {
John Stiles29d3e222020-07-21 17:28:12 -040085 // Ganesh will omit kHWAntialias regardless of multisampleDisableSupport.
Chris Daltonb204e4c2019-11-07 12:43:13 -070086 ignoredFlags |= InputFlags::kHWAntialias;
87 }
John Stiles4b185102021-06-04 16:27:00 -040088 b->add32((uint32_t)fFlags & ~(uint32_t)ignoredFlags, "flags");
Chris Daltonb204e4c2019-11-07 12:43:13 -070089
Chris Daltonbbb3f642019-07-24 12:25:08 -040090 const GrXferProcessor::BlendInfo& blendInfo = this->getXferProcessor().getBlendInfo();
Jim Van Verth1223e7f2019-02-28 17:38:35 -050091
John Stiles4b185102021-06-04 16:27:00 -040092 static constexpr uint32_t kBlendCoeffSize = 5;
93 static constexpr uint32_t kBlendEquationSize = 5;
94 static_assert(kLast_GrBlendCoeff < (1 << kBlendCoeffSize));
95 static_assert(kLast_GrBlendEquation < (1 << kBlendEquationSize));
Jim Van Verth1223e7f2019-02-28 17:38:35 -050096
John Stiles4b185102021-06-04 16:27:00 -040097 b->addBool(blendInfo.fWriteColor, "writeColor");
98 b->addBits(kBlendCoeffSize, blendInfo.fSrcBlend, "srcBlend");
99 b->addBits(kBlendCoeffSize, blendInfo.fDstBlend, "dstBlend");
100 b->addBits(kBlendEquationSize, blendInfo.fEquation, "equation");
Greg Daniel87fab9f2021-06-07 15:18:23 -0400101 b->addBool(this->usesDstInputAttachment(), "inputAttach");
Jim Van Verth1223e7f2019-02-28 17:38:35 -0500102}
Brian Salomonc241b582019-11-27 08:57:17 -0500103
Brian Salomond90b3d32020-07-09 12:04:31 -0400104void GrPipeline::visitTextureEffects(
105 const std::function<void(const GrTextureEffect&)>& func) const {
106 for (auto& fp : fFragmentProcessors) {
107 fp->visitTextureEffects(func);
108 }
109}
110
Brian Salomonc241b582019-11-27 08:57:17 -0500111void GrPipeline::visitProxies(const GrOp::VisitProxyFunc& func) const {
112 // This iteration includes any clip coverage FPs
Brian Salomond90b3d32020-07-09 12:04:31 -0400113 for (auto& fp : fFragmentProcessors) {
114 fp->visitProxies(func);
Brian Salomonc241b582019-11-27 08:57:17 -0500115 }
Greg Danield358cbe2020-09-11 09:33:54 -0400116 if (this->usesDstTexture()) {
John Stilesbcfdc1d2021-06-04 17:19:43 -0400117 func(this->dstProxyView().proxy(), GrMipmapped::kNo);
Brian Salomonc241b582019-11-27 08:57:17 -0500118 }
119}
John Stiles010d0882021-06-03 20:28:41 -0400120
121void GrPipeline::setDstTextureUniforms(const GrGLSLProgramDataManager& pdm,
122 GrGLSLBuiltinUniformHandles* fBuiltinUniformHandles) const {
John Stiles3e77d6e2021-06-04 15:30:50 -0400123 GrTexture* dstTexture = this->peekDstTexture();
John Stiles010d0882021-06-03 20:28:41 -0400124
125 if (dstTexture) {
John Stiles1acbc1e2021-06-04 10:31:45 -0400126 if (fBuiltinUniformHandles->fDstTextureCoordsUni.isValid()) {
127 pdm.set4f(fBuiltinUniformHandles->fDstTextureCoordsUni,
John Stilesbcfdc1d2021-06-04 17:19:43 -0400128 static_cast<float>(this->dstTextureOffset().fX),
129 static_cast<float>(this->dstTextureOffset().fY),
John Stiles010d0882021-06-03 20:28:41 -0400130 1.f / dstTexture->width(),
131 1.f / dstTexture->height());
John Stiles010d0882021-06-03 20:28:41 -0400132 }
133 } else {
John Stiles1acbc1e2021-06-04 10:31:45 -0400134 SkASSERT(!fBuiltinUniformHandles->fDstTextureCoordsUni.isValid());
John Stiles010d0882021-06-03 20:28:41 -0400135 }
136}