xref: /aosp_15_r20/external/skia/src/gpu/graphite/dawn/DawnCaps.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_DawnCaps_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_DawnCaps_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #include <array>
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include "webgpu/webgpu_cpp.h"  // NO_G3_REWRITE
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
18*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker struct DawnBackendContext;
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker class DawnCaps final : public Caps {
23*c8dee2aaSAndroid Build Coastguard Worker public:
24*c8dee2aaSAndroid Build Coastguard Worker     DawnCaps(const DawnBackendContext&, const ContextOptions&);
25*c8dee2aaSAndroid Build Coastguard Worker     ~DawnCaps() override;
26*c8dee2aaSAndroid Build Coastguard Worker 
useAsyncPipelineCreation()27*c8dee2aaSAndroid Build Coastguard Worker     bool useAsyncPipelineCreation() const { return fUseAsyncPipelineCreation; }
allowScopedErrorChecks()28*c8dee2aaSAndroid Build Coastguard Worker     bool allowScopedErrorChecks() const { return fAllowScopedErrorChecks; }
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     // If this has no value then loading the resolve texture via a LoadOp is not supported.
resolveTextureLoadOp()31*c8dee2aaSAndroid Build Coastguard Worker     std::optional<wgpu::LoadOp> resolveTextureLoadOp() const {
32*c8dee2aaSAndroid Build Coastguard Worker         return fSupportedResolveTextureLoadOp;
33*c8dee2aaSAndroid Build Coastguard Worker     }
supportsPartialLoadResolve()34*c8dee2aaSAndroid Build Coastguard Worker     bool supportsPartialLoadResolve() const { return fSupportsPartialLoadResolve; }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultSampledTextureInfo(SkColorType,
37*c8dee2aaSAndroid Build Coastguard Worker                                              Mipmapped mipmapped,
38*c8dee2aaSAndroid Build Coastguard Worker                                              Protected,
39*c8dee2aaSAndroid Build Coastguard Worker                                              Renderable) const override;
40*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getTextureInfoForSampledCopy(const TextureInfo& textureInfo,
41*c8dee2aaSAndroid Build Coastguard Worker                                              Mipmapped mipmapped) const override;
42*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultCompressedTextureInfo(SkTextureCompressionType,
43*c8dee2aaSAndroid Build Coastguard Worker                                                 Mipmapped mipmapped,
44*c8dee2aaSAndroid Build Coastguard Worker                                                 Protected) const override;
45*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultMSAATextureInfo(const TextureInfo& singleSampledInfo,
46*c8dee2aaSAndroid Build Coastguard Worker                                           Discardable discardable) const override;
47*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultDepthStencilTextureInfo(SkEnumBitMask<DepthStencilFlags>,
48*c8dee2aaSAndroid Build Coastguard Worker                                                   uint32_t sampleCount,
49*c8dee2aaSAndroid Build Coastguard Worker                                                   Protected) const override;
50*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultStorageTextureInfo(SkColorType) const override;
51*c8dee2aaSAndroid Build Coastguard Worker     SkISize getDepthAttachmentDimensions(const TextureInfo&,
52*c8dee2aaSAndroid Build Coastguard Worker                                          const SkISize colorAttachmentDimensions) const override;
53*c8dee2aaSAndroid Build Coastguard Worker     UniqueKey makeGraphicsPipelineKey(const GraphicsPipelineDesc&,
54*c8dee2aaSAndroid Build Coastguard Worker                                       const RenderPassDesc&) const override;
55*c8dee2aaSAndroid Build Coastguard Worker     bool extractGraphicsDescs(const UniqueKey&,
56*c8dee2aaSAndroid Build Coastguard Worker                               GraphicsPipelineDesc*,
57*c8dee2aaSAndroid Build Coastguard Worker                               RenderPassDesc*,
58*c8dee2aaSAndroid Build Coastguard Worker                               const RendererProvider*) const override;
59*c8dee2aaSAndroid Build Coastguard Worker     UniqueKey makeComputePipelineKey(const ComputePipelineDesc&) const override;
60*c8dee2aaSAndroid Build Coastguard Worker     ImmutableSamplerInfo getImmutableSamplerInfo(const TextureProxy* proxy) const override;
61*c8dee2aaSAndroid Build Coastguard Worker     GraphiteResourceKey makeSamplerKey(const SamplerDesc&) const override;
62*c8dee2aaSAndroid Build Coastguard Worker     uint32_t channelMask(const TextureInfo&) const override;
63*c8dee2aaSAndroid Build Coastguard Worker     bool isRenderable(const TextureInfo&) const override;
64*c8dee2aaSAndroid Build Coastguard Worker     bool isStorage(const TextureInfo&) const override;
65*c8dee2aaSAndroid Build Coastguard Worker 
loadOpAffectsMSAAPipelines()66*c8dee2aaSAndroid Build Coastguard Worker     bool loadOpAffectsMSAAPipelines() const override {
67*c8dee2aaSAndroid Build Coastguard Worker         return fSupportedResolveTextureLoadOp.has_value();
68*c8dee2aaSAndroid Build Coastguard Worker     }
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     void buildKeyForTexture(SkISize dimensions,
71*c8dee2aaSAndroid Build Coastguard Worker                             const TextureInfo&,
72*c8dee2aaSAndroid Build Coastguard Worker                             ResourceType,
73*c8dee2aaSAndroid Build Coastguard Worker                             Shareable,
74*c8dee2aaSAndroid Build Coastguard Worker                             GraphiteResourceKey*) const override;
75*c8dee2aaSAndroid Build Coastguard Worker     uint32_t getRenderPassDescKeyForPipeline(const RenderPassDesc& renderPassDesc) const;
76*c8dee2aaSAndroid Build Coastguard Worker 
supportsCommandBufferTimestamps()77*c8dee2aaSAndroid Build Coastguard Worker     bool supportsCommandBufferTimestamps() const { return fSupportsCommandBufferTimestamps; }
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker private:
80*c8dee2aaSAndroid Build Coastguard Worker     const ColorTypeInfo* getColorTypeInfo(SkColorType, const TextureInfo&) const override;
81*c8dee2aaSAndroid Build Coastguard Worker     bool onIsTexturable(const TextureInfo&) const override;
82*c8dee2aaSAndroid Build Coastguard Worker     bool supportsWritePixels(const TextureInfo& textureInfo) const override;
83*c8dee2aaSAndroid Build Coastguard Worker     bool supportsReadPixels(const TextureInfo& textureInfo) const override;
84*c8dee2aaSAndroid Build Coastguard Worker     std::pair<SkColorType, bool /*isRGBFormat*/> supportedWritePixelsColorType(
85*c8dee2aaSAndroid Build Coastguard Worker             SkColorType dstColorType,
86*c8dee2aaSAndroid Build Coastguard Worker             const TextureInfo& dstTextureInfo,
87*c8dee2aaSAndroid Build Coastguard Worker             SkColorType srcColorType) const override;
88*c8dee2aaSAndroid Build Coastguard Worker     std::pair<SkColorType, bool /*isRGBFormat*/> supportedReadPixelsColorType(
89*c8dee2aaSAndroid Build Coastguard Worker             SkColorType srcColorType,
90*c8dee2aaSAndroid Build Coastguard Worker             const TextureInfo& srcTextureInfo,
91*c8dee2aaSAndroid Build Coastguard Worker             SkColorType dstColorType) const override;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     void initCaps(const DawnBackendContext& backendContext, const ContextOptions& options);
94*c8dee2aaSAndroid Build Coastguard Worker     void initShaderCaps(const wgpu::Device& device);
95*c8dee2aaSAndroid Build Coastguard Worker     void initFormatTable(const wgpu::Device& device);
96*c8dee2aaSAndroid Build Coastguard Worker 
getFormatFromColorType(SkColorType colorType)97*c8dee2aaSAndroid Build Coastguard Worker     wgpu::TextureFormat getFormatFromColorType(SkColorType colorType) const {
98*c8dee2aaSAndroid Build Coastguard Worker         int idx = static_cast<int>(colorType);
99*c8dee2aaSAndroid Build Coastguard Worker         return fColorTypeToFormatTable[idx];
100*c8dee2aaSAndroid Build Coastguard Worker     }
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker     uint32_t maxRenderTargetSampleCount(wgpu::TextureFormat format) const;
103*c8dee2aaSAndroid Build Coastguard Worker     bool isTexturable(wgpu::TextureFormat format) const;
104*c8dee2aaSAndroid Build Coastguard Worker     bool isRenderable(wgpu::TextureFormat format, uint32_t numSamples) const;
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     struct FormatInfo {
colorTypeFlagsFormatInfo107*c8dee2aaSAndroid Build Coastguard Worker         uint32_t colorTypeFlags(SkColorType colorType) const {
108*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
109*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == colorType) {
110*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].fFlags;
111*c8dee2aaSAndroid Build Coastguard Worker                 }
112*c8dee2aaSAndroid Build Coastguard Worker             }
113*c8dee2aaSAndroid Build Coastguard Worker             return 0;
114*c8dee2aaSAndroid Build Coastguard Worker         }
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker         enum {
117*c8dee2aaSAndroid Build Coastguard Worker             kTexturable_Flag  = 0x01,
118*c8dee2aaSAndroid Build Coastguard Worker             kRenderable_Flag  = 0x02, // Color attachment and blendable
119*c8dee2aaSAndroid Build Coastguard Worker             kMSAA_Flag        = 0x04,
120*c8dee2aaSAndroid Build Coastguard Worker             kResolve_Flag     = 0x08,
121*c8dee2aaSAndroid Build Coastguard Worker             kStorage_Flag     = 0x10,
122*c8dee2aaSAndroid Build Coastguard Worker         };
123*c8dee2aaSAndroid Build Coastguard Worker         static const uint16_t kAllFlags =
124*c8dee2aaSAndroid Build Coastguard Worker                 kTexturable_Flag | kRenderable_Flag | kMSAA_Flag | kResolve_Flag | kStorage_Flag;
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker         uint16_t fFlags = 0;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos;
129*c8dee2aaSAndroid Build Coastguard Worker         int fColorTypeInfoCount = 0;
130*c8dee2aaSAndroid Build Coastguard Worker     };
131*c8dee2aaSAndroid Build Coastguard Worker     // Size here must be at least the size of kFormats in DawnCaps.cpp.
132*c8dee2aaSAndroid Build Coastguard Worker     static constexpr size_t kFormatCount = 17;
133*c8dee2aaSAndroid Build Coastguard Worker     std::array<FormatInfo, kFormatCount> fFormatTable;
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker     static size_t GetFormatIndex(wgpu::TextureFormat format);
getFormatInfo(wgpu::TextureFormat format)136*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& getFormatInfo(wgpu::TextureFormat format) const {
137*c8dee2aaSAndroid Build Coastguard Worker         size_t index = GetFormatIndex(format);
138*c8dee2aaSAndroid Build Coastguard Worker         return fFormatTable[index];
139*c8dee2aaSAndroid Build Coastguard Worker     }
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker     wgpu::TextureFormat fColorTypeToFormatTable[kSkColorTypeCnt];
142*c8dee2aaSAndroid Build Coastguard Worker     void setColorType(SkColorType, std::initializer_list<wgpu::TextureFormat> formats);
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker     // When supported, this value will hold the TransientAttachment usage symbol that is only
145*c8dee2aaSAndroid Build Coastguard Worker     // defined in Dawn native builds and not EMSCRIPTEN but this avoids having to #define guard it.
146*c8dee2aaSAndroid Build Coastguard Worker     wgpu::TextureUsage fSupportedTransientAttachmentUsage = wgpu::TextureUsage::None;
147*c8dee2aaSAndroid Build Coastguard Worker     // When supported this holds the ExpandResolveTexture load op, otherwise holds no value.
148*c8dee2aaSAndroid Build Coastguard Worker     std::optional<wgpu::LoadOp> fSupportedResolveTextureLoadOp;
149*c8dee2aaSAndroid Build Coastguard Worker     // When 'fSupportedResolveTextureLoadOp' is supported, it by default performs full size expand
150*c8dee2aaSAndroid Build Coastguard Worker     // and resolve. With this feature, we can do that partially according to the actual damage
151*c8dee2aaSAndroid Build Coastguard Worker     // region.
152*c8dee2aaSAndroid Build Coastguard Worker     bool fSupportsPartialLoadResolve = false;
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker     bool fUseAsyncPipelineCreation = true;
155*c8dee2aaSAndroid Build Coastguard Worker     bool fAllowScopedErrorChecks = true;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     bool fSupportsCommandBufferTimestamps = false;
158*c8dee2aaSAndroid Build Coastguard Worker };
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_DawnCaps_DEFINED
163