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