blob: 63f5e1ae11e76524cb961fa1d939576369b4325a [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
15class GrProgramInfo {
16public:
Robert Phillips865d8d62019-10-09 14:15:55 -040017 // TODO: it seems like this object should also get the number of copies in
18 // dynamicStateArrays. If that were true a portion of checkAllInstantiated could be moved
19 // to validate.
Robert Phillips901aff02019-10-08 12:32:56 -040020 GrProgramInfo(int numSamples,
21 GrSurfaceOrigin origin,
22 const GrPipeline& pipeline,
23 const GrPrimitiveProcessor& primProc,
24 const GrPipeline::FixedDynamicState* fixedDynamicState,
25 const GrPipeline::DynamicStateArrays* dynamicStateArrays)
26 : fNumSamples(numSamples)
27 , fOrigin(origin)
28 , fPipeline(pipeline)
29 , fPrimProc(primProc)
30 , fFixedDynamicState(fixedDynamicState)
31 , fDynamicStateArrays(dynamicStateArrays) {
Robert Phillips7de13332019-10-09 15:44:54 -040032 fRequestedFeatures = fPrimProc.requestedFeatures();
33 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
34 fRequestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
35 }
36 fRequestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
Robert Phillips865d8d62019-10-09 14:15:55 -040037 SkDEBUGCODE(this->validate();)
Robert Phillips901aff02019-10-08 12:32:56 -040038 }
39
Robert Phillips7de13332019-10-09 15:44:54 -040040 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
41
Robert Phillips901aff02019-10-08 12:32:56 -040042 int numSamples() const { return fNumSamples; }
43 GrSurfaceOrigin origin() const { return fOrigin; }
44 const GrPipeline& pipeline() const { return fPipeline; }
45 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
46 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
47 const GrPipeline::DynamicStateArrays* dynamicStateArrays() const { return fDynamicStateArrays; }
48
49 // TODO: can this be removed?
50 const GrTextureProxy* const* primProcProxies() const {
51 const GrTextureProxy* const* primProcProxies = nullptr;
52 if (fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures) {
53 primProcProxies = fDynamicStateArrays->fPrimitiveProcessorTextures;
54 } else if (fFixedDynamicState) {
55 primProcProxies = fFixedDynamicState->fPrimitiveProcessorTextures;
56 }
57
58 SkASSERT(SkToBool(primProcProxies) == SkToBool(fPrimProc.numTextureSamplers()));
59 return primProcProxies;
60 }
61
62 bool hasDynamicScissors() const {
63 return fPipeline.isScissorEnabled() &&
64 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
65 }
66
67 const SkIRect& dynamicScissor(int i) const {
68 SkASSERT(this->hasDynamicScissors());
69
70 return fDynamicStateArrays->fScissorRects[i];
71 }
72
73 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
74
75 const SkIRect& fixedScissor() const {
76 SkASSERT(this->hasFixedScissor());
77
78 return fFixedDynamicState->fScissorRect;
79 }
80
81 bool hasDynamicPrimProcTextures() const {
82 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
83 }
84
85 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
86 SkASSERT(this->hasDynamicPrimProcTextures());
87
88 return fDynamicStateArrays->fPrimitiveProcessorTextures +
89 i * fPrimProc.numTextureSamplers();
90 }
91
92 bool hasFixedPrimProcTextures() const {
93 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
94 }
95
96 const GrTextureProxy* const* fixedPrimProcTextures() const {
97 SkASSERT(this->hasFixedPrimProcTextures());
98
99 return fFixedDynamicState->fPrimitiveProcessorTextures;
100 }
101
102#ifdef SK_DEBUG
Robert Phillips865d8d62019-10-09 14:15:55 -0400103 void validate() const;
104 void checkAllInstantiated(int meshCount) const;
105 void checkMSAAAndMIPSAreResolved(int meshCount) const;
106
Robert Phillips901aff02019-10-08 12:32:56 -0400107 bool isNVPR() const {
108 return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
109 !fPrimProc.numVertexAttributes() && !fPrimProc.numInstanceAttributes();
110 }
Robert Phillips901aff02019-10-08 12:32:56 -0400111#endif
112
113private:
114 const int fNumSamples;
115 const GrSurfaceOrigin fOrigin;
116 const GrPipeline& fPipeline;
117 const GrPrimitiveProcessor& fPrimProc;
118 const GrPipeline::FixedDynamicState* fFixedDynamicState;
119 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400120 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillips901aff02019-10-08 12:32:56 -0400121};
122
123#endif