xref: /aosp_15_r20/external/skia/src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelper.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelper.h"
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAppliedClip.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDstProxyView.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpFlushState.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorAnalysis.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrMeshDrawOp.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags;
22*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
23*c8dee2aaSAndroid Build Coastguard Worker 
GrSimpleMeshDrawOpHelper(GrProcessorSet * processorSet,GrAAType aaType,InputFlags inputFlags)24*c8dee2aaSAndroid Build Coastguard Worker GrSimpleMeshDrawOpHelper::GrSimpleMeshDrawOpHelper(GrProcessorSet* processorSet,
25*c8dee2aaSAndroid Build Coastguard Worker                                                    GrAAType aaType,
26*c8dee2aaSAndroid Build Coastguard Worker                                                    InputFlags inputFlags)
27*c8dee2aaSAndroid Build Coastguard Worker         : fProcessors(processorSet)
28*c8dee2aaSAndroid Build Coastguard Worker         , fPipelineFlags((GrPipeline::InputFlags)inputFlags)
29*c8dee2aaSAndroid Build Coastguard Worker         , fAAType((int)aaType)
30*c8dee2aaSAndroid Build Coastguard Worker         , fUsesLocalCoords(false)
31*c8dee2aaSAndroid Build Coastguard Worker         , fCompatibleWithCoverageAsAlpha(false) {
32*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(fDidAnalysis = false);
33*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(fMadePipeline = false);
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker 
~GrSimpleMeshDrawOpHelper()36*c8dee2aaSAndroid Build Coastguard Worker GrSimpleMeshDrawOpHelper::~GrSimpleMeshDrawOpHelper() {
37*c8dee2aaSAndroid Build Coastguard Worker     if (fProcessors) {
38*c8dee2aaSAndroid Build Coastguard Worker         fProcessors->~GrProcessorSet();
39*c8dee2aaSAndroid Build Coastguard Worker     }
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker 
fixedFunctionFlags() const42*c8dee2aaSAndroid Build Coastguard Worker GrDrawOp::FixedFunctionFlags GrSimpleMeshDrawOpHelper::fixedFunctionFlags() const {
43*c8dee2aaSAndroid Build Coastguard Worker     return GrAATypeIsHW(this->aaType()) ? GrDrawOp::FixedFunctionFlags::kUsesHWAA
44*c8dee2aaSAndroid Build Coastguard Worker                                         : GrDrawOp::FixedFunctionFlags::kNone;
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker 
isCompatible(const GrSimpleMeshDrawOpHelper & that,const GrCaps & caps,const SkRect & thisBounds,const SkRect & thatBounds,bool ignoreAAType) const47*c8dee2aaSAndroid Build Coastguard Worker bool GrSimpleMeshDrawOpHelper::isCompatible(const GrSimpleMeshDrawOpHelper& that,
48*c8dee2aaSAndroid Build Coastguard Worker                                             const GrCaps& caps, const SkRect& thisBounds,
49*c8dee2aaSAndroid Build Coastguard Worker                                             const SkRect& thatBounds, bool ignoreAAType) const {
50*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(fProcessors) != SkToBool(that.fProcessors)) {
51*c8dee2aaSAndroid Build Coastguard Worker         return false;
52*c8dee2aaSAndroid Build Coastguard Worker     }
53*c8dee2aaSAndroid Build Coastguard Worker     if (fProcessors) {
54*c8dee2aaSAndroid Build Coastguard Worker         if (*fProcessors != *that.fProcessors) {
55*c8dee2aaSAndroid Build Coastguard Worker             return false;
56*c8dee2aaSAndroid Build Coastguard Worker         }
57*c8dee2aaSAndroid Build Coastguard Worker     }
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
60*c8dee2aaSAndroid Build Coastguard Worker     if (ignoreAAType) {
61*c8dee2aaSAndroid Build Coastguard Worker         // If we're ignoring AA it should be bc we already know they are the same or that
62*c8dee2aaSAndroid Build Coastguard Worker         // the are different but are compatible (i.e., one is AA and the other is None)
63*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fAAType == that.fAAType ||
64*c8dee2aaSAndroid Build Coastguard Worker                  GrMeshDrawOp::CanUpgradeAAOnMerge(this->aaType(), that.aaType()));
65*c8dee2aaSAndroid Build Coastguard Worker     }
66*c8dee2aaSAndroid Build Coastguard Worker #endif
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     bool result = fPipelineFlags == that.fPipelineFlags &&
69*c8dee2aaSAndroid Build Coastguard Worker                   (ignoreAAType || fAAType == that.fAAType);
70*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!result || fCompatibleWithCoverageAsAlpha == that.fCompatibleWithCoverageAsAlpha);
71*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!result || fUsesLocalCoords == that.fUsesLocalCoords);
72*c8dee2aaSAndroid Build Coastguard Worker     return result;
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker 
finalizeProcessors(const GrCaps & caps,const GrAppliedClip * clip,GrClampType clampType,GrProcessorAnalysisCoverage geometryCoverage,SkPMColor4f * geometryColor,bool * wideColor)75*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis GrSimpleMeshDrawOpHelper::finalizeProcessors(
76*c8dee2aaSAndroid Build Coastguard Worker         const GrCaps& caps, const GrAppliedClip* clip, GrClampType clampType,
77*c8dee2aaSAndroid Build Coastguard Worker         GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor, bool* wideColor) {
78*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorAnalysisColor color = *geometryColor;
79*c8dee2aaSAndroid Build Coastguard Worker     auto result = this->finalizeProcessors(caps, clip, clampType, geometryCoverage, &color);
80*c8dee2aaSAndroid Build Coastguard Worker     color.isConstant(geometryColor);
81*c8dee2aaSAndroid Build Coastguard Worker     if (wideColor) {
82*c8dee2aaSAndroid Build Coastguard Worker         *wideColor = !geometryColor->fitsInBytes();
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker     return result;
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker 
finalizeProcessors(const GrCaps & caps,const GrAppliedClip * clip,const GrUserStencilSettings * userStencil,GrClampType clampType,GrProcessorAnalysisCoverage geometryCoverage,GrProcessorAnalysisColor * geometryColor)87*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis GrSimpleMeshDrawOpHelper::finalizeProcessors(
88*c8dee2aaSAndroid Build Coastguard Worker         const GrCaps& caps, const GrAppliedClip* clip, const GrUserStencilSettings* userStencil,
89*c8dee2aaSAndroid Build Coastguard Worker         GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage,
90*c8dee2aaSAndroid Build Coastguard Worker         GrProcessorAnalysisColor* geometryColor) {
91*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(fDidAnalysis = true);
92*c8dee2aaSAndroid Build Coastguard Worker     GrProcessorSet::Analysis analysis;
93*c8dee2aaSAndroid Build Coastguard Worker     if (fProcessors) {
94*c8dee2aaSAndroid Build Coastguard Worker         GrProcessorAnalysisCoverage coverage = geometryCoverage;
95*c8dee2aaSAndroid Build Coastguard Worker         if (GrProcessorAnalysisCoverage::kNone == coverage) {
96*c8dee2aaSAndroid Build Coastguard Worker             coverage = (clip && clip->hasCoverageFragmentProcessor())
97*c8dee2aaSAndroid Build Coastguard Worker                                ? GrProcessorAnalysisCoverage::kSingleChannel
98*c8dee2aaSAndroid Build Coastguard Worker                                : GrProcessorAnalysisCoverage::kNone;
99*c8dee2aaSAndroid Build Coastguard Worker         }
100*c8dee2aaSAndroid Build Coastguard Worker         SkPMColor4f overrideColor;
101*c8dee2aaSAndroid Build Coastguard Worker         analysis = fProcessors->finalize(*geometryColor, coverage, clip, userStencil, caps,
102*c8dee2aaSAndroid Build Coastguard Worker                                          clampType, &overrideColor);
103*c8dee2aaSAndroid Build Coastguard Worker         if (analysis.inputColorIsOverridden()) {
104*c8dee2aaSAndroid Build Coastguard Worker             *geometryColor = overrideColor;
105*c8dee2aaSAndroid Build Coastguard Worker         }
106*c8dee2aaSAndroid Build Coastguard Worker     } else {
107*c8dee2aaSAndroid Build Coastguard Worker         analysis = GrProcessorSet::EmptySetAnalysis();
108*c8dee2aaSAndroid Build Coastguard Worker     }
109*c8dee2aaSAndroid Build Coastguard Worker     fUsesLocalCoords = analysis.usesLocalCoords();
110*c8dee2aaSAndroid Build Coastguard Worker     fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
111*c8dee2aaSAndroid Build Coastguard Worker     return analysis;
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker 
CreatePipeline(const GrCaps * caps,SkArenaAlloc * arena,skgpu::Swizzle writeViewSwizzle,GrAppliedClip && appliedClip,const GrDstProxyView & dstProxyView,GrProcessorSet && processorSet,GrPipeline::InputFlags pipelineFlags)114*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline* GrSimpleMeshDrawOpHelper::CreatePipeline(const GrCaps* caps,
115*c8dee2aaSAndroid Build Coastguard Worker                                                            SkArenaAlloc* arena,
116*c8dee2aaSAndroid Build Coastguard Worker                                                            skgpu::Swizzle writeViewSwizzle,
117*c8dee2aaSAndroid Build Coastguard Worker                                                            GrAppliedClip&& appliedClip,
118*c8dee2aaSAndroid Build Coastguard Worker                                                            const GrDstProxyView& dstProxyView,
119*c8dee2aaSAndroid Build Coastguard Worker                                                            GrProcessorSet&& processorSet,
120*c8dee2aaSAndroid Build Coastguard Worker                                                            GrPipeline::InputFlags pipelineFlags) {
121*c8dee2aaSAndroid Build Coastguard Worker     GrPipeline::InitArgs pipelineArgs;
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     pipelineArgs.fInputFlags = pipelineFlags;
124*c8dee2aaSAndroid Build Coastguard Worker     pipelineArgs.fCaps = caps;
125*c8dee2aaSAndroid Build Coastguard Worker     pipelineArgs.fDstProxyView = dstProxyView;
126*c8dee2aaSAndroid Build Coastguard Worker     pipelineArgs.fWriteSwizzle = writeViewSwizzle;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     return arena->make<GrPipeline>(pipelineArgs,
129*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(processorSet),
130*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(appliedClip));
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker 
CreatePipeline(GrOpFlushState * flushState,GrProcessorSet && processorSet,GrPipeline::InputFlags pipelineFlags)133*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline* GrSimpleMeshDrawOpHelper::CreatePipeline(GrOpFlushState* flushState,
134*c8dee2aaSAndroid Build Coastguard Worker                                                            GrProcessorSet&& processorSet,
135*c8dee2aaSAndroid Build Coastguard Worker                                                            GrPipeline::InputFlags pipelineFlags) {
136*c8dee2aaSAndroid Build Coastguard Worker     return CreatePipeline(&flushState->caps(),
137*c8dee2aaSAndroid Build Coastguard Worker                           flushState->allocator(),
138*c8dee2aaSAndroid Build Coastguard Worker                           flushState->writeView().swizzle(),
139*c8dee2aaSAndroid Build Coastguard Worker                           flushState->detachAppliedClip(),
140*c8dee2aaSAndroid Build Coastguard Worker                           flushState->dstProxyView(),
141*c8dee2aaSAndroid Build Coastguard Worker                           std::move(processorSet),
142*c8dee2aaSAndroid Build Coastguard Worker                           pipelineFlags);
143*c8dee2aaSAndroid Build Coastguard Worker }
144*c8dee2aaSAndroid Build Coastguard Worker 
createPipeline(GrOpFlushState * flushState)145*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline* GrSimpleMeshDrawOpHelper::createPipeline(GrOpFlushState* flushState) {
146*c8dee2aaSAndroid Build Coastguard Worker     return CreatePipeline(&flushState->caps(),
147*c8dee2aaSAndroid Build Coastguard Worker                           flushState->allocator(),
148*c8dee2aaSAndroid Build Coastguard Worker                           flushState->writeView().swizzle(),
149*c8dee2aaSAndroid Build Coastguard Worker                           flushState->detachAppliedClip(),
150*c8dee2aaSAndroid Build Coastguard Worker                           flushState->dstProxyView(),
151*c8dee2aaSAndroid Build Coastguard Worker                           this->detachProcessorSet(),
152*c8dee2aaSAndroid Build Coastguard Worker                           this->pipelineFlags());
153*c8dee2aaSAndroid Build Coastguard Worker }
154*c8dee2aaSAndroid Build Coastguard Worker 
createPipeline(const GrCaps * caps,SkArenaAlloc * arena,skgpu::Swizzle writeViewSwizzle,GrAppliedClip && appliedClip,const GrDstProxyView & dstProxyView)155*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline* GrSimpleMeshDrawOpHelper::createPipeline(const GrCaps* caps,
156*c8dee2aaSAndroid Build Coastguard Worker                                                            SkArenaAlloc* arena,
157*c8dee2aaSAndroid Build Coastguard Worker                                                            skgpu::Swizzle writeViewSwizzle,
158*c8dee2aaSAndroid Build Coastguard Worker                                                            GrAppliedClip&& appliedClip,
159*c8dee2aaSAndroid Build Coastguard Worker                                                            const GrDstProxyView& dstProxyView) {
160*c8dee2aaSAndroid Build Coastguard Worker     return GrSimpleMeshDrawOpHelper::CreatePipeline(caps,
161*c8dee2aaSAndroid Build Coastguard Worker                                                     arena,
162*c8dee2aaSAndroid Build Coastguard Worker                                                     writeViewSwizzle,
163*c8dee2aaSAndroid Build Coastguard Worker                                                     std::move(appliedClip),
164*c8dee2aaSAndroid Build Coastguard Worker                                                     dstProxyView,
165*c8dee2aaSAndroid Build Coastguard Worker                                                     this->detachProcessorSet(),
166*c8dee2aaSAndroid Build Coastguard Worker                                                     this->pipelineFlags());
167*c8dee2aaSAndroid Build Coastguard Worker }
168*c8dee2aaSAndroid Build Coastguard Worker 
CreateProgramInfo(const GrCaps * caps,SkArenaAlloc * arena,const GrSurfaceProxyView & writeView,bool usesMSAASurface,GrAppliedClip && appliedClip,const GrDstProxyView & dstProxyView,GrGeometryProcessor * geometryProcessor,GrProcessorSet && processorSet,GrPrimitiveType primitiveType,GrXferBarrierFlags renderPassXferBarriers,GrLoadOp colorLoadOp,GrPipeline::InputFlags pipelineFlags,const GrUserStencilSettings * stencilSettings)169*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo* GrSimpleMeshDrawOpHelper::CreateProgramInfo(
170*c8dee2aaSAndroid Build Coastguard Worker             const GrCaps* caps,
171*c8dee2aaSAndroid Build Coastguard Worker             SkArenaAlloc* arena,
172*c8dee2aaSAndroid Build Coastguard Worker             const GrSurfaceProxyView& writeView,
173*c8dee2aaSAndroid Build Coastguard Worker             bool usesMSAASurface,
174*c8dee2aaSAndroid Build Coastguard Worker             GrAppliedClip&& appliedClip,
175*c8dee2aaSAndroid Build Coastguard Worker             const GrDstProxyView& dstProxyView,
176*c8dee2aaSAndroid Build Coastguard Worker             GrGeometryProcessor* geometryProcessor,
177*c8dee2aaSAndroid Build Coastguard Worker             GrProcessorSet&& processorSet,
178*c8dee2aaSAndroid Build Coastguard Worker             GrPrimitiveType primitiveType,
179*c8dee2aaSAndroid Build Coastguard Worker             GrXferBarrierFlags renderPassXferBarriers,
180*c8dee2aaSAndroid Build Coastguard Worker             GrLoadOp colorLoadOp,
181*c8dee2aaSAndroid Build Coastguard Worker             GrPipeline::InputFlags pipelineFlags,
182*c8dee2aaSAndroid Build Coastguard Worker             const GrUserStencilSettings* stencilSettings) {
183*c8dee2aaSAndroid Build Coastguard Worker     auto pipeline = CreatePipeline(caps,
184*c8dee2aaSAndroid Build Coastguard Worker                                    arena,
185*c8dee2aaSAndroid Build Coastguard Worker                                    writeView.swizzle(),
186*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(appliedClip),
187*c8dee2aaSAndroid Build Coastguard Worker                                    dstProxyView,
188*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(processorSet),
189*c8dee2aaSAndroid Build Coastguard Worker                                    pipelineFlags);
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker     return CreateProgramInfo(caps, arena, pipeline, writeView, usesMSAASurface, geometryProcessor,
192*c8dee2aaSAndroid Build Coastguard Worker                              primitiveType, renderPassXferBarriers, colorLoadOp, stencilSettings);
193*c8dee2aaSAndroid Build Coastguard Worker }
194*c8dee2aaSAndroid Build Coastguard Worker 
CreateProgramInfo(const GrCaps * caps,SkArenaAlloc * arena,const GrPipeline * pipeline,const GrSurfaceProxyView & writeView,bool usesMSAASurface,GrGeometryProcessor * geometryProcessor,GrPrimitiveType primitiveType,GrXferBarrierFlags xferBarrierFlags,GrLoadOp colorLoadOp,const GrUserStencilSettings * stencilSettings)195*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo* GrSimpleMeshDrawOpHelper::CreateProgramInfo(const GrCaps* caps,
196*c8dee2aaSAndroid Build Coastguard Worker                                                            SkArenaAlloc* arena,
197*c8dee2aaSAndroid Build Coastguard Worker                                                            const GrPipeline* pipeline,
198*c8dee2aaSAndroid Build Coastguard Worker                                                            const GrSurfaceProxyView& writeView,
199*c8dee2aaSAndroid Build Coastguard Worker                                                            bool usesMSAASurface,
200*c8dee2aaSAndroid Build Coastguard Worker                                                            GrGeometryProcessor* geometryProcessor,
201*c8dee2aaSAndroid Build Coastguard Worker                                                            GrPrimitiveType primitiveType,
202*c8dee2aaSAndroid Build Coastguard Worker                                                            GrXferBarrierFlags xferBarrierFlags,
203*c8dee2aaSAndroid Build Coastguard Worker                                                            GrLoadOp colorLoadOp,
204*c8dee2aaSAndroid Build Coastguard Worker                                                            const GrUserStencilSettings* stencilSettings) {
205*c8dee2aaSAndroid Build Coastguard Worker     auto tmp = arena->make<GrProgramInfo>(*caps,
206*c8dee2aaSAndroid Build Coastguard Worker                                           writeView,
207*c8dee2aaSAndroid Build Coastguard Worker                                           usesMSAASurface,
208*c8dee2aaSAndroid Build Coastguard Worker                                           pipeline,
209*c8dee2aaSAndroid Build Coastguard Worker                                           stencilSettings,
210*c8dee2aaSAndroid Build Coastguard Worker                                           geometryProcessor,
211*c8dee2aaSAndroid Build Coastguard Worker                                           primitiveType,
212*c8dee2aaSAndroid Build Coastguard Worker                                           xferBarrierFlags,
213*c8dee2aaSAndroid Build Coastguard Worker                                           colorLoadOp);
214*c8dee2aaSAndroid Build Coastguard Worker     return tmp;
215*c8dee2aaSAndroid Build Coastguard Worker }
216*c8dee2aaSAndroid Build Coastguard Worker 
createProgramInfo(const GrCaps * caps,SkArenaAlloc * arena,const GrSurfaceProxyView & writeView,bool usesMSAASurface,GrAppliedClip && appliedClip,const GrDstProxyView & dstProxyView,GrGeometryProcessor * gp,GrPrimitiveType primType,GrXferBarrierFlags renderPassXferBarriers,GrLoadOp colorLoadOp)217*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo* GrSimpleMeshDrawOpHelper::createProgramInfo(
218*c8dee2aaSAndroid Build Coastguard Worker                                             const GrCaps* caps,
219*c8dee2aaSAndroid Build Coastguard Worker                                             SkArenaAlloc* arena,
220*c8dee2aaSAndroid Build Coastguard Worker                                             const GrSurfaceProxyView& writeView,
221*c8dee2aaSAndroid Build Coastguard Worker                                             bool usesMSAASurface,
222*c8dee2aaSAndroid Build Coastguard Worker                                             GrAppliedClip&& appliedClip,
223*c8dee2aaSAndroid Build Coastguard Worker                                             const GrDstProxyView& dstProxyView,
224*c8dee2aaSAndroid Build Coastguard Worker                                             GrGeometryProcessor* gp,
225*c8dee2aaSAndroid Build Coastguard Worker                                             GrPrimitiveType primType,
226*c8dee2aaSAndroid Build Coastguard Worker                                             GrXferBarrierFlags renderPassXferBarriers,
227*c8dee2aaSAndroid Build Coastguard Worker                                             GrLoadOp colorLoadOp) {
228*c8dee2aaSAndroid Build Coastguard Worker     return CreateProgramInfo(caps,
229*c8dee2aaSAndroid Build Coastguard Worker                              arena,
230*c8dee2aaSAndroid Build Coastguard Worker                              writeView,
231*c8dee2aaSAndroid Build Coastguard Worker                              usesMSAASurface,
232*c8dee2aaSAndroid Build Coastguard Worker                              std::move(appliedClip),
233*c8dee2aaSAndroid Build Coastguard Worker                              dstProxyView,
234*c8dee2aaSAndroid Build Coastguard Worker                              gp,
235*c8dee2aaSAndroid Build Coastguard Worker                              this->detachProcessorSet(),
236*c8dee2aaSAndroid Build Coastguard Worker                              primType,
237*c8dee2aaSAndroid Build Coastguard Worker                              renderPassXferBarriers,
238*c8dee2aaSAndroid Build Coastguard Worker                              colorLoadOp,
239*c8dee2aaSAndroid Build Coastguard Worker                              this->pipelineFlags());
240*c8dee2aaSAndroid Build Coastguard Worker }
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
dump_pipeline_flags(GrPipeline::InputFlags flags,SkString * result)243*c8dee2aaSAndroid Build Coastguard Worker static void dump_pipeline_flags(GrPipeline::InputFlags flags, SkString* result) {
244*c8dee2aaSAndroid Build Coastguard Worker     if (GrPipeline::InputFlags::kNone != flags) {
245*c8dee2aaSAndroid Build Coastguard Worker         if (flags & GrPipeline::InputFlags::kSnapVerticesToPixelCenters) {
246*c8dee2aaSAndroid Build Coastguard Worker             result->append("Snap vertices to pixel center.\n");
247*c8dee2aaSAndroid Build Coastguard Worker         }
248*c8dee2aaSAndroid Build Coastguard Worker         if (flags & GrPipeline::InputFlags::kWireframe) {
249*c8dee2aaSAndroid Build Coastguard Worker             result->append("Wireframe enabled.\n");
250*c8dee2aaSAndroid Build Coastguard Worker         }
251*c8dee2aaSAndroid Build Coastguard Worker         if (flags & GrPipeline::InputFlags::kConservativeRaster) {
252*c8dee2aaSAndroid Build Coastguard Worker             result->append("Conservative raster enabled.\n");
253*c8dee2aaSAndroid Build Coastguard Worker         }
254*c8dee2aaSAndroid Build Coastguard Worker         return;
255*c8dee2aaSAndroid Build Coastguard Worker     }
256*c8dee2aaSAndroid Build Coastguard Worker     result->append("No pipeline flags\n");
257*c8dee2aaSAndroid Build Coastguard Worker }
258*c8dee2aaSAndroid Build Coastguard Worker 
dumpInfo() const259*c8dee2aaSAndroid Build Coastguard Worker SkString GrSimpleMeshDrawOpHelper::dumpInfo() const {
260*c8dee2aaSAndroid Build Coastguard Worker     const GrProcessorSet& processors = fProcessors ? *fProcessors : GrProcessorSet::EmptySet();
261*c8dee2aaSAndroid Build Coastguard Worker     SkString result = processors.dumpProcessors();
262*c8dee2aaSAndroid Build Coastguard Worker     result.append("AA Type: ");
263*c8dee2aaSAndroid Build Coastguard Worker     switch (this->aaType()) {
264*c8dee2aaSAndroid Build Coastguard Worker         case GrAAType::kNone:
265*c8dee2aaSAndroid Build Coastguard Worker             result.append(" none\n");
266*c8dee2aaSAndroid Build Coastguard Worker             break;
267*c8dee2aaSAndroid Build Coastguard Worker         case GrAAType::kCoverage:
268*c8dee2aaSAndroid Build Coastguard Worker             result.append(" coverage\n");
269*c8dee2aaSAndroid Build Coastguard Worker             break;
270*c8dee2aaSAndroid Build Coastguard Worker         case GrAAType::kMSAA:
271*c8dee2aaSAndroid Build Coastguard Worker             result.append(" msaa\n");
272*c8dee2aaSAndroid Build Coastguard Worker             break;
273*c8dee2aaSAndroid Build Coastguard Worker     }
274*c8dee2aaSAndroid Build Coastguard Worker     dump_pipeline_flags(fPipelineFlags, &result);
275*c8dee2aaSAndroid Build Coastguard Worker     return result;
276*c8dee2aaSAndroid Build Coastguard Worker }
277*c8dee2aaSAndroid Build Coastguard Worker #endif
278