xref: /aosp_15_r20/external/skia/src/gpu/ganesh/d3d/GrD3DCaps.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 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 GrD3DCaps_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrD3DCaps_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/d3d/GrD3DTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DAttachment.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType;
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker /**
20*c8dee2aaSAndroid Build Coastguard Worker  * Stores some capabilities of a D3D backend.
21*c8dee2aaSAndroid Build Coastguard Worker  */
22*c8dee2aaSAndroid Build Coastguard Worker class GrD3DCaps : public GrCaps {
23*c8dee2aaSAndroid Build Coastguard Worker public:
24*c8dee2aaSAndroid Build Coastguard Worker     /**
25*c8dee2aaSAndroid Build Coastguard Worker      * Creates a GrD3DCaps that is set such that nothing is supported. The init function should
26*c8dee2aaSAndroid Build Coastguard Worker      * be called to fill out the caps.
27*c8dee2aaSAndroid Build Coastguard Worker      */
28*c8dee2aaSAndroid Build Coastguard Worker     GrD3DCaps(const GrContextOptions& contextOptions, IDXGIAdapter1*, ID3D12Device*);
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatSRGB(const GrBackendFormat&) const override;
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatTexturable(const GrBackendFormat&, GrTextureType) const override;
33*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatTexturable(DXGI_FORMAT) const;
34*c8dee2aaSAndroid Build Coastguard Worker 
isFormatCopyable(const GrBackendFormat &)35*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatCopyable(const GrBackendFormat&) const override { return true; }
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format,
38*c8dee2aaSAndroid Build Coastguard Worker                                        int sampleCount = 1) const override;
39*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatRenderable(const GrBackendFormat& format, int sampleCount) const override;
40*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatRenderable(DXGI_FORMAT, int sampleCount) const;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatUnorderedAccessible(DXGI_FORMAT) const;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     int getRenderTargetSampleCount(int requestedCount, const GrBackendFormat&) const override;
45*c8dee2aaSAndroid Build Coastguard Worker     int getRenderTargetSampleCount(int requestedCount, DXGI_FORMAT) const;
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     int maxRenderTargetSampleCount(const GrBackendFormat&) const override;
48*c8dee2aaSAndroid Build Coastguard Worker     int maxRenderTargetSampleCount(DXGI_FORMAT) const;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     GrColorType getFormatColorType(DXGI_FORMAT) const;
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     SupportedWrite supportedWritePixelsColorType(GrColorType surfaceColorType,
53*c8dee2aaSAndroid Build Coastguard Worker                                                  const GrBackendFormat& surfaceFormat,
54*c8dee2aaSAndroid Build Coastguard Worker                                                  GrColorType srcColorType) const override;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     SurfaceReadPixelsSupport surfaceSupportsReadPixels(const GrSurface*) const override;
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     /**
59*c8dee2aaSAndroid Build Coastguard Worker      * Returns both a supported and most preferred stencil format to use in draws.
60*c8dee2aaSAndroid Build Coastguard Worker      */
preferredStencilFormat()61*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT preferredStencilFormat() const {
62*c8dee2aaSAndroid Build Coastguard Worker         return fPreferredStencilFormat;
63*c8dee2aaSAndroid Build Coastguard Worker     }
GetStencilFormatTotalBitCount(DXGI_FORMAT format)64*c8dee2aaSAndroid Build Coastguard Worker     static int GetStencilFormatTotalBitCount(DXGI_FORMAT format) {
65*c8dee2aaSAndroid Build Coastguard Worker         switch (format) {
66*c8dee2aaSAndroid Build Coastguard Worker         case DXGI_FORMAT_D24_UNORM_S8_UINT:
67*c8dee2aaSAndroid Build Coastguard Worker             return 32;
68*c8dee2aaSAndroid Build Coastguard Worker         case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
69*c8dee2aaSAndroid Build Coastguard Worker             // DXGI_FORMAT_D32_FLOAT_S8X24_UINT has 24 unused bits at the end so total bits is 64.
70*c8dee2aaSAndroid Build Coastguard Worker             return 64;
71*c8dee2aaSAndroid Build Coastguard Worker         default:
72*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(false);
73*c8dee2aaSAndroid Build Coastguard Worker             return 0;
74*c8dee2aaSAndroid Build Coastguard Worker         }
75*c8dee2aaSAndroid Build Coastguard Worker     }
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     /**
78*c8dee2aaSAndroid Build Coastguard Worker      * Helpers used by canCopySurface. In all cases if the SampleCnt parameter is zero that means
79*c8dee2aaSAndroid Build Coastguard Worker      * the surface is not a render target, otherwise it is the number of samples in the render
80*c8dee2aaSAndroid Build Coastguard Worker      * target.
81*c8dee2aaSAndroid Build Coastguard Worker      */
82*c8dee2aaSAndroid Build Coastguard Worker     bool canCopyTexture(DXGI_FORMAT dstFormat, int dstSampleCnt,
83*c8dee2aaSAndroid Build Coastguard Worker                         DXGI_FORMAT srcFormat, int srcSamplecnt) const;
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     bool canCopyAsResolve(DXGI_FORMAT dstFormat, int dstSampleCnt,
86*c8dee2aaSAndroid Build Coastguard Worker                           DXGI_FORMAT srcFormat, int srcSamplecnt) const;
87*c8dee2aaSAndroid Build Coastguard Worker 
getBackendFormatFromCompressionType(SkTextureCompressionType)88*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getBackendFormatFromCompressionType(SkTextureCompressionType) const override;
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT getFormatFromColorType(GrColorType colorType) const {
91*c8dee2aaSAndroid Build Coastguard Worker         int idx = static_cast<int>(colorType);
92*c8dee2aaSAndroid Build Coastguard Worker         return fColorTypeToFormatTable[idx];
93*c8dee2aaSAndroid Build Coastguard Worker     }
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle getWriteSwizzle(const GrBackendFormat&, GrColorType) const override;
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     uint64_t computeFormatKey(const GrBackendFormat&) const override;
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     void addExtraSamplerKey(skgpu::KeyBuilder*,
100*c8dee2aaSAndroid Build Coastguard Worker                             GrSamplerState,
101*c8dee2aaSAndroid Build Coastguard Worker                             const GrBackendFormat&) const override;
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker     GrProgramDesc makeDesc(GrRenderTarget*,
104*c8dee2aaSAndroid Build Coastguard Worker                            const GrProgramInfo&,
105*c8dee2aaSAndroid Build Coastguard Worker                            ProgramDescOverrideFlags) const override;
106*c8dee2aaSAndroid Build Coastguard Worker 
resolveSubresourceRegionSupport()107*c8dee2aaSAndroid Build Coastguard Worker     bool resolveSubresourceRegionSupport() const { return fResolveSubresourceRegionSupport; }
standardSwizzleLayoutSupport()108*c8dee2aaSAndroid Build Coastguard Worker     bool standardSwizzleLayoutSupport() const { return fStandardSwizzleLayoutSupport; }
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
111*c8dee2aaSAndroid Build Coastguard Worker     std::vector<GrTest::TestFormatColorTypeCombination> getTestingCombinations() const override;
112*c8dee2aaSAndroid Build Coastguard Worker #endif
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker private:
115*c8dee2aaSAndroid Build Coastguard Worker     enum D3DVendor {
116*c8dee2aaSAndroid Build Coastguard Worker         kAMD_D3DVendor = 0x1002,
117*c8dee2aaSAndroid Build Coastguard Worker         kARM_D3DVendor = 0x13B5,
118*c8dee2aaSAndroid Build Coastguard Worker         kImagination_D3DVendor = 0x1010,
119*c8dee2aaSAndroid Build Coastguard Worker         kIntel_D3DVendor = 0x8086,
120*c8dee2aaSAndroid Build Coastguard Worker         kNVIDIA_D3DVendor = 0x10DE,
121*c8dee2aaSAndroid Build Coastguard Worker         kQualcomm_D3DVendor = 0x5143,
122*c8dee2aaSAndroid Build Coastguard Worker     };
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker     void init(const GrContextOptions& contextOptions, IDXGIAdapter1*, ID3D12Device*);
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     void initGrCaps(const D3D12_FEATURE_DATA_D3D12_OPTIONS&,
127*c8dee2aaSAndroid Build Coastguard Worker                     ID3D12Device*);
128*c8dee2aaSAndroid Build Coastguard Worker     void initShaderCaps(int vendorID, const D3D12_FEATURE_DATA_D3D12_OPTIONS& optionsDesc);
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker     void initFormatTable(const DXGI_ADAPTER_DESC&, ID3D12Device*);
131*c8dee2aaSAndroid Build Coastguard Worker     void initStencilFormat(ID3D12Device*);
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker     void applyDriverCorrectnessWorkarounds(int vendorID);
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker     bool onSurfaceSupportsWritePixels(const GrSurface*) const override;
136*c8dee2aaSAndroid Build Coastguard Worker     bool onCanCopySurface(const GrSurfaceProxy* dst, const SkIRect& dstRect,
137*c8dee2aaSAndroid Build Coastguard Worker                           const GrSurfaceProxy* src, const SkIRect& srcRect) const override;
138*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat onGetDefaultBackendFormat(GrColorType) const override;
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     bool onAreColorTypeAndFormatCompatible(GrColorType, const GrBackendFormat&) const override;
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     SupportedRead onSupportedReadPixelsColorType(GrColorType, const GrBackendFormat&,
143*c8dee2aaSAndroid Build Coastguard Worker                                                  GrColorType) const override;
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle onGetReadSwizzle(const GrBackendFormat&, GrColorType) const override;
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker     // ColorTypeInfo for a specific format
148*c8dee2aaSAndroid Build Coastguard Worker     struct ColorTypeInfo {
149*c8dee2aaSAndroid Build Coastguard Worker         GrColorType fColorType = GrColorType::kUnknown;
150*c8dee2aaSAndroid Build Coastguard Worker         enum {
151*c8dee2aaSAndroid Build Coastguard Worker             kUploadData_Flag = 0x1,
152*c8dee2aaSAndroid Build Coastguard Worker             // Does Ganesh itself support rendering to this colorType & format pair. Renderability
153*c8dee2aaSAndroid Build Coastguard Worker             // still additionally depends on if the format itself is renderable.
154*c8dee2aaSAndroid Build Coastguard Worker             kRenderable_Flag = 0x2,
155*c8dee2aaSAndroid Build Coastguard Worker             // Indicates that this colorType is supported only if we are wrapping a texture with
156*c8dee2aaSAndroid Build Coastguard Worker             // the given format and colorType. We do not allow creation with this pair.
157*c8dee2aaSAndroid Build Coastguard Worker             kWrappedOnly_Flag = 0x4,
158*c8dee2aaSAndroid Build Coastguard Worker         };
159*c8dee2aaSAndroid Build Coastguard Worker         uint32_t fFlags = 0;
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Swizzle fReadSwizzle;
162*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Swizzle fWriteSwizzle;
163*c8dee2aaSAndroid Build Coastguard Worker     };
164*c8dee2aaSAndroid Build Coastguard Worker 
165*c8dee2aaSAndroid Build Coastguard Worker     struct FormatInfo {
colorTypeFlagsFormatInfo166*c8dee2aaSAndroid Build Coastguard Worker         uint32_t colorTypeFlags(GrColorType colorType) const {
167*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
168*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == colorType) {
169*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].fFlags;
170*c8dee2aaSAndroid Build Coastguard Worker                 }
171*c8dee2aaSAndroid Build Coastguard Worker             }
172*c8dee2aaSAndroid Build Coastguard Worker             return 0;
173*c8dee2aaSAndroid Build Coastguard Worker         }
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker         void init(const DXGI_ADAPTER_DESC&, ID3D12Device*, DXGI_FORMAT);
176*c8dee2aaSAndroid Build Coastguard Worker         static void InitFormatFlags(const D3D12_FEATURE_DATA_FORMAT_SUPPORT&, uint16_t* flags);
177*c8dee2aaSAndroid Build Coastguard Worker         void initSampleCounts(const DXGI_ADAPTER_DESC& adapterDesc, ID3D12Device*, DXGI_FORMAT);
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker         enum {
180*c8dee2aaSAndroid Build Coastguard Worker             kTexturable_Flag = 0x1, // Can be sampled in a shader
181*c8dee2aaSAndroid Build Coastguard Worker             kRenderable_Flag = 0x2, // Rendertarget and blendable
182*c8dee2aaSAndroid Build Coastguard Worker             kMSAA_Flag = 0x4,
183*c8dee2aaSAndroid Build Coastguard Worker             kResolve_Flag = 0x8,
184*c8dee2aaSAndroid Build Coastguard Worker             kUnorderedAccess_Flag = 0x10,
185*c8dee2aaSAndroid Build Coastguard Worker         };
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker         uint16_t fFlags = 0;
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker         SkTDArray<int> fColorSampleCounts;
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker         // This GrColorType represents how the actually GPU format lays out its memory. This is used
192*c8dee2aaSAndroid Build Coastguard Worker         // for uploading data to backend textures to make sure we've arranged the memory in the
193*c8dee2aaSAndroid Build Coastguard Worker         // correct order.
194*c8dee2aaSAndroid Build Coastguard Worker         GrColorType fFormatColorType = GrColorType::kUnknown;
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos;
197*c8dee2aaSAndroid Build Coastguard Worker         int fColorTypeInfoCount = 0;
198*c8dee2aaSAndroid Build Coastguard Worker     };
199*c8dee2aaSAndroid Build Coastguard Worker     static constexpr size_t kNumDxgiFormats = 15;
200*c8dee2aaSAndroid Build Coastguard Worker     FormatInfo fFormatTable[kNumDxgiFormats];
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     FormatInfo& getFormatInfo(DXGI_FORMAT);
203*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& getFormatInfo(DXGI_FORMAT) const;
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT fColorTypeToFormatTable[kGrColorTypeCnt];
206*c8dee2aaSAndroid Build Coastguard Worker     void setColorType(GrColorType, std::initializer_list<DXGI_FORMAT> formats);
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker     int fMaxPerStageShaderResourceViews;
209*c8dee2aaSAndroid Build Coastguard Worker     int fMaxPerStageUnorderedAccessViews;
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT fPreferredStencilFormat;
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     bool fResolveSubresourceRegionSupport : 1;
214*c8dee2aaSAndroid Build Coastguard Worker     bool fStandardSwizzleLayoutSupport : 1;
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrCaps;
217*c8dee2aaSAndroid Build Coastguard Worker };
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker #endif
220