blob: 3d63f30f0c34ba04d85ca3f3b338d9ea562c4e31 [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:
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 Phillips787fd9d2021-03-22 14:48:09 -040022 const GrGeometryProcessor* geomProc,
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())
Chris Dalton57ab06c2021-04-22 12:57:28 -060028 , fNeedsStencil(targetView.asRenderTargetProxy()->needsStencil())
Robert Phillips5c809642020-11-20 12:28:45 -050029 , fBackendFormat(targetView.proxy()->backendFormat())
30 , fOrigin(targetView.origin())
Greg Daniel1e169372021-08-24 15:44:15 -040031 , fTargetHasVkResolveAttachmentWithInput(
32 targetView.asRenderTargetProxy()->supportsVkInputAttachment() &&
33 ((targetView.asRenderTargetProxy()->numSamples() > 1 &&
34 targetView.asTextureProxy()) ||
35 targetView.asRenderTargetProxy()->numSamples() == 1))
36 , fTargetsNumSamples(targetView.asRenderTargetProxy()->numSamples())
Robert Phillips901aff02019-10-08 12:32:56 -040037 , fPipeline(pipeline)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060038 , fUserStencilSettings(userStencilSettings)
Robert Phillips787fd9d2021-03-22 14:48:09 -040039 , fGeomProc(geomProc)
Chris Dalton5a2f9622019-12-27 14:56:38 -070040 , fPrimitiveType(primitiveType)
Greg Danield358cbe2020-09-11 09:33:54 -040041 , fTessellationPatchVertexCount(tessellationPatchVertexCount)
Chris Dalton1b6a43c2020-09-25 12:21:18 -060042 , fRenderPassXferBarriers(renderPassXferBarriers)
Chris Dalton57ab06c2021-04-22 12:57:28 -060043 , fColorLoadOp(colorLoadOp) {
44 SkASSERT(this->numSamples() > 0);
Chris Dalton5a2f9622019-12-27 14:56:38 -070045 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
46 (fTessellationPatchVertexCount > 0));
Robert Phillips8053c972019-11-21 10:44:53 -050047 SkDEBUGCODE(this->validate(false);)
Robert Phillips901aff02019-10-08 12:32:56 -040048 }
49
Robert Phillipsfe3dce22020-05-08 15:15:46 -040050 int numSamples() const { return fNumSamples; }
Chris Dalton57ab06c2021-04-22 12:57:28 -060051 int needsStencil() const { return fNeedsStencil; }
Chris Dalton1b6a43c2020-09-25 12:21:18 -060052 bool isStencilEnabled() const {
53 return fUserStencilSettings != &GrUserStencilSettings::kUnused ||
54 fPipeline->hasStencilClip();
55 }
56 const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; }
Robert Phillips933484f2019-11-26 09:38:55 -050057 // The backend format of the destination render target [proxy]
58 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Greg Daniel1e169372021-08-24 15:44:15 -040059 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050060 const GrPipeline& pipeline() const { return *fPipeline; }
Robert Phillips787fd9d2021-03-22 14:48:09 -040061 const GrGeometryProcessor& geomProc() const { return *fGeomProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040062
Robert Phillipscea290f2019-11-06 11:21:03 -050063 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -070064 uint8_t tessellationPatchVertexCount() const {
65 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
66 return fTessellationPatchVertexCount;
67 }
68
Greg Daniel1e169372021-08-24 15:44:15 -040069 bool targetHasVkResolveAttachmentWithInput() const {
70 return fTargetHasVkResolveAttachmentWithInput;
71 }
72
73 int targetsNumSamples() const { return fTargetsNumSamples; }
Greg Danielc76f7d02020-12-16 09:39:29 -050074
Greg Danield358cbe2020-09-11 09:33:54 -040075 GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
76
Greg Daniel42dbca52020-11-20 10:22:43 -050077 GrLoadOp colorLoadOp() const { return fColorLoadOp; }
78
Chris Dalton5a2f9622019-12-27 14:56:38 -070079 uint16_t primitiveTypeKey() const {
80 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
81 }
Robert Phillipscea290f2019-11-06 11:21:03 -050082
Robert Phillipsa87c5292019-11-12 10:12:42 -050083 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
84 // create the stencil settings here.
85 GrStencilSettings nonGLStencilSettings() const;
86
Chris Daltonbe457422020-03-16 18:05:03 -060087 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
88 // to call the visitor on its own primProc proxies.
Robert Phillips294723d2021-06-17 09:23:58 -040089 void visitFPProxies(const GrVisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -050090
Robert Phillips901aff02019-10-08 12:32:56 -040091#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -050092 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040093 void checkAllInstantiated() const;
94 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips901aff02019-10-08 12:32:56 -040095#endif
96
97private:
Greg Daniel1e169372021-08-24 15:44:15 -040098 int fNumSamples;
Chris Dalton57ab06c2021-04-22 12:57:28 -060099 const bool fNeedsStencil;
Robert Phillips933484f2019-11-26 09:38:55 -0500100 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -0400101 const GrSurfaceOrigin fOrigin;
Greg Daniel1e169372021-08-24 15:44:15 -0400102 bool fTargetHasVkResolveAttachmentWithInput;
103 int fTargetsNumSamples;
Robert Phillips67a625e2019-11-15 15:37:07 -0500104 const GrPipeline* fPipeline;
Chris Dalton1b6a43c2020-09-25 12:21:18 -0600105 const GrUserStencilSettings* fUserStencilSettings;
Robert Phillips787fd9d2021-03-22 14:48:09 -0400106 const GrGeometryProcessor* fGeomProc;
Robert Phillipscea290f2019-11-06 11:21:03 -0500107 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700108 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Greg Danield358cbe2020-09-11 09:33:54 -0400109 GrXferBarrierFlags fRenderPassXferBarriers;
Greg Daniel42dbca52020-11-20 10:22:43 -0500110 GrLoadOp fColorLoadOp;
Robert Phillips901aff02019-10-08 12:32:56 -0400111};
112
113#endif