blob: df0cb21cd36c4553f329b11b1da958bf3fc68303 [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 Danielc76f7d02020-12-16 09:39:29 -050031 , fTargetSupportsVkResolveLoad(
Greg Danield8d9cf12021-01-07 09:46:39 -050032 targetView.asRenderTargetProxy()->numSamples() > 1 &&
Greg Danielc76f7d02020-12-16 09:39:29 -050033 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 Phillips787fd9d2021-03-22 14:48:09 -040037 , fGeomProc(geomProc)
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)
Chris Dalton57ab06c2021-04-22 12:57:28 -060041 , fColorLoadOp(colorLoadOp) {
42 SkASSERT(this->numSamples() > 0);
Chris Dalton5a2f9622019-12-27 14:56:38 -070043 SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
44 (fTessellationPatchVertexCount > 0));
Robert Phillips8053c972019-11-21 10:44:53 -050045 SkDEBUGCODE(this->validate(false);)
Robert Phillips901aff02019-10-08 12:32:56 -040046 }
47
Robert Phillipsfe3dce22020-05-08 15:15:46 -040048 int numSamples() const { return fNumSamples; }
Chris Dalton57ab06c2021-04-22 12:57:28 -060049 int needsStencil() const { return fNeedsStencil; }
Chris Dalton1b6a43c2020-09-25 12:21:18 -060050 bool isStencilEnabled() const {
51 return fUserStencilSettings != &GrUserStencilSettings::kUnused ||
52 fPipeline->hasStencilClip();
53 }
54 const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; }
Robert Phillips933484f2019-11-26 09:38:55 -050055 // The backend format of the destination render target [proxy]
56 const GrBackendFormat& backendFormat() const { return fBackendFormat; }
Robert Phillips901aff02019-10-08 12:32:56 -040057 GrSurfaceOrigin origin() const { return fOrigin; }
Robert Phillips67a625e2019-11-15 15:37:07 -050058 const GrPipeline& pipeline() const { return *fPipeline; }
Robert Phillips787fd9d2021-03-22 14:48:09 -040059 const GrGeometryProcessor& geomProc() const { return *fGeomProc; }
Robert Phillips901aff02019-10-08 12:32:56 -040060
Robert Phillipscea290f2019-11-06 11:21:03 -050061 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
Chris Dalton5a2f9622019-12-27 14:56:38 -070062 uint8_t tessellationPatchVertexCount() const {
63 SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
64 return fTessellationPatchVertexCount;
65 }
66
Greg Danielc76f7d02020-12-16 09:39:29 -050067 bool targetSupportsVkResolveLoad() const { return fTargetSupportsVkResolveLoad; }
68
Greg Danield358cbe2020-09-11 09:33:54 -040069 GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
70
Greg Daniel42dbca52020-11-20 10:22:43 -050071 GrLoadOp colorLoadOp() const { return fColorLoadOp; }
72
Chris Dalton5a2f9622019-12-27 14:56:38 -070073 uint16_t primitiveTypeKey() const {
74 return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
75 }
Robert Phillipscea290f2019-11-06 11:21:03 -050076
Robert Phillipsa87c5292019-11-12 10:12:42 -050077 // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can
78 // create the stencil settings here.
79 GrStencilSettings nonGLStencilSettings() const;
80
Chris Daltonbe457422020-03-16 18:05:03 -060081 // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible
82 // to call the visitor on its own primProc proxies.
Robert Phillips294723d2021-06-17 09:23:58 -040083 void visitFPProxies(const GrVisitProxyFunc& func) const { fPipeline->visitProxies(func); }
Robert Phillips8053c972019-11-21 10:44:53 -050084
Robert Phillips901aff02019-10-08 12:32:56 -040085#ifdef SK_DEBUG
Robert Phillips8053c972019-11-21 10:44:53 -050086 void validate(bool flushTime) const;
Robert Phillips2d8a95e2019-10-10 12:50:22 -040087 void checkAllInstantiated() const;
88 void checkMSAAAndMIPSAreResolved() const;
Robert Phillips901aff02019-10-08 12:32:56 -040089#endif
90
91private:
Robert Phillipsfe3dce22020-05-08 15:15:46 -040092 const int fNumSamples;
Chris Dalton57ab06c2021-04-22 12:57:28 -060093 const bool fNeedsStencil;
Robert Phillips933484f2019-11-26 09:38:55 -050094 const GrBackendFormat fBackendFormat;
Robert Phillips901aff02019-10-08 12:32:56 -040095 const GrSurfaceOrigin fOrigin;
Greg Danielc76f7d02020-12-16 09:39:29 -050096 const bool fTargetSupportsVkResolveLoad;
Robert Phillips67a625e2019-11-15 15:37:07 -050097 const GrPipeline* fPipeline;
Chris Dalton1b6a43c2020-09-25 12:21:18 -060098 const GrUserStencilSettings* fUserStencilSettings;
Robert Phillips787fd9d2021-03-22 14:48:09 -040099 const GrGeometryProcessor* fGeomProc;
Robert Phillipscea290f2019-11-06 11:21:03 -0500100 GrPrimitiveType fPrimitiveType;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700101 uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches.
Greg Danield358cbe2020-09-11 09:33:54 -0400102 GrXferBarrierFlags fRenderPassXferBarriers;
Greg Daniel42dbca52020-11-20 10:22:43 -0500103 GrLoadOp fColorLoadOp;
Robert Phillips901aff02019-10-08 12:32:56 -0400104};
105
106#endif