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