blob: 9f1f602b569008d1c50018d1b1e17a23bf77ccd2 [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"
Robert Phillips787fd9d2021-03-22 14:48:09 -040012#include "src/gpu/GrGeometryProcessor.h"
Robert Phillips901aff02019-10-08 12:32:56 -040013#include "src/gpu/GrPipeline.h"
Robert Phillips901aff02019-10-08 12:32:56 -040014
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:
Chris Dalton2a26c502021-08-26 10:05:11 -060019 GrProgramInfo(const GrCaps& caps,
20 const GrSurfaceProxyView& targetView,
21 bool usesMSAASurface,
Robert Phillips67a625e2019-11-15 15:37:07 -050022 const GrPipeline* pipeline,
Chris Dalton1b6a43c2020-09-25 12:21:18 -060023 const GrUserStencilSettings* userStencilSettings,
Robert Phillips787fd9d2021-03-22 14:48:09 -040024 const GrGeometryProcessor* geomProc,
Chris Dalton5a2f9622019-12-27 14:56:38 -070025 GrPrimitiveType primitiveType,
Greg Danield358cbe2020-09-11 09:33:54 -040026 uint8_t tessellationPatchVertexCount,
Greg Daniel42dbca52020-11-20 10:22:43 -050027 GrXferBarrierFlags renderPassXferBarriers,
28 GrLoadOp colorLoadOp)
Chris Dalton2a26c502021-08-26 10:05:11 -060029 : fNeedsStencil(targetView.asRenderTargetProxy()->needsStencil())
Robert Phillips5c809642020-11-20 12:28:45 -050030 , fBackendFormat(targetView.proxy()->backendFormat())
31 , fOrigin(targetView.origin())
Greg Daniel1e169372021-08-24 15:44:15 -040032 , fTargetHasVkResolveAttachmentWithInput(
33 targetView.asRenderTargetProxy()->supportsVkInputAttachment() &&
34 ((targetView.asRenderTargetProxy()->numSamples() > 1 &&
35 targetView.asTextureProxy()) ||
36 targetView.asRenderTargetProxy()->numSamples() == 1))
37 , fTargetsNumSamples(targetView.asRenderTargetProxy()->numSamples())
Robert Phillips901aff02019-10-08 12:32:56 -040038 , fPipeline(pipeline)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060039 , fUserStencilSettings(userStencilSettings)
Robert Phillips787fd9d2021-03-22 14:48:09 -040040 , fGeomProc(geomProc)
Chris Dalton5a2f9622019-12-27 14:56:38 -070041 , fPrimitiveType(primitiveType)
Greg Danield358cbe2020-09-11 09:33:54 -040042 , fTessellationPatchVertexCount(tessellationPatchVertexCount)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060043 , fRenderPassXferBarriers(renderPassXferBarriers)
Chris Dalton57ab06c2021-04-22 12:57:28 -060044 , fColorLoadOp(colorLoadOp) {
Chris Dalton2a26c502021-08-26 10:05:11 -060045 SkASSERT(fTargetsNumSamples > 0);
46 fNumSamples = fTargetsNumSamples;
47 if (fNumSamples == 1 && usesMSAASurface) {
48 fNumSamples = caps.internalMultisampleCount(this->backendFormat());
49 }
Chris Dalton5a2f9622019-12-27 14:56:38 -070050 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
51 (fTessellationPatchVertexCount > 0));
Robert Phillips8053c972019-11-21 10:44:53 -050052 SkDEBUGCODE(this->validate(false);)
Robert Phillips901aff02019-10-08 12:32:56 -040053 }
54
Robert Phillipsfe3dce22020-05-08 15:15:46 -040055 int numSamples() const { return fNumSamples; }
Chris Dalton57ab06c2021-04-22 12:57:28 -060056 int needsStencil() const { return fNeedsStencil; }
Chris Dalton1b6a43c2020-09-25 12:21:18 -060057 bool isStencilEnabled() const {
58 return fUserStencilSettings != &GrUserStencilSettings::kUnused ||
59 fPipeline->hasStencilClip();
60 }
61 const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; }
Robert Phillips933484f2019-11-26 09:38:55 -050062 // The backend format of the destination render target [proxy]
63 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Greg Daniel1e169372021-08-24 15:44:15 -040064 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050065 const GrPipeline& pipeline() const { return *fPipeline; }
Robert Phillips787fd9d2021-03-22 14:48:09 -040066 const GrGeometryProcessor& geomProc() const { return *fGeomProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040067
Robert Phillipscea290f2019-11-06 11:21:03 -050068 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -070069 uint8_t tessellationPatchVertexCount() const {
70 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
71 return fTessellationPatchVertexCount;
72 }
73
Greg Daniel1e169372021-08-24 15:44:15 -040074 bool targetHasVkResolveAttachmentWithInput() const {
75 return fTargetHasVkResolveAttachmentWithInput;
76 }
77
78 int targetsNumSamples() const { return fTargetsNumSamples; }
Greg Danielc76f7d02020-12-16 09:39:29 -050079
Greg Danield358cbe2020-09-11 09:33:54 -040080 GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
81
Greg Daniel42dbca52020-11-20 10:22:43 -050082 GrLoadOp colorLoadOp() const { return fColorLoadOp; }
83
Chris Dalton5a2f9622019-12-27 14:56:38 -070084 uint16_t primitiveTypeKey() const {
85 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
86 }
Robert Phillipscea290f2019-11-06 11:21:03 -050087
Robert Phillipsa87c5292019-11-12 10:12:42 -050088 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
89 // create the stencil settings here.
90 GrStencilSettings nonGLStencilSettings() const;
91
Chris Daltonbe457422020-03-16 18:05:03 -060092 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
93 // to call the visitor on its own primProc proxies.
Robert Phillips294723d2021-06-17 09:23:58 -040094 void visitFPProxies(const GrVisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -050095
Robert Phillips901aff02019-10-08 12:32:56 -040096#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -050097 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040098 void checkAllInstantiated() const;
99 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips901aff02019-10-08 12:32:56 -0400100#endif
101
102private:
Greg Daniel1e169372021-08-24 15:44:15 -0400103 int fNumSamples;
Chris Dalton2a26c502021-08-26 10:05:11 -0600104 bool fNeedsStencil;
105 GrBackendFormat fBackendFormat;
106 GrSurfaceOrigin fOrigin;
Greg Daniel1e169372021-08-24 15:44:15 -0400107 bool fTargetHasVkResolveAttachmentWithInput;
108 int fTargetsNumSamples;
Robert Phillips67a625e2019-11-15 15:37:07 -0500109 const GrPipeline* fPipeline;
Chris Dalton1b6a43c2020-09-25 12:21:18 -0600110 const GrUserStencilSettings* fUserStencilSettings;
Robert Phillips787fd9d2021-03-22 14:48:09 -0400111 const GrGeometryProcessor* fGeomProc;
Robert Phillipscea290f2019-11-06 11:21:03 -0500112 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700113 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Greg Danield358cbe2020-09-11 09:33:54 -0400114 GrXferBarrierFlags fRenderPassXferBarriers;
Greg Daniel42dbca52020-11-20 10:22:43 -0500115 GrLoadOp fColorLoadOp;
Robert Phillips901aff02019-10-08 12:32:56 -0400116};
117
118#endif