xref: /aosp_15_r20/external/mesa3d/src/microsoft/vulkan/dzn_util.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "dzn_private.h"
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #define D3D12_IGNORE_SDK_LAYERS
27*61046927SAndroid Build Coastguard Worker #define COBJMACROS
28*61046927SAndroid Build Coastguard Worker #include <directx/d3d12.h>
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
33*61046927SAndroid Build Coastguard Worker #include "util/log.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include <directx/d3d12sdklayers.h>
36*61046927SAndroid Build Coastguard Worker #include <util/u_dl.h>
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker static const DXGI_FORMAT formats[PIPE_FORMAT_COUNT] = {
39*61046927SAndroid Build Coastguard Worker #define MAP_FORMAT_NORM(FMT) \
40*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _UNORM] = DXGI_FORMAT_ ## FMT ## _UNORM, \
41*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _SNORM] = DXGI_FORMAT_ ## FMT ## _SNORM,
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker #define MAP_FORMAT_INT(FMT) \
44*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _UINT] = DXGI_FORMAT_ ## FMT ## _UINT, \
45*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _SINT] = DXGI_FORMAT_ ## FMT ## _SINT,
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker #define MAP_FORMAT_SRGB(FMT) \
48*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _SRGB] = DXGI_FORMAT_ ## FMT ## _UNORM_SRGB,
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker #define MAP_FORMAT_FLOAT(FMT) \
51*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_ ## FMT ## _FLOAT] = DXGI_FORMAT_ ## FMT ## _FLOAT,
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker #define MAP_EMU_FORMAT_NO_ALPHA(BITS, TYPE) \
54*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_L ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \
55*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_I ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \
56*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_L ## BITS ## A ## BITS ## _ ## TYPE] = \
57*61046927SAndroid Build Coastguard Worker           DXGI_FORMAT_R ## BITS ## G ## BITS ## _ ## TYPE,
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker #define MAP_EMU_FORMAT(BITS, TYPE) \
60*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_A ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \
61*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT_NO_ALPHA(BITS, TYPE)
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R8)
64*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R8)
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R8G8)
67*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R8G8)
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R8G8B8A8)
70*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R8G8B8A8)
71*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_SRGB(R8G8B8A8)
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_B8G8R8X8_UNORM] = DXGI_FORMAT_B8G8R8X8_UNORM,
74*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_B8G8R8A8_UNORM] = DXGI_FORMAT_B8G8R8A8_UNORM,
75*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_B4G4R4A4_UNORM] = DXGI_FORMAT_B4G4R4A4_UNORM,
76*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_A4R4G4B4_UNORM] = DXGI_FORMAT_A4B4G4R4_UNORM,
77*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_A4B4G4R4_UNORM] = DXGI_FORMAT_A4B4G4R4_UNORM,
78*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_B5G6R5_UNORM] = DXGI_FORMAT_B5G6R5_UNORM,
79*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_B5G5R5A1_UNORM] = DXGI_FORMAT_B5G5R5A1_UNORM,
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_SRGB(B8G8R8A8)
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R32)
84*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R32)
85*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R32G32)
86*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R32G32)
87*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R32G32B32)
88*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R32G32B32)
89*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R32G32B32A32)
90*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R32G32B32A32)
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R16)
93*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R16)
94*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R16)
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R16G16)
97*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R16G16)
98*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R16G16)
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_NORM(R16G16B16A16)
101*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_INT(R16G16B16A16)
102*61046927SAndroid Build Coastguard Worker    MAP_FORMAT_FLOAT(R16G16B16A16)
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_A8_UNORM] = DXGI_FORMAT_A8_UNORM,
105*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT_NO_ALPHA(8, UNORM)
106*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(8, SNORM)
107*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(8, SINT)
108*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(8, UINT)
109*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(16, UNORM)
110*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(16, SNORM)
111*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(16, SINT)
112*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(16, UINT)
113*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(16, FLOAT)
114*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(32, SINT)
115*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(32, UINT)
116*61046927SAndroid Build Coastguard Worker    MAP_EMU_FORMAT(32, FLOAT)
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_R9G9B9E5_FLOAT] = DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
119*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_R11G11B10_FLOAT] = DXGI_FORMAT_R11G11B10_FLOAT,
120*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_R10G10B10A2_UINT] = DXGI_FORMAT_R10G10B10A2_UINT,
121*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_R10G10B10A2_UNORM] = DXGI_FORMAT_R10G10B10A2_UNORM,
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT1_RGB] = DXGI_FORMAT_BC1_UNORM,
124*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT1_RGBA] = DXGI_FORMAT_BC1_UNORM,
125*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT3_RGBA] = DXGI_FORMAT_BC2_UNORM,
126*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT5_RGBA] = DXGI_FORMAT_BC3_UNORM,
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT1_SRGB] = DXGI_FORMAT_BC1_UNORM_SRGB,
129*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT1_SRGBA] = DXGI_FORMAT_BC1_UNORM_SRGB,
130*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT3_SRGBA] = DXGI_FORMAT_BC2_UNORM_SRGB,
131*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_DXT5_SRGBA] = DXGI_FORMAT_BC3_UNORM_SRGB,
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_RGTC1_UNORM] = DXGI_FORMAT_BC4_UNORM,
134*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_RGTC1_SNORM] = DXGI_FORMAT_BC4_SNORM,
135*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_RGTC2_UNORM] = DXGI_FORMAT_BC5_UNORM,
136*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_RGTC2_SNORM] = DXGI_FORMAT_BC5_SNORM,
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_BPTC_RGB_UFLOAT] = DXGI_FORMAT_BC6H_UF16,
139*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_BPTC_RGB_FLOAT] = DXGI_FORMAT_BC6H_SF16,
140*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_BPTC_RGBA_UNORM] = DXGI_FORMAT_BC7_UNORM,
141*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_BPTC_SRGBA] = DXGI_FORMAT_BC7_UNORM_SRGB,
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_Z32_FLOAT] = DXGI_FORMAT_R32_TYPELESS,
144*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_Z16_UNORM] = DXGI_FORMAT_R16_TYPELESS,
145*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_Z24X8_UNORM] = DXGI_FORMAT_R24G8_TYPELESS,
146*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_X24S8_UINT] = DXGI_FORMAT_R24G8_TYPELESS,
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_Z24_UNORM_S8_UINT] = DXGI_FORMAT_R24G8_TYPELESS,
149*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = DXGI_FORMAT_R32G8X24_TYPELESS,
150*61046927SAndroid Build Coastguard Worker    [PIPE_FORMAT_X32_S8X24_UINT] = DXGI_FORMAT_R32G8X24_TYPELESS,
151*61046927SAndroid Build Coastguard Worker };
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
dzn_pipe_to_dxgi_format(enum pipe_format in)154*61046927SAndroid Build Coastguard Worker dzn_pipe_to_dxgi_format(enum pipe_format in)
155*61046927SAndroid Build Coastguard Worker {
156*61046927SAndroid Build Coastguard Worker    return formats[in];
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
dzn_get_typeless_dxgi_format(DXGI_FORMAT in)160*61046927SAndroid Build Coastguard Worker dzn_get_typeless_dxgi_format(DXGI_FORMAT in)
161*61046927SAndroid Build Coastguard Worker {
162*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R32G32B32A32_TYPELESS && in <= DXGI_FORMAT_R32G32B32A32_SINT)
163*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R32G32B32A32_TYPELESS;
164*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R32G32B32_TYPELESS && in <= DXGI_FORMAT_R32G32B32_SINT)
165*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R32G32B32_TYPELESS;
166*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R16G16B16A16_TYPELESS && in <= DXGI_FORMAT_R16G16B16A16_SINT)
167*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R16G16B16A16_TYPELESS;
168*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R32G32_TYPELESS && in <= DXGI_FORMAT_R32G32_SINT)
169*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R32G32_TYPELESS;
170*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R32G8X24_TYPELESS && in <= DXGI_FORMAT_X32_TYPELESS_G8X24_UINT)
171*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R32G8X24_TYPELESS;
172*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R10G10B10A2_TYPELESS && in <= DXGI_FORMAT_R10G10B10A2_UINT)
173*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R10G10B10A2_TYPELESS;
174*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R8G8B8A8_TYPELESS && in <= DXGI_FORMAT_R8G8B8A8_SINT)
175*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R8G8B8A8_TYPELESS;
176*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R16G16_TYPELESS && in <= DXGI_FORMAT_R16G16_SINT)
177*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R16G16_TYPELESS;
178*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R32_TYPELESS && in <= DXGI_FORMAT_R32_SINT)
179*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R32_TYPELESS;
180*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R24G8_TYPELESS && in <= DXGI_FORMAT_X24_TYPELESS_G8_UINT)
181*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R24G8_TYPELESS;
182*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R8G8_TYPELESS && in <= DXGI_FORMAT_R8G8_SINT)
183*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R8G8_TYPELESS;
184*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R16_TYPELESS && in <= DXGI_FORMAT_R16_SINT)
185*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R16_TYPELESS;
186*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_R8_TYPELESS && in <= DXGI_FORMAT_R8_SINT)
187*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_R8_TYPELESS;
188*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC1_TYPELESS && in <= DXGI_FORMAT_BC1_UNORM_SRGB)
189*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC1_TYPELESS;
190*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC2_TYPELESS && in <= DXGI_FORMAT_BC2_UNORM_SRGB)
191*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC2_TYPELESS;
192*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC3_TYPELESS && in <= DXGI_FORMAT_BC3_UNORM_SRGB)
193*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC3_TYPELESS;
194*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC4_TYPELESS && in <= DXGI_FORMAT_BC4_SNORM)
195*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC4_TYPELESS;
196*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC5_TYPELESS && in <= DXGI_FORMAT_BC5_SNORM)
197*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC5_TYPELESS;
198*61046927SAndroid Build Coastguard Worker    if (in == DXGI_FORMAT_B8G8R8A8_UNORM ||
199*61046927SAndroid Build Coastguard Worker        (in >= DXGI_FORMAT_B8G8R8A8_TYPELESS && in <= DXGI_FORMAT_B8G8R8A8_UNORM_SRGB))
200*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_B8G8R8A8_TYPELESS;
201*61046927SAndroid Build Coastguard Worker    if (in == DXGI_FORMAT_B8G8R8X8_UNORM ||
202*61046927SAndroid Build Coastguard Worker        (in >= DXGI_FORMAT_B8G8R8X8_TYPELESS && in <= DXGI_FORMAT_B8G8R8X8_UNORM_SRGB))
203*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_B8G8R8X8_TYPELESS;
204*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC6H_TYPELESS && in <= DXGI_FORMAT_BC6H_SF16)
205*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC6H_TYPELESS;
206*61046927SAndroid Build Coastguard Worker    if (in >= DXGI_FORMAT_BC7_TYPELESS && in <= DXGI_FORMAT_BC7_UNORM_SRGB)
207*61046927SAndroid Build Coastguard Worker       return DXGI_FORMAT_BC7_TYPELESS;
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    return in;
210*61046927SAndroid Build Coastguard Worker }
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker static D3D12_FILTER_TYPE
translate_filter_type(VkFilter type)213*61046927SAndroid Build Coastguard Worker translate_filter_type(VkFilter type)
214*61046927SAndroid Build Coastguard Worker {
215*61046927SAndroid Build Coastguard Worker    switch (type) {
216*61046927SAndroid Build Coastguard Worker    case VK_FILTER_NEAREST: return D3D12_FILTER_TYPE_POINT;
217*61046927SAndroid Build Coastguard Worker    case VK_FILTER_LINEAR: return D3D12_FILTER_TYPE_LINEAR;
218*61046927SAndroid Build Coastguard Worker    default:
219*61046927SAndroid Build Coastguard Worker       assert(!"Unsupported filter mode");
220*61046927SAndroid Build Coastguard Worker       return D3D12_FILTER_TYPE_POINT;
221*61046927SAndroid Build Coastguard Worker    }
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker static D3D12_FILTER_TYPE
translate_mip_filter_type(VkSamplerMipmapMode type)225*61046927SAndroid Build Coastguard Worker translate_mip_filter_type(VkSamplerMipmapMode type)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker    switch (type) {
228*61046927SAndroid Build Coastguard Worker    case VK_SAMPLER_MIPMAP_MODE_NEAREST: return D3D12_FILTER_TYPE_POINT;
229*61046927SAndroid Build Coastguard Worker    case VK_SAMPLER_MIPMAP_MODE_LINEAR: return D3D12_FILTER_TYPE_LINEAR;
230*61046927SAndroid Build Coastguard Worker    default:
231*61046927SAndroid Build Coastguard Worker       assert(!"Unsupported filter mode");
232*61046927SAndroid Build Coastguard Worker       return D3D12_FILTER_TYPE_POINT;
233*61046927SAndroid Build Coastguard Worker    }
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker D3D12_FILTER
dzn_translate_sampler_filter(const struct dzn_physical_device * pdev,const VkSamplerCreateInfo * create_info)237*61046927SAndroid Build Coastguard Worker dzn_translate_sampler_filter(const struct dzn_physical_device *pdev,
238*61046927SAndroid Build Coastguard Worker                              const VkSamplerCreateInfo *create_info)
239*61046927SAndroid Build Coastguard Worker {
240*61046927SAndroid Build Coastguard Worker    D3D12_FILTER_REDUCTION_TYPE reduction = create_info->compareEnable ?
241*61046927SAndroid Build Coastguard Worker       D3D12_FILTER_REDUCTION_TYPE_COMPARISON : D3D12_FILTER_REDUCTION_TYPE_STANDARD;
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker    if (create_info->anisotropyEnable) {
244*61046927SAndroid Build Coastguard Worker       if (create_info->mipmapMode == VK_SAMPLER_MIPMAP_MODE_NEAREST &&
245*61046927SAndroid Build Coastguard Worker           pdev->options19.AnisoFilterWithPointMipSupported)
246*61046927SAndroid Build Coastguard Worker          return D3D12_ENCODE_MIN_MAG_ANISOTROPIC_MIP_POINT_FILTER(reduction);
247*61046927SAndroid Build Coastguard Worker       return D3D12_ENCODE_ANISOTROPIC_FILTER(reduction);
248*61046927SAndroid Build Coastguard Worker    }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker    return D3D12_ENCODE_BASIC_FILTER(
251*61046927SAndroid Build Coastguard Worker       translate_filter_type(create_info->minFilter),
252*61046927SAndroid Build Coastguard Worker       translate_filter_type(create_info->magFilter),
253*61046927SAndroid Build Coastguard Worker       translate_mip_filter_type(create_info->mipmapMode),
254*61046927SAndroid Build Coastguard Worker       reduction);
255*61046927SAndroid Build Coastguard Worker }
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker D3D12_COMPARISON_FUNC
dzn_translate_compare_op(VkCompareOp in)258*61046927SAndroid Build Coastguard Worker dzn_translate_compare_op(VkCompareOp in)
259*61046927SAndroid Build Coastguard Worker {
260*61046927SAndroid Build Coastguard Worker    switch (in) {
261*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_NEVER: return D3D12_COMPARISON_FUNC_NEVER;
262*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_LESS: return D3D12_COMPARISON_FUNC_LESS;
263*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_EQUAL: return D3D12_COMPARISON_FUNC_EQUAL;
264*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_LESS_OR_EQUAL: return D3D12_COMPARISON_FUNC_LESS_EQUAL;
265*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_GREATER: return D3D12_COMPARISON_FUNC_GREATER;
266*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_NOT_EQUAL: return D3D12_COMPARISON_FUNC_NOT_EQUAL;
267*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_GREATER_OR_EQUAL: return D3D12_COMPARISON_FUNC_GREATER_EQUAL;
268*61046927SAndroid Build Coastguard Worker    case VK_COMPARE_OP_ALWAYS: return D3D12_COMPARISON_FUNC_ALWAYS;
269*61046927SAndroid Build Coastguard Worker    default: unreachable("Invalid compare op");
270*61046927SAndroid Build Coastguard Worker    }
271*61046927SAndroid Build Coastguard Worker }
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker void
dzn_translate_viewport(D3D12_VIEWPORT * out,const VkViewport * in)274*61046927SAndroid Build Coastguard Worker dzn_translate_viewport(D3D12_VIEWPORT *out,
275*61046927SAndroid Build Coastguard Worker                        const VkViewport *in)
276*61046927SAndroid Build Coastguard Worker {
277*61046927SAndroid Build Coastguard Worker    out->TopLeftX = in->x;
278*61046927SAndroid Build Coastguard Worker    out->TopLeftY = in->height < 0 ? in->height + in->y : in->y;
279*61046927SAndroid Build Coastguard Worker    out->Width = in->width;
280*61046927SAndroid Build Coastguard Worker    out->Height = fabs(in->height);
281*61046927SAndroid Build Coastguard Worker    out->MinDepth = MIN2(in->minDepth, in->maxDepth);
282*61046927SAndroid Build Coastguard Worker    out->MaxDepth = MAX2(in->maxDepth, in->minDepth);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker void
dzn_translate_rect(D3D12_RECT * out,const VkRect2D * in)286*61046927SAndroid Build Coastguard Worker dzn_translate_rect(D3D12_RECT *out,
287*61046927SAndroid Build Coastguard Worker                    const VkRect2D *in)
288*61046927SAndroid Build Coastguard Worker {
289*61046927SAndroid Build Coastguard Worker    out->left = in->offset.x;
290*61046927SAndroid Build Coastguard Worker    out->top = in->offset.y;
291*61046927SAndroid Build Coastguard Worker    out->right = in->offset.x + in->extent.width;
292*61046927SAndroid Build Coastguard Worker    out->bottom = in->offset.y + in->extent.height;
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker static ID3D12Debug *
get_debug_interface(struct util_dl_library * d3d12_mod,ID3D12DeviceFactory * factory)296*61046927SAndroid Build Coastguard Worker get_debug_interface(struct util_dl_library *d3d12_mod, ID3D12DeviceFactory *factory)
297*61046927SAndroid Build Coastguard Worker {
298*61046927SAndroid Build Coastguard Worker    typedef HRESULT(WINAPI *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID riid, void **ppFactory);
299*61046927SAndroid Build Coastguard Worker    PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterface;
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    ID3D12Debug *debug;
302*61046927SAndroid Build Coastguard Worker    if (factory) {
303*61046927SAndroid Build Coastguard Worker       if (FAILED(ID3D12DeviceFactory_GetConfigurationInterface(factory, &CLSID_D3D12Debug, &IID_ID3D12Debug, (void **)&debug))) {
304*61046927SAndroid Build Coastguard Worker          mesa_loge("Failed to retrieve ID3D12Debug from device factory\n");
305*61046927SAndroid Build Coastguard Worker          return NULL;
306*61046927SAndroid Build Coastguard Worker       }
307*61046927SAndroid Build Coastguard Worker    } else {
308*61046927SAndroid Build Coastguard Worker       D3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)util_dl_get_proc_address(d3d12_mod, "D3D12GetDebugInterface");
309*61046927SAndroid Build Coastguard Worker       if (!D3D12GetDebugInterface) {
310*61046927SAndroid Build Coastguard Worker          mesa_loge("failed to load D3D12GetDebugInterface from D3D12.DLL\n");
311*61046927SAndroid Build Coastguard Worker          return NULL;
312*61046927SAndroid Build Coastguard Worker       }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker       if (FAILED(D3D12GetDebugInterface(&IID_ID3D12Debug, (void **)&debug))) {
315*61046927SAndroid Build Coastguard Worker          mesa_loge("D3D12GetDebugInterface failed\n");
316*61046927SAndroid Build Coastguard Worker          return NULL;
317*61046927SAndroid Build Coastguard Worker       }
318*61046927SAndroid Build Coastguard Worker    }
319*61046927SAndroid Build Coastguard Worker 
320*61046927SAndroid Build Coastguard Worker    return debug;
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker void
d3d12_enable_debug_layer(struct util_dl_library * d3d12_mod,ID3D12DeviceFactory * factory)324*61046927SAndroid Build Coastguard Worker d3d12_enable_debug_layer(struct util_dl_library *d3d12_mod, ID3D12DeviceFactory *factory)
325*61046927SAndroid Build Coastguard Worker {
326*61046927SAndroid Build Coastguard Worker    ID3D12Debug *debug = get_debug_interface(d3d12_mod, factory);
327*61046927SAndroid Build Coastguard Worker    if (debug) {
328*61046927SAndroid Build Coastguard Worker       ID3D12Debug_EnableDebugLayer(debug);
329*61046927SAndroid Build Coastguard Worker       ID3D12Debug_Release(debug);
330*61046927SAndroid Build Coastguard Worker    }
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker void
d3d12_enable_gpu_validation(struct util_dl_library * d3d12_mod,ID3D12DeviceFactory * factory)334*61046927SAndroid Build Coastguard Worker d3d12_enable_gpu_validation(struct util_dl_library *d3d12_mod, ID3D12DeviceFactory *factory)
335*61046927SAndroid Build Coastguard Worker {
336*61046927SAndroid Build Coastguard Worker    ID3D12Debug *debug = get_debug_interface(d3d12_mod, factory);
337*61046927SAndroid Build Coastguard Worker    if (debug) {
338*61046927SAndroid Build Coastguard Worker       ID3D12Debug3 *debug3;
339*61046927SAndroid Build Coastguard Worker       if (SUCCEEDED(ID3D12Debug_QueryInterface(debug,
340*61046927SAndroid Build Coastguard Worker                                                &IID_ID3D12Debug3,
341*61046927SAndroid Build Coastguard Worker                                                (void **)&debug3))) {
342*61046927SAndroid Build Coastguard Worker          ID3D12Debug3_SetEnableGPUBasedValidation(debug3, true);
343*61046927SAndroid Build Coastguard Worker          ID3D12Debug3_Release(debug3);
344*61046927SAndroid Build Coastguard Worker       }
345*61046927SAndroid Build Coastguard Worker       ID3D12Debug_Release(debug);
346*61046927SAndroid Build Coastguard Worker    }
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker ID3D12Device4 *
d3d12_create_device(struct util_dl_library * d3d12_mod,IUnknown * adapter,ID3D12DeviceFactory * factory,bool experimental_features)350*61046927SAndroid Build Coastguard Worker d3d12_create_device(struct util_dl_library *d3d12_mod, IUnknown *adapter, ID3D12DeviceFactory *factory, bool experimental_features)
351*61046927SAndroid Build Coastguard Worker {
352*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
353*61046927SAndroid Build Coastguard Worker    if (experimental_features)
354*61046927SAndroid Build Coastguard Worker #endif
355*61046927SAndroid Build Coastguard Worker    {
356*61046927SAndroid Build Coastguard Worker       if (factory) {
357*61046927SAndroid Build Coastguard Worker          if (FAILED(ID3D12DeviceFactory_EnableExperimentalFeatures(factory, 1, &D3D12ExperimentalShaderModels, NULL, NULL))) {
358*61046927SAndroid Build Coastguard Worker             mesa_loge("failed to enable experimental shader models\n");
359*61046927SAndroid Build Coastguard Worker             return NULL;
360*61046927SAndroid Build Coastguard Worker          }
361*61046927SAndroid Build Coastguard Worker       } else {
362*61046927SAndroid Build Coastguard Worker          typedef HRESULT(WINAPI *PFN_D3D12ENABLEEXPERIMENTALFEATURES)(UINT, const IID *, void *, UINT *);
363*61046927SAndroid Build Coastguard Worker          PFN_D3D12ENABLEEXPERIMENTALFEATURES D3D12EnableExperimentalFeatures =
364*61046927SAndroid Build Coastguard Worker             (PFN_D3D12ENABLEEXPERIMENTALFEATURES)util_dl_get_proc_address(d3d12_mod, "D3D12EnableExperimentalFeatures");
365*61046927SAndroid Build Coastguard Worker          if (FAILED(D3D12EnableExperimentalFeatures(1, &D3D12ExperimentalShaderModels, NULL, NULL))) {
366*61046927SAndroid Build Coastguard Worker             mesa_loge("failed to enable experimental shader models\n");
367*61046927SAndroid Build Coastguard Worker             return NULL;
368*61046927SAndroid Build Coastguard Worker          }
369*61046927SAndroid Build Coastguard Worker       }
370*61046927SAndroid Build Coastguard Worker    }
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker    ID3D12Device4 *dev;
373*61046927SAndroid Build Coastguard Worker    if (factory) {
374*61046927SAndroid Build Coastguard Worker       ID3D12DeviceFactory_SetFlags(factory, D3D12_DEVICE_FACTORY_FLAG_ALLOW_RETURNING_EXISTING_DEVICE |
375*61046927SAndroid Build Coastguard Worker                                             D3D12_DEVICE_FACTORY_FLAG_ALLOW_RETURNING_INCOMPATIBLE_EXISTING_DEVICE);
376*61046927SAndroid Build Coastguard Worker       if (FAILED(ID3D12DeviceFactory_CreateDevice(factory, adapter, D3D_FEATURE_LEVEL_11_0,
377*61046927SAndroid Build Coastguard Worker                                                   &IID_ID3D12Device4,
378*61046927SAndroid Build Coastguard Worker                                                   (void **)&dev))) {
379*61046927SAndroid Build Coastguard Worker          mesa_loge("ID3D12DeviceFactory::CreateDevice failed\n");
380*61046927SAndroid Build Coastguard Worker          return NULL;
381*61046927SAndroid Build Coastguard Worker       }
382*61046927SAndroid Build Coastguard Worker    } else {
383*61046927SAndroid Build Coastguard Worker       typedef HRESULT(WINAPI *PFN_D3D12CREATEDEVICE)(IUnknown *, D3D_FEATURE_LEVEL, REFIID, void **);
384*61046927SAndroid Build Coastguard Worker       PFN_D3D12CREATEDEVICE D3D12CreateDevice;
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker       D3D12CreateDevice = (PFN_D3D12CREATEDEVICE)util_dl_get_proc_address(d3d12_mod, "D3D12CreateDevice");
387*61046927SAndroid Build Coastguard Worker       if (!D3D12CreateDevice) {
388*61046927SAndroid Build Coastguard Worker          mesa_loge("failed to load D3D12CreateDevice from D3D12\n");
389*61046927SAndroid Build Coastguard Worker          return NULL;
390*61046927SAndroid Build Coastguard Worker       }
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker       if (FAILED(D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0,
393*61046927SAndroid Build Coastguard Worker                                    &IID_ID3D12Device4,
394*61046927SAndroid Build Coastguard Worker                                    (void **)&dev))) {
395*61046927SAndroid Build Coastguard Worker          mesa_loge("D3D12CreateDevice failed\n");
396*61046927SAndroid Build Coastguard Worker          return NULL;
397*61046927SAndroid Build Coastguard Worker       }
398*61046927SAndroid Build Coastguard Worker    }
399*61046927SAndroid Build Coastguard Worker    return dev;
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE
d3d12_get_serialize_root_sig(struct util_dl_library * d3d12_mod)403*61046927SAndroid Build Coastguard Worker d3d12_get_serialize_root_sig(struct util_dl_library *d3d12_mod)
404*61046927SAndroid Build Coastguard Worker {
405*61046927SAndroid Build Coastguard Worker    return (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)
406*61046927SAndroid Build Coastguard Worker       util_dl_get_proc_address(d3d12_mod, "D3D12SerializeVersionedRootSignature");
407*61046927SAndroid Build Coastguard Worker }
408