xref: /aosp_15_r20/external/skia/src/gpu/ganesh/d3d/GrD3DCaps.cpp (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 #include "src/gpu/ganesh/d3d/GrD3DCaps.h"
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/d3d/GrD3DBackendContext.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/d3d/GrD3DTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCompressedDataUtils.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/KeyBuilder.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendUtils.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramDesc.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrStencilSettings.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/TestFormatColorTypeCombination.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DGpu.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DRenderTarget.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DTexture.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DUtil.h"
27*c8dee2aaSAndroid Build Coastguard Worker 
GrD3DCaps(const GrContextOptions & contextOptions,IDXGIAdapter1 * adapter,ID3D12Device * device)28*c8dee2aaSAndroid Build Coastguard Worker GrD3DCaps::GrD3DCaps(const GrContextOptions& contextOptions, IDXGIAdapter1* adapter,
29*c8dee2aaSAndroid Build Coastguard Worker                      ID3D12Device* device)
30*c8dee2aaSAndroid Build Coastguard Worker         : INHERITED(contextOptions) {
31*c8dee2aaSAndroid Build Coastguard Worker     /**************************************************************************
32*c8dee2aaSAndroid Build Coastguard Worker      * GrCaps fields
33*c8dee2aaSAndroid Build Coastguard Worker      **************************************************************************/
34*c8dee2aaSAndroid Build Coastguard Worker     fNPOTTextureTileSupport = true;  // available in feature level 10_0 and up
35*c8dee2aaSAndroid Build Coastguard Worker     fMipmapSupport = true;   // always available in Direct3D
36*c8dee2aaSAndroid Build Coastguard Worker     fAnisoSupport = true;   // always available in Direct3D
37*c8dee2aaSAndroid Build Coastguard Worker     fReuseScratchTextures = true; //TODO: figure this out
38*c8dee2aaSAndroid Build Coastguard Worker     fGpuTracingSupport = false; //TODO: figure this out
39*c8dee2aaSAndroid Build Coastguard Worker     fOversizedStencilSupport = false; //TODO: figure this out
40*c8dee2aaSAndroid Build Coastguard Worker     fDrawInstancedSupport = true;
41*c8dee2aaSAndroid Build Coastguard Worker     fNativeDrawIndirectSupport = true;
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker     fSemaphoreSupport = true;
44*c8dee2aaSAndroid Build Coastguard Worker     fBackendSemaphoreSupport = true;
45*c8dee2aaSAndroid Build Coastguard Worker     fFinishedProcAsyncCallbackSupport = true;
46*c8dee2aaSAndroid Build Coastguard Worker     // TODO: implement these
47*c8dee2aaSAndroid Build Coastguard Worker     fCrossContextTextureSupport = false;
48*c8dee2aaSAndroid Build Coastguard Worker     fHalfFloatVertexAttributeSupport = false;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     // We always copy in/out of a transfer buffer so it's trivial to support row bytes.
51*c8dee2aaSAndroid Build Coastguard Worker     fReadPixelsRowBytesSupport = true;
52*c8dee2aaSAndroid Build Coastguard Worker     fWritePixelsRowBytesSupport = true;
53*c8dee2aaSAndroid Build Coastguard Worker     fTransferPixelsToRowBytesSupport = true;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     fTransferFromBufferToTextureSupport = true;
56*c8dee2aaSAndroid Build Coastguard Worker     fTransferFromSurfaceToBufferSupport = true;
57*c8dee2aaSAndroid Build Coastguard Worker     fTransferFromBufferToBufferSupport  = true;
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker     fMaxRenderTargetSize = 16384;  // minimum required by feature level 11_0
60*c8dee2aaSAndroid Build Coastguard Worker     fMaxTextureSize = 16384;       // minimum required by feature level 11_0
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     fTransferBufferRowBytesAlignment = D3D12_TEXTURE_DATA_PITCH_ALIGNMENT;
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     // TODO: implement
65*c8dee2aaSAndroid Build Coastguard Worker     fDynamicStateArrayGeometryProcessorTextureSupport = false;
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     fShaderCaps = std::make_unique<GrShaderCaps>();
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     this->init(contextOptions, adapter, device);
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker 
canCopyTexture(DXGI_FORMAT dstFormat,int dstSampleCnt,DXGI_FORMAT srcFormat,int srcSampleCnt) const72*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::canCopyTexture(DXGI_FORMAT dstFormat, int dstSampleCnt,
73*c8dee2aaSAndroid Build Coastguard Worker                                DXGI_FORMAT srcFormat, int srcSampleCnt) const {
74*c8dee2aaSAndroid Build Coastguard Worker     if ((dstSampleCnt > 1 || srcSampleCnt > 1) && dstSampleCnt != srcSampleCnt) {
75*c8dee2aaSAndroid Build Coastguard Worker         return false;
76*c8dee2aaSAndroid Build Coastguard Worker     }
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     // D3D allows us to copy within the same format family but doesn't do conversions
79*c8dee2aaSAndroid Build Coastguard Worker     // so we require strict identity.
80*c8dee2aaSAndroid Build Coastguard Worker     return srcFormat == dstFormat;
81*c8dee2aaSAndroid Build Coastguard Worker }
82*c8dee2aaSAndroid Build Coastguard Worker 
canCopyAsResolve(DXGI_FORMAT dstFormat,int dstSampleCnt,DXGI_FORMAT srcFormat,int srcSampleCnt) const83*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::canCopyAsResolve(DXGI_FORMAT dstFormat, int dstSampleCnt,
84*c8dee2aaSAndroid Build Coastguard Worker                                  DXGI_FORMAT srcFormat, int srcSampleCnt) const {
85*c8dee2aaSAndroid Build Coastguard Worker     // The src surface must be multisampled.
86*c8dee2aaSAndroid Build Coastguard Worker     if (srcSampleCnt <= 1) {
87*c8dee2aaSAndroid Build Coastguard Worker         return false;
88*c8dee2aaSAndroid Build Coastguard Worker     }
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker     // The dst must not be multisampled.
91*c8dee2aaSAndroid Build Coastguard Worker     if (dstSampleCnt > 1) {
92*c8dee2aaSAndroid Build Coastguard Worker         return false;
93*c8dee2aaSAndroid Build Coastguard Worker     }
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     // Surfaces must have the same format.
96*c8dee2aaSAndroid Build Coastguard Worker     // D3D12 can resolve between typeless and non-typeless formats, but we are not using
97*c8dee2aaSAndroid Build Coastguard Worker     // typeless formats. It's not possible to resolve within the same format family otherwise.
98*c8dee2aaSAndroid Build Coastguard Worker     if (srcFormat != dstFormat) {
99*c8dee2aaSAndroid Build Coastguard Worker         return false;
100*c8dee2aaSAndroid Build Coastguard Worker     }
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker     return true;
103*c8dee2aaSAndroid Build Coastguard Worker }
104*c8dee2aaSAndroid Build Coastguard Worker 
onCanCopySurface(const GrSurfaceProxy * dst,const SkIRect & dstRect,const GrSurfaceProxy * src,const SkIRect & srcRect) const105*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::onCanCopySurface(const GrSurfaceProxy* dst, const SkIRect& dstRect,
106*c8dee2aaSAndroid Build Coastguard Worker                                  const GrSurfaceProxy* src, const SkIRect& srcRect) const {
107*c8dee2aaSAndroid Build Coastguard Worker     // D3D12 does not support scaling copies
108*c8dee2aaSAndroid Build Coastguard Worker     if (srcRect.size() != dstRect.size()) {
109*c8dee2aaSAndroid Build Coastguard Worker         return false;
110*c8dee2aaSAndroid Build Coastguard Worker     }
111*c8dee2aaSAndroid Build Coastguard Worker     if (src->isProtected() == GrProtected::kYes && dst->isProtected() != GrProtected::kYes) {
112*c8dee2aaSAndroid Build Coastguard Worker         return false;
113*c8dee2aaSAndroid Build Coastguard Worker     }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     int dstSampleCnt = 0;
116*c8dee2aaSAndroid Build Coastguard Worker     int srcSampleCnt = 0;
117*c8dee2aaSAndroid Build Coastguard Worker     if (const GrRenderTargetProxy* rtProxy = dst->asRenderTargetProxy()) {
118*c8dee2aaSAndroid Build Coastguard Worker         dstSampleCnt = rtProxy->numSamples();
119*c8dee2aaSAndroid Build Coastguard Worker     }
120*c8dee2aaSAndroid Build Coastguard Worker     if (const GrRenderTargetProxy* rtProxy = src->asRenderTargetProxy()) {
121*c8dee2aaSAndroid Build Coastguard Worker         srcSampleCnt = rtProxy->numSamples();
122*c8dee2aaSAndroid Build Coastguard Worker     }
123*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT((dstSampleCnt > 0) == SkToBool(dst->asRenderTargetProxy()));
124*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT((srcSampleCnt > 0) == SkToBool(src->asRenderTargetProxy()));
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dstFormat, srcFormat;
127*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(dst->backendFormat().asDxgiFormat(&dstFormat));
128*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(src->backendFormat().asDxgiFormat(&srcFormat));
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker     return this->canCopyTexture(dstFormat, dstSampleCnt, srcFormat, srcSampleCnt) ||
131*c8dee2aaSAndroid Build Coastguard Worker            this->canCopyAsResolve(dstFormat, dstSampleCnt, srcFormat, srcSampleCnt);
132*c8dee2aaSAndroid Build Coastguard Worker }
133*c8dee2aaSAndroid Build Coastguard Worker 
init(const GrContextOptions & contextOptions,IDXGIAdapter1 * adapter,ID3D12Device * device)134*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::init(const GrContextOptions& contextOptions, IDXGIAdapter1* adapter,
135*c8dee2aaSAndroid Build Coastguard Worker                      ID3D12Device* device) {
136*c8dee2aaSAndroid Build Coastguard Worker     D3D_FEATURE_LEVEL featureLevels[] = {
137*c8dee2aaSAndroid Build Coastguard Worker         D3D_FEATURE_LEVEL_11_0,
138*c8dee2aaSAndroid Build Coastguard Worker         D3D_FEATURE_LEVEL_11_1,
139*c8dee2aaSAndroid Build Coastguard Worker         D3D_FEATURE_LEVEL_12_0,
140*c8dee2aaSAndroid Build Coastguard Worker         D3D_FEATURE_LEVEL_12_1,
141*c8dee2aaSAndroid Build Coastguard Worker     };
142*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_FEATURE_LEVELS flDesc = {};
143*c8dee2aaSAndroid Build Coastguard Worker     flDesc.NumFeatureLevels = _countof(featureLevels);
144*c8dee2aaSAndroid Build Coastguard Worker     flDesc.pFeatureLevelsRequested = featureLevels;
145*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &flDesc,
146*c8dee2aaSAndroid Build Coastguard Worker                                                      sizeof(flDesc)));
147*c8dee2aaSAndroid Build Coastguard Worker     // This had better be true
148*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(flDesc.MaxSupportedFeatureLevel >= D3D_FEATURE_LEVEL_11_0);
149*c8dee2aaSAndroid Build Coastguard Worker 
150*c8dee2aaSAndroid Build Coastguard Worker     DXGI_ADAPTER_DESC adapterDesc;
151*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(adapter->GetDesc(&adapterDesc));
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_D3D12_OPTIONS optionsDesc;
154*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &optionsDesc,
155*c8dee2aaSAndroid Build Coastguard Worker                                                      sizeof(optionsDesc)));
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker     // See https://docs.microsoft.com/en-us/windows/win32/direct3d12/hardware-support
159*c8dee2aaSAndroid Build Coastguard Worker     if (D3D12_RESOURCE_BINDING_TIER_1 == optionsDesc.ResourceBindingTier) {
160*c8dee2aaSAndroid Build Coastguard Worker         fMaxPerStageShaderResourceViews = 128;
161*c8dee2aaSAndroid Build Coastguard Worker         if (D3D_FEATURE_LEVEL_11_0 == flDesc.MaxSupportedFeatureLevel) {
162*c8dee2aaSAndroid Build Coastguard Worker             fMaxPerStageUnorderedAccessViews = 8;
163*c8dee2aaSAndroid Build Coastguard Worker         } else {
164*c8dee2aaSAndroid Build Coastguard Worker             fMaxPerStageUnorderedAccessViews = 64;
165*c8dee2aaSAndroid Build Coastguard Worker         }
166*c8dee2aaSAndroid Build Coastguard Worker     } else {
167*c8dee2aaSAndroid Build Coastguard Worker         // The doc above says "full heap", but practically it seems like it should be
168*c8dee2aaSAndroid Build Coastguard Worker         // limited by the maximum number of samplers in a heap
169*c8dee2aaSAndroid Build Coastguard Worker         fMaxPerStageUnorderedAccessViews = 2032;
170*c8dee2aaSAndroid Build Coastguard Worker         fMaxPerStageShaderResourceViews = 2032;
171*c8dee2aaSAndroid Build Coastguard Worker     }
172*c8dee2aaSAndroid Build Coastguard Worker 
173*c8dee2aaSAndroid Build Coastguard Worker     fStandardSwizzleLayoutSupport = (optionsDesc.StandardSwizzle64KBSupported);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_D3D12_OPTIONS2 optionsDesc2;
176*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &optionsDesc2,
177*c8dee2aaSAndroid Build Coastguard Worker                                                      sizeof(optionsDesc2)));
178*c8dee2aaSAndroid Build Coastguard Worker     fResolveSubresourceRegionSupport = (optionsDesc2.ProgrammableSamplePositionsTier !=
179*c8dee2aaSAndroid Build Coastguard Worker                                         D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_NOT_SUPPORTED);
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker     this->initGrCaps(optionsDesc, device);
182*c8dee2aaSAndroid Build Coastguard Worker     this->initShaderCaps(adapterDesc.VendorId, optionsDesc);
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker     this->initFormatTable(adapterDesc, device);
185*c8dee2aaSAndroid Build Coastguard Worker     this->initStencilFormat(device);
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     if (!contextOptions.fDisableDriverCorrectnessWorkarounds) {
188*c8dee2aaSAndroid Build Coastguard Worker         this->applyDriverCorrectnessWorkarounds(adapterDesc.VendorId);
189*c8dee2aaSAndroid Build Coastguard Worker     }
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker     this->finishInitialization(contextOptions);
192*c8dee2aaSAndroid Build Coastguard Worker }
193*c8dee2aaSAndroid Build Coastguard Worker 
initGrCaps(const D3D12_FEATURE_DATA_D3D12_OPTIONS & optionsDesc,ID3D12Device * device)194*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::initGrCaps(const D3D12_FEATURE_DATA_D3D12_OPTIONS& optionsDesc,
195*c8dee2aaSAndroid Build Coastguard Worker                            ID3D12Device* device) {
196*c8dee2aaSAndroid Build Coastguard Worker     // We assume a minimum of Shader Model 5.1, which allows at most 32 vertex inputs.
197*c8dee2aaSAndroid Build Coastguard Worker     fMaxVertexAttributes = 32;
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker     // Can use standard sample locations
200*c8dee2aaSAndroid Build Coastguard Worker     fSampleLocationsSupport = true;
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     if (D3D12_CONSERVATIVE_RASTERIZATION_TIER_NOT_SUPPORTED !=
203*c8dee2aaSAndroid Build Coastguard Worker             optionsDesc.ConservativeRasterizationTier) {
204*c8dee2aaSAndroid Build Coastguard Worker         fConservativeRasterSupport = true;
205*c8dee2aaSAndroid Build Coastguard Worker     }
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker     fWireframeSupport = true;
208*c8dee2aaSAndroid Build Coastguard Worker 
209*c8dee2aaSAndroid Build Coastguard Worker     // Feature level 11_0 and up support up to 16K in texture dimension
210*c8dee2aaSAndroid Build Coastguard Worker     fMaxTextureSize = 16384;
211*c8dee2aaSAndroid Build Coastguard Worker     // There's no specific cap for RT size, so use texture size
212*c8dee2aaSAndroid Build Coastguard Worker     fMaxRenderTargetSize = fMaxTextureSize;
213*c8dee2aaSAndroid Build Coastguard Worker     // Our render targets are always created with textures as the color
214*c8dee2aaSAndroid Build Coastguard Worker     // attachment, hence this min:
215*c8dee2aaSAndroid Build Coastguard Worker     fMaxRenderTargetSize = fMaxTextureSize;
216*c8dee2aaSAndroid Build Coastguard Worker 
217*c8dee2aaSAndroid Build Coastguard Worker     fMaxPreferredRenderTargetSize = fMaxRenderTargetSize;
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker     // Assuming since we will always map in the end to upload the data we might as well just map
220*c8dee2aaSAndroid Build Coastguard Worker     // from the get go. There is no hard data to suggest this is faster or slower.
221*c8dee2aaSAndroid Build Coastguard Worker     fBufferMapThreshold = 0;
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag | kAsyncRead_MapFlag;
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     fOversizedStencilSupport = true;
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker     fTwoSidedStencilRefsAndMasksMustMatch = true;
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     // Advanced blend modes don't appear to be supported.
230*c8dee2aaSAndroid Build Coastguard Worker }
231*c8dee2aaSAndroid Build Coastguard Worker 
initShaderCaps(int vendorID,const D3D12_FEATURE_DATA_D3D12_OPTIONS & optionsDesc)232*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::initShaderCaps(int vendorID, const D3D12_FEATURE_DATA_D3D12_OPTIONS& optionsDesc) {
233*c8dee2aaSAndroid Build Coastguard Worker     GrShaderCaps* shaderCaps = fShaderCaps.get();
234*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fVersionDeclString = "#version 330\n";
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker     // Shader Model 5 supports all of the following:
237*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fUsesPrecisionModifiers = true;
238*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fFlatInterpolationSupport = true;
239*c8dee2aaSAndroid Build Coastguard Worker     // Flat interpolation appears to be slow on Qualcomm GPUs. This was tested in GL and is assumed
240*c8dee2aaSAndroid Build Coastguard Worker     // to be true with D3D as well.
241*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fPreferFlatInterpolation = kQualcomm_D3DVendor != vendorID;
242*c8dee2aaSAndroid Build Coastguard Worker 
243*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fSampleMaskSupport = true;
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fShaderDerivativeSupport = true;
246*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fExplicitTextureLodSupport = true;
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fDualSourceBlendingSupport = true;
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fIntegerSupport = true;
251*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fNonsquareMatrixSupport = true;
252*c8dee2aaSAndroid Build Coastguard Worker     // TODO(skia:12352) HLSL does not expose asinh/acosh/atanh
253*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fInverseHyperbolicSupport = false;
254*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fVertexIDSupport = true;
255*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fInfinitySupport = true;
256*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fNonconstantArrayIndexSupport = true;
257*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fBitManipulationSupport = true;
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fFloatIs32Bits = true;
260*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fHalfIs32Bits =
261*c8dee2aaSAndroid Build Coastguard Worker         D3D12_SHADER_MIN_PRECISION_SUPPORT_NONE == optionsDesc.MinPrecisionSupport;
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker     // See https://docs.microsoft.com/en-us/windows/win32/direct3d12/hardware-support
264*c8dee2aaSAndroid Build Coastguard Worker     // The maximum number of samplers in a shader-visible descriptor heap is 2048, but
265*c8dee2aaSAndroid Build Coastguard Worker     // 16 of those are reserved for the driver.
266*c8dee2aaSAndroid Build Coastguard Worker     shaderCaps->fMaxFragmentSamplers =
267*c8dee2aaSAndroid Build Coastguard Worker         (D3D12_RESOURCE_BINDING_TIER_1 == optionsDesc.ResourceBindingTier) ? 16 : 2032;
268*c8dee2aaSAndroid Build Coastguard Worker }
269*c8dee2aaSAndroid Build Coastguard Worker 
applyDriverCorrectnessWorkarounds(int vendorID)270*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::applyDriverCorrectnessWorkarounds(int vendorID) {
271*c8dee2aaSAndroid Build Coastguard Worker     // Nothing yet.
272*c8dee2aaSAndroid Build Coastguard Worker }
273*c8dee2aaSAndroid Build Coastguard Worker 
274*c8dee2aaSAndroid Build Coastguard Worker 
stencil_format_supported(ID3D12Device * device,DXGI_FORMAT format)275*c8dee2aaSAndroid Build Coastguard Worker bool stencil_format_supported(ID3D12Device* device, DXGI_FORMAT format) {
276*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_FORMAT_SUPPORT formatSupportDesc;
277*c8dee2aaSAndroid Build Coastguard Worker     formatSupportDesc.Format = format;
278*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT,
279*c8dee2aaSAndroid Build Coastguard Worker                                                      &formatSupportDesc,
280*c8dee2aaSAndroid Build Coastguard Worker                                                      sizeof(formatSupportDesc)));
281*c8dee2aaSAndroid Build Coastguard Worker     return SkToBool(D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL & formatSupportDesc.Support1);
282*c8dee2aaSAndroid Build Coastguard Worker }
283*c8dee2aaSAndroid Build Coastguard Worker 
initStencilFormat(ID3D12Device * device)284*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::initStencilFormat(ID3D12Device* device) {
285*c8dee2aaSAndroid Build Coastguard Worker     if (stencil_format_supported(device, DXGI_FORMAT_D24_UNORM_S8_UINT)) {
286*c8dee2aaSAndroid Build Coastguard Worker         fPreferredStencilFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
287*c8dee2aaSAndroid Build Coastguard Worker     } else {
288*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(stencil_format_supported(device, DXGI_FORMAT_D32_FLOAT_S8X24_UINT));
289*c8dee2aaSAndroid Build Coastguard Worker         fPreferredStencilFormat = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
290*c8dee2aaSAndroid Build Coastguard Worker     }
291*c8dee2aaSAndroid Build Coastguard Worker }
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker // These are all the valid DXGI_FORMATs that we support in Skia. They are roughly ordered from most
294*c8dee2aaSAndroid Build Coastguard Worker // frequently used to least to improve look up times in arrays.
295*c8dee2aaSAndroid Build Coastguard Worker static constexpr DXGI_FORMAT kDxgiFormats[] = {
296*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R8G8B8A8_UNORM,
297*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R8_UNORM,
298*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_B8G8R8A8_UNORM,
299*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_B5G6R5_UNORM,
300*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16G16B16A16_FLOAT,
301*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16_FLOAT,
302*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R8G8_UNORM,
303*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R10G10B10A2_UNORM,
304*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_B4G4R4A4_UNORM,
305*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
306*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_BC1_UNORM,
307*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16_UNORM,
308*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16G16_UNORM,
309*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16G16B16A16_UNORM,
310*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT_R16G16_FLOAT
311*c8dee2aaSAndroid Build Coastguard Worker };
312*c8dee2aaSAndroid Build Coastguard Worker 
setColorType(GrColorType colorType,std::initializer_list<DXGI_FORMAT> formats)313*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::setColorType(GrColorType colorType, std::initializer_list<DXGI_FORMAT> formats) {
314*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
315*c8dee2aaSAndroid Build Coastguard Worker     for (size_t i = 0; i < kNumDxgiFormats; ++i) {
316*c8dee2aaSAndroid Build Coastguard Worker         const auto& formatInfo = fFormatTable[i];
317*c8dee2aaSAndroid Build Coastguard Worker         for (int j = 0; j < formatInfo.fColorTypeInfoCount; ++j) {
318*c8dee2aaSAndroid Build Coastguard Worker             const auto& ctInfo = formatInfo.fColorTypeInfos[j];
319*c8dee2aaSAndroid Build Coastguard Worker             if (ctInfo.fColorType == colorType &&
320*c8dee2aaSAndroid Build Coastguard Worker                 !SkToBool(ctInfo.fFlags & ColorTypeInfo::kWrappedOnly_Flag)) {
321*c8dee2aaSAndroid Build Coastguard Worker                 bool found = false;
322*c8dee2aaSAndroid Build Coastguard Worker                 for (auto it = formats.begin(); it != formats.end(); ++it) {
323*c8dee2aaSAndroid Build Coastguard Worker                     if (kDxgiFormats[i] == *it) {
324*c8dee2aaSAndroid Build Coastguard Worker                         found = true;
325*c8dee2aaSAndroid Build Coastguard Worker                     }
326*c8dee2aaSAndroid Build Coastguard Worker                 }
327*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(found);
328*c8dee2aaSAndroid Build Coastguard Worker             }
329*c8dee2aaSAndroid Build Coastguard Worker         }
330*c8dee2aaSAndroid Build Coastguard Worker     }
331*c8dee2aaSAndroid Build Coastguard Worker #endif
332*c8dee2aaSAndroid Build Coastguard Worker     int idx = static_cast<int>(colorType);
333*c8dee2aaSAndroid Build Coastguard Worker     for (auto it = formats.begin(); it != formats.end(); ++it) {
334*c8dee2aaSAndroid Build Coastguard Worker         const auto& info = this->getFormatInfo(*it);
335*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
336*c8dee2aaSAndroid Build Coastguard Worker             if (info.fColorTypeInfos[i].fColorType == colorType) {
337*c8dee2aaSAndroid Build Coastguard Worker                 fColorTypeToFormatTable[idx] = *it;
338*c8dee2aaSAndroid Build Coastguard Worker                 return;
339*c8dee2aaSAndroid Build Coastguard Worker             }
340*c8dee2aaSAndroid Build Coastguard Worker         }
341*c8dee2aaSAndroid Build Coastguard Worker     }
342*c8dee2aaSAndroid Build Coastguard Worker }
343*c8dee2aaSAndroid Build Coastguard Worker 
getFormatInfo(DXGI_FORMAT format) const344*c8dee2aaSAndroid Build Coastguard Worker const GrD3DCaps::FormatInfo& GrD3DCaps::getFormatInfo(DXGI_FORMAT format) const {
345*c8dee2aaSAndroid Build Coastguard Worker     GrD3DCaps* nonConstThis = const_cast<GrD3DCaps*>(this);
346*c8dee2aaSAndroid Build Coastguard Worker     return nonConstThis->getFormatInfo(format);
347*c8dee2aaSAndroid Build Coastguard Worker }
348*c8dee2aaSAndroid Build Coastguard Worker 
getFormatInfo(DXGI_FORMAT format)349*c8dee2aaSAndroid Build Coastguard Worker GrD3DCaps::FormatInfo& GrD3DCaps::getFormatInfo(DXGI_FORMAT format) {
350*c8dee2aaSAndroid Build Coastguard Worker     static_assert(std::size(kDxgiFormats) == GrD3DCaps::kNumDxgiFormats,
351*c8dee2aaSAndroid Build Coastguard Worker                   "Size of DXGI_FORMATs array must match static value in header");
352*c8dee2aaSAndroid Build Coastguard Worker     for (size_t i = 0; i < std::size(kDxgiFormats); ++i) {
353*c8dee2aaSAndroid Build Coastguard Worker         if (kDxgiFormats[i] == format) {
354*c8dee2aaSAndroid Build Coastguard Worker             return fFormatTable[i];
355*c8dee2aaSAndroid Build Coastguard Worker         }
356*c8dee2aaSAndroid Build Coastguard Worker     }
357*c8dee2aaSAndroid Build Coastguard Worker     static FormatInfo kInvalidFormat;
358*c8dee2aaSAndroid Build Coastguard Worker     return kInvalidFormat;
359*c8dee2aaSAndroid Build Coastguard Worker }
360*c8dee2aaSAndroid Build Coastguard Worker 
initFormatTable(const DXGI_ADAPTER_DESC & adapterDesc,ID3D12Device * device)361*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::initFormatTable(const DXGI_ADAPTER_DESC& adapterDesc, ID3D12Device* device) {
362*c8dee2aaSAndroid Build Coastguard Worker     static_assert(std::size(kDxgiFormats) == GrD3DCaps::kNumDxgiFormats,
363*c8dee2aaSAndroid Build Coastguard Worker                   "Size of DXGI_FORMATs array must match static value in header");
364*c8dee2aaSAndroid Build Coastguard Worker 
365*c8dee2aaSAndroid Build Coastguard Worker     std::fill_n(fColorTypeToFormatTable, kGrColorTypeCnt, DXGI_FORMAT_UNKNOWN);
366*c8dee2aaSAndroid Build Coastguard Worker 
367*c8dee2aaSAndroid Build Coastguard Worker     // Go through all the formats and init their support surface and data GrColorTypes.
368*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R8G8B8A8_UNORM
369*c8dee2aaSAndroid Build Coastguard Worker     {
370*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM;
371*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
372*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
373*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRGBA_8888;
374*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
375*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 2;
376*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
377*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
378*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8G8B8A8_UNORM, Surface: kRGBA_8888
379*c8dee2aaSAndroid Build Coastguard Worker             {
380*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_8888;
381*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
382*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
383*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
384*c8dee2aaSAndroid Build Coastguard Worker             }
385*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8G8B8A8_UNORM, Surface: kRGB_888x
386*c8dee2aaSAndroid Build Coastguard Worker             {
387*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGB_888x;
388*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
389*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
390*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
391*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("rgb1");
392*c8dee2aaSAndroid Build Coastguard Worker             }
393*c8dee2aaSAndroid Build Coastguard Worker         }
394*c8dee2aaSAndroid Build Coastguard Worker     }
395*c8dee2aaSAndroid Build Coastguard Worker 
396*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R8_UNORM
397*c8dee2aaSAndroid Build Coastguard Worker     {
398*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R8_UNORM;
399*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
400*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
401*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kR_8;
402*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
403*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 3;
404*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
405*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
406*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8_UNORM, Surface: kR_8
407*c8dee2aaSAndroid Build Coastguard Worker             {
408*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kR_8;
409*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
410*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
411*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
412*c8dee2aaSAndroid Build Coastguard Worker             }
413*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8_UNORM, Surface: kAlpha_8
414*c8dee2aaSAndroid Build Coastguard Worker             {
415*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kAlpha_8;
416*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
417*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
418*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
419*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("000r");
420*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fWriteSwizzle = skgpu::Swizzle("a000");
421*c8dee2aaSAndroid Build Coastguard Worker             }
422*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8_UNORM, Surface: kGray_8
423*c8dee2aaSAndroid Build Coastguard Worker             {
424*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kGray_8;
425*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
426*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
427*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
428*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("rrr1");
429*c8dee2aaSAndroid Build Coastguard Worker             }
430*c8dee2aaSAndroid Build Coastguard Worker         }
431*c8dee2aaSAndroid Build Coastguard Worker     }
432*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_B8G8R8A8_UNORM
433*c8dee2aaSAndroid Build Coastguard Worker     {
434*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_B8G8R8A8_UNORM;
435*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
436*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
437*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kBGRA_8888;
438*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
439*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
440*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
441*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
442*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_B8G8R8A8_UNORM, Surface: kBGRA_8888
443*c8dee2aaSAndroid Build Coastguard Worker             {
444*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kBGRA_8888;
445*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
446*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
447*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
448*c8dee2aaSAndroid Build Coastguard Worker             }
449*c8dee2aaSAndroid Build Coastguard Worker         }
450*c8dee2aaSAndroid Build Coastguard Worker     }
451*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_B5G6R5_UNORM
452*c8dee2aaSAndroid Build Coastguard Worker     {
453*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_B5G6R5_UNORM;
454*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
455*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
456*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kBGR_565;
457*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
458*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
459*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
460*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
461*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_B5G6R5_UNORM, Surface: kBGR_565
462*c8dee2aaSAndroid Build Coastguard Worker             {
463*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kBGR_565;
464*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
465*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
466*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
467*c8dee2aaSAndroid Build Coastguard Worker             }
468*c8dee2aaSAndroid Build Coastguard Worker         }
469*c8dee2aaSAndroid Build Coastguard Worker     }
470*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16G16B16A16_FLOAT
471*c8dee2aaSAndroid Build Coastguard Worker     {
472*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16G16B16A16_FLOAT;
473*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
474*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
475*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRGBA_F16;
476*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
477*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 3;
478*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
479*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
480*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16B16A16_FLOAT, Surface: GrColorType::kRGBA_F16
481*c8dee2aaSAndroid Build Coastguard Worker             {
482*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_F16;
483*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
484*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
485*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
486*c8dee2aaSAndroid Build Coastguard Worker             }
487*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16B16A16_FLOAT, Surface: GrColorType::kRGBA_F16_Clamped
488*c8dee2aaSAndroid Build Coastguard Worker             {
489*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_F16_Clamped;
490*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
491*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
492*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
493*c8dee2aaSAndroid Build Coastguard Worker             }
494*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16B16A16_FLOAT, Surface: GrColorType::kRGB_F16F16F16x
495*c8dee2aaSAndroid Build Coastguard Worker             {
496*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGB_F16F16F16x;
497*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
498*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
499*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
500*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("rgb1");
501*c8dee2aaSAndroid Build Coastguard Worker             }
502*c8dee2aaSAndroid Build Coastguard Worker         }
503*c8dee2aaSAndroid Build Coastguard Worker     }
504*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16_FLOAT
505*c8dee2aaSAndroid Build Coastguard Worker     {
506*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16_FLOAT;
507*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
508*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
509*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kR_F16;
510*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
511*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
512*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
513*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
514*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16_FLOAT, Surface: kAlpha_F16
515*c8dee2aaSAndroid Build Coastguard Worker             {
516*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kAlpha_F16;
517*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
518*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
519*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
520*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("000r");
521*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fWriteSwizzle = skgpu::Swizzle("a000");
522*c8dee2aaSAndroid Build Coastguard Worker             }
523*c8dee2aaSAndroid Build Coastguard Worker         }
524*c8dee2aaSAndroid Build Coastguard Worker     }
525*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R8G8_UNORM
526*c8dee2aaSAndroid Build Coastguard Worker     {
527*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R8G8_UNORM;
528*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
529*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
530*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRG_88;
531*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
532*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
533*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
534*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
535*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8G8_UNORM, Surface: kRG_88
536*c8dee2aaSAndroid Build Coastguard Worker             {
537*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRG_88;
538*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
539*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
540*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
541*c8dee2aaSAndroid Build Coastguard Worker             }
542*c8dee2aaSAndroid Build Coastguard Worker         }
543*c8dee2aaSAndroid Build Coastguard Worker     }
544*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R10G10B10A2_UNORM
545*c8dee2aaSAndroid Build Coastguard Worker     {
546*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R10G10B10A2_UNORM;
547*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
548*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
549*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRGBA_1010102;
550*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
551*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 2;
552*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
553*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
554*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R10G10B10A2_UNORM, Surface: kRGBA_1010102
555*c8dee2aaSAndroid Build Coastguard Worker             {
556*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_1010102;
557*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
558*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
559*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
560*c8dee2aaSAndroid Build Coastguard Worker             }
561*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R10G10B10A2_UNORM, Surface: kRGB_101010x
562*c8dee2aaSAndroid Build Coastguard Worker             {
563*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGB_101010x;
564*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
565*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
566*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
567*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("rgb1");
568*c8dee2aaSAndroid Build Coastguard Worker             }
569*c8dee2aaSAndroid Build Coastguard Worker         }
570*c8dee2aaSAndroid Build Coastguard Worker     }
571*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_B4G4R4A4_UNORM
572*c8dee2aaSAndroid Build Coastguard Worker     {
573*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_B4G4R4A4_UNORM;
574*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
575*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
576*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kBGRA_4444;
577*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
578*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
579*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
580*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
581*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_B4G4R4A4_UNORM, Surface: kABGR_4444
582*c8dee2aaSAndroid Build Coastguard Worker             {
583*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kABGR_4444;
584*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
585*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
586*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
587*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("argb");
588*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fWriteSwizzle = skgpu::Swizzle("gbar");
589*c8dee2aaSAndroid Build Coastguard Worker             }
590*c8dee2aaSAndroid Build Coastguard Worker         }
591*c8dee2aaSAndroid Build Coastguard Worker     }
592*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
593*c8dee2aaSAndroid Build Coastguard Worker     {
594*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
595*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
596*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
597*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRGBA_8888_SRGB;
598*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
599*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
600*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
601*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
602*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, Surface: kRGBA_8888_SRGB
603*c8dee2aaSAndroid Build Coastguard Worker             {
604*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_8888_SRGB;
605*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
606*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
607*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
608*c8dee2aaSAndroid Build Coastguard Worker             }
609*c8dee2aaSAndroid Build Coastguard Worker         }
610*c8dee2aaSAndroid Build Coastguard Worker     }
611*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16_UNORM
612*c8dee2aaSAndroid Build Coastguard Worker     {
613*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16_UNORM;
614*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
615*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
616*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kR_16;
617*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
618*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
619*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
620*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
621*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16_UNORM, Surface: kAlpha_16
622*c8dee2aaSAndroid Build Coastguard Worker             {
623*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kAlpha_16;
624*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
625*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
626*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
627*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fReadSwizzle = skgpu::Swizzle("000r");
628*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fWriteSwizzle = skgpu::Swizzle("a000");
629*c8dee2aaSAndroid Build Coastguard Worker             }
630*c8dee2aaSAndroid Build Coastguard Worker         }
631*c8dee2aaSAndroid Build Coastguard Worker     }
632*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16G16_UNORM
633*c8dee2aaSAndroid Build Coastguard Worker     {
634*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16G16_UNORM;
635*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
636*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
637*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRG_1616;
638*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
639*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
640*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
641*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
642*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16_UNORM, Surface: kRG_1616
643*c8dee2aaSAndroid Build Coastguard Worker             {
644*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRG_1616;
645*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
646*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
647*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
648*c8dee2aaSAndroid Build Coastguard Worker             }
649*c8dee2aaSAndroid Build Coastguard Worker         }
650*c8dee2aaSAndroid Build Coastguard Worker     }
651*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16G16B16A16_UNORM
652*c8dee2aaSAndroid Build Coastguard Worker     {
653*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16G16B16A16_UNORM;
654*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
655*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
656*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRGBA_16161616;
657*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
658*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
659*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
660*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
661*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16B16A16_UNORM, Surface: kRGBA_16161616
662*c8dee2aaSAndroid Build Coastguard Worker             {
663*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRGBA_16161616;
664*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
665*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
666*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
667*c8dee2aaSAndroid Build Coastguard Worker             }
668*c8dee2aaSAndroid Build Coastguard Worker         }
669*c8dee2aaSAndroid Build Coastguard Worker     }
670*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_R16G16_FLOAT
671*c8dee2aaSAndroid Build Coastguard Worker     {
672*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_R16G16_FLOAT;
673*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
674*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
675*c8dee2aaSAndroid Build Coastguard Worker         info.fFormatColorType = GrColorType::kRG_F16;
676*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(info.fFlags & FormatInfo::kTexturable_Flag)) {
677*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfoCount = 1;
678*c8dee2aaSAndroid Build Coastguard Worker             info.fColorTypeInfos.reset(new ColorTypeInfo[info.fColorTypeInfoCount]());
679*c8dee2aaSAndroid Build Coastguard Worker             int ctIdx = 0;
680*c8dee2aaSAndroid Build Coastguard Worker             // Format: DXGI_FORMAT_R16G16_FLOAT, Surface: kRG_F16
681*c8dee2aaSAndroid Build Coastguard Worker             {
682*c8dee2aaSAndroid Build Coastguard Worker                 constexpr GrColorType ct = GrColorType::kRG_F16;
683*c8dee2aaSAndroid Build Coastguard Worker                 auto& ctInfo = info.fColorTypeInfos[ctIdx++];
684*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fColorType = ct;
685*c8dee2aaSAndroid Build Coastguard Worker                 ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
686*c8dee2aaSAndroid Build Coastguard Worker             }
687*c8dee2aaSAndroid Build Coastguard Worker         }
688*c8dee2aaSAndroid Build Coastguard Worker     }
689*c8dee2aaSAndroid Build Coastguard Worker 
690*c8dee2aaSAndroid Build Coastguard Worker     // Format: DXGI_FORMAT_BC1_UNORM
691*c8dee2aaSAndroid Build Coastguard Worker     {
692*c8dee2aaSAndroid Build Coastguard Worker         constexpr DXGI_FORMAT format = DXGI_FORMAT_BC1_UNORM;
693*c8dee2aaSAndroid Build Coastguard Worker         auto& info = this->getFormatInfo(format);
694*c8dee2aaSAndroid Build Coastguard Worker         info.init(adapterDesc, device, format);
695*c8dee2aaSAndroid Build Coastguard Worker         // No supported GrColorTypes.
696*c8dee2aaSAndroid Build Coastguard Worker     }
697*c8dee2aaSAndroid Build Coastguard Worker 
698*c8dee2aaSAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
699*c8dee2aaSAndroid Build Coastguard Worker     // Map GrColorTypes (used for creating GrSurfaces) to DXGI_FORMATs. The order in which the
700*c8dee2aaSAndroid Build Coastguard Worker     // formats are passed into the setColorType function indicates the priority in selecting which
701*c8dee2aaSAndroid Build Coastguard Worker     // format we use for a given GrcolorType.
702*c8dee2aaSAndroid Build Coastguard Worker 
703*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kAlpha_8, { DXGI_FORMAT_R8_UNORM });
704*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kBGR_565, { DXGI_FORMAT_B5G6R5_UNORM });
705*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kABGR_4444, { DXGI_FORMAT_B4G4R4A4_UNORM });
706*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_8888, { DXGI_FORMAT_R8G8B8A8_UNORM });
707*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_8888_SRGB, { DXGI_FORMAT_R8G8B8A8_UNORM_SRGB });
708*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGB_888x, { DXGI_FORMAT_R8G8B8A8_UNORM });
709*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRG_88, { DXGI_FORMAT_R8G8_UNORM });
710*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kBGRA_8888, { DXGI_FORMAT_B8G8R8A8_UNORM });
711*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_1010102, { DXGI_FORMAT_R10G10B10A2_UNORM });
712*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGB_101010x, { DXGI_FORMAT_R10G10B10A2_UNORM });
713*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kGray_8, { DXGI_FORMAT_R8_UNORM });
714*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kAlpha_F16, { DXGI_FORMAT_R16_FLOAT });
715*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_F16, { DXGI_FORMAT_R16G16B16A16_FLOAT });
716*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_F16_Clamped, { DXGI_FORMAT_R16G16B16A16_FLOAT });
717*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGB_F16F16F16x, { DXGI_FORMAT_R16G16B16A16_FLOAT });
718*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kAlpha_16, { DXGI_FORMAT_R16_UNORM });
719*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRG_1616, { DXGI_FORMAT_R16G16_UNORM });
720*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRGBA_16161616, { DXGI_FORMAT_R16G16B16A16_UNORM });
721*c8dee2aaSAndroid Build Coastguard Worker     this->setColorType(GrColorType::kRG_F16, { DXGI_FORMAT_R16G16_FLOAT });
722*c8dee2aaSAndroid Build Coastguard Worker }
723*c8dee2aaSAndroid Build Coastguard Worker 
InitFormatFlags(const D3D12_FEATURE_DATA_FORMAT_SUPPORT & formatSupport,uint16_t * flags)724*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::FormatInfo::InitFormatFlags(const D3D12_FEATURE_DATA_FORMAT_SUPPORT& formatSupport,
725*c8dee2aaSAndroid Build Coastguard Worker                                             uint16_t* flags) {
726*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE & formatSupport.Support1)) {
727*c8dee2aaSAndroid Build Coastguard Worker         *flags = *flags | kTexturable_Flag;
728*c8dee2aaSAndroid Build Coastguard Worker 
729*c8dee2aaSAndroid Build Coastguard Worker         // Ganesh assumes that all renderable surfaces are also texturable
730*c8dee2aaSAndroid Build Coastguard Worker         if (SkToBool(D3D12_FORMAT_SUPPORT1_RENDER_TARGET & formatSupport.Support1) &&
731*c8dee2aaSAndroid Build Coastguard Worker             SkToBool(D3D12_FORMAT_SUPPORT1_BLENDABLE & formatSupport.Support1)) {
732*c8dee2aaSAndroid Build Coastguard Worker             *flags = *flags | kRenderable_Flag;
733*c8dee2aaSAndroid Build Coastguard Worker         }
734*c8dee2aaSAndroid Build Coastguard Worker     }
735*c8dee2aaSAndroid Build Coastguard Worker 
736*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RENDERTARGET & formatSupport.Support1)) {
737*c8dee2aaSAndroid Build Coastguard Worker         *flags = *flags | kMSAA_Flag;
738*c8dee2aaSAndroid Build Coastguard Worker     }
739*c8dee2aaSAndroid Build Coastguard Worker 
740*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RESOLVE & formatSupport.Support1)) {
741*c8dee2aaSAndroid Build Coastguard Worker         *flags = *flags | kResolve_Flag;
742*c8dee2aaSAndroid Build Coastguard Worker     }
743*c8dee2aaSAndroid Build Coastguard Worker 
744*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW & formatSupport.Support1)) {
745*c8dee2aaSAndroid Build Coastguard Worker         *flags = *flags | kUnorderedAccess_Flag;
746*c8dee2aaSAndroid Build Coastguard Worker     }
747*c8dee2aaSAndroid Build Coastguard Worker }
748*c8dee2aaSAndroid Build Coastguard Worker 
multisample_count_supported(ID3D12Device * device,DXGI_FORMAT format,int sampleCount)749*c8dee2aaSAndroid Build Coastguard Worker static bool multisample_count_supported(ID3D12Device* device, DXGI_FORMAT format, int sampleCount) {
750*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msqLevels;
751*c8dee2aaSAndroid Build Coastguard Worker     msqLevels.Format = format;
752*c8dee2aaSAndroid Build Coastguard Worker     msqLevels.SampleCount = sampleCount;
753*c8dee2aaSAndroid Build Coastguard Worker     msqLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;
754*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,
755*c8dee2aaSAndroid Build Coastguard Worker                                                      &msqLevels, sizeof(msqLevels)));
756*c8dee2aaSAndroid Build Coastguard Worker 
757*c8dee2aaSAndroid Build Coastguard Worker     return msqLevels.NumQualityLevels > 0;
758*c8dee2aaSAndroid Build Coastguard Worker }
759*c8dee2aaSAndroid Build Coastguard Worker 
initSampleCounts(const DXGI_ADAPTER_DESC & adapterDesc,ID3D12Device * device,DXGI_FORMAT format)760*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::FormatInfo::initSampleCounts(const DXGI_ADAPTER_DESC& adapterDesc,
761*c8dee2aaSAndroid Build Coastguard Worker                                              ID3D12Device* device, DXGI_FORMAT format) {
762*c8dee2aaSAndroid Build Coastguard Worker     if (multisample_count_supported(device, format, 1)) {
763*c8dee2aaSAndroid Build Coastguard Worker         fColorSampleCounts.push_back(1);
764*c8dee2aaSAndroid Build Coastguard Worker     }
765*c8dee2aaSAndroid Build Coastguard Worker     // TODO: test these
766*c8dee2aaSAndroid Build Coastguard Worker     //if (kImagination_D3DVendor == adapterDesc.VendorId) {
767*c8dee2aaSAndroid Build Coastguard Worker     //    // MSAA does not work on imagination
768*c8dee2aaSAndroid Build Coastguard Worker     //    return;
769*c8dee2aaSAndroid Build Coastguard Worker     //}
770*c8dee2aaSAndroid Build Coastguard Worker     //if (kIntel_D3DVendor == adapterDesc.VendorId) {
771*c8dee2aaSAndroid Build Coastguard Worker     //    // MSAA doesn't work well on Intel GPUs chromium:527565, chromium:983926
772*c8dee2aaSAndroid Build Coastguard Worker     //    return;
773*c8dee2aaSAndroid Build Coastguard Worker     //}
774*c8dee2aaSAndroid Build Coastguard Worker     if (multisample_count_supported(device, format, 2)) {
775*c8dee2aaSAndroid Build Coastguard Worker         fColorSampleCounts.push_back(2);
776*c8dee2aaSAndroid Build Coastguard Worker     }
777*c8dee2aaSAndroid Build Coastguard Worker     if (multisample_count_supported(device, format, 4)) {
778*c8dee2aaSAndroid Build Coastguard Worker         fColorSampleCounts.push_back(4);
779*c8dee2aaSAndroid Build Coastguard Worker     }
780*c8dee2aaSAndroid Build Coastguard Worker     if (multisample_count_supported(device, format, 8)) {
781*c8dee2aaSAndroid Build Coastguard Worker         fColorSampleCounts.push_back(8);
782*c8dee2aaSAndroid Build Coastguard Worker     }
783*c8dee2aaSAndroid Build Coastguard Worker     if (multisample_count_supported(device, format, 16)) {
784*c8dee2aaSAndroid Build Coastguard Worker         fColorSampleCounts.push_back(16);
785*c8dee2aaSAndroid Build Coastguard Worker     }
786*c8dee2aaSAndroid Build Coastguard Worker     // Standard sample locations are not defined for more than 16 samples, and we don't need more
787*c8dee2aaSAndroid Build Coastguard Worker     // than 16. Omit 32 and 64.
788*c8dee2aaSAndroid Build Coastguard Worker }
789*c8dee2aaSAndroid Build Coastguard Worker 
init(const DXGI_ADAPTER_DESC & adapterDesc,ID3D12Device * device,DXGI_FORMAT format)790*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::FormatInfo::init(const DXGI_ADAPTER_DESC& adapterDesc, ID3D12Device* device,
791*c8dee2aaSAndroid Build Coastguard Worker                                  DXGI_FORMAT format) {
792*c8dee2aaSAndroid Build Coastguard Worker     D3D12_FEATURE_DATA_FORMAT_SUPPORT formatSupportDesc;
793*c8dee2aaSAndroid Build Coastguard Worker     formatSupportDesc.Format = format;
794*c8dee2aaSAndroid Build Coastguard Worker     GR_D3D_CALL_ERRCHECK(device->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT,
795*c8dee2aaSAndroid Build Coastguard Worker                                                      &formatSupportDesc,
796*c8dee2aaSAndroid Build Coastguard Worker                                                      sizeof(formatSupportDesc)));
797*c8dee2aaSAndroid Build Coastguard Worker 
798*c8dee2aaSAndroid Build Coastguard Worker     InitFormatFlags(formatSupportDesc, &fFlags);
799*c8dee2aaSAndroid Build Coastguard Worker     if (fFlags & kRenderable_Flag) {
800*c8dee2aaSAndroid Build Coastguard Worker         this->initSampleCounts(adapterDesc, device, format);
801*c8dee2aaSAndroid Build Coastguard Worker     }
802*c8dee2aaSAndroid Build Coastguard Worker }
803*c8dee2aaSAndroid Build Coastguard Worker 
isFormatSRGB(const GrBackendFormat & format) const804*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatSRGB(const GrBackendFormat& format) const {
805*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
806*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
807*c8dee2aaSAndroid Build Coastguard Worker         return false;
808*c8dee2aaSAndroid Build Coastguard Worker     }
809*c8dee2aaSAndroid Build Coastguard Worker 
810*c8dee2aaSAndroid Build Coastguard Worker     switch (dxgiFormat) {
811*c8dee2aaSAndroid Build Coastguard Worker         case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
812*c8dee2aaSAndroid Build Coastguard Worker             return true;
813*c8dee2aaSAndroid Build Coastguard Worker         default:
814*c8dee2aaSAndroid Build Coastguard Worker             return false;
815*c8dee2aaSAndroid Build Coastguard Worker     }
816*c8dee2aaSAndroid Build Coastguard Worker }
817*c8dee2aaSAndroid Build Coastguard Worker 
isFormatTexturable(const GrBackendFormat & format,GrTextureType) const818*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatTexturable(const GrBackendFormat& format, GrTextureType) const {
819*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
820*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
821*c8dee2aaSAndroid Build Coastguard Worker         return false;
822*c8dee2aaSAndroid Build Coastguard Worker     }
823*c8dee2aaSAndroid Build Coastguard Worker 
824*c8dee2aaSAndroid Build Coastguard Worker     return this->isFormatTexturable(dxgiFormat);
825*c8dee2aaSAndroid Build Coastguard Worker }
826*c8dee2aaSAndroid Build Coastguard Worker 
isFormatTexturable(DXGI_FORMAT format) const827*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatTexturable(DXGI_FORMAT format) const {
828*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& info = this->getFormatInfo(format);
829*c8dee2aaSAndroid Build Coastguard Worker     return SkToBool(FormatInfo::kTexturable_Flag & info.fFlags);
830*c8dee2aaSAndroid Build Coastguard Worker }
831*c8dee2aaSAndroid Build Coastguard Worker 
isFormatAsColorTypeRenderable(GrColorType ct,const GrBackendFormat & format,int sampleCount) const832*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format,
833*c8dee2aaSAndroid Build Coastguard Worker                                              int sampleCount) const {
834*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
835*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
836*c8dee2aaSAndroid Build Coastguard Worker         return false;
837*c8dee2aaSAndroid Build Coastguard Worker     }
838*c8dee2aaSAndroid Build Coastguard Worker     if (!this->isFormatRenderable(dxgiFormat, sampleCount)) {
839*c8dee2aaSAndroid Build Coastguard Worker         return false;
840*c8dee2aaSAndroid Build Coastguard Worker     }
841*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
842*c8dee2aaSAndroid Build Coastguard Worker     if (!SkToBool(info.colorTypeFlags(ct) & ColorTypeInfo::kRenderable_Flag)) {
843*c8dee2aaSAndroid Build Coastguard Worker         return false;
844*c8dee2aaSAndroid Build Coastguard Worker     }
845*c8dee2aaSAndroid Build Coastguard Worker     return true;
846*c8dee2aaSAndroid Build Coastguard Worker }
847*c8dee2aaSAndroid Build Coastguard Worker 
isFormatRenderable(const GrBackendFormat & format,int sampleCount) const848*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatRenderable(const GrBackendFormat& format, int sampleCount) const {
849*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
850*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
851*c8dee2aaSAndroid Build Coastguard Worker         return false;
852*c8dee2aaSAndroid Build Coastguard Worker     }
853*c8dee2aaSAndroid Build Coastguard Worker     return this->isFormatRenderable(dxgiFormat, sampleCount);
854*c8dee2aaSAndroid Build Coastguard Worker }
855*c8dee2aaSAndroid Build Coastguard Worker 
isFormatRenderable(DXGI_FORMAT format,int sampleCount) const856*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatRenderable(DXGI_FORMAT format, int sampleCount) const {
857*c8dee2aaSAndroid Build Coastguard Worker     return sampleCount <= this->maxRenderTargetSampleCount(format);
858*c8dee2aaSAndroid Build Coastguard Worker }
859*c8dee2aaSAndroid Build Coastguard Worker 
isFormatUnorderedAccessible(DXGI_FORMAT format) const860*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::isFormatUnorderedAccessible(DXGI_FORMAT format) const {
861*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& info = this->getFormatInfo(format);
862*c8dee2aaSAndroid Build Coastguard Worker     return SkToBool(FormatInfo::kUnorderedAccess_Flag & info.fFlags);
863*c8dee2aaSAndroid Build Coastguard Worker }
864*c8dee2aaSAndroid Build Coastguard Worker 
getRenderTargetSampleCount(int requestedCount,const GrBackendFormat & format) const865*c8dee2aaSAndroid Build Coastguard Worker int GrD3DCaps::getRenderTargetSampleCount(int requestedCount,
866*c8dee2aaSAndroid Build Coastguard Worker                                          const GrBackendFormat& format) const {
867*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
868*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
869*c8dee2aaSAndroid Build Coastguard Worker         return 0;
870*c8dee2aaSAndroid Build Coastguard Worker     }
871*c8dee2aaSAndroid Build Coastguard Worker 
872*c8dee2aaSAndroid Build Coastguard Worker     return this->getRenderTargetSampleCount(requestedCount, dxgiFormat);
873*c8dee2aaSAndroid Build Coastguard Worker }
874*c8dee2aaSAndroid Build Coastguard Worker 
getRenderTargetSampleCount(int requestedCount,DXGI_FORMAT format) const875*c8dee2aaSAndroid Build Coastguard Worker int GrD3DCaps::getRenderTargetSampleCount(int requestedCount, DXGI_FORMAT format) const {
876*c8dee2aaSAndroid Build Coastguard Worker     requestedCount = std::max(1, requestedCount);
877*c8dee2aaSAndroid Build Coastguard Worker 
878*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& info = this->getFormatInfo(format);
879*c8dee2aaSAndroid Build Coastguard Worker 
880*c8dee2aaSAndroid Build Coastguard Worker     int count = info.fColorSampleCounts.size();
881*c8dee2aaSAndroid Build Coastguard Worker 
882*c8dee2aaSAndroid Build Coastguard Worker     if (!count) {
883*c8dee2aaSAndroid Build Coastguard Worker         return 0;
884*c8dee2aaSAndroid Build Coastguard Worker     }
885*c8dee2aaSAndroid Build Coastguard Worker 
886*c8dee2aaSAndroid Build Coastguard Worker     if (1 == requestedCount) {
887*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(info.fColorSampleCounts.size() && info.fColorSampleCounts[0] == 1);
888*c8dee2aaSAndroid Build Coastguard Worker         return 1;
889*c8dee2aaSAndroid Build Coastguard Worker     }
890*c8dee2aaSAndroid Build Coastguard Worker 
891*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < count; ++i) {
892*c8dee2aaSAndroid Build Coastguard Worker         if (info.fColorSampleCounts[i] >= requestedCount) {
893*c8dee2aaSAndroid Build Coastguard Worker             return info.fColorSampleCounts[i];
894*c8dee2aaSAndroid Build Coastguard Worker         }
895*c8dee2aaSAndroid Build Coastguard Worker     }
896*c8dee2aaSAndroid Build Coastguard Worker     return 0;
897*c8dee2aaSAndroid Build Coastguard Worker }
898*c8dee2aaSAndroid Build Coastguard Worker 
maxRenderTargetSampleCount(const GrBackendFormat & format) const899*c8dee2aaSAndroid Build Coastguard Worker int GrD3DCaps::maxRenderTargetSampleCount(const GrBackendFormat& format) const {
900*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
901*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
902*c8dee2aaSAndroid Build Coastguard Worker         return 0;
903*c8dee2aaSAndroid Build Coastguard Worker     }
904*c8dee2aaSAndroid Build Coastguard Worker     return this->maxRenderTargetSampleCount(dxgiFormat);
905*c8dee2aaSAndroid Build Coastguard Worker }
906*c8dee2aaSAndroid Build Coastguard Worker 
maxRenderTargetSampleCount(DXGI_FORMAT format) const907*c8dee2aaSAndroid Build Coastguard Worker int GrD3DCaps::maxRenderTargetSampleCount(DXGI_FORMAT format) const {
908*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& info = this->getFormatInfo(format);
909*c8dee2aaSAndroid Build Coastguard Worker 
910*c8dee2aaSAndroid Build Coastguard Worker     const auto& table = info.fColorSampleCounts;
911*c8dee2aaSAndroid Build Coastguard Worker     if (!table.size()) {
912*c8dee2aaSAndroid Build Coastguard Worker         return 0;
913*c8dee2aaSAndroid Build Coastguard Worker     }
914*c8dee2aaSAndroid Build Coastguard Worker     return table[table.size() - 1];
915*c8dee2aaSAndroid Build Coastguard Worker }
916*c8dee2aaSAndroid Build Coastguard Worker 
getFormatColorType(DXGI_FORMAT format) const917*c8dee2aaSAndroid Build Coastguard Worker GrColorType GrD3DCaps::getFormatColorType(DXGI_FORMAT format) const {
918*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& info = this->getFormatInfo(format);
919*c8dee2aaSAndroid Build Coastguard Worker     return info.fFormatColorType;
920*c8dee2aaSAndroid Build Coastguard Worker }
921*c8dee2aaSAndroid Build Coastguard Worker 
supportedWritePixelsColorType(GrColorType surfaceColorType,const GrBackendFormat & surfaceFormat,GrColorType srcColorType) const922*c8dee2aaSAndroid Build Coastguard Worker GrCaps::SupportedWrite GrD3DCaps::supportedWritePixelsColorType(
923*c8dee2aaSAndroid Build Coastguard Worker         GrColorType surfaceColorType, const GrBackendFormat& surfaceFormat,
924*c8dee2aaSAndroid Build Coastguard Worker         GrColorType srcColorType) const {
925*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
926*c8dee2aaSAndroid Build Coastguard Worker     if (!surfaceFormat.asDxgiFormat(&dxgiFormat)) {
927*c8dee2aaSAndroid Build Coastguard Worker         return { GrColorType::kUnknown, 0 };
928*c8dee2aaSAndroid Build Coastguard Worker     }
929*c8dee2aaSAndroid Build Coastguard Worker 
930*c8dee2aaSAndroid Build Coastguard Worker     // Any buffer data needs to be aligned to 512 bytes and that of a single texel.
931*c8dee2aaSAndroid Build Coastguard Worker     size_t offsetAlignment = SkAlignTo(GrDxgiFormatBytesPerBlock(dxgiFormat),
932*c8dee2aaSAndroid Build Coastguard Worker                                        D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);
933*c8dee2aaSAndroid Build Coastguard Worker 
934*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
935*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
936*c8dee2aaSAndroid Build Coastguard Worker         const auto& ctInfo = info.fColorTypeInfos[i];
937*c8dee2aaSAndroid Build Coastguard Worker         if (ctInfo.fColorType == surfaceColorType) {
938*c8dee2aaSAndroid Build Coastguard Worker             return { surfaceColorType, offsetAlignment };
939*c8dee2aaSAndroid Build Coastguard Worker         }
940*c8dee2aaSAndroid Build Coastguard Worker     }
941*c8dee2aaSAndroid Build Coastguard Worker     return { GrColorType::kUnknown, 0 };
942*c8dee2aaSAndroid Build Coastguard Worker }
943*c8dee2aaSAndroid Build Coastguard Worker 
surfaceSupportsReadPixels(const GrSurface * surface) const944*c8dee2aaSAndroid Build Coastguard Worker GrCaps::SurfaceReadPixelsSupport GrD3DCaps::surfaceSupportsReadPixels(
945*c8dee2aaSAndroid Build Coastguard Worker         const GrSurface* surface) const {
946*c8dee2aaSAndroid Build Coastguard Worker     if (surface->isProtected()) {
947*c8dee2aaSAndroid Build Coastguard Worker         return SurfaceReadPixelsSupport::kUnsupported;
948*c8dee2aaSAndroid Build Coastguard Worker     }
949*c8dee2aaSAndroid Build Coastguard Worker     if (auto tex = static_cast<const GrD3DTexture*>(surface->asTexture())) {
950*c8dee2aaSAndroid Build Coastguard Worker         // We can't directly read from a compressed format
951*c8dee2aaSAndroid Build Coastguard Worker         if (GrDxgiFormatIsCompressed(tex->dxgiFormat())) {
952*c8dee2aaSAndroid Build Coastguard Worker             return SurfaceReadPixelsSupport::kCopyToTexture2D;
953*c8dee2aaSAndroid Build Coastguard Worker         }
954*c8dee2aaSAndroid Build Coastguard Worker         return SurfaceReadPixelsSupport::kSupported;
955*c8dee2aaSAndroid Build Coastguard Worker     } else if (auto rt = static_cast<const GrD3DRenderTarget*>(surface->asRenderTarget())) {
956*c8dee2aaSAndroid Build Coastguard Worker         if (rt->numSamples() > 1) {
957*c8dee2aaSAndroid Build Coastguard Worker             return SurfaceReadPixelsSupport::kCopyToTexture2D;
958*c8dee2aaSAndroid Build Coastguard Worker         }
959*c8dee2aaSAndroid Build Coastguard Worker         return SurfaceReadPixelsSupport::kSupported;
960*c8dee2aaSAndroid Build Coastguard Worker     }
961*c8dee2aaSAndroid Build Coastguard Worker     return SurfaceReadPixelsSupport::kUnsupported;
962*c8dee2aaSAndroid Build Coastguard Worker }
963*c8dee2aaSAndroid Build Coastguard Worker 
onSurfaceSupportsWritePixels(const GrSurface * surface) const964*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::onSurfaceSupportsWritePixels(const GrSurface* surface) const {
965*c8dee2aaSAndroid Build Coastguard Worker     if (auto rt = surface->asRenderTarget()) {
966*c8dee2aaSAndroid Build Coastguard Worker         return rt->numSamples() <= 1 && SkToBool(surface->asTexture());
967*c8dee2aaSAndroid Build Coastguard Worker     }
968*c8dee2aaSAndroid Build Coastguard Worker     return true;
969*c8dee2aaSAndroid Build Coastguard Worker }
970*c8dee2aaSAndroid Build Coastguard Worker 
onAreColorTypeAndFormatCompatible(GrColorType ct,const GrBackendFormat & format) const971*c8dee2aaSAndroid Build Coastguard Worker bool GrD3DCaps::onAreColorTypeAndFormatCompatible(GrColorType ct,
972*c8dee2aaSAndroid Build Coastguard Worker                                                   const GrBackendFormat& format) const {
973*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
974*c8dee2aaSAndroid Build Coastguard Worker     if (!format.asDxgiFormat(&dxgiFormat)) {
975*c8dee2aaSAndroid Build Coastguard Worker         return false;
976*c8dee2aaSAndroid Build Coastguard Worker     }
977*c8dee2aaSAndroid Build Coastguard Worker 
978*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
979*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
980*c8dee2aaSAndroid Build Coastguard Worker         if (info.fColorTypeInfos[i].fColorType == ct) {
981*c8dee2aaSAndroid Build Coastguard Worker             return true;
982*c8dee2aaSAndroid Build Coastguard Worker         }
983*c8dee2aaSAndroid Build Coastguard Worker     }
984*c8dee2aaSAndroid Build Coastguard Worker     return false;
985*c8dee2aaSAndroid Build Coastguard Worker }
986*c8dee2aaSAndroid Build Coastguard Worker 
onGetDefaultBackendFormat(GrColorType ct) const987*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat GrD3DCaps::onGetDefaultBackendFormat(GrColorType ct) const {
988*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT format = this->getFormatFromColorType(ct);
989*c8dee2aaSAndroid Build Coastguard Worker     if (format == DXGI_FORMAT_UNKNOWN) {
990*c8dee2aaSAndroid Build Coastguard Worker         return {};
991*c8dee2aaSAndroid Build Coastguard Worker     }
992*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendFormat::MakeDxgi(format);
993*c8dee2aaSAndroid Build Coastguard Worker }
994*c8dee2aaSAndroid Build Coastguard Worker 
getBackendFormatFromCompressionType(SkTextureCompressionType compressionType) const995*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat GrD3DCaps::getBackendFormatFromCompressionType(
996*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compressionType) const {
997*c8dee2aaSAndroid Build Coastguard Worker     switch (compressionType) {
998*c8dee2aaSAndroid Build Coastguard Worker         case SkTextureCompressionType::kBC1_RGBA8_UNORM:
999*c8dee2aaSAndroid Build Coastguard Worker             if (this->isFormatTexturable(DXGI_FORMAT_BC1_UNORM)) {
1000*c8dee2aaSAndroid Build Coastguard Worker                 return GrBackendFormat::MakeDxgi(DXGI_FORMAT_BC1_UNORM);
1001*c8dee2aaSAndroid Build Coastguard Worker             }
1002*c8dee2aaSAndroid Build Coastguard Worker             return {};
1003*c8dee2aaSAndroid Build Coastguard Worker         default:
1004*c8dee2aaSAndroid Build Coastguard Worker             return {};
1005*c8dee2aaSAndroid Build Coastguard Worker     }
1006*c8dee2aaSAndroid Build Coastguard Worker 
1007*c8dee2aaSAndroid Build Coastguard Worker     SkUNREACHABLE;
1008*c8dee2aaSAndroid Build Coastguard Worker }
1009*c8dee2aaSAndroid Build Coastguard Worker 
onGetReadSwizzle(const GrBackendFormat & format,GrColorType colorType) const1010*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle GrD3DCaps::onGetReadSwizzle(const GrBackendFormat& format,
1011*c8dee2aaSAndroid Build Coastguard Worker                                            GrColorType colorType) const {
1012*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
1013*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(format.asDxgiFormat(&dxgiFormat));
1014*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
1015*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1016*c8dee2aaSAndroid Build Coastguard Worker         const auto& ctInfo = info.fColorTypeInfos[i];
1017*c8dee2aaSAndroid Build Coastguard Worker         if (ctInfo.fColorType == colorType) {
1018*c8dee2aaSAndroid Build Coastguard Worker             return ctInfo.fReadSwizzle;
1019*c8dee2aaSAndroid Build Coastguard Worker         }
1020*c8dee2aaSAndroid Build Coastguard Worker     }
1021*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGFAILF("Illegal color type (%d) and format (%d) combination.",
1022*c8dee2aaSAndroid Build Coastguard Worker                  (int)colorType, (int)dxgiFormat);
1023*c8dee2aaSAndroid Build Coastguard Worker     return {};
1024*c8dee2aaSAndroid Build Coastguard Worker }
1025*c8dee2aaSAndroid Build Coastguard Worker 
getWriteSwizzle(const GrBackendFormat & format,GrColorType colorType) const1026*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle GrD3DCaps::getWriteSwizzle(const GrBackendFormat& format,
1027*c8dee2aaSAndroid Build Coastguard Worker                                           GrColorType colorType) const {
1028*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
1029*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(format.asDxgiFormat(&dxgiFormat));
1030*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
1031*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1032*c8dee2aaSAndroid Build Coastguard Worker         const auto& ctInfo = info.fColorTypeInfos[i];
1033*c8dee2aaSAndroid Build Coastguard Worker         if (ctInfo.fColorType == colorType) {
1034*c8dee2aaSAndroid Build Coastguard Worker             return ctInfo.fWriteSwizzle;
1035*c8dee2aaSAndroid Build Coastguard Worker         }
1036*c8dee2aaSAndroid Build Coastguard Worker     }
1037*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGFAILF("Illegal color type (%d) and format (%d) combination.",
1038*c8dee2aaSAndroid Build Coastguard Worker                  (int)colorType, (int)dxgiFormat);
1039*c8dee2aaSAndroid Build Coastguard Worker     return {};
1040*c8dee2aaSAndroid Build Coastguard Worker }
1041*c8dee2aaSAndroid Build Coastguard Worker 
computeFormatKey(const GrBackendFormat & format) const1042*c8dee2aaSAndroid Build Coastguard Worker uint64_t GrD3DCaps::computeFormatKey(const GrBackendFormat& format) const {
1043*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
1044*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(format.asDxgiFormat(&dxgiFormat));
1045*c8dee2aaSAndroid Build Coastguard Worker 
1046*c8dee2aaSAndroid Build Coastguard Worker     return (uint64_t)dxgiFormat;
1047*c8dee2aaSAndroid Build Coastguard Worker }
1048*c8dee2aaSAndroid Build Coastguard Worker 
onSupportedReadPixelsColorType(GrColorType srcColorType,const GrBackendFormat & srcBackendFormat,GrColorType dstColorType) const1049*c8dee2aaSAndroid Build Coastguard Worker GrCaps::SupportedRead GrD3DCaps::onSupportedReadPixelsColorType(
1050*c8dee2aaSAndroid Build Coastguard Worker         GrColorType srcColorType, const GrBackendFormat& srcBackendFormat,
1051*c8dee2aaSAndroid Build Coastguard Worker         GrColorType dstColorType) const {
1052*c8dee2aaSAndroid Build Coastguard Worker     DXGI_FORMAT dxgiFormat;
1053*c8dee2aaSAndroid Build Coastguard Worker     if (!srcBackendFormat.asDxgiFormat(&dxgiFormat)) {
1054*c8dee2aaSAndroid Build Coastguard Worker         return { GrColorType::kUnknown, 0 };
1055*c8dee2aaSAndroid Build Coastguard Worker     }
1056*c8dee2aaSAndroid Build Coastguard Worker 
1057*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compression = GrBackendFormatToCompressionType(srcBackendFormat);
1058*c8dee2aaSAndroid Build Coastguard Worker     if (compression != SkTextureCompressionType::kNone) {
1059*c8dee2aaSAndroid Build Coastguard Worker         return { SkTextureCompressionTypeIsOpaque(compression) ? GrColorType::kRGB_888x
1060*c8dee2aaSAndroid Build Coastguard Worker                                                         : GrColorType::kRGBA_8888, 0 };
1061*c8dee2aaSAndroid Build Coastguard Worker     }
1062*c8dee2aaSAndroid Build Coastguard Worker 
1063*c8dee2aaSAndroid Build Coastguard Worker     // Any subresource buffer data offset we copy to needs to be aligned to 512 bytes.
1064*c8dee2aaSAndroid Build Coastguard Worker     size_t offsetAlignment = D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT;
1065*c8dee2aaSAndroid Build Coastguard Worker 
1066*c8dee2aaSAndroid Build Coastguard Worker     const auto& info = this->getFormatInfo(dxgiFormat);
1067*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1068*c8dee2aaSAndroid Build Coastguard Worker         const auto& ctInfo = info.fColorTypeInfos[i];
1069*c8dee2aaSAndroid Build Coastguard Worker         if (ctInfo.fColorType == srcColorType) {
1070*c8dee2aaSAndroid Build Coastguard Worker             return { srcColorType, offsetAlignment };
1071*c8dee2aaSAndroid Build Coastguard Worker         }
1072*c8dee2aaSAndroid Build Coastguard Worker     }
1073*c8dee2aaSAndroid Build Coastguard Worker     return { GrColorType::kUnknown, 0 };
1074*c8dee2aaSAndroid Build Coastguard Worker }
1075*c8dee2aaSAndroid Build Coastguard Worker 
addExtraSamplerKey(skgpu::KeyBuilder * b,GrSamplerState samplerState,const GrBackendFormat & format) const1076*c8dee2aaSAndroid Build Coastguard Worker void GrD3DCaps::addExtraSamplerKey(skgpu::KeyBuilder* b,
1077*c8dee2aaSAndroid Build Coastguard Worker                                    GrSamplerState samplerState,
1078*c8dee2aaSAndroid Build Coastguard Worker                                    const GrBackendFormat& format) const {
1079*c8dee2aaSAndroid Build Coastguard Worker     // TODO
1080*c8dee2aaSAndroid Build Coastguard Worker }
1081*c8dee2aaSAndroid Build Coastguard Worker 
1082*c8dee2aaSAndroid Build Coastguard Worker /**
1083*c8dee2aaSAndroid Build Coastguard Worker  * TODO: Determine what goes in the ProgramDesc
1084*c8dee2aaSAndroid Build Coastguard Worker  */
makeDesc(GrRenderTarget * rt,const GrProgramInfo & programInfo,ProgramDescOverrideFlags overrideFlags) const1085*c8dee2aaSAndroid Build Coastguard Worker GrProgramDesc GrD3DCaps::makeDesc(GrRenderTarget* rt,
1086*c8dee2aaSAndroid Build Coastguard Worker                                   const GrProgramInfo& programInfo,
1087*c8dee2aaSAndroid Build Coastguard Worker                                   ProgramDescOverrideFlags overrideFlags) const {
1088*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(overrideFlags == ProgramDescOverrideFlags::kNone);
1089*c8dee2aaSAndroid Build Coastguard Worker     GrProgramDesc desc;
1090*c8dee2aaSAndroid Build Coastguard Worker     GrProgramDesc::Build(&desc, programInfo, *this);
1091*c8dee2aaSAndroid Build Coastguard Worker 
1092*c8dee2aaSAndroid Build Coastguard Worker     skgpu::KeyBuilder b(desc.key());
1093*c8dee2aaSAndroid Build Coastguard Worker 
1094*c8dee2aaSAndroid Build Coastguard Worker     GrD3DRenderTarget* d3dRT = (GrD3DRenderTarget*) rt;
1095*c8dee2aaSAndroid Build Coastguard Worker     d3dRT->genKey(&b);
1096*c8dee2aaSAndroid Build Coastguard Worker 
1097*c8dee2aaSAndroid Build Coastguard Worker     GrStencilSettings stencil = programInfo.nonGLStencilSettings();
1098*c8dee2aaSAndroid Build Coastguard Worker     stencil.genKey(&b, false);
1099*c8dee2aaSAndroid Build Coastguard Worker 
1100*c8dee2aaSAndroid Build Coastguard Worker     programInfo.pipeline().genKey(&b, *this);
1101*c8dee2aaSAndroid Build Coastguard Worker     // The num samples is already added in the render target key so we don't need to add it here.
1102*c8dee2aaSAndroid Build Coastguard Worker 
1103*c8dee2aaSAndroid Build Coastguard Worker     // D3D requires the full primitive type as part of its key
1104*c8dee2aaSAndroid Build Coastguard Worker     b.add32(programInfo.primitiveTypeKey());
1105*c8dee2aaSAndroid Build Coastguard Worker 
1106*c8dee2aaSAndroid Build Coastguard Worker     b.flush();
1107*c8dee2aaSAndroid Build Coastguard Worker     return desc;
1108*c8dee2aaSAndroid Build Coastguard Worker }
1109*c8dee2aaSAndroid Build Coastguard Worker 
1110*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
getTestingCombinations() const1111*c8dee2aaSAndroid Build Coastguard Worker std::vector<GrTest::TestFormatColorTypeCombination> GrD3DCaps::getTestingCombinations() const {
1112*c8dee2aaSAndroid Build Coastguard Worker     std::vector<GrTest::TestFormatColorTypeCombination> combos = {
1113*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kAlpha_8,        GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8_UNORM)           },
1114*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kBGR_565,        GrBackendFormat::MakeDxgi(DXGI_FORMAT_B5G6R5_UNORM)       },
1115*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kABGR_4444,      GrBackendFormat::MakeDxgi(DXGI_FORMAT_B4G4R4A4_UNORM)     },
1116*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_8888,      GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8G8B8A8_UNORM)     },
1117*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_8888_SRGB, GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)},
1118*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGB_888x,       GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8G8B8A8_UNORM)     },
1119*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRG_88,          GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8G8_UNORM)         },
1120*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kBGRA_8888,      GrBackendFormat::MakeDxgi(DXGI_FORMAT_B8G8R8A8_UNORM)     },
1121*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_1010102,   GrBackendFormat::MakeDxgi(DXGI_FORMAT_R10G10B10A2_UNORM)  },
1122*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGB_101010x,    GrBackendFormat::MakeDxgi(DXGI_FORMAT_R10G10B10A2_UNORM)  },
1123*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kGray_8,         GrBackendFormat::MakeDxgi(DXGI_FORMAT_R8_UNORM)           },
1124*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kAlpha_F16,      GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16_FLOAT)          },
1125*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_F16,       GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16B16A16_FLOAT) },
1126*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_F16_Clamped, GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16B16A16_FLOAT)},
1127*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGB_F16F16F16x, GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16B16A16_FLOAT) },
1128*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kAlpha_16,       GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16_UNORM)          },
1129*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRG_1616,        GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16_UNORM)       },
1130*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_16161616,  GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16B16A16_UNORM) },
1131*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRG_F16,         GrBackendFormat::MakeDxgi(DXGI_FORMAT_R16G16_FLOAT)       },
1132*c8dee2aaSAndroid Build Coastguard Worker         {GrColorType::kRGBA_8888,      GrBackendFormat::MakeDxgi(DXGI_FORMAT_BC1_UNORM)          },
1133*c8dee2aaSAndroid Build Coastguard Worker     };
1134*c8dee2aaSAndroid Build Coastguard Worker 
1135*c8dee2aaSAndroid Build Coastguard Worker     return combos;
1136*c8dee2aaSAndroid Build Coastguard Worker }
1137*c8dee2aaSAndroid Build Coastguard Worker #endif
1138