blob: ec863f3d82175c61a015c2abcf1e0dc462b1f753 [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 Phillipsa87c5292019-11-12 10:12:42 -050015class GrStencilSettings;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040016
Robert Phillips901aff02019-10-08 12:32:56 -040017class GrProgramInfo {
18public:
19 GrProgramInfo(int numSamples,
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070020 int numStencilSamples,
Robert Phillips933484f2019-11-26 09:38:55 -050021 const GrBackendFormat& backendFormat,
Robert Phillips901aff02019-10-08 12:32:56 -040022 GrSurfaceOrigin origin,
Robert Phillips67a625e2019-11-15 15:37:07 -050023 const GrPipeline* pipeline,
24 const GrPrimitiveProcessor* primProc,
Robert Phillips901aff02019-10-08 12:32:56 -040025 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,
Chris Dalton5a2f9622019-12-27 14:56:38 -070028 GrPrimitiveType primitiveType,
29 uint8_t tessellationPatchVertexCount = 0)
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)
Chris Dalton5a2f9622019-12-27 14:56:38 -070039 , fPrimitiveType(primitiveType)
40 , fTessellationPatchVertexCount(tessellationPatchVertexCount) {
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070041 SkASSERT(fNumRasterSamples > 0);
Chris Dalton5a2f9622019-12-27 14:56:38 -070042 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
43 (fTessellationPatchVertexCount > 0));
Robert Phillips67a625e2019-11-15 15:37:07 -050044 fRequestedFeatures = fPrimProc->requestedFeatures();
45 for (int i = 0; i < fPipeline->numFragmentProcessors(); ++i) {
46 fRequestedFeatures |= fPipeline->getFragmentProcessor(i).requestedFeatures();
Robert Phillips7de13332019-10-09 15:44:54 -040047 }
Robert Phillips67a625e2019-11-15 15:37:07 -050048 fRequestedFeatures |= fPipeline->getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040049
Robert Phillips8053c972019-11-21 10:44:53 -050050 SkDEBUGCODE(this->validate(false);)
Robert Phillips2d8a95e2019-10-10 12:50:22 -040051 (void) fNumDynamicStateArrays; // touch this to quiet unused member warnings
Robert Phillips901aff02019-10-08 12:32:56 -040052 }
53
Robert Phillips7de13332019-10-09 15:44:54 -040054 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
55
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070056 int numRasterSamples() const { return fNumRasterSamples; }
57 bool isMixedSampled() const { return fIsMixedSampled; }
Robert Phillips933484f2019-11-26 09:38:55 -050058 // The backend format of the destination render target [proxy]
59 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Robert Phillips901aff02019-10-08 12:32:56 -040060 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050061 const GrPipeline& pipeline() const { return *fPipeline; }
62 const GrPrimitiveProcessor& primProc() const { return *fPrimProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040063 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
Chris Dalton4386ad12020-02-19 16:42:06 -070064 int numDynamicStateArrays() const { return fNumDynamicStateArrays; }
Robert Phillips901aff02019-10-08 12:32:56 -040065
Robert Phillips901aff02019-10-08 12:32:56 -040066 bool hasDynamicScissors() const {
Chris Dalton2e7ed262020-02-21 15:17:59 -070067 return fPipeline->isScissorTestEnabled() &&
Robert Phillips901aff02019-10-08 12:32:56 -040068 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
69 }
70
71 const SkIRect& dynamicScissor(int i) const {
72 SkASSERT(this->hasDynamicScissors());
73
74 return fDynamicStateArrays->fScissorRects[i];
75 }
76
Chris Dalton2e7ed262020-02-21 15:17:59 -070077 bool hasFixedScissor() const { return fPipeline->isScissorTestEnabled() && fFixedDynamicState; }
Robert Phillips901aff02019-10-08 12:32:56 -040078
79 const SkIRect& fixedScissor() const {
80 SkASSERT(this->hasFixedScissor());
81
82 return fFixedDynamicState->fScissorRect;
83 }
84
85 bool hasDynamicPrimProcTextures() const {
86 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
87 }
88
Michael Ludwigfcdd0612019-11-25 08:34:31 -050089 const GrSurfaceProxy* const* dynamicPrimProcTextures(int i) const {
Robert Phillips901aff02019-10-08 12:32:56 -040090 SkASSERT(this->hasDynamicPrimProcTextures());
Robert Phillips2d8a95e2019-10-10 12:50:22 -040091 SkASSERT(i < fNumDynamicStateArrays);
Robert Phillips901aff02019-10-08 12:32:56 -040092
93 return fDynamicStateArrays->fPrimitiveProcessorTextures +
Robert Phillips67a625e2019-11-15 15:37:07 -050094 i * fPrimProc->numTextureSamplers();
Robert Phillips901aff02019-10-08 12:32:56 -040095 }
96
97 bool hasFixedPrimProcTextures() const {
98 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
99 }
100
Michael Ludwigfcdd0612019-11-25 08:34:31 -0500101 const GrSurfaceProxy* const* fixedPrimProcTextures() const {
Robert Phillips901aff02019-10-08 12:32:56 -0400102 SkASSERT(this->hasFixedPrimProcTextures());
103
104 return fFixedDynamicState->fPrimitiveProcessorTextures;
105 }
106
Robert Phillipscea290f2019-11-06 11:21:03 -0500107 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -0700108 uint8_t tessellationPatchVertexCount() const {
109 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
110 return fTessellationPatchVertexCount;
111 }
112
113 uint16_t primitiveTypeKey() const {
114 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
115 }
Robert Phillipscea290f2019-11-06 11:21:03 -0500116
Robert Phillipsa87c5292019-11-12 10:12:42 -0500117 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
118 // create the stencil settings here.
119 GrStencilSettings nonGLStencilSettings() const;
120
Chris Daltonbe457422020-03-16 18:05:03 -0600121 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
122 // to call the visitor on its own primProc proxies.
123 void visitFPProxies(const GrOp::VisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -0500124
Robert Phillips901aff02019-10-08 12:32:56 -0400125#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -0500126 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400127 void checkAllInstantiated() const;
128 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400129
Robert Phillips901aff02019-10-08 12:32:56 -0400130 bool isNVPR() const {
Robert Phillips67a625e2019-11-15 15:37:07 -0500131 return fPrimProc->isPathRendering() && !fPrimProc->willUseGeoShader() &&
132 !fPrimProc->numVertexAttributes() && !fPrimProc->numInstanceAttributes();
Robert Phillips901aff02019-10-08 12:32:56 -0400133 }
Robert Phillips901aff02019-10-08 12:32:56 -0400134#endif
135
136private:
Chris Dalton5e8cdfd2019-11-11 15:23:30 -0700137 const int fNumRasterSamples;
138 const bool fIsMixedSampled;
Robert Phillips933484f2019-11-26 09:38:55 -0500139 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -0400140 const GrSurfaceOrigin fOrigin;
Robert Phillips67a625e2019-11-15 15:37:07 -0500141 const GrPipeline* fPipeline;
142 const GrPrimitiveProcessor* fPrimProc;
Robert Phillips901aff02019-10-08 12:32:56 -0400143 const GrPipeline::FixedDynamicState* fFixedDynamicState;
144 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400145 const int fNumDynamicStateArrays;
Robert Phillips7de13332019-10-09 15:44:54 -0400146 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500147 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700148 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Robert Phillips901aff02019-10-08 12:32:56 -0400149};
150
151#endif