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 #include "vk_alloc.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_common_entrypoints.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_cmd_enqueue_entrypoints.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
30*61046927SAndroid Build Coastguard Worker #include "vk_format.h"
31*61046927SAndroid Build Coastguard Worker #include "vk_sync_dummy.h"
32*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include "git_sha1.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
37*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
38*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
39*61046927SAndroid Build Coastguard Worker #include "util/mesa-sha1.h"
40*61046927SAndroid Build Coastguard Worker #include "util/u_dl.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #include "util/driconf.h"
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker #include "glsl_types.h"
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker #include "dxil_validator.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker #include "git_sha1.h"
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker #include <string.h>
51*61046927SAndroid Build Coastguard Worker #include <stdio.h>
52*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
53*61046927SAndroid Build Coastguard Worker #include <c99_alloca.h>
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
56*61046927SAndroid Build Coastguard Worker #include <windows.h>
57*61046927SAndroid Build Coastguard Worker #include <shlobj.h>
58*61046927SAndroid Build Coastguard Worker #include "dzn_dxgi.h"
59*61046927SAndroid Build Coastguard Worker #endif
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker #include <directx/d3d12sdklayers.h>
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker #define DZN_API_VERSION VK_MAKE_VERSION(1, 2, VK_HEADER_VERSION)
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker #define MAX_TIER2_MEMORY_TYPES 4
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker const VkExternalMemoryHandleTypeFlags opaque_external_flag =
68*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
69*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
70*61046927SAndroid Build Coastguard Worker #else
71*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
72*61046927SAndroid Build Coastguard Worker #endif
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker static const struct vk_instance_extension_table instance_extensions = {
75*61046927SAndroid Build Coastguard Worker .KHR_get_physical_device_properties2 = true,
76*61046927SAndroid Build Coastguard Worker .KHR_device_group_creation = true,
77*61046927SAndroid Build Coastguard Worker #ifdef DZN_USE_WSI_PLATFORM
78*61046927SAndroid Build Coastguard Worker .KHR_surface = true,
79*61046927SAndroid Build Coastguard Worker .KHR_get_surface_capabilities2 = true,
80*61046927SAndroid Build Coastguard Worker #endif
81*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WIN32_KHR
82*61046927SAndroid Build Coastguard Worker .KHR_win32_surface = true,
83*61046927SAndroid Build Coastguard Worker #endif
84*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XCB_KHR
85*61046927SAndroid Build Coastguard Worker .KHR_xcb_surface = true,
86*61046927SAndroid Build Coastguard Worker #endif
87*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WAYLAND_KHR
88*61046927SAndroid Build Coastguard Worker .KHR_wayland_surface = true,
89*61046927SAndroid Build Coastguard Worker #endif
90*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_KHR
91*61046927SAndroid Build Coastguard Worker .KHR_xlib_surface = true,
92*61046927SAndroid Build Coastguard Worker #endif
93*61046927SAndroid Build Coastguard Worker #ifndef VK_USE_PLATFORM_WIN32_KHR
94*61046927SAndroid Build Coastguard Worker .EXT_headless_surface = true,
95*61046927SAndroid Build Coastguard Worker #endif
96*61046927SAndroid Build Coastguard Worker .EXT_debug_report = true,
97*61046927SAndroid Build Coastguard Worker .EXT_debug_utils = true,
98*61046927SAndroid Build Coastguard Worker };
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_get_extensions(struct dzn_physical_device * pdev)101*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_extensions(struct dzn_physical_device *pdev)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker pdev->vk.supported_extensions = (struct vk_device_extension_table) {
104*61046927SAndroid Build Coastguard Worker .KHR_16bit_storage = pdev->options4.Native16BitShaderOpsSupported,
105*61046927SAndroid Build Coastguard Worker .KHR_bind_memory2 = true,
106*61046927SAndroid Build Coastguard Worker .KHR_buffer_device_address = pdev->shader_model >= D3D_SHADER_MODEL_6_6,
107*61046927SAndroid Build Coastguard Worker .KHR_create_renderpass2 = true,
108*61046927SAndroid Build Coastguard Worker .KHR_dedicated_allocation = true,
109*61046927SAndroid Build Coastguard Worker .KHR_depth_stencil_resolve = true,
110*61046927SAndroid Build Coastguard Worker .KHR_descriptor_update_template = true,
111*61046927SAndroid Build Coastguard Worker .KHR_device_group = true,
112*61046927SAndroid Build Coastguard Worker .KHR_draw_indirect_count = true,
113*61046927SAndroid Build Coastguard Worker .KHR_driver_properties = true,
114*61046927SAndroid Build Coastguard Worker .KHR_dynamic_rendering = true,
115*61046927SAndroid Build Coastguard Worker .KHR_external_memory = true,
116*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore = true,
117*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
118*61046927SAndroid Build Coastguard Worker .KHR_external_memory_win32 = true,
119*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_win32 = true,
120*61046927SAndroid Build Coastguard Worker #else
121*61046927SAndroid Build Coastguard Worker .KHR_external_memory_fd = true,
122*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_fd = true,
123*61046927SAndroid Build Coastguard Worker #endif
124*61046927SAndroid Build Coastguard Worker .KHR_image_format_list = true,
125*61046927SAndroid Build Coastguard Worker .KHR_imageless_framebuffer = true,
126*61046927SAndroid Build Coastguard Worker .KHR_get_memory_requirements2 = true,
127*61046927SAndroid Build Coastguard Worker .KHR_maintenance1 = true,
128*61046927SAndroid Build Coastguard Worker .KHR_maintenance2 = true,
129*61046927SAndroid Build Coastguard Worker .KHR_maintenance3 = true,
130*61046927SAndroid Build Coastguard Worker .KHR_multiview = true,
131*61046927SAndroid Build Coastguard Worker .KHR_relaxed_block_layout = true,
132*61046927SAndroid Build Coastguard Worker .KHR_sampler_mirror_clamp_to_edge = true,
133*61046927SAndroid Build Coastguard Worker .KHR_separate_depth_stencil_layouts = true,
134*61046927SAndroid Build Coastguard Worker .KHR_shader_draw_parameters = true,
135*61046927SAndroid Build Coastguard Worker .KHR_shader_expect_assume = true,
136*61046927SAndroid Build Coastguard Worker .KHR_shader_float16_int8 = pdev->options4.Native16BitShaderOpsSupported,
137*61046927SAndroid Build Coastguard Worker .KHR_shader_float_controls = true,
138*61046927SAndroid Build Coastguard Worker .KHR_shader_integer_dot_product = true,
139*61046927SAndroid Build Coastguard Worker .KHR_spirv_1_4 = true,
140*61046927SAndroid Build Coastguard Worker .KHR_storage_buffer_storage_class = true,
141*61046927SAndroid Build Coastguard Worker #ifdef DZN_USE_WSI_PLATFORM
142*61046927SAndroid Build Coastguard Worker .KHR_swapchain = true,
143*61046927SAndroid Build Coastguard Worker #endif
144*61046927SAndroid Build Coastguard Worker .KHR_synchronization2 = true,
145*61046927SAndroid Build Coastguard Worker .KHR_timeline_semaphore = true,
146*61046927SAndroid Build Coastguard Worker .KHR_uniform_buffer_standard_layout = true,
147*61046927SAndroid Build Coastguard Worker .EXT_buffer_device_address = pdev->shader_model >= D3D_SHADER_MODEL_6_6,
148*61046927SAndroid Build Coastguard Worker .EXT_descriptor_indexing = pdev->shader_model >= D3D_SHADER_MODEL_6_6,
149*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
150*61046927SAndroid Build Coastguard Worker .EXT_external_memory_host = pdev->dev13,
151*61046927SAndroid Build Coastguard Worker #endif
152*61046927SAndroid Build Coastguard Worker .EXT_scalar_block_layout = true,
153*61046927SAndroid Build Coastguard Worker .EXT_separate_stencil_usage = true,
154*61046927SAndroid Build Coastguard Worker .EXT_shader_replicated_composites = true,
155*61046927SAndroid Build Coastguard Worker .EXT_shader_subgroup_ballot = true,
156*61046927SAndroid Build Coastguard Worker .EXT_shader_subgroup_vote = true,
157*61046927SAndroid Build Coastguard Worker .EXT_subgroup_size_control = true,
158*61046927SAndroid Build Coastguard Worker .EXT_vertex_attribute_divisor = true,
159*61046927SAndroid Build Coastguard Worker .MSFT_layered_driver = true,
160*61046927SAndroid Build Coastguard Worker };
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_EnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)164*61046927SAndroid Build Coastguard Worker dzn_EnumerateInstanceExtensionProperties(const char *pLayerName,
165*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
166*61046927SAndroid Build Coastguard Worker VkExtensionProperties *pProperties)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker /* We don't support any layers */
169*61046927SAndroid Build Coastguard Worker if (pLayerName)
170*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker return vk_enumerate_instance_extension_properties(
173*61046927SAndroid Build Coastguard Worker &instance_extensions, pPropertyCount, pProperties);
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker static const struct debug_control dzn_debug_options[] = {
177*61046927SAndroid Build Coastguard Worker { "sync", DZN_DEBUG_SYNC },
178*61046927SAndroid Build Coastguard Worker { "nir", DZN_DEBUG_NIR },
179*61046927SAndroid Build Coastguard Worker { "dxil", DZN_DEBUG_DXIL },
180*61046927SAndroid Build Coastguard Worker { "warp", DZN_DEBUG_WARP },
181*61046927SAndroid Build Coastguard Worker { "internal", DZN_DEBUG_INTERNAL },
182*61046927SAndroid Build Coastguard Worker { "signature", DZN_DEBUG_SIG },
183*61046927SAndroid Build Coastguard Worker { "gbv", DZN_DEBUG_GBV },
184*61046927SAndroid Build Coastguard Worker { "d3d12", DZN_DEBUG_D3D12 },
185*61046927SAndroid Build Coastguard Worker { "debugger", DZN_DEBUG_DEBUGGER },
186*61046927SAndroid Build Coastguard Worker { "redirects", DZN_DEBUG_REDIRECTS },
187*61046927SAndroid Build Coastguard Worker { "bindless", DZN_DEBUG_BINDLESS },
188*61046927SAndroid Build Coastguard Worker { "nobindless", DZN_DEBUG_NO_BINDLESS },
189*61046927SAndroid Build Coastguard Worker { "experimental", DZN_DEBUG_EXPERIMENTAL },
190*61046927SAndroid Build Coastguard Worker { "multiview", DZN_DEBUG_MULTIVIEW },
191*61046927SAndroid Build Coastguard Worker { NULL, 0 }
192*61046927SAndroid Build Coastguard Worker };
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_destroy(struct vk_physical_device * physical)195*61046927SAndroid Build Coastguard Worker dzn_physical_device_destroy(struct vk_physical_device *physical)
196*61046927SAndroid Build Coastguard Worker {
197*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(physical, struct dzn_physical_device, vk);
198*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance = container_of(pdev->vk.instance, struct dzn_instance, vk);
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker if (pdev->dev)
201*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(pdev->dev);
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker if (pdev->dev10)
204*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(pdev->dev10);
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker if (pdev->dev11)
207*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(pdev->dev11);
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker if (pdev->dev12)
210*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(pdev->dev12);
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker if (pdev->dev13)
213*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(pdev->dev13);
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker if (pdev->adapter)
216*61046927SAndroid Build Coastguard Worker IUnknown_Release(pdev->adapter);
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker dzn_wsi_finish(pdev);
219*61046927SAndroid Build Coastguard Worker vk_physical_device_finish(&pdev->vk);
220*61046927SAndroid Build Coastguard Worker vk_free(&instance->vk.alloc, pdev);
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker static void
dzn_instance_destroy(struct dzn_instance * instance,const VkAllocationCallbacks * alloc)224*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(struct dzn_instance *instance, const VkAllocationCallbacks *alloc)
225*61046927SAndroid Build Coastguard Worker {
226*61046927SAndroid Build Coastguard Worker if (!instance)
227*61046927SAndroid Build Coastguard Worker return;
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker vk_instance_finish(&instance->vk);
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
232*61046927SAndroid Build Coastguard Worker dxil_destroy_validator(instance->dxil_validator);
233*61046927SAndroid Build Coastguard Worker #endif
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker if (instance->factory)
236*61046927SAndroid Build Coastguard Worker ID3D12DeviceFactory_Release(instance->factory);
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker if (instance->d3d12_mod)
239*61046927SAndroid Build Coastguard Worker util_dl_close(instance->d3d12_mod);
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker vk_free2(vk_default_allocator(), alloc, instance);
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
245*61046927SAndroid Build Coastguard Worker extern IMAGE_DOS_HEADER __ImageBase;
246*61046927SAndroid Build Coastguard Worker static const char *
try_find_d3d12core_next_to_self(char * path,size_t path_arr_size)247*61046927SAndroid Build Coastguard Worker try_find_d3d12core_next_to_self(char *path, size_t path_arr_size)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker uint32_t path_size = GetModuleFileNameA((HINSTANCE)&__ImageBase,
250*61046927SAndroid Build Coastguard Worker path, path_arr_size);
251*61046927SAndroid Build Coastguard Worker if (!path_arr_size || path_size == path_arr_size) {
252*61046927SAndroid Build Coastguard Worker mesa_loge("Unable to get path to self\n");
253*61046927SAndroid Build Coastguard Worker return NULL;
254*61046927SAndroid Build Coastguard Worker }
255*61046927SAndroid Build Coastguard Worker
256*61046927SAndroid Build Coastguard Worker char *last_slash = strrchr(path, '\\');
257*61046927SAndroid Build Coastguard Worker if (!last_slash) {
258*61046927SAndroid Build Coastguard Worker mesa_loge("Unable to get path to self\n");
259*61046927SAndroid Build Coastguard Worker return NULL;
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker *(last_slash + 1) = '\0';
263*61046927SAndroid Build Coastguard Worker if (strcat_s(path, path_arr_size, "D3D12Core.dll") != 0) {
264*61046927SAndroid Build Coastguard Worker mesa_loge("Unable to get path to D3D12Core.dll next to self\n");
265*61046927SAndroid Build Coastguard Worker return NULL;
266*61046927SAndroid Build Coastguard Worker }
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker if (GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES) {
269*61046927SAndroid Build Coastguard Worker return NULL;
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker *(last_slash + 1) = '\0';
273*61046927SAndroid Build Coastguard Worker return path;
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker #endif
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker static ID3D12DeviceFactory *
try_create_device_factory(struct util_dl_library * d3d12_mod)278*61046927SAndroid Build Coastguard Worker try_create_device_factory(struct util_dl_library *d3d12_mod)
279*61046927SAndroid Build Coastguard Worker {
280*61046927SAndroid Build Coastguard Worker /* A device factory allows us to isolate things like debug layer enablement from other callers,
281*61046927SAndroid Build Coastguard Worker * and can potentially even refer to a different D3D12 redist implementation from others.
282*61046927SAndroid Build Coastguard Worker */
283*61046927SAndroid Build Coastguard Worker ID3D12DeviceFactory *factory = NULL;
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker PFN_D3D12_GET_INTERFACE D3D12GetInterface = (PFN_D3D12_GET_INTERFACE)util_dl_get_proc_address(d3d12_mod, "D3D12GetInterface");
286*61046927SAndroid Build Coastguard Worker if (!D3D12GetInterface) {
287*61046927SAndroid Build Coastguard Worker mesa_loge("Failed to retrieve D3D12GetInterface\n");
288*61046927SAndroid Build Coastguard Worker return NULL;
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
292*61046927SAndroid Build Coastguard Worker /* First, try to create a device factory from a DLL-parallel D3D12Core.dll */
293*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration *sdk_config = NULL;
294*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(D3D12GetInterface(&CLSID_D3D12SDKConfiguration, &IID_ID3D12SDKConfiguration, (void **)&sdk_config))) {
295*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration1 *sdk_config1 = NULL;
296*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(IUnknown_QueryInterface(sdk_config, &IID_ID3D12SDKConfiguration1, (void **)&sdk_config1))) {
297*61046927SAndroid Build Coastguard Worker char self_path[MAX_PATH];
298*61046927SAndroid Build Coastguard Worker const char *d3d12core_path = try_find_d3d12core_next_to_self(self_path, sizeof(self_path));
299*61046927SAndroid Build Coastguard Worker if (d3d12core_path) {
300*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(ID3D12SDKConfiguration1_CreateDeviceFactory(sdk_config1, D3D12_PREVIEW_SDK_VERSION, d3d12core_path, &IID_ID3D12DeviceFactory, (void **)&factory)) ||
301*61046927SAndroid Build Coastguard Worker SUCCEEDED(ID3D12SDKConfiguration1_CreateDeviceFactory(sdk_config1, D3D12_SDK_VERSION, d3d12core_path, &IID_ID3D12DeviceFactory, (void **)&factory))) {
302*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration_Release(sdk_config);
303*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration1_Release(sdk_config1);
304*61046927SAndroid Build Coastguard Worker return factory;
305*61046927SAndroid Build Coastguard Worker }
306*61046927SAndroid Build Coastguard Worker }
307*61046927SAndroid Build Coastguard Worker
308*61046927SAndroid Build Coastguard Worker /* Nope, seems we don't have a matching D3D12Core.dll next to ourselves */
309*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration1_Release(sdk_config1);
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker /* It's possible there's a D3D12Core.dll next to the .exe, for development/testing purposes. If so, we'll be notified
313*61046927SAndroid Build Coastguard Worker * by environment variables what the relative path is and the version to use.
314*61046927SAndroid Build Coastguard Worker */
315*61046927SAndroid Build Coastguard Worker const char *d3d12core_relative_path = getenv("DZN_AGILITY_RELATIVE_PATH");
316*61046927SAndroid Build Coastguard Worker const char *d3d12core_sdk_version = getenv("DZN_AGILITY_SDK_VERSION");
317*61046927SAndroid Build Coastguard Worker if (d3d12core_relative_path && d3d12core_sdk_version) {
318*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration_SetSDKVersion(sdk_config, atoi(d3d12core_sdk_version), d3d12core_relative_path);
319*61046927SAndroid Build Coastguard Worker }
320*61046927SAndroid Build Coastguard Worker ID3D12SDKConfiguration_Release(sdk_config);
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker #endif
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker (void)D3D12GetInterface(&CLSID_D3D12DeviceFactory, &IID_ID3D12DeviceFactory, (void **)&factory);
325*61046927SAndroid Build Coastguard Worker return factory;
326*61046927SAndroid Build Coastguard Worker }
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyInstance(VkInstance instance,const VkAllocationCallbacks * pAllocator)329*61046927SAndroid Build Coastguard Worker dzn_DestroyInstance(VkInstance instance,
330*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(dzn_instance_from_handle(instance), pAllocator);
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_init_uuids(struct dzn_physical_device * pdev)336*61046927SAndroid Build Coastguard Worker dzn_physical_device_init_uuids(struct dzn_physical_device *pdev)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker const char *mesa_version = "Mesa " PACKAGE_VERSION MESA_GIT_SHA1;
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker struct mesa_sha1 sha1_ctx;
341*61046927SAndroid Build Coastguard Worker uint8_t sha1[SHA1_DIGEST_LENGTH];
342*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(VK_UUID_SIZE <= sizeof(sha1));
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker /* The pipeline cache UUID is used for determining when a pipeline cache is
345*61046927SAndroid Build Coastguard Worker * invalid. Our cache is device-agnostic, but it does depend on the features
346*61046927SAndroid Build Coastguard Worker * provided by the D3D12 driver, so let's hash the build ID plus some
347*61046927SAndroid Build Coastguard Worker * caps that might impact our NIR lowering passes.
348*61046927SAndroid Build Coastguard Worker */
349*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
350*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, mesa_version, strlen(mesa_version));
351*61046927SAndroid Build Coastguard Worker disk_cache_get_function_identifier(dzn_physical_device_init_uuids, &sha1_ctx);
352*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &pdev->options,
353*61046927SAndroid Build Coastguard Worker offsetof(struct dzn_physical_device, options21) + sizeof(pdev->options21) -
354*61046927SAndroid Build Coastguard Worker offsetof(struct dzn_physical_device, options));
355*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
356*61046927SAndroid Build Coastguard Worker memcpy(pdev->pipeline_cache_uuid, sha1, VK_UUID_SIZE);
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker /* The driver UUID is used for determining sharability of images and memory
359*61046927SAndroid Build Coastguard Worker * between two Vulkan instances in separate processes. People who want to
360*61046927SAndroid Build Coastguard Worker * share memory need to also check the device UUID (below) so all this
361*61046927SAndroid Build Coastguard Worker * needs to be is the build-id.
362*61046927SAndroid Build Coastguard Worker */
363*61046927SAndroid Build Coastguard Worker _mesa_sha1_compute(mesa_version, strlen(mesa_version), sha1);
364*61046927SAndroid Build Coastguard Worker memcpy(pdev->driver_uuid, sha1, VK_UUID_SIZE);
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker /* The device UUID uniquely identifies the given device within the machine. */
367*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
368*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &pdev->desc.vendor_id, sizeof(pdev->desc.vendor_id));
369*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &pdev->desc.device_id, sizeof(pdev->desc.device_id));
370*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &pdev->desc.subsys_id, sizeof(pdev->desc.subsys_id));
371*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &pdev->desc.revision, sizeof(pdev->desc.revision));
372*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
373*61046927SAndroid Build Coastguard Worker memcpy(pdev->device_uuid, sha1, VK_UUID_SIZE);
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker const struct vk_pipeline_cache_object_ops *const dzn_pipeline_cache_import_ops[] = {
377*61046927SAndroid Build Coastguard Worker &dzn_cached_blob_ops,
378*61046927SAndroid Build Coastguard Worker NULL,
379*61046927SAndroid Build Coastguard Worker };
380*61046927SAndroid Build Coastguard Worker
381*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_cache_caps(struct dzn_physical_device * pdev)382*61046927SAndroid Build Coastguard Worker dzn_physical_device_cache_caps(struct dzn_physical_device *pdev)
383*61046927SAndroid Build Coastguard Worker {
384*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL checklist[] = {
385*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL_11_0,
386*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL_11_1,
387*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL_12_0,
388*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL_12_1,
389*61046927SAndroid Build Coastguard Worker D3D_FEATURE_LEVEL_12_2,
390*61046927SAndroid Build Coastguard Worker };
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FEATURE_LEVELS levels = {
393*61046927SAndroid Build Coastguard Worker .NumFeatureLevels = ARRAY_SIZE(checklist),
394*61046927SAndroid Build Coastguard Worker .pFeatureLevelsRequested = checklist,
395*61046927SAndroid Build Coastguard Worker };
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_FEATURE_LEVELS, &levels, sizeof(levels));
398*61046927SAndroid Build Coastguard Worker pdev->feature_level = levels.MaxSupportedFeatureLevel;
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker static const D3D_SHADER_MODEL valid_shader_models[] = {
401*61046927SAndroid Build Coastguard Worker D3D_SHADER_MODEL_6_8 ,D3D_SHADER_MODEL_6_7, D3D_SHADER_MODEL_6_6, D3D_SHADER_MODEL_6_5,
402*61046927SAndroid Build Coastguard Worker D3D_SHADER_MODEL_6_4, D3D_SHADER_MODEL_6_3, D3D_SHADER_MODEL_6_2, D3D_SHADER_MODEL_6_1,
403*61046927SAndroid Build Coastguard Worker };
404*61046927SAndroid Build Coastguard Worker for (UINT i = 0; i < ARRAY_SIZE(valid_shader_models); ++i) {
405*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_SHADER_MODEL shader_model = { valid_shader_models[i] };
406*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_SHADER_MODEL, &shader_model, sizeof(shader_model)))) {
407*61046927SAndroid Build Coastguard Worker pdev->shader_model = shader_model.HighestShaderModel;
408*61046927SAndroid Build Coastguard Worker break;
409*61046927SAndroid Build Coastguard Worker }
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker D3D_ROOT_SIGNATURE_VERSION root_sig_versions[] = {
413*61046927SAndroid Build Coastguard Worker D3D_ROOT_SIGNATURE_VERSION_1_2,
414*61046927SAndroid Build Coastguard Worker D3D_ROOT_SIGNATURE_VERSION_1_1
415*61046927SAndroid Build Coastguard Worker };
416*61046927SAndroid Build Coastguard Worker for (UINT i = 0; i < ARRAY_SIZE(root_sig_versions); ++i) {
417*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_ROOT_SIGNATURE root_sig = { root_sig_versions[i] };
418*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_ROOT_SIGNATURE, &root_sig, sizeof(root_sig)))) {
419*61046927SAndroid Build Coastguard Worker pdev->root_sig_version = root_sig.HighestVersion;
420*61046927SAndroid Build Coastguard Worker break;
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker }
423*61046927SAndroid Build Coastguard Worker
424*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_ARCHITECTURE1, &pdev->architecture, sizeof(pdev->architecture));
425*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS, &pdev->options, sizeof(pdev->options));
426*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS1, &pdev->options1, sizeof(pdev->options1));
427*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS2, &pdev->options2, sizeof(pdev->options2));
428*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS3, &pdev->options3, sizeof(pdev->options3));
429*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS4, &pdev->options4, sizeof(pdev->options4));
430*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS12, &pdev->options12, sizeof(pdev->options12));
431*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS13, &pdev->options13, sizeof(pdev->options13));
432*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS14, &pdev->options14, sizeof(pdev->options14));
433*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS15, &pdev->options15, sizeof(pdev->options15));
434*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS16, &pdev->options16, sizeof(pdev->options16));
435*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS17, &pdev->options17, sizeof(pdev->options17));
436*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS19, &pdev->options19, sizeof(pdev->options19)))) {
437*61046927SAndroid Build Coastguard Worker pdev->options19.MaxSamplerDescriptorHeapSize = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE;
438*61046927SAndroid Build Coastguard Worker pdev->options19.MaxSamplerDescriptorHeapSizeWithStaticSamplers = pdev->options19.MaxSamplerDescriptorHeapSize;
439*61046927SAndroid Build Coastguard Worker pdev->options19.MaxViewDescriptorHeapSize = D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1;
440*61046927SAndroid Build Coastguard Worker }
441*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS21, &pdev->options21, sizeof(pdev->options21)))) {
442*61046927SAndroid Build Coastguard Worker pdev->options21.ExecuteIndirectTier = D3D12_EXECUTE_INDIRECT_TIER_1_0;
443*61046927SAndroid Build Coastguard Worker }
444*61046927SAndroid Build Coastguard Worker {
445*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT a4b4g4r4_support = {
446*61046927SAndroid Build Coastguard Worker .Format = DXGI_FORMAT_A4B4G4R4_UNORM
447*61046927SAndroid Build Coastguard Worker };
448*61046927SAndroid Build Coastguard Worker pdev->support_a4b4g4r4 =
449*61046927SAndroid Build Coastguard Worker SUCCEEDED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_FORMAT_SUPPORT, &a4b4g4r4_support, sizeof(a4b4g4r4_support)));
450*61046927SAndroid Build Coastguard Worker }
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker pdev->queue_families[pdev->queue_family_count++] = (struct dzn_queue_family) {
453*61046927SAndroid Build Coastguard Worker .props = {
454*61046927SAndroid Build Coastguard Worker .queueFlags = VK_QUEUE_GRAPHICS_BIT |
455*61046927SAndroid Build Coastguard Worker VK_QUEUE_COMPUTE_BIT |
456*61046927SAndroid Build Coastguard Worker VK_QUEUE_TRANSFER_BIT,
457*61046927SAndroid Build Coastguard Worker .queueCount = 4,
458*61046927SAndroid Build Coastguard Worker .timestampValidBits = 64,
459*61046927SAndroid Build Coastguard Worker .minImageTransferGranularity = { 0, 0, 0 },
460*61046927SAndroid Build Coastguard Worker },
461*61046927SAndroid Build Coastguard Worker .desc = {
462*61046927SAndroid Build Coastguard Worker .Type = D3D12_COMMAND_LIST_TYPE_DIRECT,
463*61046927SAndroid Build Coastguard Worker },
464*61046927SAndroid Build Coastguard Worker };
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker pdev->queue_families[pdev->queue_family_count++] = (struct dzn_queue_family) {
467*61046927SAndroid Build Coastguard Worker .props = {
468*61046927SAndroid Build Coastguard Worker .queueFlags = VK_QUEUE_COMPUTE_BIT |
469*61046927SAndroid Build Coastguard Worker VK_QUEUE_TRANSFER_BIT,
470*61046927SAndroid Build Coastguard Worker .queueCount = 8,
471*61046927SAndroid Build Coastguard Worker .timestampValidBits = 64,
472*61046927SAndroid Build Coastguard Worker .minImageTransferGranularity = { 0, 0, 0 },
473*61046927SAndroid Build Coastguard Worker },
474*61046927SAndroid Build Coastguard Worker .desc = {
475*61046927SAndroid Build Coastguard Worker .Type = D3D12_COMMAND_LIST_TYPE_COMPUTE,
476*61046927SAndroid Build Coastguard Worker },
477*61046927SAndroid Build Coastguard Worker };
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker assert(pdev->queue_family_count <= ARRAY_SIZE(pdev->queue_families));
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker D3D12_COMMAND_QUEUE_DESC queue_desc = {
482*61046927SAndroid Build Coastguard Worker .Type = D3D12_COMMAND_LIST_TYPE_DIRECT,
483*61046927SAndroid Build Coastguard Worker .Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL,
484*61046927SAndroid Build Coastguard Worker .Flags = D3D12_COMMAND_QUEUE_FLAG_NONE,
485*61046927SAndroid Build Coastguard Worker .NodeMask = 0,
486*61046927SAndroid Build Coastguard Worker };
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker ID3D12CommandQueue *cmdqueue;
489*61046927SAndroid Build Coastguard Worker ID3D12Device1_CreateCommandQueue(pdev->dev, &queue_desc,
490*61046927SAndroid Build Coastguard Worker &IID_ID3D12CommandQueue,
491*61046927SAndroid Build Coastguard Worker (void **)&cmdqueue);
492*61046927SAndroid Build Coastguard Worker
493*61046927SAndroid Build Coastguard Worker uint64_t ts_freq;
494*61046927SAndroid Build Coastguard Worker ID3D12CommandQueue_GetTimestampFrequency(cmdqueue, &ts_freq);
495*61046927SAndroid Build Coastguard Worker pdev->timestamp_period = 1000000000.0f / ts_freq;
496*61046927SAndroid Build Coastguard Worker ID3D12CommandQueue_Release(cmdqueue);
497*61046927SAndroid Build Coastguard Worker }
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_init_memory(struct dzn_physical_device * pdev)500*61046927SAndroid Build Coastguard Worker dzn_physical_device_init_memory(struct dzn_physical_device *pdev)
501*61046927SAndroid Build Coastguard Worker {
502*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties *mem = &pdev->memory;
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker /* For each pair of elements X and Y returned in memoryTypes, X must be placed at a lower index position than Y if:
505*61046927SAndroid Build Coastguard Worker * - the set of bit flags returned in the propertyFlags member of X is a strict subset of the set of bit flags
506*61046927SAndroid Build Coastguard Worker * returned in the propertyFlags member of Y; or
507*61046927SAndroid Build Coastguard Worker * - the propertyFlags members of X and Y are equal, and X belongs to a memory heap with greater performance
508*61046927SAndroid Build Coastguard Worker * (as determined in an implementation-specific manner) ; or
509*61046927SAndroid Build Coastguard Worker * - the propertyFlags members of Y includes VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD or
510*61046927SAndroid Build Coastguard Worker * VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD and X does not
511*61046927SAndroid Build Coastguard Worker * See: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceMemoryProperties.html
512*61046927SAndroid Build Coastguard Worker */
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker mem->memoryHeapCount = 0;
515*61046927SAndroid Build Coastguard Worker mem->memoryTypeCount = 0;
516*61046927SAndroid Build Coastguard Worker
517*61046927SAndroid Build Coastguard Worker VkMemoryPropertyFlags ram_device_local_property = 0;
518*61046927SAndroid Build Coastguard Worker VkMemoryHeapFlags ram_device_local_heap_flag = 0;
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker if (pdev->architecture.UMA) {
521*61046927SAndroid Build Coastguard Worker /* All memory is considered device-local for UMA even though it's just RAM */
522*61046927SAndroid Build Coastguard Worker ram_device_local_property = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
523*61046927SAndroid Build Coastguard Worker ram_device_local_heap_flag = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
524*61046927SAndroid Build Coastguard Worker }
525*61046927SAndroid Build Coastguard Worker
526*61046927SAndroid Build Coastguard Worker mem->memoryHeaps[mem->memoryHeapCount++] = (VkMemoryHeap) {
527*61046927SAndroid Build Coastguard Worker .size = pdev->desc.shared_system_memory,
528*61046927SAndroid Build Coastguard Worker .flags = ram_device_local_heap_flag,
529*61046927SAndroid Build Coastguard Worker };
530*61046927SAndroid Build Coastguard Worker
531*61046927SAndroid Build Coastguard Worker /* Three non-device-local memory types: host non-visible, host write-combined, and host cached */
532*61046927SAndroid Build Coastguard Worker mem->memoryTypes[mem->memoryTypeCount++] = (VkMemoryType){
533*61046927SAndroid Build Coastguard Worker .propertyFlags = ram_device_local_property,
534*61046927SAndroid Build Coastguard Worker .heapIndex = mem->memoryHeapCount - 1,
535*61046927SAndroid Build Coastguard Worker };
536*61046927SAndroid Build Coastguard Worker mem->memoryTypes[mem->memoryTypeCount++] = (VkMemoryType){
537*61046927SAndroid Build Coastguard Worker .propertyFlags = ram_device_local_property |
538*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
539*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
540*61046927SAndroid Build Coastguard Worker .heapIndex = mem->memoryHeapCount - 1,
541*61046927SAndroid Build Coastguard Worker };
542*61046927SAndroid Build Coastguard Worker mem->memoryTypes[mem->memoryTypeCount++] = (VkMemoryType) {
543*61046927SAndroid Build Coastguard Worker .propertyFlags = ram_device_local_property |
544*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
545*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
546*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
547*61046927SAndroid Build Coastguard Worker .heapIndex = mem->memoryHeapCount - 1,
548*61046927SAndroid Build Coastguard Worker };
549*61046927SAndroid Build Coastguard Worker
550*61046927SAndroid Build Coastguard Worker if (!pdev->architecture.UMA) {
551*61046927SAndroid Build Coastguard Worker /* Add a device-local memory heap/type */
552*61046927SAndroid Build Coastguard Worker mem->memoryHeaps[mem->memoryHeapCount++] = (VkMemoryHeap){
553*61046927SAndroid Build Coastguard Worker .size = pdev->desc.dedicated_video_memory,
554*61046927SAndroid Build Coastguard Worker .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
555*61046927SAndroid Build Coastguard Worker };
556*61046927SAndroid Build Coastguard Worker mem->memoryTypes[mem->memoryTypeCount++] = (VkMemoryType){
557*61046927SAndroid Build Coastguard Worker .propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
558*61046927SAndroid Build Coastguard Worker .heapIndex = mem->memoryHeapCount - 1,
559*61046927SAndroid Build Coastguard Worker };
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker assert(mem->memoryTypeCount <= MAX_TIER2_MEMORY_TYPES);
563*61046927SAndroid Build Coastguard Worker
564*61046927SAndroid Build Coastguard Worker if (pdev->options.ResourceHeapTier == D3D12_RESOURCE_HEAP_TIER_1) {
565*61046927SAndroid Build Coastguard Worker unsigned oldMemoryTypeCount = mem->memoryTypeCount;
566*61046927SAndroid Build Coastguard Worker VkMemoryType oldMemoryTypes[MAX_TIER2_MEMORY_TYPES];
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker memcpy(oldMemoryTypes, mem->memoryTypes, oldMemoryTypeCount * sizeof(VkMemoryType));
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker mem->memoryTypeCount = 0;
571*61046927SAndroid Build Coastguard Worker for (unsigned oldMemoryTypeIdx = 0; oldMemoryTypeIdx < oldMemoryTypeCount; ++oldMemoryTypeIdx) {
572*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAGS flags[] = {
573*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS,
574*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAG_ALLOW_ONLY_RT_DS_TEXTURES,
575*61046927SAndroid Build Coastguard Worker /* Note: Vulkan requires *all* images to come from the same memory type as long as
576*61046927SAndroid Build Coastguard Worker * the tiling property (and a few other misc properties) are the same. So, this
577*61046927SAndroid Build Coastguard Worker * non-RT/DS texture flag will only be used for TILING_LINEAR textures, which
578*61046927SAndroid Build Coastguard Worker * can't be render targets.
579*61046927SAndroid Build Coastguard Worker */
580*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES
581*61046927SAndroid Build Coastguard Worker };
582*61046927SAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE(flags); ++i) {
583*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAGS flag = flags[i];
584*61046927SAndroid Build Coastguard Worker pdev->heap_flags_for_mem_type[mem->memoryTypeCount] = flag;
585*61046927SAndroid Build Coastguard Worker mem->memoryTypes[mem->memoryTypeCount] = oldMemoryTypes[oldMemoryTypeIdx];
586*61046927SAndroid Build Coastguard Worker mem->memoryTypeCount++;
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker }
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker }
591*61046927SAndroid Build Coastguard Worker
592*61046927SAndroid Build Coastguard Worker static D3D12_HEAP_FLAGS
dzn_physical_device_get_heap_flags_for_mem_type(const struct dzn_physical_device * pdev,uint32_t mem_type)593*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_heap_flags_for_mem_type(const struct dzn_physical_device *pdev,
594*61046927SAndroid Build Coastguard Worker uint32_t mem_type)
595*61046927SAndroid Build Coastguard Worker {
596*61046927SAndroid Build Coastguard Worker return pdev->heap_flags_for_mem_type[mem_type];
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker
599*61046927SAndroid Build Coastguard Worker uint32_t
dzn_physical_device_get_mem_type_mask_for_resource(const struct dzn_physical_device * pdev,const D3D12_RESOURCE_DESC * desc,bool shared)600*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_mem_type_mask_for_resource(const struct dzn_physical_device *pdev,
601*61046927SAndroid Build Coastguard Worker const D3D12_RESOURCE_DESC *desc,
602*61046927SAndroid Build Coastguard Worker bool shared)
603*61046927SAndroid Build Coastguard Worker {
604*61046927SAndroid Build Coastguard Worker if (pdev->options.ResourceHeapTier > D3D12_RESOURCE_HEAP_TIER_1 && !shared)
605*61046927SAndroid Build Coastguard Worker return (1u << pdev->memory.memoryTypeCount) - 1;
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAGS deny_flag = D3D12_HEAP_FLAG_NONE;
608*61046927SAndroid Build Coastguard Worker if (pdev->options.ResourceHeapTier <= D3D12_RESOURCE_HEAP_TIER_1) {
609*61046927SAndroid Build Coastguard Worker if (desc->Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
610*61046927SAndroid Build Coastguard Worker deny_flag = D3D12_HEAP_FLAG_DENY_BUFFERS;
611*61046927SAndroid Build Coastguard Worker else if (desc->Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL))
612*61046927SAndroid Build Coastguard Worker deny_flag = D3D12_HEAP_FLAG_DENY_RT_DS_TEXTURES;
613*61046927SAndroid Build Coastguard Worker else
614*61046927SAndroid Build Coastguard Worker deny_flag = D3D12_HEAP_FLAG_DENY_NON_RT_DS_TEXTURES;
615*61046927SAndroid Build Coastguard Worker }
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker uint32_t mask = 0;
618*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pdev->memory.memoryTypeCount; ++i) {
619*61046927SAndroid Build Coastguard Worker if (shared && (pdev->memory.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
620*61046927SAndroid Build Coastguard Worker continue;
621*61046927SAndroid Build Coastguard Worker if ((pdev->heap_flags_for_mem_type[i] & deny_flag) == D3D12_HEAP_FLAG_NONE)
622*61046927SAndroid Build Coastguard Worker mask |= (1 << i);
623*61046927SAndroid Build Coastguard Worker }
624*61046927SAndroid Build Coastguard Worker return mask;
625*61046927SAndroid Build Coastguard Worker }
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker static uint32_t
dzn_physical_device_get_max_mip_level(bool is_3d)628*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_max_mip_level(bool is_3d)
629*61046927SAndroid Build Coastguard Worker {
630*61046927SAndroid Build Coastguard Worker return is_3d ? 11 : 14;
631*61046927SAndroid Build Coastguard Worker }
632*61046927SAndroid Build Coastguard Worker
633*61046927SAndroid Build Coastguard Worker static uint32_t
dzn_physical_device_get_max_extent(bool is_3d)634*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_max_extent(bool is_3d)
635*61046927SAndroid Build Coastguard Worker {
636*61046927SAndroid Build Coastguard Worker uint32_t max_mip = dzn_physical_device_get_max_mip_level(is_3d);
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker return 1 << max_mip;
639*61046927SAndroid Build Coastguard Worker }
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker static uint32_t
dzn_physical_device_get_max_array_layers()642*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_max_array_layers()
643*61046927SAndroid Build Coastguard Worker {
644*61046927SAndroid Build Coastguard Worker return dzn_physical_device_get_max_extent(false);
645*61046927SAndroid Build Coastguard Worker }
646*61046927SAndroid Build Coastguard Worker
647*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_get_features(const struct dzn_physical_device * pdev,struct vk_features * features)648*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_features(const struct dzn_physical_device *pdev,
649*61046927SAndroid Build Coastguard Worker struct vk_features *features)
650*61046927SAndroid Build Coastguard Worker {
651*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance = container_of(pdev->vk.instance, struct dzn_instance, vk);
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker bool support_descriptor_indexing = pdev->shader_model >= D3D_SHADER_MODEL_6_6 &&
654*61046927SAndroid Build Coastguard Worker !(instance->debug_flags & DZN_DEBUG_NO_BINDLESS);
655*61046927SAndroid Build Coastguard Worker bool support_8bit = driQueryOptionb(&instance->dri_options, "dzn_enable_8bit_loads_stores") &&
656*61046927SAndroid Build Coastguard Worker pdev->options4.Native16BitShaderOpsSupported;
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker *features = (struct vk_features) {
659*61046927SAndroid Build Coastguard Worker .robustBufferAccess = true, /* This feature is mandatory */
660*61046927SAndroid Build Coastguard Worker .fullDrawIndexUint32 = false,
661*61046927SAndroid Build Coastguard Worker .imageCubeArray = true,
662*61046927SAndroid Build Coastguard Worker .independentBlend = true,
663*61046927SAndroid Build Coastguard Worker .geometryShader = true,
664*61046927SAndroid Build Coastguard Worker .tessellationShader = false,
665*61046927SAndroid Build Coastguard Worker .sampleRateShading = true,
666*61046927SAndroid Build Coastguard Worker .dualSrcBlend = false,
667*61046927SAndroid Build Coastguard Worker .logicOp = false,
668*61046927SAndroid Build Coastguard Worker .multiDrawIndirect = true,
669*61046927SAndroid Build Coastguard Worker .drawIndirectFirstInstance = true,
670*61046927SAndroid Build Coastguard Worker .depthClamp = true,
671*61046927SAndroid Build Coastguard Worker .depthBiasClamp = true,
672*61046927SAndroid Build Coastguard Worker .fillModeNonSolid = true,
673*61046927SAndroid Build Coastguard Worker .depthBounds = pdev->options2.DepthBoundsTestSupported,
674*61046927SAndroid Build Coastguard Worker .wideLines = driQueryOptionb(&instance->dri_options, "dzn_claim_wide_lines"),
675*61046927SAndroid Build Coastguard Worker .largePoints = false,
676*61046927SAndroid Build Coastguard Worker .alphaToOne = false,
677*61046927SAndroid Build Coastguard Worker .multiViewport = false,
678*61046927SAndroid Build Coastguard Worker .samplerAnisotropy = true,
679*61046927SAndroid Build Coastguard Worker .textureCompressionETC2 = false,
680*61046927SAndroid Build Coastguard Worker .textureCompressionASTC_LDR = false,
681*61046927SAndroid Build Coastguard Worker .textureCompressionBC = true,
682*61046927SAndroid Build Coastguard Worker .occlusionQueryPrecise = true,
683*61046927SAndroid Build Coastguard Worker .pipelineStatisticsQuery = true,
684*61046927SAndroid Build Coastguard Worker .vertexPipelineStoresAndAtomics = true,
685*61046927SAndroid Build Coastguard Worker .fragmentStoresAndAtomics = true,
686*61046927SAndroid Build Coastguard Worker .shaderTessellationAndGeometryPointSize = false,
687*61046927SAndroid Build Coastguard Worker .shaderImageGatherExtended = true,
688*61046927SAndroid Build Coastguard Worker .shaderStorageImageExtendedFormats = pdev->options.TypedUAVLoadAdditionalFormats,
689*61046927SAndroid Build Coastguard Worker .shaderStorageImageMultisample = false,
690*61046927SAndroid Build Coastguard Worker .shaderStorageImageReadWithoutFormat = true,
691*61046927SAndroid Build Coastguard Worker .shaderStorageImageWriteWithoutFormat = true,
692*61046927SAndroid Build Coastguard Worker .shaderUniformBufferArrayDynamicIndexing = true,
693*61046927SAndroid Build Coastguard Worker .shaderSampledImageArrayDynamicIndexing = true,
694*61046927SAndroid Build Coastguard Worker .shaderStorageBufferArrayDynamicIndexing = true,
695*61046927SAndroid Build Coastguard Worker .shaderStorageImageArrayDynamicIndexing = true,
696*61046927SAndroid Build Coastguard Worker .shaderClipDistance = true,
697*61046927SAndroid Build Coastguard Worker .shaderCullDistance = true,
698*61046927SAndroid Build Coastguard Worker .shaderFloat64 = pdev->options.DoublePrecisionFloatShaderOps,
699*61046927SAndroid Build Coastguard Worker .shaderInt64 = pdev->options1.Int64ShaderOps,
700*61046927SAndroid Build Coastguard Worker .shaderInt16 = pdev->options4.Native16BitShaderOpsSupported,
701*61046927SAndroid Build Coastguard Worker .shaderResourceResidency = false,
702*61046927SAndroid Build Coastguard Worker .shaderResourceMinLod = false,
703*61046927SAndroid Build Coastguard Worker .sparseBinding = false,
704*61046927SAndroid Build Coastguard Worker .sparseResidencyBuffer = false,
705*61046927SAndroid Build Coastguard Worker .sparseResidencyImage2D = false,
706*61046927SAndroid Build Coastguard Worker .sparseResidencyImage3D = false,
707*61046927SAndroid Build Coastguard Worker .sparseResidency2Samples = false,
708*61046927SAndroid Build Coastguard Worker .sparseResidency4Samples = false,
709*61046927SAndroid Build Coastguard Worker .sparseResidency8Samples = false,
710*61046927SAndroid Build Coastguard Worker .sparseResidency16Samples = false,
711*61046927SAndroid Build Coastguard Worker .sparseResidencyAliased = false,
712*61046927SAndroid Build Coastguard Worker .variableMultisampleRate = false,
713*61046927SAndroid Build Coastguard Worker .inheritedQueries = false,
714*61046927SAndroid Build Coastguard Worker
715*61046927SAndroid Build Coastguard Worker .storageBuffer16BitAccess = pdev->options4.Native16BitShaderOpsSupported,
716*61046927SAndroid Build Coastguard Worker .uniformAndStorageBuffer16BitAccess = pdev->options4.Native16BitShaderOpsSupported,
717*61046927SAndroid Build Coastguard Worker .storagePushConstant16 = false,
718*61046927SAndroid Build Coastguard Worker .storageInputOutput16 = false,
719*61046927SAndroid Build Coastguard Worker .multiview = true,
720*61046927SAndroid Build Coastguard Worker .multiviewGeometryShader = true,
721*61046927SAndroid Build Coastguard Worker .multiviewTessellationShader = false,
722*61046927SAndroid Build Coastguard Worker .variablePointersStorageBuffer = false,
723*61046927SAndroid Build Coastguard Worker .variablePointers = false,
724*61046927SAndroid Build Coastguard Worker .protectedMemory = false,
725*61046927SAndroid Build Coastguard Worker .samplerYcbcrConversion = false,
726*61046927SAndroid Build Coastguard Worker .shaderDrawParameters = true,
727*61046927SAndroid Build Coastguard Worker
728*61046927SAndroid Build Coastguard Worker .samplerMirrorClampToEdge = true,
729*61046927SAndroid Build Coastguard Worker .drawIndirectCount = true,
730*61046927SAndroid Build Coastguard Worker .storageBuffer8BitAccess = support_8bit,
731*61046927SAndroid Build Coastguard Worker .uniformAndStorageBuffer8BitAccess = support_8bit,
732*61046927SAndroid Build Coastguard Worker .storagePushConstant8 = support_8bit,
733*61046927SAndroid Build Coastguard Worker .shaderBufferInt64Atomics = false,
734*61046927SAndroid Build Coastguard Worker .shaderSharedInt64Atomics = false,
735*61046927SAndroid Build Coastguard Worker .shaderFloat16 = pdev->options4.Native16BitShaderOpsSupported,
736*61046927SAndroid Build Coastguard Worker .shaderInt8 = support_8bit,
737*61046927SAndroid Build Coastguard Worker
738*61046927SAndroid Build Coastguard Worker .descriptorIndexing = support_descriptor_indexing,
739*61046927SAndroid Build Coastguard Worker .shaderInputAttachmentArrayDynamicIndexing = true,
740*61046927SAndroid Build Coastguard Worker .shaderUniformTexelBufferArrayDynamicIndexing = true,
741*61046927SAndroid Build Coastguard Worker .shaderStorageTexelBufferArrayDynamicIndexing = true,
742*61046927SAndroid Build Coastguard Worker .shaderUniformBufferArrayNonUniformIndexing = support_descriptor_indexing,
743*61046927SAndroid Build Coastguard Worker .shaderSampledImageArrayNonUniformIndexing = support_descriptor_indexing,
744*61046927SAndroid Build Coastguard Worker .shaderStorageBufferArrayNonUniformIndexing = support_descriptor_indexing,
745*61046927SAndroid Build Coastguard Worker .shaderStorageImageArrayNonUniformIndexing = support_descriptor_indexing,
746*61046927SAndroid Build Coastguard Worker .shaderInputAttachmentArrayNonUniformIndexing = support_descriptor_indexing,
747*61046927SAndroid Build Coastguard Worker .shaderUniformTexelBufferArrayNonUniformIndexing = support_descriptor_indexing,
748*61046927SAndroid Build Coastguard Worker .shaderStorageTexelBufferArrayNonUniformIndexing = support_descriptor_indexing,
749*61046927SAndroid Build Coastguard Worker .descriptorBindingUniformBufferUpdateAfterBind = support_descriptor_indexing,
750*61046927SAndroid Build Coastguard Worker .descriptorBindingSampledImageUpdateAfterBind = support_descriptor_indexing,
751*61046927SAndroid Build Coastguard Worker .descriptorBindingStorageImageUpdateAfterBind = support_descriptor_indexing,
752*61046927SAndroid Build Coastguard Worker .descriptorBindingStorageBufferUpdateAfterBind = support_descriptor_indexing,
753*61046927SAndroid Build Coastguard Worker .descriptorBindingUniformTexelBufferUpdateAfterBind = support_descriptor_indexing,
754*61046927SAndroid Build Coastguard Worker .descriptorBindingStorageTexelBufferUpdateAfterBind = support_descriptor_indexing,
755*61046927SAndroid Build Coastguard Worker .descriptorBindingUpdateUnusedWhilePending = support_descriptor_indexing,
756*61046927SAndroid Build Coastguard Worker .descriptorBindingPartiallyBound = support_descriptor_indexing,
757*61046927SAndroid Build Coastguard Worker .descriptorBindingVariableDescriptorCount = support_descriptor_indexing,
758*61046927SAndroid Build Coastguard Worker .runtimeDescriptorArray = support_descriptor_indexing,
759*61046927SAndroid Build Coastguard Worker
760*61046927SAndroid Build Coastguard Worker .samplerFilterMinmax = false,
761*61046927SAndroid Build Coastguard Worker .scalarBlockLayout = true,
762*61046927SAndroid Build Coastguard Worker .imagelessFramebuffer = true,
763*61046927SAndroid Build Coastguard Worker .uniformBufferStandardLayout = true,
764*61046927SAndroid Build Coastguard Worker .shaderSubgroupExtendedTypes = true,
765*61046927SAndroid Build Coastguard Worker .separateDepthStencilLayouts = true,
766*61046927SAndroid Build Coastguard Worker .hostQueryReset = true,
767*61046927SAndroid Build Coastguard Worker .timelineSemaphore = true,
768*61046927SAndroid Build Coastguard Worker .bufferDeviceAddress = pdev->shader_model >= D3D_SHADER_MODEL_6_6,
769*61046927SAndroid Build Coastguard Worker .bufferDeviceAddressCaptureReplay = false,
770*61046927SAndroid Build Coastguard Worker .bufferDeviceAddressMultiDevice = false,
771*61046927SAndroid Build Coastguard Worker .vulkanMemoryModel = false,
772*61046927SAndroid Build Coastguard Worker .vulkanMemoryModelDeviceScope = false,
773*61046927SAndroid Build Coastguard Worker .vulkanMemoryModelAvailabilityVisibilityChains = false,
774*61046927SAndroid Build Coastguard Worker .shaderOutputViewportIndex = false,
775*61046927SAndroid Build Coastguard Worker .shaderOutputLayer = false,
776*61046927SAndroid Build Coastguard Worker .subgroupBroadcastDynamicId = true,
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker .robustImageAccess = false,
779*61046927SAndroid Build Coastguard Worker .inlineUniformBlock = false,
780*61046927SAndroid Build Coastguard Worker .descriptorBindingInlineUniformBlockUpdateAfterBind = false,
781*61046927SAndroid Build Coastguard Worker .pipelineCreationCacheControl = false,
782*61046927SAndroid Build Coastguard Worker .privateData = true,
783*61046927SAndroid Build Coastguard Worker .shaderDemoteToHelperInvocation = false,
784*61046927SAndroid Build Coastguard Worker .shaderTerminateInvocation = false,
785*61046927SAndroid Build Coastguard Worker .subgroupSizeControl = pdev->options1.WaveOps && pdev->shader_model >= D3D_SHADER_MODEL_6_6,
786*61046927SAndroid Build Coastguard Worker .computeFullSubgroups = true,
787*61046927SAndroid Build Coastguard Worker .synchronization2 = true,
788*61046927SAndroid Build Coastguard Worker .textureCompressionASTC_HDR = false,
789*61046927SAndroid Build Coastguard Worker .shaderZeroInitializeWorkgroupMemory = false,
790*61046927SAndroid Build Coastguard Worker .dynamicRendering = true,
791*61046927SAndroid Build Coastguard Worker .shaderIntegerDotProduct = true,
792*61046927SAndroid Build Coastguard Worker .maintenance4 = false,
793*61046927SAndroid Build Coastguard Worker .shaderExpectAssume = true,
794*61046927SAndroid Build Coastguard Worker
795*61046927SAndroid Build Coastguard Worker .vertexAttributeInstanceRateDivisor = true,
796*61046927SAndroid Build Coastguard Worker .vertexAttributeInstanceRateZeroDivisor = true,
797*61046927SAndroid Build Coastguard Worker .shaderReplicatedComposites = true,
798*61046927SAndroid Build Coastguard Worker };
799*61046927SAndroid Build Coastguard Worker }
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_get_properties(const struct dzn_physical_device * pdev,struct vk_properties * properties)802*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_properties(const struct dzn_physical_device *pdev,
803*61046927SAndroid Build Coastguard Worker struct vk_properties *properties)
804*61046927SAndroid Build Coastguard Worker {
805*61046927SAndroid Build Coastguard Worker /* minimum from the D3D and Vulkan specs */
806*61046927SAndroid Build Coastguard Worker const VkSampleCountFlags supported_sample_counts = VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;
807*61046927SAndroid Build Coastguard Worker
808*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceType devtype = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
809*61046927SAndroid Build Coastguard Worker if (pdev->desc.is_warp)
810*61046927SAndroid Build Coastguard Worker devtype = VK_PHYSICAL_DEVICE_TYPE_CPU;
811*61046927SAndroid Build Coastguard Worker else if (!pdev->architecture.UMA) {
812*61046927SAndroid Build Coastguard Worker devtype = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU;
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker *properties = (struct vk_properties){
816*61046927SAndroid Build Coastguard Worker .apiVersion = DZN_API_VERSION,
817*61046927SAndroid Build Coastguard Worker .driverVersion = vk_get_driver_version(),
818*61046927SAndroid Build Coastguard Worker
819*61046927SAndroid Build Coastguard Worker .vendorID = pdev->desc.vendor_id,
820*61046927SAndroid Build Coastguard Worker .deviceID = pdev->desc.device_id,
821*61046927SAndroid Build Coastguard Worker .deviceType = devtype,
822*61046927SAndroid Build Coastguard Worker
823*61046927SAndroid Build Coastguard Worker /* Limits */
824*61046927SAndroid Build Coastguard Worker .maxImageDimension1D = D3D12_REQ_TEXTURE1D_U_DIMENSION,
825*61046927SAndroid Build Coastguard Worker .maxImageDimension2D = D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION,
826*61046927SAndroid Build Coastguard Worker .maxImageDimension3D = D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION,
827*61046927SAndroid Build Coastguard Worker .maxImageDimensionCube = D3D12_REQ_TEXTURECUBE_DIMENSION,
828*61046927SAndroid Build Coastguard Worker .maxImageArrayLayers = D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION,
829*61046927SAndroid Build Coastguard Worker
830*61046927SAndroid Build Coastguard Worker /* from here on, we simply use the minimum values from the spec for now */
831*61046927SAndroid Build Coastguard Worker .maxTexelBufferElements = 1 << D3D12_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP,
832*61046927SAndroid Build Coastguard Worker .maxUniformBufferRange = D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * D3D12_STANDARD_VECTOR_SIZE * sizeof(float),
833*61046927SAndroid Build Coastguard Worker .maxStorageBufferRange = 1 << D3D12_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP,
834*61046927SAndroid Build Coastguard Worker .maxPushConstantsSize = 128,
835*61046927SAndroid Build Coastguard Worker .maxMemoryAllocationCount = 4096,
836*61046927SAndroid Build Coastguard Worker .maxSamplerAllocationCount = 4000,
837*61046927SAndroid Build Coastguard Worker .bufferImageGranularity = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
838*61046927SAndroid Build Coastguard Worker .sparseAddressSpaceSize = 0,
839*61046927SAndroid Build Coastguard Worker .maxBoundDescriptorSets = MAX_SETS,
840*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorSamplers =
841*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier == D3D12_RESOURCE_BINDING_TIER_1 ?
842*61046927SAndroid Build Coastguard Worker 16u : MAX_DESCS_PER_SAMPLER_HEAP,
843*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUniformBuffers =
844*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier <= D3D12_RESOURCE_BINDING_TIER_2 ?
845*61046927SAndroid Build Coastguard Worker 14u : MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
846*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorStorageBuffers =
847*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier <= D3D12_RESOURCE_BINDING_TIER_2 ?
848*61046927SAndroid Build Coastguard Worker 64u : MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
849*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorSampledImages =
850*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier == D3D12_RESOURCE_BINDING_TIER_1 ?
851*61046927SAndroid Build Coastguard Worker 128u : MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
852*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorStorageImages =
853*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier <= D3D12_RESOURCE_BINDING_TIER_2 ?
854*61046927SAndroid Build Coastguard Worker 64u : MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
855*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorInputAttachments =
856*61046927SAndroid Build Coastguard Worker pdev->options.ResourceBindingTier == D3D12_RESOURCE_BINDING_TIER_1 ?
857*61046927SAndroid Build Coastguard Worker 128u : MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
858*61046927SAndroid Build Coastguard Worker .maxPerStageResources = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
859*61046927SAndroid Build Coastguard Worker .maxDescriptorSetSamplers = MAX_DESCS_PER_SAMPLER_HEAP,
860*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUniformBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
861*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS,
862*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
863*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS,
864*61046927SAndroid Build Coastguard Worker .maxDescriptorSetSampledImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
865*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
866*61046927SAndroid Build Coastguard Worker .maxDescriptorSetInputAttachments = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
867*61046927SAndroid Build Coastguard Worker .maxVertexInputAttributes = MIN2(D3D12_STANDARD_VERTEX_ELEMENT_COUNT, MAX_VERTEX_GENERIC_ATTRIBS),
868*61046927SAndroid Build Coastguard Worker .maxVertexInputBindings = MAX_VBS,
869*61046927SAndroid Build Coastguard Worker .maxVertexInputAttributeOffset = D3D12_REQ_MULTI_ELEMENT_STRUCTURE_SIZE_IN_BYTES - 1,
870*61046927SAndroid Build Coastguard Worker .maxVertexInputBindingStride = D3D12_REQ_MULTI_ELEMENT_STRUCTURE_SIZE_IN_BYTES,
871*61046927SAndroid Build Coastguard Worker .maxVertexOutputComponents = D3D12_VS_OUTPUT_REGISTER_COUNT * D3D12_VS_OUTPUT_REGISTER_COMPONENTS,
872*61046927SAndroid Build Coastguard Worker .maxTessellationGenerationLevel = 0,
873*61046927SAndroid Build Coastguard Worker .maxTessellationPatchSize = 0,
874*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerVertexInputComponents = 0,
875*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerVertexOutputComponents = 0,
876*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerPatchOutputComponents = 0,
877*61046927SAndroid Build Coastguard Worker .maxTessellationControlTotalOutputComponents = 0,
878*61046927SAndroid Build Coastguard Worker .maxTessellationEvaluationInputComponents = 0,
879*61046927SAndroid Build Coastguard Worker .maxTessellationEvaluationOutputComponents = 0,
880*61046927SAndroid Build Coastguard Worker .maxGeometryShaderInvocations = D3D12_GS_MAX_INSTANCE_COUNT,
881*61046927SAndroid Build Coastguard Worker .maxGeometryInputComponents = D3D12_GS_INPUT_REGISTER_COUNT * D3D12_GS_INPUT_REGISTER_COMPONENTS,
882*61046927SAndroid Build Coastguard Worker .maxGeometryOutputComponents = D3D12_GS_OUTPUT_REGISTER_COUNT * D3D12_GS_OUTPUT_REGISTER_COMPONENTS,
883*61046927SAndroid Build Coastguard Worker .maxGeometryOutputVertices = D3D12_GS_MAX_OUTPUT_VERTEX_COUNT_ACROSS_INSTANCES,
884*61046927SAndroid Build Coastguard Worker .maxGeometryTotalOutputComponents = D3D12_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT,
885*61046927SAndroid Build Coastguard Worker .maxFragmentInputComponents = D3D12_PS_INPUT_REGISTER_COUNT * D3D12_PS_INPUT_REGISTER_COMPONENTS,
886*61046927SAndroid Build Coastguard Worker .maxFragmentOutputAttachments = D3D12_PS_OUTPUT_REGISTER_COUNT,
887*61046927SAndroid Build Coastguard Worker .maxFragmentDualSrcAttachments = 0,
888*61046927SAndroid Build Coastguard Worker .maxFragmentCombinedOutputResources = D3D12_PS_OUTPUT_REGISTER_COUNT,
889*61046927SAndroid Build Coastguard Worker .maxComputeSharedMemorySize = D3D12_CS_TGSM_REGISTER_COUNT * sizeof(float),
890*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupCount = { D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
891*61046927SAndroid Build Coastguard Worker D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
892*61046927SAndroid Build Coastguard Worker D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION },
893*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupInvocations = D3D12_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP,
894*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupSize = { D3D12_CS_THREAD_GROUP_MAX_X, D3D12_CS_THREAD_GROUP_MAX_Y, D3D12_CS_THREAD_GROUP_MAX_Z },
895*61046927SAndroid Build Coastguard Worker .subPixelPrecisionBits = D3D12_SUBPIXEL_FRACTIONAL_BIT_COUNT,
896*61046927SAndroid Build Coastguard Worker .subTexelPrecisionBits = D3D12_SUBTEXEL_FRACTIONAL_BIT_COUNT,
897*61046927SAndroid Build Coastguard Worker .mipmapPrecisionBits = D3D12_MIP_LOD_FRACTIONAL_BIT_COUNT,
898*61046927SAndroid Build Coastguard Worker .maxDrawIndexedIndexValue = 0x00ffffff,
899*61046927SAndroid Build Coastguard Worker .maxDrawIndirectCount = UINT32_MAX,
900*61046927SAndroid Build Coastguard Worker .maxSamplerLodBias = D3D12_MIP_LOD_BIAS_MAX,
901*61046927SAndroid Build Coastguard Worker .maxSamplerAnisotropy = D3D12_REQ_MAXANISOTROPY,
902*61046927SAndroid Build Coastguard Worker .maxViewports = MAX_VP,
903*61046927SAndroid Build Coastguard Worker .maxViewportDimensions = { D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION },
904*61046927SAndroid Build Coastguard Worker .viewportBoundsRange = { D3D12_VIEWPORT_BOUNDS_MIN, D3D12_VIEWPORT_BOUNDS_MAX },
905*61046927SAndroid Build Coastguard Worker .viewportSubPixelBits = 0,
906*61046927SAndroid Build Coastguard Worker .minMemoryMapAlignment = 64,
907*61046927SAndroid Build Coastguard Worker .minTexelBufferOffsetAlignment = 32,
908*61046927SAndroid Build Coastguard Worker .minUniformBufferOffsetAlignment = D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT,
909*61046927SAndroid Build Coastguard Worker .minStorageBufferOffsetAlignment = D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT,
910*61046927SAndroid Build Coastguard Worker .minTexelOffset = D3D12_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE,
911*61046927SAndroid Build Coastguard Worker .maxTexelOffset = D3D12_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE,
912*61046927SAndroid Build Coastguard Worker .minTexelGatherOffset = -32,
913*61046927SAndroid Build Coastguard Worker .maxTexelGatherOffset = 31,
914*61046927SAndroid Build Coastguard Worker .minInterpolationOffset = -0.5f,
915*61046927SAndroid Build Coastguard Worker .maxInterpolationOffset = 0.5f,
916*61046927SAndroid Build Coastguard Worker .subPixelInterpolationOffsetBits = 4,
917*61046927SAndroid Build Coastguard Worker .maxFramebufferWidth = D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION,
918*61046927SAndroid Build Coastguard Worker .maxFramebufferHeight = D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION,
919*61046927SAndroid Build Coastguard Worker .maxFramebufferLayers = D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION,
920*61046927SAndroid Build Coastguard Worker .framebufferColorSampleCounts = supported_sample_counts,
921*61046927SAndroid Build Coastguard Worker .framebufferDepthSampleCounts = supported_sample_counts,
922*61046927SAndroid Build Coastguard Worker .framebufferStencilSampleCounts = supported_sample_counts,
923*61046927SAndroid Build Coastguard Worker .framebufferNoAttachmentsSampleCounts = supported_sample_counts,
924*61046927SAndroid Build Coastguard Worker .maxColorAttachments = MAX_RTS,
925*61046927SAndroid Build Coastguard Worker .sampledImageColorSampleCounts = supported_sample_counts,
926*61046927SAndroid Build Coastguard Worker .sampledImageIntegerSampleCounts = VK_SAMPLE_COUNT_1_BIT,
927*61046927SAndroid Build Coastguard Worker .sampledImageDepthSampleCounts = supported_sample_counts,
928*61046927SAndroid Build Coastguard Worker .sampledImageStencilSampleCounts = supported_sample_counts,
929*61046927SAndroid Build Coastguard Worker .storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT,
930*61046927SAndroid Build Coastguard Worker .maxSampleMaskWords = 1,
931*61046927SAndroid Build Coastguard Worker .timestampComputeAndGraphics = true,
932*61046927SAndroid Build Coastguard Worker .timestampPeriod = pdev->timestamp_period,
933*61046927SAndroid Build Coastguard Worker .maxClipDistances = D3D12_CLIP_OR_CULL_DISTANCE_COUNT,
934*61046927SAndroid Build Coastguard Worker .maxCullDistances = D3D12_CLIP_OR_CULL_DISTANCE_COUNT,
935*61046927SAndroid Build Coastguard Worker .maxCombinedClipAndCullDistances = D3D12_CLIP_OR_CULL_DISTANCE_COUNT,
936*61046927SAndroid Build Coastguard Worker .discreteQueuePriorities = 2,
937*61046927SAndroid Build Coastguard Worker .pointSizeRange = { 1.0f, 1.0f },
938*61046927SAndroid Build Coastguard Worker .lineWidthRange = { 1.0f, 1.0f },
939*61046927SAndroid Build Coastguard Worker .pointSizeGranularity = 0.0f,
940*61046927SAndroid Build Coastguard Worker .lineWidthGranularity = 0.0f,
941*61046927SAndroid Build Coastguard Worker .strictLines = 0,
942*61046927SAndroid Build Coastguard Worker .standardSampleLocations = true,
943*61046927SAndroid Build Coastguard Worker .optimalBufferCopyOffsetAlignment = D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT,
944*61046927SAndroid Build Coastguard Worker .optimalBufferCopyRowPitchAlignment = D3D12_TEXTURE_DATA_PITCH_ALIGNMENT,
945*61046927SAndroid Build Coastguard Worker .nonCoherentAtomSize = 256,
946*61046927SAndroid Build Coastguard Worker
947*61046927SAndroid Build Coastguard Worker /* Core 1.1 */
948*61046927SAndroid Build Coastguard Worker .deviceLUIDValid = true,
949*61046927SAndroid Build Coastguard Worker .pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES,
950*61046927SAndroid Build Coastguard Worker .maxMultiviewViewCount = 6,
951*61046927SAndroid Build Coastguard Worker .maxMultiviewInstanceIndex = UINT_MAX,
952*61046927SAndroid Build Coastguard Worker .protectedNoFault = false,
953*61046927SAndroid Build Coastguard Worker /* Vulkan 1.1 wants this value to be at least 1024. Let's stick to this
954*61046927SAndroid Build Coastguard Worker * minimum requirement for now, and hope the total number of samplers
955*61046927SAndroid Build Coastguard Worker * across all descriptor sets doesn't exceed 2048, otherwise we'd exceed
956*61046927SAndroid Build Coastguard Worker * the maximum number of samplers per heap. For any descriptor set
957*61046927SAndroid Build Coastguard Worker * containing more than 1024 descriptors,
958*61046927SAndroid Build Coastguard Worker * vkGetDescriptorSetLayoutSupport() can be called to determine if the
959*61046927SAndroid Build Coastguard Worker * layout is within D3D12 descriptor heap bounds.
960*61046927SAndroid Build Coastguard Worker */
961*61046927SAndroid Build Coastguard Worker .maxPerSetDescriptors = 1024,
962*61046927SAndroid Build Coastguard Worker /* According to the spec, the maximum D3D12 resource size is
963*61046927SAndroid Build Coastguard Worker * min(max(128MB, 0.25f * (amount of dedicated VRAM)), 2GB),
964*61046927SAndroid Build Coastguard Worker * but the limit actually depends on the max(system_ram, VRAM) not
965*61046927SAndroid Build Coastguard Worker * just the VRAM.
966*61046927SAndroid Build Coastguard Worker */
967*61046927SAndroid Build Coastguard Worker .maxMemoryAllocationSize =
968*61046927SAndroid Build Coastguard Worker CLAMP(MAX2(pdev->desc.dedicated_video_memory,
969*61046927SAndroid Build Coastguard Worker pdev->desc.dedicated_system_memory +
970*61046927SAndroid Build Coastguard Worker pdev->desc.shared_system_memory) / 4,
971*61046927SAndroid Build Coastguard Worker 128ull * 1024 * 1024, 2ull * 1024 * 1024 * 1024),
972*61046927SAndroid Build Coastguard Worker .subgroupSupportedOperations = VK_SUBGROUP_FEATURE_BASIC_BIT |
973*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_BALLOT_BIT |
974*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_VOTE_BIT |
975*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
976*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT |
977*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_QUAD_BIT |
978*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_ARITHMETIC_BIT,
979*61046927SAndroid Build Coastguard Worker .subgroupSupportedStages = VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
980*61046927SAndroid Build Coastguard Worker VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_VERTEX_BIT,
981*61046927SAndroid Build Coastguard Worker .subgroupQuadOperationsInAllStages = true,
982*61046927SAndroid Build Coastguard Worker .subgroupSize = pdev->options1.WaveOps ? pdev->options1.WaveLaneCountMin : 1,
983*61046927SAndroid Build Coastguard Worker
984*61046927SAndroid Build Coastguard Worker /* Core 1.2 */
985*61046927SAndroid Build Coastguard Worker .driverID = VK_DRIVER_ID_MESA_DOZEN,
986*61046927SAndroid Build Coastguard Worker .conformanceVersion = (VkConformanceVersion){
987*61046927SAndroid Build Coastguard Worker .major = 0,
988*61046927SAndroid Build Coastguard Worker .minor = 0,
989*61046927SAndroid Build Coastguard Worker .subminor = 0,
990*61046927SAndroid Build Coastguard Worker .patch = 0,
991*61046927SAndroid Build Coastguard Worker },
992*61046927SAndroid Build Coastguard Worker .denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
993*61046927SAndroid Build Coastguard Worker .roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
994*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat16 = false,
995*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat32 = false,
996*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat64 = false,
997*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat16 = true,
998*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat32 = pdev->shader_model >= D3D_SHADER_MODEL_6_2,
999*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat64 = true,
1000*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat16 = false,
1001*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat32 = true,
1002*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat64 = false,
1003*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat16 = true,
1004*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat32 = true,
1005*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat64 = true,
1006*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat16 = false,
1007*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat32 = false,
1008*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat64 = false,
1009*61046927SAndroid Build Coastguard Worker .shaderUniformBufferArrayNonUniformIndexingNative = true,
1010*61046927SAndroid Build Coastguard Worker .shaderSampledImageArrayNonUniformIndexingNative = true,
1011*61046927SAndroid Build Coastguard Worker .shaderStorageBufferArrayNonUniformIndexingNative = true,
1012*61046927SAndroid Build Coastguard Worker .shaderStorageImageArrayNonUniformIndexingNative = true,
1013*61046927SAndroid Build Coastguard Worker .shaderInputAttachmentArrayNonUniformIndexingNative = true,
1014*61046927SAndroid Build Coastguard Worker .robustBufferAccessUpdateAfterBind = true,
1015*61046927SAndroid Build Coastguard Worker .quadDivergentImplicitLod = false,
1016*61046927SAndroid Build Coastguard Worker .maxUpdateAfterBindDescriptorsInAllPools = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1017*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindSamplers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1018*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindUniformBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1019*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindStorageBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1020*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindSampledImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1021*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindStorageImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1022*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindInputAttachments = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1023*61046927SAndroid Build Coastguard Worker .maxPerStageUpdateAfterBindResources = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1024*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindSamplers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1025*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindUniformBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1026*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS,
1027*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageBuffers = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1028*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS,
1029*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindSampledImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1030*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageImages = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1031*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindInputAttachments = MAX_DESCS_PER_CBV_SRV_UAV_HEAP,
1032*61046927SAndroid Build Coastguard Worker
1033*61046927SAndroid Build Coastguard Worker .supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_AVERAGE_BIT |
1034*61046927SAndroid Build Coastguard Worker VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT,
1035*61046927SAndroid Build Coastguard Worker .supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT,
1036*61046927SAndroid Build Coastguard Worker .independentResolveNone = true,
1037*61046927SAndroid Build Coastguard Worker .independentResolve = true,
1038*61046927SAndroid Build Coastguard Worker .filterMinmaxSingleComponentFormats = false,
1039*61046927SAndroid Build Coastguard Worker .filterMinmaxImageComponentMapping = false,
1040*61046927SAndroid Build Coastguard Worker .maxTimelineSemaphoreValueDifference = UINT64_MAX,
1041*61046927SAndroid Build Coastguard Worker .framebufferIntegerColorSampleCounts = VK_SAMPLE_COUNT_1_BIT,
1042*61046927SAndroid Build Coastguard Worker
1043*61046927SAndroid Build Coastguard Worker /* Core 1.3 */
1044*61046927SAndroid Build Coastguard Worker .minSubgroupSize = pdev->options1.WaveOps ? pdev->options1.WaveLaneCountMin : 1,
1045*61046927SAndroid Build Coastguard Worker .maxSubgroupSize = pdev->options1.WaveOps ? pdev->options1.WaveLaneCountMax : 1,
1046*61046927SAndroid Build Coastguard Worker .maxComputeWorkgroupSubgroups = D3D12_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP /
1047*61046927SAndroid Build Coastguard Worker (pdev->options1.WaveOps ? pdev->options1.WaveLaneCountMin : 1),
1048*61046927SAndroid Build Coastguard Worker .requiredSubgroupSizeStages = VK_SHADER_STAGE_COMPUTE_BIT,
1049*61046927SAndroid Build Coastguard Worker .integerDotProduct4x8BitPackedSignedAccelerated = pdev->shader_model >= D3D_SHADER_MODEL_6_4,
1050*61046927SAndroid Build Coastguard Worker .integerDotProduct4x8BitPackedUnsignedAccelerated = pdev->shader_model >= D3D_SHADER_MODEL_6_4,
1051*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated = pdev->shader_model >= D3D_SHADER_MODEL_6_4,
1052*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated = pdev->shader_model >= D3D_SHADER_MODEL_6_4,
1053*61046927SAndroid Build Coastguard Worker
1054*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT */
1055*61046927SAndroid Build Coastguard Worker .maxVertexAttribDivisor = UINT32_MAX,
1056*61046927SAndroid Build Coastguard Worker
1057*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceExternalMemoryHostPropertiesEXT */
1058*61046927SAndroid Build Coastguard Worker .minImportedHostPointerAlignment = 65536,
1059*61046927SAndroid Build Coastguard Worker
1060*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceLayeredDriverPropertiesMSFT */
1061*61046927SAndroid Build Coastguard Worker .underlyingAPI = VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT,
1062*61046927SAndroid Build Coastguard Worker };
1063*61046927SAndroid Build Coastguard Worker
1064*61046927SAndroid Build Coastguard Worker snprintf(properties->deviceName,
1065*61046927SAndroid Build Coastguard Worker sizeof(properties->deviceName),
1066*61046927SAndroid Build Coastguard Worker "Microsoft Direct3D12 (%s)", pdev->desc.description);
1067*61046927SAndroid Build Coastguard Worker memcpy(properties->pipelineCacheUUID,
1068*61046927SAndroid Build Coastguard Worker pdev->pipeline_cache_uuid, VK_UUID_SIZE);
1069*61046927SAndroid Build Coastguard Worker memcpy(properties->driverUUID, pdev->driver_uuid, VK_UUID_SIZE);
1070*61046927SAndroid Build Coastguard Worker memcpy(properties->deviceUUID, pdev->device_uuid, VK_UUID_SIZE);
1071*61046927SAndroid Build Coastguard Worker memcpy(properties->deviceLUID, &pdev->desc.adapter_luid, VK_LUID_SIZE);
1072*61046927SAndroid Build Coastguard Worker
1073*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(pdev->desc.adapter_luid) == sizeof(properties->deviceLUID));
1074*61046927SAndroid Build Coastguard Worker
1075*61046927SAndroid Build Coastguard Worker snprintf(properties->driverName, VK_MAX_DRIVER_NAME_SIZE, "Dozen");
1076*61046927SAndroid Build Coastguard Worker snprintf(properties->driverInfo, VK_MAX_DRIVER_INFO_SIZE, "Mesa " PACKAGE_VERSION MESA_GIT_SHA1);
1077*61046927SAndroid Build Coastguard Worker }
1078*61046927SAndroid Build Coastguard Worker
1079*61046927SAndroid Build Coastguard Worker static VkResult
dzn_physical_device_create(struct vk_instance * instance,IUnknown * adapter,const struct dzn_physical_device_desc * desc)1080*61046927SAndroid Build Coastguard Worker dzn_physical_device_create(struct vk_instance *instance,
1081*61046927SAndroid Build Coastguard Worker IUnknown *adapter,
1082*61046927SAndroid Build Coastguard Worker const struct dzn_physical_device_desc *desc)
1083*61046927SAndroid Build Coastguard Worker {
1084*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
1085*61046927SAndroid Build Coastguard Worker vk_zalloc(&instance->alloc, sizeof(*pdev), 8,
1086*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
1087*61046927SAndroid Build Coastguard Worker
1088*61046927SAndroid Build Coastguard Worker if (!pdev)
1089*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
1090*61046927SAndroid Build Coastguard Worker
1091*61046927SAndroid Build Coastguard Worker struct vk_physical_device_dispatch_table dispatch_table;
1092*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints(&dispatch_table,
1093*61046927SAndroid Build Coastguard Worker &dzn_physical_device_entrypoints,
1094*61046927SAndroid Build Coastguard Worker true);
1095*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints(&dispatch_table,
1096*61046927SAndroid Build Coastguard Worker &wsi_physical_device_entrypoints,
1097*61046927SAndroid Build Coastguard Worker false);
1098*61046927SAndroid Build Coastguard Worker
1099*61046927SAndroid Build Coastguard Worker VkResult result =
1100*61046927SAndroid Build Coastguard Worker vk_physical_device_init(&pdev->vk, instance,
1101*61046927SAndroid Build Coastguard Worker NULL, NULL, NULL, /* We set up extensions later */
1102*61046927SAndroid Build Coastguard Worker &dispatch_table);
1103*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1104*61046927SAndroid Build Coastguard Worker vk_free(&instance->alloc, pdev);
1105*61046927SAndroid Build Coastguard Worker return result;
1106*61046927SAndroid Build Coastguard Worker }
1107*61046927SAndroid Build Coastguard Worker
1108*61046927SAndroid Build Coastguard Worker pdev->desc = *desc;
1109*61046927SAndroid Build Coastguard Worker pdev->adapter = adapter;
1110*61046927SAndroid Build Coastguard Worker IUnknown_AddRef(adapter);
1111*61046927SAndroid Build Coastguard Worker list_addtail(&pdev->vk.link, &instance->physical_devices.list);
1112*61046927SAndroid Build Coastguard Worker
1113*61046927SAndroid Build Coastguard Worker vk_warn_non_conformant_implementation("dzn");
1114*61046927SAndroid Build Coastguard Worker
1115*61046927SAndroid Build Coastguard Worker struct dzn_instance *dzn_instance = container_of(instance, struct dzn_instance, vk);
1116*61046927SAndroid Build Coastguard Worker
1117*61046927SAndroid Build Coastguard Worker uint32_t num_sync_types = 0;
1118*61046927SAndroid Build Coastguard Worker pdev->sync_types[num_sync_types++] = &dzn_sync_type;
1119*61046927SAndroid Build Coastguard Worker pdev->sync_types[num_sync_types++] = &dzn_instance->sync_binary_type.sync;
1120*61046927SAndroid Build Coastguard Worker pdev->sync_types[num_sync_types++] = &vk_sync_dummy_type;
1121*61046927SAndroid Build Coastguard Worker pdev->sync_types[num_sync_types] = NULL;
1122*61046927SAndroid Build Coastguard Worker assert(num_sync_types <= MAX_SYNC_TYPES);
1123*61046927SAndroid Build Coastguard Worker pdev->vk.supported_sync_types = pdev->sync_types;
1124*61046927SAndroid Build Coastguard Worker
1125*61046927SAndroid Build Coastguard Worker pdev->vk.pipeline_cache_import_ops = dzn_pipeline_cache_import_ops;
1126*61046927SAndroid Build Coastguard Worker
1127*61046927SAndroid Build Coastguard Worker pdev->dev = d3d12_create_device(dzn_instance->d3d12_mod,
1128*61046927SAndroid Build Coastguard Worker pdev->adapter,
1129*61046927SAndroid Build Coastguard Worker dzn_instance->factory,
1130*61046927SAndroid Build Coastguard Worker !dzn_instance->dxil_validator);
1131*61046927SAndroid Build Coastguard Worker if (!pdev->dev) {
1132*61046927SAndroid Build Coastguard Worker list_del(&pdev->vk.link);
1133*61046927SAndroid Build Coastguard Worker dzn_physical_device_destroy(&pdev->vk);
1134*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
1135*61046927SAndroid Build Coastguard Worker }
1136*61046927SAndroid Build Coastguard Worker
1137*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device10, (void **)&pdev->dev10)))
1138*61046927SAndroid Build Coastguard Worker pdev->dev10 = NULL;
1139*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device11, (void **)&pdev->dev11)))
1140*61046927SAndroid Build Coastguard Worker pdev->dev11 = NULL;
1141*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device12, (void **)&pdev->dev12)))
1142*61046927SAndroid Build Coastguard Worker pdev->dev12 = NULL;
1143*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device13, (void **)&pdev->dev13)))
1144*61046927SAndroid Build Coastguard Worker pdev->dev13 = NULL;
1145*61046927SAndroid Build Coastguard Worker dzn_physical_device_cache_caps(pdev);
1146*61046927SAndroid Build Coastguard Worker dzn_physical_device_init_memory(pdev);
1147*61046927SAndroid Build Coastguard Worker dzn_physical_device_init_uuids(pdev);
1148*61046927SAndroid Build Coastguard Worker
1149*61046927SAndroid Build Coastguard Worker if (dzn_instance->debug_flags & DZN_DEBUG_MULTIVIEW)
1150*61046927SAndroid Build Coastguard Worker pdev->options3.ViewInstancingTier = D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED;
1151*61046927SAndroid Build Coastguard Worker
1152*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_extensions(pdev);
1153*61046927SAndroid Build Coastguard Worker if (driQueryOptionb(&dzn_instance->dri_options, "dzn_enable_8bit_loads_stores") &&
1154*61046927SAndroid Build Coastguard Worker pdev->options4.Native16BitShaderOpsSupported)
1155*61046927SAndroid Build Coastguard Worker pdev->vk.supported_extensions.KHR_8bit_storage = true;
1156*61046927SAndroid Build Coastguard Worker if (dzn_instance->debug_flags & DZN_DEBUG_NO_BINDLESS)
1157*61046927SAndroid Build Coastguard Worker pdev->vk.supported_extensions.EXT_descriptor_indexing = false;
1158*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_features(pdev, &pdev->vk.supported_features);
1159*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_properties(pdev, &pdev->vk.properties);
1160*61046927SAndroid Build Coastguard Worker
1161*61046927SAndroid Build Coastguard Worker result = dzn_wsi_init(pdev);
1162*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS || !pdev->dev) {
1163*61046927SAndroid Build Coastguard Worker list_del(&pdev->vk.link);
1164*61046927SAndroid Build Coastguard Worker dzn_physical_device_destroy(&pdev->vk);
1165*61046927SAndroid Build Coastguard Worker return result;
1166*61046927SAndroid Build Coastguard Worker }
1167*61046927SAndroid Build Coastguard Worker
1168*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1169*61046927SAndroid Build Coastguard Worker }
1170*61046927SAndroid Build Coastguard Worker
1171*61046927SAndroid Build Coastguard Worker static DXGI_FORMAT
dzn_get_most_capable_format_for_casting(VkFormat format,VkImageCreateFlags create_flags)1172*61046927SAndroid Build Coastguard Worker dzn_get_most_capable_format_for_casting(VkFormat format, VkImageCreateFlags create_flags)
1173*61046927SAndroid Build Coastguard Worker {
1174*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(format);
1175*61046927SAndroid Build Coastguard Worker bool block_compressed = util_format_is_compressed(pfmt);
1176*61046927SAndroid Build Coastguard Worker if (block_compressed &&
1177*61046927SAndroid Build Coastguard Worker !(create_flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT))
1178*61046927SAndroid Build Coastguard Worker return dzn_image_get_dxgi_format(NULL, format, 0, 0);
1179*61046927SAndroid Build Coastguard Worker unsigned blksz = util_format_get_blocksize(pfmt);
1180*61046927SAndroid Build Coastguard Worker switch (blksz) {
1181*61046927SAndroid Build Coastguard Worker case 1: return DXGI_FORMAT_R8_UNORM;
1182*61046927SAndroid Build Coastguard Worker case 2: return DXGI_FORMAT_R16_UNORM;
1183*61046927SAndroid Build Coastguard Worker case 4: return DXGI_FORMAT_R32_FLOAT;
1184*61046927SAndroid Build Coastguard Worker case 8: return DXGI_FORMAT_R32G32_FLOAT;
1185*61046927SAndroid Build Coastguard Worker case 12: return DXGI_FORMAT_R32G32B32_FLOAT;
1186*61046927SAndroid Build Coastguard Worker case 16: return DXGI_FORMAT_R32G32B32A32_FLOAT;
1187*61046927SAndroid Build Coastguard Worker default: unreachable("Unsupported format bit size");;
1188*61046927SAndroid Build Coastguard Worker }
1189*61046927SAndroid Build Coastguard Worker }
1190*61046927SAndroid Build Coastguard Worker
1191*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT
dzn_physical_device_get_format_support(struct dzn_physical_device * pdev,VkFormat format,VkImageCreateFlags create_flags)1192*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_support(struct dzn_physical_device *pdev,
1193*61046927SAndroid Build Coastguard Worker VkFormat format,
1194*61046927SAndroid Build Coastguard Worker VkImageCreateFlags create_flags)
1195*61046927SAndroid Build Coastguard Worker {
1196*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage =
1197*61046927SAndroid Build Coastguard Worker vk_format_is_depth_or_stencil(format) ?
1198*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0;
1199*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects = 0;
1200*61046927SAndroid Build Coastguard Worker
1201*61046927SAndroid Build Coastguard Worker if (vk_format_has_depth(format))
1202*61046927SAndroid Build Coastguard Worker aspects = VK_IMAGE_ASPECT_DEPTH_BIT;
1203*61046927SAndroid Build Coastguard Worker if (vk_format_has_stencil(format))
1204*61046927SAndroid Build Coastguard Worker aspects = VK_IMAGE_ASPECT_STENCIL_BIT;
1205*61046927SAndroid Build Coastguard Worker
1206*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info = {
1207*61046927SAndroid Build Coastguard Worker .Format = dzn_image_get_dxgi_format(pdev, format, usage, aspects),
1208*61046927SAndroid Build Coastguard Worker };
1209*61046927SAndroid Build Coastguard Worker
1210*61046927SAndroid Build Coastguard Worker /* KHR_maintenance2: If an image is created with the extended usage flag
1211*61046927SAndroid Build Coastguard Worker * (or if properties are queried with that flag), then if any compatible
1212*61046927SAndroid Build Coastguard Worker * format can support a given usage, it should be considered supported.
1213*61046927SAndroid Build Coastguard Worker * With the exception of depth, which are limited in their cast set,
1214*61046927SAndroid Build Coastguard Worker * we can do this by just picking a single most-capable format to query
1215*61046927SAndroid Build Coastguard Worker * the support for, instead of the originally requested format. */
1216*61046927SAndroid Build Coastguard Worker if (aspects == 0 && dfmt_info.Format != DXGI_FORMAT_UNKNOWN &&
1217*61046927SAndroid Build Coastguard Worker (create_flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT)) {
1218*61046927SAndroid Build Coastguard Worker dfmt_info.Format = dzn_get_most_capable_format_for_casting(format, create_flags);
1219*61046927SAndroid Build Coastguard Worker }
1220*61046927SAndroid Build Coastguard Worker
1221*61046927SAndroid Build Coastguard Worker ASSERTED HRESULT hres =
1222*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_FORMAT_SUPPORT,
1223*61046927SAndroid Build Coastguard Worker &dfmt_info, sizeof(dfmt_info));
1224*61046927SAndroid Build Coastguard Worker assert(!FAILED(hres));
1225*61046927SAndroid Build Coastguard Worker
1226*61046927SAndroid Build Coastguard Worker if (usage != VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
1227*61046927SAndroid Build Coastguard Worker return dfmt_info;
1228*61046927SAndroid Build Coastguard Worker
1229*61046927SAndroid Build Coastguard Worker /* Depth/stencil resources have different format when they're accessed
1230*61046927SAndroid Build Coastguard Worker * as textures, query the capabilities for this format too.
1231*61046927SAndroid Build Coastguard Worker */
1232*61046927SAndroid Build Coastguard Worker dzn_foreach_aspect(aspect, aspects) {
1233*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info2 = {
1234*61046927SAndroid Build Coastguard Worker .Format = dzn_image_get_dxgi_format(pdev, format, 0, aspect),
1235*61046927SAndroid Build Coastguard Worker };
1236*61046927SAndroid Build Coastguard Worker
1237*61046927SAndroid Build Coastguard Worker hres = ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_FORMAT_SUPPORT,
1238*61046927SAndroid Build Coastguard Worker &dfmt_info2, sizeof(dfmt_info2));
1239*61046927SAndroid Build Coastguard Worker assert(!FAILED(hres));
1240*61046927SAndroid Build Coastguard Worker
1241*61046927SAndroid Build Coastguard Worker #define DS_SRV_FORMAT_SUPPORT1_MASK \
1242*61046927SAndroid Build Coastguard Worker (D3D12_FORMAT_SUPPORT1_SHADER_LOAD | \
1243*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE | \
1244*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_COMPARISON | \
1245*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE_MONO_TEXT | \
1246*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_MULTISAMPLE_RESOLVE | \
1247*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_MULTISAMPLE_LOAD | \
1248*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_SHADER_GATHER | \
1249*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW | \
1250*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_SHADER_GATHER_COMPARISON)
1251*61046927SAndroid Build Coastguard Worker
1252*61046927SAndroid Build Coastguard Worker dfmt_info.Support1 |= dfmt_info2.Support1 & DS_SRV_FORMAT_SUPPORT1_MASK;
1253*61046927SAndroid Build Coastguard Worker dfmt_info.Support2 |= dfmt_info2.Support2;
1254*61046927SAndroid Build Coastguard Worker }
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker return dfmt_info;
1257*61046927SAndroid Build Coastguard Worker }
1258*61046927SAndroid Build Coastguard Worker
1259*61046927SAndroid Build Coastguard Worker static void
dzn_physical_device_get_format_properties(struct dzn_physical_device * pdev,VkFormat format,VkFormatProperties2 * properties)1260*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_properties(struct dzn_physical_device *pdev,
1261*61046927SAndroid Build Coastguard Worker VkFormat format,
1262*61046927SAndroid Build Coastguard Worker VkFormatProperties2 *properties)
1263*61046927SAndroid Build Coastguard Worker {
1264*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info =
1265*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_support(pdev, format, 0);
1266*61046927SAndroid Build Coastguard Worker VkFormatProperties *base_props = &properties->formatProperties;
1267*61046927SAndroid Build Coastguard Worker
1268*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, properties->pNext) {
1269*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
1270*61046927SAndroid Build Coastguard Worker }
1271*61046927SAndroid Build Coastguard Worker
1272*61046927SAndroid Build Coastguard Worker if (dfmt_info.Format == DXGI_FORMAT_UNKNOWN) {
1273*61046927SAndroid Build Coastguard Worker if (dzn_graphics_pipeline_patch_vi_format(format) != format)
1274*61046927SAndroid Build Coastguard Worker *base_props = (VkFormatProperties){
1275*61046927SAndroid Build Coastguard Worker .bufferFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
1276*61046927SAndroid Build Coastguard Worker };
1277*61046927SAndroid Build Coastguard Worker else
1278*61046927SAndroid Build Coastguard Worker *base_props = (VkFormatProperties) { 0 };
1279*61046927SAndroid Build Coastguard Worker return;
1280*61046927SAndroid Build Coastguard Worker }
1281*61046927SAndroid Build Coastguard Worker
1282*61046927SAndroid Build Coastguard Worker *base_props = (VkFormatProperties) {
1283*61046927SAndroid Build Coastguard Worker .linearTilingFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
1284*61046927SAndroid Build Coastguard Worker .optimalTilingFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
1285*61046927SAndroid Build Coastguard Worker .bufferFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
1286*61046927SAndroid Build Coastguard Worker };
1287*61046927SAndroid Build Coastguard Worker
1288*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_IA_VERTEX_BUFFER)
1289*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
1290*61046927SAndroid Build Coastguard Worker
1291*61046927SAndroid Build Coastguard Worker #define TEX_FLAGS (D3D12_FORMAT_SUPPORT1_TEXTURE1D | \
1292*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_TEXTURE2D | \
1293*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_TEXTURE3D | \
1294*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT1_TEXTURECUBE)
1295*61046927SAndroid Build Coastguard Worker if ((dfmt_info.Support1 & TEX_FLAGS) &&
1296*61046927SAndroid Build Coastguard Worker (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD)) {
1297*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |=
1298*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT;
1299*61046927SAndroid Build Coastguard Worker }
1300*61046927SAndroid Build Coastguard Worker
1301*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE) {
1302*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |=
1303*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
1304*61046927SAndroid Build Coastguard Worker }
1305*61046927SAndroid Build Coastguard Worker
1306*61046927SAndroid Build Coastguard Worker if ((dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD) &&
1307*61046927SAndroid Build Coastguard Worker (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW)) {
1308*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
1309*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_BUFFER)
1310*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
1311*61046927SAndroid Build Coastguard Worker }
1312*61046927SAndroid Build Coastguard Worker
1313*61046927SAndroid Build Coastguard Worker #define ATOMIC_FLAGS (D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_ADD | \
1314*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS | \
1315*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE | \
1316*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE | \
1317*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX | \
1318*61046927SAndroid Build Coastguard Worker D3D12_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX)
1319*61046927SAndroid Build Coastguard Worker if ((dfmt_info.Support2 & ATOMIC_FLAGS) == ATOMIC_FLAGS) {
1320*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
1321*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
1322*61046927SAndroid Build Coastguard Worker }
1323*61046927SAndroid Build Coastguard Worker
1324*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_BUFFER)
1325*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
1326*61046927SAndroid Build Coastguard Worker
1327*61046927SAndroid Build Coastguard Worker /* Color/depth/stencil attachment cap implies input attachement cap, and input
1328*61046927SAndroid Build Coastguard Worker * attachment loads are lowered to texture loads in dozen, hence the requirement
1329*61046927SAndroid Build Coastguard Worker * to have shader-load support.
1330*61046927SAndroid Build Coastguard Worker */
1331*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD) {
1332*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) {
1333*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |=
1334*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
1335*61046927SAndroid Build Coastguard Worker }
1336*61046927SAndroid Build Coastguard Worker
1337*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_BLENDABLE)
1338*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
1339*61046927SAndroid Build Coastguard Worker
1340*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) {
1341*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures |=
1342*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
1343*61046927SAndroid Build Coastguard Worker }
1344*61046927SAndroid Build Coastguard Worker }
1345*61046927SAndroid Build Coastguard Worker
1346*61046927SAndroid Build Coastguard Worker /* B4G4R4A4 support is required, but d3d12 doesn't support it. The needed
1347*61046927SAndroid Build Coastguard Worker * d3d12 format would be A4R4G4B4. We map this format to d3d12's B4G4R4A4,
1348*61046927SAndroid Build Coastguard Worker * which is Vulkan's A4R4G4B4, and adjust the SRV component-mapping to fake
1349*61046927SAndroid Build Coastguard Worker * B4G4R4A4, but that forces us to limit the usage to sampling, which,
1350*61046927SAndroid Build Coastguard Worker * luckily, is exactly what we need to support the required features.
1351*61046927SAndroid Build Coastguard Worker *
1352*61046927SAndroid Build Coastguard Worker * However, since this involves swizzling the alpha channel, it can cause
1353*61046927SAndroid Build Coastguard Worker * problems for border colors. Fortunately, d3d12 added an A4B4G4R4 format,
1354*61046927SAndroid Build Coastguard Worker * which still isn't quite right (it'd be Vulkan R4G4B4A4), but can be
1355*61046927SAndroid Build Coastguard Worker * swizzled by just swapping R and B, so no border color issues arise.
1356*61046927SAndroid Build Coastguard Worker */
1357*61046927SAndroid Build Coastguard Worker if (format == VK_FORMAT_B4G4R4A4_UNORM_PACK16) {
1358*61046927SAndroid Build Coastguard Worker VkFormatFeatureFlags bgra4_req_features =
1359*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
1360*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
1361*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
1362*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_BLIT_SRC_BIT |
1363*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
1364*61046927SAndroid Build Coastguard Worker base_props->optimalTilingFeatures &= bgra4_req_features;
1365*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures =
1366*61046927SAndroid Build Coastguard Worker VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
1367*61046927SAndroid Build Coastguard Worker }
1368*61046927SAndroid Build Coastguard Worker
1369*61046927SAndroid Build Coastguard Worker /* depth/stencil format shouldn't advertise buffer features */
1370*61046927SAndroid Build Coastguard Worker if (vk_format_is_depth_or_stencil(format))
1371*61046927SAndroid Build Coastguard Worker base_props->bufferFeatures = 0;
1372*61046927SAndroid Build Coastguard Worker }
1373*61046927SAndroid Build Coastguard Worker
1374*61046927SAndroid Build Coastguard Worker static VkResult
dzn_physical_device_get_image_format_properties(struct dzn_physical_device * pdev,const VkPhysicalDeviceImageFormatInfo2 * info,VkImageFormatProperties2 * properties)1375*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_image_format_properties(struct dzn_physical_device *pdev,
1376*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceImageFormatInfo2 *info,
1377*61046927SAndroid Build Coastguard Worker VkImageFormatProperties2 *properties)
1378*61046927SAndroid Build Coastguard Worker {
1379*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL;
1380*61046927SAndroid Build Coastguard Worker VkExternalImageFormatProperties *external_props = NULL;
1381*61046927SAndroid Build Coastguard Worker
1382*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties = (VkImageFormatProperties) { 0 };
1383*61046927SAndroid Build Coastguard Worker
1384*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage = info->usage;
1385*61046927SAndroid Build Coastguard Worker
1386*61046927SAndroid Build Coastguard Worker /* Extract input structs */
1387*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(s, info->pNext) {
1388*61046927SAndroid Build Coastguard Worker switch (s->sType) {
1389*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
1390*61046927SAndroid Build Coastguard Worker external_info = (const VkPhysicalDeviceExternalImageFormatInfo *)s;
1391*61046927SAndroid Build Coastguard Worker break;
1392*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
1393*61046927SAndroid Build Coastguard Worker usage |= ((const VkImageStencilUsageCreateInfo *)s)->stencilUsage;
1394*61046927SAndroid Build Coastguard Worker break;
1395*61046927SAndroid Build Coastguard Worker default:
1396*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(s->sType);
1397*61046927SAndroid Build Coastguard Worker break;
1398*61046927SAndroid Build Coastguard Worker }
1399*61046927SAndroid Build Coastguard Worker }
1400*61046927SAndroid Build Coastguard Worker
1401*61046927SAndroid Build Coastguard Worker assert(info->tiling == VK_IMAGE_TILING_OPTIMAL || info->tiling == VK_IMAGE_TILING_LINEAR);
1402*61046927SAndroid Build Coastguard Worker
1403*61046927SAndroid Build Coastguard Worker /* Extract output structs */
1404*61046927SAndroid Build Coastguard Worker vk_foreach_struct(s, properties->pNext) {
1405*61046927SAndroid Build Coastguard Worker switch (s->sType) {
1406*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
1407*61046927SAndroid Build Coastguard Worker external_props = (VkExternalImageFormatProperties *)s;
1408*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties = (VkExternalMemoryProperties) { 0 };
1409*61046927SAndroid Build Coastguard Worker break;
1410*61046927SAndroid Build Coastguard Worker default:
1411*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(s->sType);
1412*61046927SAndroid Build Coastguard Worker break;
1413*61046927SAndroid Build Coastguard Worker }
1414*61046927SAndroid Build Coastguard Worker }
1415*61046927SAndroid Build Coastguard Worker
1416*61046927SAndroid Build Coastguard Worker if (external_info && external_info->handleType != 0) {
1417*61046927SAndroid Build Coastguard Worker const VkExternalMemoryHandleTypeFlags d3d12_resource_handle_types =
1418*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT | opaque_external_flag;
1419*61046927SAndroid Build Coastguard Worker const VkExternalMemoryHandleTypeFlags d3d11_texture_handle_types =
1420*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT | d3d12_resource_handle_types;
1421*61046927SAndroid Build Coastguard Worker const VkExternalMemoryFeatureFlags import_export_feature_flags =
1422*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1423*61046927SAndroid Build Coastguard Worker const VkExternalMemoryFeatureFlags dedicated_feature_flags =
1424*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT | import_export_feature_flags;
1425*61046927SAndroid Build Coastguard Worker
1426*61046927SAndroid Build Coastguard Worker switch (external_info->handleType) {
1427*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
1428*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.compatibleHandleTypes = d3d11_texture_handle_types;
1429*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.exportFromImportedHandleTypes = d3d11_texture_handle_types;
1430*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.externalMemoryFeatures = dedicated_feature_flags;
1431*61046927SAndroid Build Coastguard Worker break;
1432*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
1433*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.compatibleHandleTypes = d3d12_resource_handle_types;
1434*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.exportFromImportedHandleTypes = d3d12_resource_handle_types;
1435*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.externalMemoryFeatures = dedicated_feature_flags;
1436*61046927SAndroid Build Coastguard Worker break;
1437*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
1438*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.compatibleHandleTypes =
1439*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.exportFromImportedHandleTypes =
1440*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | opaque_external_flag;
1441*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1442*61046927SAndroid Build Coastguard Worker break;
1443*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1444*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
1445*61046927SAndroid Build Coastguard Worker #else
1446*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
1447*61046927SAndroid Build Coastguard Worker #endif
1448*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.compatibleHandleTypes = d3d11_texture_handle_types;
1449*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.exportFromImportedHandleTypes = d3d11_texture_handle_types;
1450*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1451*61046927SAndroid Build Coastguard Worker break;
1452*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
1453*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
1454*61046927SAndroid Build Coastguard Worker if (pdev->dev13) {
1455*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.compatibleHandleTypes =
1456*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.exportFromImportedHandleTypes =
1457*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | opaque_external_flag;
1458*61046927SAndroid Build Coastguard Worker external_props->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1459*61046927SAndroid Build Coastguard Worker break;
1460*61046927SAndroid Build Coastguard Worker }
1461*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1462*61046927SAndroid Build Coastguard Worker #endif
1463*61046927SAndroid Build Coastguard Worker default:
1464*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1465*61046927SAndroid Build Coastguard Worker }
1466*61046927SAndroid Build Coastguard Worker
1467*61046927SAndroid Build Coastguard Worker /* Linear textures not supported, but there's nothing else we can deduce from just a handle type */
1468*61046927SAndroid Build Coastguard Worker if (info->tiling != VK_IMAGE_TILING_OPTIMAL &&
1469*61046927SAndroid Build Coastguard Worker external_info->handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT)
1470*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1471*61046927SAndroid Build Coastguard Worker }
1472*61046927SAndroid Build Coastguard Worker
1473*61046927SAndroid Build Coastguard Worker if (info->tiling != VK_IMAGE_TILING_OPTIMAL &&
1474*61046927SAndroid Build Coastguard Worker (usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)))
1475*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1476*61046927SAndroid Build Coastguard Worker
1477*61046927SAndroid Build Coastguard Worker if (info->tiling != VK_IMAGE_TILING_OPTIMAL &&
1478*61046927SAndroid Build Coastguard Worker vk_format_is_depth_or_stencil(info->format))
1479*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info =
1482*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_support(pdev, info->format, info->flags);
1483*61046927SAndroid Build Coastguard Worker if (dfmt_info.Format == DXGI_FORMAT_UNKNOWN)
1484*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1485*61046927SAndroid Build Coastguard Worker
1486*61046927SAndroid Build Coastguard Worker bool is_bgra4 = info->format == VK_FORMAT_B4G4R4A4_UNORM_PACK16 &&
1487*61046927SAndroid Build Coastguard Worker !(info->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT);
1488*61046927SAndroid Build Coastguard Worker
1489*61046927SAndroid Build Coastguard Worker if ((info->type == VK_IMAGE_TYPE_1D && !(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE1D)) ||
1490*61046927SAndroid Build Coastguard Worker (info->type == VK_IMAGE_TYPE_2D && !(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE2D)) ||
1491*61046927SAndroid Build Coastguard Worker (info->type == VK_IMAGE_TYPE_3D && !(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE3D)) ||
1492*61046927SAndroid Build Coastguard Worker ((info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
1493*61046927SAndroid Build Coastguard Worker !(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURECUBE)))
1494*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1495*61046927SAndroid Build Coastguard Worker
1496*61046927SAndroid Build Coastguard Worker /* Due to extended capability querying, we might see 1D support for BC, but we don't actually have it */
1497*61046927SAndroid Build Coastguard Worker if (vk_format_is_block_compressed(info->format) && info->type == VK_IMAGE_TYPE_1D)
1498*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1499*61046927SAndroid Build Coastguard Worker
1500*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_SAMPLED_BIT) &&
1501*61046927SAndroid Build Coastguard Worker /* Note: format support for SAMPLED is not necessarily accurate for integer formats */
1502*61046927SAndroid Build Coastguard Worker !(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD))
1503*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1504*61046927SAndroid Build Coastguard Worker
1505*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) &&
1506*61046927SAndroid Build Coastguard Worker (!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD) || is_bgra4))
1507*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1508*61046927SAndroid Build Coastguard Worker
1509*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) &&
1510*61046927SAndroid Build Coastguard Worker (!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) || is_bgra4))
1511*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1512*61046927SAndroid Build Coastguard Worker
1513*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
1514*61046927SAndroid Build Coastguard Worker (!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) || is_bgra4))
1515*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1516*61046927SAndroid Build Coastguard Worker
1517*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
1518*61046927SAndroid Build Coastguard Worker (!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) || is_bgra4))
1519*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1520*61046927SAndroid Build Coastguard Worker
1521*61046927SAndroid Build Coastguard Worker if (info->type == VK_IMAGE_TYPE_3D && info->tiling != VK_IMAGE_TILING_OPTIMAL)
1522*61046927SAndroid Build Coastguard Worker return VK_ERROR_FORMAT_NOT_SUPPORTED;
1523*61046927SAndroid Build Coastguard Worker
1524*61046927SAndroid Build Coastguard Worker bool is_3d = info->type == VK_IMAGE_TYPE_3D;
1525*61046927SAndroid Build Coastguard Worker uint32_t max_extent = dzn_physical_device_get_max_extent(is_3d);
1526*61046927SAndroid Build Coastguard Worker
1527*61046927SAndroid Build Coastguard Worker if (info->tiling == VK_IMAGE_TILING_OPTIMAL &&
1528*61046927SAndroid Build Coastguard Worker dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_MIP)
1529*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxMipLevels = dzn_physical_device_get_max_mip_level(is_3d) + 1;
1530*61046927SAndroid Build Coastguard Worker else
1531*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxMipLevels = 1;
1532*61046927SAndroid Build Coastguard Worker
1533*61046927SAndroid Build Coastguard Worker if (info->tiling == VK_IMAGE_TILING_OPTIMAL && info->type != VK_IMAGE_TYPE_3D)
1534*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxArrayLayers = dzn_physical_device_get_max_array_layers();
1535*61046927SAndroid Build Coastguard Worker else
1536*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxArrayLayers = 1;
1537*61046927SAndroid Build Coastguard Worker
1538*61046927SAndroid Build Coastguard Worker switch (info->type) {
1539*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_1D:
1540*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.width = max_extent;
1541*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.height = 1;
1542*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.depth = 1;
1543*61046927SAndroid Build Coastguard Worker break;
1544*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_2D:
1545*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.width = max_extent;
1546*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.height = max_extent;
1547*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.depth = 1;
1548*61046927SAndroid Build Coastguard Worker break;
1549*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_3D:
1550*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.width = max_extent;
1551*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.height = max_extent;
1552*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxExtent.depth = max_extent;
1553*61046927SAndroid Build Coastguard Worker break;
1554*61046927SAndroid Build Coastguard Worker default:
1555*61046927SAndroid Build Coastguard Worker unreachable("bad VkImageType");
1556*61046927SAndroid Build Coastguard Worker }
1557*61046927SAndroid Build Coastguard Worker
1558*61046927SAndroid Build Coastguard Worker /* From the Vulkan 1.0 spec, section 34.1.1. Supported Sample Counts:
1559*61046927SAndroid Build Coastguard Worker *
1560*61046927SAndroid Build Coastguard Worker * sampleCounts will be set to VK_SAMPLE_COUNT_1_BIT if at least one of the
1561*61046927SAndroid Build Coastguard Worker * following conditions is true:
1562*61046927SAndroid Build Coastguard Worker *
1563*61046927SAndroid Build Coastguard Worker * - tiling is VK_IMAGE_TILING_LINEAR
1564*61046927SAndroid Build Coastguard Worker * - type is not VK_IMAGE_TYPE_2D
1565*61046927SAndroid Build Coastguard Worker * - flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
1566*61046927SAndroid Build Coastguard Worker * - neither the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag nor the
1567*61046927SAndroid Build Coastguard Worker * VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in
1568*61046927SAndroid Build Coastguard Worker * VkFormatProperties::optimalTilingFeatures returned by
1569*61046927SAndroid Build Coastguard Worker * vkGetPhysicalDeviceFormatProperties is set.
1570*61046927SAndroid Build Coastguard Worker *
1571*61046927SAndroid Build Coastguard Worker * D3D12 has a few more constraints:
1572*61046927SAndroid Build Coastguard Worker * - no UAVs on multisample resources
1573*61046927SAndroid Build Coastguard Worker */
1574*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.sampleCounts = VK_SAMPLE_COUNT_1_BIT;
1575*61046927SAndroid Build Coastguard Worker if (info->tiling != VK_IMAGE_TILING_LINEAR &&
1576*61046927SAndroid Build Coastguard Worker info->type == VK_IMAGE_TYPE_2D &&
1577*61046927SAndroid Build Coastguard Worker !(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
1578*61046927SAndroid Build Coastguard Worker (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_MULTISAMPLE_LOAD) &&
1579*61046927SAndroid Build Coastguard Worker !is_bgra4 &&
1580*61046927SAndroid Build Coastguard Worker !(usage & VK_IMAGE_USAGE_STORAGE_BIT)) {
1581*61046927SAndroid Build Coastguard Worker for (uint32_t s = VK_SAMPLE_COUNT_2_BIT; s < VK_SAMPLE_COUNT_64_BIT; s <<= 1) {
1582*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS ms_info = {
1583*61046927SAndroid Build Coastguard Worker .Format = dfmt_info.Format,
1584*61046927SAndroid Build Coastguard Worker .SampleCount = s,
1585*61046927SAndroid Build Coastguard Worker };
1586*61046927SAndroid Build Coastguard Worker
1587*61046927SAndroid Build Coastguard Worker HRESULT hres =
1588*61046927SAndroid Build Coastguard Worker ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,
1589*61046927SAndroid Build Coastguard Worker &ms_info, sizeof(ms_info));
1590*61046927SAndroid Build Coastguard Worker if (!FAILED(hres) && ms_info.NumQualityLevels > 0)
1591*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.sampleCounts |= s;
1592*61046927SAndroid Build Coastguard Worker }
1593*61046927SAndroid Build Coastguard Worker }
1594*61046927SAndroid Build Coastguard Worker
1595*61046927SAndroid Build Coastguard Worker /* TODO: set correct value here */
1596*61046927SAndroid Build Coastguard Worker properties->imageFormatProperties.maxResourceSize = UINT32_MAX;
1597*61046927SAndroid Build Coastguard Worker
1598*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1599*61046927SAndroid Build Coastguard Worker }
1600*61046927SAndroid Build Coastguard Worker
1601*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties2 * pFormatProperties)1602*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice,
1603*61046927SAndroid Build Coastguard Worker VkFormat format,
1604*61046927SAndroid Build Coastguard Worker VkFormatProperties2 *pFormatProperties)
1605*61046927SAndroid Build Coastguard Worker {
1606*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice);
1607*61046927SAndroid Build Coastguard Worker
1608*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_properties(pdev, format, pFormatProperties);
1609*61046927SAndroid Build Coastguard Worker }
1610*61046927SAndroid Build Coastguard Worker
1611*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceImageFormatInfo2 * info,VkImageFormatProperties2 * props)1612*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,
1613*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceImageFormatInfo2 *info,
1614*61046927SAndroid Build Coastguard Worker VkImageFormatProperties2 *props)
1615*61046927SAndroid Build Coastguard Worker {
1616*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice);
1617*61046927SAndroid Build Coastguard Worker
1618*61046927SAndroid Build Coastguard Worker return dzn_physical_device_get_image_format_properties(pdev, info, props);
1619*61046927SAndroid Build Coastguard Worker }
1620*61046927SAndroid Build Coastguard Worker
1621*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkImageTiling tiling,VkImageUsageFlags usage,VkImageCreateFlags createFlags,VkImageFormatProperties * pImageFormatProperties)1622*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice,
1623*61046927SAndroid Build Coastguard Worker VkFormat format,
1624*61046927SAndroid Build Coastguard Worker VkImageType type,
1625*61046927SAndroid Build Coastguard Worker VkImageTiling tiling,
1626*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage,
1627*61046927SAndroid Build Coastguard Worker VkImageCreateFlags createFlags,
1628*61046927SAndroid Build Coastguard Worker VkImageFormatProperties *pImageFormatProperties)
1629*61046927SAndroid Build Coastguard Worker {
1630*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceImageFormatInfo2 info = {
1631*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
1632*61046927SAndroid Build Coastguard Worker .format = format,
1633*61046927SAndroid Build Coastguard Worker .type = type,
1634*61046927SAndroid Build Coastguard Worker .tiling = tiling,
1635*61046927SAndroid Build Coastguard Worker .usage = usage,
1636*61046927SAndroid Build Coastguard Worker .flags = createFlags,
1637*61046927SAndroid Build Coastguard Worker };
1638*61046927SAndroid Build Coastguard Worker
1639*61046927SAndroid Build Coastguard Worker VkImageFormatProperties2 props = { 0 };
1640*61046927SAndroid Build Coastguard Worker
1641*61046927SAndroid Build Coastguard Worker VkResult result =
1642*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceImageFormatProperties2(physicalDevice, &info, &props);
1643*61046927SAndroid Build Coastguard Worker *pImageFormatProperties = props.imageFormatProperties;
1644*61046927SAndroid Build Coastguard Worker
1645*61046927SAndroid Build Coastguard Worker return result;
1646*61046927SAndroid Build Coastguard Worker }
1647*61046927SAndroid Build Coastguard Worker
1648*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkSampleCountFlagBits samples,VkImageUsageFlags usage,VkImageTiling tiling,uint32_t * pPropertyCount,VkSparseImageFormatProperties * pProperties)1649*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice,
1650*61046927SAndroid Build Coastguard Worker VkFormat format,
1651*61046927SAndroid Build Coastguard Worker VkImageType type,
1652*61046927SAndroid Build Coastguard Worker VkSampleCountFlagBits samples,
1653*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage,
1654*61046927SAndroid Build Coastguard Worker VkImageTiling tiling,
1655*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
1656*61046927SAndroid Build Coastguard Worker VkSparseImageFormatProperties *pProperties)
1657*61046927SAndroid Build Coastguard Worker {
1658*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
1659*61046927SAndroid Build Coastguard Worker }
1660*61046927SAndroid Build Coastguard Worker
1661*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceSparseImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,uint32_t * pPropertyCount,VkSparseImageFormatProperties2 * pProperties)1662*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceSparseImageFormatProperties2(VkPhysicalDevice physicalDevice,
1663*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceSparseImageFormatInfo2 *pFormatInfo,
1664*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
1665*61046927SAndroid Build Coastguard Worker VkSparseImageFormatProperties2 *pProperties)
1666*61046927SAndroid Build Coastguard Worker {
1667*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
1668*61046927SAndroid Build Coastguard Worker }
1669*61046927SAndroid Build Coastguard Worker
1670*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties)1671*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,
1672*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
1673*61046927SAndroid Build Coastguard Worker VkExternalBufferProperties *pExternalBufferProperties)
1674*61046927SAndroid Build Coastguard Worker {
1675*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
1676*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice);
1677*61046927SAndroid Build Coastguard Worker #endif
1678*61046927SAndroid Build Coastguard Worker
1679*61046927SAndroid Build Coastguard Worker const VkExternalMemoryHandleTypeFlags d3d12_resource_handle_types =
1680*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT | opaque_external_flag;
1681*61046927SAndroid Build Coastguard Worker const VkExternalMemoryFeatureFlags import_export_feature_flags =
1682*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1683*61046927SAndroid Build Coastguard Worker const VkExternalMemoryFeatureFlags dedicated_feature_flags =
1684*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT | import_export_feature_flags;
1685*61046927SAndroid Build Coastguard Worker switch (pExternalBufferInfo->handleType) {
1686*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
1687*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes = d3d12_resource_handle_types;
1688*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes = d3d12_resource_handle_types;
1689*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = dedicated_feature_flags;
1690*61046927SAndroid Build Coastguard Worker break;
1691*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
1692*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes =
1693*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes =
1694*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | opaque_external_flag;
1695*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1696*61046927SAndroid Build Coastguard Worker break;
1697*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1698*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
1699*61046927SAndroid Build Coastguard Worker #else
1700*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
1701*61046927SAndroid Build Coastguard Worker #endif
1702*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes =
1703*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes =
1704*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | d3d12_resource_handle_types;
1705*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1706*61046927SAndroid Build Coastguard Worker break;
1707*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
1708*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
1709*61046927SAndroid Build Coastguard Worker if (pdev->dev13) {
1710*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes =
1711*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes =
1712*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | opaque_external_flag;
1713*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = import_export_feature_flags;
1714*61046927SAndroid Build Coastguard Worker break;
1715*61046927SAndroid Build Coastguard Worker }
1716*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1717*61046927SAndroid Build Coastguard Worker #endif
1718*61046927SAndroid Build Coastguard Worker default:
1719*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties = (VkExternalMemoryProperties){ 0 };
1720*61046927SAndroid Build Coastguard Worker break;
1721*61046927SAndroid Build Coastguard Worker }
1722*61046927SAndroid Build Coastguard Worker }
1723*61046927SAndroid Build Coastguard Worker
1724*61046927SAndroid Build Coastguard Worker VkResult
dzn_instance_add_physical_device(struct vk_instance * instance,IUnknown * adapter,const struct dzn_physical_device_desc * desc)1725*61046927SAndroid Build Coastguard Worker dzn_instance_add_physical_device(struct vk_instance *instance,
1726*61046927SAndroid Build Coastguard Worker IUnknown *adapter,
1727*61046927SAndroid Build Coastguard Worker const struct dzn_physical_device_desc *desc)
1728*61046927SAndroid Build Coastguard Worker {
1729*61046927SAndroid Build Coastguard Worker struct dzn_instance *dzn_instance = container_of(instance, struct dzn_instance, vk);
1730*61046927SAndroid Build Coastguard Worker if ((dzn_instance->debug_flags & DZN_DEBUG_WARP) &&
1731*61046927SAndroid Build Coastguard Worker !desc->is_warp)
1732*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1733*61046927SAndroid Build Coastguard Worker
1734*61046927SAndroid Build Coastguard Worker return dzn_physical_device_create(instance, adapter, desc);
1735*61046927SAndroid Build Coastguard Worker }
1736*61046927SAndroid Build Coastguard Worker
1737*61046927SAndroid Build Coastguard Worker static VkResult
dzn_enumerate_physical_devices(struct vk_instance * instance)1738*61046927SAndroid Build Coastguard Worker dzn_enumerate_physical_devices(struct vk_instance *instance)
1739*61046927SAndroid Build Coastguard Worker {
1740*61046927SAndroid Build Coastguard Worker VkResult result = dzn_enumerate_physical_devices_dxcore(instance);
1741*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1742*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1743*61046927SAndroid Build Coastguard Worker result = dzn_enumerate_physical_devices_dxgi(instance);
1744*61046927SAndroid Build Coastguard Worker #endif
1745*61046927SAndroid Build Coastguard Worker
1746*61046927SAndroid Build Coastguard Worker return result;
1747*61046927SAndroid Build Coastguard Worker }
1748*61046927SAndroid Build Coastguard Worker
1749*61046927SAndroid Build Coastguard Worker static const driOptionDescription dzn_dri_options[] = {
1750*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_DEBUG
1751*61046927SAndroid Build Coastguard Worker DRI_CONF_DZN_CLAIM_WIDE_LINES(false)
1752*61046927SAndroid Build Coastguard Worker DRI_CONF_DZN_ENABLE_8BIT_LOADS_STORES(false)
1753*61046927SAndroid Build Coastguard Worker DRI_CONF_DZN_DISABLE(false)
1754*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false)
1755*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_END
1756*61046927SAndroid Build Coastguard Worker };
1757*61046927SAndroid Build Coastguard Worker
1758*61046927SAndroid Build Coastguard Worker static void
dzn_init_dri_config(struct dzn_instance * instance)1759*61046927SAndroid Build Coastguard Worker dzn_init_dri_config(struct dzn_instance *instance)
1760*61046927SAndroid Build Coastguard Worker {
1761*61046927SAndroid Build Coastguard Worker driParseOptionInfo(&instance->available_dri_options, dzn_dri_options,
1762*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(dzn_dri_options));
1763*61046927SAndroid Build Coastguard Worker driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "dzn", NULL, NULL,
1764*61046927SAndroid Build Coastguard Worker instance->vk.app_info.app_name, instance->vk.app_info.app_version,
1765*61046927SAndroid Build Coastguard Worker instance->vk.app_info.engine_name, instance->vk.app_info.engine_version);
1766*61046927SAndroid Build Coastguard Worker }
1767*61046927SAndroid Build Coastguard Worker
1768*61046927SAndroid Build Coastguard Worker static VkResult
dzn_instance_create(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * out)1769*61046927SAndroid Build Coastguard Worker dzn_instance_create(const VkInstanceCreateInfo *pCreateInfo,
1770*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1771*61046927SAndroid Build Coastguard Worker VkInstance *out)
1772*61046927SAndroid Build Coastguard Worker {
1773*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
1774*61046927SAndroid Build Coastguard Worker vk_zalloc2(vk_default_allocator(), pAllocator, sizeof(*instance), 8,
1775*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
1776*61046927SAndroid Build Coastguard Worker if (!instance)
1777*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY);
1778*61046927SAndroid Build Coastguard Worker
1779*61046927SAndroid Build Coastguard Worker struct vk_instance_dispatch_table dispatch_table;
1780*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(&dispatch_table,
1781*61046927SAndroid Build Coastguard Worker &dzn_instance_entrypoints,
1782*61046927SAndroid Build Coastguard Worker true);
1783*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(&dispatch_table,
1784*61046927SAndroid Build Coastguard Worker &wsi_instance_entrypoints,
1785*61046927SAndroid Build Coastguard Worker false);
1786*61046927SAndroid Build Coastguard Worker
1787*61046927SAndroid Build Coastguard Worker VkResult result =
1788*61046927SAndroid Build Coastguard Worker vk_instance_init(&instance->vk, &instance_extensions,
1789*61046927SAndroid Build Coastguard Worker &dispatch_table, pCreateInfo,
1790*61046927SAndroid Build Coastguard Worker pAllocator ? pAllocator : vk_default_allocator());
1791*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1792*61046927SAndroid Build Coastguard Worker vk_free2(vk_default_allocator(), pAllocator, instance);
1793*61046927SAndroid Build Coastguard Worker return result;
1794*61046927SAndroid Build Coastguard Worker }
1795*61046927SAndroid Build Coastguard Worker
1796*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.enumerate = dzn_enumerate_physical_devices;
1797*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.destroy = dzn_physical_device_destroy;
1798*61046927SAndroid Build Coastguard Worker instance->debug_flags =
1799*61046927SAndroid Build Coastguard Worker parse_debug_string(getenv("DZN_DEBUG"), dzn_debug_options);
1800*61046927SAndroid Build Coastguard Worker
1801*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1802*61046927SAndroid Build Coastguard Worker if (instance->debug_flags & DZN_DEBUG_DEBUGGER) {
1803*61046927SAndroid Build Coastguard Worker /* wait for debugger to attach... */
1804*61046927SAndroid Build Coastguard Worker while (!IsDebuggerPresent()) {
1805*61046927SAndroid Build Coastguard Worker Sleep(100);
1806*61046927SAndroid Build Coastguard Worker }
1807*61046927SAndroid Build Coastguard Worker }
1808*61046927SAndroid Build Coastguard Worker
1809*61046927SAndroid Build Coastguard Worker if (instance->debug_flags & DZN_DEBUG_REDIRECTS) {
1810*61046927SAndroid Build Coastguard Worker char home[MAX_PATH], path[MAX_PATH];
1811*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, home))) {
1812*61046927SAndroid Build Coastguard Worker snprintf(path, sizeof(path), "%s\\stderr.txt", home);
1813*61046927SAndroid Build Coastguard Worker freopen(path, "w", stderr);
1814*61046927SAndroid Build Coastguard Worker snprintf(path, sizeof(path), "%s\\stdout.txt", home);
1815*61046927SAndroid Build Coastguard Worker freopen(path, "w", stdout);
1816*61046927SAndroid Build Coastguard Worker }
1817*61046927SAndroid Build Coastguard Worker }
1818*61046927SAndroid Build Coastguard Worker #endif
1819*61046927SAndroid Build Coastguard Worker
1820*61046927SAndroid Build Coastguard Worker bool missing_validator = false;
1821*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1822*61046927SAndroid Build Coastguard Worker if ((instance->debug_flags & DZN_DEBUG_EXPERIMENTAL) == 0) {
1823*61046927SAndroid Build Coastguard Worker instance->dxil_validator = dxil_create_validator(NULL);
1824*61046927SAndroid Build Coastguard Worker missing_validator = !instance->dxil_validator;
1825*61046927SAndroid Build Coastguard Worker }
1826*61046927SAndroid Build Coastguard Worker #endif
1827*61046927SAndroid Build Coastguard Worker
1828*61046927SAndroid Build Coastguard Worker if (missing_validator) {
1829*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(instance, pAllocator);
1830*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_INITIALIZATION_FAILED);
1831*61046927SAndroid Build Coastguard Worker }
1832*61046927SAndroid Build Coastguard Worker
1833*61046927SAndroid Build Coastguard Worker instance->d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT);
1834*61046927SAndroid Build Coastguard Worker if (!instance->d3d12_mod) {
1835*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(instance, pAllocator);
1836*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_INITIALIZATION_FAILED);
1837*61046927SAndroid Build Coastguard Worker }
1838*61046927SAndroid Build Coastguard Worker
1839*61046927SAndroid Build Coastguard Worker instance->d3d12.serialize_root_sig = d3d12_get_serialize_root_sig(instance->d3d12_mod);
1840*61046927SAndroid Build Coastguard Worker if (!instance->d3d12.serialize_root_sig) {
1841*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(instance, pAllocator);
1842*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_INITIALIZATION_FAILED);
1843*61046927SAndroid Build Coastguard Worker }
1844*61046927SAndroid Build Coastguard Worker
1845*61046927SAndroid Build Coastguard Worker instance->factory = try_create_device_factory(instance->d3d12_mod);
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker if (instance->debug_flags & DZN_DEBUG_D3D12)
1848*61046927SAndroid Build Coastguard Worker d3d12_enable_debug_layer(instance->d3d12_mod, instance->factory);
1849*61046927SAndroid Build Coastguard Worker if (instance->debug_flags & DZN_DEBUG_GBV)
1850*61046927SAndroid Build Coastguard Worker d3d12_enable_gpu_validation(instance->d3d12_mod, instance->factory);
1851*61046927SAndroid Build Coastguard Worker
1852*61046927SAndroid Build Coastguard Worker instance->sync_binary_type = vk_sync_binary_get_type(&dzn_sync_type);
1853*61046927SAndroid Build Coastguard Worker dzn_init_dri_config(instance);
1854*61046927SAndroid Build Coastguard Worker
1855*61046927SAndroid Build Coastguard Worker if (driQueryOptionb(&instance->dri_options, "dzn_disable")) {
1856*61046927SAndroid Build Coastguard Worker dzn_instance_destroy(instance, pAllocator);
1857*61046927SAndroid Build Coastguard Worker return vk_errorf(NULL, VK_ERROR_INITIALIZATION_FAILED, "dzn_disable set, failing instance creation");
1858*61046927SAndroid Build Coastguard Worker }
1859*61046927SAndroid Build Coastguard Worker
1860*61046927SAndroid Build Coastguard Worker *out = dzn_instance_to_handle(instance);
1861*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1862*61046927SAndroid Build Coastguard Worker }
1863*61046927SAndroid Build Coastguard Worker
1864*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)1865*61046927SAndroid Build Coastguard Worker dzn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
1866*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1867*61046927SAndroid Build Coastguard Worker VkInstance *pInstance)
1868*61046927SAndroid Build Coastguard Worker {
1869*61046927SAndroid Build Coastguard Worker return dzn_instance_create(pCreateInfo, pAllocator, pInstance);
1870*61046927SAndroid Build Coastguard Worker }
1871*61046927SAndroid Build Coastguard Worker
1872*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_EnumerateInstanceVersion(uint32_t * pApiVersion)1873*61046927SAndroid Build Coastguard Worker dzn_EnumerateInstanceVersion(uint32_t *pApiVersion)
1874*61046927SAndroid Build Coastguard Worker {
1875*61046927SAndroid Build Coastguard Worker *pApiVersion = DZN_API_VERSION;
1876*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1877*61046927SAndroid Build Coastguard Worker }
1878*61046927SAndroid Build Coastguard Worker
1879*61046927SAndroid Build Coastguard Worker
1880*61046927SAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
dzn_GetInstanceProcAddr(VkInstance _instance,const char * pName)1881*61046927SAndroid Build Coastguard Worker dzn_GetInstanceProcAddr(VkInstance _instance,
1882*61046927SAndroid Build Coastguard Worker const char *pName)
1883*61046927SAndroid Build Coastguard Worker {
1884*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_instance, instance, _instance);
1885*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr(&instance->vk,
1886*61046927SAndroid Build Coastguard Worker &dzn_instance_entrypoints,
1887*61046927SAndroid Build Coastguard Worker pName);
1888*61046927SAndroid Build Coastguard Worker }
1889*61046927SAndroid Build Coastguard Worker
1890*61046927SAndroid Build Coastguard Worker /* Windows will use a dll definition file to avoid build errors. */
1891*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
1892*61046927SAndroid Build Coastguard Worker #undef PUBLIC
1893*61046927SAndroid Build Coastguard Worker #define PUBLIC
1894*61046927SAndroid Build Coastguard Worker #endif
1895*61046927SAndroid Build Coastguard Worker
1896*61046927SAndroid Build Coastguard Worker PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
vk_icdGetInstanceProcAddr(VkInstance instance,const char * pName)1897*61046927SAndroid Build Coastguard Worker vk_icdGetInstanceProcAddr(VkInstance instance,
1898*61046927SAndroid Build Coastguard Worker const char *pName)
1899*61046927SAndroid Build Coastguard Worker {
1900*61046927SAndroid Build Coastguard Worker return dzn_GetInstanceProcAddr(instance, pName);
1901*61046927SAndroid Build Coastguard Worker }
1902*61046927SAndroid Build Coastguard Worker
1903*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties)1904*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,
1905*61046927SAndroid Build Coastguard Worker uint32_t *pQueueFamilyPropertyCount,
1906*61046927SAndroid Build Coastguard Worker VkQueueFamilyProperties2 *pQueueFamilyProperties)
1907*61046927SAndroid Build Coastguard Worker {
1908*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice);
1909*61046927SAndroid Build Coastguard Worker VK_OUTARRAY_MAKE_TYPED(VkQueueFamilyProperties2, out,
1910*61046927SAndroid Build Coastguard Worker pQueueFamilyProperties, pQueueFamilyPropertyCount);
1911*61046927SAndroid Build Coastguard Worker
1912*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pdev->queue_family_count; i++) {
1913*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkQueueFamilyProperties2, &out, p) {
1914*61046927SAndroid Build Coastguard Worker p->queueFamilyProperties = pdev->queue_families[i].props;
1915*61046927SAndroid Build Coastguard Worker
1916*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pQueueFamilyProperties->pNext) {
1917*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
1918*61046927SAndroid Build Coastguard Worker }
1919*61046927SAndroid Build Coastguard Worker }
1920*61046927SAndroid Build Coastguard Worker }
1921*61046927SAndroid Build Coastguard Worker }
1922*61046927SAndroid Build Coastguard Worker
1923*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties * pMemoryProperties)1924*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1925*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties *pMemoryProperties)
1926*61046927SAndroid Build Coastguard Worker {
1927*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice);
1928*61046927SAndroid Build Coastguard Worker
1929*61046927SAndroid Build Coastguard Worker *pMemoryProperties = pdev->memory;
1930*61046927SAndroid Build Coastguard Worker }
1931*61046927SAndroid Build Coastguard Worker
1932*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties2 * pMemoryProperties)1933*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,
1934*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties2 *pMemoryProperties)
1935*61046927SAndroid Build Coastguard Worker {
1936*61046927SAndroid Build Coastguard Worker dzn_GetPhysicalDeviceMemoryProperties(physicalDevice,
1937*61046927SAndroid Build Coastguard Worker &pMemoryProperties->memoryProperties);
1938*61046927SAndroid Build Coastguard Worker
1939*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryProperties->pNext) {
1940*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
1941*61046927SAndroid Build Coastguard Worker }
1942*61046927SAndroid Build Coastguard Worker }
1943*61046927SAndroid Build Coastguard Worker
1944*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_EnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)1945*61046927SAndroid Build Coastguard Worker dzn_EnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
1946*61046927SAndroid Build Coastguard Worker VkLayerProperties *pProperties)
1947*61046927SAndroid Build Coastguard Worker {
1948*61046927SAndroid Build Coastguard Worker if (pProperties == NULL) {
1949*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
1950*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1951*61046927SAndroid Build Coastguard Worker }
1952*61046927SAndroid Build Coastguard Worker
1953*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
1954*61046927SAndroid Build Coastguard Worker }
1955*61046927SAndroid Build Coastguard Worker
1956*61046927SAndroid Build Coastguard Worker static VkResult
dzn_queue_sync_wait(struct dzn_queue * queue,const struct vk_sync_wait * wait)1957*61046927SAndroid Build Coastguard Worker dzn_queue_sync_wait(struct dzn_queue *queue, const struct vk_sync_wait *wait)
1958*61046927SAndroid Build Coastguard Worker {
1959*61046927SAndroid Build Coastguard Worker if (wait->sync->type == &vk_sync_dummy_type)
1960*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1961*61046927SAndroid Build Coastguard Worker
1962*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(queue->vk.base.device, struct dzn_device, vk);
1963*61046927SAndroid Build Coastguard Worker assert(wait->sync->type == &dzn_sync_type);
1964*61046927SAndroid Build Coastguard Worker struct dzn_sync *sync = container_of(wait->sync, struct dzn_sync, vk);
1965*61046927SAndroid Build Coastguard Worker uint64_t value =
1966*61046927SAndroid Build Coastguard Worker (sync->vk.flags & VK_SYNC_IS_TIMELINE) ? wait->wait_value : 1;
1967*61046927SAndroid Build Coastguard Worker
1968*61046927SAndroid Build Coastguard Worker assert(sync->fence != NULL);
1969*61046927SAndroid Build Coastguard Worker
1970*61046927SAndroid Build Coastguard Worker if (value > 0 && FAILED(ID3D12CommandQueue_Wait(queue->cmdqueue, sync->fence, value)))
1971*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_UNKNOWN);
1972*61046927SAndroid Build Coastguard Worker
1973*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1974*61046927SAndroid Build Coastguard Worker }
1975*61046927SAndroid Build Coastguard Worker
1976*61046927SAndroid Build Coastguard Worker static VkResult
dzn_queue_sync_signal(struct dzn_queue * queue,const struct vk_sync_signal * signal)1977*61046927SAndroid Build Coastguard Worker dzn_queue_sync_signal(struct dzn_queue *queue, const struct vk_sync_signal *signal)
1978*61046927SAndroid Build Coastguard Worker {
1979*61046927SAndroid Build Coastguard Worker if (signal->sync->type == &vk_sync_dummy_type)
1980*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1981*61046927SAndroid Build Coastguard Worker
1982*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(queue->vk.base.device, struct dzn_device, vk);
1983*61046927SAndroid Build Coastguard Worker assert(signal->sync->type == &dzn_sync_type);
1984*61046927SAndroid Build Coastguard Worker struct dzn_sync *sync = container_of(signal->sync, struct dzn_sync, vk);
1985*61046927SAndroid Build Coastguard Worker uint64_t value =
1986*61046927SAndroid Build Coastguard Worker (sync->vk.flags & VK_SYNC_IS_TIMELINE) ? signal->signal_value : 1;
1987*61046927SAndroid Build Coastguard Worker assert(value > 0);
1988*61046927SAndroid Build Coastguard Worker
1989*61046927SAndroid Build Coastguard Worker assert(sync->fence != NULL);
1990*61046927SAndroid Build Coastguard Worker
1991*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12CommandQueue_Signal(queue->cmdqueue, sync->fence, value)))
1992*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_UNKNOWN);
1993*61046927SAndroid Build Coastguard Worker
1994*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1995*61046927SAndroid Build Coastguard Worker }
1996*61046927SAndroid Build Coastguard Worker
1997*61046927SAndroid Build Coastguard Worker static VkResult
dzn_queue_submit(struct vk_queue * q,struct vk_queue_submit * info)1998*61046927SAndroid Build Coastguard Worker dzn_queue_submit(struct vk_queue *q,
1999*61046927SAndroid Build Coastguard Worker struct vk_queue_submit *info)
2000*61046927SAndroid Build Coastguard Worker {
2001*61046927SAndroid Build Coastguard Worker struct dzn_queue *queue = container_of(q, struct dzn_queue, vk);
2002*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(q->base.device, struct dzn_device, vk);
2003*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
2004*61046927SAndroid Build Coastguard Worker
2005*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < info->wait_count; i++) {
2006*61046927SAndroid Build Coastguard Worker result = dzn_queue_sync_wait(queue, &info->waits[i]);
2007*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2008*61046927SAndroid Build Coastguard Worker return result;
2009*61046927SAndroid Build Coastguard Worker }
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker ID3D12CommandList **cmdlists = alloca(info->command_buffer_count * sizeof(ID3D12CommandList*));
2012*61046927SAndroid Build Coastguard Worker
2013*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < info->command_buffer_count; i++) {
2014*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer *cmd_buffer =
2015*61046927SAndroid Build Coastguard Worker container_of(info->command_buffers[i], struct dzn_cmd_buffer, vk);
2016*61046927SAndroid Build Coastguard Worker
2017*61046927SAndroid Build Coastguard Worker cmdlists[i] = (ID3D12CommandList *)cmd_buffer->cmdlist;
2018*61046927SAndroid Build Coastguard Worker
2019*61046927SAndroid Build Coastguard Worker util_dynarray_foreach(&cmd_buffer->queries.reset, struct dzn_cmd_buffer_query_range, range) {
2020*61046927SAndroid Build Coastguard Worker mtx_lock(&range->qpool->queries_lock);
2021*61046927SAndroid Build Coastguard Worker for (uint32_t q = range->start; q < range->start + range->count; q++) {
2022*61046927SAndroid Build Coastguard Worker struct dzn_query *query = &range->qpool->queries[q];
2023*61046927SAndroid Build Coastguard Worker if (query->fence) {
2024*61046927SAndroid Build Coastguard Worker ID3D12Fence_Release(query->fence);
2025*61046927SAndroid Build Coastguard Worker query->fence = NULL;
2026*61046927SAndroid Build Coastguard Worker }
2027*61046927SAndroid Build Coastguard Worker query->fence_value = 0;
2028*61046927SAndroid Build Coastguard Worker }
2029*61046927SAndroid Build Coastguard Worker mtx_unlock(&range->qpool->queries_lock);
2030*61046927SAndroid Build Coastguard Worker }
2031*61046927SAndroid Build Coastguard Worker }
2032*61046927SAndroid Build Coastguard Worker
2033*61046927SAndroid Build Coastguard Worker ID3D12CommandQueue_ExecuteCommandLists(queue->cmdqueue, info->command_buffer_count, cmdlists);
2034*61046927SAndroid Build Coastguard Worker
2035*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < info->command_buffer_count; i++) {
2036*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer* cmd_buffer =
2037*61046927SAndroid Build Coastguard Worker container_of(info->command_buffers[i], struct dzn_cmd_buffer, vk);
2038*61046927SAndroid Build Coastguard Worker
2039*61046927SAndroid Build Coastguard Worker util_dynarray_foreach(&cmd_buffer->events.signal, struct dzn_cmd_event_signal, evt) {
2040*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12CommandQueue_Signal(queue->cmdqueue, evt->event->fence, evt->value ? 1 : 0)))
2041*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_UNKNOWN);
2042*61046927SAndroid Build Coastguard Worker }
2043*61046927SAndroid Build Coastguard Worker
2044*61046927SAndroid Build Coastguard Worker util_dynarray_foreach(&cmd_buffer->queries.signal, struct dzn_cmd_buffer_query_range, range) {
2045*61046927SAndroid Build Coastguard Worker mtx_lock(&range->qpool->queries_lock);
2046*61046927SAndroid Build Coastguard Worker for (uint32_t q = range->start; q < range->start + range->count; q++) {
2047*61046927SAndroid Build Coastguard Worker struct dzn_query *query = &range->qpool->queries[q];
2048*61046927SAndroid Build Coastguard Worker query->fence_value = queue->fence_point + 1;
2049*61046927SAndroid Build Coastguard Worker query->fence = queue->fence;
2050*61046927SAndroid Build Coastguard Worker ID3D12Fence_AddRef(query->fence);
2051*61046927SAndroid Build Coastguard Worker }
2052*61046927SAndroid Build Coastguard Worker mtx_unlock(&range->qpool->queries_lock);
2053*61046927SAndroid Build Coastguard Worker }
2054*61046927SAndroid Build Coastguard Worker }
2055*61046927SAndroid Build Coastguard Worker
2056*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < info->signal_count; i++) {
2057*61046927SAndroid Build Coastguard Worker result = dzn_queue_sync_signal(queue, &info->signals[i]);
2058*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2059*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_UNKNOWN);
2060*61046927SAndroid Build Coastguard Worker }
2061*61046927SAndroid Build Coastguard Worker
2062*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12CommandQueue_Signal(queue->cmdqueue, queue->fence, ++queue->fence_point)))
2063*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_UNKNOWN);
2064*61046927SAndroid Build Coastguard Worker
2065*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2066*61046927SAndroid Build Coastguard Worker }
2067*61046927SAndroid Build Coastguard Worker
2068*61046927SAndroid Build Coastguard Worker static void
dzn_queue_finish(struct dzn_queue * queue)2069*61046927SAndroid Build Coastguard Worker dzn_queue_finish(struct dzn_queue *queue)
2070*61046927SAndroid Build Coastguard Worker {
2071*61046927SAndroid Build Coastguard Worker if (queue->cmdqueue)
2072*61046927SAndroid Build Coastguard Worker ID3D12CommandQueue_Release(queue->cmdqueue);
2073*61046927SAndroid Build Coastguard Worker
2074*61046927SAndroid Build Coastguard Worker if (queue->fence)
2075*61046927SAndroid Build Coastguard Worker ID3D12Fence_Release(queue->fence);
2076*61046927SAndroid Build Coastguard Worker
2077*61046927SAndroid Build Coastguard Worker vk_queue_finish(&queue->vk);
2078*61046927SAndroid Build Coastguard Worker }
2079*61046927SAndroid Build Coastguard Worker
2080*61046927SAndroid Build Coastguard Worker static VkResult
dzn_queue_init(struct dzn_queue * queue,struct dzn_device * device,const VkDeviceQueueCreateInfo * pCreateInfo,uint32_t index_in_family)2081*61046927SAndroid Build Coastguard Worker dzn_queue_init(struct dzn_queue *queue,
2082*61046927SAndroid Build Coastguard Worker struct dzn_device *device,
2083*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *pCreateInfo,
2084*61046927SAndroid Build Coastguard Worker uint32_t index_in_family)
2085*61046927SAndroid Build Coastguard Worker {
2086*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(device->vk.physical, struct dzn_physical_device, vk);
2087*61046927SAndroid Build Coastguard Worker
2088*61046927SAndroid Build Coastguard Worker VkResult result = vk_queue_init(&queue->vk, &device->vk, pCreateInfo, index_in_family);
2089*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2090*61046927SAndroid Build Coastguard Worker return result;
2091*61046927SAndroid Build Coastguard Worker
2092*61046927SAndroid Build Coastguard Worker queue->vk.driver_submit = dzn_queue_submit;
2093*61046927SAndroid Build Coastguard Worker
2094*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->queueFamilyIndex < pdev->queue_family_count);
2095*61046927SAndroid Build Coastguard Worker
2096*61046927SAndroid Build Coastguard Worker D3D12_COMMAND_QUEUE_DESC queue_desc =
2097*61046927SAndroid Build Coastguard Worker pdev->queue_families[pCreateInfo->queueFamilyIndex].desc;
2098*61046927SAndroid Build Coastguard Worker
2099*61046927SAndroid Build Coastguard Worker float priority_in = pCreateInfo->pQueuePriorities[index_in_family];
2100*61046927SAndroid Build Coastguard Worker queue_desc.Priority =
2101*61046927SAndroid Build Coastguard Worker priority_in > 0.5f ? D3D12_COMMAND_QUEUE_PRIORITY_HIGH : D3D12_COMMAND_QUEUE_PRIORITY_NORMAL;
2102*61046927SAndroid Build Coastguard Worker queue_desc.NodeMask = 0;
2103*61046927SAndroid Build Coastguard Worker
2104*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateCommandQueue(device->dev, &queue_desc,
2105*61046927SAndroid Build Coastguard Worker &IID_ID3D12CommandQueue,
2106*61046927SAndroid Build Coastguard Worker (void **)&queue->cmdqueue))) {
2107*61046927SAndroid Build Coastguard Worker dzn_queue_finish(queue);
2108*61046927SAndroid Build Coastguard Worker return vk_error(device->vk.physical->instance, VK_ERROR_INITIALIZATION_FAILED);
2109*61046927SAndroid Build Coastguard Worker }
2110*61046927SAndroid Build Coastguard Worker
2111*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateFence(device->dev, 0, D3D12_FENCE_FLAG_NONE,
2112*61046927SAndroid Build Coastguard Worker &IID_ID3D12Fence,
2113*61046927SAndroid Build Coastguard Worker (void **)&queue->fence))) {
2114*61046927SAndroid Build Coastguard Worker dzn_queue_finish(queue);
2115*61046927SAndroid Build Coastguard Worker return vk_error(device->vk.physical->instance, VK_ERROR_INITIALIZATION_FAILED);
2116*61046927SAndroid Build Coastguard Worker }
2117*61046927SAndroid Build Coastguard Worker
2118*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2119*61046927SAndroid Build Coastguard Worker }
2120*61046927SAndroid Build Coastguard Worker
2121*61046927SAndroid Build Coastguard Worker static VkResult
dzn_device_create_sync_for_memory(struct vk_device * device,VkDeviceMemory memory,bool signal_memory,struct vk_sync ** sync_out)2122*61046927SAndroid Build Coastguard Worker dzn_device_create_sync_for_memory(struct vk_device *device,
2123*61046927SAndroid Build Coastguard Worker VkDeviceMemory memory,
2124*61046927SAndroid Build Coastguard Worker bool signal_memory,
2125*61046927SAndroid Build Coastguard Worker struct vk_sync **sync_out)
2126*61046927SAndroid Build Coastguard Worker {
2127*61046927SAndroid Build Coastguard Worker return vk_sync_create(device, &vk_sync_dummy_type,
2128*61046927SAndroid Build Coastguard Worker 0, 1, sync_out);
2129*61046927SAndroid Build Coastguard Worker }
2130*61046927SAndroid Build Coastguard Worker
2131*61046927SAndroid Build Coastguard Worker static VkResult
dzn_device_query_init(struct dzn_device * device)2132*61046927SAndroid Build Coastguard Worker dzn_device_query_init(struct dzn_device *device)
2133*61046927SAndroid Build Coastguard Worker {
2134*61046927SAndroid Build Coastguard Worker /* FIXME: create the resource in the default heap */
2135*61046927SAndroid Build Coastguard Worker D3D12_HEAP_PROPERTIES hprops = dzn_ID3D12Device4_GetCustomHeapProperties(device->dev, 0, D3D12_HEAP_TYPE_UPLOAD);
2136*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC rdesc = {
2137*61046927SAndroid Build Coastguard Worker .Dimension = D3D12_RESOURCE_DIMENSION_BUFFER,
2138*61046927SAndroid Build Coastguard Worker .Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
2139*61046927SAndroid Build Coastguard Worker .Width = DZN_QUERY_REFS_RES_SIZE,
2140*61046927SAndroid Build Coastguard Worker .Height = 1,
2141*61046927SAndroid Build Coastguard Worker .DepthOrArraySize = 1,
2142*61046927SAndroid Build Coastguard Worker .MipLevels = 1,
2143*61046927SAndroid Build Coastguard Worker .Format = DXGI_FORMAT_UNKNOWN,
2144*61046927SAndroid Build Coastguard Worker .SampleDesc = { .Count = 1, .Quality = 0 },
2145*61046927SAndroid Build Coastguard Worker .Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR,
2146*61046927SAndroid Build Coastguard Worker .Flags = D3D12_RESOURCE_FLAG_NONE,
2147*61046927SAndroid Build Coastguard Worker };
2148*61046927SAndroid Build Coastguard Worker
2149*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateCommittedResource(device->dev, &hprops,
2150*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAG_NONE,
2151*61046927SAndroid Build Coastguard Worker &rdesc,
2152*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
2153*61046927SAndroid Build Coastguard Worker NULL,
2154*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
2155*61046927SAndroid Build Coastguard Worker (void **)&device->queries.refs)))
2156*61046927SAndroid Build Coastguard Worker return vk_error(device->vk.physical, VK_ERROR_OUT_OF_DEVICE_MEMORY);
2157*61046927SAndroid Build Coastguard Worker
2158*61046927SAndroid Build Coastguard Worker uint8_t *queries_ref;
2159*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Resource_Map(device->queries.refs, 0, NULL, (void **)&queries_ref)))
2160*61046927SAndroid Build Coastguard Worker return vk_error(device->vk.physical, VK_ERROR_OUT_OF_HOST_MEMORY);
2161*61046927SAndroid Build Coastguard Worker
2162*61046927SAndroid Build Coastguard Worker memset(queries_ref + DZN_QUERY_REFS_ALL_ONES_OFFSET, 0xff, DZN_QUERY_REFS_SECTION_SIZE);
2163*61046927SAndroid Build Coastguard Worker memset(queries_ref + DZN_QUERY_REFS_ALL_ZEROS_OFFSET, 0x0, DZN_QUERY_REFS_SECTION_SIZE);
2164*61046927SAndroid Build Coastguard Worker ID3D12Resource_Unmap(device->queries.refs, 0, NULL);
2165*61046927SAndroid Build Coastguard Worker
2166*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2167*61046927SAndroid Build Coastguard Worker }
2168*61046927SAndroid Build Coastguard Worker
2169*61046927SAndroid Build Coastguard Worker static void
dzn_device_query_finish(struct dzn_device * device)2170*61046927SAndroid Build Coastguard Worker dzn_device_query_finish(struct dzn_device *device)
2171*61046927SAndroid Build Coastguard Worker {
2172*61046927SAndroid Build Coastguard Worker if (device->queries.refs)
2173*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(device->queries.refs);
2174*61046927SAndroid Build Coastguard Worker }
2175*61046927SAndroid Build Coastguard Worker
2176*61046927SAndroid Build Coastguard Worker static void
dzn_device_destroy(struct dzn_device * device,const VkAllocationCallbacks * pAllocator)2177*61046927SAndroid Build Coastguard Worker dzn_device_destroy(struct dzn_device *device, const VkAllocationCallbacks *pAllocator)
2178*61046927SAndroid Build Coastguard Worker {
2179*61046927SAndroid Build Coastguard Worker if (!device)
2180*61046927SAndroid Build Coastguard Worker return;
2181*61046927SAndroid Build Coastguard Worker
2182*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
2183*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
2184*61046927SAndroid Build Coastguard Worker
2185*61046927SAndroid Build Coastguard Worker vk_foreach_queue_safe(q, &device->vk) {
2186*61046927SAndroid Build Coastguard Worker struct dzn_queue *queue = container_of(q, struct dzn_queue, vk);
2187*61046927SAndroid Build Coastguard Worker
2188*61046927SAndroid Build Coastguard Worker dzn_queue_finish(queue);
2189*61046927SAndroid Build Coastguard Worker }
2190*61046927SAndroid Build Coastguard Worker
2191*61046927SAndroid Build Coastguard Worker dzn_device_query_finish(device);
2192*61046927SAndroid Build Coastguard Worker dzn_meta_finish(device);
2193*61046927SAndroid Build Coastguard Worker
2194*61046927SAndroid Build Coastguard Worker dzn_foreach_pool_type(type) {
2195*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_finish(&device->device_heaps[type].heap);
2196*61046927SAndroid Build Coastguard Worker util_dynarray_fini(&device->device_heaps[type].slot_freelist);
2197*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->device_heaps[type].lock);
2198*61046927SAndroid Build Coastguard Worker }
2199*61046927SAndroid Build Coastguard Worker
2200*61046927SAndroid Build Coastguard Worker if (device->dev_config)
2201*61046927SAndroid Build Coastguard Worker ID3D12DeviceConfiguration_Release(device->dev_config);
2202*61046927SAndroid Build Coastguard Worker
2203*61046927SAndroid Build Coastguard Worker if (device->dev)
2204*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(device->dev);
2205*61046927SAndroid Build Coastguard Worker
2206*61046927SAndroid Build Coastguard Worker if (device->dev10)
2207*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(device->dev10);
2208*61046927SAndroid Build Coastguard Worker
2209*61046927SAndroid Build Coastguard Worker if (device->dev11)
2210*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(device->dev11);
2211*61046927SAndroid Build Coastguard Worker
2212*61046927SAndroid Build Coastguard Worker if (device->dev12)
2213*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(device->dev12);
2214*61046927SAndroid Build Coastguard Worker
2215*61046927SAndroid Build Coastguard Worker if (device->dev13)
2216*61046927SAndroid Build Coastguard Worker ID3D12Device1_Release(device->dev13);
2217*61046927SAndroid Build Coastguard Worker
2218*61046927SAndroid Build Coastguard Worker vk_device_finish(&device->vk);
2219*61046927SAndroid Build Coastguard Worker vk_free2(&instance->vk.alloc, pAllocator, device);
2220*61046927SAndroid Build Coastguard Worker }
2221*61046927SAndroid Build Coastguard Worker
2222*61046927SAndroid Build Coastguard Worker static VkResult
dzn_device_check_status(struct vk_device * dev)2223*61046927SAndroid Build Coastguard Worker dzn_device_check_status(struct vk_device *dev)
2224*61046927SAndroid Build Coastguard Worker {
2225*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(dev, struct dzn_device, vk);
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_GetDeviceRemovedReason(device->dev)))
2228*61046927SAndroid Build Coastguard Worker return vk_device_set_lost(&device->vk, "D3D12 device removed");
2229*61046927SAndroid Build Coastguard Worker
2230*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2231*61046927SAndroid Build Coastguard Worker }
2232*61046927SAndroid Build Coastguard Worker
2233*61046927SAndroid Build Coastguard Worker static VkResult
dzn_device_create(struct dzn_physical_device * pdev,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * out)2234*61046927SAndroid Build Coastguard Worker dzn_device_create(struct dzn_physical_device *pdev,
2235*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *pCreateInfo,
2236*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2237*61046927SAndroid Build Coastguard Worker VkDevice *out)
2238*61046927SAndroid Build Coastguard Worker {
2239*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance = container_of(pdev->vk.instance, struct dzn_instance, vk);
2240*61046927SAndroid Build Coastguard Worker
2241*61046927SAndroid Build Coastguard Worker uint32_t graphics_queue_count = 0;
2242*61046927SAndroid Build Coastguard Worker uint32_t queue_count = 0;
2243*61046927SAndroid Build Coastguard Worker for (uint32_t qf = 0; qf < pCreateInfo->queueCreateInfoCount; qf++) {
2244*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *qinfo = &pCreateInfo->pQueueCreateInfos[qf];
2245*61046927SAndroid Build Coastguard Worker queue_count += qinfo->queueCount;
2246*61046927SAndroid Build Coastguard Worker if (pdev->queue_families[qinfo->queueFamilyIndex].props.queueFlags & VK_QUEUE_GRAPHICS_BIT)
2247*61046927SAndroid Build Coastguard Worker graphics_queue_count += qinfo->queueCount;
2248*61046927SAndroid Build Coastguard Worker }
2249*61046927SAndroid Build Coastguard Worker
2250*61046927SAndroid Build Coastguard Worker /* Add a swapchain queue if there's no or too many graphics queues */
2251*61046927SAndroid Build Coastguard Worker if (graphics_queue_count != 1)
2252*61046927SAndroid Build Coastguard Worker queue_count++;
2253*61046927SAndroid Build Coastguard Worker
2254*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC(ma);
2255*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC_DECL(&ma, struct dzn_device, device, 1);
2256*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC_DECL(&ma, struct dzn_queue, queues, queue_count);
2257*61046927SAndroid Build Coastguard Worker
2258*61046927SAndroid Build Coastguard Worker if (!vk_multialloc_zalloc2(&ma, &instance->vk.alloc, pAllocator,
2259*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE))
2260*61046927SAndroid Build Coastguard Worker return vk_error(pdev, VK_ERROR_OUT_OF_HOST_MEMORY);
2261*61046927SAndroid Build Coastguard Worker
2262*61046927SAndroid Build Coastguard Worker struct vk_device_dispatch_table dispatch_table;
2263*61046927SAndroid Build Coastguard Worker
2264*61046927SAndroid Build Coastguard Worker /* For secondary command buffer support, overwrite any command entrypoints
2265*61046927SAndroid Build Coastguard Worker * in the main device-level dispatch table with
2266*61046927SAndroid Build Coastguard Worker * vk_cmd_enqueue_unless_primary_Cmd*.
2267*61046927SAndroid Build Coastguard Worker */
2268*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
2269*61046927SAndroid Build Coastguard Worker &vk_cmd_enqueue_unless_primary_device_entrypoints, true);
2270*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
2271*61046927SAndroid Build Coastguard Worker &dzn_device_entrypoints, false);
2272*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
2273*61046927SAndroid Build Coastguard Worker &wsi_device_entrypoints, false);
2274*61046927SAndroid Build Coastguard Worker
2275*61046927SAndroid Build Coastguard Worker /* Populate our primary cmd_dispatch table. */
2276*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&device->cmd_dispatch,
2277*61046927SAndroid Build Coastguard Worker &dzn_device_entrypoints, true);
2278*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&device->cmd_dispatch,
2279*61046927SAndroid Build Coastguard Worker &vk_common_device_entrypoints,
2280*61046927SAndroid Build Coastguard Worker false);
2281*61046927SAndroid Build Coastguard Worker
2282*61046927SAndroid Build Coastguard Worker /* Override entrypoints with alternatives based on supported features. */
2283*61046927SAndroid Build Coastguard Worker if (pdev->options12.EnhancedBarriersSupported) {
2284*61046927SAndroid Build Coastguard Worker device->cmd_dispatch.CmdPipelineBarrier2 = dzn_CmdPipelineBarrier2_enhanced;
2285*61046927SAndroid Build Coastguard Worker }
2286*61046927SAndroid Build Coastguard Worker
2287*61046927SAndroid Build Coastguard Worker VkResult result =
2288*61046927SAndroid Build Coastguard Worker vk_device_init(&device->vk, &pdev->vk, &dispatch_table, pCreateInfo, pAllocator);
2289*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2290*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, device);
2291*61046927SAndroid Build Coastguard Worker return result;
2292*61046927SAndroid Build Coastguard Worker }
2293*61046927SAndroid Build Coastguard Worker
2294*61046927SAndroid Build Coastguard Worker /* Must be done after vk_device_init() because this function memset(0) the
2295*61046927SAndroid Build Coastguard Worker * whole struct.
2296*61046927SAndroid Build Coastguard Worker */
2297*61046927SAndroid Build Coastguard Worker device->vk.command_dispatch_table = &device->cmd_dispatch;
2298*61046927SAndroid Build Coastguard Worker device->vk.create_sync_for_memory = dzn_device_create_sync_for_memory;
2299*61046927SAndroid Build Coastguard Worker device->vk.check_status = dzn_device_check_status;
2300*61046927SAndroid Build Coastguard Worker
2301*61046927SAndroid Build Coastguard Worker device->dev = pdev->dev;
2302*61046927SAndroid Build Coastguard Worker
2303*61046927SAndroid Build Coastguard Worker ID3D12Device1_AddRef(device->dev);
2304*61046927SAndroid Build Coastguard Worker
2305*61046927SAndroid Build Coastguard Worker if (pdev->dev10) {
2306*61046927SAndroid Build Coastguard Worker device->dev10 = pdev->dev10;
2307*61046927SAndroid Build Coastguard Worker ID3D12Device1_AddRef(device->dev10);
2308*61046927SAndroid Build Coastguard Worker }
2309*61046927SAndroid Build Coastguard Worker if (pdev->dev11) {
2310*61046927SAndroid Build Coastguard Worker device->dev11 = pdev->dev11;
2311*61046927SAndroid Build Coastguard Worker ID3D12Device1_AddRef(device->dev11);
2312*61046927SAndroid Build Coastguard Worker }
2313*61046927SAndroid Build Coastguard Worker
2314*61046927SAndroid Build Coastguard Worker if (pdev->dev12) {
2315*61046927SAndroid Build Coastguard Worker device->dev12 = pdev->dev12;
2316*61046927SAndroid Build Coastguard Worker ID3D12Device1_AddRef(device->dev12);
2317*61046927SAndroid Build Coastguard Worker }
2318*61046927SAndroid Build Coastguard Worker
2319*61046927SAndroid Build Coastguard Worker if (pdev->dev13) {
2320*61046927SAndroid Build Coastguard Worker device->dev13 = pdev->dev13;
2321*61046927SAndroid Build Coastguard Worker ID3D12Device1_AddRef(device->dev13);
2322*61046927SAndroid Build Coastguard Worker }
2323*61046927SAndroid Build Coastguard Worker
2324*61046927SAndroid Build Coastguard Worker ID3D12InfoQueue *info_queue;
2325*61046927SAndroid Build Coastguard Worker if (SUCCEEDED(ID3D12Device1_QueryInterface(device->dev,
2326*61046927SAndroid Build Coastguard Worker &IID_ID3D12InfoQueue,
2327*61046927SAndroid Build Coastguard Worker (void **)&info_queue))) {
2328*61046927SAndroid Build Coastguard Worker D3D12_MESSAGE_SEVERITY severities[] = {
2329*61046927SAndroid Build Coastguard Worker D3D12_MESSAGE_SEVERITY_INFO,
2330*61046927SAndroid Build Coastguard Worker D3D12_MESSAGE_SEVERITY_WARNING,
2331*61046927SAndroid Build Coastguard Worker };
2332*61046927SAndroid Build Coastguard Worker
2333*61046927SAndroid Build Coastguard Worker D3D12_MESSAGE_ID msg_ids[] = {
2334*61046927SAndroid Build Coastguard Worker D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE,
2335*61046927SAndroid Build Coastguard Worker };
2336*61046927SAndroid Build Coastguard Worker
2337*61046927SAndroid Build Coastguard Worker D3D12_INFO_QUEUE_FILTER NewFilter = { 0 };
2338*61046927SAndroid Build Coastguard Worker NewFilter.DenyList.NumSeverities = ARRAY_SIZE(severities);
2339*61046927SAndroid Build Coastguard Worker NewFilter.DenyList.pSeverityList = severities;
2340*61046927SAndroid Build Coastguard Worker NewFilter.DenyList.NumIDs = ARRAY_SIZE(msg_ids);
2341*61046927SAndroid Build Coastguard Worker NewFilter.DenyList.pIDList = msg_ids;
2342*61046927SAndroid Build Coastguard Worker
2343*61046927SAndroid Build Coastguard Worker ID3D12InfoQueue_PushStorageFilter(info_queue, &NewFilter);
2344*61046927SAndroid Build Coastguard Worker ID3D12InfoQueue_Release(info_queue);
2345*61046927SAndroid Build Coastguard Worker }
2346*61046927SAndroid Build Coastguard Worker
2347*61046927SAndroid Build Coastguard Worker IUnknown_QueryInterface(device->dev, &IID_ID3D12DeviceConfiguration, (void **)&device->dev_config);
2348*61046927SAndroid Build Coastguard Worker
2349*61046927SAndroid Build Coastguard Worker result = dzn_meta_init(device);
2350*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2351*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2352*61046927SAndroid Build Coastguard Worker return result;
2353*61046927SAndroid Build Coastguard Worker }
2354*61046927SAndroid Build Coastguard Worker
2355*61046927SAndroid Build Coastguard Worker result = dzn_device_query_init(device);
2356*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2357*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2358*61046927SAndroid Build Coastguard Worker return result;
2359*61046927SAndroid Build Coastguard Worker }
2360*61046927SAndroid Build Coastguard Worker
2361*61046927SAndroid Build Coastguard Worker uint32_t qindex = 0;
2362*61046927SAndroid Build Coastguard Worker for (uint32_t qf = 0; qf < pCreateInfo->queueCreateInfoCount; qf++) {
2363*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *qinfo = &pCreateInfo->pQueueCreateInfos[qf];
2364*61046927SAndroid Build Coastguard Worker
2365*61046927SAndroid Build Coastguard Worker for (uint32_t q = 0; q < qinfo->queueCount; q++) {
2366*61046927SAndroid Build Coastguard Worker result =
2367*61046927SAndroid Build Coastguard Worker dzn_queue_init(&queues[qindex++], device, qinfo, q);
2368*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2369*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2370*61046927SAndroid Build Coastguard Worker return result;
2371*61046927SAndroid Build Coastguard Worker }
2372*61046927SAndroid Build Coastguard Worker if (graphics_queue_count == 1 &&
2373*61046927SAndroid Build Coastguard Worker pdev->queue_families[qinfo->queueFamilyIndex].props.queueFlags & VK_QUEUE_GRAPHICS_BIT)
2374*61046927SAndroid Build Coastguard Worker device->swapchain_queue = &queues[qindex - 1];
2375*61046927SAndroid Build Coastguard Worker }
2376*61046927SAndroid Build Coastguard Worker }
2377*61046927SAndroid Build Coastguard Worker
2378*61046927SAndroid Build Coastguard Worker if (!device->swapchain_queue) {
2379*61046927SAndroid Build Coastguard Worker const float swapchain_queue_priority = 0.0f;
2380*61046927SAndroid Build Coastguard Worker VkDeviceQueueCreateInfo swapchain_queue_info = {
2381*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
2382*61046927SAndroid Build Coastguard Worker .flags = 0,
2383*61046927SAndroid Build Coastguard Worker .queueCount = 1,
2384*61046927SAndroid Build Coastguard Worker .pQueuePriorities = &swapchain_queue_priority,
2385*61046927SAndroid Build Coastguard Worker };
2386*61046927SAndroid Build Coastguard Worker for (uint32_t qf = 0; qf < pdev->queue_family_count; qf++) {
2387*61046927SAndroid Build Coastguard Worker if (pdev->queue_families[qf].props.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
2388*61046927SAndroid Build Coastguard Worker swapchain_queue_info.queueFamilyIndex = qf;
2389*61046927SAndroid Build Coastguard Worker break;
2390*61046927SAndroid Build Coastguard Worker }
2391*61046927SAndroid Build Coastguard Worker }
2392*61046927SAndroid Build Coastguard Worker result = dzn_queue_init(&queues[qindex], device, &swapchain_queue_info, 0);
2393*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2394*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2395*61046927SAndroid Build Coastguard Worker return result;
2396*61046927SAndroid Build Coastguard Worker }
2397*61046927SAndroid Build Coastguard Worker device->swapchain_queue = &queues[qindex++];
2398*61046927SAndroid Build Coastguard Worker device->need_swapchain_blits = true;
2399*61046927SAndroid Build Coastguard Worker }
2400*61046927SAndroid Build Coastguard Worker
2401*61046927SAndroid Build Coastguard Worker device->support_static_samplers = true;
2402*61046927SAndroid Build Coastguard Worker device->bindless = (instance->debug_flags & DZN_DEBUG_BINDLESS) != 0 ||
2403*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.descriptorIndexing ||
2404*61046927SAndroid Build Coastguard Worker device->vk.enabled_extensions.EXT_descriptor_indexing ||
2405*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.bufferDeviceAddress ||
2406*61046927SAndroid Build Coastguard Worker device->vk.enabled_extensions.EXT_buffer_device_address;
2407*61046927SAndroid Build Coastguard Worker
2408*61046927SAndroid Build Coastguard Worker if (device->bindless) {
2409*61046927SAndroid Build Coastguard Worker uint32_t sampler_count = MIN2(pdev->options19.MaxSamplerDescriptorHeapSize, 4000);
2410*61046927SAndroid Build Coastguard Worker device->support_static_samplers = pdev->options19.MaxSamplerDescriptorHeapSizeWithStaticSamplers >= sampler_count;
2411*61046927SAndroid Build Coastguard Worker dzn_foreach_pool_type(type) {
2412*61046927SAndroid Build Coastguard Worker uint32_t descriptor_count = type == D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER ?
2413*61046927SAndroid Build Coastguard Worker sampler_count : D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1;
2414*61046927SAndroid Build Coastguard Worker result = dzn_descriptor_heap_init(&device->device_heaps[type].heap, device, type, descriptor_count, true);
2415*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2416*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2417*61046927SAndroid Build Coastguard Worker return result;
2418*61046927SAndroid Build Coastguard Worker }
2419*61046927SAndroid Build Coastguard Worker
2420*61046927SAndroid Build Coastguard Worker mtx_init(&device->device_heaps[type].lock, mtx_plain);
2421*61046927SAndroid Build Coastguard Worker util_dynarray_init(&device->device_heaps[type].slot_freelist, NULL);
2422*61046927SAndroid Build Coastguard Worker device->device_heaps[type].next_alloc_slot = 0;
2423*61046927SAndroid Build Coastguard Worker }
2424*61046927SAndroid Build Coastguard Worker }
2425*61046927SAndroid Build Coastguard Worker
2426*61046927SAndroid Build Coastguard Worker assert(queue_count == qindex);
2427*61046927SAndroid Build Coastguard Worker *out = dzn_device_to_handle(device);
2428*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2429*61046927SAndroid Build Coastguard Worker }
2430*61046927SAndroid Build Coastguard Worker
2431*61046927SAndroid Build Coastguard Worker static ID3DBlob *
serialize_root_sig(struct dzn_device * device,const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * desc)2432*61046927SAndroid Build Coastguard Worker serialize_root_sig(struct dzn_device *device,
2433*61046927SAndroid Build Coastguard Worker const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc)
2434*61046927SAndroid Build Coastguard Worker {
2435*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
2436*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
2437*61046927SAndroid Build Coastguard Worker ID3DBlob *sig = NULL, *error = NULL;
2438*61046927SAndroid Build Coastguard Worker
2439*61046927SAndroid Build Coastguard Worker HRESULT hr = device->dev_config ?
2440*61046927SAndroid Build Coastguard Worker ID3D12DeviceConfiguration_SerializeVersionedRootSignature(device->dev_config, desc, &sig, &error) :
2441*61046927SAndroid Build Coastguard Worker instance->d3d12.serialize_root_sig(desc, &sig, &error);
2442*61046927SAndroid Build Coastguard Worker
2443*61046927SAndroid Build Coastguard Worker if (FAILED(hr)) {
2444*61046927SAndroid Build Coastguard Worker if (instance->debug_flags & DZN_DEBUG_SIG) {
2445*61046927SAndroid Build Coastguard Worker const char *error_msg = (const char *)ID3D10Blob_GetBufferPointer(error);
2446*61046927SAndroid Build Coastguard Worker fprintf(stderr,
2447*61046927SAndroid Build Coastguard Worker "== SERIALIZE ROOT SIG ERROR =============================================\n"
2448*61046927SAndroid Build Coastguard Worker "%s\n"
2449*61046927SAndroid Build Coastguard Worker "== END ==========================================================\n",
2450*61046927SAndroid Build Coastguard Worker error_msg);
2451*61046927SAndroid Build Coastguard Worker }
2452*61046927SAndroid Build Coastguard Worker }
2453*61046927SAndroid Build Coastguard Worker
2454*61046927SAndroid Build Coastguard Worker if (error)
2455*61046927SAndroid Build Coastguard Worker ID3D10Blob_Release(error);
2456*61046927SAndroid Build Coastguard Worker
2457*61046927SAndroid Build Coastguard Worker return sig;
2458*61046927SAndroid Build Coastguard Worker }
2459*61046927SAndroid Build Coastguard Worker
2460*61046927SAndroid Build Coastguard Worker ID3D12RootSignature *
dzn_device_create_root_sig(struct dzn_device * device,const D3D12_VERSIONED_ROOT_SIGNATURE_DESC * desc)2461*61046927SAndroid Build Coastguard Worker dzn_device_create_root_sig(struct dzn_device *device,
2462*61046927SAndroid Build Coastguard Worker const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc)
2463*61046927SAndroid Build Coastguard Worker {
2464*61046927SAndroid Build Coastguard Worker ID3DBlob *sig = serialize_root_sig(device, desc);
2465*61046927SAndroid Build Coastguard Worker if (!sig)
2466*61046927SAndroid Build Coastguard Worker return NULL;
2467*61046927SAndroid Build Coastguard Worker
2468*61046927SAndroid Build Coastguard Worker ID3D12RootSignature *root_sig = NULL;
2469*61046927SAndroid Build Coastguard Worker ID3D12Device1_CreateRootSignature(device->dev, 0,
2470*61046927SAndroid Build Coastguard Worker ID3D10Blob_GetBufferPointer(sig),
2471*61046927SAndroid Build Coastguard Worker ID3D10Blob_GetBufferSize(sig),
2472*61046927SAndroid Build Coastguard Worker &IID_ID3D12RootSignature,
2473*61046927SAndroid Build Coastguard Worker (void **)&root_sig);
2474*61046927SAndroid Build Coastguard Worker ID3D10Blob_Release(sig);
2475*61046927SAndroid Build Coastguard Worker return root_sig;
2476*61046927SAndroid Build Coastguard Worker }
2477*61046927SAndroid Build Coastguard Worker
2478*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)2479*61046927SAndroid Build Coastguard Worker dzn_CreateDevice(VkPhysicalDevice physicalDevice,
2480*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *pCreateInfo,
2481*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2482*61046927SAndroid Build Coastguard Worker VkDevice *pDevice)
2483*61046927SAndroid Build Coastguard Worker {
2484*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_physical_device, physical_device, physicalDevice);
2485*61046927SAndroid Build Coastguard Worker VkResult result;
2486*61046927SAndroid Build Coastguard Worker
2487*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
2488*61046927SAndroid Build Coastguard Worker
2489*61046927SAndroid Build Coastguard Worker /* Check enabled features */
2490*61046927SAndroid Build Coastguard Worker if (pCreateInfo->pEnabledFeatures) {
2491*61046927SAndroid Build Coastguard Worker result = vk_physical_device_check_device_features(&physical_device->vk, pCreateInfo);
2492*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2493*61046927SAndroid Build Coastguard Worker return vk_error(physical_device, result);
2494*61046927SAndroid Build Coastguard Worker }
2495*61046927SAndroid Build Coastguard Worker
2496*61046927SAndroid Build Coastguard Worker /* Check requested queues and fail if we are requested to create any
2497*61046927SAndroid Build Coastguard Worker * queues with flags we don't support.
2498*61046927SAndroid Build Coastguard Worker */
2499*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->queueCreateInfoCount > 0);
2500*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
2501*61046927SAndroid Build Coastguard Worker if (pCreateInfo->pQueueCreateInfos[i].flags != 0)
2502*61046927SAndroid Build Coastguard Worker return vk_error(physical_device, VK_ERROR_INITIALIZATION_FAILED);
2503*61046927SAndroid Build Coastguard Worker }
2504*61046927SAndroid Build Coastguard Worker
2505*61046927SAndroid Build Coastguard Worker return dzn_device_create(physical_device, pCreateInfo, pAllocator, pDevice);
2506*61046927SAndroid Build Coastguard Worker }
2507*61046927SAndroid Build Coastguard Worker
2508*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyDevice(VkDevice dev,const VkAllocationCallbacks * pAllocator)2509*61046927SAndroid Build Coastguard Worker dzn_DestroyDevice(VkDevice dev,
2510*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2511*61046927SAndroid Build Coastguard Worker {
2512*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, dev);
2513*61046927SAndroid Build Coastguard Worker
2514*61046927SAndroid Build Coastguard Worker device->vk.dispatch_table.DeviceWaitIdle(dev);
2515*61046927SAndroid Build Coastguard Worker
2516*61046927SAndroid Build Coastguard Worker dzn_device_destroy(device, pAllocator);
2517*61046927SAndroid Build Coastguard Worker }
2518*61046927SAndroid Build Coastguard Worker
2519*61046927SAndroid Build Coastguard Worker static void
dzn_device_memory_destroy(struct dzn_device_memory * mem,const VkAllocationCallbacks * pAllocator)2520*61046927SAndroid Build Coastguard Worker dzn_device_memory_destroy(struct dzn_device_memory *mem,
2521*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2522*61046927SAndroid Build Coastguard Worker {
2523*61046927SAndroid Build Coastguard Worker if (!mem)
2524*61046927SAndroid Build Coastguard Worker return;
2525*61046927SAndroid Build Coastguard Worker
2526*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(mem->base.device, struct dzn_device, vk);
2527*61046927SAndroid Build Coastguard Worker
2528*61046927SAndroid Build Coastguard Worker if (mem->map && mem->map_res)
2529*61046927SAndroid Build Coastguard Worker ID3D12Resource_Unmap(mem->map_res, 0, NULL);
2530*61046927SAndroid Build Coastguard Worker
2531*61046927SAndroid Build Coastguard Worker if (mem->map_res)
2532*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(mem->map_res);
2533*61046927SAndroid Build Coastguard Worker
2534*61046927SAndroid Build Coastguard Worker if (mem->heap)
2535*61046927SAndroid Build Coastguard Worker ID3D12Heap_Release(mem->heap);
2536*61046927SAndroid Build Coastguard Worker
2537*61046927SAndroid Build Coastguard Worker if (mem->dedicated_res)
2538*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(mem->dedicated_res);
2539*61046927SAndroid Build Coastguard Worker
2540*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2541*61046927SAndroid Build Coastguard Worker if (mem->export_handle)
2542*61046927SAndroid Build Coastguard Worker CloseHandle(mem->export_handle);
2543*61046927SAndroid Build Coastguard Worker #else
2544*61046927SAndroid Build Coastguard Worker if ((intptr_t)mem->export_handle >= 0)
2545*61046927SAndroid Build Coastguard Worker close((int)(intptr_t)mem->export_handle);
2546*61046927SAndroid Build Coastguard Worker #endif
2547*61046927SAndroid Build Coastguard Worker
2548*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&mem->base);
2549*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, mem);
2550*61046927SAndroid Build Coastguard Worker }
2551*61046927SAndroid Build Coastguard Worker
2552*61046927SAndroid Build Coastguard Worker static D3D12_HEAP_PROPERTIES
deduce_heap_properties_from_memory(struct dzn_physical_device * pdevice,const VkMemoryType * mem_type)2553*61046927SAndroid Build Coastguard Worker deduce_heap_properties_from_memory(struct dzn_physical_device *pdevice,
2554*61046927SAndroid Build Coastguard Worker const VkMemoryType *mem_type)
2555*61046927SAndroid Build Coastguard Worker {
2556*61046927SAndroid Build Coastguard Worker D3D12_HEAP_PROPERTIES properties = { .Type = D3D12_HEAP_TYPE_CUSTOM };
2557*61046927SAndroid Build Coastguard Worker properties.MemoryPoolPreference =
2558*61046927SAndroid Build Coastguard Worker ((mem_type->propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) &&
2559*61046927SAndroid Build Coastguard Worker !pdevice->architecture.UMA) ?
2560*61046927SAndroid Build Coastguard Worker D3D12_MEMORY_POOL_L1 : D3D12_MEMORY_POOL_L0;
2561*61046927SAndroid Build Coastguard Worker if ((mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) ||
2562*61046927SAndroid Build Coastguard Worker ((mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) && pdevice->architecture.CacheCoherentUMA)) {
2563*61046927SAndroid Build Coastguard Worker properties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK;
2564*61046927SAndroid Build Coastguard Worker } else if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
2565*61046927SAndroid Build Coastguard Worker properties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE;
2566*61046927SAndroid Build Coastguard Worker } else {
2567*61046927SAndroid Build Coastguard Worker properties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE;
2568*61046927SAndroid Build Coastguard Worker }
2569*61046927SAndroid Build Coastguard Worker return properties;
2570*61046927SAndroid Build Coastguard Worker }
2571*61046927SAndroid Build Coastguard Worker
2572*61046927SAndroid Build Coastguard Worker static VkResult
dzn_device_memory_create(struct dzn_device * device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * out)2573*61046927SAndroid Build Coastguard Worker dzn_device_memory_create(struct dzn_device *device,
2574*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateInfo *pAllocateInfo,
2575*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2576*61046927SAndroid Build Coastguard Worker VkDeviceMemory *out)
2577*61046927SAndroid Build Coastguard Worker {
2578*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdevice =
2579*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
2580*61046927SAndroid Build Coastguard Worker
2581*61046927SAndroid Build Coastguard Worker const struct dzn_buffer *buffer = NULL;
2582*61046927SAndroid Build Coastguard Worker const struct dzn_image *image = NULL;
2583*61046927SAndroid Build Coastguard Worker
2584*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlags export_flags = 0;
2585*61046927SAndroid Build Coastguard Worker HANDLE import_handle = NULL;
2586*61046927SAndroid Build Coastguard Worker bool imported_from_d3d11 = false;
2587*61046927SAndroid Build Coastguard Worker void *host_pointer = NULL;
2588*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2589*61046927SAndroid Build Coastguard Worker const wchar_t *import_name = NULL;
2590*61046927SAndroid Build Coastguard Worker const VkExportMemoryWin32HandleInfoKHR *win32_export = NULL;
2591*61046927SAndroid Build Coastguard Worker #endif
2592*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pAllocateInfo->pNext) {
2593*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
2594*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
2595*61046927SAndroid Build Coastguard Worker const VkExportMemoryAllocateInfo *exp =
2596*61046927SAndroid Build Coastguard Worker (const VkExportMemoryAllocateInfo *)ext;
2597*61046927SAndroid Build Coastguard Worker
2598*61046927SAndroid Build Coastguard Worker export_flags = exp->handleTypes;
2599*61046927SAndroid Build Coastguard Worker break;
2600*61046927SAndroid Build Coastguard Worker }
2601*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2602*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
2603*61046927SAndroid Build Coastguard Worker const VkImportMemoryWin32HandleInfoKHR *imp =
2604*61046927SAndroid Build Coastguard Worker (const VkImportMemoryWin32HandleInfoKHR *)ext;
2605*61046927SAndroid Build Coastguard Worker switch (imp->handleType) {
2606*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
2607*61046927SAndroid Build Coastguard Worker imported_from_d3d11 = true;
2608*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2609*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
2610*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
2611*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
2612*61046927SAndroid Build Coastguard Worker break;
2613*61046927SAndroid Build Coastguard Worker default:
2614*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
2615*61046927SAndroid Build Coastguard Worker }
2616*61046927SAndroid Build Coastguard Worker import_handle = imp->handle;
2617*61046927SAndroid Build Coastguard Worker import_name = imp->name;
2618*61046927SAndroid Build Coastguard Worker break;
2619*61046927SAndroid Build Coastguard Worker }
2620*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
2621*61046927SAndroid Build Coastguard Worker win32_export = (const VkExportMemoryWin32HandleInfoKHR *)ext;
2622*61046927SAndroid Build Coastguard Worker break;
2623*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
2624*61046927SAndroid Build Coastguard Worker const VkImportMemoryHostPointerInfoEXT *imp =
2625*61046927SAndroid Build Coastguard Worker (const VkImportMemoryHostPointerInfoEXT *)ext;
2626*61046927SAndroid Build Coastguard Worker host_pointer = imp->pHostPointer;
2627*61046927SAndroid Build Coastguard Worker break;
2628*61046927SAndroid Build Coastguard Worker }
2629*61046927SAndroid Build Coastguard Worker #else
2630*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
2631*61046927SAndroid Build Coastguard Worker const VkImportMemoryFdInfoKHR *imp =
2632*61046927SAndroid Build Coastguard Worker (const VkImportMemoryFdInfoKHR *)ext;
2633*61046927SAndroid Build Coastguard Worker switch (imp->handleType) {
2634*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
2635*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
2636*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
2637*61046927SAndroid Build Coastguard Worker break;
2638*61046927SAndroid Build Coastguard Worker default:
2639*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
2640*61046927SAndroid Build Coastguard Worker }
2641*61046927SAndroid Build Coastguard Worker import_handle = (HANDLE)(intptr_t)imp->fd;
2642*61046927SAndroid Build Coastguard Worker break;
2643*61046927SAndroid Build Coastguard Worker }
2644*61046927SAndroid Build Coastguard Worker #endif
2645*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
2646*61046927SAndroid Build Coastguard Worker const VkMemoryDedicatedAllocateInfo *dedicated =
2647*61046927SAndroid Build Coastguard Worker (const VkMemoryDedicatedAllocateInfo *)ext;
2648*61046927SAndroid Build Coastguard Worker
2649*61046927SAndroid Build Coastguard Worker buffer = dzn_buffer_from_handle(dedicated->buffer);
2650*61046927SAndroid Build Coastguard Worker image = dzn_image_from_handle(dedicated->image);
2651*61046927SAndroid Build Coastguard Worker assert(!buffer || !image);
2652*61046927SAndroid Build Coastguard Worker break;
2653*61046927SAndroid Build Coastguard Worker }
2654*61046927SAndroid Build Coastguard Worker default:
2655*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
2656*61046927SAndroid Build Coastguard Worker break;
2657*61046927SAndroid Build Coastguard Worker }
2658*61046927SAndroid Build Coastguard Worker }
2659*61046927SAndroid Build Coastguard Worker
2660*61046927SAndroid Build Coastguard Worker const VkMemoryType *mem_type =
2661*61046927SAndroid Build Coastguard Worker &pdevice->memory.memoryTypes[pAllocateInfo->memoryTypeIndex];
2662*61046927SAndroid Build Coastguard Worker
2663*61046927SAndroid Build Coastguard Worker D3D12_HEAP_DESC heap_desc = { 0 };
2664*61046927SAndroid Build Coastguard Worker
2665*61046927SAndroid Build Coastguard Worker heap_desc.SizeInBytes = pAllocateInfo->allocationSize;
2666*61046927SAndroid Build Coastguard Worker if (buffer) {
2667*61046927SAndroid Build Coastguard Worker heap_desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
2668*61046927SAndroid Build Coastguard Worker } else if (image) {
2669*61046927SAndroid Build Coastguard Worker heap_desc.Alignment =
2670*61046927SAndroid Build Coastguard Worker image->vk.samples > 1 ?
2671*61046927SAndroid Build Coastguard Worker D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT :
2672*61046927SAndroid Build Coastguard Worker D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
2673*61046927SAndroid Build Coastguard Worker } else {
2674*61046927SAndroid Build Coastguard Worker heap_desc.Alignment =
2675*61046927SAndroid Build Coastguard Worker heap_desc.SizeInBytes >= D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT ?
2676*61046927SAndroid Build Coastguard Worker D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT :
2677*61046927SAndroid Build Coastguard Worker D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
2678*61046927SAndroid Build Coastguard Worker }
2679*61046927SAndroid Build Coastguard Worker
2680*61046927SAndroid Build Coastguard Worker if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
2681*61046927SAndroid Build Coastguard Worker image = NULL;
2682*61046927SAndroid Build Coastguard Worker
2683*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlags valid_flags =
2684*61046927SAndroid Build Coastguard Worker opaque_external_flag |
2685*61046927SAndroid Build Coastguard Worker (buffer || image ?
2686*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT :
2687*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT);
2688*61046927SAndroid Build Coastguard Worker if (image && imported_from_d3d11)
2689*61046927SAndroid Build Coastguard Worker valid_flags |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT;
2690*61046927SAndroid Build Coastguard Worker
2691*61046927SAndroid Build Coastguard Worker if (export_flags & ~valid_flags)
2692*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
2693*61046927SAndroid Build Coastguard Worker
2694*61046927SAndroid Build Coastguard Worker struct dzn_device_memory *mem =
2695*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*mem), 8,
2696*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
2697*61046927SAndroid Build Coastguard Worker if (!mem)
2698*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2699*61046927SAndroid Build Coastguard Worker
2700*61046927SAndroid Build Coastguard Worker vk_object_base_init(&device->vk, &mem->base, VK_OBJECT_TYPE_DEVICE_MEMORY);
2701*61046927SAndroid Build Coastguard Worker #ifndef _WIN32
2702*61046927SAndroid Build Coastguard Worker mem->export_handle = (HANDLE)(intptr_t)-1;
2703*61046927SAndroid Build Coastguard Worker #endif
2704*61046927SAndroid Build Coastguard Worker
2705*61046927SAndroid Build Coastguard Worker /* The Vulkan 1.0.33 spec says "allocationSize must be greater than 0". */
2706*61046927SAndroid Build Coastguard Worker assert(pAllocateInfo->allocationSize > 0);
2707*61046927SAndroid Build Coastguard Worker
2708*61046927SAndroid Build Coastguard Worker mem->size = pAllocateInfo->allocationSize;
2709*61046927SAndroid Build Coastguard Worker
2710*61046927SAndroid Build Coastguard Worker heap_desc.SizeInBytes = ALIGN_POT(heap_desc.SizeInBytes, heap_desc.Alignment);
2711*61046927SAndroid Build Coastguard Worker if (!image && !buffer)
2712*61046927SAndroid Build Coastguard Worker heap_desc.Flags =
2713*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_heap_flags_for_mem_type(pdevice, pAllocateInfo->memoryTypeIndex);
2714*61046927SAndroid Build Coastguard Worker heap_desc.Properties = deduce_heap_properties_from_memory(pdevice, mem_type);
2715*61046927SAndroid Build Coastguard Worker if (export_flags) {
2716*61046927SAndroid Build Coastguard Worker heap_desc.Flags |= D3D12_HEAP_FLAG_SHARED;
2717*61046927SAndroid Build Coastguard Worker assert(host_pointer || heap_desc.Properties.CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE);
2718*61046927SAndroid Build Coastguard Worker }
2719*61046927SAndroid Build Coastguard Worker
2720*61046927SAndroid Build Coastguard Worker VkResult error = VK_ERROR_OUT_OF_DEVICE_MEMORY;
2721*61046927SAndroid Build Coastguard Worker
2722*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2723*61046927SAndroid Build Coastguard Worker HANDLE handle_from_name = NULL;
2724*61046927SAndroid Build Coastguard Worker if (import_name) {
2725*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_OpenSharedHandleByName(device->dev, import_name, GENERIC_ALL, &handle_from_name))) {
2726*61046927SAndroid Build Coastguard Worker error = VK_ERROR_INVALID_EXTERNAL_HANDLE;
2727*61046927SAndroid Build Coastguard Worker goto cleanup;
2728*61046927SAndroid Build Coastguard Worker }
2729*61046927SAndroid Build Coastguard Worker import_handle = handle_from_name;
2730*61046927SAndroid Build Coastguard Worker }
2731*61046927SAndroid Build Coastguard Worker #endif
2732*61046927SAndroid Build Coastguard Worker
2733*61046927SAndroid Build Coastguard Worker if (host_pointer) {
2734*61046927SAndroid Build Coastguard Worker error = VK_ERROR_INVALID_EXTERNAL_HANDLE;
2735*61046927SAndroid Build Coastguard Worker
2736*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
2737*61046927SAndroid Build Coastguard Worker if (!device->dev13)
2738*61046927SAndroid Build Coastguard Worker goto cleanup;
2739*61046927SAndroid Build Coastguard Worker
2740*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device13_OpenExistingHeapFromAddress1(device->dev13, host_pointer, heap_desc.SizeInBytes, &IID_ID3D12Heap, (void**)&mem->heap)))
2741*61046927SAndroid Build Coastguard Worker goto cleanup;
2742*61046927SAndroid Build Coastguard Worker
2743*61046927SAndroid Build Coastguard Worker D3D12_HEAP_DESC desc = dzn_ID3D12Heap_GetDesc(mem->heap);
2744*61046927SAndroid Build Coastguard Worker if (desc.Properties.Type != D3D12_HEAP_TYPE_CUSTOM)
2745*61046927SAndroid Build Coastguard Worker desc.Properties = dzn_ID3D12Device4_GetCustomHeapProperties(device->dev, 0, desc.Properties.Type);
2746*61046927SAndroid Build Coastguard Worker
2747*61046927SAndroid Build Coastguard Worker if ((heap_desc.Flags & ~desc.Flags) ||
2748*61046927SAndroid Build Coastguard Worker desc.Properties.CPUPageProperty != heap_desc.Properties.CPUPageProperty ||
2749*61046927SAndroid Build Coastguard Worker desc.Properties.MemoryPoolPreference != heap_desc.Properties.MemoryPoolPreference)
2750*61046927SAndroid Build Coastguard Worker goto cleanup;
2751*61046927SAndroid Build Coastguard Worker
2752*61046927SAndroid Build Coastguard Worker mem->map = host_pointer;
2753*61046927SAndroid Build Coastguard Worker mem->res_flags = D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER;
2754*61046927SAndroid Build Coastguard Worker #else
2755*61046927SAndroid Build Coastguard Worker goto cleanup;
2756*61046927SAndroid Build Coastguard Worker #endif
2757*61046927SAndroid Build Coastguard Worker } else if (import_handle) {
2758*61046927SAndroid Build Coastguard Worker error = VK_ERROR_INVALID_EXTERNAL_HANDLE;
2759*61046927SAndroid Build Coastguard Worker if (image || buffer) {
2760*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_OpenSharedHandle(device->dev, import_handle, &IID_ID3D12Resource, (void **)&mem->dedicated_res)))
2761*61046927SAndroid Build Coastguard Worker goto cleanup;
2762*61046927SAndroid Build Coastguard Worker
2763*61046927SAndroid Build Coastguard Worker /* Verify compatibility */
2764*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC desc = dzn_ID3D12Resource_GetDesc(mem->dedicated_res);
2765*61046927SAndroid Build Coastguard Worker D3D12_HEAP_PROPERTIES opened_props = { 0 };
2766*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAGS opened_flags = 0;
2767*61046927SAndroid Build Coastguard Worker ID3D12Resource_GetHeapProperties(mem->dedicated_res, &opened_props, &opened_flags);
2768*61046927SAndroid Build Coastguard Worker if (opened_props.Type != D3D12_HEAP_TYPE_CUSTOM)
2769*61046927SAndroid Build Coastguard Worker opened_props = dzn_ID3D12Device4_GetCustomHeapProperties(device->dev, 0, opened_props.Type);
2770*61046927SAndroid Build Coastguard Worker
2771*61046927SAndroid Build Coastguard Worker /* Don't validate format, cast lists aren't reflectable so it could be valid */
2772*61046927SAndroid Build Coastguard Worker if (image) {
2773*61046927SAndroid Build Coastguard Worker if (desc.Dimension != image->desc.Dimension ||
2774*61046927SAndroid Build Coastguard Worker desc.MipLevels != image->desc.MipLevels ||
2775*61046927SAndroid Build Coastguard Worker desc.Width != image->desc.Width ||
2776*61046927SAndroid Build Coastguard Worker desc.Height != image->desc.Height ||
2777*61046927SAndroid Build Coastguard Worker desc.DepthOrArraySize != image->desc.DepthOrArraySize ||
2778*61046927SAndroid Build Coastguard Worker (image->desc.Flags & ~desc.Flags) ||
2779*61046927SAndroid Build Coastguard Worker desc.SampleDesc.Count != image->desc.SampleDesc.Count)
2780*61046927SAndroid Build Coastguard Worker goto cleanup;
2781*61046927SAndroid Build Coastguard Worker } else if (desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
2782*61046927SAndroid Build Coastguard Worker desc.Width != buffer->desc.Width ||
2783*61046927SAndroid Build Coastguard Worker buffer->desc.Flags & ~(desc.Flags))
2784*61046927SAndroid Build Coastguard Worker goto cleanup;
2785*61046927SAndroid Build Coastguard Worker if (opened_props.CPUPageProperty != heap_desc.Properties.CPUPageProperty ||
2786*61046927SAndroid Build Coastguard Worker opened_props.MemoryPoolPreference != heap_desc.Properties.MemoryPoolPreference)
2787*61046927SAndroid Build Coastguard Worker goto cleanup;
2788*61046927SAndroid Build Coastguard Worker if ((heap_desc.Flags & D3D12_HEAP_FLAG_DENY_BUFFERS) && desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
2789*61046927SAndroid Build Coastguard Worker goto cleanup;
2790*61046927SAndroid Build Coastguard Worker if ((heap_desc.Flags & D3D12_HEAP_FLAG_DENY_RT_DS_TEXTURES) && (desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET))
2791*61046927SAndroid Build Coastguard Worker goto cleanup;
2792*61046927SAndroid Build Coastguard Worker else if ((heap_desc.Flags & D3D12_HEAP_FLAG_DENY_NON_RT_DS_TEXTURES) && !(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET))
2793*61046927SAndroid Build Coastguard Worker goto cleanup;
2794*61046927SAndroid Build Coastguard Worker } else {
2795*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_OpenSharedHandle(device->dev, import_handle, &IID_ID3D12Heap, (void **)&mem->heap)))
2796*61046927SAndroid Build Coastguard Worker goto cleanup;
2797*61046927SAndroid Build Coastguard Worker
2798*61046927SAndroid Build Coastguard Worker D3D12_HEAP_DESC desc = dzn_ID3D12Heap_GetDesc(mem->heap);
2799*61046927SAndroid Build Coastguard Worker if (desc.Properties.Type != D3D12_HEAP_TYPE_CUSTOM)
2800*61046927SAndroid Build Coastguard Worker desc.Properties = dzn_ID3D12Device4_GetCustomHeapProperties(device->dev, 0, desc.Properties.Type);
2801*61046927SAndroid Build Coastguard Worker
2802*61046927SAndroid Build Coastguard Worker if (desc.Alignment < heap_desc.Alignment ||
2803*61046927SAndroid Build Coastguard Worker desc.SizeInBytes < heap_desc.SizeInBytes ||
2804*61046927SAndroid Build Coastguard Worker (heap_desc.Flags & ~desc.Flags) ||
2805*61046927SAndroid Build Coastguard Worker desc.Properties.CPUPageProperty != heap_desc.Properties.CPUPageProperty ||
2806*61046927SAndroid Build Coastguard Worker desc.Properties.MemoryPoolPreference != heap_desc.Properties.MemoryPoolPreference)
2807*61046927SAndroid Build Coastguard Worker goto cleanup;
2808*61046927SAndroid Build Coastguard Worker }
2809*61046927SAndroid Build Coastguard Worker } else if (image) {
2810*61046927SAndroid Build Coastguard Worker if (device->dev10 && image->castable_format_count > 0) {
2811*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC1 desc = {
2812*61046927SAndroid Build Coastguard Worker .Dimension = image->desc.Dimension,
2813*61046927SAndroid Build Coastguard Worker .Alignment = image->desc.Alignment,
2814*61046927SAndroid Build Coastguard Worker .Width = image->desc.Width,
2815*61046927SAndroid Build Coastguard Worker .Height = image->desc.Height,
2816*61046927SAndroid Build Coastguard Worker .DepthOrArraySize = image->desc.DepthOrArraySize,
2817*61046927SAndroid Build Coastguard Worker .MipLevels = image->desc.MipLevels,
2818*61046927SAndroid Build Coastguard Worker .Format = image->desc.Format,
2819*61046927SAndroid Build Coastguard Worker .SampleDesc = image->desc.SampleDesc,
2820*61046927SAndroid Build Coastguard Worker .Layout = image->desc.Layout,
2821*61046927SAndroid Build Coastguard Worker .Flags = image->desc.Flags,
2822*61046927SAndroid Build Coastguard Worker };
2823*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device10_CreateCommittedResource3(device->dev10, &heap_desc.Properties,
2824*61046927SAndroid Build Coastguard Worker heap_desc.Flags, &desc,
2825*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT_COMMON,
2826*61046927SAndroid Build Coastguard Worker NULL, NULL,
2827*61046927SAndroid Build Coastguard Worker image->castable_format_count,
2828*61046927SAndroid Build Coastguard Worker image->castable_formats,
2829*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
2830*61046927SAndroid Build Coastguard Worker (void **)&mem->dedicated_res)))
2831*61046927SAndroid Build Coastguard Worker goto cleanup;
2832*61046927SAndroid Build Coastguard Worker } else if (FAILED(ID3D12Device1_CreateCommittedResource(device->dev, &heap_desc.Properties,
2833*61046927SAndroid Build Coastguard Worker heap_desc.Flags, &image->desc,
2834*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
2835*61046927SAndroid Build Coastguard Worker NULL,
2836*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
2837*61046927SAndroid Build Coastguard Worker (void **)&mem->dedicated_res)))
2838*61046927SAndroid Build Coastguard Worker goto cleanup;
2839*61046927SAndroid Build Coastguard Worker } else if (buffer) {
2840*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateCommittedResource(device->dev, &heap_desc.Properties,
2841*61046927SAndroid Build Coastguard Worker heap_desc.Flags, &buffer->desc,
2842*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
2843*61046927SAndroid Build Coastguard Worker NULL,
2844*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
2845*61046927SAndroid Build Coastguard Worker (void **)&mem->dedicated_res)))
2846*61046927SAndroid Build Coastguard Worker goto cleanup;
2847*61046927SAndroid Build Coastguard Worker } else {
2848*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateHeap(device->dev, &heap_desc,
2849*61046927SAndroid Build Coastguard Worker &IID_ID3D12Heap,
2850*61046927SAndroid Build Coastguard Worker (void **)&mem->heap)))
2851*61046927SAndroid Build Coastguard Worker goto cleanup;
2852*61046927SAndroid Build Coastguard Worker }
2853*61046927SAndroid Build Coastguard Worker
2854*61046927SAndroid Build Coastguard Worker if ((mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) &&
2855*61046927SAndroid Build Coastguard Worker !(heap_desc.Flags & D3D12_HEAP_FLAG_DENY_BUFFERS) &&
2856*61046927SAndroid Build Coastguard Worker !mem->map){
2857*61046927SAndroid Build Coastguard Worker assert(!image);
2858*61046927SAndroid Build Coastguard Worker if (buffer) {
2859*61046927SAndroid Build Coastguard Worker mem->map_res = mem->dedicated_res;
2860*61046927SAndroid Build Coastguard Worker ID3D12Resource_AddRef(mem->map_res);
2861*61046927SAndroid Build Coastguard Worker } else {
2862*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC res_desc = { 0 };
2863*61046927SAndroid Build Coastguard Worker res_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
2864*61046927SAndroid Build Coastguard Worker res_desc.Format = DXGI_FORMAT_UNKNOWN;
2865*61046927SAndroid Build Coastguard Worker res_desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
2866*61046927SAndroid Build Coastguard Worker res_desc.Width = heap_desc.SizeInBytes;
2867*61046927SAndroid Build Coastguard Worker res_desc.Height = 1;
2868*61046927SAndroid Build Coastguard Worker res_desc.DepthOrArraySize = 1;
2869*61046927SAndroid Build Coastguard Worker res_desc.MipLevels = 1;
2870*61046927SAndroid Build Coastguard Worker res_desc.SampleDesc.Count = 1;
2871*61046927SAndroid Build Coastguard Worker res_desc.SampleDesc.Quality = 0;
2872*61046927SAndroid Build Coastguard Worker res_desc.Flags = D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
2873*61046927SAndroid Build Coastguard Worker res_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
2874*61046927SAndroid Build Coastguard Worker HRESULT hr = ID3D12Device1_CreatePlacedResource(device->dev, mem->heap, 0, &res_desc,
2875*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
2876*61046927SAndroid Build Coastguard Worker NULL,
2877*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
2878*61046927SAndroid Build Coastguard Worker (void **)&mem->map_res);
2879*61046927SAndroid Build Coastguard Worker if (FAILED(hr))
2880*61046927SAndroid Build Coastguard Worker goto cleanup;
2881*61046927SAndroid Build Coastguard Worker }
2882*61046927SAndroid Build Coastguard Worker }
2883*61046927SAndroid Build Coastguard Worker
2884*61046927SAndroid Build Coastguard Worker if (export_flags) {
2885*61046927SAndroid Build Coastguard Worker error = VK_ERROR_INVALID_EXTERNAL_HANDLE;
2886*61046927SAndroid Build Coastguard Worker ID3D12DeviceChild *shareable = mem->heap ? (void *)mem->heap : (void *)mem->dedicated_res;
2887*61046927SAndroid Build Coastguard Worker DWORD dwAccess = GENERIC_ALL; /* Ignore any provided access, this is the only one D3D allows */
2888*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2889*61046927SAndroid Build Coastguard Worker const SECURITY_ATTRIBUTES *pAttributes = win32_export ? win32_export->pAttributes : NULL;
2890*61046927SAndroid Build Coastguard Worker const wchar_t *name = win32_export ? win32_export->name : NULL;
2891*61046927SAndroid Build Coastguard Worker #else
2892*61046927SAndroid Build Coastguard Worker const SECURITY_ATTRIBUTES *pAttributes = NULL;
2893*61046927SAndroid Build Coastguard Worker const wchar_t *name = NULL;
2894*61046927SAndroid Build Coastguard Worker #endif
2895*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_CreateSharedHandle(device->dev, shareable, pAttributes,
2896*61046927SAndroid Build Coastguard Worker dwAccess, name, &mem->export_handle)))
2897*61046927SAndroid Build Coastguard Worker goto cleanup;
2898*61046927SAndroid Build Coastguard Worker }
2899*61046927SAndroid Build Coastguard Worker
2900*61046927SAndroid Build Coastguard Worker *out = dzn_device_memory_to_handle(mem);
2901*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2902*61046927SAndroid Build Coastguard Worker
2903*61046927SAndroid Build Coastguard Worker cleanup:
2904*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
2905*61046927SAndroid Build Coastguard Worker if (handle_from_name)
2906*61046927SAndroid Build Coastguard Worker CloseHandle(handle_from_name);
2907*61046927SAndroid Build Coastguard Worker #endif
2908*61046927SAndroid Build Coastguard Worker dzn_device_memory_destroy(mem, pAllocator);
2909*61046927SAndroid Build Coastguard Worker return vk_error(device, error);
2910*61046927SAndroid Build Coastguard Worker }
2911*61046927SAndroid Build Coastguard Worker
2912*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_AllocateMemory(VkDevice device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMem)2913*61046927SAndroid Build Coastguard Worker dzn_AllocateMemory(VkDevice device,
2914*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateInfo *pAllocateInfo,
2915*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2916*61046927SAndroid Build Coastguard Worker VkDeviceMemory *pMem)
2917*61046927SAndroid Build Coastguard Worker {
2918*61046927SAndroid Build Coastguard Worker return dzn_device_memory_create(dzn_device_from_handle(device),
2919*61046927SAndroid Build Coastguard Worker pAllocateInfo, pAllocator, pMem);
2920*61046927SAndroid Build Coastguard Worker }
2921*61046927SAndroid Build Coastguard Worker
2922*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_FreeMemory(VkDevice device,VkDeviceMemory mem,const VkAllocationCallbacks * pAllocator)2923*61046927SAndroid Build Coastguard Worker dzn_FreeMemory(VkDevice device,
2924*61046927SAndroid Build Coastguard Worker VkDeviceMemory mem,
2925*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2926*61046927SAndroid Build Coastguard Worker {
2927*61046927SAndroid Build Coastguard Worker dzn_device_memory_destroy(dzn_device_memory_from_handle(mem), pAllocator);
2928*61046927SAndroid Build Coastguard Worker }
2929*61046927SAndroid Build Coastguard Worker
2930*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_MapMemory(VkDevice _device,VkDeviceMemory _memory,VkDeviceSize offset,VkDeviceSize size,VkMemoryMapFlags flags,void ** ppData)2931*61046927SAndroid Build Coastguard Worker dzn_MapMemory(VkDevice _device,
2932*61046927SAndroid Build Coastguard Worker VkDeviceMemory _memory,
2933*61046927SAndroid Build Coastguard Worker VkDeviceSize offset,
2934*61046927SAndroid Build Coastguard Worker VkDeviceSize size,
2935*61046927SAndroid Build Coastguard Worker VkMemoryMapFlags flags,
2936*61046927SAndroid Build Coastguard Worker void **ppData)
2937*61046927SAndroid Build Coastguard Worker {
2938*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
2939*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, _memory);
2940*61046927SAndroid Build Coastguard Worker
2941*61046927SAndroid Build Coastguard Worker if (mem == NULL) {
2942*61046927SAndroid Build Coastguard Worker *ppData = NULL;
2943*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2944*61046927SAndroid Build Coastguard Worker }
2945*61046927SAndroid Build Coastguard Worker
2946*61046927SAndroid Build Coastguard Worker if (mem->map && !mem->map_res) {
2947*61046927SAndroid Build Coastguard Worker *ppData = ((uint8_t *)mem->map) + offset;
2948*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2949*61046927SAndroid Build Coastguard Worker }
2950*61046927SAndroid Build Coastguard Worker
2951*61046927SAndroid Build Coastguard Worker if (size == VK_WHOLE_SIZE)
2952*61046927SAndroid Build Coastguard Worker size = mem->size - offset;
2953*61046927SAndroid Build Coastguard Worker
2954*61046927SAndroid Build Coastguard Worker /* From the Vulkan spec version 1.0.32 docs for MapMemory:
2955*61046927SAndroid Build Coastguard Worker *
2956*61046927SAndroid Build Coastguard Worker * * If size is not equal to VK_WHOLE_SIZE, size must be greater than 0
2957*61046927SAndroid Build Coastguard Worker * assert(size != 0);
2958*61046927SAndroid Build Coastguard Worker * * If size is not equal to VK_WHOLE_SIZE, size must be less than or
2959*61046927SAndroid Build Coastguard Worker * equal to the size of the memory minus offset
2960*61046927SAndroid Build Coastguard Worker */
2961*61046927SAndroid Build Coastguard Worker assert(size > 0);
2962*61046927SAndroid Build Coastguard Worker assert(offset + size <= mem->size);
2963*61046927SAndroid Build Coastguard Worker
2964*61046927SAndroid Build Coastguard Worker assert(mem->map_res);
2965*61046927SAndroid Build Coastguard Worker D3D12_RANGE range = { 0 };
2966*61046927SAndroid Build Coastguard Worker range.Begin = offset;
2967*61046927SAndroid Build Coastguard Worker range.End = offset + size;
2968*61046927SAndroid Build Coastguard Worker void *map = NULL;
2969*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Resource_Map(mem->map_res, 0, &range, &map)))
2970*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED);
2971*61046927SAndroid Build Coastguard Worker
2972*61046927SAndroid Build Coastguard Worker mem->map = map;
2973*61046927SAndroid Build Coastguard Worker mem->map_size = size;
2974*61046927SAndroid Build Coastguard Worker
2975*61046927SAndroid Build Coastguard Worker *ppData = ((uint8_t *) map) + offset;
2976*61046927SAndroid Build Coastguard Worker
2977*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2978*61046927SAndroid Build Coastguard Worker }
2979*61046927SAndroid Build Coastguard Worker
2980*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_UnmapMemory(VkDevice _device,VkDeviceMemory _memory)2981*61046927SAndroid Build Coastguard Worker dzn_UnmapMemory(VkDevice _device,
2982*61046927SAndroid Build Coastguard Worker VkDeviceMemory _memory)
2983*61046927SAndroid Build Coastguard Worker {
2984*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, _memory);
2985*61046927SAndroid Build Coastguard Worker
2986*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2987*61046927SAndroid Build Coastguard Worker return;
2988*61046927SAndroid Build Coastguard Worker
2989*61046927SAndroid Build Coastguard Worker if (!mem->map_res)
2990*61046927SAndroid Build Coastguard Worker return;
2991*61046927SAndroid Build Coastguard Worker
2992*61046927SAndroid Build Coastguard Worker ID3D12Resource_Unmap(mem->map_res, 0, NULL);
2993*61046927SAndroid Build Coastguard Worker
2994*61046927SAndroid Build Coastguard Worker mem->map = NULL;
2995*61046927SAndroid Build Coastguard Worker mem->map_size = 0;
2996*61046927SAndroid Build Coastguard Worker }
2997*61046927SAndroid Build Coastguard Worker
2998*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_FlushMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)2999*61046927SAndroid Build Coastguard Worker dzn_FlushMappedMemoryRanges(VkDevice _device,
3000*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
3001*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
3002*61046927SAndroid Build Coastguard Worker {
3003*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3004*61046927SAndroid Build Coastguard Worker }
3005*61046927SAndroid Build Coastguard Worker
3006*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_InvalidateMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)3007*61046927SAndroid Build Coastguard Worker dzn_InvalidateMappedMemoryRanges(VkDevice _device,
3008*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
3009*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
3010*61046927SAndroid Build Coastguard Worker {
3011*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3012*61046927SAndroid Build Coastguard Worker }
3013*61046927SAndroid Build Coastguard Worker
3014*61046927SAndroid Build Coastguard Worker static void
dzn_buffer_destroy(struct dzn_buffer * buf,const VkAllocationCallbacks * pAllocator)3015*61046927SAndroid Build Coastguard Worker dzn_buffer_destroy(struct dzn_buffer *buf, const VkAllocationCallbacks *pAllocator)
3016*61046927SAndroid Build Coastguard Worker {
3017*61046927SAndroid Build Coastguard Worker if (!buf)
3018*61046927SAndroid Build Coastguard Worker return;
3019*61046927SAndroid Build Coastguard Worker
3020*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(buf->base.device, struct dzn_device, vk);
3021*61046927SAndroid Build Coastguard Worker
3022*61046927SAndroid Build Coastguard Worker if (buf->res)
3023*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(buf->res);
3024*61046927SAndroid Build Coastguard Worker
3025*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, buf->cbv_bindless_slot);
3026*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, buf->uav_bindless_slot);
3027*61046927SAndroid Build Coastguard Worker if (buf->custom_views) {
3028*61046927SAndroid Build Coastguard Worker hash_table_foreach(buf->custom_views, entry) {
3029*61046927SAndroid Build Coastguard Worker free((void *)entry->key);
3030*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, (int)(intptr_t)entry->data);
3031*61046927SAndroid Build Coastguard Worker }
3032*61046927SAndroid Build Coastguard Worker _mesa_hash_table_destroy(buf->custom_views, NULL);
3033*61046927SAndroid Build Coastguard Worker }
3034*61046927SAndroid Build Coastguard Worker
3035*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&buf->base);
3036*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, buf);
3037*61046927SAndroid Build Coastguard Worker }
3038*61046927SAndroid Build Coastguard Worker
3039*61046927SAndroid Build Coastguard Worker static VkResult
dzn_buffer_create(struct dzn_device * device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * out)3040*61046927SAndroid Build Coastguard Worker dzn_buffer_create(struct dzn_device *device,
3041*61046927SAndroid Build Coastguard Worker const VkBufferCreateInfo *pCreateInfo,
3042*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3043*61046927SAndroid Build Coastguard Worker VkBuffer *out)
3044*61046927SAndroid Build Coastguard Worker {
3045*61046927SAndroid Build Coastguard Worker struct dzn_buffer *buf =
3046*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*buf), 8,
3047*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
3048*61046927SAndroid Build Coastguard Worker if (!buf)
3049*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3050*61046927SAndroid Build Coastguard Worker
3051*61046927SAndroid Build Coastguard Worker vk_object_base_init(&device->vk, &buf->base, VK_OBJECT_TYPE_BUFFER);
3052*61046927SAndroid Build Coastguard Worker buf->create_flags = pCreateInfo->flags;
3053*61046927SAndroid Build Coastguard Worker buf->size = pCreateInfo->size;
3054*61046927SAndroid Build Coastguard Worker buf->usage = pCreateInfo->usage;
3055*61046927SAndroid Build Coastguard Worker
3056*61046927SAndroid Build Coastguard Worker if (buf->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
3057*61046927SAndroid Build Coastguard Worker buf->size = MAX2(buf->size, ALIGN_POT(buf->size, 256));
3058*61046927SAndroid Build Coastguard Worker if (buf->usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
3059*61046927SAndroid Build Coastguard Worker buf->size = MAX2(buf->size, ALIGN_POT(buf->size, 4));
3060*61046927SAndroid Build Coastguard Worker
3061*61046927SAndroid Build Coastguard Worker buf->desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
3062*61046927SAndroid Build Coastguard Worker buf->desc.Format = DXGI_FORMAT_UNKNOWN;
3063*61046927SAndroid Build Coastguard Worker buf->desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
3064*61046927SAndroid Build Coastguard Worker buf->desc.Width = buf->size;
3065*61046927SAndroid Build Coastguard Worker buf->desc.Height = 1;
3066*61046927SAndroid Build Coastguard Worker buf->desc.DepthOrArraySize = 1;
3067*61046927SAndroid Build Coastguard Worker buf->desc.MipLevels = 1;
3068*61046927SAndroid Build Coastguard Worker buf->desc.SampleDesc.Count = 1;
3069*61046927SAndroid Build Coastguard Worker buf->desc.SampleDesc.Quality = 0;
3070*61046927SAndroid Build Coastguard Worker buf->desc.Flags = D3D12_RESOURCE_FLAG_NONE;
3071*61046927SAndroid Build Coastguard Worker buf->desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
3072*61046927SAndroid Build Coastguard Worker buf->valid_access =
3073*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_VERTEX_BUFFER |
3074*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_CONSTANT_BUFFER |
3075*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_INDEX_BUFFER |
3076*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_SHADER_RESOURCE |
3077*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_STREAM_OUTPUT |
3078*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT |
3079*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_PREDICATION |
3080*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_COPY_DEST |
3081*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_COPY_SOURCE |
3082*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ |
3083*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE;
3084*61046927SAndroid Build Coastguard Worker
3085*61046927SAndroid Build Coastguard Worker if (buf->usage &
3086*61046927SAndroid Build Coastguard Worker (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
3087*61046927SAndroid Build Coastguard Worker VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
3088*61046927SAndroid Build Coastguard Worker VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)) {
3089*61046927SAndroid Build Coastguard Worker buf->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
3090*61046927SAndroid Build Coastguard Worker buf->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
3091*61046927SAndroid Build Coastguard Worker }
3092*61046927SAndroid Build Coastguard Worker
3093*61046927SAndroid Build Coastguard Worker buf->cbv_bindless_slot = buf->uav_bindless_slot = -1;
3094*61046927SAndroid Build Coastguard Worker if (device->bindless) {
3095*61046927SAndroid Build Coastguard Worker if (buf->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
3096*61046927SAndroid Build Coastguard Worker buf->cbv_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
3097*61046927SAndroid Build Coastguard Worker if (buf->cbv_bindless_slot < 0) {
3098*61046927SAndroid Build Coastguard Worker dzn_buffer_destroy(buf, pAllocator);
3099*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3100*61046927SAndroid Build Coastguard Worker }
3101*61046927SAndroid Build Coastguard Worker }
3102*61046927SAndroid Build Coastguard Worker if (buf->usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)) {
3103*61046927SAndroid Build Coastguard Worker buf->uav_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
3104*61046927SAndroid Build Coastguard Worker if (buf->uav_bindless_slot < 0) {
3105*61046927SAndroid Build Coastguard Worker dzn_buffer_destroy(buf, pAllocator);
3106*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3107*61046927SAndroid Build Coastguard Worker }
3108*61046927SAndroid Build Coastguard Worker }
3109*61046927SAndroid Build Coastguard Worker }
3110*61046927SAndroid Build Coastguard Worker
3111*61046927SAndroid Build Coastguard Worker if (device->bindless)
3112*61046927SAndroid Build Coastguard Worker mtx_init(&buf->bindless_view_lock, mtx_plain);
3113*61046927SAndroid Build Coastguard Worker
3114*61046927SAndroid Build Coastguard Worker const VkExternalMemoryBufferCreateInfo *external_info =
3115*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_BUFFER_CREATE_INFO);
3116*61046927SAndroid Build Coastguard Worker if (external_info && external_info->handleTypes != 0)
3117*61046927SAndroid Build Coastguard Worker buf->shared = true;
3118*61046927SAndroid Build Coastguard Worker
3119*61046927SAndroid Build Coastguard Worker *out = dzn_buffer_to_handle(buf);
3120*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3121*61046927SAndroid Build Coastguard Worker }
3122*61046927SAndroid Build Coastguard Worker
3123*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
dzn_buffer_get_dxgi_format(VkFormat format)3124*61046927SAndroid Build Coastguard Worker dzn_buffer_get_dxgi_format(VkFormat format)
3125*61046927SAndroid Build Coastguard Worker {
3126*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(format);
3127*61046927SAndroid Build Coastguard Worker
3128*61046927SAndroid Build Coastguard Worker return dzn_pipe_to_dxgi_format(pfmt);
3129*61046927SAndroid Build Coastguard Worker }
3130*61046927SAndroid Build Coastguard Worker
3131*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
dzn_buffer_get_copy_loc(const struct dzn_buffer * buf,VkFormat format,const VkBufferImageCopy2 * region,VkImageAspectFlagBits aspect,uint32_t layer)3132*61046927SAndroid Build Coastguard Worker dzn_buffer_get_copy_loc(const struct dzn_buffer *buf,
3133*61046927SAndroid Build Coastguard Worker VkFormat format,
3134*61046927SAndroid Build Coastguard Worker const VkBufferImageCopy2 *region,
3135*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
3136*61046927SAndroid Build Coastguard Worker uint32_t layer)
3137*61046927SAndroid Build Coastguard Worker {
3138*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
3139*61046927SAndroid Build Coastguard Worker container_of(buf->base.device->physical, struct dzn_physical_device, vk);
3140*61046927SAndroid Build Coastguard Worker const uint32_t buffer_row_length =
3141*61046927SAndroid Build Coastguard Worker region->bufferRowLength ? region->bufferRowLength : region->imageExtent.width;
3142*61046927SAndroid Build Coastguard Worker
3143*61046927SAndroid Build Coastguard Worker VkFormat plane_format = dzn_image_get_plane_format(format, aspect);
3144*61046927SAndroid Build Coastguard Worker
3145*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(plane_format);
3146*61046927SAndroid Build Coastguard Worker uint32_t blksz = util_format_get_blocksize(pfmt);
3147*61046927SAndroid Build Coastguard Worker uint32_t blkw = util_format_get_blockwidth(pfmt);
3148*61046927SAndroid Build Coastguard Worker uint32_t blkh = util_format_get_blockheight(pfmt);
3149*61046927SAndroid Build Coastguard Worker
3150*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION loc = {
3151*61046927SAndroid Build Coastguard Worker .pResource = buf->res,
3152*61046927SAndroid Build Coastguard Worker .Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT,
3153*61046927SAndroid Build Coastguard Worker .PlacedFootprint = {
3154*61046927SAndroid Build Coastguard Worker .Footprint = {
3155*61046927SAndroid Build Coastguard Worker .Format =
3156*61046927SAndroid Build Coastguard Worker dzn_image_get_placed_footprint_format(pdev, format, aspect),
3157*61046927SAndroid Build Coastguard Worker .Width = region->imageExtent.width,
3158*61046927SAndroid Build Coastguard Worker .Height = region->imageExtent.height,
3159*61046927SAndroid Build Coastguard Worker .Depth = region->imageExtent.depth,
3160*61046927SAndroid Build Coastguard Worker .RowPitch = blksz * DIV_ROUND_UP(buffer_row_length, blkw),
3161*61046927SAndroid Build Coastguard Worker },
3162*61046927SAndroid Build Coastguard Worker },
3163*61046927SAndroid Build Coastguard Worker };
3164*61046927SAndroid Build Coastguard Worker
3165*61046927SAndroid Build Coastguard Worker uint32_t buffer_layer_stride =
3166*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.RowPitch *
3167*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(loc.PlacedFootprint.Footprint.Height, blkh);
3168*61046927SAndroid Build Coastguard Worker
3169*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Offset =
3170*61046927SAndroid Build Coastguard Worker region->bufferOffset + (layer * buffer_layer_stride);
3171*61046927SAndroid Build Coastguard Worker
3172*61046927SAndroid Build Coastguard Worker return loc;
3173*61046927SAndroid Build Coastguard Worker }
3174*61046927SAndroid Build Coastguard Worker
3175*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
dzn_buffer_get_line_copy_loc(const struct dzn_buffer * buf,VkFormat format,const VkBufferImageCopy2 * region,const D3D12_TEXTURE_COPY_LOCATION * loc,uint32_t y,uint32_t z,uint32_t * start_x)3176*61046927SAndroid Build Coastguard Worker dzn_buffer_get_line_copy_loc(const struct dzn_buffer *buf, VkFormat format,
3177*61046927SAndroid Build Coastguard Worker const VkBufferImageCopy2 *region,
3178*61046927SAndroid Build Coastguard Worker const D3D12_TEXTURE_COPY_LOCATION *loc,
3179*61046927SAndroid Build Coastguard Worker uint32_t y, uint32_t z, uint32_t *start_x)
3180*61046927SAndroid Build Coastguard Worker {
3181*61046927SAndroid Build Coastguard Worker uint32_t buffer_row_length =
3182*61046927SAndroid Build Coastguard Worker region->bufferRowLength ? region->bufferRowLength : region->imageExtent.width;
3183*61046927SAndroid Build Coastguard Worker uint32_t buffer_image_height =
3184*61046927SAndroid Build Coastguard Worker region->bufferImageHeight ? region->bufferImageHeight : region->imageExtent.height;
3185*61046927SAndroid Build Coastguard Worker
3186*61046927SAndroid Build Coastguard Worker format = dzn_image_get_plane_format(format, region->imageSubresource.aspectMask);
3187*61046927SAndroid Build Coastguard Worker
3188*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(format);
3189*61046927SAndroid Build Coastguard Worker uint32_t blksz = util_format_get_blocksize(pfmt);
3190*61046927SAndroid Build Coastguard Worker uint32_t blkw = util_format_get_blockwidth(pfmt);
3191*61046927SAndroid Build Coastguard Worker uint32_t blkh = util_format_get_blockheight(pfmt);
3192*61046927SAndroid Build Coastguard Worker uint32_t blkd = util_format_get_blockdepth(pfmt);
3193*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION new_loc = *loc;
3194*61046927SAndroid Build Coastguard Worker uint32_t buffer_row_stride =
3195*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(buffer_row_length, blkw) * blksz;
3196*61046927SAndroid Build Coastguard Worker uint32_t buffer_layer_stride =
3197*61046927SAndroid Build Coastguard Worker buffer_row_stride *
3198*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(buffer_image_height, blkh);
3199*61046927SAndroid Build Coastguard Worker
3200*61046927SAndroid Build Coastguard Worker uint64_t tex_offset =
3201*61046927SAndroid Build Coastguard Worker ((y / blkh) * buffer_row_stride) +
3202*61046927SAndroid Build Coastguard Worker ((z / blkd) * buffer_layer_stride);
3203*61046927SAndroid Build Coastguard Worker uint64_t offset = loc->PlacedFootprint.Offset + tex_offset;
3204*61046927SAndroid Build Coastguard Worker uint32_t offset_alignment = D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT;
3205*61046927SAndroid Build Coastguard Worker
3206*61046927SAndroid Build Coastguard Worker while (offset_alignment % blksz)
3207*61046927SAndroid Build Coastguard Worker offset_alignment += D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT;
3208*61046927SAndroid Build Coastguard Worker
3209*61046927SAndroid Build Coastguard Worker new_loc.PlacedFootprint.Footprint.Height = blkh;
3210*61046927SAndroid Build Coastguard Worker new_loc.PlacedFootprint.Footprint.Depth = 1;
3211*61046927SAndroid Build Coastguard Worker new_loc.PlacedFootprint.Offset = (offset / offset_alignment) * offset_alignment;
3212*61046927SAndroid Build Coastguard Worker *start_x = ((offset % offset_alignment) / blksz) * blkw;
3213*61046927SAndroid Build Coastguard Worker new_loc.PlacedFootprint.Footprint.Width = *start_x + region->imageExtent.width;
3214*61046927SAndroid Build Coastguard Worker new_loc.PlacedFootprint.Footprint.RowPitch =
3215*61046927SAndroid Build Coastguard Worker ALIGN_POT(DIV_ROUND_UP(new_loc.PlacedFootprint.Footprint.Width, blkw) * blksz,
3216*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
3217*61046927SAndroid Build Coastguard Worker return new_loc;
3218*61046927SAndroid Build Coastguard Worker }
3219*61046927SAndroid Build Coastguard Worker
3220*61046927SAndroid Build Coastguard Worker bool
dzn_buffer_supports_region_copy(struct dzn_physical_device * pdev,const D3D12_TEXTURE_COPY_LOCATION * loc)3221*61046927SAndroid Build Coastguard Worker dzn_buffer_supports_region_copy(struct dzn_physical_device *pdev,
3222*61046927SAndroid Build Coastguard Worker const D3D12_TEXTURE_COPY_LOCATION *loc)
3223*61046927SAndroid Build Coastguard Worker {
3224*61046927SAndroid Build Coastguard Worker if (pdev->options13.UnrestrictedBufferTextureCopyPitchSupported)
3225*61046927SAndroid Build Coastguard Worker return true;
3226*61046927SAndroid Build Coastguard Worker return !(loc->PlacedFootprint.Offset & (D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT - 1)) &&
3227*61046927SAndroid Build Coastguard Worker !(loc->PlacedFootprint.Footprint.RowPitch & (D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1));
3228*61046927SAndroid Build Coastguard Worker }
3229*61046927SAndroid Build Coastguard Worker
3230*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateBuffer(VkDevice device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)3231*61046927SAndroid Build Coastguard Worker dzn_CreateBuffer(VkDevice device,
3232*61046927SAndroid Build Coastguard Worker const VkBufferCreateInfo *pCreateInfo,
3233*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3234*61046927SAndroid Build Coastguard Worker VkBuffer *pBuffer)
3235*61046927SAndroid Build Coastguard Worker {
3236*61046927SAndroid Build Coastguard Worker return dzn_buffer_create(dzn_device_from_handle(device),
3237*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator, pBuffer);
3238*61046927SAndroid Build Coastguard Worker }
3239*61046927SAndroid Build Coastguard Worker
3240*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyBuffer(VkDevice device,VkBuffer buffer,const VkAllocationCallbacks * pAllocator)3241*61046927SAndroid Build Coastguard Worker dzn_DestroyBuffer(VkDevice device,
3242*61046927SAndroid Build Coastguard Worker VkBuffer buffer,
3243*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3244*61046927SAndroid Build Coastguard Worker {
3245*61046927SAndroid Build Coastguard Worker dzn_buffer_destroy(dzn_buffer_from_handle(buffer), pAllocator);
3246*61046927SAndroid Build Coastguard Worker }
3247*61046927SAndroid Build Coastguard Worker
3248*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetBufferMemoryRequirements2(VkDevice dev,const VkBufferMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)3249*61046927SAndroid Build Coastguard Worker dzn_GetBufferMemoryRequirements2(VkDevice dev,
3250*61046927SAndroid Build Coastguard Worker const VkBufferMemoryRequirementsInfo2 *pInfo,
3251*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
3252*61046927SAndroid Build Coastguard Worker {
3253*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, dev);
3254*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_buffer, buffer, pInfo->buffer);
3255*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
3256*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
3257*61046927SAndroid Build Coastguard Worker
3258*61046927SAndroid Build Coastguard Worker uint32_t alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
3259*61046927SAndroid Build Coastguard Worker VkDeviceSize size = buffer->size;
3260*61046927SAndroid Build Coastguard Worker
3261*61046927SAndroid Build Coastguard Worker if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
3262*61046927SAndroid Build Coastguard Worker alignment = MAX2(alignment, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
3263*61046927SAndroid Build Coastguard Worker size = ALIGN_POT(size, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
3264*61046927SAndroid Build Coastguard Worker }
3265*61046927SAndroid Build Coastguard Worker
3266*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.size = size;
3267*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.alignment = alignment;
3268*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.memoryTypeBits =
3269*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_mem_type_mask_for_resource(pdev, &buffer->desc, buffer->shared);
3270*61046927SAndroid Build Coastguard Worker
3271*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryRequirements->pNext) {
3272*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
3273*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
3274*61046927SAndroid Build Coastguard Worker VkMemoryDedicatedRequirements *requirements =
3275*61046927SAndroid Build Coastguard Worker (VkMemoryDedicatedRequirements *)ext;
3276*61046927SAndroid Build Coastguard Worker requirements->requiresDedicatedAllocation = false;
3277*61046927SAndroid Build Coastguard Worker requirements->prefersDedicatedAllocation = false;
3278*61046927SAndroid Build Coastguard Worker break;
3279*61046927SAndroid Build Coastguard Worker }
3280*61046927SAndroid Build Coastguard Worker
3281*61046927SAndroid Build Coastguard Worker default:
3282*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
3283*61046927SAndroid Build Coastguard Worker break;
3284*61046927SAndroid Build Coastguard Worker }
3285*61046927SAndroid Build Coastguard Worker }
3286*61046927SAndroid Build Coastguard Worker }
3287*61046927SAndroid Build Coastguard Worker
3288*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_BindBufferMemory2(VkDevice _device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)3289*61046927SAndroid Build Coastguard Worker dzn_BindBufferMemory2(VkDevice _device,
3290*61046927SAndroid Build Coastguard Worker uint32_t bindInfoCount,
3291*61046927SAndroid Build Coastguard Worker const VkBindBufferMemoryInfo *pBindInfos)
3292*61046927SAndroid Build Coastguard Worker {
3293*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
3294*61046927SAndroid Build Coastguard Worker
3295*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < bindInfoCount; i++) {
3296*61046927SAndroid Build Coastguard Worker assert(pBindInfos[i].sType == VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO);
3297*61046927SAndroid Build Coastguard Worker
3298*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, pBindInfos[i].memory);
3299*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_buffer, buffer, pBindInfos[i].buffer);
3300*61046927SAndroid Build Coastguard Worker
3301*61046927SAndroid Build Coastguard Worker if (mem->dedicated_res) {
3302*61046927SAndroid Build Coastguard Worker assert(pBindInfos[i].memoryOffset == 0 &&
3303*61046927SAndroid Build Coastguard Worker buffer->size == mem->size);
3304*61046927SAndroid Build Coastguard Worker buffer->res = mem->dedicated_res;
3305*61046927SAndroid Build Coastguard Worker ID3D12Resource_AddRef(buffer->res);
3306*61046927SAndroid Build Coastguard Worker } else {
3307*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC desc = buffer->desc;
3308*61046927SAndroid Build Coastguard Worker desc.Flags |= mem->res_flags;
3309*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreatePlacedResource(device->dev, mem->heap,
3310*61046927SAndroid Build Coastguard Worker pBindInfos[i].memoryOffset,
3311*61046927SAndroid Build Coastguard Worker &buffer->desc,
3312*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
3313*61046927SAndroid Build Coastguard Worker NULL,
3314*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
3315*61046927SAndroid Build Coastguard Worker (void **)&buffer->res)))
3316*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3317*61046927SAndroid Build Coastguard Worker }
3318*61046927SAndroid Build Coastguard Worker
3319*61046927SAndroid Build Coastguard Worker buffer->gpuva = ID3D12Resource_GetGPUVirtualAddress(buffer->res);
3320*61046927SAndroid Build Coastguard Worker
3321*61046927SAndroid Build Coastguard Worker if (device->bindless) {
3322*61046927SAndroid Build Coastguard Worker struct dzn_buffer_desc buf_desc = {
3323*61046927SAndroid Build Coastguard Worker .buffer = buffer,
3324*61046927SAndroid Build Coastguard Worker .offset = 0,
3325*61046927SAndroid Build Coastguard Worker .range = VK_WHOLE_SIZE,
3326*61046927SAndroid Build Coastguard Worker };
3327*61046927SAndroid Build Coastguard Worker if (buffer->cbv_bindless_slot >= 0) {
3328*61046927SAndroid Build Coastguard Worker buf_desc.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3329*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_desc(device,
3330*61046927SAndroid Build Coastguard Worker &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
3331*61046927SAndroid Build Coastguard Worker buffer->cbv_bindless_slot,
3332*61046927SAndroid Build Coastguard Worker false,
3333*61046927SAndroid Build Coastguard Worker &buf_desc);
3334*61046927SAndroid Build Coastguard Worker }
3335*61046927SAndroid Build Coastguard Worker if (buffer->uav_bindless_slot >= 0) {
3336*61046927SAndroid Build Coastguard Worker buf_desc.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
3337*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_desc(device,
3338*61046927SAndroid Build Coastguard Worker &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
3339*61046927SAndroid Build Coastguard Worker buffer->uav_bindless_slot,
3340*61046927SAndroid Build Coastguard Worker true,
3341*61046927SAndroid Build Coastguard Worker &buf_desc);
3342*61046927SAndroid Build Coastguard Worker }
3343*61046927SAndroid Build Coastguard Worker }
3344*61046927SAndroid Build Coastguard Worker }
3345*61046927SAndroid Build Coastguard Worker
3346*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3347*61046927SAndroid Build Coastguard Worker }
3348*61046927SAndroid Build Coastguard Worker
3349*61046927SAndroid Build Coastguard Worker static void
dzn_event_destroy(struct dzn_event * event,const VkAllocationCallbacks * pAllocator)3350*61046927SAndroid Build Coastguard Worker dzn_event_destroy(struct dzn_event *event,
3351*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3352*61046927SAndroid Build Coastguard Worker {
3353*61046927SAndroid Build Coastguard Worker if (!event)
3354*61046927SAndroid Build Coastguard Worker return;
3355*61046927SAndroid Build Coastguard Worker
3356*61046927SAndroid Build Coastguard Worker struct dzn_device *device =
3357*61046927SAndroid Build Coastguard Worker container_of(event->base.device, struct dzn_device, vk);
3358*61046927SAndroid Build Coastguard Worker
3359*61046927SAndroid Build Coastguard Worker if (event->fence)
3360*61046927SAndroid Build Coastguard Worker ID3D12Fence_Release(event->fence);
3361*61046927SAndroid Build Coastguard Worker
3362*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&event->base);
3363*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, event);
3364*61046927SAndroid Build Coastguard Worker }
3365*61046927SAndroid Build Coastguard Worker
3366*61046927SAndroid Build Coastguard Worker static VkResult
dzn_event_create(struct dzn_device * device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * out)3367*61046927SAndroid Build Coastguard Worker dzn_event_create(struct dzn_device *device,
3368*61046927SAndroid Build Coastguard Worker const VkEventCreateInfo *pCreateInfo,
3369*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3370*61046927SAndroid Build Coastguard Worker VkEvent *out)
3371*61046927SAndroid Build Coastguard Worker {
3372*61046927SAndroid Build Coastguard Worker struct dzn_event *event =
3373*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*event), 8,
3374*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
3375*61046927SAndroid Build Coastguard Worker if (!event)
3376*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3377*61046927SAndroid Build Coastguard Worker
3378*61046927SAndroid Build Coastguard Worker vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT);
3379*61046927SAndroid Build Coastguard Worker
3380*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateFence(device->dev, 0, D3D12_FENCE_FLAG_NONE,
3381*61046927SAndroid Build Coastguard Worker &IID_ID3D12Fence,
3382*61046927SAndroid Build Coastguard Worker (void **)&event->fence))) {
3383*61046927SAndroid Build Coastguard Worker dzn_event_destroy(event, pAllocator);
3384*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3385*61046927SAndroid Build Coastguard Worker }
3386*61046927SAndroid Build Coastguard Worker
3387*61046927SAndroid Build Coastguard Worker *out = dzn_event_to_handle(event);
3388*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3389*61046927SAndroid Build Coastguard Worker }
3390*61046927SAndroid Build Coastguard Worker
3391*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateEvent(VkDevice device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)3392*61046927SAndroid Build Coastguard Worker dzn_CreateEvent(VkDevice device,
3393*61046927SAndroid Build Coastguard Worker const VkEventCreateInfo *pCreateInfo,
3394*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3395*61046927SAndroid Build Coastguard Worker VkEvent *pEvent)
3396*61046927SAndroid Build Coastguard Worker {
3397*61046927SAndroid Build Coastguard Worker return dzn_event_create(dzn_device_from_handle(device),
3398*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator, pEvent);
3399*61046927SAndroid Build Coastguard Worker }
3400*61046927SAndroid Build Coastguard Worker
3401*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyEvent(VkDevice device,VkEvent event,const VkAllocationCallbacks * pAllocator)3402*61046927SAndroid Build Coastguard Worker dzn_DestroyEvent(VkDevice device,
3403*61046927SAndroid Build Coastguard Worker VkEvent event,
3404*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3405*61046927SAndroid Build Coastguard Worker {
3406*61046927SAndroid Build Coastguard Worker dzn_event_destroy(dzn_event_from_handle(event), pAllocator);
3407*61046927SAndroid Build Coastguard Worker }
3408*61046927SAndroid Build Coastguard Worker
3409*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_ResetEvent(VkDevice dev,VkEvent evt)3410*61046927SAndroid Build Coastguard Worker dzn_ResetEvent(VkDevice dev,
3411*61046927SAndroid Build Coastguard Worker VkEvent evt)
3412*61046927SAndroid Build Coastguard Worker {
3413*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, dev);
3414*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_event, event, evt);
3415*61046927SAndroid Build Coastguard Worker
3416*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Fence_Signal(event->fence, 0)))
3417*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3418*61046927SAndroid Build Coastguard Worker
3419*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3420*61046927SAndroid Build Coastguard Worker }
3421*61046927SAndroid Build Coastguard Worker
3422*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_SetEvent(VkDevice dev,VkEvent evt)3423*61046927SAndroid Build Coastguard Worker dzn_SetEvent(VkDevice dev,
3424*61046927SAndroid Build Coastguard Worker VkEvent evt)
3425*61046927SAndroid Build Coastguard Worker {
3426*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, dev);
3427*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_event, event, evt);
3428*61046927SAndroid Build Coastguard Worker
3429*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Fence_Signal(event->fence, 1)))
3430*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3431*61046927SAndroid Build Coastguard Worker
3432*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3433*61046927SAndroid Build Coastguard Worker }
3434*61046927SAndroid Build Coastguard Worker
3435*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetEventStatus(VkDevice device,VkEvent evt)3436*61046927SAndroid Build Coastguard Worker dzn_GetEventStatus(VkDevice device,
3437*61046927SAndroid Build Coastguard Worker VkEvent evt)
3438*61046927SAndroid Build Coastguard Worker {
3439*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_event, event, evt);
3440*61046927SAndroid Build Coastguard Worker
3441*61046927SAndroid Build Coastguard Worker return ID3D12Fence_GetCompletedValue(event->fence) == 0 ?
3442*61046927SAndroid Build Coastguard Worker VK_EVENT_RESET : VK_EVENT_SET;
3443*61046927SAndroid Build Coastguard Worker }
3444*61046927SAndroid Build Coastguard Worker
3445*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes)3446*61046927SAndroid Build Coastguard Worker dzn_GetDeviceMemoryCommitment(VkDevice device,
3447*61046927SAndroid Build Coastguard Worker VkDeviceMemory memory,
3448*61046927SAndroid Build Coastguard Worker VkDeviceSize *pCommittedMemoryInBytes)
3449*61046927SAndroid Build Coastguard Worker {
3450*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, memory);
3451*61046927SAndroid Build Coastguard Worker
3452*61046927SAndroid Build Coastguard Worker // TODO: find if there's a way to query/track actual heap residency
3453*61046927SAndroid Build Coastguard Worker *pCommittedMemoryInBytes = mem->size;
3454*61046927SAndroid Build Coastguard Worker }
3455*61046927SAndroid Build Coastguard Worker
3456*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_QueueBindSparse(VkQueue queue,uint32_t bindInfoCount,const VkBindSparseInfo * pBindInfo,VkFence fence)3457*61046927SAndroid Build Coastguard Worker dzn_QueueBindSparse(VkQueue queue,
3458*61046927SAndroid Build Coastguard Worker uint32_t bindInfoCount,
3459*61046927SAndroid Build Coastguard Worker const VkBindSparseInfo *pBindInfo,
3460*61046927SAndroid Build Coastguard Worker VkFence fence)
3461*61046927SAndroid Build Coastguard Worker {
3462*61046927SAndroid Build Coastguard Worker // FIXME: add proper implem
3463*61046927SAndroid Build Coastguard Worker dzn_stub();
3464*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3465*61046927SAndroid Build Coastguard Worker }
3466*61046927SAndroid Build Coastguard Worker
3467*61046927SAndroid Build Coastguard Worker static D3D12_TEXTURE_ADDRESS_MODE
dzn_sampler_translate_addr_mode(VkSamplerAddressMode in)3468*61046927SAndroid Build Coastguard Worker dzn_sampler_translate_addr_mode(VkSamplerAddressMode in)
3469*61046927SAndroid Build Coastguard Worker {
3470*61046927SAndroid Build Coastguard Worker switch (in) {
3471*61046927SAndroid Build Coastguard Worker case VK_SAMPLER_ADDRESS_MODE_REPEAT: return D3D12_TEXTURE_ADDRESS_MODE_WRAP;
3472*61046927SAndroid Build Coastguard Worker case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT: return D3D12_TEXTURE_ADDRESS_MODE_MIRROR;
3473*61046927SAndroid Build Coastguard Worker case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE: return D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
3474*61046927SAndroid Build Coastguard Worker case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER: return D3D12_TEXTURE_ADDRESS_MODE_BORDER;
3475*61046927SAndroid Build Coastguard Worker case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE: return D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE;
3476*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid address mode");
3477*61046927SAndroid Build Coastguard Worker }
3478*61046927SAndroid Build Coastguard Worker }
3479*61046927SAndroid Build Coastguard Worker
3480*61046927SAndroid Build Coastguard Worker static void
dzn_sampler_destroy(struct dzn_sampler * sampler,const VkAllocationCallbacks * pAllocator)3481*61046927SAndroid Build Coastguard Worker dzn_sampler_destroy(struct dzn_sampler *sampler,
3482*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3483*61046927SAndroid Build Coastguard Worker {
3484*61046927SAndroid Build Coastguard Worker if (!sampler)
3485*61046927SAndroid Build Coastguard Worker return;
3486*61046927SAndroid Build Coastguard Worker
3487*61046927SAndroid Build Coastguard Worker struct dzn_device *device =
3488*61046927SAndroid Build Coastguard Worker container_of(sampler->base.device, struct dzn_device, vk);
3489*61046927SAndroid Build Coastguard Worker
3490*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, sampler->bindless_slot);
3491*61046927SAndroid Build Coastguard Worker
3492*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&sampler->base);
3493*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, sampler);
3494*61046927SAndroid Build Coastguard Worker }
3495*61046927SAndroid Build Coastguard Worker
3496*61046927SAndroid Build Coastguard Worker static VkResult
dzn_sampler_create(struct dzn_device * device,const VkSamplerCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSampler * out)3497*61046927SAndroid Build Coastguard Worker dzn_sampler_create(struct dzn_device *device,
3498*61046927SAndroid Build Coastguard Worker const VkSamplerCreateInfo *pCreateInfo,
3499*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3500*61046927SAndroid Build Coastguard Worker VkSampler *out)
3501*61046927SAndroid Build Coastguard Worker {
3502*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(device->vk.physical, struct dzn_physical_device, vk);
3503*61046927SAndroid Build Coastguard Worker struct dzn_sampler *sampler =
3504*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*sampler), 8,
3505*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
3506*61046927SAndroid Build Coastguard Worker if (!sampler)
3507*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3508*61046927SAndroid Build Coastguard Worker
3509*61046927SAndroid Build Coastguard Worker vk_object_base_init(&device->vk, &sampler->base, VK_OBJECT_TYPE_SAMPLER);
3510*61046927SAndroid Build Coastguard Worker
3511*61046927SAndroid Build Coastguard Worker const VkSamplerCustomBorderColorCreateInfoEXT *pBorderColor = (const VkSamplerCustomBorderColorCreateInfoEXT *)
3512*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext, SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT);
3513*61046927SAndroid Build Coastguard Worker
3514*61046927SAndroid Build Coastguard Worker /* TODO: have a sampler pool to allocate shader-invisible descs which we
3515*61046927SAndroid Build Coastguard Worker * can copy to the desc_set when UpdateDescriptorSets() is called.
3516*61046927SAndroid Build Coastguard Worker */
3517*61046927SAndroid Build Coastguard Worker sampler->desc.Filter = dzn_translate_sampler_filter(pdev, pCreateInfo);
3518*61046927SAndroid Build Coastguard Worker sampler->desc.AddressU = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeU);
3519*61046927SAndroid Build Coastguard Worker sampler->desc.AddressV = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeV);
3520*61046927SAndroid Build Coastguard Worker sampler->desc.AddressW = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeW);
3521*61046927SAndroid Build Coastguard Worker sampler->desc.MipLODBias = pCreateInfo->mipLodBias;
3522*61046927SAndroid Build Coastguard Worker sampler->desc.MaxAnisotropy = pCreateInfo->maxAnisotropy;
3523*61046927SAndroid Build Coastguard Worker sampler->desc.MinLOD = pCreateInfo->minLod;
3524*61046927SAndroid Build Coastguard Worker sampler->desc.MaxLOD = pCreateInfo->maxLod;
3525*61046927SAndroid Build Coastguard Worker
3526*61046927SAndroid Build Coastguard Worker if (pCreateInfo->compareEnable)
3527*61046927SAndroid Build Coastguard Worker sampler->desc.ComparisonFunc = dzn_translate_compare_op(pCreateInfo->compareOp);
3528*61046927SAndroid Build Coastguard Worker
3529*61046927SAndroid Build Coastguard Worker bool reads_border_color =
3530*61046927SAndroid Build Coastguard Worker pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER ||
3531*61046927SAndroid Build Coastguard Worker pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER ||
3532*61046927SAndroid Build Coastguard Worker pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
3533*61046927SAndroid Build Coastguard Worker
3534*61046927SAndroid Build Coastguard Worker if (reads_border_color) {
3535*61046927SAndroid Build Coastguard Worker switch (pCreateInfo->borderColor) {
3536*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
3537*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
3538*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[0] = 0.0f;
3539*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[1] = 0.0f;
3540*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[2] = 0.0f;
3541*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[3] =
3542*61046927SAndroid Build Coastguard Worker pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK ? 0.0f : 1.0f;
3543*61046927SAndroid Build Coastguard Worker sampler->static_border_color =
3544*61046927SAndroid Build Coastguard Worker pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK ?
3545*61046927SAndroid Build Coastguard Worker D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK :
3546*61046927SAndroid Build Coastguard Worker D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;
3547*61046927SAndroid Build Coastguard Worker break;
3548*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
3549*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[0] = sampler->desc.FloatBorderColor[1] = 1.0f;
3550*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[2] = sampler->desc.FloatBorderColor[3] = 1.0f;
3551*61046927SAndroid Build Coastguard Worker sampler->static_border_color = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE;
3552*61046927SAndroid Build Coastguard Worker break;
3553*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_FLOAT_CUSTOM_EXT:
3554*61046927SAndroid Build Coastguard Worker sampler->static_border_color = (D3D12_STATIC_BORDER_COLOR)-1;
3555*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(sampler->desc.FloatBorderColor); i++)
3556*61046927SAndroid Build Coastguard Worker sampler->desc.FloatBorderColor[i] = pBorderColor->customBorderColor.float32[i];
3557*61046927SAndroid Build Coastguard Worker break;
3558*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
3559*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
3560*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[0] = 0;
3561*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[1] = 0;
3562*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[2] = 0;
3563*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[3] =
3564*61046927SAndroid Build Coastguard Worker pCreateInfo->borderColor == VK_BORDER_COLOR_INT_TRANSPARENT_BLACK ? 0 : 1;
3565*61046927SAndroid Build Coastguard Worker sampler->static_border_color =
3566*61046927SAndroid Build Coastguard Worker pCreateInfo->borderColor == VK_BORDER_COLOR_INT_TRANSPARENT_BLACK ?
3567*61046927SAndroid Build Coastguard Worker D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK :
3568*61046927SAndroid Build Coastguard Worker D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT;
3569*61046927SAndroid Build Coastguard Worker sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
3570*61046927SAndroid Build Coastguard Worker break;
3571*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
3572*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[0] = sampler->desc.UintBorderColor[1] = 1;
3573*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[2] = sampler->desc.UintBorderColor[3] = 1;
3574*61046927SAndroid Build Coastguard Worker sampler->static_border_color = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT;
3575*61046927SAndroid Build Coastguard Worker sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
3576*61046927SAndroid Build Coastguard Worker break;
3577*61046927SAndroid Build Coastguard Worker case VK_BORDER_COLOR_INT_CUSTOM_EXT:
3578*61046927SAndroid Build Coastguard Worker sampler->static_border_color = (D3D12_STATIC_BORDER_COLOR)-1;
3579*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(sampler->desc.UintBorderColor); i++)
3580*61046927SAndroid Build Coastguard Worker sampler->desc.UintBorderColor[i] = pBorderColor->customBorderColor.uint32[i];
3581*61046927SAndroid Build Coastguard Worker sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
3582*61046927SAndroid Build Coastguard Worker break;
3583*61046927SAndroid Build Coastguard Worker default:
3584*61046927SAndroid Build Coastguard Worker unreachable("Unsupported border color");
3585*61046927SAndroid Build Coastguard Worker }
3586*61046927SAndroid Build Coastguard Worker }
3587*61046927SAndroid Build Coastguard Worker
3588*61046927SAndroid Build Coastguard Worker if (pCreateInfo->unnormalizedCoordinates && pdev->options17.NonNormalizedCoordinateSamplersSupported)
3589*61046927SAndroid Build Coastguard Worker sampler->desc.Flags |= D3D12_SAMPLER_FLAG_NON_NORMALIZED_COORDINATES;
3590*61046927SAndroid Build Coastguard Worker
3591*61046927SAndroid Build Coastguard Worker sampler->bindless_slot = -1;
3592*61046927SAndroid Build Coastguard Worker if (device->bindless) {
3593*61046927SAndroid Build Coastguard Worker sampler->bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
3594*61046927SAndroid Build Coastguard Worker if (sampler->bindless_slot < 0) {
3595*61046927SAndroid Build Coastguard Worker dzn_sampler_destroy(sampler, pAllocator);
3596*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3597*61046927SAndroid Build Coastguard Worker }
3598*61046927SAndroid Build Coastguard Worker
3599*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_sampler_desc(device,
3600*61046927SAndroid Build Coastguard Worker &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER].heap,
3601*61046927SAndroid Build Coastguard Worker sampler->bindless_slot,
3602*61046927SAndroid Build Coastguard Worker sampler);
3603*61046927SAndroid Build Coastguard Worker }
3604*61046927SAndroid Build Coastguard Worker
3605*61046927SAndroid Build Coastguard Worker *out = dzn_sampler_to_handle(sampler);
3606*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3607*61046927SAndroid Build Coastguard Worker }
3608*61046927SAndroid Build Coastguard Worker
3609*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateSampler(VkDevice device,const VkSamplerCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSampler * pSampler)3610*61046927SAndroid Build Coastguard Worker dzn_CreateSampler(VkDevice device,
3611*61046927SAndroid Build Coastguard Worker const VkSamplerCreateInfo *pCreateInfo,
3612*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3613*61046927SAndroid Build Coastguard Worker VkSampler *pSampler)
3614*61046927SAndroid Build Coastguard Worker {
3615*61046927SAndroid Build Coastguard Worker return dzn_sampler_create(dzn_device_from_handle(device),
3616*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator, pSampler);
3617*61046927SAndroid Build Coastguard Worker }
3618*61046927SAndroid Build Coastguard Worker
3619*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroySampler(VkDevice device,VkSampler sampler,const VkAllocationCallbacks * pAllocator)3620*61046927SAndroid Build Coastguard Worker dzn_DestroySampler(VkDevice device,
3621*61046927SAndroid Build Coastguard Worker VkSampler sampler,
3622*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3623*61046927SAndroid Build Coastguard Worker {
3624*61046927SAndroid Build Coastguard Worker dzn_sampler_destroy(dzn_sampler_from_handle(sampler), pAllocator);
3625*61046927SAndroid Build Coastguard Worker }
3626*61046927SAndroid Build Coastguard Worker
3627*61046927SAndroid Build Coastguard Worker int
dzn_device_descriptor_heap_alloc_slot(struct dzn_device * device,D3D12_DESCRIPTOR_HEAP_TYPE type)3628*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_alloc_slot(struct dzn_device *device,
3629*61046927SAndroid Build Coastguard Worker D3D12_DESCRIPTOR_HEAP_TYPE type)
3630*61046927SAndroid Build Coastguard Worker {
3631*61046927SAndroid Build Coastguard Worker struct dzn_device_descriptor_heap *heap = &device->device_heaps[type];
3632*61046927SAndroid Build Coastguard Worker mtx_lock(&heap->lock);
3633*61046927SAndroid Build Coastguard Worker
3634*61046927SAndroid Build Coastguard Worker int ret = -1;
3635*61046927SAndroid Build Coastguard Worker if (heap->slot_freelist.size)
3636*61046927SAndroid Build Coastguard Worker ret = util_dynarray_pop(&heap->slot_freelist, int);
3637*61046927SAndroid Build Coastguard Worker else if (heap->next_alloc_slot < heap->heap.desc_count)
3638*61046927SAndroid Build Coastguard Worker ret = heap->next_alloc_slot++;
3639*61046927SAndroid Build Coastguard Worker
3640*61046927SAndroid Build Coastguard Worker mtx_unlock(&heap->lock);
3641*61046927SAndroid Build Coastguard Worker return ret;
3642*61046927SAndroid Build Coastguard Worker }
3643*61046927SAndroid Build Coastguard Worker
3644*61046927SAndroid Build Coastguard Worker void
dzn_device_descriptor_heap_free_slot(struct dzn_device * device,D3D12_DESCRIPTOR_HEAP_TYPE type,int slot)3645*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(struct dzn_device *device,
3646*61046927SAndroid Build Coastguard Worker D3D12_DESCRIPTOR_HEAP_TYPE type,
3647*61046927SAndroid Build Coastguard Worker int slot)
3648*61046927SAndroid Build Coastguard Worker {
3649*61046927SAndroid Build Coastguard Worker struct dzn_device_descriptor_heap *heap = &device->device_heaps[type];
3650*61046927SAndroid Build Coastguard Worker assert(slot < 0 || slot < heap->heap.desc_count);
3651*61046927SAndroid Build Coastguard Worker
3652*61046927SAndroid Build Coastguard Worker if (slot < 0)
3653*61046927SAndroid Build Coastguard Worker return;
3654*61046927SAndroid Build Coastguard Worker
3655*61046927SAndroid Build Coastguard Worker mtx_lock(&heap->lock);
3656*61046927SAndroid Build Coastguard Worker util_dynarray_append(&heap->slot_freelist, int, slot);
3657*61046927SAndroid Build Coastguard Worker mtx_unlock(&heap->lock);
3658*61046927SAndroid Build Coastguard Worker }
3659*61046927SAndroid Build Coastguard Worker
3660*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetDeviceGroupPeerMemoryFeatures(VkDevice device,uint32_t heapIndex,uint32_t localDeviceIndex,uint32_t remoteDeviceIndex,VkPeerMemoryFeatureFlags * pPeerMemoryFeatures)3661*61046927SAndroid Build Coastguard Worker dzn_GetDeviceGroupPeerMemoryFeatures(VkDevice device,
3662*61046927SAndroid Build Coastguard Worker uint32_t heapIndex,
3663*61046927SAndroid Build Coastguard Worker uint32_t localDeviceIndex,
3664*61046927SAndroid Build Coastguard Worker uint32_t remoteDeviceIndex,
3665*61046927SAndroid Build Coastguard Worker VkPeerMemoryFeatureFlags *pPeerMemoryFeatures)
3666*61046927SAndroid Build Coastguard Worker {
3667*61046927SAndroid Build Coastguard Worker *pPeerMemoryFeatures = 0;
3668*61046927SAndroid Build Coastguard Worker }
3669*61046927SAndroid Build Coastguard Worker
3670*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetImageSparseMemoryRequirements2(VkDevice device,const VkImageSparseMemoryRequirementsInfo2 * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements)3671*61046927SAndroid Build Coastguard Worker dzn_GetImageSparseMemoryRequirements2(VkDevice device,
3672*61046927SAndroid Build Coastguard Worker const VkImageSparseMemoryRequirementsInfo2* pInfo,
3673*61046927SAndroid Build Coastguard Worker uint32_t *pSparseMemoryRequirementCount,
3674*61046927SAndroid Build Coastguard Worker VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements)
3675*61046927SAndroid Build Coastguard Worker {
3676*61046927SAndroid Build Coastguard Worker *pSparseMemoryRequirementCount = 0;
3677*61046927SAndroid Build Coastguard Worker }
3678*61046927SAndroid Build Coastguard Worker
3679*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateSamplerYcbcrConversion(VkDevice device,const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSamplerYcbcrConversion * pYcbcrConversion)3680*61046927SAndroid Build Coastguard Worker dzn_CreateSamplerYcbcrConversion(VkDevice device,
3681*61046927SAndroid Build Coastguard Worker const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3682*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3683*61046927SAndroid Build Coastguard Worker VkSamplerYcbcrConversion *pYcbcrConversion)
3684*61046927SAndroid Build Coastguard Worker {
3685*61046927SAndroid Build Coastguard Worker unreachable("Ycbcr sampler conversion is not supported");
3686*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3687*61046927SAndroid Build Coastguard Worker }
3688*61046927SAndroid Build Coastguard Worker
3689*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroySamplerYcbcrConversion(VkDevice device,VkSamplerYcbcrConversion YcbcrConversion,const VkAllocationCallbacks * pAllocator)3690*61046927SAndroid Build Coastguard Worker dzn_DestroySamplerYcbcrConversion(VkDevice device,
3691*61046927SAndroid Build Coastguard Worker VkSamplerYcbcrConversion YcbcrConversion,
3692*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3693*61046927SAndroid Build Coastguard Worker {
3694*61046927SAndroid Build Coastguard Worker unreachable("Ycbcr sampler conversion is not supported");
3695*61046927SAndroid Build Coastguard Worker }
3696*61046927SAndroid Build Coastguard Worker
3697*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkDeviceAddress VKAPI_CALL
dzn_GetBufferDeviceAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)3698*61046927SAndroid Build Coastguard Worker dzn_GetBufferDeviceAddress(VkDevice device,
3699*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo* pInfo)
3700*61046927SAndroid Build Coastguard Worker {
3701*61046927SAndroid Build Coastguard Worker struct dzn_buffer *buffer = dzn_buffer_from_handle(pInfo->buffer);
3702*61046927SAndroid Build Coastguard Worker
3703*61046927SAndroid Build Coastguard Worker /* Insert a pointer tag so we never return null */
3704*61046927SAndroid Build Coastguard Worker return ((uint64_t)buffer->uav_bindless_slot << 32ull) | (0xD3ull << 56);
3705*61046927SAndroid Build Coastguard Worker }
3706*61046927SAndroid Build Coastguard Worker
3707*61046927SAndroid Build Coastguard Worker VKAPI_ATTR uint64_t VKAPI_CALL
dzn_GetBufferOpaqueCaptureAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)3708*61046927SAndroid Build Coastguard Worker dzn_GetBufferOpaqueCaptureAddress(VkDevice device,
3709*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo *pInfo)
3710*61046927SAndroid Build Coastguard Worker {
3711*61046927SAndroid Build Coastguard Worker return 0;
3712*61046927SAndroid Build Coastguard Worker }
3713*61046927SAndroid Build Coastguard Worker
3714*61046927SAndroid Build Coastguard Worker VKAPI_ATTR uint64_t VKAPI_CALL
dzn_GetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo)3715*61046927SAndroid Build Coastguard Worker dzn_GetDeviceMemoryOpaqueCaptureAddress(VkDevice device,
3716*61046927SAndroid Build Coastguard Worker const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
3717*61046927SAndroid Build Coastguard Worker {
3718*61046927SAndroid Build Coastguard Worker return 0;
3719*61046927SAndroid Build Coastguard Worker }
3720*61046927SAndroid Build Coastguard Worker
3721*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
3722*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetMemoryWin32HandleKHR(VkDevice device,const VkMemoryGetWin32HandleInfoKHR * pGetWin32HandleInfo,HANDLE * pHandle)3723*61046927SAndroid Build Coastguard Worker dzn_GetMemoryWin32HandleKHR(VkDevice device,
3724*61046927SAndroid Build Coastguard Worker const VkMemoryGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3725*61046927SAndroid Build Coastguard Worker HANDLE *pHandle)
3726*61046927SAndroid Build Coastguard Worker {
3727*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, pGetWin32HandleInfo->memory);
3728*61046927SAndroid Build Coastguard Worker if (!mem->export_handle)
3729*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
3730*61046927SAndroid Build Coastguard Worker
3731*61046927SAndroid Build Coastguard Worker switch (pGetWin32HandleInfo->handleType) {
3732*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
3733*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
3734*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
3735*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
3736*61046927SAndroid Build Coastguard Worker if (!DuplicateHandle(GetCurrentProcess(), mem->export_handle, GetCurrentProcess(), pHandle,
3737*61046927SAndroid Build Coastguard Worker 0, false, DUPLICATE_SAME_ACCESS))
3738*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3739*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3740*61046927SAndroid Build Coastguard Worker default:
3741*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
3742*61046927SAndroid Build Coastguard Worker }
3743*61046927SAndroid Build Coastguard Worker }
3744*61046927SAndroid Build Coastguard Worker #else
3745*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetMemoryFdKHR(VkDevice device,const VkMemoryGetFdInfoKHR * pGetFdInfo,int * pFd)3746*61046927SAndroid Build Coastguard Worker dzn_GetMemoryFdKHR(VkDevice device,
3747*61046927SAndroid Build Coastguard Worker const VkMemoryGetFdInfoKHR *pGetFdInfo,
3748*61046927SAndroid Build Coastguard Worker int *pFd)
3749*61046927SAndroid Build Coastguard Worker {
3750*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, pGetFdInfo->memory);
3751*61046927SAndroid Build Coastguard Worker if (!mem->export_handle)
3752*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
3753*61046927SAndroid Build Coastguard Worker
3754*61046927SAndroid Build Coastguard Worker switch (pGetFdInfo->handleType) {
3755*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
3756*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
3757*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
3758*61046927SAndroid Build Coastguard Worker *pFd = (int)(intptr_t)mem->export_handle;
3759*61046927SAndroid Build Coastguard Worker mem->export_handle = (HANDLE)(intptr_t)-1;
3760*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3761*61046927SAndroid Build Coastguard Worker default:
3762*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
3763*61046927SAndroid Build Coastguard Worker }
3764*61046927SAndroid Build Coastguard Worker }
3765*61046927SAndroid Build Coastguard Worker #endif
3766*61046927SAndroid Build Coastguard Worker
3767*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
3768*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_GetMemoryWin32HandlePropertiesKHR(VkDevice _device,VkExternalMemoryHandleTypeFlagBits handleType,HANDLE handle,VkMemoryWin32HandlePropertiesKHR * pProperties)3769*61046927SAndroid Build Coastguard Worker dzn_GetMemoryWin32HandlePropertiesKHR(VkDevice _device,
3770*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits handleType,
3771*61046927SAndroid Build Coastguard Worker HANDLE handle,
3772*61046927SAndroid Build Coastguard Worker VkMemoryWin32HandlePropertiesKHR *pProperties)
3773*61046927SAndroid Build Coastguard Worker {
3774*61046927SAndroid Build Coastguard Worker #else
3775*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
3776*61046927SAndroid Build Coastguard Worker dzn_GetMemoryFdPropertiesKHR(VkDevice _device,
3777*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits handleType,
3778*61046927SAndroid Build Coastguard Worker int fd,
3779*61046927SAndroid Build Coastguard Worker VkMemoryFdPropertiesKHR *pProperties)
3780*61046927SAndroid Build Coastguard Worker {
3781*61046927SAndroid Build Coastguard Worker HANDLE handle = (HANDLE)(intptr_t)fd;
3782*61046927SAndroid Build Coastguard Worker #endif
3783*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
3784*61046927SAndroid Build Coastguard Worker IUnknown *opened_object;
3785*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device_OpenSharedHandle(device->dev, handle, &IID_IUnknown, (void **)&opened_object)))
3786*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
3787*61046927SAndroid Build Coastguard Worker
3788*61046927SAndroid Build Coastguard Worker VkResult result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
3789*61046927SAndroid Build Coastguard Worker ID3D12Resource *res = NULL;
3790*61046927SAndroid Build Coastguard Worker ID3D12Heap *heap = NULL;
3791*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(device->vk.physical, struct dzn_physical_device, vk);
3792*61046927SAndroid Build Coastguard Worker
3793*61046927SAndroid Build Coastguard Worker switch (handleType) {
3794*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
3795*61046927SAndroid Build Coastguard Worker (void)IUnknown_QueryInterface(opened_object, &IID_ID3D12Resource, (void **)&res);
3796*61046927SAndroid Build Coastguard Worker (void)IUnknown_QueryInterface(opened_object, &IID_ID3D12Heap, (void **)&heap);
3797*61046927SAndroid Build Coastguard Worker break;
3798*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
3799*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
3800*61046927SAndroid Build Coastguard Worker (void)IUnknown_QueryInterface(opened_object, &IID_ID3D12Resource, (void **)&res);
3801*61046927SAndroid Build Coastguard Worker break;
3802*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
3803*61046927SAndroid Build Coastguard Worker (void)IUnknown_QueryInterface(opened_object, &IID_ID3D12Heap, (void **)&heap);
3804*61046927SAndroid Build Coastguard Worker break;
3805*61046927SAndroid Build Coastguard Worker default:
3806*61046927SAndroid Build Coastguard Worker goto cleanup;
3807*61046927SAndroid Build Coastguard Worker }
3808*61046927SAndroid Build Coastguard Worker if (!res && !heap)
3809*61046927SAndroid Build Coastguard Worker goto cleanup;
3810*61046927SAndroid Build Coastguard Worker
3811*61046927SAndroid Build Coastguard Worker D3D12_HEAP_DESC heap_desc;
3812*61046927SAndroid Build Coastguard Worker if (res)
3813*61046927SAndroid Build Coastguard Worker ID3D12Resource_GetHeapProperties(res, &heap_desc.Properties, &heap_desc.Flags);
3814*61046927SAndroid Build Coastguard Worker else
3815*61046927SAndroid Build Coastguard Worker heap_desc = dzn_ID3D12Heap_GetDesc(heap);
3816*61046927SAndroid Build Coastguard Worker if (heap_desc.Properties.Type != D3D12_HEAP_TYPE_CUSTOM)
3817*61046927SAndroid Build Coastguard Worker heap_desc.Properties = dzn_ID3D12Device4_GetCustomHeapProperties(device->dev, 0, heap_desc.Properties.Type);
3818*61046927SAndroid Build Coastguard Worker
3819*61046927SAndroid Build Coastguard Worker pProperties->memoryTypeBits = 0;
3820*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pdev->memory.memoryTypeCount; ++i) {
3821*61046927SAndroid Build Coastguard Worker const VkMemoryType *mem_type = &pdev->memory.memoryTypes[i];
3822*61046927SAndroid Build Coastguard Worker D3D12_HEAP_PROPERTIES required_props = deduce_heap_properties_from_memory(pdev, mem_type);
3823*61046927SAndroid Build Coastguard Worker if (heap_desc.Properties.CPUPageProperty != required_props.CPUPageProperty ||
3824*61046927SAndroid Build Coastguard Worker heap_desc.Properties.MemoryPoolPreference != required_props.MemoryPoolPreference)
3825*61046927SAndroid Build Coastguard Worker continue;
3826*61046927SAndroid Build Coastguard Worker
3827*61046927SAndroid Build Coastguard Worker D3D12_HEAP_FLAGS required_flags = dzn_physical_device_get_heap_flags_for_mem_type(pdev, i);
3828*61046927SAndroid Build Coastguard Worker if ((heap_desc.Flags & required_flags) != required_flags)
3829*61046927SAndroid Build Coastguard Worker continue;
3830*61046927SAndroid Build Coastguard Worker
3831*61046927SAndroid Build Coastguard Worker pProperties->memoryTypeBits |= (1 << i);
3832*61046927SAndroid Build Coastguard Worker }
3833*61046927SAndroid Build Coastguard Worker result = VK_SUCCESS;
3834*61046927SAndroid Build Coastguard Worker
3835*61046927SAndroid Build Coastguard Worker cleanup:
3836*61046927SAndroid Build Coastguard Worker IUnknown_Release(opened_object);
3837*61046927SAndroid Build Coastguard Worker if (res)
3838*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(res);
3839*61046927SAndroid Build Coastguard Worker if (heap)
3840*61046927SAndroid Build Coastguard Worker ID3D12Heap_Release(heap);
3841*61046927SAndroid Build Coastguard Worker return result;
3842*61046927SAndroid Build Coastguard Worker }
3843*61046927SAndroid Build Coastguard Worker
3844*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
3845*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
3846*61046927SAndroid Build Coastguard Worker dzn_GetMemoryHostPointerPropertiesEXT(VkDevice _device,
3847*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits handleType,
3848*61046927SAndroid Build Coastguard Worker const void *pHostPointer,
3849*61046927SAndroid Build Coastguard Worker VkMemoryHostPointerPropertiesEXT *pMemoryHostPointerProperties)
3850*61046927SAndroid Build Coastguard Worker {
3851*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
3852*61046927SAndroid Build Coastguard Worker
3853*61046927SAndroid Build Coastguard Worker if (!device->dev13)
3854*61046927SAndroid Build Coastguard Worker return VK_ERROR_FEATURE_NOT_PRESENT;
3855*61046927SAndroid Build Coastguard Worker
3856*61046927SAndroid Build Coastguard Worker ID3D12Heap *heap;
3857*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device13_OpenExistingHeapFromAddress1(device->dev13, pHostPointer, 1, &IID_ID3D12Heap, (void **)&heap)))
3858*61046927SAndroid Build Coastguard Worker return VK_ERROR_INVALID_EXTERNAL_HANDLE;
3859*61046927SAndroid Build Coastguard Worker
3860*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(device->vk.physical, struct dzn_physical_device, vk);
3861*61046927SAndroid Build Coastguard Worker D3D12_HEAP_DESC heap_desc = dzn_ID3D12Heap_GetDesc(heap);
3862*61046927SAndroid Build Coastguard Worker pMemoryHostPointerProperties->memoryTypeBits = 0;
3863*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pdev->memory.memoryTypeCount; ++i) {
3864*61046927SAndroid Build Coastguard Worker const VkMemoryType *mem_type = &pdev->memory.memoryTypes[i];
3865*61046927SAndroid Build Coastguard Worker D3D12_HEAP_PROPERTIES required_props = deduce_heap_properties_from_memory(pdev, mem_type);
3866*61046927SAndroid Build Coastguard Worker if (heap_desc.Properties.CPUPageProperty != required_props.CPUPageProperty ||
3867*61046927SAndroid Build Coastguard Worker heap_desc.Properties.MemoryPoolPreference != required_props.MemoryPoolPreference)
3868*61046927SAndroid Build Coastguard Worker continue;
3869*61046927SAndroid Build Coastguard Worker
3870*61046927SAndroid Build Coastguard Worker pMemoryHostPointerProperties->memoryTypeBits |= (1 << i);
3871*61046927SAndroid Build Coastguard Worker }
3872*61046927SAndroid Build Coastguard Worker ID3D12Heap_Release(heap);
3873*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3874*61046927SAndroid Build Coastguard Worker }
3875*61046927SAndroid Build Coastguard Worker #endif
3876