blob: 38c0d6183c5543a6a08c2d21399f8dc14c7f5bf8 [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:
Robert Phillips5c809642020-11-20 12:28:45 -050019 GrProgramInfo(const GrSurfaceProxyView& targetView,
Robert Phillips67a625e2019-11-15 15:37:07 -050020 const GrPipeline* pipeline,
Chris Dalton1b6a43c2020-09-25 12:21:18 -060021 const GrUserStencilSettings* userStencilSettings,
Robert Phillips67a625e2019-11-15 15:37:07 -050022 const GrPrimitiveProcessor* primProc,
Chris Dalton5a2f9622019-12-27 14:56:38 -070023 GrPrimitiveType primitiveType,
Greg Danield358cbe2020-09-11 09:33:54 -040024 uint8_t tessellationPatchVertexCount,
Greg Daniel42dbca52020-11-20 10:22:43 -050025 GrXferBarrierFlags renderPassXferBarriers,
26 GrLoadOp colorLoadOp)
Robert Phillips5c809642020-11-20 12:28:45 -050027 : fNumSamples(targetView.asRenderTargetProxy()->numSamples())
28 , fNumStencilSamples(targetView.asRenderTargetProxy()->numStencilSamples())
29 , fBackendFormat(targetView.proxy()->backendFormat())
30 , fOrigin(targetView.origin())
Greg Danielc76f7d02020-12-16 09:39:29 -050031 , fTargetSupportsVkResolveLoad(
32 targetView.asRenderTargetProxy()->numSamples() &&
33 targetView.asTextureProxy() &&
34 targetView.asRenderTargetProxy()->supportsVkInputAttachment())
Robert Phillips901aff02019-10-08 12:32:56 -040035 , fPipeline(pipeline)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060036 , fUserStencilSettings(userStencilSettings)
Robert Phillips901aff02019-10-08 12:32:56 -040037 , fPrimProc(primProc)
Chris Dalton5a2f9622019-12-27 14:56:38 -070038 , fPrimitiveType(primitiveType)
Greg Danield358cbe2020-09-11 09:33:54 -040039 , fTessellationPatchVertexCount(tessellationPatchVertexCount)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060040 , fRenderPassXferBarriers(renderPassXferBarriers)
Greg Daniel42dbca52020-11-20 10:22:43 -050041 , fColorLoadOp(colorLoadOp)
Robert Phillips5c809642020-11-20 12:28:45 -050042 , fIsMixedSampled(this->isStencilEnabled() && fNumStencilSamples > fNumSamples) {
Robert Phillipsfe3dce22020-05-08 15:15:46 -040043 SkASSERT(this->numRasterSamples() > 0);
Chris Dalton5a2f9622019-12-27 14:56:38 -070044 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
45 (fTessellationPatchVertexCount > 0));
Robert Phillips67a625e2019-11-15 15:37:07 -050046 fRequestedFeatures = fPrimProc->requestedFeatures();
47 for (int i = 0; i < fPipeline->numFragmentProcessors(); ++i) {
48 fRequestedFeatures |= fPipeline->getFragmentProcessor(i).requestedFeatures();
Robert Phillips7de13332019-10-09 15:44:54 -040049 }
Robert Phillips67a625e2019-11-15 15:37:07 -050050 fRequestedFeatures |= fPipeline->getXferProcessor().requestedFeatures();
Robert Phillips2d8a95e2019-10-10 12:50:22 -040051
Robert Phillips8053c972019-11-21 10:44:53 -050052 SkDEBUGCODE(this->validate(false);)
Robert Phillips901aff02019-10-08 12:32:56 -040053 }
54
Robert Phillips7de13332019-10-09 15:44:54 -040055 GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
56
Robert Phillipsfe3dce22020-05-08 15:15:46 -040057 int numSamples() const { return fNumSamples; }
58 int numStencilSamples() const { return fNumStencilSamples; }
Chris Dalton1b6a43c2020-09-25 12:21:18 -060059 bool isStencilEnabled() const {
60 return fUserStencilSettings != &GrUserStencilSettings::kUnused ||
61 fPipeline->hasStencilClip();
62 }
63 const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; }
Robert Phillipsfe3dce22020-05-08 15:15:46 -040064 int numRasterSamples() const {
Chris Dalton1b6a43c2020-09-25 12:21:18 -060065 return this->isStencilEnabled() ? fNumStencilSamples : fNumSamples;
Robert Phillipsfe3dce22020-05-08 15:15:46 -040066 }
Chris Dalton5e8cdfd2019-11-11 15:23:30 -070067 bool isMixedSampled() const { return fIsMixedSampled; }
Robert Phillips933484f2019-11-26 09:38:55 -050068 // The backend format of the destination render target [proxy]
69 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Robert Phillips901aff02019-10-08 12:32:56 -040070 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050071 const GrPipeline& pipeline() const { return *fPipeline; }
72 const GrPrimitiveProcessor& primProc() const { return *fPrimProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040073
Robert Phillipscea290f2019-11-06 11:21:03 -050074 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -070075 uint8_t tessellationPatchVertexCount() const {
76 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
77 return fTessellationPatchVertexCount;
78 }
79
Greg Danielc76f7d02020-12-16 09:39:29 -050080 bool targetSupportsVkResolveLoad() const { return fTargetSupportsVkResolveLoad; }
81
Greg Danield358cbe2020-09-11 09:33:54 -040082 GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
83
Greg Daniel42dbca52020-11-20 10:22:43 -050084 GrLoadOp colorLoadOp() const { return fColorLoadOp; }
85
Chris Dalton5a2f9622019-12-27 14:56:38 -070086 uint16_t primitiveTypeKey() const {
87 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
88 }
Robert Phillipscea290f2019-11-06 11:21:03 -050089
Robert Phillipsa87c5292019-11-12 10:12:42 -050090 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
91 // create the stencil settings here.
92 GrStencilSettings nonGLStencilSettings() const;
93
Chris Daltonbe457422020-03-16 18:05:03 -060094 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
95 // to call the visitor on its own primProc proxies.
96 void visitFPProxies(const GrOp::VisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -050097
Robert Phillips901aff02019-10-08 12:32:56 -040098#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -050099 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -0400100 void checkAllInstantiated() const;
101 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips865d8d62019-10-09 14:15:55 -0400102
Robert Phillips901aff02019-10-08 12:32:56 -0400103 bool isNVPR() const {
Robert Phillips67a625e2019-11-15 15:37:07 -0500104 return fPrimProc->isPathRendering() && !fPrimProc->willUseGeoShader() &&
105 !fPrimProc->numVertexAttributes() && !fPrimProc->numInstanceAttributes();
Robert Phillips901aff02019-10-08 12:32:56 -0400106 }
Robert Phillips901aff02019-10-08 12:32:56 -0400107#endif
108
109private:
Robert Phillipsfe3dce22020-05-08 15:15:46 -0400110 const int fNumSamples;
111 const int fNumStencilSamples;
Robert Phillips933484f2019-11-26 09:38:55 -0500112 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -0400113 const GrSurfaceOrigin fOrigin;
Greg Danielc76f7d02020-12-16 09:39:29 -0500114 const bool fTargetSupportsVkResolveLoad;
Robert Phillips67a625e2019-11-15 15:37:07 -0500115 const GrPipeline* fPipeline;
Chris Dalton1b6a43c2020-09-25 12:21:18 -0600116 const GrUserStencilSettings* fUserStencilSettings;
Robert Phillips67a625e2019-11-15 15:37:07 -0500117 const GrPrimitiveProcessor* fPrimProc;
Robert Phillips7de13332019-10-09 15:44:54 -0400118 GrProcessor::CustomFeatures fRequestedFeatures;
Robert Phillipscea290f2019-11-06 11:21:03 -0500119 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700120 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Greg Danield358cbe2020-09-11 09:33:54 -0400121 GrXferBarrierFlags fRenderPassXferBarriers;
Greg Daniel42dbca52020-11-20 10:22:43 -0500122 GrLoadOp fColorLoadOp;
Chris Dalton1b6a43c2020-09-25 12:21:18 -0600123 const bool fIsMixedSampled;
Robert Phillips901aff02019-10-08 12:32:56 -0400124};
125
126#endif