xref: /third_party/skia/src/gpu/GrProgramInfo.h (revision cb93a386)
1/*
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/GrGeometryProcessor.h"
13#include "src/gpu/GrPipeline.h"
14
15class GrStencilSettings;
16
17class GrProgramInfo {
18public:
19    GrProgramInfo(const GrCaps& caps,
20                  const GrSurfaceProxyView& targetView,
21                  bool usesMSAASurface,
22                  const GrPipeline* pipeline,
23                  const GrUserStencilSettings* userStencilSettings,
24                  const GrGeometryProcessor* geomProc,
25                  GrPrimitiveType primitiveType,
26                  uint8_t tessellationPatchVertexCount,
27                  GrXferBarrierFlags renderPassXferBarriers,
28                  GrLoadOp colorLoadOp)
29            : fNeedsStencil(targetView.asRenderTargetProxy()->needsStencil())
30            , fBackendFormat(targetView.proxy()->backendFormat())
31            , fOrigin(targetView.origin())
32            , fTargetHasVkResolveAttachmentWithInput(
33                    targetView.asRenderTargetProxy()->supportsVkInputAttachment() &&
34                    ((targetView.asRenderTargetProxy()->numSamples() > 1 &&
35                     targetView.asTextureProxy()) ||
36                    targetView.asRenderTargetProxy()->numSamples() == 1))
37            , fTargetsNumSamples(targetView.asRenderTargetProxy()->numSamples())
38            , fPipeline(pipeline)
39            , fUserStencilSettings(userStencilSettings)
40            , fGeomProc(geomProc)
41            , fPrimitiveType(primitiveType)
42            , fTessellationPatchVertexCount(tessellationPatchVertexCount)
43            , fRenderPassXferBarriers(renderPassXferBarriers)
44            , fColorLoadOp(colorLoadOp) {
45        SkASSERT(fTargetsNumSamples > 0);
46        fNumSamples = fTargetsNumSamples;
47        if (fNumSamples == 1 && usesMSAASurface) {
48            fNumSamples = caps.internalMultisampleCount(this->backendFormat());
49        }
50        SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) ==
51                 (fTessellationPatchVertexCount > 0));
52        SkDEBUGCODE(this->validate(false);)
53    }
54
55    int numSamples() const { return fNumSamples; }
56    int needsStencil() const { return fNeedsStencil; }
57    bool isStencilEnabled() const {
58        return fUserStencilSettings != &GrUserStencilSettings::kUnused ||
59               fPipeline->hasStencilClip();
60    }
61    const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; }
62    // The backend format of the destination render target [proxy]
63    const GrBackendFormat& backendFormat() const { return fBackendFormat; }
64    GrSurfaceOrigin origin() const { return fOrigin; }
65    const GrPipeline& pipeline() const { return *fPipeline; }
66    const GrGeometryProcessor& geomProc() const { return *fGeomProc; }
67
68    GrPrimitiveType primitiveType() const { return fPrimitiveType; }
69    uint8_t tessellationPatchVertexCount() const {
70        SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType);
71        return fTessellationPatchVertexCount;
72    }
73
74    bool targetHasVkResolveAttachmentWithInput() const {
75        return fTargetHasVkResolveAttachmentWithInput;
76    }
77
78    int targetsNumSamples() const { return fTargetsNumSamples; }
79
80    GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
81
82    GrLoadOp colorLoadOp() const { return fColorLoadOp; }
83
84    uint16_t primitiveTypeKey() const {
85        return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount;
86    }
87
88    // 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
92    // 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.
94    void visitFPProxies(const GrVisitProxyFunc& func) const { fPipeline->visitProxies(func); }
95
96#ifdef SK_DEBUG
97    void validate(bool flushTime) const;
98    void checkAllInstantiated() const;
99    void checkMSAAAndMIPSAreResolved() const;
100#endif
101
102private:
103    int                                   fNumSamples;
104    bool                                  fNeedsStencil;
105    GrBackendFormat                       fBackendFormat;
106    GrSurfaceOrigin                       fOrigin;
107    bool                                  fTargetHasVkResolveAttachmentWithInput;
108    int                                   fTargetsNumSamples;
109    const GrPipeline*                     fPipeline;
110    const GrUserStencilSettings*          fUserStencilSettings;
111    const GrGeometryProcessor*            fGeomProc;
112    GrPrimitiveType                       fPrimitiveType;
113    uint8_t                               fTessellationPatchVertexCount;  // GrPrimType::kPatches.
114    GrXferBarrierFlags                    fRenderPassXferBarriers;
115    GrLoadOp                              fColorLoadOp;
116};
117
118#endif
119