blob: fd2672f3cd34db3f6c6690215e383c156a7391c3 [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 Phillips865d8d62019-10-09 14:15:55 -040032 SkDEBUGCODE(this->validate();)
Robert Phillips901aff02019-10-08 12:32:56 -040033 }
34
35 int numSamples() const { return fNumSamples; }
36 GrSurfaceOrigin origin() const { return fOrigin; }
37 const GrPipeline& pipeline() const { return fPipeline; }
38 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
39 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
40 const GrPipeline::DynamicStateArrays* dynamicStateArrays() const { return fDynamicStateArrays; }
41
42 // TODO: can this be removed?
43 const GrTextureProxy* const* primProcProxies() const {
44 const GrTextureProxy* const* primProcProxies = nullptr;
45 if (fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures) {
46 primProcProxies = fDynamicStateArrays->fPrimitiveProcessorTextures;
47 } else if (fFixedDynamicState) {
48 primProcProxies = fFixedDynamicState->fPrimitiveProcessorTextures;
49 }
50
51 SkASSERT(SkToBool(primProcProxies) == SkToBool(fPrimProc.numTextureSamplers()));
52 return primProcProxies;
53 }
54
55 bool hasDynamicScissors() const {
56 return fPipeline.isScissorEnabled() &&
57 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
58 }
59
60 const SkIRect& dynamicScissor(int i) const {
61 SkASSERT(this->hasDynamicScissors());
62
63 return fDynamicStateArrays->fScissorRects[i];
64 }
65
66 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
67
68 const SkIRect& fixedScissor() const {
69 SkASSERT(this->hasFixedScissor());
70
71 return fFixedDynamicState->fScissorRect;
72 }
73
74 bool hasDynamicPrimProcTextures() const {
75 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
76 }
77
78 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
79 SkASSERT(this->hasDynamicPrimProcTextures());
80
81 return fDynamicStateArrays->fPrimitiveProcessorTextures +
82 i * fPrimProc.numTextureSamplers();
83 }
84
85 bool hasFixedPrimProcTextures() const {
86 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
87 }
88
89 const GrTextureProxy* const* fixedPrimProcTextures() const {
90 SkASSERT(this->hasFixedPrimProcTextures());
91
92 return fFixedDynamicState->fPrimitiveProcessorTextures;
93 }
94
95#ifdef SK_DEBUG
Robert Phillips865d8d62019-10-09 14:15:55 -040096 void validate() const;
97 void checkAllInstantiated(int meshCount) const;
98 void checkMSAAAndMIPSAreResolved(int meshCount) const;
99
Robert Phillips901aff02019-10-08 12:32:56 -0400100 bool isNVPR() const {
101 return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
102 !fPrimProc.numVertexAttributes() && !fPrimProc.numInstanceAttributes();
103 }
104
105 // TODO: calculate this once in the ctor and use more widely
106 GrProcessor::CustomFeatures requestedFeatures() const {
107 GrProcessor::CustomFeatures requestedFeatures = fPrimProc.requestedFeatures();
108 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
109 requestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
110 }
111 requestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
112 return requestedFeatures;
113 }
114#endif
115
116private:
117 const int fNumSamples;
118 const GrSurfaceOrigin fOrigin;
119 const GrPipeline& fPipeline;
120 const GrPrimitiveProcessor& fPrimProc;
121 const GrPipeline::FixedDynamicState* fFixedDynamicState;
122 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
123};
124
125#endif