blob: cbcce48af905417aeea744530319685be646484d [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,
Chris Dalton5a2f9622019-12-27 14:56:38 -070025 GrPrimitiveType primitiveType,
Greg Danield358cbe2020-09-11 09:33:54 -040026 uint8_t tessellationPatchVertexCount,
27 GrXferBarrierFlags renderPassXferBarriers)
Robert Phillipsfe3dce22020-05-08 15:15:46 -040028 : fNumSamples(numSamples)
29 , fNumStencilSamples(numStencilSamples)
30 , fIsMixedSampled(pipeline->isStencilEnabled() && numStencilSamples > numSamples)
Robert Phillips933484f2019-11-26 09:38:55 -050031 , fBackendFormat(backendFormat)
Robert Phillips901aff02019-10-08 12:32:56 -040032 , fOrigin(origin)
33 , fPipeline(pipeline)
34 , fPrimProc(primProc)
Chris Dalton5a2f9622019-12-27 14:56:38 -070035 , fPrimitiveType(primitiveType)
Greg Danield358cbe2020-09-11 09:33:54 -040036 , fTessellationPatchVertexCount(tessellationPatchVertexCount)
37 , fRenderPassXferBarriers(renderPassXferBarriers) {
Robert Phillipsfe3dce22020-05-08 15:15:46 -040038 SkASSERT(this->numRasterSamples() > 0);
Chris Dalton5a2f9622019-12-27 14:56:38 -070039 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
40 (fTessellationPatchVertexCount > 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 Phillips901aff02019-10-08 12:32:56 -040048 }
49
Robert Phillips7de13332019-10-09 15:44:54 -040050 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
51
Robert Phillipsfe3dce22020-05-08 15:15:46 -040052 int numSamples() const { return fNumSamples; }
53 int numStencilSamples() const { return fNumStencilSamples; }
Robert Phillips96f22372020-05-20 12:31:18 -040054 bool isStencilEnabled() const { return fPipeline->isStencilEnabled(); }
Robert Phillipsfe3dce22020-05-08 15:15:46 -040055
56 int numRasterSamples() const {
57 return fPipeline->isStencilEnabled() ? fNumStencilSamples : fNumSamples;
58 }
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070059 bool isMixedSampled() const { return fIsMixedSampled; }
Robert Phillips933484f2019-11-26 09:38:55 -050060 // The backend format of the destination render target [proxy]
61 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Robert Phillips901aff02019-10-08 12:32:56 -040062 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050063 const GrPipeline& pipeline() const { return *fPipeline; }
64 const GrPrimitiveProcessor& primProc() const { return *fPrimProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040065
Robert Phillipscea290f2019-11-06 11:21:03 -050066 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -070067 uint8_t tessellationPatchVertexCount() const {
68 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
69 return fTessellationPatchVertexCount;
70 }
71
Greg Danield358cbe2020-09-11 09:33:54 -040072 GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
73
Chris Dalton5a2f9622019-12-27 14:56:38 -070074 uint16_t primitiveTypeKey() const {
75 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
76 }
Robert Phillipscea290f2019-11-06 11:21:03 -050077
Robert Phillipsa87c5292019-11-12 10:12:42 -050078 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
79 // create the stencil settings here.
80 GrStencilSettings nonGLStencilSettings() const;
81
Chris Daltonbe457422020-03-16 18:05:03 -060082 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
83 // to call the visitor on its own primProc proxies.
84 void visitFPProxies(const GrOp::VisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -050085
Robert Phillips901aff02019-10-08 12:32:56 -040086#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -050087 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040088 void checkAllInstantiated() const;
89 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips865d8d62019-10-09 14:15:55 -040090
Robert Phillips901aff02019-10-08 12:32:56 -040091 bool isNVPR() const {
Robert Phillips67a625e2019-11-15 15:37:07 -050092 return fPrimProc->isPathRendering() && !fPrimProc->willUseGeoShader() &&
93 !fPrimProc->numVertexAttributes() && !fPrimProc->numInstanceAttributes();
Robert Phillips901aff02019-10-08 12:32:56 -040094 }
Robert Phillips901aff02019-10-08 12:32:56 -040095#endif
96
97private:
Robert Phillipsfe3dce22020-05-08 15:15:46 -040098 const int fNumSamples;
99 const int fNumStencilSamples;
Chris Dalton5e8cdfd2019-11-11 15:23:30 -0700100 const bool fIsMixedSampled;
Robert Phillips933484f2019-11-26 09:38:55 -0500101 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -0400102 const GrSurfaceOrigin fOrigin;
Robert Phillips67a625e2019-11-15 15:37:07 -0500103 const GrPipeline* fPipeline;
104 const GrPrimitiveProcessor* fPrimProc;
Robert Phillips7de13332019-10-09 15:44:54 -0400105 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500106 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700107 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Greg Danield358cbe2020-09-11 09:33:54 -0400108 GrXferBarrierFlags fRenderPassXferBarriers;
Robert Phillips901aff02019-10-08 12:32:56 -0400109};
110
111#endif