blob: 72be94c23fe8e4d0baf3192bf44e47eddc2936f5 [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,
Robert Phillipscea290f2019-11-06 11:21:03 -050025 int numDynamicStateArrays,
26 GrPrimitiveType primitiveType)
Robert Phillips901aff02019-10-08 12:32:56 -040027 : fNumSamples(numSamples)
28 , fOrigin(origin)
29 , fPipeline(pipeline)
30 , fPrimProc(primProc)
31 , fFixedDynamicState(fixedDynamicState)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040032 , fDynamicStateArrays(dynamicStateArrays)
Robert Phillipscea290f2019-11-06 11:21:03 -050033 , fNumDynamicStateArrays(numDynamicStateArrays)
34 , fPrimitiveType(primitiveType) {
Robert Phillips7de13332019-10-09 15:44:54 -040035 fRequestedFeatures = fPrimProc.requestedFeatures();
36 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
37 fRequestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
38 }
39 fRequestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040040
Robert Phillips865d8d62019-10-09 14:15:55 -040041 SkDEBUGCODE(this->validate();)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040042 (void) fNumDynamicStateArrays; // touch this to quiet unused member warnings
Robert Phillips901aff02019-10-08 12:32:56 -040043 }
44
Robert Phillips7de13332019-10-09 15:44:54 -040045 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
46
Robert Phillips901aff02019-10-08 12:32:56 -040047 int numSamples() const { return fNumSamples; }
48 GrSurfaceOrigin origin() const { return fOrigin; }
49 const GrPipeline& pipeline() const { return fPipeline; }
50 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
51 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040052
Robert Phillips901aff02019-10-08 12:32:56 -040053 bool hasDynamicScissors() const {
54 return fPipeline.isScissorEnabled() &&
55 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
56 }
57
58 const SkIRect& dynamicScissor(int i) const {
59 SkASSERT(this->hasDynamicScissors());
60
61 return fDynamicStateArrays->fScissorRects[i];
62 }
63
64 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
65
66 const SkIRect& fixedScissor() const {
67 SkASSERT(this->hasFixedScissor());
68
69 return fFixedDynamicState->fScissorRect;
70 }
71
72 bool hasDynamicPrimProcTextures() const {
73 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
74 }
75
76 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
77 SkASSERT(this->hasDynamicPrimProcTextures());
Robert Phillips2d8a95e2019-10-10 12:50:22 -040078 SkASSERT(i < fNumDynamicStateArrays);
Robert Phillips901aff02019-10-08 12:32:56 -040079
80 return fDynamicStateArrays->fPrimitiveProcessorTextures +
81 i * fPrimProc.numTextureSamplers();
82 }
83
84 bool hasFixedPrimProcTextures() const {
85 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
86 }
87
88 const GrTextureProxy* const* fixedPrimProcTextures() const {
89 SkASSERT(this->hasFixedPrimProcTextures());
90
91 return fFixedDynamicState->fPrimitiveProcessorTextures;
92 }
93
Robert Phillipscea290f2019-11-06 11:21:03 -050094 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
95
Robert Phillips901aff02019-10-08 12:32:56 -040096#ifdef SK_DEBUG
Robert Phillips865d8d62019-10-09 14:15:55 -040097 void validate() const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040098 void checkAllInstantiated() const;
99 void checkMSAAAndMIPSAreResolved() const;
100 void compatibleWithMeshes(const GrMesh meshes[], int meshCount) const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400101
Robert Phillips901aff02019-10-08 12:32:56 -0400102 bool isNVPR() const {
103 return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
104 !fPrimProc.numVertexAttributes() && !fPrimProc.numInstanceAttributes();
105 }
Robert Phillips901aff02019-10-08 12:32:56 -0400106#endif
107
108private:
109 const int fNumSamples;
110 const GrSurfaceOrigin fOrigin;
111 const GrPipeline& fPipeline;
112 const GrPrimitiveProcessor& fPrimProc;
113 const GrPipeline::FixedDynamicState* fFixedDynamicState;
114 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400115 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400116 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500117 GrPrimitiveType fPrimitiveType;
Robert Phillips901aff02019-10-08 12:32:56 -0400118};
119
120#endif