blob: 671147a9654eabe6e1e5ccd44b0f628917733aa3 [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;
16
Robert Phillips901aff02019-10-08 12:32:56 -040017class GrProgramInfo {
18public:
19 GrProgramInfo(int numSamples,
20 GrSurfaceOrigin origin,
21 const GrPipeline& pipeline,
22 const GrPrimitiveProcessor& primProc,
23 const GrPipeline::FixedDynamicState* fixedDynamicState,
Robert Phillips2d8a95e2019-10-10 12:50:22 -040024 const GrPipeline::DynamicStateArrays* dynamicStateArrays,
25 int numDynamicStateArrays)
Robert Phillips901aff02019-10-08 12:32:56 -040026 : fNumSamples(numSamples)
27 , fOrigin(origin)
28 , fPipeline(pipeline)
29 , fPrimProc(primProc)
30 , fFixedDynamicState(fixedDynamicState)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040031 , fDynamicStateArrays(dynamicStateArrays)
32 , fNumDynamicStateArrays(numDynamicStateArrays) {
Robert Phillips7de13332019-10-09 15:44:54 -040033 fRequestedFeatures = fPrimProc.requestedFeatures();
34 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
35 fRequestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
36 }
37 fRequestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040038
Robert Phillips865d8d62019-10-09 14:15:55 -040039 SkDEBUGCODE(this->validate();)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040040 (void) fNumDynamicStateArrays; // touch this to quiet unused member warnings
Robert Phillips901aff02019-10-08 12:32:56 -040041 }
42
Robert Phillips7de13332019-10-09 15:44:54 -040043 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
44
Robert Phillips901aff02019-10-08 12:32:56 -040045 int numSamples() const { return fNumSamples; }
46 GrSurfaceOrigin origin() const { return fOrigin; }
47 const GrPipeline& pipeline() const { return fPipeline; }
48 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
49 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040050
51 // TODO: can this be removed?
52 const GrTextureProxy* const* primProcProxies() const {
53 const GrTextureProxy* const* primProcProxies = nullptr;
54 if (fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures) {
55 primProcProxies = fDynamicStateArrays->fPrimitiveProcessorTextures;
56 } else if (fFixedDynamicState) {
57 primProcProxies = fFixedDynamicState->fPrimitiveProcessorTextures;
58 }
59
60 SkASSERT(SkToBool(primProcProxies) == SkToBool(fPrimProc.numTextureSamplers()));
61 return primProcProxies;
62 }
63
64 bool hasDynamicScissors() const {
65 return fPipeline.isScissorEnabled() &&
66 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
67 }
68
69 const SkIRect& dynamicScissor(int i) const {
70 SkASSERT(this->hasDynamicScissors());
71
72 return fDynamicStateArrays->fScissorRects[i];
73 }
74
75 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
76
77 const SkIRect& fixedScissor() const {
78 SkASSERT(this->hasFixedScissor());
79
80 return fFixedDynamicState->fScissorRect;
81 }
82
83 bool hasDynamicPrimProcTextures() const {
84 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
85 }
86
87 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
88 SkASSERT(this->hasDynamicPrimProcTextures());
Robert Phillips2d8a95e2019-10-10 12:50:22 -040089 SkASSERT(i < fNumDynamicStateArrays);
Robert Phillips901aff02019-10-08 12:32:56 -040090
91 return fDynamicStateArrays->fPrimitiveProcessorTextures +
92 i * fPrimProc.numTextureSamplers();
93 }
94
95 bool hasFixedPrimProcTextures() const {
96 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
97 }
98
99 const GrTextureProxy* const* fixedPrimProcTextures() const {
100 SkASSERT(this->hasFixedPrimProcTextures());
101
102 return fFixedDynamicState->fPrimitiveProcessorTextures;
103 }
104
105#ifdef SK_DEBUG
Robert Phillips865d8d62019-10-09 14:15:55 -0400106 void validate() const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400107 void checkAllInstantiated() const;
108 void checkMSAAAndMIPSAreResolved() const;
109 void compatibleWithMeshes(const GrMesh meshes[], int meshCount) const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400110
Robert Phillips901aff02019-10-08 12:32:56 -0400111 bool isNVPR() const {
112 return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
113 !fPrimProc.numVertexAttributes() && !fPrimProc.numInstanceAttributes();
114 }
Robert Phillips901aff02019-10-08 12:32:56 -0400115#endif
116
117private:
118 const int fNumSamples;
119 const GrSurfaceOrigin fOrigin;
120 const GrPipeline& fPipeline;
121 const GrPrimitiveProcessor& fPrimProc;
122 const GrPipeline::FixedDynamicState* fFixedDynamicState;
123 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400124 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400125 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillips901aff02019-10-08 12:32:56 -0400126};
127
128#endif