blob: 90b76ca5b8d51b6b11346515d5f082c9aaf57166 [file] [log] [blame]
Brian Salomonb4d61062017-07-12 11:24:41 -04001/*
2 * Copyright 2017 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/GrAppliedClip.h"
9#include "src/gpu/GrProcessorSet.h"
Robert Phillipsce978572020-02-28 11:56:44 -050010#include "src/gpu/GrProgramInfo.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrUserStencilSettings.h"
12#include "src/gpu/SkGr.h"
Michael Ludwig663afe52019-06-03 16:46:19 -040013#include "src/gpu/geometry/GrRect.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
Brian Salomonb4d61062017-07-12 11:24:41 -040015
Robert Phillips360ec182020-03-26 13:29:50 -040016GrSimpleMeshDrawOpHelper::GrSimpleMeshDrawOpHelper(const MakeArgs& args,
17 GrAAType aaType,
Chris Daltonbaa1b352019-04-03 12:03:00 -060018 InputFlags inputFlags)
Brian Salomonb4d61062017-07-12 11:24:41 -040019 : fProcessors(args.fProcessorSet)
Chris Daltonbaa1b352019-04-03 12:03:00 -060020 , fPipelineFlags((GrPipeline::InputFlags)inputFlags)
Brian Salomonb4d61062017-07-12 11:24:41 -040021 , fAAType((int)aaType)
Brian Salomonb4d61062017-07-12 11:24:41 -040022 , fUsesLocalCoords(false)
Brian Osman605c6d52019-03-15 12:10:35 -040023 , fCompatibleWithCoverageAsAlpha(false) {
Brian Salomonb4d61062017-07-12 11:24:41 -040024 SkDEBUGCODE(fDidAnalysis = false);
Brian Salomonbfd18cd2017-08-09 16:27:09 -040025 SkDEBUGCODE(fMadePipeline = false);
Brian Salomonb4d61062017-07-12 11:24:41 -040026 if (GrAATypeIsHW(aaType)) {
Chris Daltonbaa1b352019-04-03 12:03:00 -060027 fPipelineFlags |= GrPipeline::InputFlags::kHWAntialias;
Brian Salomonb4d61062017-07-12 11:24:41 -040028 }
29}
30
31GrSimpleMeshDrawOpHelper::~GrSimpleMeshDrawOpHelper() {
32 if (fProcessors) {
33 fProcessors->~GrProcessorSet();
34 }
35}
36
37GrDrawOp::FixedFunctionFlags GrSimpleMeshDrawOpHelper::fixedFunctionFlags() const {
Robert Phillips360ec182020-03-26 13:29:50 -040038 return GrAATypeIsHW(this->aaType()) ? GrDrawOp::FixedFunctionFlags::kUsesHWAA
39 : GrDrawOp::FixedFunctionFlags::kNone;
Brian Salomonb4d61062017-07-12 11:24:41 -040040}
41
42bool GrSimpleMeshDrawOpHelper::isCompatible(const GrSimpleMeshDrawOpHelper& that,
43 const GrCaps& caps, const SkRect& thisBounds,
Robert Phillipsb69001f2019-10-29 12:16:35 -040044 const SkRect& thatBounds, bool ignoreAAType) const {
Brian Salomonb4d61062017-07-12 11:24:41 -040045 if (SkToBool(fProcessors) != SkToBool(that.fProcessors)) {
46 return false;
47 }
48 if (fProcessors) {
49 if (*fProcessors != *that.fProcessors) {
50 return false;
51 }
Brian Salomonb4d61062017-07-12 11:24:41 -040052 }
Robert Phillipsb69001f2019-10-29 12:16:35 -040053
54#ifdef SK_DEBUG
55 if (ignoreAAType) {
56 // If we're ignoring AA it should be bc we already know they are the same or that
57 // the are different but are compatible (i.e., one is AA and the other is None)
Robert Phillipsbbd459d2019-10-29 14:40:03 -040058 SkASSERT(fAAType == that.fAAType ||
59 GrMeshDrawOp::CanUpgradeAAOnMerge(this->aaType(), that.aaType()));
Robert Phillipsb69001f2019-10-29 12:16:35 -040060 }
61#endif
62
63 bool result = fPipelineFlags == that.fPipelineFlags &&
64 (ignoreAAType || fAAType == that.fAAType);
Brian Osman605c6d52019-03-15 12:10:35 -040065 SkASSERT(!result || fCompatibleWithCoverageAsAlpha == that.fCompatibleWithCoverageAsAlpha);
Brian Salomonb4d61062017-07-12 11:24:41 -040066 SkASSERT(!result || fUsesLocalCoords == that.fUsesLocalCoords);
67 return result;
68}
69
Chris Dalton4b62aed2019-01-15 11:53:00 -070070GrProcessorSet::Analysis GrSimpleMeshDrawOpHelper::finalizeProcessors(
Chris Dalton6ce447a2019-06-23 18:07:38 -060071 const GrCaps& caps, const GrAppliedClip* clip, bool hasMixedSampledCoverage,
72 GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage,
73 SkPMColor4f* geometryColor, bool* wideColor) {
Chris Daltonb8fff0d2019-03-05 10:11:58 -070074 GrProcessorAnalysisColor color = *geometryColor;
Brian Osman5ced0bf2019-03-15 10:15:29 -040075 auto result = this->finalizeProcessors(
Chris Dalton6ce447a2019-06-23 18:07:38 -060076 caps, clip, hasMixedSampledCoverage, clampType, geometryCoverage, &color);
Chris Daltonb8fff0d2019-03-05 10:11:58 -070077 color.isConstant(geometryColor);
Brian Osman8fa7ab42019-03-18 10:22:42 -040078 if (wideColor) {
Brian Osman2715bf52019-12-06 14:38:47 -050079 *wideColor = !geometryColor->fitsInBytes();
Brian Osman8fa7ab42019-03-18 10:22:42 -040080 }
Chris Daltonb8fff0d2019-03-05 10:11:58 -070081 return result;
82}
83
84GrProcessorSet::Analysis GrSimpleMeshDrawOpHelper::finalizeProcessors(
85 const GrCaps& caps, const GrAppliedClip* clip, const GrUserStencilSettings* userStencil,
Chris Dalton6ce447a2019-06-23 18:07:38 -060086 bool hasMixedSampledCoverage, GrClampType clampType,
87 GrProcessorAnalysisCoverage geometryCoverage, GrProcessorAnalysisColor* geometryColor) {
Brian Salomonb4d61062017-07-12 11:24:41 -040088 SkDEBUGCODE(fDidAnalysis = true);
89 GrProcessorSet::Analysis analysis;
90 if (fProcessors) {
91 GrProcessorAnalysisCoverage coverage = geometryCoverage;
92 if (GrProcessorAnalysisCoverage::kNone == coverage) {
Chris Dalton69824002017-10-31 00:37:52 -060093 coverage = clip->numClipCoverageFragmentProcessors()
Brian Salomonb4d61062017-07-12 11:24:41 -040094 ? GrProcessorAnalysisCoverage::kSingleChannel
95 : GrProcessorAnalysisCoverage::kNone;
96 }
Brian Osmancf860852018-10-31 14:04:39 -040097 SkPMColor4f overrideColor;
Chris Dalton6ce447a2019-06-23 18:07:38 -060098 analysis = fProcessors->finalize(*geometryColor, coverage, clip, userStencil,
99 hasMixedSampledCoverage, caps, clampType, &overrideColor);
Brian Salomon0088f942017-07-12 11:51:27 -0400100 if (analysis.inputColorIsOverridden()) {
101 *geometryColor = overrideColor;
102 }
Brian Salomonb4d61062017-07-12 11:24:41 -0400103 } else {
104 analysis = GrProcessorSet::EmptySetAnalysis();
105 }
Brian Salomonb4d61062017-07-12 11:24:41 -0400106 fUsesLocalCoords = analysis.usesLocalCoords();
Brian Osman605c6d52019-03-15 12:10:35 -0400107 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Chris Dalton4b62aed2019-01-15 11:53:00 -0700108 return analysis;
Brian Salomonb4d61062017-07-12 11:24:41 -0400109}
110
Robert Phillips3968fcb2019-12-05 16:40:31 -0500111const GrPipeline* GrSimpleMeshDrawOpHelper::CreatePipeline(
Robert Phillips6c59fe42020-02-27 09:30:37 -0500112 const GrCaps* caps,
113 SkArenaAlloc* arena,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400114 GrSwizzle writeViewSwizzle,
Robert Phillips6c59fe42020-02-27 09:30:37 -0500115 GrAppliedClip&& appliedClip,
116 const GrXferProcessor::DstProxyView& dstProxyView,
117 GrProcessorSet&& processorSet,
118 GrPipeline::InputFlags pipelineFlags,
119 const GrUserStencilSettings* stencilSettings) {
Robert Phillips3968fcb2019-12-05 16:40:31 -0500120 GrPipeline::InitArgs pipelineArgs;
121
122 pipelineArgs.fInputFlags = pipelineFlags;
Robert Phillips3968fcb2019-12-05 16:40:31 -0500123 pipelineArgs.fUserStencil = stencilSettings;
Robert Phillipsce978572020-02-28 11:56:44 -0500124 pipelineArgs.fCaps = caps;
125 pipelineArgs.fDstProxyView = dstProxyView;
Brian Salomon8afde5f2020-04-01 16:22:00 -0400126 pipelineArgs.fWriteSwizzle = writeViewSwizzle;
Robert Phillips3968fcb2019-12-05 16:40:31 -0500127
Robert Phillips6c59fe42020-02-27 09:30:37 -0500128 return arena->make<GrPipeline>(pipelineArgs,
129 std::move(processorSet),
130 std::move(appliedClip));
131}
132
133const GrPipeline* GrSimpleMeshDrawOpHelper::CreatePipeline(
134 GrOpFlushState* flushState,
135 GrProcessorSet&& processorSet,
136 GrPipeline::InputFlags pipelineFlags,
137 const GrUserStencilSettings* stencilSettings) {
138 return CreatePipeline(&flushState->caps(),
139 flushState->allocator(),
Brian Salomon8afde5f2020-04-01 16:22:00 -0400140 flushState->writeView()->swizzle(),
Robert Phillips6c59fe42020-02-27 09:30:37 -0500141 flushState->detachAppliedClip(),
142 flushState->dstProxyView(),
143 std::move(processorSet),
144 pipelineFlags,
145 stencilSettings);
146}
147
148const GrPipeline* GrSimpleMeshDrawOpHelper::createPipeline(GrOpFlushState* flushState) {
149 return CreatePipeline(&flushState->caps(),
150 flushState->allocator(),
Brian Salomon8afde5f2020-04-01 16:22:00 -0400151 flushState->writeView()->swizzle(),
Robert Phillips6c59fe42020-02-27 09:30:37 -0500152 flushState->detachAppliedClip(),
153 flushState->dstProxyView(),
154 this->detachProcessorSet(),
155 this->pipelineFlags());
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700156}
157
Robert Phillipsce978572020-02-28 11:56:44 -0500158GrProgramInfo* GrSimpleMeshDrawOpHelper::CreateProgramInfo(
159 const GrCaps* caps,
160 SkArenaAlloc* arena,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400161 const GrSurfaceProxyView* writeView,
Robert Phillipsce978572020-02-28 11:56:44 -0500162 GrAppliedClip&& appliedClip,
163 const GrXferProcessor::DstProxyView& dstProxyView,
164 GrGeometryProcessor* geometryProcessor,
165 GrProcessorSet&& processorSet,
Robert Phillipsac6156c2020-02-28 16:02:40 -0500166 GrPrimitiveType primitiveType,
167 GrPipeline::InputFlags pipelineFlags,
Robert Phillips709e2402020-03-23 18:29:16 +0000168 const GrUserStencilSettings* stencilSettings) {
Robert Phillipsce978572020-02-28 11:56:44 -0500169 auto pipeline = CreatePipeline(caps,
170 arena,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400171 writeView->swizzle(),
Robert Phillipsce978572020-02-28 11:56:44 -0500172 std::move(appliedClip),
173 dstProxyView,
174 std::move(processorSet),
Robert Phillipsac6156c2020-02-28 16:02:40 -0500175 pipelineFlags,
176 stencilSettings);
Robert Phillipsce978572020-02-28 11:56:44 -0500177
Brian Salomon8afde5f2020-04-01 16:22:00 -0400178 return CreateProgramInfo(arena, pipeline, writeView, geometryProcessor, primitiveType);
Robert Phillips4f93c572020-03-18 08:13:53 -0400179}
180
181GrProgramInfo* GrSimpleMeshDrawOpHelper::CreateProgramInfo(SkArenaAlloc* arena,
182 const GrPipeline* pipeline,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400183 const GrSurfaceProxyView* writeView,
Robert Phillips4f93c572020-03-18 08:13:53 -0400184 GrGeometryProcessor* geometryProcessor,
Robert Phillips709e2402020-03-23 18:29:16 +0000185 GrPrimitiveType primitiveType) {
Brian Salomon8afde5f2020-04-01 16:22:00 -0400186 GrRenderTargetProxy* outputProxy = writeView->asRenderTargetProxy();
Robert Phillipsce978572020-02-28 11:56:44 -0500187
Robert Phillipsce978572020-02-28 11:56:44 -0500188 auto tmp = arena->make<GrProgramInfo>(outputProxy->numSamples(),
189 outputProxy->numStencilSamples(),
190 outputProxy->backendFormat(),
Brian Salomon8afde5f2020-04-01 16:22:00 -0400191 writeView->origin(),
Robert Phillipsce978572020-02-28 11:56:44 -0500192 pipeline,
193 geometryProcessor,
Robert Phillips709e2402020-03-23 18:29:16 +0000194 primitiveType);
Robert Phillipsce978572020-02-28 11:56:44 -0500195 return tmp;
196}
197
Robert Phillipsb58098f2020-03-02 16:25:29 -0500198GrProgramInfo* GrSimpleMeshDrawOpHelper::createProgramInfo(
199 const GrCaps* caps,
200 SkArenaAlloc* arena,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400201 const GrSurfaceProxyView* writeView,
Robert Phillipsb58098f2020-03-02 16:25:29 -0500202 GrAppliedClip&& appliedClip,
203 const GrXferProcessor::DstProxyView& dstProxyView,
204 GrGeometryProcessor* gp,
205 GrPrimitiveType primType) {
206 return CreateProgramInfo(caps,
207 arena,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400208 writeView,
Robert Phillipsb58098f2020-03-02 16:25:29 -0500209 std::move(appliedClip),
210 dstProxyView,
211 gp,
212 this->detachProcessorSet(),
213 primType,
214 this->pipelineFlags());
215}
216
Brian Osman9a390ac2018-11-12 09:47:48 -0500217#ifdef SK_DEBUG
Chris Daltonbaa1b352019-04-03 12:03:00 -0600218static void dump_pipeline_flags(GrPipeline::InputFlags flags, SkString* result) {
219 if (GrPipeline::InputFlags::kNone != flags) {
220 if (flags & GrPipeline::InputFlags::kSnapVerticesToPixelCenters) {
221 result->append("Snap vertices to pixel center.\n");
222 }
223 if (flags & GrPipeline::InputFlags::kHWAntialias) {
224 result->append("HW Antialiasing enabled.\n");
225 }
226 return;
227 }
228 result->append("No pipeline flags\n");
229}
230
Brian Salomonb4d61062017-07-12 11:24:41 -0400231SkString GrSimpleMeshDrawOpHelper::dumpInfo() const {
Brian Salomon91326c32017-08-09 16:02:19 -0400232 const GrProcessorSet& processors = fProcessors ? *fProcessors : GrProcessorSet::EmptySet();
233 SkString result = processors.dumpProcessors();
Brian Salomonb4d61062017-07-12 11:24:41 -0400234 result.append("AA Type: ");
235 switch (this->aaType()) {
236 case GrAAType::kNone:
237 result.append(" none\n");
238 break;
239 case GrAAType::kCoverage:
240 result.append(" coverage\n");
241 break;
242 case GrAAType::kMSAA:
243 result.append(" msaa\n");
244 break;
Brian Salomonb4d61062017-07-12 11:24:41 -0400245 }
Chris Daltonbaa1b352019-04-03 12:03:00 -0600246 dump_pipeline_flags(fPipelineFlags, &result);
Brian Salomonb4d61062017-07-12 11:24:41 -0400247 return result;
248}
Brian Osman9a390ac2018-11-12 09:47:48 -0500249#endif