blob: 4567bd24570738d6a7bc1c4bd5f4c608c72d6324 [file] [log] [blame]
Robert Phillips901aff02019-10-08 12:32:56 -04001/*
2 * Copyright 2019 Google LLC
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
8#ifndef GrProgramInfo_DEFINED
9#define GrProgramInfo_DEFINED
10
11#include "include/gpu/GrTypes.h"
12#include "src/gpu/GrPipeline.h"
13#include "src/gpu/GrPrimitiveProcessor.h"
14
Robert Phillips2d8a95e2019-10-10 12:50:22 -040015class GrMesh;
Robert Phillipsa87c5292019-11-12 10:12:42 -050016class GrStencilSettings;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040017
Robert Phillips901aff02019-10-08 12:32:56 -040018class GrProgramInfo {
19public:
20 GrProgramInfo(int numSamples,
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070021 int numStencilSamples,
Robert Phillips901aff02019-10-08 12:32:56 -040022 GrSurfaceOrigin origin,
Robert Phillips67a625e2019-11-15 15:37:07 -050023 const GrPipeline* pipeline,
24 const GrPrimitiveProcessor* primProc,
Robert Phillips901aff02019-10-08 12:32:56 -040025 const GrPipeline::FixedDynamicState* fixedDynamicState,
Robert Phillips2d8a95e2019-10-10 12:50:22 -040026 const GrPipeline::DynamicStateArrays* dynamicStateArrays,
Robert Phillipscea290f2019-11-06 11:21:03 -050027 int numDynamicStateArrays,
28 GrPrimitiveType primitiveType)
Robert Phillips67a625e2019-11-15 15:37:07 -050029 : fNumRasterSamples(pipeline->isStencilEnabled() ? numStencilSamples : numSamples)
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070030 , fIsMixedSampled(fNumRasterSamples > numSamples)
Robert Phillips901aff02019-10-08 12:32:56 -040031 , fOrigin(origin)
32 , fPipeline(pipeline)
33 , fPrimProc(primProc)
34 , fFixedDynamicState(fixedDynamicState)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040035 , fDynamicStateArrays(dynamicStateArrays)
Robert Phillipscea290f2019-11-06 11:21:03 -050036 , fNumDynamicStateArrays(numDynamicStateArrays)
37 , fPrimitiveType(primitiveType) {
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070038 SkASSERT(fNumRasterSamples > 0);
Robert Phillips67a625e2019-11-15 15:37:07 -050039 fRequestedFeatures = fPrimProc->requestedFeatures();
40 for (int i = 0; i < fPipeline->numFragmentProcessors(); ++i) {
41 fRequestedFeatures |= fPipeline->getFragmentProcessor(i).requestedFeatures();
Robert Phillips7de13332019-10-09 15:44:54 -040042 }
Robert Phillips67a625e2019-11-15 15:37:07 -050043 fRequestedFeatures |= fPipeline->getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040044
Robert Phillips8053c972019-11-21 10:44:53 -050045 SkDEBUGCODE(this->validate(false);)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040046 (void) fNumDynamicStateArrays; // touch this to quiet unused member warnings
Robert Phillips901aff02019-10-08 12:32:56 -040047 }
48
Robert Phillips7de13332019-10-09 15:44:54 -040049 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
50
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070051 int numRasterSamples() const { return fNumRasterSamples; }
52 bool isMixedSampled() const { return fIsMixedSampled; }
Robert Phillips901aff02019-10-08 12:32:56 -040053 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050054 const GrPipeline& pipeline() const { return *fPipeline; }
55 const GrPrimitiveProcessor& primProc() const { return *fPrimProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040056 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040057
Robert Phillips901aff02019-10-08 12:32:56 -040058 bool hasDynamicScissors() const {
Robert Phillips67a625e2019-11-15 15:37:07 -050059 return fPipeline->isScissorEnabled() &&
Robert Phillips901aff02019-10-08 12:32:56 -040060 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
61 }
62
63 const SkIRect& dynamicScissor(int i) const {
64 SkASSERT(this->hasDynamicScissors());
65
66 return fDynamicStateArrays->fScissorRects[i];
67 }
68
Robert Phillips67a625e2019-11-15 15:37:07 -050069 bool hasFixedScissor() const { return fPipeline->isScissorEnabled() && fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040070
71 const SkIRect& fixedScissor() const {
72 SkASSERT(this->hasFixedScissor());
73
74 return fFixedDynamicState->fScissorRect;
75 }
76
77 bool hasDynamicPrimProcTextures() const {
78 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
79 }
80
81 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
82 SkASSERT(this->hasDynamicPrimProcTextures());
Robert Phillips2d8a95e2019-10-10 12:50:22 -040083 SkASSERT(i < fNumDynamicStateArrays);
Robert Phillips901aff02019-10-08 12:32:56 -040084
85 return fDynamicStateArrays->fPrimitiveProcessorTextures +
Robert Phillips67a625e2019-11-15 15:37:07 -050086 i * fPrimProc->numTextureSamplers();
Robert Phillips901aff02019-10-08 12:32:56 -040087 }
88
89 bool hasFixedPrimProcTextures() const {
90 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
91 }
92
93 const GrTextureProxy* const* fixedPrimProcTextures() const {
94 SkASSERT(this->hasFixedPrimProcTextures());
95
96 return fFixedDynamicState->fPrimitiveProcessorTextures;
97 }
98
Robert Phillipscea290f2019-11-06 11:21:03 -050099 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
100
Robert Phillipsa87c5292019-11-12 10:12:42 -0500101 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
102 // create the stencil settings here.
103 GrStencilSettings nonGLStencilSettings() const;
104
Robert Phillips8053c972019-11-21 10:44:53 -0500105 void visitProxies(const GrOp::VisitProxyFunc& fn) const {
106 fPipeline->visitProxies(fn);
107 }
108
Robert Phillips901aff02019-10-08 12:32:56 -0400109#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -0500110 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400111 void checkAllInstantiated() const;
112 void checkMSAAAndMIPSAreResolved() const;
113 void compatibleWithMeshes(const GrMesh meshes[], int meshCount) const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400114
Robert Phillips901aff02019-10-08 12:32:56 -0400115 bool isNVPR() const {
Robert Phillips67a625e2019-11-15 15:37:07 -0500116 return fPrimProc->isPathRendering() && !fPrimProc->willUseGeoShader() &&
117 !fPrimProc->numVertexAttributes() && !fPrimProc->numInstanceAttributes();
Robert Phillips901aff02019-10-08 12:32:56 -0400118 }
Robert Phillips901aff02019-10-08 12:32:56 -0400119#endif
120
121private:
Chris Dalton5e8cdfd2019-11-11 15:23:30 -0700122 const int fNumRasterSamples;
123 const bool fIsMixedSampled;
Robert Phillips901aff02019-10-08 12:32:56 -0400124 const GrSurfaceOrigin fOrigin;
Robert Phillips67a625e2019-11-15 15:37:07 -0500125 const GrPipeline* fPipeline;
126 const GrPrimitiveProcessor* fPrimProc;
Robert Phillips901aff02019-10-08 12:32:56 -0400127 const GrPipeline::FixedDynamicState* fFixedDynamicState;
128 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400129 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400130 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500131 GrPrimitiveType fPrimitiveType;
Robert Phillips901aff02019-10-08 12:32:56 -0400132};
133
134#endif