blob: ccb89e14f397ee8fcd8896f2ffc246f9ae77785d [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,
23 const GrPipeline& pipeline,
24 const GrPrimitiveProcessor& primProc,
25 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)
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070029 : fNumRasterSamples(pipeline.isStencilEnabled() ? numStencilSamples : numSamples)
30 , 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 Phillips7de13332019-10-09 15:44:54 -040039 fRequestedFeatures = fPrimProc.requestedFeatures();
40 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
41 fRequestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
42 }
43 fRequestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040044
Robert Phillips865d8d62019-10-09 14:15:55 -040045 SkDEBUGCODE(this->validate();)
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; }
54 const GrPipeline& pipeline() const { return fPipeline; }
55 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
56 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 {
59 return fPipeline.isScissorEnabled() &&
60 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
61 }
62
63 const SkIRect& dynamicScissor(int i) const {
64 SkASSERT(this->hasDynamicScissors());
65
66 return fDynamicStateArrays->fScissorRects[i];
67 }
68
69 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
70
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 +
86 i * fPrimProc.numTextureSamplers();
87 }
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 Phillips901aff02019-10-08 12:32:56 -0400105#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:
Chris Dalton5e8cdfd2019-11-11 15:23:30 -0700118 const int fNumRasterSamples;
119 const bool fIsMixedSampled;
Robert Phillips901aff02019-10-08 12:32:56 -0400120 const GrSurfaceOrigin fOrigin;
121 const GrPipeline& fPipeline;
122 const GrPrimitiveProcessor& fPrimProc;
123 const GrPipeline::FixedDynamicState* fFixedDynamicState;
124 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400125 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400126 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500127 GrPrimitiveType fPrimitiveType;
Robert Phillips901aff02019-10-08 12:32:56 -0400128};
129
130#endif