blob: 2cad573ed0ed718502174ddfa248b4d4d80710c8 [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 Phillips933484f2019-11-26 09:38:55 -050022 const GrBackendFormat& backendFormat,
Robert Phillips901aff02019-10-08 12:32:56 -040023 GrSurfaceOrigin origin,
Robert Phillips67a625e2019-11-15 15:37:07 -050024 const GrPipeline* pipeline,
25 const GrPrimitiveProcessor* primProc,
Robert Phillips901aff02019-10-08 12:32:56 -040026 const GrPipeline::FixedDynamicState* fixedDynamicState,
Robert Phillips2d8a95e2019-10-10 12:50:22 -040027 const GrPipeline::DynamicStateArrays* dynamicStateArrays,
Robert Phillipscea290f2019-11-06 11:21:03 -050028 int numDynamicStateArrays,
29 GrPrimitiveType primitiveType)
Robert Phillips67a625e2019-11-15 15:37:07 -050030 : fNumRasterSamples(pipeline->isStencilEnabled() ? numStencilSamples : numSamples)
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070031 , fIsMixedSampled(fNumRasterSamples > numSamples)
Robert Phillips933484f2019-11-26 09:38:55 -050032 , fBackendFormat(backendFormat)
Robert Phillips901aff02019-10-08 12:32:56 -040033 , fOrigin(origin)
34 , fPipeline(pipeline)
35 , fPrimProc(primProc)
36 , fFixedDynamicState(fixedDynamicState)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040037 , fDynamicStateArrays(dynamicStateArrays)
Robert Phillipscea290f2019-11-06 11:21:03 -050038 , fNumDynamicStateArrays(numDynamicStateArrays)
39 , fPrimitiveType(primitiveType) {
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070040 SkASSERT(fNumRasterSamples > 0);
Robert Phillips67a625e2019-11-15 15:37:07 -050041 fRequestedFeatures = fPrimProc->requestedFeatures();
42 for (int i = 0; i < fPipeline->numFragmentProcessors(); ++i) {
43 fRequestedFeatures |= fPipeline->getFragmentProcessor(i).requestedFeatures();
Robert Phillips7de13332019-10-09 15:44:54 -040044 }
Robert Phillips67a625e2019-11-15 15:37:07 -050045 fRequestedFeatures |= fPipeline->getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040046
Robert Phillips8053c972019-11-21 10:44:53 -050047 SkDEBUGCODE(this->validate(false);)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040048 (void) fNumDynamicStateArrays; // touch this to quiet unused member warnings
Robert Phillips901aff02019-10-08 12:32:56 -040049 }
50
Robert Phillips7de13332019-10-09 15:44:54 -040051 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
52
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070053 int numRasterSamples() const { return fNumRasterSamples; }
54 bool isMixedSampled() const { return fIsMixedSampled; }
Robert Phillips933484f2019-11-26 09:38:55 -050055 // The backend format of the destination render target [proxy]
56 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Robert Phillips901aff02019-10-08 12:32:56 -040057 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050058 const GrPipeline& pipeline() const { return *fPipeline; }
59 const GrPrimitiveProcessor& primProc() const { return *fPrimProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040060 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040061
Robert Phillips901aff02019-10-08 12:32:56 -040062 bool hasDynamicScissors() const {
Robert Phillips67a625e2019-11-15 15:37:07 -050063 return fPipeline->isScissorEnabled() &&
Robert Phillips901aff02019-10-08 12:32:56 -040064 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
65 }
66
67 const SkIRect& dynamicScissor(int i) const {
68 SkASSERT(this->hasDynamicScissors());
69
70 return fDynamicStateArrays->fScissorRects[i];
71 }
72
Robert Phillips67a625e2019-11-15 15:37:07 -050073 bool hasFixedScissor() const { return fPipeline->isScissorEnabled() && fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040074
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
Michael Ludwigfcdd0612019-11-25 08:34:31 -050085 const GrSurfaceProxy* const* dynamicPrimProcTextures(int i) const {
Robert Phillips901aff02019-10-08 12:32:56 -040086 SkASSERT(this->hasDynamicPrimProcTextures());
Robert Phillips2d8a95e2019-10-10 12:50:22 -040087 SkASSERT(i < fNumDynamicStateArrays);
Robert Phillips901aff02019-10-08 12:32:56 -040088
89 return fDynamicStateArrays->fPrimitiveProcessorTextures +
Robert Phillips67a625e2019-11-15 15:37:07 -050090 i * fPrimProc->numTextureSamplers();
Robert Phillips901aff02019-10-08 12:32:56 -040091 }
92
93 bool hasFixedPrimProcTextures() const {
94 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
95 }
96
Michael Ludwigfcdd0612019-11-25 08:34:31 -050097 const GrSurfaceProxy* const* fixedPrimProcTextures() const {
Robert Phillips901aff02019-10-08 12:32:56 -040098 SkASSERT(this->hasFixedPrimProcTextures());
99
100 return fFixedDynamicState->fPrimitiveProcessorTextures;
101 }
102
Robert Phillipscea290f2019-11-06 11:21:03 -0500103 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
104
Robert Phillipsa87c5292019-11-12 10:12:42 -0500105 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
106 // create the stencil settings here.
107 GrStencilSettings nonGLStencilSettings() const;
108
Robert Phillips8053c972019-11-21 10:44:53 -0500109 void visitProxies(const GrOp::VisitProxyFunc& fn) const {
110 fPipeline->visitProxies(fn);
111 }
112
Robert Phillips901aff02019-10-08 12:32:56 -0400113#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -0500114 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400115 void checkAllInstantiated() const;
116 void checkMSAAAndMIPSAreResolved() const;
117 void compatibleWithMeshes(const GrMesh meshes[], int meshCount) const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400118
Robert Phillips901aff02019-10-08 12:32:56 -0400119 bool isNVPR() const {
Robert Phillips67a625e2019-11-15 15:37:07 -0500120 return fPrimProc->isPathRendering() && !fPrimProc->willUseGeoShader() &&
121 !fPrimProc->numVertexAttributes() && !fPrimProc->numInstanceAttributes();
Robert Phillips901aff02019-10-08 12:32:56 -0400122 }
Robert Phillips901aff02019-10-08 12:32:56 -0400123#endif
124
125private:
Chris Dalton5e8cdfd2019-11-11 15:23:30 -0700126 const int fNumRasterSamples;
127 const bool fIsMixedSampled;
Robert Phillips933484f2019-11-26 09:38:55 -0500128 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -0400129 const GrSurfaceOrigin fOrigin;
Robert Phillips67a625e2019-11-15 15:37:07 -0500130 const GrPipeline* fPipeline;
131 const GrPrimitiveProcessor* fPrimProc;
Robert Phillips901aff02019-10-08 12:32:56 -0400132 const GrPipeline::FixedDynamicState* fFixedDynamicState;
133 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400134 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400135 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500136 GrPrimitiveType fPrimitiveType;
Robert Phillips901aff02019-10-08 12:32:56 -0400137};
138
139#endif