1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * based in part on anv driver which is:
7*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker */
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker #include "tu_device.h"
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm_fourcc.h"
13*61046927SAndroid Build Coastguard Worker #include "fdl/freedreno_layout.h"
14*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
15*61046927SAndroid Build Coastguard Worker #include <poll.h>
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker #include "git_sha1.h"
18*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
19*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
20*61046927SAndroid Build Coastguard Worker #include "util/hex.h"
21*61046927SAndroid Build Coastguard Worker #include "util/driconf.h"
22*61046927SAndroid Build Coastguard Worker #include "util/os_misc.h"
23*61046927SAndroid Build Coastguard Worker #include "util/u_process.h"
24*61046927SAndroid Build Coastguard Worker #include "vk_android.h"
25*61046927SAndroid Build Coastguard Worker #include "vk_shader_module.h"
26*61046927SAndroid Build Coastguard Worker #include "vk_sampler.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker /* for fd_get_driver/device_uuid() */
30*61046927SAndroid Build Coastguard Worker #include "freedreno/common/freedreno_uuid.h"
31*61046927SAndroid Build Coastguard Worker #include "freedreno/common/freedreno_stompable_regs.h"
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "tu_clear_blit.h"
34*61046927SAndroid Build Coastguard Worker #include "tu_cmd_buffer.h"
35*61046927SAndroid Build Coastguard Worker #include "tu_cs.h"
36*61046927SAndroid Build Coastguard Worker #include "tu_descriptor_set.h"
37*61046927SAndroid Build Coastguard Worker #include "tu_dynamic_rendering.h"
38*61046927SAndroid Build Coastguard Worker #include "tu_image.h"
39*61046927SAndroid Build Coastguard Worker #include "tu_pass.h"
40*61046927SAndroid Build Coastguard Worker #include "tu_query_pool.h"
41*61046927SAndroid Build Coastguard Worker #include "tu_rmv.h"
42*61046927SAndroid Build Coastguard Worker #include "tu_tracepoints.h"
43*61046927SAndroid Build Coastguard Worker #include "tu_wsi.h"
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
46*61046927SAndroid Build Coastguard Worker #include "util/u_gralloc/u_gralloc.h"
47*61046927SAndroid Build Coastguard Worker #include <vndk/hardware_buffer.h>
48*61046927SAndroid Build Coastguard Worker #endif
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker uint64_t os_page_size = 4096;
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker static int
tu_device_get_cache_uuid(struct tu_physical_device * device,void * uuid)53*61046927SAndroid Build Coastguard Worker tu_device_get_cache_uuid(struct tu_physical_device *device, void *uuid)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker struct mesa_sha1 ctx;
56*61046927SAndroid Build Coastguard Worker unsigned char sha1[20];
57*61046927SAndroid Build Coastguard Worker /* Note: IR3_SHADER_DEBUG also affects compilation, but it's not
58*61046927SAndroid Build Coastguard Worker * initialized until after compiler creation so we have to add it to the
59*61046927SAndroid Build Coastguard Worker * shader hash instead, since the compiler is only created with the logical
60*61046927SAndroid Build Coastguard Worker * device.
61*61046927SAndroid Build Coastguard Worker */
62*61046927SAndroid Build Coastguard Worker uint64_t driver_flags = tu_env.debug & TU_DEBUG_NOMULTIPOS;
63*61046927SAndroid Build Coastguard Worker uint16_t family = fd_dev_gpu_id(&device->dev_id);
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker memset(uuid, 0, VK_UUID_SIZE);
66*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&ctx);
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker if (!disk_cache_get_function_identifier((void *)tu_device_get_cache_uuid, &ctx))
69*61046927SAndroid Build Coastguard Worker return -1;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&ctx, &family, sizeof(family));
72*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&ctx, &driver_flags, sizeof(driver_flags));
73*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&ctx, sha1);
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker memcpy(uuid, sha1, VK_UUID_SIZE);
76*61046927SAndroid Build Coastguard Worker return 0;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker #define TU_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION)
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_EnumerateInstanceVersion(uint32_t * pApiVersion)82*61046927SAndroid Build Coastguard Worker tu_EnumerateInstanceVersion(uint32_t *pApiVersion)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker *pApiVersion = TU_API_VERSION;
85*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker static const struct vk_instance_extension_table tu_instance_extensions_supported = { .table = {
89*61046927SAndroid Build Coastguard Worker .KHR_device_group_creation = true,
90*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
91*61046927SAndroid Build Coastguard Worker .KHR_display = true,
92*61046927SAndroid Build Coastguard Worker #endif
93*61046927SAndroid Build Coastguard Worker .KHR_external_fence_capabilities = true,
94*61046927SAndroid Build Coastguard Worker .KHR_external_memory_capabilities = true,
95*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_capabilities = true,
96*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
97*61046927SAndroid Build Coastguard Worker .KHR_get_display_properties2 = true,
98*61046927SAndroid Build Coastguard Worker #endif
99*61046927SAndroid Build Coastguard Worker .KHR_get_physical_device_properties2 = true,
100*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
101*61046927SAndroid Build Coastguard Worker .KHR_get_surface_capabilities2 = true,
102*61046927SAndroid Build Coastguard Worker .KHR_surface = true,
103*61046927SAndroid Build Coastguard Worker .KHR_surface_protected_capabilities = true,
104*61046927SAndroid Build Coastguard Worker #endif
105*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WAYLAND_KHR
106*61046927SAndroid Build Coastguard Worker .KHR_wayland_surface = true,
107*61046927SAndroid Build Coastguard Worker #endif
108*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XCB_KHR
109*61046927SAndroid Build Coastguard Worker .KHR_xcb_surface = true,
110*61046927SAndroid Build Coastguard Worker #endif
111*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_KHR
112*61046927SAndroid Build Coastguard Worker .KHR_xlib_surface = true,
113*61046927SAndroid Build Coastguard Worker #endif
114*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
115*61046927SAndroid Build Coastguard Worker .EXT_acquire_drm_display = true,
116*61046927SAndroid Build Coastguard Worker #endif
117*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
118*61046927SAndroid Build Coastguard Worker .EXT_acquire_xlib_display = true,
119*61046927SAndroid Build Coastguard Worker #endif
120*61046927SAndroid Build Coastguard Worker .EXT_debug_report = true,
121*61046927SAndroid Build Coastguard Worker .EXT_debug_utils = true,
122*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
123*61046927SAndroid Build Coastguard Worker .EXT_direct_mode_display = true,
124*61046927SAndroid Build Coastguard Worker .EXT_display_surface_counter = true,
125*61046927SAndroid Build Coastguard Worker #endif
126*61046927SAndroid Build Coastguard Worker #ifndef VK_USE_PLATFORM_WIN32_KHR
127*61046927SAndroid Build Coastguard Worker .EXT_headless_surface = true,
128*61046927SAndroid Build Coastguard Worker #endif
129*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
130*61046927SAndroid Build Coastguard Worker .EXT_surface_maintenance1 = true,
131*61046927SAndroid Build Coastguard Worker .EXT_swapchain_colorspace = true,
132*61046927SAndroid Build Coastguard Worker #endif
133*61046927SAndroid Build Coastguard Worker } };
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker static bool
is_kgsl(struct tu_instance * instance)136*61046927SAndroid Build Coastguard Worker is_kgsl(struct tu_instance *instance)
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker return strcmp(instance->knl->name, "kgsl") == 0;
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker static void
get_device_extensions(const struct tu_physical_device * device,struct vk_device_extension_table * ext)142*61046927SAndroid Build Coastguard Worker get_device_extensions(const struct tu_physical_device *device,
143*61046927SAndroid Build Coastguard Worker struct vk_device_extension_table *ext)
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker *ext = (struct vk_device_extension_table) { .table = {
146*61046927SAndroid Build Coastguard Worker .KHR_8bit_storage = device->info->a7xx.storage_8bit,
147*61046927SAndroid Build Coastguard Worker .KHR_16bit_storage = device->info->a6xx.storage_16bit,
148*61046927SAndroid Build Coastguard Worker .KHR_bind_memory2 = true,
149*61046927SAndroid Build Coastguard Worker .KHR_buffer_device_address = true,
150*61046927SAndroid Build Coastguard Worker .KHR_copy_commands2 = true,
151*61046927SAndroid Build Coastguard Worker .KHR_create_renderpass2 = true,
152*61046927SAndroid Build Coastguard Worker .KHR_dedicated_allocation = true,
153*61046927SAndroid Build Coastguard Worker .KHR_depth_stencil_resolve = true,
154*61046927SAndroid Build Coastguard Worker .KHR_descriptor_update_template = true,
155*61046927SAndroid Build Coastguard Worker .KHR_device_group = true,
156*61046927SAndroid Build Coastguard Worker .KHR_draw_indirect_count = true,
157*61046927SAndroid Build Coastguard Worker .KHR_driver_properties = true,
158*61046927SAndroid Build Coastguard Worker .KHR_dynamic_rendering = true,
159*61046927SAndroid Build Coastguard Worker .KHR_external_fence = true,
160*61046927SAndroid Build Coastguard Worker .KHR_external_fence_fd = true,
161*61046927SAndroid Build Coastguard Worker .KHR_external_memory = true,
162*61046927SAndroid Build Coastguard Worker .KHR_external_memory_fd = true,
163*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore = true,
164*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_fd = true,
165*61046927SAndroid Build Coastguard Worker .KHR_format_feature_flags2 = true,
166*61046927SAndroid Build Coastguard Worker .KHR_get_memory_requirements2 = true,
167*61046927SAndroid Build Coastguard Worker .KHR_global_priority = true,
168*61046927SAndroid Build Coastguard Worker .KHR_image_format_list = true,
169*61046927SAndroid Build Coastguard Worker .KHR_imageless_framebuffer = true,
170*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
171*61046927SAndroid Build Coastguard Worker .KHR_incremental_present = true,
172*61046927SAndroid Build Coastguard Worker #endif
173*61046927SAndroid Build Coastguard Worker .KHR_index_type_uint8 = true,
174*61046927SAndroid Build Coastguard Worker .KHR_line_rasterization = true,
175*61046927SAndroid Build Coastguard Worker .KHR_load_store_op_none = true,
176*61046927SAndroid Build Coastguard Worker .KHR_maintenance1 = true,
177*61046927SAndroid Build Coastguard Worker .KHR_maintenance2 = true,
178*61046927SAndroid Build Coastguard Worker .KHR_maintenance3 = true,
179*61046927SAndroid Build Coastguard Worker .KHR_maintenance4 = true,
180*61046927SAndroid Build Coastguard Worker .KHR_maintenance5 = true,
181*61046927SAndroid Build Coastguard Worker .KHR_maintenance6 = true,
182*61046927SAndroid Build Coastguard Worker .KHR_map_memory2 = true,
183*61046927SAndroid Build Coastguard Worker .KHR_multiview = TU_DEBUG(NOCONFORM) ? true : device->info->a6xx.has_hw_multiview,
184*61046927SAndroid Build Coastguard Worker .KHR_performance_query = TU_DEBUG(PERFC),
185*61046927SAndroid Build Coastguard Worker .KHR_pipeline_executable_properties = true,
186*61046927SAndroid Build Coastguard Worker .KHR_pipeline_library = true,
187*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
188*61046927SAndroid Build Coastguard Worker /* Hide these behind dri configs for now since we cannot implement it reliably on
189*61046927SAndroid Build Coastguard Worker * all surfaces yet. There is no surface capability query for present wait/id,
190*61046927SAndroid Build Coastguard Worker * but the feature is useful enough to hide behind an opt-in mechanism for now.
191*61046927SAndroid Build Coastguard Worker * If the instance only enables surface extensions that unconditionally support present wait,
192*61046927SAndroid Build Coastguard Worker * we can also expose the extension that way. */
193*61046927SAndroid Build Coastguard Worker .KHR_present_id = (driQueryOptionb(&device->instance->dri_options, "vk_khr_present_wait") ||
194*61046927SAndroid Build Coastguard Worker wsi_common_vk_instance_supports_present_wait(&device->instance->vk)),
195*61046927SAndroid Build Coastguard Worker .KHR_present_wait = (driQueryOptionb(&device->instance->dri_options, "vk_khr_present_wait") ||
196*61046927SAndroid Build Coastguard Worker wsi_common_vk_instance_supports_present_wait(&device->instance->vk)),
197*61046927SAndroid Build Coastguard Worker #endif
198*61046927SAndroid Build Coastguard Worker .KHR_push_descriptor = true,
199*61046927SAndroid Build Coastguard Worker .KHR_relaxed_block_layout = true,
200*61046927SAndroid Build Coastguard Worker .KHR_sampler_mirror_clamp_to_edge = true,
201*61046927SAndroid Build Coastguard Worker .KHR_sampler_ycbcr_conversion = true,
202*61046927SAndroid Build Coastguard Worker .KHR_separate_depth_stencil_layouts = true,
203*61046927SAndroid Build Coastguard Worker .KHR_shader_draw_parameters = true,
204*61046927SAndroid Build Coastguard Worker .KHR_shader_expect_assume = true,
205*61046927SAndroid Build Coastguard Worker .KHR_shader_float16_int8 = true,
206*61046927SAndroid Build Coastguard Worker .KHR_shader_float_controls = true,
207*61046927SAndroid Build Coastguard Worker .KHR_shader_float_controls2 = true,
208*61046927SAndroid Build Coastguard Worker .KHR_shader_integer_dot_product = true,
209*61046927SAndroid Build Coastguard Worker .KHR_shader_non_semantic_info = true,
210*61046927SAndroid Build Coastguard Worker .KHR_shader_relaxed_extended_instruction = true,
211*61046927SAndroid Build Coastguard Worker .KHR_shader_subgroup_extended_types = true,
212*61046927SAndroid Build Coastguard Worker .KHR_shader_subgroup_uniform_control_flow = true,
213*61046927SAndroid Build Coastguard Worker .KHR_shader_terminate_invocation = true,
214*61046927SAndroid Build Coastguard Worker .KHR_spirv_1_4 = true,
215*61046927SAndroid Build Coastguard Worker .KHR_storage_buffer_storage_class = true,
216*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
217*61046927SAndroid Build Coastguard Worker .KHR_swapchain = true,
218*61046927SAndroid Build Coastguard Worker .KHR_swapchain_mutable_format = true,
219*61046927SAndroid Build Coastguard Worker #endif
220*61046927SAndroid Build Coastguard Worker .KHR_synchronization2 = true,
221*61046927SAndroid Build Coastguard Worker .KHR_timeline_semaphore = true,
222*61046927SAndroid Build Coastguard Worker .KHR_uniform_buffer_standard_layout = true,
223*61046927SAndroid Build Coastguard Worker .KHR_variable_pointers = true,
224*61046927SAndroid Build Coastguard Worker .KHR_vertex_attribute_divisor = true,
225*61046927SAndroid Build Coastguard Worker .KHR_vulkan_memory_model = true,
226*61046927SAndroid Build Coastguard Worker .KHR_workgroup_memory_explicit_layout = true,
227*61046927SAndroid Build Coastguard Worker .KHR_zero_initialize_workgroup_memory = true,
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker .EXT_4444_formats = true,
230*61046927SAndroid Build Coastguard Worker .EXT_attachment_feedback_loop_dynamic_state = true,
231*61046927SAndroid Build Coastguard Worker .EXT_attachment_feedback_loop_layout = true,
232*61046927SAndroid Build Coastguard Worker .EXT_border_color_swizzle = true,
233*61046927SAndroid Build Coastguard Worker .EXT_color_write_enable = true,
234*61046927SAndroid Build Coastguard Worker .EXT_conditional_rendering = true,
235*61046927SAndroid Build Coastguard Worker .EXT_custom_border_color = true,
236*61046927SAndroid Build Coastguard Worker .EXT_depth_clamp_zero_one = true,
237*61046927SAndroid Build Coastguard Worker .EXT_depth_clip_control = true,
238*61046927SAndroid Build Coastguard Worker .EXT_depth_clip_enable = true,
239*61046927SAndroid Build Coastguard Worker .EXT_descriptor_buffer = true,
240*61046927SAndroid Build Coastguard Worker .EXT_descriptor_indexing = true,
241*61046927SAndroid Build Coastguard Worker .EXT_device_address_binding_report = true,
242*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
243*61046927SAndroid Build Coastguard Worker .EXT_display_control = true,
244*61046927SAndroid Build Coastguard Worker #endif
245*61046927SAndroid Build Coastguard Worker .EXT_extended_dynamic_state = true,
246*61046927SAndroid Build Coastguard Worker .EXT_extended_dynamic_state2 = true,
247*61046927SAndroid Build Coastguard Worker .EXT_extended_dynamic_state3 = true,
248*61046927SAndroid Build Coastguard Worker .EXT_external_memory_dma_buf = true,
249*61046927SAndroid Build Coastguard Worker .EXT_filter_cubic = device->info->a6xx.has_tex_filter_cubic,
250*61046927SAndroid Build Coastguard Worker .EXT_fragment_density_map = true,
251*61046927SAndroid Build Coastguard Worker .EXT_global_priority = true,
252*61046927SAndroid Build Coastguard Worker .EXT_global_priority_query = true,
253*61046927SAndroid Build Coastguard Worker .EXT_graphics_pipeline_library = true,
254*61046927SAndroid Build Coastguard Worker .EXT_host_query_reset = true,
255*61046927SAndroid Build Coastguard Worker .EXT_image_2d_view_of_3d = true,
256*61046927SAndroid Build Coastguard Worker .EXT_image_drm_format_modifier = true,
257*61046927SAndroid Build Coastguard Worker .EXT_image_robustness = true,
258*61046927SAndroid Build Coastguard Worker .EXT_image_view_min_lod = true,
259*61046927SAndroid Build Coastguard Worker .EXT_index_type_uint8 = true,
260*61046927SAndroid Build Coastguard Worker .EXT_inline_uniform_block = true,
261*61046927SAndroid Build Coastguard Worker .EXT_legacy_dithering = true,
262*61046927SAndroid Build Coastguard Worker .EXT_legacy_vertex_attributes = true,
263*61046927SAndroid Build Coastguard Worker .EXT_line_rasterization = true,
264*61046927SAndroid Build Coastguard Worker .EXT_load_store_op_none = true,
265*61046927SAndroid Build Coastguard Worker .EXT_map_memory_placed = true,
266*61046927SAndroid Build Coastguard Worker .EXT_memory_budget = true,
267*61046927SAndroid Build Coastguard Worker .EXT_multi_draw = true,
268*61046927SAndroid Build Coastguard Worker .EXT_mutable_descriptor_type = true,
269*61046927SAndroid Build Coastguard Worker .EXT_nested_command_buffer = true,
270*61046927SAndroid Build Coastguard Worker .EXT_non_seamless_cube_map = true,
271*61046927SAndroid Build Coastguard Worker .EXT_physical_device_drm = !is_kgsl(device->instance),
272*61046927SAndroid Build Coastguard Worker .EXT_pipeline_creation_cache_control = true,
273*61046927SAndroid Build Coastguard Worker .EXT_pipeline_creation_feedback = true,
274*61046927SAndroid Build Coastguard Worker .EXT_post_depth_coverage = true,
275*61046927SAndroid Build Coastguard Worker .EXT_primitive_topology_list_restart = true,
276*61046927SAndroid Build Coastguard Worker .EXT_primitives_generated_query = true,
277*61046927SAndroid Build Coastguard Worker .EXT_private_data = true,
278*61046927SAndroid Build Coastguard Worker .EXT_provoking_vertex = true,
279*61046927SAndroid Build Coastguard Worker .EXT_queue_family_foreign = true,
280*61046927SAndroid Build Coastguard Worker .EXT_rasterization_order_attachment_access = true,
281*61046927SAndroid Build Coastguard Worker .EXT_robustness2 = true,
282*61046927SAndroid Build Coastguard Worker .EXT_sample_locations = device->info->a6xx.has_sample_locations,
283*61046927SAndroid Build Coastguard Worker .EXT_sampler_filter_minmax = device->info->a6xx.has_sampler_minmax,
284*61046927SAndroid Build Coastguard Worker .EXT_scalar_block_layout = true,
285*61046927SAndroid Build Coastguard Worker .EXT_separate_stencil_usage = true,
286*61046927SAndroid Build Coastguard Worker .EXT_shader_demote_to_helper_invocation = true,
287*61046927SAndroid Build Coastguard Worker .EXT_shader_module_identifier = true,
288*61046927SAndroid Build Coastguard Worker .EXT_shader_replicated_composites = true,
289*61046927SAndroid Build Coastguard Worker .EXT_shader_stencil_export = true,
290*61046927SAndroid Build Coastguard Worker .EXT_shader_viewport_index_layer = TU_DEBUG(NOCONFORM) ? true : device->info->a6xx.has_hw_multiview,
291*61046927SAndroid Build Coastguard Worker .EXT_subgroup_size_control = true,
292*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
293*61046927SAndroid Build Coastguard Worker .EXT_swapchain_maintenance1 = true,
294*61046927SAndroid Build Coastguard Worker #endif
295*61046927SAndroid Build Coastguard Worker .EXT_texel_buffer_alignment = true,
296*61046927SAndroid Build Coastguard Worker .EXT_tooling_info = true,
297*61046927SAndroid Build Coastguard Worker .EXT_transform_feedback = true,
298*61046927SAndroid Build Coastguard Worker .EXT_vertex_attribute_divisor = true,
299*61046927SAndroid Build Coastguard Worker .EXT_vertex_input_dynamic_state = true,
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker /* For Graphics Flight Recorder (GFR) */
302*61046927SAndroid Build Coastguard Worker .AMD_buffer_marker = true,
303*61046927SAndroid Build Coastguard Worker .ARM_rasterization_order_attachment_access = true,
304*61046927SAndroid Build Coastguard Worker .GOOGLE_decorate_string = true,
305*61046927SAndroid Build Coastguard Worker .GOOGLE_hlsl_functionality1 = true,
306*61046927SAndroid Build Coastguard Worker .GOOGLE_user_type = true,
307*61046927SAndroid Build Coastguard Worker .IMG_filter_cubic = device->info->a6xx.has_tex_filter_cubic,
308*61046927SAndroid Build Coastguard Worker .VALVE_mutable_descriptor_type = true,
309*61046927SAndroid Build Coastguard Worker } };
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
312*61046927SAndroid Build Coastguard Worker if (vk_android_get_ugralloc() != NULL) {
313*61046927SAndroid Build Coastguard Worker ext->ANDROID_external_memory_android_hardware_buffer = true,
314*61046927SAndroid Build Coastguard Worker ext->ANDROID_native_buffer = true;
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker #endif
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker static void
tu_get_features(struct tu_physical_device * pdevice,struct vk_features * features)320*61046927SAndroid Build Coastguard Worker tu_get_features(struct tu_physical_device *pdevice,
321*61046927SAndroid Build Coastguard Worker struct vk_features *features)
322*61046927SAndroid Build Coastguard Worker {
323*61046927SAndroid Build Coastguard Worker *features = (struct vk_features) { false };
324*61046927SAndroid Build Coastguard Worker
325*61046927SAndroid Build Coastguard Worker /* Vulkan 1.0 */
326*61046927SAndroid Build Coastguard Worker features->robustBufferAccess = true;
327*61046927SAndroid Build Coastguard Worker features->fullDrawIndexUint32 = true;
328*61046927SAndroid Build Coastguard Worker features->imageCubeArray = true;
329*61046927SAndroid Build Coastguard Worker features->independentBlend = true;
330*61046927SAndroid Build Coastguard Worker features->geometryShader = true;
331*61046927SAndroid Build Coastguard Worker features->tessellationShader = true;
332*61046927SAndroid Build Coastguard Worker features->sampleRateShading = true;
333*61046927SAndroid Build Coastguard Worker features->dualSrcBlend = true;
334*61046927SAndroid Build Coastguard Worker features->logicOp = true;
335*61046927SAndroid Build Coastguard Worker features->multiDrawIndirect = true;
336*61046927SAndroid Build Coastguard Worker features->drawIndirectFirstInstance = true;
337*61046927SAndroid Build Coastguard Worker features->depthClamp = true;
338*61046927SAndroid Build Coastguard Worker features->depthBiasClamp = true;
339*61046927SAndroid Build Coastguard Worker features->fillModeNonSolid = true;
340*61046927SAndroid Build Coastguard Worker features->depthBounds = true;
341*61046927SAndroid Build Coastguard Worker features->wideLines = pdevice->info->a6xx.line_width_max > 1.0;
342*61046927SAndroid Build Coastguard Worker features->largePoints = true;
343*61046927SAndroid Build Coastguard Worker features->alphaToOne = true;
344*61046927SAndroid Build Coastguard Worker features->multiViewport = true;
345*61046927SAndroid Build Coastguard Worker features->samplerAnisotropy = true;
346*61046927SAndroid Build Coastguard Worker features->textureCompressionETC2 = true;
347*61046927SAndroid Build Coastguard Worker features->textureCompressionASTC_LDR = true;
348*61046927SAndroid Build Coastguard Worker features->textureCompressionBC = true;
349*61046927SAndroid Build Coastguard Worker features->occlusionQueryPrecise = true;
350*61046927SAndroid Build Coastguard Worker features->pipelineStatisticsQuery = true;
351*61046927SAndroid Build Coastguard Worker features->vertexPipelineStoresAndAtomics = true;
352*61046927SAndroid Build Coastguard Worker features->fragmentStoresAndAtomics = true;
353*61046927SAndroid Build Coastguard Worker features->shaderTessellationAndGeometryPointSize = true;
354*61046927SAndroid Build Coastguard Worker features->shaderImageGatherExtended = true;
355*61046927SAndroid Build Coastguard Worker features->shaderStorageImageExtendedFormats = true;
356*61046927SAndroid Build Coastguard Worker features->shaderStorageImageMultisample = false;
357*61046927SAndroid Build Coastguard Worker features->shaderStorageImageReadWithoutFormat = true;
358*61046927SAndroid Build Coastguard Worker features->shaderStorageImageWriteWithoutFormat = true;
359*61046927SAndroid Build Coastguard Worker features->shaderUniformBufferArrayDynamicIndexing = true;
360*61046927SAndroid Build Coastguard Worker features->shaderSampledImageArrayDynamicIndexing = true;
361*61046927SAndroid Build Coastguard Worker features->shaderStorageBufferArrayDynamicIndexing = true;
362*61046927SAndroid Build Coastguard Worker features->shaderStorageImageArrayDynamicIndexing = true;
363*61046927SAndroid Build Coastguard Worker features->shaderClipDistance = true;
364*61046927SAndroid Build Coastguard Worker features->shaderCullDistance = true;
365*61046927SAndroid Build Coastguard Worker features->shaderFloat64 = false;
366*61046927SAndroid Build Coastguard Worker features->shaderInt64 = false;
367*61046927SAndroid Build Coastguard Worker features->shaderInt16 = true;
368*61046927SAndroid Build Coastguard Worker features->sparseBinding = false;
369*61046927SAndroid Build Coastguard Worker features->variableMultisampleRate = true;
370*61046927SAndroid Build Coastguard Worker features->inheritedQueries = true;
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker /* Vulkan 1.1 */
373*61046927SAndroid Build Coastguard Worker features->storageBuffer16BitAccess = pdevice->info->a6xx.storage_16bit;
374*61046927SAndroid Build Coastguard Worker features->uniformAndStorageBuffer16BitAccess = false;
375*61046927SAndroid Build Coastguard Worker features->storagePushConstant16 = false;
376*61046927SAndroid Build Coastguard Worker features->storageInputOutput16 = false;
377*61046927SAndroid Build Coastguard Worker features->multiview = true;
378*61046927SAndroid Build Coastguard Worker features->multiviewGeometryShader = false;
379*61046927SAndroid Build Coastguard Worker features->multiviewTessellationShader = false;
380*61046927SAndroid Build Coastguard Worker features->variablePointersStorageBuffer = true;
381*61046927SAndroid Build Coastguard Worker features->variablePointers = true;
382*61046927SAndroid Build Coastguard Worker features->protectedMemory = false;
383*61046927SAndroid Build Coastguard Worker features->samplerYcbcrConversion = true;
384*61046927SAndroid Build Coastguard Worker features->shaderDrawParameters = true;
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker /* Vulkan 1.2 */
387*61046927SAndroid Build Coastguard Worker features->samplerMirrorClampToEdge = true;
388*61046927SAndroid Build Coastguard Worker features->drawIndirectCount = true;
389*61046927SAndroid Build Coastguard Worker features->storageBuffer8BitAccess = pdevice->info->a7xx.storage_8bit;
390*61046927SAndroid Build Coastguard Worker features->uniformAndStorageBuffer8BitAccess = false;
391*61046927SAndroid Build Coastguard Worker features->storagePushConstant8 = false;
392*61046927SAndroid Build Coastguard Worker features->shaderBufferInt64Atomics = false;
393*61046927SAndroid Build Coastguard Worker features->shaderSharedInt64Atomics = false;
394*61046927SAndroid Build Coastguard Worker features->shaderFloat16 = true;
395*61046927SAndroid Build Coastguard Worker features->shaderInt8 = true;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker features->descriptorIndexing = true;
398*61046927SAndroid Build Coastguard Worker features->shaderInputAttachmentArrayDynamicIndexing = false;
399*61046927SAndroid Build Coastguard Worker features->shaderUniformTexelBufferArrayDynamicIndexing = true;
400*61046927SAndroid Build Coastguard Worker features->shaderStorageTexelBufferArrayDynamicIndexing = true;
401*61046927SAndroid Build Coastguard Worker features->shaderUniformBufferArrayNonUniformIndexing = true;
402*61046927SAndroid Build Coastguard Worker features->shaderSampledImageArrayNonUniformIndexing = true;
403*61046927SAndroid Build Coastguard Worker features->shaderStorageBufferArrayNonUniformIndexing = true;
404*61046927SAndroid Build Coastguard Worker features->shaderStorageImageArrayNonUniformIndexing = true;
405*61046927SAndroid Build Coastguard Worker features->shaderInputAttachmentArrayNonUniformIndexing = false;
406*61046927SAndroid Build Coastguard Worker features->shaderUniformTexelBufferArrayNonUniformIndexing = true;
407*61046927SAndroid Build Coastguard Worker features->shaderStorageTexelBufferArrayNonUniformIndexing = true;
408*61046927SAndroid Build Coastguard Worker features->descriptorBindingUniformBufferUpdateAfterBind = true;
409*61046927SAndroid Build Coastguard Worker features->descriptorBindingSampledImageUpdateAfterBind = true;
410*61046927SAndroid Build Coastguard Worker features->descriptorBindingStorageImageUpdateAfterBind = true;
411*61046927SAndroid Build Coastguard Worker features->descriptorBindingStorageBufferUpdateAfterBind = true;
412*61046927SAndroid Build Coastguard Worker features->descriptorBindingUniformTexelBufferUpdateAfterBind = true;
413*61046927SAndroid Build Coastguard Worker features->descriptorBindingStorageTexelBufferUpdateAfterBind = true;
414*61046927SAndroid Build Coastguard Worker features->descriptorBindingUpdateUnusedWhilePending = true;
415*61046927SAndroid Build Coastguard Worker features->descriptorBindingPartiallyBound = true;
416*61046927SAndroid Build Coastguard Worker features->descriptorBindingVariableDescriptorCount = true;
417*61046927SAndroid Build Coastguard Worker features->runtimeDescriptorArray = true;
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker features->samplerFilterMinmax =
420*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_sampler_minmax;
421*61046927SAndroid Build Coastguard Worker features->scalarBlockLayout = true;
422*61046927SAndroid Build Coastguard Worker features->imagelessFramebuffer = true;
423*61046927SAndroid Build Coastguard Worker features->uniformBufferStandardLayout = true;
424*61046927SAndroid Build Coastguard Worker features->shaderSubgroupExtendedTypes = true;
425*61046927SAndroid Build Coastguard Worker features->separateDepthStencilLayouts = true;
426*61046927SAndroid Build Coastguard Worker features->hostQueryReset = true;
427*61046927SAndroid Build Coastguard Worker features->timelineSemaphore = true;
428*61046927SAndroid Build Coastguard Worker features->bufferDeviceAddress = true;
429*61046927SAndroid Build Coastguard Worker features->bufferDeviceAddressCaptureReplay = pdevice->has_set_iova;
430*61046927SAndroid Build Coastguard Worker features->bufferDeviceAddressMultiDevice = false;
431*61046927SAndroid Build Coastguard Worker features->vulkanMemoryModel = true;
432*61046927SAndroid Build Coastguard Worker features->vulkanMemoryModelDeviceScope = true;
433*61046927SAndroid Build Coastguard Worker features->vulkanMemoryModelAvailabilityVisibilityChains = true;
434*61046927SAndroid Build Coastguard Worker features->shaderOutputViewportIndex = true;
435*61046927SAndroid Build Coastguard Worker features->shaderOutputLayer = true;
436*61046927SAndroid Build Coastguard Worker features->subgroupBroadcastDynamicId = true;
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker /* Vulkan 1.3 */
439*61046927SAndroid Build Coastguard Worker features->robustImageAccess = true;
440*61046927SAndroid Build Coastguard Worker features->inlineUniformBlock = true;
441*61046927SAndroid Build Coastguard Worker features->descriptorBindingInlineUniformBlockUpdateAfterBind = true;
442*61046927SAndroid Build Coastguard Worker features->pipelineCreationCacheControl = true;
443*61046927SAndroid Build Coastguard Worker features->privateData = true;
444*61046927SAndroid Build Coastguard Worker features->shaderDemoteToHelperInvocation = true;
445*61046927SAndroid Build Coastguard Worker features->shaderTerminateInvocation = true;
446*61046927SAndroid Build Coastguard Worker features->subgroupSizeControl = true;
447*61046927SAndroid Build Coastguard Worker features->computeFullSubgroups = true;
448*61046927SAndroid Build Coastguard Worker features->synchronization2 = true;
449*61046927SAndroid Build Coastguard Worker features->textureCompressionASTC_HDR = false;
450*61046927SAndroid Build Coastguard Worker features->shaderZeroInitializeWorkgroupMemory = true;
451*61046927SAndroid Build Coastguard Worker features->dynamicRendering = true;
452*61046927SAndroid Build Coastguard Worker features->shaderIntegerDotProduct = true;
453*61046927SAndroid Build Coastguard Worker features->maintenance4 = true;
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Worker /* VK_KHR_index_type_uint8 */
456*61046927SAndroid Build Coastguard Worker features->indexTypeUint8 = true;
457*61046927SAndroid Build Coastguard Worker
458*61046927SAndroid Build Coastguard Worker /* VK_KHR_line_rasterization */
459*61046927SAndroid Build Coastguard Worker features->rectangularLines = true;
460*61046927SAndroid Build Coastguard Worker features->bresenhamLines = true;
461*61046927SAndroid Build Coastguard Worker features->smoothLines = false;
462*61046927SAndroid Build Coastguard Worker features->stippledRectangularLines = false;
463*61046927SAndroid Build Coastguard Worker features->stippledBresenhamLines = false;
464*61046927SAndroid Build Coastguard Worker features->stippledSmoothLines = false;
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance5 */
467*61046927SAndroid Build Coastguard Worker features->maintenance5 = true;
468*61046927SAndroid Build Coastguard Worker
469*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance6 */
470*61046927SAndroid Build Coastguard Worker features->maintenance6 = true;
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker /* VK_KHR_performance_query */
473*61046927SAndroid Build Coastguard Worker features->performanceCounterQueryPools = true;
474*61046927SAndroid Build Coastguard Worker features->performanceCounterMultipleQueryPools = false;
475*61046927SAndroid Build Coastguard Worker
476*61046927SAndroid Build Coastguard Worker /* VK_KHR_pipeline_executable_properties */
477*61046927SAndroid Build Coastguard Worker features->pipelineExecutableInfo = true;
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker /* VK_KHR_present_id */
480*61046927SAndroid Build Coastguard Worker features->presentId = pdevice->vk.supported_extensions.KHR_present_id;
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker /* VK_KHR_present_wait */
483*61046927SAndroid Build Coastguard Worker features->presentWait = pdevice->vk.supported_extensions.KHR_present_wait;
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_expect_assume */
486*61046927SAndroid Build Coastguard Worker features->shaderExpectAssume = true;
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_float_controls2 */
489*61046927SAndroid Build Coastguard Worker features->shaderFloatControls2 = true;
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_subgroup_uniform_control_flow */
492*61046927SAndroid Build Coastguard Worker features->shaderSubgroupUniformControlFlow = true;
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker /* VK_KHR_vertex_attribute_divisor */
495*61046927SAndroid Build Coastguard Worker features->vertexAttributeInstanceRateDivisor = true;
496*61046927SAndroid Build Coastguard Worker features->vertexAttributeInstanceRateZeroDivisor = true;
497*61046927SAndroid Build Coastguard Worker
498*61046927SAndroid Build Coastguard Worker /* VK_KHR_workgroup_memory_explicit_layout */
499*61046927SAndroid Build Coastguard Worker features->workgroupMemoryExplicitLayout = true;
500*61046927SAndroid Build Coastguard Worker features->workgroupMemoryExplicitLayoutScalarBlockLayout = true;
501*61046927SAndroid Build Coastguard Worker features->workgroupMemoryExplicitLayout8BitAccess = true;
502*61046927SAndroid Build Coastguard Worker features->workgroupMemoryExplicitLayout16BitAccess = true;
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker /* VK_EXT_4444_formats */
505*61046927SAndroid Build Coastguard Worker features->formatA4R4G4B4 = true;
506*61046927SAndroid Build Coastguard Worker features->formatA4B4G4R4 = true;
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker /* VK_EXT_attachment_feedback_loop_dynamic_state */
509*61046927SAndroid Build Coastguard Worker features->attachmentFeedbackLoopDynamicState = true;
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker /* VK_EXT_attachment_feedback_loop_layout */
512*61046927SAndroid Build Coastguard Worker features->attachmentFeedbackLoopLayout = true;
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker /* VK_EXT_border_color_swizzle */
515*61046927SAndroid Build Coastguard Worker features->borderColorSwizzle = true;
516*61046927SAndroid Build Coastguard Worker features->borderColorSwizzleFromImage = true;
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker /* VK_EXT_color_write_enable */
519*61046927SAndroid Build Coastguard Worker features->colorWriteEnable = true;
520*61046927SAndroid Build Coastguard Worker
521*61046927SAndroid Build Coastguard Worker /* VK_EXT_conditional_rendering */
522*61046927SAndroid Build Coastguard Worker features->conditionalRendering = true;
523*61046927SAndroid Build Coastguard Worker features->inheritedConditionalRendering = true;
524*61046927SAndroid Build Coastguard Worker
525*61046927SAndroid Build Coastguard Worker /* VK_EXT_custom_border_color */
526*61046927SAndroid Build Coastguard Worker features->customBorderColors = true;
527*61046927SAndroid Build Coastguard Worker features->customBorderColorWithoutFormat = true;
528*61046927SAndroid Build Coastguard Worker
529*61046927SAndroid Build Coastguard Worker /* VK_EXT_depth_clamp_zero_one */
530*61046927SAndroid Build Coastguard Worker features->depthClampZeroOne = true;
531*61046927SAndroid Build Coastguard Worker
532*61046927SAndroid Build Coastguard Worker /* VK_EXT_depth_clip_control */
533*61046927SAndroid Build Coastguard Worker features->depthClipControl = true;
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker /* VK_EXT_depth_clip_enable */
536*61046927SAndroid Build Coastguard Worker features->depthClipEnable = true;
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker /* VK_EXT_descriptor_buffer */
539*61046927SAndroid Build Coastguard Worker features->descriptorBuffer = true;
540*61046927SAndroid Build Coastguard Worker features->descriptorBufferCaptureReplay = pdevice->has_set_iova;
541*61046927SAndroid Build Coastguard Worker features->descriptorBufferImageLayoutIgnored = true;
542*61046927SAndroid Build Coastguard Worker features->descriptorBufferPushDescriptors = true;
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Worker /* VK_EXT_device_address_binding_report */
545*61046927SAndroid Build Coastguard Worker features->reportAddressBinding = true;
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state */
548*61046927SAndroid Build Coastguard Worker features->extendedDynamicState = true;
549*61046927SAndroid Build Coastguard Worker
550*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state2 */
551*61046927SAndroid Build Coastguard Worker features->extendedDynamicState2 = true;
552*61046927SAndroid Build Coastguard Worker features->extendedDynamicState2LogicOp = true;
553*61046927SAndroid Build Coastguard Worker features->extendedDynamicState2PatchControlPoints = true;
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state3 */
556*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3PolygonMode = true;
557*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3TessellationDomainOrigin = true;
558*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3DepthClampEnable = true;
559*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3DepthClipEnable = true;
560*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3LogicOpEnable = true;
561*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3SampleMask = true;
562*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3RasterizationSamples = true;
563*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3AlphaToCoverageEnable = true;
564*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3AlphaToOneEnable = true;
565*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3DepthClipNegativeOneToOne = true;
566*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3RasterizationStream = true;
567*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ConservativeRasterizationMode = false;
568*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ExtraPrimitiveOverestimationSize = false;
569*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3LineRasterizationMode = true;
570*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3LineStippleEnable = false;
571*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ProvokingVertexMode = true;
572*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3SampleLocationsEnable =
573*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_sample_locations;
574*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ColorBlendEnable = true;
575*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ColorBlendEquation = true;
576*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ColorWriteMask = true;
577*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ViewportWScalingEnable = false;
578*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ViewportSwizzle = false;
579*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ShadingRateImageEnable = false;
580*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageToColorEnable = false;
581*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageToColorLocation = false;
582*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageModulationMode = false;
583*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageModulationTableEnable = false;
584*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageModulationTable = false;
585*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3CoverageReductionMode = false;
586*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3RepresentativeFragmentTestEnable = false;
587*61046927SAndroid Build Coastguard Worker features->extendedDynamicState3ColorBlendAdvanced = false;
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker /* VK_EXT_fragment_density_map */
590*61046927SAndroid Build Coastguard Worker features->fragmentDensityMap = true;
591*61046927SAndroid Build Coastguard Worker features->fragmentDensityMapDynamic = false;
592*61046927SAndroid Build Coastguard Worker features->fragmentDensityMapNonSubsampledImages = true;
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker /* VK_EXT_global_priority_query */
595*61046927SAndroid Build Coastguard Worker features->globalPriorityQuery = true;
596*61046927SAndroid Build Coastguard Worker
597*61046927SAndroid Build Coastguard Worker /* VK_EXT_graphics_pipeline_library */
598*61046927SAndroid Build Coastguard Worker features->graphicsPipelineLibrary = true;
599*61046927SAndroid Build Coastguard Worker
600*61046927SAndroid Build Coastguard Worker /* VK_EXT_image_2d_view_of_3d */
601*61046927SAndroid Build Coastguard Worker features->image2DViewOf3D = true;
602*61046927SAndroid Build Coastguard Worker features->sampler2DViewOf3D = true;
603*61046927SAndroid Build Coastguard Worker
604*61046927SAndroid Build Coastguard Worker /* VK_EXT_image_view_min_lod */
605*61046927SAndroid Build Coastguard Worker features->minLod = true;
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker /* VK_EXT_legacy_vertex_attributes */
608*61046927SAndroid Build Coastguard Worker features->legacyVertexAttributes = true;
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker /* VK_EXT_legacy_dithering */
611*61046927SAndroid Build Coastguard Worker features->legacyDithering = true;
612*61046927SAndroid Build Coastguard Worker
613*61046927SAndroid Build Coastguard Worker /* VK_EXT_map_memory_placed */
614*61046927SAndroid Build Coastguard Worker features->memoryMapPlaced = true;
615*61046927SAndroid Build Coastguard Worker features->memoryMapRangePlaced = false;
616*61046927SAndroid Build Coastguard Worker features->memoryUnmapReserve = true;
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker /* VK_EXT_multi_draw */
619*61046927SAndroid Build Coastguard Worker features->multiDraw = true;
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker /* VK_EXT_mutable_descriptor_type */
622*61046927SAndroid Build Coastguard Worker features->mutableDescriptorType = true;
623*61046927SAndroid Build Coastguard Worker
624*61046927SAndroid Build Coastguard Worker /* VK_EXT_nested_command_buffer */
625*61046927SAndroid Build Coastguard Worker features->nestedCommandBuffer = true;
626*61046927SAndroid Build Coastguard Worker features->nestedCommandBufferRendering = true;
627*61046927SAndroid Build Coastguard Worker features->nestedCommandBufferSimultaneousUse = true;
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker /* VK_EXT_non_seamless_cube_map */
630*61046927SAndroid Build Coastguard Worker features->nonSeamlessCubeMap = true;
631*61046927SAndroid Build Coastguard Worker
632*61046927SAndroid Build Coastguard Worker /* VK_EXT_primitive_topology_list_restart */
633*61046927SAndroid Build Coastguard Worker features->primitiveTopologyListRestart = true;
634*61046927SAndroid Build Coastguard Worker features->primitiveTopologyPatchListRestart = false;
635*61046927SAndroid Build Coastguard Worker
636*61046927SAndroid Build Coastguard Worker /* VK_EXT_primitives_generated_query */
637*61046927SAndroid Build Coastguard Worker features->primitivesGeneratedQuery = true;
638*61046927SAndroid Build Coastguard Worker features->primitivesGeneratedQueryWithRasterizerDiscard = false;
639*61046927SAndroid Build Coastguard Worker features->primitivesGeneratedQueryWithNonZeroStreams = false;
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker /* VK_EXT_provoking_vertex */
642*61046927SAndroid Build Coastguard Worker features->provokingVertexLast = true;
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker /* VK_EXT_rasterization_order_attachment_access */
645*61046927SAndroid Build Coastguard Worker features->rasterizationOrderColorAttachmentAccess = true;
646*61046927SAndroid Build Coastguard Worker features->rasterizationOrderDepthAttachmentAccess = true;
647*61046927SAndroid Build Coastguard Worker features->rasterizationOrderStencilAttachmentAccess = true;
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker /* VK_EXT_robustness2 */
650*61046927SAndroid Build Coastguard Worker features->robustBufferAccess2 = true;
651*61046927SAndroid Build Coastguard Worker features->robustImageAccess2 = true;
652*61046927SAndroid Build Coastguard Worker features->nullDescriptor = true;
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker /* VK_EXT_shader_module_identifier */
655*61046927SAndroid Build Coastguard Worker features->shaderModuleIdentifier = true;
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker /* VK_EXT_shader_replicated_composites */
658*61046927SAndroid Build Coastguard Worker features->shaderReplicatedComposites = true;
659*61046927SAndroid Build Coastguard Worker
660*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
661*61046927SAndroid Build Coastguard Worker /* VK_EXT_swapchain_maintenance1 */
662*61046927SAndroid Build Coastguard Worker features->swapchainMaintenance1 = true;
663*61046927SAndroid Build Coastguard Worker #endif
664*61046927SAndroid Build Coastguard Worker
665*61046927SAndroid Build Coastguard Worker /* VK_EXT_texel_buffer_alignment */
666*61046927SAndroid Build Coastguard Worker features->texelBufferAlignment = true;
667*61046927SAndroid Build Coastguard Worker
668*61046927SAndroid Build Coastguard Worker /* VK_EXT_transform_feedback */
669*61046927SAndroid Build Coastguard Worker features->transformFeedback = true;
670*61046927SAndroid Build Coastguard Worker features->geometryStreams = true;
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Worker /* VK_EXT_vertex_input_dynamic_state */
673*61046927SAndroid Build Coastguard Worker features->vertexInputDynamicState = true;
674*61046927SAndroid Build Coastguard Worker
675*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_relaxed_extended_instruction */
676*61046927SAndroid Build Coastguard Worker features->shaderRelaxedExtendedInstruction = true;
677*61046927SAndroid Build Coastguard Worker }
678*61046927SAndroid Build Coastguard Worker
679*61046927SAndroid Build Coastguard Worker static void
tu_get_physical_device_properties_1_1(struct tu_physical_device * pdevice,struct vk_properties * p)680*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_1(struct tu_physical_device *pdevice,
681*61046927SAndroid Build Coastguard Worker struct vk_properties *p)
682*61046927SAndroid Build Coastguard Worker {
683*61046927SAndroid Build Coastguard Worker memcpy(p->deviceUUID, pdevice->device_uuid, VK_UUID_SIZE);
684*61046927SAndroid Build Coastguard Worker memcpy(p->driverUUID, pdevice->driver_uuid, VK_UUID_SIZE);
685*61046927SAndroid Build Coastguard Worker memset(p->deviceLUID, 0, VK_LUID_SIZE);
686*61046927SAndroid Build Coastguard Worker p->deviceNodeMask = 0;
687*61046927SAndroid Build Coastguard Worker p->deviceLUIDValid = false;
688*61046927SAndroid Build Coastguard Worker
689*61046927SAndroid Build Coastguard Worker p->subgroupSize = pdevice->info->a6xx.supports_double_threadsize ?
690*61046927SAndroid Build Coastguard Worker pdevice->info->threadsize_base * 2 : pdevice->info->threadsize_base;
691*61046927SAndroid Build Coastguard Worker p->subgroupSupportedStages = VK_SHADER_STAGE_COMPUTE_BIT;
692*61046927SAndroid Build Coastguard Worker p->subgroupSupportedOperations = VK_SUBGROUP_FEATURE_BASIC_BIT |
693*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_VOTE_BIT |
694*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_BALLOT_BIT |
695*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
696*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT |
697*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_ARITHMETIC_BIT;
698*61046927SAndroid Build Coastguard Worker if (pdevice->info->a6xx.has_getfiberid) {
699*61046927SAndroid Build Coastguard Worker p->subgroupSupportedStages |= VK_SHADER_STAGE_ALL_GRAPHICS;
700*61046927SAndroid Build Coastguard Worker p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_QUAD_BIT;
701*61046927SAndroid Build Coastguard Worker }
702*61046927SAndroid Build Coastguard Worker
703*61046927SAndroid Build Coastguard Worker p->subgroupQuadOperationsInAllStages = false;
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker p->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES;
706*61046927SAndroid Build Coastguard Worker p->maxMultiviewViewCount =
707*61046927SAndroid Build Coastguard Worker (pdevice->info->a6xx.has_hw_multiview || TU_DEBUG(NOCONFORM)) ? MAX_VIEWPORTS : 1;
708*61046927SAndroid Build Coastguard Worker p->maxMultiviewInstanceIndex = INT_MAX;
709*61046927SAndroid Build Coastguard Worker p->protectedNoFault = false;
710*61046927SAndroid Build Coastguard Worker /* Our largest descriptors are 2 texture descriptors, or a texture and
711*61046927SAndroid Build Coastguard Worker * sampler descriptor.
712*61046927SAndroid Build Coastguard Worker */
713*61046927SAndroid Build Coastguard Worker p->maxPerSetDescriptors = MAX_SET_SIZE / (2 * A6XX_TEX_CONST_DWORDS * 4);
714*61046927SAndroid Build Coastguard Worker /* Our buffer size fields allow only this much */
715*61046927SAndroid Build Coastguard Worker p->maxMemoryAllocationSize = 0xFFFFFFFFull;
716*61046927SAndroid Build Coastguard Worker
717*61046927SAndroid Build Coastguard Worker }
718*61046927SAndroid Build Coastguard Worker
719*61046927SAndroid Build Coastguard Worker
720*61046927SAndroid Build Coastguard Worker static const size_t max_descriptor_set_size = MAX_SET_SIZE / (4 * A6XX_TEX_CONST_DWORDS);
721*61046927SAndroid Build Coastguard Worker static const VkSampleCountFlags sample_counts =
722*61046927SAndroid Build Coastguard Worker VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT;
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Worker static void
tu_get_physical_device_properties_1_2(struct tu_physical_device * pdevice,struct vk_properties * p)725*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_2(struct tu_physical_device *pdevice,
726*61046927SAndroid Build Coastguard Worker struct vk_properties *p)
727*61046927SAndroid Build Coastguard Worker {
728*61046927SAndroid Build Coastguard Worker p->driverID = VK_DRIVER_ID_MESA_TURNIP;
729*61046927SAndroid Build Coastguard Worker memset(p->driverName, 0, sizeof(p->driverName));
730*61046927SAndroid Build Coastguard Worker snprintf(p->driverName, VK_MAX_DRIVER_NAME_SIZE,
731*61046927SAndroid Build Coastguard Worker "turnip Mesa driver");
732*61046927SAndroid Build Coastguard Worker memset(p->driverInfo, 0, sizeof(p->driverInfo));
733*61046927SAndroid Build Coastguard Worker snprintf(p->driverInfo, VK_MAX_DRIVER_INFO_SIZE,
734*61046927SAndroid Build Coastguard Worker "Mesa " PACKAGE_VERSION MESA_GIT_SHA1);
735*61046927SAndroid Build Coastguard Worker p->conformanceVersion = (VkConformanceVersion) {
736*61046927SAndroid Build Coastguard Worker .major = 1,
737*61046927SAndroid Build Coastguard Worker .minor = 2,
738*61046927SAndroid Build Coastguard Worker .subminor = 7,
739*61046927SAndroid Build Coastguard Worker .patch = 1,
740*61046927SAndroid Build Coastguard Worker };
741*61046927SAndroid Build Coastguard Worker
742*61046927SAndroid Build Coastguard Worker p->denormBehaviorIndependence =
743*61046927SAndroid Build Coastguard Worker VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL;
744*61046927SAndroid Build Coastguard Worker p->roundingModeIndependence =
745*61046927SAndroid Build Coastguard Worker VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL;
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker p->shaderDenormFlushToZeroFloat16 = true;
748*61046927SAndroid Build Coastguard Worker p->shaderDenormPreserveFloat16 = false;
749*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTEFloat16 = true;
750*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTZFloat16 = false;
751*61046927SAndroid Build Coastguard Worker p->shaderSignedZeroInfNanPreserveFloat16 = true;
752*61046927SAndroid Build Coastguard Worker
753*61046927SAndroid Build Coastguard Worker p->shaderDenormFlushToZeroFloat32 = true;
754*61046927SAndroid Build Coastguard Worker p->shaderDenormPreserveFloat32 = false;
755*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTEFloat32 = true;
756*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTZFloat32 = false;
757*61046927SAndroid Build Coastguard Worker p->shaderSignedZeroInfNanPreserveFloat32 = true;
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker p->shaderDenormFlushToZeroFloat64 = false;
760*61046927SAndroid Build Coastguard Worker p->shaderDenormPreserveFloat64 = false;
761*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTEFloat64 = false;
762*61046927SAndroid Build Coastguard Worker p->shaderRoundingModeRTZFloat64 = false;
763*61046927SAndroid Build Coastguard Worker p->shaderSignedZeroInfNanPreserveFloat64 = false;
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker p->shaderUniformBufferArrayNonUniformIndexingNative = true;
766*61046927SAndroid Build Coastguard Worker p->shaderSampledImageArrayNonUniformIndexingNative = true;
767*61046927SAndroid Build Coastguard Worker p->shaderStorageBufferArrayNonUniformIndexingNative = true;
768*61046927SAndroid Build Coastguard Worker p->shaderStorageImageArrayNonUniformIndexingNative = true;
769*61046927SAndroid Build Coastguard Worker p->shaderInputAttachmentArrayNonUniformIndexingNative = false;
770*61046927SAndroid Build Coastguard Worker p->robustBufferAccessUpdateAfterBind = false;
771*61046927SAndroid Build Coastguard Worker p->quadDivergentImplicitLod = false;
772*61046927SAndroid Build Coastguard Worker
773*61046927SAndroid Build Coastguard Worker p->maxUpdateAfterBindDescriptorsInAllPools = max_descriptor_set_size;
774*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindSamplers = max_descriptor_set_size;
775*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindUniformBuffers = max_descriptor_set_size;
776*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindStorageBuffers = max_descriptor_set_size;
777*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindSampledImages = max_descriptor_set_size;
778*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindStorageImages = max_descriptor_set_size;
779*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindInputAttachments = MAX_RTS;
780*61046927SAndroid Build Coastguard Worker p->maxPerStageUpdateAfterBindResources = max_descriptor_set_size;
781*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindSamplers = max_descriptor_set_size;
782*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindUniformBuffers = max_descriptor_set_size;
783*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS;
784*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindStorageBuffers = max_descriptor_set_size;
785*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS;
786*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindSampledImages = max_descriptor_set_size;
787*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindStorageImages = max_descriptor_set_size;
788*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindInputAttachments = MAX_RTS;
789*61046927SAndroid Build Coastguard Worker
790*61046927SAndroid Build Coastguard Worker p->supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
791*61046927SAndroid Build Coastguard Worker p->supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
792*61046927SAndroid Build Coastguard Worker p->independentResolveNone = false;
793*61046927SAndroid Build Coastguard Worker p->independentResolve = false;
794*61046927SAndroid Build Coastguard Worker
795*61046927SAndroid Build Coastguard Worker p->filterMinmaxSingleComponentFormats = true;
796*61046927SAndroid Build Coastguard Worker p->filterMinmaxImageComponentMapping = true;
797*61046927SAndroid Build Coastguard Worker
798*61046927SAndroid Build Coastguard Worker p->maxTimelineSemaphoreValueDifference = UINT64_MAX;
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker p->framebufferIntegerColorSampleCounts = sample_counts;
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker static void
tu_get_physical_device_properties_1_3(struct tu_physical_device * pdevice,struct vk_properties * p)804*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_3(struct tu_physical_device *pdevice,
805*61046927SAndroid Build Coastguard Worker struct vk_properties *p)
806*61046927SAndroid Build Coastguard Worker {
807*61046927SAndroid Build Coastguard Worker p->minSubgroupSize = pdevice->info->threadsize_base;
808*61046927SAndroid Build Coastguard Worker p->maxSubgroupSize = pdevice->info->a6xx.supports_double_threadsize ?
809*61046927SAndroid Build Coastguard Worker pdevice->info->threadsize_base * 2 : pdevice->info->threadsize_base;
810*61046927SAndroid Build Coastguard Worker p->maxComputeWorkgroupSubgroups = pdevice->info->max_waves;
811*61046927SAndroid Build Coastguard Worker p->requiredSubgroupSizeStages = VK_SHADER_STAGE_ALL;
812*61046927SAndroid Build Coastguard Worker
813*61046927SAndroid Build Coastguard Worker p->maxInlineUniformBlockSize = MAX_INLINE_UBO_RANGE;
814*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorInlineUniformBlocks = MAX_INLINE_UBOS;
815*61046927SAndroid Build Coastguard Worker p->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = MAX_INLINE_UBOS;
816*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetInlineUniformBlocks = MAX_INLINE_UBOS;
817*61046927SAndroid Build Coastguard Worker p->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = MAX_INLINE_UBOS;
818*61046927SAndroid Build Coastguard Worker p->maxInlineUniformTotalSize = MAX_INLINE_UBOS * MAX_INLINE_UBO_RANGE;
819*61046927SAndroid Build Coastguard Worker
820*61046927SAndroid Build Coastguard Worker p->integerDotProduct8BitUnsignedAccelerated = false;
821*61046927SAndroid Build Coastguard Worker p->integerDotProduct8BitSignedAccelerated = false;
822*61046927SAndroid Build Coastguard Worker p->integerDotProduct8BitMixedSignednessAccelerated = false;
823*61046927SAndroid Build Coastguard Worker p->integerDotProduct4x8BitPackedUnsignedAccelerated =
824*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_dp2acc;
825*61046927SAndroid Build Coastguard Worker /* TODO: we should be able to emulate 4x8BitPackedSigned fast enough */
826*61046927SAndroid Build Coastguard Worker p->integerDotProduct4x8BitPackedSignedAccelerated = false;
827*61046927SAndroid Build Coastguard Worker p->integerDotProduct4x8BitPackedMixedSignednessAccelerated =
828*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_dp2acc;
829*61046927SAndroid Build Coastguard Worker p->integerDotProduct16BitUnsignedAccelerated = false;
830*61046927SAndroid Build Coastguard Worker p->integerDotProduct16BitSignedAccelerated = false;
831*61046927SAndroid Build Coastguard Worker p->integerDotProduct16BitMixedSignednessAccelerated = false;
832*61046927SAndroid Build Coastguard Worker p->integerDotProduct32BitUnsignedAccelerated = false;
833*61046927SAndroid Build Coastguard Worker p->integerDotProduct32BitSignedAccelerated = false;
834*61046927SAndroid Build Coastguard Worker p->integerDotProduct32BitMixedSignednessAccelerated = false;
835*61046927SAndroid Build Coastguard Worker p->integerDotProduct64BitUnsignedAccelerated = false;
836*61046927SAndroid Build Coastguard Worker p->integerDotProduct64BitSignedAccelerated = false;
837*61046927SAndroid Build Coastguard Worker p->integerDotProduct64BitMixedSignednessAccelerated = false;
838*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated = false;
839*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating8BitSignedAccelerated = false;
840*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated = false;
841*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated =
842*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_dp2acc;
843*61046927SAndroid Build Coastguard Worker /* TODO: we should be able to emulate Saturating4x8BitPackedSigned fast enough */
844*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated = false;
845*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated =
846*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.has_dp2acc;
847*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated = false;
848*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating16BitSignedAccelerated = false;
849*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated = false;
850*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated = false;
851*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating32BitSignedAccelerated = false;
852*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated = false;
853*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated = false;
854*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating64BitSignedAccelerated = false;
855*61046927SAndroid Build Coastguard Worker p->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated = false;
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker p->storageTexelBufferOffsetAlignmentBytes = 64;
858*61046927SAndroid Build Coastguard Worker p->storageTexelBufferOffsetSingleTexelAlignment = true;
859*61046927SAndroid Build Coastguard Worker p->uniformTexelBufferOffsetAlignmentBytes = 64;
860*61046927SAndroid Build Coastguard Worker p->uniformTexelBufferOffsetSingleTexelAlignment = true;
861*61046927SAndroid Build Coastguard Worker
862*61046927SAndroid Build Coastguard Worker /* The address space is 4GB for current kernels, so there's no point
863*61046927SAndroid Build Coastguard Worker * allowing a larger buffer. Our buffer sizes are 64-bit though, so
864*61046927SAndroid Build Coastguard Worker * GetBufferDeviceRequirements won't fall over if someone actually creates
865*61046927SAndroid Build Coastguard Worker * a 4GB buffer.
866*61046927SAndroid Build Coastguard Worker */
867*61046927SAndroid Build Coastguard Worker p->maxBufferSize = 1ull << 32;
868*61046927SAndroid Build Coastguard Worker }
869*61046927SAndroid Build Coastguard Worker
870*61046927SAndroid Build Coastguard Worker static void
tu_get_properties(struct tu_physical_device * pdevice,struct vk_properties * props)871*61046927SAndroid Build Coastguard Worker tu_get_properties(struct tu_physical_device *pdevice,
872*61046927SAndroid Build Coastguard Worker struct vk_properties *props)
873*61046927SAndroid Build Coastguard Worker {
874*61046927SAndroid Build Coastguard Worker /* Limits */
875*61046927SAndroid Build Coastguard Worker props->maxImageDimension1D = (1 << 14);
876*61046927SAndroid Build Coastguard Worker props->maxImageDimension2D = (1 << 14);
877*61046927SAndroid Build Coastguard Worker props->maxImageDimension3D = (1 << 11);
878*61046927SAndroid Build Coastguard Worker props->maxImageDimensionCube = (1 << 14);
879*61046927SAndroid Build Coastguard Worker props->maxImageArrayLayers = (1 << 11);
880*61046927SAndroid Build Coastguard Worker props->maxTexelBufferElements = 128 * 1024 * 1024;
881*61046927SAndroid Build Coastguard Worker props->maxUniformBufferRange = MAX_UNIFORM_BUFFER_RANGE;
882*61046927SAndroid Build Coastguard Worker props->maxStorageBufferRange = MAX_STORAGE_BUFFER_RANGE;
883*61046927SAndroid Build Coastguard Worker props->maxPushConstantsSize = MAX_PUSH_CONSTANTS_SIZE;
884*61046927SAndroid Build Coastguard Worker props->maxMemoryAllocationCount = UINT32_MAX;
885*61046927SAndroid Build Coastguard Worker props->maxSamplerAllocationCount = 64 * 1024;
886*61046927SAndroid Build Coastguard Worker props->bufferImageGranularity = 64; /* A cache line */
887*61046927SAndroid Build Coastguard Worker props->sparseAddressSpaceSize = 0;
888*61046927SAndroid Build Coastguard Worker props->maxBoundDescriptorSets = pdevice->usable_sets;
889*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorSamplers = max_descriptor_set_size;
890*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorUniformBuffers = max_descriptor_set_size;
891*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorStorageBuffers = max_descriptor_set_size;
892*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorSampledImages = max_descriptor_set_size;
893*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorStorageImages = max_descriptor_set_size;
894*61046927SAndroid Build Coastguard Worker props->maxPerStageDescriptorInputAttachments = MAX_RTS;
895*61046927SAndroid Build Coastguard Worker props->maxPerStageResources = max_descriptor_set_size;
896*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetSamplers = max_descriptor_set_size;
897*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetUniformBuffers = max_descriptor_set_size;
898*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS;
899*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetStorageBuffers = max_descriptor_set_size;
900*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS;
901*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetSampledImages = max_descriptor_set_size;
902*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetStorageImages = max_descriptor_set_size;
903*61046927SAndroid Build Coastguard Worker props->maxDescriptorSetInputAttachments = MAX_RTS;
904*61046927SAndroid Build Coastguard Worker props->maxVertexInputAttributes = pdevice->info->a6xx.vs_max_inputs_count;
905*61046927SAndroid Build Coastguard Worker props->maxVertexInputBindings = pdevice->info->a6xx.vs_max_inputs_count;
906*61046927SAndroid Build Coastguard Worker props->maxVertexInputAttributeOffset = 4095;
907*61046927SAndroid Build Coastguard Worker props->maxVertexInputBindingStride = 2048;
908*61046927SAndroid Build Coastguard Worker props->maxVertexOutputComponents = 128;
909*61046927SAndroid Build Coastguard Worker props->maxTessellationGenerationLevel = 64;
910*61046927SAndroid Build Coastguard Worker props->maxTessellationPatchSize = 32;
911*61046927SAndroid Build Coastguard Worker props->maxTessellationControlPerVertexInputComponents = 128;
912*61046927SAndroid Build Coastguard Worker props->maxTessellationControlPerVertexOutputComponents = 128;
913*61046927SAndroid Build Coastguard Worker props->maxTessellationControlPerPatchOutputComponents = 120;
914*61046927SAndroid Build Coastguard Worker props->maxTessellationControlTotalOutputComponents = 4096;
915*61046927SAndroid Build Coastguard Worker props->maxTessellationEvaluationInputComponents = 128;
916*61046927SAndroid Build Coastguard Worker props->maxTessellationEvaluationOutputComponents = 128;
917*61046927SAndroid Build Coastguard Worker props->maxGeometryShaderInvocations = 32;
918*61046927SAndroid Build Coastguard Worker props->maxGeometryInputComponents = 64;
919*61046927SAndroid Build Coastguard Worker props->maxGeometryOutputComponents = 128;
920*61046927SAndroid Build Coastguard Worker props->maxGeometryOutputVertices = 256;
921*61046927SAndroid Build Coastguard Worker props->maxGeometryTotalOutputComponents = 1024;
922*61046927SAndroid Build Coastguard Worker props->maxFragmentInputComponents = 124;
923*61046927SAndroid Build Coastguard Worker props->maxFragmentOutputAttachments = 8;
924*61046927SAndroid Build Coastguard Worker props->maxFragmentDualSrcAttachments = 1;
925*61046927SAndroid Build Coastguard Worker props->maxFragmentCombinedOutputResources = MAX_RTS + max_descriptor_set_size * 2;
926*61046927SAndroid Build Coastguard Worker props->maxComputeSharedMemorySize = pdevice->info->cs_shared_mem_size;
927*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupCount[0] =
928*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupCount[1] =
929*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupCount[2] = 65535;
930*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupInvocations = pdevice->info->a6xx.supports_double_threadsize ?
931*61046927SAndroid Build Coastguard Worker pdevice->info->threadsize_base * 2 * pdevice->info->max_waves :
932*61046927SAndroid Build Coastguard Worker pdevice->info->threadsize_base * pdevice->info->max_waves;
933*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupSize[0] =
934*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupSize[1] =
935*61046927SAndroid Build Coastguard Worker props->maxComputeWorkGroupSize[2] = 1024;
936*61046927SAndroid Build Coastguard Worker props->subPixelPrecisionBits = 8;
937*61046927SAndroid Build Coastguard Worker props->subTexelPrecisionBits = 8;
938*61046927SAndroid Build Coastguard Worker props->mipmapPrecisionBits = 8;
939*61046927SAndroid Build Coastguard Worker props->maxDrawIndexedIndexValue = UINT32_MAX;
940*61046927SAndroid Build Coastguard Worker props->maxDrawIndirectCount = UINT32_MAX;
941*61046927SAndroid Build Coastguard Worker props->maxSamplerLodBias = 4095.0 / 256.0; /* [-16, 15.99609375] */
942*61046927SAndroid Build Coastguard Worker props->maxSamplerAnisotropy = 16;
943*61046927SAndroid Build Coastguard Worker props->maxViewports =
944*61046927SAndroid Build Coastguard Worker (pdevice->info->a6xx.has_hw_multiview || TU_DEBUG(NOCONFORM)) ? MAX_VIEWPORTS : 1;
945*61046927SAndroid Build Coastguard Worker props->maxViewportDimensions[0] =
946*61046927SAndroid Build Coastguard Worker props->maxViewportDimensions[1] = MAX_VIEWPORT_SIZE;
947*61046927SAndroid Build Coastguard Worker props->viewportBoundsRange[0] = INT16_MIN;
948*61046927SAndroid Build Coastguard Worker props->viewportBoundsRange[1] = INT16_MAX;
949*61046927SAndroid Build Coastguard Worker props->viewportSubPixelBits = 8;
950*61046927SAndroid Build Coastguard Worker props->minMemoryMapAlignment = 4096; /* A page */
951*61046927SAndroid Build Coastguard Worker props->minTexelBufferOffsetAlignment = 64;
952*61046927SAndroid Build Coastguard Worker props->minUniformBufferOffsetAlignment = 64;
953*61046927SAndroid Build Coastguard Worker props->minStorageBufferOffsetAlignment = 4;
954*61046927SAndroid Build Coastguard Worker props->minTexelOffset = -16;
955*61046927SAndroid Build Coastguard Worker props->maxTexelOffset = 15;
956*61046927SAndroid Build Coastguard Worker props->minTexelGatherOffset = -32;
957*61046927SAndroid Build Coastguard Worker props->maxTexelGatherOffset = 31;
958*61046927SAndroid Build Coastguard Worker props->minInterpolationOffset = -0.5;
959*61046927SAndroid Build Coastguard Worker props->maxInterpolationOffset = 0.4375;
960*61046927SAndroid Build Coastguard Worker props->subPixelInterpolationOffsetBits = 4;
961*61046927SAndroid Build Coastguard Worker props->maxFramebufferWidth = (1 << 14);
962*61046927SAndroid Build Coastguard Worker props->maxFramebufferHeight = (1 << 14);
963*61046927SAndroid Build Coastguard Worker props->maxFramebufferLayers = (1 << 10);
964*61046927SAndroid Build Coastguard Worker props->framebufferColorSampleCounts = sample_counts;
965*61046927SAndroid Build Coastguard Worker props->framebufferDepthSampleCounts = sample_counts;
966*61046927SAndroid Build Coastguard Worker props->framebufferStencilSampleCounts = sample_counts;
967*61046927SAndroid Build Coastguard Worker props->framebufferNoAttachmentsSampleCounts = sample_counts;
968*61046927SAndroid Build Coastguard Worker props->maxColorAttachments = MAX_RTS;
969*61046927SAndroid Build Coastguard Worker props->sampledImageColorSampleCounts = sample_counts;
970*61046927SAndroid Build Coastguard Worker props->sampledImageIntegerSampleCounts = sample_counts;
971*61046927SAndroid Build Coastguard Worker props->sampledImageDepthSampleCounts = sample_counts;
972*61046927SAndroid Build Coastguard Worker props->sampledImageStencilSampleCounts = sample_counts;
973*61046927SAndroid Build Coastguard Worker props->storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT;
974*61046927SAndroid Build Coastguard Worker props->maxSampleMaskWords = 1;
975*61046927SAndroid Build Coastguard Worker props->timestampComputeAndGraphics = true;
976*61046927SAndroid Build Coastguard Worker props->timestampPeriod = 1000000000.0 / 19200000.0; /* CP_ALWAYS_ON_COUNTER is fixed 19.2MHz */
977*61046927SAndroid Build Coastguard Worker props->maxClipDistances = 8;
978*61046927SAndroid Build Coastguard Worker props->maxCullDistances = 8;
979*61046927SAndroid Build Coastguard Worker props->maxCombinedClipAndCullDistances = 8;
980*61046927SAndroid Build Coastguard Worker props->discreteQueuePriorities = 2;
981*61046927SAndroid Build Coastguard Worker props->pointSizeRange[0] = 1;
982*61046927SAndroid Build Coastguard Worker props->pointSizeRange[1] = 4092;
983*61046927SAndroid Build Coastguard Worker props->lineWidthRange[0] = pdevice->info->a6xx.line_width_min;
984*61046927SAndroid Build Coastguard Worker props->lineWidthRange[1] = pdevice->info->a6xx.line_width_max;
985*61046927SAndroid Build Coastguard Worker props->pointSizeGranularity = 0.0625;
986*61046927SAndroid Build Coastguard Worker props->lineWidthGranularity =
987*61046927SAndroid Build Coastguard Worker pdevice->info->a6xx.line_width_max == 1.0 ? 0.0 : 0.5;
988*61046927SAndroid Build Coastguard Worker props->strictLines = true;
989*61046927SAndroid Build Coastguard Worker props->standardSampleLocations = true;
990*61046927SAndroid Build Coastguard Worker props->optimalBufferCopyOffsetAlignment = 128;
991*61046927SAndroid Build Coastguard Worker props->optimalBufferCopyRowPitchAlignment = 128;
992*61046927SAndroid Build Coastguard Worker props->nonCoherentAtomSize = 64;
993*61046927SAndroid Build Coastguard Worker
994*61046927SAndroid Build Coastguard Worker props->apiVersion =
995*61046927SAndroid Build Coastguard Worker (pdevice->info->a6xx.has_hw_multiview || TU_DEBUG(NOCONFORM)) ?
996*61046927SAndroid Build Coastguard Worker TU_API_VERSION : VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION);
997*61046927SAndroid Build Coastguard Worker props->driverVersion = vk_get_driver_version();
998*61046927SAndroid Build Coastguard Worker props->vendorID = 0x5143;
999*61046927SAndroid Build Coastguard Worker props->deviceID = pdevice->dev_id.chip_id;
1000*61046927SAndroid Build Coastguard Worker props->deviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
1001*61046927SAndroid Build Coastguard Worker
1002*61046927SAndroid Build Coastguard Worker /* sparse properties */
1003*61046927SAndroid Build Coastguard Worker props->sparseResidencyStandard2DBlockShape = { 0 };
1004*61046927SAndroid Build Coastguard Worker props->sparseResidencyStandard2DMultisampleBlockShape = { 0 };
1005*61046927SAndroid Build Coastguard Worker props->sparseResidencyStandard3DBlockShape = { 0 };
1006*61046927SAndroid Build Coastguard Worker props->sparseResidencyAlignedMipSize = { 0 };
1007*61046927SAndroid Build Coastguard Worker props->sparseResidencyNonResidentStrict = { 0 };
1008*61046927SAndroid Build Coastguard Worker
1009*61046927SAndroid Build Coastguard Worker strcpy(props->deviceName, pdevice->name);
1010*61046927SAndroid Build Coastguard Worker memcpy(props->pipelineCacheUUID, pdevice->cache_uuid, VK_UUID_SIZE);
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_1(pdevice, props);
1013*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_2(pdevice, props);
1014*61046927SAndroid Build Coastguard Worker tu_get_physical_device_properties_1_3(pdevice, props);
1015*61046927SAndroid Build Coastguard Worker
1016*61046927SAndroid Build Coastguard Worker /* VK_KHR_push_descriptor */
1017*61046927SAndroid Build Coastguard Worker props->maxPushDescriptors = MAX_PUSH_DESCRIPTORS;
1018*61046927SAndroid Build Coastguard Worker
1019*61046927SAndroid Build Coastguard Worker /* VK_EXT_transform_feedback */
1020*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackStreams = IR3_MAX_SO_STREAMS;
1021*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackBuffers = IR3_MAX_SO_BUFFERS;
1022*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackBufferSize = UINT32_MAX;
1023*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackStreamDataSize = 512;
1024*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackBufferDataSize = 512;
1025*61046927SAndroid Build Coastguard Worker props->maxTransformFeedbackBufferDataStride = 512;
1026*61046927SAndroid Build Coastguard Worker props->transformFeedbackQueries = true;
1027*61046927SAndroid Build Coastguard Worker props->transformFeedbackStreamsLinesTriangles = true;
1028*61046927SAndroid Build Coastguard Worker props->transformFeedbackRasterizationStreamSelect = true;
1029*61046927SAndroid Build Coastguard Worker props->transformFeedbackDraw = true;
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker /* VK_EXT_sample_locations */
1032*61046927SAndroid Build Coastguard Worker props->sampleLocationSampleCounts =
1033*61046927SAndroid Build Coastguard Worker pdevice->vk.supported_extensions.EXT_sample_locations ? sample_counts : 0;
1034*61046927SAndroid Build Coastguard Worker props->maxSampleLocationGridSize = (VkExtent2D) { 1 , 1 };
1035*61046927SAndroid Build Coastguard Worker props->sampleLocationCoordinateRange[0] = SAMPLE_LOCATION_MIN;
1036*61046927SAndroid Build Coastguard Worker props->sampleLocationCoordinateRange[1] = SAMPLE_LOCATION_MAX;
1037*61046927SAndroid Build Coastguard Worker props->sampleLocationSubPixelBits = 4;
1038*61046927SAndroid Build Coastguard Worker props->variableSampleLocations = true;
1039*61046927SAndroid Build Coastguard Worker
1040*61046927SAndroid Build Coastguard Worker /* VK_KHR_vertex_attribute_divisor */
1041*61046927SAndroid Build Coastguard Worker props->maxVertexAttribDivisor = UINT32_MAX;
1042*61046927SAndroid Build Coastguard Worker props->supportsNonZeroFirstInstance = true;
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker /* VK_EXT_custom_border_color */
1045*61046927SAndroid Build Coastguard Worker props->maxCustomBorderColorSamplers = TU_BORDER_COLOR_COUNT;
1046*61046927SAndroid Build Coastguard Worker
1047*61046927SAndroid Build Coastguard Worker /* VK_KHR_performance_query */
1048*61046927SAndroid Build Coastguard Worker props->allowCommandBufferQueryCopies = false;
1049*61046927SAndroid Build Coastguard Worker
1050*61046927SAndroid Build Coastguard Worker /* VK_EXT_robustness2 */
1051*61046927SAndroid Build Coastguard Worker /* see write_buffer_descriptor() */
1052*61046927SAndroid Build Coastguard Worker props->robustStorageBufferAccessSizeAlignment = 4;
1053*61046927SAndroid Build Coastguard Worker /* see write_ubo_descriptor() */
1054*61046927SAndroid Build Coastguard Worker props->robustUniformBufferAccessSizeAlignment = 16;
1055*61046927SAndroid Build Coastguard Worker
1056*61046927SAndroid Build Coastguard Worker /* VK_EXT_provoking_vertex */
1057*61046927SAndroid Build Coastguard Worker props->provokingVertexModePerPipeline = true;
1058*61046927SAndroid Build Coastguard Worker props->transformFeedbackPreservesTriangleFanProvokingVertex = false;
1059*61046927SAndroid Build Coastguard Worker
1060*61046927SAndroid Build Coastguard Worker /* VK_KHR_line_rasterization */
1061*61046927SAndroid Build Coastguard Worker props->lineSubPixelPrecisionBits = 8;
1062*61046927SAndroid Build Coastguard Worker
1063*61046927SAndroid Build Coastguard Worker /* VK_EXT_physical_device_drm */
1064*61046927SAndroid Build Coastguard Worker props->drmHasPrimary = pdevice->has_master;
1065*61046927SAndroid Build Coastguard Worker props->drmPrimaryMajor = pdevice->master_major;
1066*61046927SAndroid Build Coastguard Worker props->drmPrimaryMinor = pdevice->master_minor;
1067*61046927SAndroid Build Coastguard Worker
1068*61046927SAndroid Build Coastguard Worker props->drmHasRender = pdevice->has_local;
1069*61046927SAndroid Build Coastguard Worker props->drmRenderMajor = pdevice->local_major;
1070*61046927SAndroid Build Coastguard Worker props->drmRenderMinor = pdevice->local_minor;
1071*61046927SAndroid Build Coastguard Worker
1072*61046927SAndroid Build Coastguard Worker /* VK_EXT_shader_module_identifier */
1073*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(vk_shaderModuleIdentifierAlgorithmUUID) ==
1074*61046927SAndroid Build Coastguard Worker sizeof(props->shaderModuleIdentifierAlgorithmUUID));
1075*61046927SAndroid Build Coastguard Worker memcpy(props->shaderModuleIdentifierAlgorithmUUID,
1076*61046927SAndroid Build Coastguard Worker vk_shaderModuleIdentifierAlgorithmUUID,
1077*61046927SAndroid Build Coastguard Worker sizeof(props->shaderModuleIdentifierAlgorithmUUID));
1078*61046927SAndroid Build Coastguard Worker
1079*61046927SAndroid Build Coastguard Worker /* VK_EXT_map_memory_placed */
1080*61046927SAndroid Build Coastguard Worker os_get_page_size(&os_page_size);
1081*61046927SAndroid Build Coastguard Worker props->minPlacedMemoryMapAlignment = os_page_size;
1082*61046927SAndroid Build Coastguard Worker
1083*61046927SAndroid Build Coastguard Worker /* VK_EXT_multi_draw */
1084*61046927SAndroid Build Coastguard Worker props->maxMultiDrawCount = 2048;
1085*61046927SAndroid Build Coastguard Worker
1086*61046927SAndroid Build Coastguard Worker /* VK_EXT_nested_command_buffer */
1087*61046927SAndroid Build Coastguard Worker props->maxCommandBufferNestingLevel = UINT32_MAX;
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker /* VK_EXT_graphics_pipeline_library */
1090*61046927SAndroid Build Coastguard Worker props->graphicsPipelineLibraryFastLinking = true;
1091*61046927SAndroid Build Coastguard Worker props->graphicsPipelineLibraryIndependentInterpolationDecoration = true;
1092*61046927SAndroid Build Coastguard Worker
1093*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state3 */
1094*61046927SAndroid Build Coastguard Worker props->dynamicPrimitiveTopologyUnrestricted = true;
1095*61046927SAndroid Build Coastguard Worker
1096*61046927SAndroid Build Coastguard Worker /* VK_EXT_descriptor_buffer */
1097*61046927SAndroid Build Coastguard Worker props->combinedImageSamplerDescriptorSingleArray = true;
1098*61046927SAndroid Build Coastguard Worker props->bufferlessPushDescriptors = true;
1099*61046927SAndroid Build Coastguard Worker props->allowSamplerImageViewPostSubmitCreation = true;
1100*61046927SAndroid Build Coastguard Worker props->descriptorBufferOffsetAlignment = A6XX_TEX_CONST_DWORDS * 4;
1101*61046927SAndroid Build Coastguard Worker props->maxDescriptorBufferBindings = pdevice->usable_sets;
1102*61046927SAndroid Build Coastguard Worker props->maxResourceDescriptorBufferBindings = pdevice->usable_sets;
1103*61046927SAndroid Build Coastguard Worker props->maxSamplerDescriptorBufferBindings = pdevice->usable_sets;
1104*61046927SAndroid Build Coastguard Worker props->maxEmbeddedImmutableSamplerBindings = pdevice->usable_sets;
1105*61046927SAndroid Build Coastguard Worker props->maxEmbeddedImmutableSamplers = max_descriptor_set_size;
1106*61046927SAndroid Build Coastguard Worker props->bufferCaptureReplayDescriptorDataSize = 0;
1107*61046927SAndroid Build Coastguard Worker props->imageCaptureReplayDescriptorDataSize = 0;
1108*61046927SAndroid Build Coastguard Worker props->imageViewCaptureReplayDescriptorDataSize = 0;
1109*61046927SAndroid Build Coastguard Worker props->samplerCaptureReplayDescriptorDataSize = 0;
1110*61046927SAndroid Build Coastguard Worker props->accelerationStructureCaptureReplayDescriptorDataSize = 0;
1111*61046927SAndroid Build Coastguard Worker /* Note: these sizes must match descriptor_size() */
1112*61046927SAndroid Build Coastguard Worker props->samplerDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1113*61046927SAndroid Build Coastguard Worker props->combinedImageSamplerDescriptorSize = 2 * A6XX_TEX_CONST_DWORDS * 4;
1114*61046927SAndroid Build Coastguard Worker props->sampledImageDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1115*61046927SAndroid Build Coastguard Worker props->storageImageDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1116*61046927SAndroid Build Coastguard Worker props->uniformTexelBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1117*61046927SAndroid Build Coastguard Worker props->robustUniformTexelBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1118*61046927SAndroid Build Coastguard Worker props->storageTexelBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1119*61046927SAndroid Build Coastguard Worker props->robustStorageTexelBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1120*61046927SAndroid Build Coastguard Worker props->uniformBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1121*61046927SAndroid Build Coastguard Worker props->robustUniformBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4;
1122*61046927SAndroid Build Coastguard Worker props->storageBufferDescriptorSize = A6XX_TEX_CONST_DWORDS * 4 * (1 +
1123*61046927SAndroid Build Coastguard Worker COND(pdevice->info->a6xx.storage_16bit && !pdevice->info->a6xx.has_isam_v, 1) +
1124*61046927SAndroid Build Coastguard Worker COND(pdevice->info->a7xx.storage_8bit, 1));
1125*61046927SAndroid Build Coastguard Worker props->robustStorageBufferDescriptorSize =
1126*61046927SAndroid Build Coastguard Worker props->storageBufferDescriptorSize;
1127*61046927SAndroid Build Coastguard Worker props->inputAttachmentDescriptorSize = TU_DEBUG(DYNAMIC) ?
1128*61046927SAndroid Build Coastguard Worker A6XX_TEX_CONST_DWORDS * 4 : 0;
1129*61046927SAndroid Build Coastguard Worker props->maxSamplerDescriptorBufferRange = ~0ull;
1130*61046927SAndroid Build Coastguard Worker props->maxResourceDescriptorBufferRange = ~0ull;
1131*61046927SAndroid Build Coastguard Worker props->samplerDescriptorBufferAddressSpaceSize = ~0ull;
1132*61046927SAndroid Build Coastguard Worker props->resourceDescriptorBufferAddressSpaceSize = ~0ull;
1133*61046927SAndroid Build Coastguard Worker props->descriptorBufferAddressSpaceSize = ~0ull;
1134*61046927SAndroid Build Coastguard Worker props->combinedImageSamplerDensityMapDescriptorSize = 2 * A6XX_TEX_CONST_DWORDS * 4;
1135*61046927SAndroid Build Coastguard Worker
1136*61046927SAndroid Build Coastguard Worker /* VK_EXT_legacy_vertex_attributes */
1137*61046927SAndroid Build Coastguard Worker props->nativeUnalignedPerformance = true;
1138*61046927SAndroid Build Coastguard Worker
1139*61046927SAndroid Build Coastguard Worker /* VK_EXT_fragment_density_map*/
1140*61046927SAndroid Build Coastguard Worker props->minFragmentDensityTexelSize = (VkExtent2D) { MIN_FDM_TEXEL_SIZE, MIN_FDM_TEXEL_SIZE };
1141*61046927SAndroid Build Coastguard Worker props->maxFragmentDensityTexelSize = (VkExtent2D) { MAX_FDM_TEXEL_SIZE, MAX_FDM_TEXEL_SIZE };
1142*61046927SAndroid Build Coastguard Worker props->fragmentDensityInvocations = false;
1143*61046927SAndroid Build Coastguard Worker
1144*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance5 */
1145*61046927SAndroid Build Coastguard Worker props->earlyFragmentMultisampleCoverageAfterSampleCounting = true;
1146*61046927SAndroid Build Coastguard Worker props->earlyFragmentSampleMaskTestBeforeSampleCounting = true;
1147*61046927SAndroid Build Coastguard Worker props->depthStencilSwizzleOneSupport = true;
1148*61046927SAndroid Build Coastguard Worker props->polygonModePointSize = true;
1149*61046927SAndroid Build Coastguard Worker props->nonStrictWideLinesUseParallelogram = false;
1150*61046927SAndroid Build Coastguard Worker props->nonStrictSinglePixelWideLinesUseParallelogram = false;
1151*61046927SAndroid Build Coastguard Worker
1152*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance6 */
1153*61046927SAndroid Build Coastguard Worker props->blockTexelViewCompatibleMultipleLayers = true;
1154*61046927SAndroid Build Coastguard Worker props->maxCombinedImageSamplerDescriptorCount = 1;
1155*61046927SAndroid Build Coastguard Worker props->fragmentShadingRateClampCombinerInputs = false; /* TODO */
1156*61046927SAndroid Build Coastguard Worker }
1157*61046927SAndroid Build Coastguard Worker
1158*61046927SAndroid Build Coastguard Worker static const struct vk_pipeline_cache_object_ops *const cache_import_ops[] = {
1159*61046927SAndroid Build Coastguard Worker &tu_shader_ops,
1160*61046927SAndroid Build Coastguard Worker &tu_nir_shaders_ops,
1161*61046927SAndroid Build Coastguard Worker NULL,
1162*61046927SAndroid Build Coastguard Worker };
1163*61046927SAndroid Build Coastguard Worker
1164*61046927SAndroid Build Coastguard Worker VkResult
tu_physical_device_init(struct tu_physical_device * device,struct tu_instance * instance)1165*61046927SAndroid Build Coastguard Worker tu_physical_device_init(struct tu_physical_device *device,
1166*61046927SAndroid Build Coastguard Worker struct tu_instance *instance)
1167*61046927SAndroid Build Coastguard Worker {
1168*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
1169*61046927SAndroid Build Coastguard Worker
1170*61046927SAndroid Build Coastguard Worker const char *fd_name = fd_dev_name(&device->dev_id);
1171*61046927SAndroid Build Coastguard Worker if (!fd_name) {
1172*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
1173*61046927SAndroid Build Coastguard Worker "device (chip_id = %" PRIX64
1174*61046927SAndroid Build Coastguard Worker ", gpu_id = %u) is unsupported",
1175*61046927SAndroid Build Coastguard Worker device->dev_id.chip_id, device->dev_id.gpu_id);
1176*61046927SAndroid Build Coastguard Worker }
1177*61046927SAndroid Build Coastguard Worker
1178*61046927SAndroid Build Coastguard Worker if (strncmp(fd_name, "FD", 2) == 0) {
1179*61046927SAndroid Build Coastguard Worker device->name = vk_asprintf(&instance->vk.alloc,
1180*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE,
1181*61046927SAndroid Build Coastguard Worker "Turnip Adreno (TM) %s", &fd_name[2]);
1182*61046927SAndroid Build Coastguard Worker } else {
1183*61046927SAndroid Build Coastguard Worker device->name = vk_strdup(&instance->vk.alloc, fd_name,
1184*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
1185*61046927SAndroid Build Coastguard Worker
1186*61046927SAndroid Build Coastguard Worker }
1187*61046927SAndroid Build Coastguard Worker if (!device->name) {
1188*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(instance, VK_ERROR_OUT_OF_HOST_MEMORY,
1189*61046927SAndroid Build Coastguard Worker "device name alloc fail");
1190*61046927SAndroid Build Coastguard Worker }
1191*61046927SAndroid Build Coastguard Worker
1192*61046927SAndroid Build Coastguard Worker const struct fd_dev_info info = fd_dev_info(&device->dev_id);
1193*61046927SAndroid Build Coastguard Worker if (!info.chip) {
1194*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1195*61046927SAndroid Build Coastguard Worker "device %s is unsupported", device->name);
1196*61046927SAndroid Build Coastguard Worker goto fail_free_name;
1197*61046927SAndroid Build Coastguard Worker }
1198*61046927SAndroid Build Coastguard Worker switch (fd_dev_gen(&device->dev_id)) {
1199*61046927SAndroid Build Coastguard Worker case 6:
1200*61046927SAndroid Build Coastguard Worker case 7: {
1201*61046927SAndroid Build Coastguard Worker device->dev_info = info;
1202*61046927SAndroid Build Coastguard Worker device->info = &device->dev_info;
1203*61046927SAndroid Build Coastguard Worker uint32_t depth_cache_size =
1204*61046927SAndroid Build Coastguard Worker device->info->num_ccu * device->info->a6xx.sysmem_per_ccu_depth_cache_size;
1205*61046927SAndroid Build Coastguard Worker uint32_t color_cache_size =
1206*61046927SAndroid Build Coastguard Worker (device->info->num_ccu *
1207*61046927SAndroid Build Coastguard Worker device->info->a6xx.sysmem_per_ccu_color_cache_size);
1208*61046927SAndroid Build Coastguard Worker uint32_t color_cache_size_gmem =
1209*61046927SAndroid Build Coastguard Worker color_cache_size /
1210*61046927SAndroid Build Coastguard Worker (1 << device->info->a6xx.gmem_ccu_color_cache_fraction);
1211*61046927SAndroid Build Coastguard Worker
1212*61046927SAndroid Build Coastguard Worker device->ccu_depth_offset_bypass = 0;
1213*61046927SAndroid Build Coastguard Worker device->ccu_offset_bypass =
1214*61046927SAndroid Build Coastguard Worker device->ccu_depth_offset_bypass + depth_cache_size;
1215*61046927SAndroid Build Coastguard Worker
1216*61046927SAndroid Build Coastguard Worker if (device->info->a7xx.has_gmem_vpc_attr_buf) {
1217*61046927SAndroid Build Coastguard Worker device->vpc_attr_buf_size_bypass =
1218*61046927SAndroid Build Coastguard Worker device->info->a7xx.sysmem_vpc_attr_buf_size;
1219*61046927SAndroid Build Coastguard Worker device->vpc_attr_buf_offset_bypass =
1220*61046927SAndroid Build Coastguard Worker device->ccu_offset_bypass + color_cache_size;
1221*61046927SAndroid Build Coastguard Worker
1222*61046927SAndroid Build Coastguard Worker device->vpc_attr_buf_size_gmem =
1223*61046927SAndroid Build Coastguard Worker device->info->a7xx.gmem_vpc_attr_buf_size;
1224*61046927SAndroid Build Coastguard Worker device->vpc_attr_buf_offset_gmem =
1225*61046927SAndroid Build Coastguard Worker device->gmem_size -
1226*61046927SAndroid Build Coastguard Worker (device->vpc_attr_buf_size_gmem * device->info->num_ccu);
1227*61046927SAndroid Build Coastguard Worker
1228*61046927SAndroid Build Coastguard Worker device->ccu_offset_gmem =
1229*61046927SAndroid Build Coastguard Worker device->vpc_attr_buf_offset_gmem - color_cache_size_gmem;
1230*61046927SAndroid Build Coastguard Worker
1231*61046927SAndroid Build Coastguard Worker device->usable_gmem_size_gmem = device->vpc_attr_buf_offset_gmem;
1232*61046927SAndroid Build Coastguard Worker } else {
1233*61046927SAndroid Build Coastguard Worker device->ccu_offset_gmem = device->gmem_size - color_cache_size_gmem;
1234*61046927SAndroid Build Coastguard Worker device->usable_gmem_size_gmem = device->gmem_size;
1235*61046927SAndroid Build Coastguard Worker }
1236*61046927SAndroid Build Coastguard Worker
1237*61046927SAndroid Build Coastguard Worker if (instance->reserve_descriptor_set) {
1238*61046927SAndroid Build Coastguard Worker device->usable_sets = device->reserved_set_idx = device->info->a6xx.max_sets - 1;
1239*61046927SAndroid Build Coastguard Worker } else {
1240*61046927SAndroid Build Coastguard Worker device->usable_sets = device->info->a6xx.max_sets;
1241*61046927SAndroid Build Coastguard Worker device->reserved_set_idx = -1;
1242*61046927SAndroid Build Coastguard Worker }
1243*61046927SAndroid Build Coastguard Worker break;
1244*61046927SAndroid Build Coastguard Worker }
1245*61046927SAndroid Build Coastguard Worker default:
1246*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1247*61046927SAndroid Build Coastguard Worker "device %s is unsupported", device->name);
1248*61046927SAndroid Build Coastguard Worker goto fail_free_name;
1249*61046927SAndroid Build Coastguard Worker }
1250*61046927SAndroid Build Coastguard Worker if (tu_device_get_cache_uuid(device, device->cache_uuid)) {
1251*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1252*61046927SAndroid Build Coastguard Worker "cannot generate UUID");
1253*61046927SAndroid Build Coastguard Worker goto fail_free_name;
1254*61046927SAndroid Build Coastguard Worker }
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker device->level1_dcache_size = tu_get_l1_dcache_size();
1257*61046927SAndroid Build Coastguard Worker device->has_cached_non_coherent_memory =
1258*61046927SAndroid Build Coastguard Worker device->level1_dcache_size > 0 && !DETECT_ARCH_ARM;
1259*61046927SAndroid Build Coastguard Worker
1260*61046927SAndroid Build Coastguard Worker device->memory.type_count = 1;
1261*61046927SAndroid Build Coastguard Worker device->memory.types[0] =
1262*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1263*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
1264*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
1265*61046927SAndroid Build Coastguard Worker
1266*61046927SAndroid Build Coastguard Worker if (device->has_cached_coherent_memory) {
1267*61046927SAndroid Build Coastguard Worker device->memory.types[device->memory.type_count] =
1268*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1269*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
1270*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
1271*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
1272*61046927SAndroid Build Coastguard Worker device->memory.type_count++;
1273*61046927SAndroid Build Coastguard Worker }
1274*61046927SAndroid Build Coastguard Worker
1275*61046927SAndroid Build Coastguard Worker if (device->has_cached_non_coherent_memory) {
1276*61046927SAndroid Build Coastguard Worker device->memory.types[device->memory.type_count] =
1277*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1278*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
1279*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
1280*61046927SAndroid Build Coastguard Worker device->memory.type_count++;
1281*61046927SAndroid Build Coastguard Worker }
1282*61046927SAndroid Build Coastguard Worker
1283*61046927SAndroid Build Coastguard Worker fd_get_driver_uuid(device->driver_uuid);
1284*61046927SAndroid Build Coastguard Worker fd_get_device_uuid(device->device_uuid, &device->dev_id);
1285*61046927SAndroid Build Coastguard Worker
1286*61046927SAndroid Build Coastguard Worker struct vk_physical_device_dispatch_table dispatch_table;
1287*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints(
1288*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_physical_device_entrypoints, true);
1289*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints(
1290*61046927SAndroid Build Coastguard Worker &dispatch_table, &wsi_physical_device_entrypoints, false);
1291*61046927SAndroid Build Coastguard Worker
1292*61046927SAndroid Build Coastguard Worker result = vk_physical_device_init(&device->vk, &instance->vk,
1293*61046927SAndroid Build Coastguard Worker NULL, NULL, NULL, /* We set up extensions later */
1294*61046927SAndroid Build Coastguard Worker &dispatch_table);
1295*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1296*61046927SAndroid Build Coastguard Worker goto fail_free_name;
1297*61046927SAndroid Build Coastguard Worker
1298*61046927SAndroid Build Coastguard Worker get_device_extensions(device, &device->vk.supported_extensions);
1299*61046927SAndroid Build Coastguard Worker tu_get_features(device, &device->vk.supported_features);
1300*61046927SAndroid Build Coastguard Worker tu_get_properties(device, &device->vk.properties);
1301*61046927SAndroid Build Coastguard Worker
1302*61046927SAndroid Build Coastguard Worker device->vk.supported_sync_types = device->sync_types;
1303*61046927SAndroid Build Coastguard Worker
1304*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
1305*61046927SAndroid Build Coastguard Worker result = tu_wsi_init(device);
1306*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1307*61046927SAndroid Build Coastguard Worker vk_startup_errorf(instance, result, "WSI init failure");
1308*61046927SAndroid Build Coastguard Worker vk_physical_device_finish(&device->vk);
1309*61046927SAndroid Build Coastguard Worker goto fail_free_name;
1310*61046927SAndroid Build Coastguard Worker }
1311*61046927SAndroid Build Coastguard Worker #endif
1312*61046927SAndroid Build Coastguard Worker
1313*61046927SAndroid Build Coastguard Worker /* The gpu id is already embedded in the uuid so we just pass "tu"
1314*61046927SAndroid Build Coastguard Worker * when creating the cache.
1315*61046927SAndroid Build Coastguard Worker */
1316*61046927SAndroid Build Coastguard Worker char buf[VK_UUID_SIZE * 2 + 1];
1317*61046927SAndroid Build Coastguard Worker mesa_bytes_to_hex(buf, device->cache_uuid, VK_UUID_SIZE);
1318*61046927SAndroid Build Coastguard Worker device->vk.disk_cache = disk_cache_create(device->name, buf, 0);
1319*61046927SAndroid Build Coastguard Worker
1320*61046927SAndroid Build Coastguard Worker device->vk.pipeline_cache_import_ops = cache_import_ops;
1321*61046927SAndroid Build Coastguard Worker
1322*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1323*61046927SAndroid Build Coastguard Worker
1324*61046927SAndroid Build Coastguard Worker fail_free_name:
1325*61046927SAndroid Build Coastguard Worker vk_free(&instance->vk.alloc, (void *)device->name);
1326*61046927SAndroid Build Coastguard Worker return result;
1327*61046927SAndroid Build Coastguard Worker }
1328*61046927SAndroid Build Coastguard Worker
1329*61046927SAndroid Build Coastguard Worker static void
tu_physical_device_finish(struct tu_physical_device * device)1330*61046927SAndroid Build Coastguard Worker tu_physical_device_finish(struct tu_physical_device *device)
1331*61046927SAndroid Build Coastguard Worker {
1332*61046927SAndroid Build Coastguard Worker #ifdef TU_USE_WSI_PLATFORM
1333*61046927SAndroid Build Coastguard Worker tu_wsi_finish(device);
1334*61046927SAndroid Build Coastguard Worker #endif
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker close(device->local_fd);
1337*61046927SAndroid Build Coastguard Worker if (device->master_fd != -1)
1338*61046927SAndroid Build Coastguard Worker close(device->master_fd);
1339*61046927SAndroid Build Coastguard Worker
1340*61046927SAndroid Build Coastguard Worker if (device->kgsl_dma_fd != -1)
1341*61046927SAndroid Build Coastguard Worker close(device->kgsl_dma_fd);
1342*61046927SAndroid Build Coastguard Worker
1343*61046927SAndroid Build Coastguard Worker disk_cache_destroy(device->vk.disk_cache);
1344*61046927SAndroid Build Coastguard Worker vk_free(&device->instance->vk.alloc, (void *)device->name);
1345*61046927SAndroid Build Coastguard Worker
1346*61046927SAndroid Build Coastguard Worker vk_physical_device_finish(&device->vk);
1347*61046927SAndroid Build Coastguard Worker }
1348*61046927SAndroid Build Coastguard Worker
1349*61046927SAndroid Build Coastguard Worker static void
tu_destroy_physical_device(struct vk_physical_device * device)1350*61046927SAndroid Build Coastguard Worker tu_destroy_physical_device(struct vk_physical_device *device)
1351*61046927SAndroid Build Coastguard Worker {
1352*61046927SAndroid Build Coastguard Worker tu_physical_device_finish((struct tu_physical_device *) device);
1353*61046927SAndroid Build Coastguard Worker vk_free(&device->instance->alloc, device);
1354*61046927SAndroid Build Coastguard Worker }
1355*61046927SAndroid Build Coastguard Worker
1356*61046927SAndroid Build Coastguard Worker static const driOptionDescription tu_dri_options[] = {
1357*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_PERFORMANCE
1358*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
1359*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_KHR_PRESENT_WAIT(false)
1360*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false)
1361*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false)
1362*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_XWAYLAND_WAIT_READY(false)
1363*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_END
1364*61046927SAndroid Build Coastguard Worker
1365*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_DEBUG
1366*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_WSI_FORCE_BGRA8_UNORM_FIRST(false)
1367*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false)
1368*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_X11_IGNORE_SUBOPTIMAL(false)
1369*61046927SAndroid Build Coastguard Worker DRI_CONF_VK_DONT_CARE_AS_LOAD(false)
1370*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_END
1371*61046927SAndroid Build Coastguard Worker
1372*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_MISCELLANEOUS
1373*61046927SAndroid Build Coastguard Worker DRI_CONF_DISABLE_CONSERVATIVE_LRZ(false)
1374*61046927SAndroid Build Coastguard Worker DRI_CONF_TU_DONT_RESERVE_DESCRIPTOR_SET(false)
1375*61046927SAndroid Build Coastguard Worker DRI_CONF_TU_ALLOW_OOB_INDIRECT_UBO_LOADS(false)
1376*61046927SAndroid Build Coastguard Worker DRI_CONF_TU_DISABLE_D24S8_BORDER_COLOR_WORKAROUND(false)
1377*61046927SAndroid Build Coastguard Worker DRI_CONF_SECTION_END
1378*61046927SAndroid Build Coastguard Worker };
1379*61046927SAndroid Build Coastguard Worker
1380*61046927SAndroid Build Coastguard Worker static void
tu_init_dri_options(struct tu_instance * instance)1381*61046927SAndroid Build Coastguard Worker tu_init_dri_options(struct tu_instance *instance)
1382*61046927SAndroid Build Coastguard Worker {
1383*61046927SAndroid Build Coastguard Worker driParseOptionInfo(&instance->available_dri_options, tu_dri_options,
1384*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(tu_dri_options));
1385*61046927SAndroid Build Coastguard Worker driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "turnip", NULL, NULL,
1386*61046927SAndroid Build Coastguard Worker instance->vk.app_info.app_name, instance->vk.app_info.app_version,
1387*61046927SAndroid Build Coastguard Worker instance->vk.app_info.engine_name, instance->vk.app_info.engine_version);
1388*61046927SAndroid Build Coastguard Worker
1389*61046927SAndroid Build Coastguard Worker instance->dont_care_as_load =
1390*61046927SAndroid Build Coastguard Worker driQueryOptionb(&instance->dri_options, "vk_dont_care_as_load");
1391*61046927SAndroid Build Coastguard Worker instance->conservative_lrz =
1392*61046927SAndroid Build Coastguard Worker !driQueryOptionb(&instance->dri_options, "disable_conservative_lrz");
1393*61046927SAndroid Build Coastguard Worker instance->reserve_descriptor_set =
1394*61046927SAndroid Build Coastguard Worker !driQueryOptionb(&instance->dri_options, "tu_dont_reserve_descriptor_set");
1395*61046927SAndroid Build Coastguard Worker instance->allow_oob_indirect_ubo_loads =
1396*61046927SAndroid Build Coastguard Worker driQueryOptionb(&instance->dri_options, "tu_allow_oob_indirect_ubo_loads");
1397*61046927SAndroid Build Coastguard Worker instance->disable_d24s8_border_color_workaround =
1398*61046927SAndroid Build Coastguard Worker driQueryOptionb(&instance->dri_options, "tu_disable_d24s8_border_color_workaround");
1399*61046927SAndroid Build Coastguard Worker }
1400*61046927SAndroid Build Coastguard Worker
1401*61046927SAndroid Build Coastguard Worker static uint32_t instance_count = 0;
1402*61046927SAndroid Build Coastguard Worker
1403*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)1404*61046927SAndroid Build Coastguard Worker tu_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
1405*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1406*61046927SAndroid Build Coastguard Worker VkInstance *pInstance)
1407*61046927SAndroid Build Coastguard Worker {
1408*61046927SAndroid Build Coastguard Worker struct tu_instance *instance;
1409*61046927SAndroid Build Coastguard Worker VkResult result;
1410*61046927SAndroid Build Coastguard Worker
1411*61046927SAndroid Build Coastguard Worker tu_env_init();
1412*61046927SAndroid Build Coastguard Worker
1413*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO);
1414*61046927SAndroid Build Coastguard Worker
1415*61046927SAndroid Build Coastguard Worker if (pAllocator == NULL)
1416*61046927SAndroid Build Coastguard Worker pAllocator = vk_default_allocator();
1417*61046927SAndroid Build Coastguard Worker
1418*61046927SAndroid Build Coastguard Worker instance = (struct tu_instance *) vk_zalloc(
1419*61046927SAndroid Build Coastguard Worker pAllocator, sizeof(*instance), 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
1420*61046927SAndroid Build Coastguard Worker
1421*61046927SAndroid Build Coastguard Worker if (!instance)
1422*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY);
1423*61046927SAndroid Build Coastguard Worker
1424*61046927SAndroid Build Coastguard Worker struct vk_instance_dispatch_table dispatch_table;
1425*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(
1426*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_instance_entrypoints, true);
1427*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(
1428*61046927SAndroid Build Coastguard Worker &dispatch_table, &wsi_instance_entrypoints, false);
1429*61046927SAndroid Build Coastguard Worker
1430*61046927SAndroid Build Coastguard Worker result = vk_instance_init(&instance->vk,
1431*61046927SAndroid Build Coastguard Worker &tu_instance_extensions_supported,
1432*61046927SAndroid Build Coastguard Worker &dispatch_table,
1433*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator);
1434*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1435*61046927SAndroid Build Coastguard Worker vk_free(pAllocator, instance);
1436*61046927SAndroid Build Coastguard Worker return vk_error(NULL, result);
1437*61046927SAndroid Build Coastguard Worker }
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.try_create_for_drm =
1440*61046927SAndroid Build Coastguard Worker tu_physical_device_try_create;
1441*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.enumerate = tu_enumerate_devices;
1442*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.destroy = tu_destroy_physical_device;
1443*61046927SAndroid Build Coastguard Worker
1444*61046927SAndroid Build Coastguard Worker instance->instance_idx = p_atomic_fetch_add(&instance_count, 1);
1445*61046927SAndroid Build Coastguard Worker if (TU_DEBUG(STARTUP))
1446*61046927SAndroid Build Coastguard Worker mesa_logi("Created an instance");
1447*61046927SAndroid Build Coastguard Worker
1448*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false));
1449*61046927SAndroid Build Coastguard Worker
1450*61046927SAndroid Build Coastguard Worker tu_init_dri_options(instance);
1451*61046927SAndroid Build Coastguard Worker
1452*61046927SAndroid Build Coastguard Worker *pInstance = tu_instance_to_handle(instance);
1453*61046927SAndroid Build Coastguard Worker
1454*61046927SAndroid Build Coastguard Worker #ifdef HAVE_PERFETTO
1455*61046927SAndroid Build Coastguard Worker tu_perfetto_init();
1456*61046927SAndroid Build Coastguard Worker #endif
1457*61046927SAndroid Build Coastguard Worker
1458*61046927SAndroid Build Coastguard Worker util_gpuvis_init();
1459*61046927SAndroid Build Coastguard Worker
1460*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1461*61046927SAndroid Build Coastguard Worker }
1462*61046927SAndroid Build Coastguard Worker
1463*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_DestroyInstance(VkInstance _instance,const VkAllocationCallbacks * pAllocator)1464*61046927SAndroid Build Coastguard Worker tu_DestroyInstance(VkInstance _instance,
1465*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1466*61046927SAndroid Build Coastguard Worker {
1467*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_instance, instance, _instance);
1468*61046927SAndroid Build Coastguard Worker
1469*61046927SAndroid Build Coastguard Worker if (!instance)
1470*61046927SAndroid Build Coastguard Worker return;
1471*61046927SAndroid Build Coastguard Worker
1472*61046927SAndroid Build Coastguard Worker VG(VALGRIND_DESTROY_MEMPOOL(instance));
1473*61046927SAndroid Build Coastguard Worker
1474*61046927SAndroid Build Coastguard Worker driDestroyOptionCache(&instance->dri_options);
1475*61046927SAndroid Build Coastguard Worker driDestroyOptionInfo(&instance->available_dri_options);
1476*61046927SAndroid Build Coastguard Worker
1477*61046927SAndroid Build Coastguard Worker vk_instance_finish(&instance->vk);
1478*61046927SAndroid Build Coastguard Worker vk_free(&instance->vk.alloc, instance);
1479*61046927SAndroid Build Coastguard Worker }
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker static const VkQueueFamilyProperties tu_queue_family_properties = {
1482*61046927SAndroid Build Coastguard Worker .queueFlags =
1483*61046927SAndroid Build Coastguard Worker VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT,
1484*61046927SAndroid Build Coastguard Worker .queueCount = 1,
1485*61046927SAndroid Build Coastguard Worker .timestampValidBits = 48,
1486*61046927SAndroid Build Coastguard Worker .minImageTransferGranularity = { 1, 1, 1 },
1487*61046927SAndroid Build Coastguard Worker };
1488*61046927SAndroid Build Coastguard Worker
1489*61046927SAndroid Build Coastguard Worker static void
tu_physical_device_get_global_priority_properties(const struct tu_physical_device * pdevice,VkQueueFamilyGlobalPriorityPropertiesKHR * props)1490*61046927SAndroid Build Coastguard Worker tu_physical_device_get_global_priority_properties(const struct tu_physical_device *pdevice,
1491*61046927SAndroid Build Coastguard Worker VkQueueFamilyGlobalPriorityPropertiesKHR *props)
1492*61046927SAndroid Build Coastguard Worker {
1493*61046927SAndroid Build Coastguard Worker props->priorityCount = MIN2(pdevice->submitqueue_priority_count, 3);
1494*61046927SAndroid Build Coastguard Worker switch (props->priorityCount) {
1495*61046927SAndroid Build Coastguard Worker case 1:
1496*61046927SAndroid Build Coastguard Worker props->priorities[0] = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
1497*61046927SAndroid Build Coastguard Worker break;
1498*61046927SAndroid Build Coastguard Worker case 2:
1499*61046927SAndroid Build Coastguard Worker props->priorities[0] = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
1500*61046927SAndroid Build Coastguard Worker props->priorities[1] = VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR;
1501*61046927SAndroid Build Coastguard Worker break;
1502*61046927SAndroid Build Coastguard Worker case 3:
1503*61046927SAndroid Build Coastguard Worker props->priorities[0] = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR;
1504*61046927SAndroid Build Coastguard Worker props->priorities[1] = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
1505*61046927SAndroid Build Coastguard Worker props->priorities[2] = VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR;
1506*61046927SAndroid Build Coastguard Worker break;
1507*61046927SAndroid Build Coastguard Worker default:
1508*61046927SAndroid Build Coastguard Worker unreachable("unexpected priority count");
1509*61046927SAndroid Build Coastguard Worker break;
1510*61046927SAndroid Build Coastguard Worker }
1511*61046927SAndroid Build Coastguard Worker }
1512*61046927SAndroid Build Coastguard Worker
1513*61046927SAndroid Build Coastguard Worker static int
tu_physical_device_get_submitqueue_priority(const struct tu_physical_device * pdevice,VkQueueGlobalPriorityKHR global_priority,bool global_priority_query)1514*61046927SAndroid Build Coastguard Worker tu_physical_device_get_submitqueue_priority(const struct tu_physical_device *pdevice,
1515*61046927SAndroid Build Coastguard Worker VkQueueGlobalPriorityKHR global_priority,
1516*61046927SAndroid Build Coastguard Worker bool global_priority_query)
1517*61046927SAndroid Build Coastguard Worker {
1518*61046927SAndroid Build Coastguard Worker if (global_priority_query) {
1519*61046927SAndroid Build Coastguard Worker VkQueueFamilyGlobalPriorityPropertiesKHR props;
1520*61046927SAndroid Build Coastguard Worker tu_physical_device_get_global_priority_properties(pdevice, &props);
1521*61046927SAndroid Build Coastguard Worker
1522*61046927SAndroid Build Coastguard Worker bool valid = false;
1523*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < props.priorityCount; i++) {
1524*61046927SAndroid Build Coastguard Worker if (props.priorities[i] == global_priority) {
1525*61046927SAndroid Build Coastguard Worker valid = true;
1526*61046927SAndroid Build Coastguard Worker break;
1527*61046927SAndroid Build Coastguard Worker }
1528*61046927SAndroid Build Coastguard Worker }
1529*61046927SAndroid Build Coastguard Worker
1530*61046927SAndroid Build Coastguard Worker if (!valid)
1531*61046927SAndroid Build Coastguard Worker return -1;
1532*61046927SAndroid Build Coastguard Worker }
1533*61046927SAndroid Build Coastguard Worker
1534*61046927SAndroid Build Coastguard Worker /* Valid values are from 0 to (pdevice->submitqueue_priority_count - 1),
1535*61046927SAndroid Build Coastguard Worker * with 0 being the highest priority. This matches what freedreno does.
1536*61046927SAndroid Build Coastguard Worker */
1537*61046927SAndroid Build Coastguard Worker int priority;
1538*61046927SAndroid Build Coastguard Worker if (global_priority == VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR)
1539*61046927SAndroid Build Coastguard Worker priority = pdevice->submitqueue_priority_count / 2;
1540*61046927SAndroid Build Coastguard Worker else if (global_priority < VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR)
1541*61046927SAndroid Build Coastguard Worker priority = pdevice->submitqueue_priority_count - 1;
1542*61046927SAndroid Build Coastguard Worker else
1543*61046927SAndroid Build Coastguard Worker priority = 0;
1544*61046927SAndroid Build Coastguard Worker
1545*61046927SAndroid Build Coastguard Worker return priority;
1546*61046927SAndroid Build Coastguard Worker }
1547*61046927SAndroid Build Coastguard Worker
1548*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties)1549*61046927SAndroid Build Coastguard Worker tu_GetPhysicalDeviceQueueFamilyProperties2(
1550*61046927SAndroid Build Coastguard Worker VkPhysicalDevice physicalDevice,
1551*61046927SAndroid Build Coastguard Worker uint32_t *pQueueFamilyPropertyCount,
1552*61046927SAndroid Build Coastguard Worker VkQueueFamilyProperties2 *pQueueFamilyProperties)
1553*61046927SAndroid Build Coastguard Worker {
1554*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
1555*61046927SAndroid Build Coastguard Worker
1556*61046927SAndroid Build Coastguard Worker VK_OUTARRAY_MAKE_TYPED(VkQueueFamilyProperties2, out,
1557*61046927SAndroid Build Coastguard Worker pQueueFamilyProperties, pQueueFamilyPropertyCount);
1558*61046927SAndroid Build Coastguard Worker
1559*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkQueueFamilyProperties2, &out, p)
1560*61046927SAndroid Build Coastguard Worker {
1561*61046927SAndroid Build Coastguard Worker p->queueFamilyProperties = tu_queue_family_properties;
1562*61046927SAndroid Build Coastguard Worker
1563*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, p->pNext) {
1564*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
1565*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR: {
1566*61046927SAndroid Build Coastguard Worker VkQueueFamilyGlobalPriorityPropertiesKHR *props =
1567*61046927SAndroid Build Coastguard Worker (VkQueueFamilyGlobalPriorityPropertiesKHR *) ext;
1568*61046927SAndroid Build Coastguard Worker tu_physical_device_get_global_priority_properties(pdevice, props);
1569*61046927SAndroid Build Coastguard Worker break;
1570*61046927SAndroid Build Coastguard Worker }
1571*61046927SAndroid Build Coastguard Worker default:
1572*61046927SAndroid Build Coastguard Worker break;
1573*61046927SAndroid Build Coastguard Worker }
1574*61046927SAndroid Build Coastguard Worker }
1575*61046927SAndroid Build Coastguard Worker }
1576*61046927SAndroid Build Coastguard Worker }
1577*61046927SAndroid Build Coastguard Worker
1578*61046927SAndroid Build Coastguard Worker uint64_t
tu_get_system_heap_size(struct tu_physical_device * physical_device)1579*61046927SAndroid Build Coastguard Worker tu_get_system_heap_size(struct tu_physical_device *physical_device)
1580*61046927SAndroid Build Coastguard Worker {
1581*61046927SAndroid Build Coastguard Worker uint64_t total_ram = 0;
1582*61046927SAndroid Build Coastguard Worker ASSERTED bool has_physical_memory =
1583*61046927SAndroid Build Coastguard Worker os_get_total_physical_memory(&total_ram);
1584*61046927SAndroid Build Coastguard Worker assert(has_physical_memory);
1585*61046927SAndroid Build Coastguard Worker
1586*61046927SAndroid Build Coastguard Worker /* We don't want to burn too much ram with the GPU. If the user has 4GiB
1587*61046927SAndroid Build Coastguard Worker * or less, we use at most half. If they have more than 4GiB, we use 3/4.
1588*61046927SAndroid Build Coastguard Worker */
1589*61046927SAndroid Build Coastguard Worker uint64_t available_ram;
1590*61046927SAndroid Build Coastguard Worker if (total_ram <= 4ull * 1024ull * 1024ull * 1024ull)
1591*61046927SAndroid Build Coastguard Worker available_ram = total_ram / 2;
1592*61046927SAndroid Build Coastguard Worker else
1593*61046927SAndroid Build Coastguard Worker available_ram = total_ram * 3 / 4;
1594*61046927SAndroid Build Coastguard Worker
1595*61046927SAndroid Build Coastguard Worker if (physical_device->va_size)
1596*61046927SAndroid Build Coastguard Worker available_ram = MIN2(available_ram, physical_device->va_size);
1597*61046927SAndroid Build Coastguard Worker
1598*61046927SAndroid Build Coastguard Worker return available_ram;
1599*61046927SAndroid Build Coastguard Worker }
1600*61046927SAndroid Build Coastguard Worker
1601*61046927SAndroid Build Coastguard Worker static VkDeviceSize
tu_get_budget_memory(struct tu_physical_device * physical_device)1602*61046927SAndroid Build Coastguard Worker tu_get_budget_memory(struct tu_physical_device *physical_device)
1603*61046927SAndroid Build Coastguard Worker {
1604*61046927SAndroid Build Coastguard Worker uint64_t heap_size = physical_device->heap.size;
1605*61046927SAndroid Build Coastguard Worker uint64_t heap_used = physical_device->heap.used;
1606*61046927SAndroid Build Coastguard Worker uint64_t sys_available;
1607*61046927SAndroid Build Coastguard Worker ASSERTED bool has_available_memory =
1608*61046927SAndroid Build Coastguard Worker os_get_available_system_memory(&sys_available);
1609*61046927SAndroid Build Coastguard Worker assert(has_available_memory);
1610*61046927SAndroid Build Coastguard Worker
1611*61046927SAndroid Build Coastguard Worker if (physical_device->va_size)
1612*61046927SAndroid Build Coastguard Worker sys_available = MIN2(sys_available, physical_device->va_size);
1613*61046927SAndroid Build Coastguard Worker
1614*61046927SAndroid Build Coastguard Worker /*
1615*61046927SAndroid Build Coastguard Worker * Let's not incite the app to starve the system: report at most 90% of
1616*61046927SAndroid Build Coastguard Worker * available system memory.
1617*61046927SAndroid Build Coastguard Worker */
1618*61046927SAndroid Build Coastguard Worker uint64_t heap_available = sys_available * 9 / 10;
1619*61046927SAndroid Build Coastguard Worker return MIN2(heap_size, heap_used + heap_available);
1620*61046927SAndroid Build Coastguard Worker }
1621*61046927SAndroid Build Coastguard Worker
1622*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice pdev,VkPhysicalDeviceMemoryProperties2 * props2)1623*61046927SAndroid Build Coastguard Worker tu_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice pdev,
1624*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties2 *props2)
1625*61046927SAndroid Build Coastguard Worker {
1626*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_physical_device, physical_device, pdev);
1627*61046927SAndroid Build Coastguard Worker
1628*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties *props = &props2->memoryProperties;
1629*61046927SAndroid Build Coastguard Worker props->memoryHeapCount = 1;
1630*61046927SAndroid Build Coastguard Worker props->memoryHeaps[0].size = physical_device->heap.size;
1631*61046927SAndroid Build Coastguard Worker props->memoryHeaps[0].flags = physical_device->heap.flags;
1632*61046927SAndroid Build Coastguard Worker
1633*61046927SAndroid Build Coastguard Worker props->memoryTypeCount = physical_device->memory.type_count;
1634*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < physical_device->memory.type_count; i++) {
1635*61046927SAndroid Build Coastguard Worker props->memoryTypes[i] = (VkMemoryType) {
1636*61046927SAndroid Build Coastguard Worker .propertyFlags = physical_device->memory.types[i],
1637*61046927SAndroid Build Coastguard Worker .heapIndex = 0,
1638*61046927SAndroid Build Coastguard Worker };
1639*61046927SAndroid Build Coastguard Worker }
1640*61046927SAndroid Build Coastguard Worker
1641*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, props2->pNext)
1642*61046927SAndroid Build Coastguard Worker {
1643*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
1644*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
1645*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryBudgetPropertiesEXT *memory_budget_props =
1646*61046927SAndroid Build Coastguard Worker (VkPhysicalDeviceMemoryBudgetPropertiesEXT *) ext;
1647*61046927SAndroid Build Coastguard Worker memory_budget_props->heapUsage[0] = physical_device->heap.used;
1648*61046927SAndroid Build Coastguard Worker memory_budget_props->heapBudget[0] = tu_get_budget_memory(physical_device);
1649*61046927SAndroid Build Coastguard Worker
1650*61046927SAndroid Build Coastguard Worker /* The heapBudget and heapUsage values must be zero for array elements
1651*61046927SAndroid Build Coastguard Worker * greater than or equal to VkPhysicalDeviceMemoryProperties::memoryHeapCount
1652*61046927SAndroid Build Coastguard Worker */
1653*61046927SAndroid Build Coastguard Worker for (unsigned i = 1; i < VK_MAX_MEMORY_HEAPS; i++) {
1654*61046927SAndroid Build Coastguard Worker memory_budget_props->heapBudget[i] = 0u;
1655*61046927SAndroid Build Coastguard Worker memory_budget_props->heapUsage[i] = 0u;
1656*61046927SAndroid Build Coastguard Worker }
1657*61046927SAndroid Build Coastguard Worker break;
1658*61046927SAndroid Build Coastguard Worker }
1659*61046927SAndroid Build Coastguard Worker default:
1660*61046927SAndroid Build Coastguard Worker break;
1661*61046927SAndroid Build Coastguard Worker }
1662*61046927SAndroid Build Coastguard Worker }
1663*61046927SAndroid Build Coastguard Worker }
1664*61046927SAndroid Build Coastguard Worker
1665*61046927SAndroid Build Coastguard Worker static VkResult
tu_queue_init(struct tu_device * device,struct tu_queue * queue,int idx,const VkDeviceQueueCreateInfo * create_info,bool global_priority_query)1666*61046927SAndroid Build Coastguard Worker tu_queue_init(struct tu_device *device,
1667*61046927SAndroid Build Coastguard Worker struct tu_queue *queue,
1668*61046927SAndroid Build Coastguard Worker int idx,
1669*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *create_info,
1670*61046927SAndroid Build Coastguard Worker bool global_priority_query)
1671*61046927SAndroid Build Coastguard Worker {
1672*61046927SAndroid Build Coastguard Worker const VkDeviceQueueGlobalPriorityCreateInfoKHR *priority_info =
1673*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext,
1674*61046927SAndroid Build Coastguard Worker DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR);
1675*61046927SAndroid Build Coastguard Worker const enum VkQueueGlobalPriorityKHR global_priority = priority_info ?
1676*61046927SAndroid Build Coastguard Worker priority_info->globalPriority : VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR;
1677*61046927SAndroid Build Coastguard Worker
1678*61046927SAndroid Build Coastguard Worker const int priority = tu_physical_device_get_submitqueue_priority(
1679*61046927SAndroid Build Coastguard Worker device->physical_device, global_priority, global_priority_query);
1680*61046927SAndroid Build Coastguard Worker if (priority < 0) {
1681*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(device->instance, VK_ERROR_INITIALIZATION_FAILED,
1682*61046927SAndroid Build Coastguard Worker "invalid global priority");
1683*61046927SAndroid Build Coastguard Worker }
1684*61046927SAndroid Build Coastguard Worker
1685*61046927SAndroid Build Coastguard Worker VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx);
1686*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1687*61046927SAndroid Build Coastguard Worker return result;
1688*61046927SAndroid Build Coastguard Worker
1689*61046927SAndroid Build Coastguard Worker queue->device = device;
1690*61046927SAndroid Build Coastguard Worker queue->priority = priority;
1691*61046927SAndroid Build Coastguard Worker queue->vk.driver_submit = tu_queue_submit;
1692*61046927SAndroid Build Coastguard Worker
1693*61046927SAndroid Build Coastguard Worker int ret = tu_drm_submitqueue_new(device, priority, &queue->msm_queue_id);
1694*61046927SAndroid Build Coastguard Worker if (ret)
1695*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(device->instance, VK_ERROR_INITIALIZATION_FAILED,
1696*61046927SAndroid Build Coastguard Worker "submitqueue create failed");
1697*61046927SAndroid Build Coastguard Worker
1698*61046927SAndroid Build Coastguard Worker queue->fence = -1;
1699*61046927SAndroid Build Coastguard Worker
1700*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1701*61046927SAndroid Build Coastguard Worker }
1702*61046927SAndroid Build Coastguard Worker
1703*61046927SAndroid Build Coastguard Worker static void
tu_queue_finish(struct tu_queue * queue)1704*61046927SAndroid Build Coastguard Worker tu_queue_finish(struct tu_queue *queue)
1705*61046927SAndroid Build Coastguard Worker {
1706*61046927SAndroid Build Coastguard Worker vk_queue_finish(&queue->vk);
1707*61046927SAndroid Build Coastguard Worker tu_drm_submitqueue_close(queue->device, queue->msm_queue_id);
1708*61046927SAndroid Build Coastguard Worker }
1709*61046927SAndroid Build Coastguard Worker
1710*61046927SAndroid Build Coastguard Worker uint64_t
tu_device_ticks_to_ns(struct tu_device * dev,uint64_t ts)1711*61046927SAndroid Build Coastguard Worker tu_device_ticks_to_ns(struct tu_device *dev, uint64_t ts)
1712*61046927SAndroid Build Coastguard Worker {
1713*61046927SAndroid Build Coastguard Worker /* This is based on the 19.2MHz always-on rbbm timer.
1714*61046927SAndroid Build Coastguard Worker *
1715*61046927SAndroid Build Coastguard Worker * TODO we should probably query this value from kernel..
1716*61046927SAndroid Build Coastguard Worker */
1717*61046927SAndroid Build Coastguard Worker return ts * (1000000000 / 19200000);
1718*61046927SAndroid Build Coastguard Worker }
1719*61046927SAndroid Build Coastguard Worker
1720*61046927SAndroid Build Coastguard Worker struct u_trace_context *
tu_device_get_u_trace(struct tu_device * device)1721*61046927SAndroid Build Coastguard Worker tu_device_get_u_trace(struct tu_device *device)
1722*61046927SAndroid Build Coastguard Worker {
1723*61046927SAndroid Build Coastguard Worker return &device->trace_context;
1724*61046927SAndroid Build Coastguard Worker }
1725*61046927SAndroid Build Coastguard Worker
1726*61046927SAndroid Build Coastguard Worker static void*
tu_trace_create_buffer(struct u_trace_context * utctx,uint64_t size_B)1727*61046927SAndroid Build Coastguard Worker tu_trace_create_buffer(struct u_trace_context *utctx, uint64_t size_B)
1728*61046927SAndroid Build Coastguard Worker {
1729*61046927SAndroid Build Coastguard Worker struct tu_device *device =
1730*61046927SAndroid Build Coastguard Worker container_of(utctx, struct tu_device, trace_context);
1731*61046927SAndroid Build Coastguard Worker
1732*61046927SAndroid Build Coastguard Worker struct tu_bo *bo;
1733*61046927SAndroid Build Coastguard Worker tu_bo_init_new(device, NULL, &bo, size_B, TU_BO_ALLOC_INTERNAL_RESOURCE, "trace");
1734*61046927SAndroid Build Coastguard Worker tu_bo_map(device, bo, NULL);
1735*61046927SAndroid Build Coastguard Worker
1736*61046927SAndroid Build Coastguard Worker return bo;
1737*61046927SAndroid Build Coastguard Worker }
1738*61046927SAndroid Build Coastguard Worker
1739*61046927SAndroid Build Coastguard Worker static void
tu_trace_destroy_buffer(struct u_trace_context * utctx,void * timestamps)1740*61046927SAndroid Build Coastguard Worker tu_trace_destroy_buffer(struct u_trace_context *utctx, void *timestamps)
1741*61046927SAndroid Build Coastguard Worker {
1742*61046927SAndroid Build Coastguard Worker struct tu_device *device =
1743*61046927SAndroid Build Coastguard Worker container_of(utctx, struct tu_device, trace_context);
1744*61046927SAndroid Build Coastguard Worker struct tu_bo *bo = (struct tu_bo *) timestamps;
1745*61046927SAndroid Build Coastguard Worker
1746*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, bo);
1747*61046927SAndroid Build Coastguard Worker }
1748*61046927SAndroid Build Coastguard Worker
1749*61046927SAndroid Build Coastguard Worker template <chip CHIP>
1750*61046927SAndroid Build Coastguard Worker static void
tu_trace_record_ts(struct u_trace * ut,void * cs,void * timestamps,uint64_t offset_B,uint32_t)1751*61046927SAndroid Build Coastguard Worker tu_trace_record_ts(struct u_trace *ut, void *cs, void *timestamps,
1752*61046927SAndroid Build Coastguard Worker uint64_t offset_B, uint32_t)
1753*61046927SAndroid Build Coastguard Worker {
1754*61046927SAndroid Build Coastguard Worker struct tu_bo *bo = (struct tu_bo *) timestamps;
1755*61046927SAndroid Build Coastguard Worker struct tu_cs *ts_cs = (struct tu_cs *) cs;
1756*61046927SAndroid Build Coastguard Worker
1757*61046927SAndroid Build Coastguard Worker if (CHIP == A6XX) {
1758*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(ts_cs, CP_EVENT_WRITE, 4);
1759*61046927SAndroid Build Coastguard Worker tu_cs_emit(ts_cs, CP_EVENT_WRITE_0_EVENT(RB_DONE_TS) |
1760*61046927SAndroid Build Coastguard Worker CP_EVENT_WRITE_0_TIMESTAMP);
1761*61046927SAndroid Build Coastguard Worker tu_cs_emit_qw(ts_cs, bo->iova + offset_B);
1762*61046927SAndroid Build Coastguard Worker tu_cs_emit(ts_cs, 0x00000000);
1763*61046927SAndroid Build Coastguard Worker } else {
1764*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(ts_cs, CP_EVENT_WRITE7, 3);
1765*61046927SAndroid Build Coastguard Worker tu_cs_emit(ts_cs, CP_EVENT_WRITE7_0(.event = RB_DONE_TS,
1766*61046927SAndroid Build Coastguard Worker .write_src = EV_WRITE_ALWAYSON,
1767*61046927SAndroid Build Coastguard Worker .write_dst = EV_DST_RAM,
1768*61046927SAndroid Build Coastguard Worker .write_enabled = true)
1769*61046927SAndroid Build Coastguard Worker .value);
1770*61046927SAndroid Build Coastguard Worker tu_cs_emit_qw(ts_cs, bo->iova + offset_B);
1771*61046927SAndroid Build Coastguard Worker }
1772*61046927SAndroid Build Coastguard Worker }
1773*61046927SAndroid Build Coastguard Worker
1774*61046927SAndroid Build Coastguard Worker static uint64_t
tu_trace_read_ts(struct u_trace_context * utctx,void * timestamps,uint64_t offset_B,void * flush_data)1775*61046927SAndroid Build Coastguard Worker tu_trace_read_ts(struct u_trace_context *utctx,
1776*61046927SAndroid Build Coastguard Worker void *timestamps, uint64_t offset_B, void *flush_data)
1777*61046927SAndroid Build Coastguard Worker {
1778*61046927SAndroid Build Coastguard Worker struct tu_device *device =
1779*61046927SAndroid Build Coastguard Worker container_of(utctx, struct tu_device, trace_context);
1780*61046927SAndroid Build Coastguard Worker struct tu_bo *bo = (struct tu_bo *) timestamps;
1781*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data *submission_data =
1782*61046927SAndroid Build Coastguard Worker (struct tu_u_trace_submission_data *) flush_data;
1783*61046927SAndroid Build Coastguard Worker
1784*61046927SAndroid Build Coastguard Worker /* Only need to stall on results for the first entry: */
1785*61046927SAndroid Build Coastguard Worker if (offset_B == 0) {
1786*61046927SAndroid Build Coastguard Worker tu_device_wait_u_trace(device, submission_data->syncobj);
1787*61046927SAndroid Build Coastguard Worker }
1788*61046927SAndroid Build Coastguard Worker
1789*61046927SAndroid Build Coastguard Worker if (tu_bo_map(device, bo, NULL) != VK_SUCCESS) {
1790*61046927SAndroid Build Coastguard Worker return U_TRACE_NO_TIMESTAMP;
1791*61046927SAndroid Build Coastguard Worker }
1792*61046927SAndroid Build Coastguard Worker
1793*61046927SAndroid Build Coastguard Worker uint64_t *ts = (uint64_t *) ((char *)bo->map + offset_B);
1794*61046927SAndroid Build Coastguard Worker
1795*61046927SAndroid Build Coastguard Worker /* Don't translate the no-timestamp marker: */
1796*61046927SAndroid Build Coastguard Worker if (*ts == U_TRACE_NO_TIMESTAMP)
1797*61046927SAndroid Build Coastguard Worker return U_TRACE_NO_TIMESTAMP;
1798*61046927SAndroid Build Coastguard Worker
1799*61046927SAndroid Build Coastguard Worker return tu_device_ticks_to_ns(device, *ts);
1800*61046927SAndroid Build Coastguard Worker }
1801*61046927SAndroid Build Coastguard Worker
1802*61046927SAndroid Build Coastguard Worker static void
tu_trace_delete_flush_data(struct u_trace_context * utctx,void * flush_data)1803*61046927SAndroid Build Coastguard Worker tu_trace_delete_flush_data(struct u_trace_context *utctx, void *flush_data)
1804*61046927SAndroid Build Coastguard Worker {
1805*61046927SAndroid Build Coastguard Worker struct tu_device *device =
1806*61046927SAndroid Build Coastguard Worker container_of(utctx, struct tu_device, trace_context);
1807*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data *submission_data =
1808*61046927SAndroid Build Coastguard Worker (struct tu_u_trace_submission_data *) flush_data;
1809*61046927SAndroid Build Coastguard Worker
1810*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_finish(device, submission_data);
1811*61046927SAndroid Build Coastguard Worker }
1812*61046927SAndroid Build Coastguard Worker
1813*61046927SAndroid Build Coastguard Worker void
tu_copy_buffer(struct u_trace_context * utctx,void * cmdstream,void * ts_from,uint64_t from_offset_B,void * ts_to,uint64_t to_offset_B,uint64_t size_B)1814*61046927SAndroid Build Coastguard Worker tu_copy_buffer(struct u_trace_context *utctx, void *cmdstream,
1815*61046927SAndroid Build Coastguard Worker void *ts_from, uint64_t from_offset_B,
1816*61046927SAndroid Build Coastguard Worker void *ts_to, uint64_t to_offset_B,
1817*61046927SAndroid Build Coastguard Worker uint64_t size_B)
1818*61046927SAndroid Build Coastguard Worker {
1819*61046927SAndroid Build Coastguard Worker struct tu_cs *cs = (struct tu_cs *) cmdstream;
1820*61046927SAndroid Build Coastguard Worker struct tu_bo *bo_from = (struct tu_bo *) ts_from;
1821*61046927SAndroid Build Coastguard Worker struct tu_bo *bo_to = (struct tu_bo *) ts_to;
1822*61046927SAndroid Build Coastguard Worker
1823*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(cs, CP_MEMCPY, 5);
1824*61046927SAndroid Build Coastguard Worker tu_cs_emit(cs, size_B / sizeof(uint32_t));
1825*61046927SAndroid Build Coastguard Worker tu_cs_emit_qw(cs, bo_from->iova + from_offset_B);
1826*61046927SAndroid Build Coastguard Worker tu_cs_emit_qw(cs, bo_to->iova + to_offset_B);
1827*61046927SAndroid Build Coastguard Worker }
1828*61046927SAndroid Build Coastguard Worker
1829*61046927SAndroid Build Coastguard Worker static void
tu_trace_capture_data(struct u_trace * ut,void * cs,void * dst_buffer,uint64_t dst_offset_B,void * src_buffer,uint64_t src_offset_B,uint32_t size_B)1830*61046927SAndroid Build Coastguard Worker tu_trace_capture_data(struct u_trace *ut,
1831*61046927SAndroid Build Coastguard Worker void *cs,
1832*61046927SAndroid Build Coastguard Worker void *dst_buffer,
1833*61046927SAndroid Build Coastguard Worker uint64_t dst_offset_B,
1834*61046927SAndroid Build Coastguard Worker void *src_buffer,
1835*61046927SAndroid Build Coastguard Worker uint64_t src_offset_B,
1836*61046927SAndroid Build Coastguard Worker uint32_t size_B)
1837*61046927SAndroid Build Coastguard Worker {
1838*61046927SAndroid Build Coastguard Worker if (src_buffer)
1839*61046927SAndroid Build Coastguard Worker tu_copy_buffer(ut->utctx, cs, src_buffer, src_offset_B, dst_buffer,
1840*61046927SAndroid Build Coastguard Worker dst_offset_B, size_B);
1841*61046927SAndroid Build Coastguard Worker }
1842*61046927SAndroid Build Coastguard Worker
1843*61046927SAndroid Build Coastguard Worker static const void *
tu_trace_get_data(struct u_trace_context * utctx,void * buffer,uint64_t offset_B,uint32_t size_B)1844*61046927SAndroid Build Coastguard Worker tu_trace_get_data(struct u_trace_context *utctx,
1845*61046927SAndroid Build Coastguard Worker void *buffer,
1846*61046927SAndroid Build Coastguard Worker uint64_t offset_B,
1847*61046927SAndroid Build Coastguard Worker uint32_t size_B)
1848*61046927SAndroid Build Coastguard Worker {
1849*61046927SAndroid Build Coastguard Worker struct tu_bo *bo = (struct tu_bo *) buffer;
1850*61046927SAndroid Build Coastguard Worker return (char *) bo->map + offset_B;
1851*61046927SAndroid Build Coastguard Worker }
1852*61046927SAndroid Build Coastguard Worker
1853*61046927SAndroid Build Coastguard Worker /* Special helpers instead of u_trace_begin_iterator()/u_trace_end_iterator()
1854*61046927SAndroid Build Coastguard Worker * that ignore tracepoints at the beginning/end that are part of a
1855*61046927SAndroid Build Coastguard Worker * suspend/resume chain.
1856*61046927SAndroid Build Coastguard Worker */
1857*61046927SAndroid Build Coastguard Worker static struct u_trace_iterator
tu_cmd_begin_iterator(struct tu_cmd_buffer * cmdbuf)1858*61046927SAndroid Build Coastguard Worker tu_cmd_begin_iterator(struct tu_cmd_buffer *cmdbuf)
1859*61046927SAndroid Build Coastguard Worker {
1860*61046927SAndroid Build Coastguard Worker switch (cmdbuf->state.suspend_resume) {
1861*61046927SAndroid Build Coastguard Worker case SR_IN_PRE_CHAIN:
1862*61046927SAndroid Build Coastguard Worker return cmdbuf->trace_renderpass_end;
1863*61046927SAndroid Build Coastguard Worker case SR_AFTER_PRE_CHAIN:
1864*61046927SAndroid Build Coastguard Worker case SR_IN_CHAIN_AFTER_PRE_CHAIN:
1865*61046927SAndroid Build Coastguard Worker return cmdbuf->pre_chain.trace_renderpass_end;
1866*61046927SAndroid Build Coastguard Worker default:
1867*61046927SAndroid Build Coastguard Worker return u_trace_begin_iterator(&cmdbuf->trace);
1868*61046927SAndroid Build Coastguard Worker }
1869*61046927SAndroid Build Coastguard Worker }
1870*61046927SAndroid Build Coastguard Worker
1871*61046927SAndroid Build Coastguard Worker static struct u_trace_iterator
tu_cmd_end_iterator(struct tu_cmd_buffer * cmdbuf)1872*61046927SAndroid Build Coastguard Worker tu_cmd_end_iterator(struct tu_cmd_buffer *cmdbuf)
1873*61046927SAndroid Build Coastguard Worker {
1874*61046927SAndroid Build Coastguard Worker switch (cmdbuf->state.suspend_resume) {
1875*61046927SAndroid Build Coastguard Worker case SR_IN_PRE_CHAIN:
1876*61046927SAndroid Build Coastguard Worker return cmdbuf->trace_renderpass_end;
1877*61046927SAndroid Build Coastguard Worker case SR_IN_CHAIN:
1878*61046927SAndroid Build Coastguard Worker case SR_IN_CHAIN_AFTER_PRE_CHAIN:
1879*61046927SAndroid Build Coastguard Worker return cmdbuf->trace_renderpass_start;
1880*61046927SAndroid Build Coastguard Worker default:
1881*61046927SAndroid Build Coastguard Worker return u_trace_end_iterator(&cmdbuf->trace);
1882*61046927SAndroid Build Coastguard Worker }
1883*61046927SAndroid Build Coastguard Worker }
1884*61046927SAndroid Build Coastguard Worker VkResult
tu_create_copy_timestamp_cs(struct tu_cmd_buffer * cmdbuf,struct tu_cs ** cs,struct u_trace ** trace_copy)1885*61046927SAndroid Build Coastguard Worker tu_create_copy_timestamp_cs(struct tu_cmd_buffer *cmdbuf, struct tu_cs** cs,
1886*61046927SAndroid Build Coastguard Worker struct u_trace **trace_copy)
1887*61046927SAndroid Build Coastguard Worker {
1888*61046927SAndroid Build Coastguard Worker *cs = (struct tu_cs *) vk_zalloc(&cmdbuf->device->vk.alloc,
1889*61046927SAndroid Build Coastguard Worker sizeof(struct tu_cs), 8,
1890*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
1891*61046927SAndroid Build Coastguard Worker
1892*61046927SAndroid Build Coastguard Worker if (*cs == NULL) {
1893*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_HOST_MEMORY;
1894*61046927SAndroid Build Coastguard Worker }
1895*61046927SAndroid Build Coastguard Worker
1896*61046927SAndroid Build Coastguard Worker tu_cs_init(*cs, cmdbuf->device, TU_CS_MODE_GROW,
1897*61046927SAndroid Build Coastguard Worker list_length(&cmdbuf->trace.trace_chunks) * 6 * 2 + 3, "trace copy timestamp cs");
1898*61046927SAndroid Build Coastguard Worker
1899*61046927SAndroid Build Coastguard Worker tu_cs_begin(*cs);
1900*61046927SAndroid Build Coastguard Worker
1901*61046927SAndroid Build Coastguard Worker tu_cs_emit_wfi(*cs);
1902*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(*cs, CP_WAIT_FOR_ME, 0);
1903*61046927SAndroid Build Coastguard Worker
1904*61046927SAndroid Build Coastguard Worker *trace_copy = (struct u_trace *) vk_zalloc(
1905*61046927SAndroid Build Coastguard Worker &cmdbuf->device->vk.alloc, sizeof(struct u_trace), 8,
1906*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
1907*61046927SAndroid Build Coastguard Worker
1908*61046927SAndroid Build Coastguard Worker if (*trace_copy == NULL) {
1909*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_HOST_MEMORY;
1910*61046927SAndroid Build Coastguard Worker }
1911*61046927SAndroid Build Coastguard Worker
1912*61046927SAndroid Build Coastguard Worker u_trace_init(*trace_copy, cmdbuf->trace.utctx);
1913*61046927SAndroid Build Coastguard Worker u_trace_clone_append(tu_cmd_begin_iterator(cmdbuf),
1914*61046927SAndroid Build Coastguard Worker tu_cmd_end_iterator(cmdbuf),
1915*61046927SAndroid Build Coastguard Worker *trace_copy, *cs,
1916*61046927SAndroid Build Coastguard Worker tu_copy_buffer);
1917*61046927SAndroid Build Coastguard Worker
1918*61046927SAndroid Build Coastguard Worker tu_cs_emit_wfi(*cs);
1919*61046927SAndroid Build Coastguard Worker
1920*61046927SAndroid Build Coastguard Worker tu_cs_end(*cs);
1921*61046927SAndroid Build Coastguard Worker
1922*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1923*61046927SAndroid Build Coastguard Worker }
1924*61046927SAndroid Build Coastguard Worker
1925*61046927SAndroid Build Coastguard Worker VkResult
tu_u_trace_submission_data_create(struct tu_device * device,struct tu_cmd_buffer ** cmd_buffers,uint32_t cmd_buffer_count,struct tu_u_trace_submission_data ** submission_data)1926*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_create(
1927*61046927SAndroid Build Coastguard Worker struct tu_device *device,
1928*61046927SAndroid Build Coastguard Worker struct tu_cmd_buffer **cmd_buffers,
1929*61046927SAndroid Build Coastguard Worker uint32_t cmd_buffer_count,
1930*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data **submission_data)
1931*61046927SAndroid Build Coastguard Worker {
1932*61046927SAndroid Build Coastguard Worker *submission_data = (struct tu_u_trace_submission_data *)
1933*61046927SAndroid Build Coastguard Worker vk_zalloc(&device->vk.alloc,
1934*61046927SAndroid Build Coastguard Worker sizeof(struct tu_u_trace_submission_data), 8,
1935*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
1936*61046927SAndroid Build Coastguard Worker
1937*61046927SAndroid Build Coastguard Worker if (!(*submission_data)) {
1938*61046927SAndroid Build Coastguard Worker return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
1939*61046927SAndroid Build Coastguard Worker }
1940*61046927SAndroid Build Coastguard Worker
1941*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data *data = *submission_data;
1942*61046927SAndroid Build Coastguard Worker
1943*61046927SAndroid Build Coastguard Worker data->cmd_trace_data = (struct tu_u_trace_cmd_data *) vk_zalloc(
1944*61046927SAndroid Build Coastguard Worker &device->vk.alloc,
1945*61046927SAndroid Build Coastguard Worker cmd_buffer_count * sizeof(struct tu_u_trace_cmd_data), 8,
1946*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
1947*61046927SAndroid Build Coastguard Worker
1948*61046927SAndroid Build Coastguard Worker if (!data->cmd_trace_data) {
1949*61046927SAndroid Build Coastguard Worker goto fail;
1950*61046927SAndroid Build Coastguard Worker }
1951*61046927SAndroid Build Coastguard Worker
1952*61046927SAndroid Build Coastguard Worker data->cmd_buffer_count = cmd_buffer_count;
1953*61046927SAndroid Build Coastguard Worker data->last_buffer_with_tracepoints = -1;
1954*61046927SAndroid Build Coastguard Worker
1955*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < cmd_buffer_count; ++i) {
1956*61046927SAndroid Build Coastguard Worker struct tu_cmd_buffer *cmdbuf = cmd_buffers[i];
1957*61046927SAndroid Build Coastguard Worker
1958*61046927SAndroid Build Coastguard Worker if (!u_trace_has_points(&cmdbuf->trace))
1959*61046927SAndroid Build Coastguard Worker continue;
1960*61046927SAndroid Build Coastguard Worker
1961*61046927SAndroid Build Coastguard Worker data->last_buffer_with_tracepoints = i;
1962*61046927SAndroid Build Coastguard Worker
1963*61046927SAndroid Build Coastguard Worker if (!(cmdbuf->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)) {
1964*61046927SAndroid Build Coastguard Worker /* A single command buffer could be submitted several times, but we
1965*61046927SAndroid Build Coastguard Worker * already baked timestamp iova addresses and trace points are
1966*61046927SAndroid Build Coastguard Worker * single-use. Therefor we have to copy trace points and create
1967*61046927SAndroid Build Coastguard Worker * a new timestamp buffer on every submit of reusable command buffer.
1968*61046927SAndroid Build Coastguard Worker */
1969*61046927SAndroid Build Coastguard Worker if (tu_create_copy_timestamp_cs(cmdbuf,
1970*61046927SAndroid Build Coastguard Worker &data->cmd_trace_data[i].timestamp_copy_cs,
1971*61046927SAndroid Build Coastguard Worker &data->cmd_trace_data[i].trace) != VK_SUCCESS) {
1972*61046927SAndroid Build Coastguard Worker goto fail;
1973*61046927SAndroid Build Coastguard Worker }
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker assert(data->cmd_trace_data[i].timestamp_copy_cs->entry_count == 1);
1976*61046927SAndroid Build Coastguard Worker } else {
1977*61046927SAndroid Build Coastguard Worker data->cmd_trace_data[i].trace = &cmdbuf->trace;
1978*61046927SAndroid Build Coastguard Worker }
1979*61046927SAndroid Build Coastguard Worker }
1980*61046927SAndroid Build Coastguard Worker
1981*61046927SAndroid Build Coastguard Worker assert(data->last_buffer_with_tracepoints != -1);
1982*61046927SAndroid Build Coastguard Worker
1983*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1984*61046927SAndroid Build Coastguard Worker
1985*61046927SAndroid Build Coastguard Worker fail:
1986*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_finish(device, data);
1987*61046927SAndroid Build Coastguard Worker *submission_data = NULL;
1988*61046927SAndroid Build Coastguard Worker
1989*61046927SAndroid Build Coastguard Worker return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
1990*61046927SAndroid Build Coastguard Worker }
1991*61046927SAndroid Build Coastguard Worker
1992*61046927SAndroid Build Coastguard Worker void
tu_u_trace_submission_data_finish(struct tu_device * device,struct tu_u_trace_submission_data * submission_data)1993*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_finish(
1994*61046927SAndroid Build Coastguard Worker struct tu_device *device,
1995*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data *submission_data)
1996*61046927SAndroid Build Coastguard Worker {
1997*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < submission_data->cmd_buffer_count; ++i) {
1998*61046927SAndroid Build Coastguard Worker /* Only if we had to create a copy of trace we should free it */
1999*61046927SAndroid Build Coastguard Worker struct tu_u_trace_cmd_data *cmd_data = &submission_data->cmd_trace_data[i];
2000*61046927SAndroid Build Coastguard Worker if (cmd_data->timestamp_copy_cs) {
2001*61046927SAndroid Build Coastguard Worker tu_cs_finish(cmd_data->timestamp_copy_cs);
2002*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, cmd_data->timestamp_copy_cs);
2003*61046927SAndroid Build Coastguard Worker
2004*61046927SAndroid Build Coastguard Worker u_trace_fini(cmd_data->trace);
2005*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, cmd_data->trace);
2006*61046927SAndroid Build Coastguard Worker }
2007*61046927SAndroid Build Coastguard Worker }
2008*61046927SAndroid Build Coastguard Worker
2009*61046927SAndroid Build Coastguard Worker if (submission_data->kgsl_timestamp_bo.bo) {
2010*61046927SAndroid Build Coastguard Worker mtx_lock(&device->kgsl_profiling_mutex);
2011*61046927SAndroid Build Coastguard Worker tu_suballoc_bo_free(&device->kgsl_profiling_suballoc,
2012*61046927SAndroid Build Coastguard Worker &submission_data->kgsl_timestamp_bo);
2013*61046927SAndroid Build Coastguard Worker mtx_unlock(&device->kgsl_profiling_mutex);
2014*61046927SAndroid Build Coastguard Worker }
2015*61046927SAndroid Build Coastguard Worker
2016*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submission_data->cmd_trace_data);
2017*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submission_data->syncobj);
2018*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submission_data);
2019*61046927SAndroid Build Coastguard Worker }
2020*61046927SAndroid Build Coastguard Worker
2021*61046927SAndroid Build Coastguard Worker enum tu_reg_stomper_flags
2022*61046927SAndroid Build Coastguard Worker {
2023*61046927SAndroid Build Coastguard Worker TU_DEBUG_REG_STOMP_INVERSE = 1 << 0,
2024*61046927SAndroid Build Coastguard Worker TU_DEBUG_REG_STOMP_CMDBUF = 1 << 1,
2025*61046927SAndroid Build Coastguard Worker TU_DEBUG_REG_STOMP_RENDERPASS = 1 << 2,
2026*61046927SAndroid Build Coastguard Worker };
2027*61046927SAndroid Build Coastguard Worker
2028*61046927SAndroid Build Coastguard Worker /* See freedreno.rst for usage tips */
2029*61046927SAndroid Build Coastguard Worker static const struct debug_named_value tu_reg_stomper_options[] = {
2030*61046927SAndroid Build Coastguard Worker { "inverse", TU_DEBUG_REG_STOMP_INVERSE,
2031*61046927SAndroid Build Coastguard Worker "By default the range specifies the regs to stomp, with 'inverse' it "
2032*61046927SAndroid Build Coastguard Worker "specifies the regs NOT to stomp" },
2033*61046927SAndroid Build Coastguard Worker { "cmdbuf", TU_DEBUG_REG_STOMP_CMDBUF,
2034*61046927SAndroid Build Coastguard Worker "Stomp regs at the start of a cmdbuf" },
2035*61046927SAndroid Build Coastguard Worker { "renderpass", TU_DEBUG_REG_STOMP_RENDERPASS,
2036*61046927SAndroid Build Coastguard Worker "Stomp regs before a renderpass" },
2037*61046927SAndroid Build Coastguard Worker { NULL, 0 }
2038*61046927SAndroid Build Coastguard Worker };
2039*61046927SAndroid Build Coastguard Worker
2040*61046927SAndroid Build Coastguard Worker template <chip CHIP>
2041*61046927SAndroid Build Coastguard Worker static inline void
tu_cs_dbg_stomp_regs(struct tu_cs * cs,bool is_rp_blit,uint32_t first_reg,uint32_t last_reg,bool inverse)2042*61046927SAndroid Build Coastguard Worker tu_cs_dbg_stomp_regs(struct tu_cs *cs,
2043*61046927SAndroid Build Coastguard Worker bool is_rp_blit,
2044*61046927SAndroid Build Coastguard Worker uint32_t first_reg,
2045*61046927SAndroid Build Coastguard Worker uint32_t last_reg,
2046*61046927SAndroid Build Coastguard Worker bool inverse)
2047*61046927SAndroid Build Coastguard Worker {
2048*61046927SAndroid Build Coastguard Worker const uint16_t *regs = NULL;
2049*61046927SAndroid Build Coastguard Worker size_t count = 0;
2050*61046927SAndroid Build Coastguard Worker
2051*61046927SAndroid Build Coastguard Worker if (is_rp_blit) {
2052*61046927SAndroid Build Coastguard Worker regs = &RP_BLIT_REGS<CHIP>[0];
2053*61046927SAndroid Build Coastguard Worker count = ARRAY_SIZE(RP_BLIT_REGS<CHIP>);
2054*61046927SAndroid Build Coastguard Worker } else {
2055*61046927SAndroid Build Coastguard Worker regs = &CMD_REGS<CHIP>[0];
2056*61046927SAndroid Build Coastguard Worker count = ARRAY_SIZE(CMD_REGS<CHIP>);
2057*61046927SAndroid Build Coastguard Worker }
2058*61046927SAndroid Build Coastguard Worker
2059*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
2060*61046927SAndroid Build Coastguard Worker if (inverse) {
2061*61046927SAndroid Build Coastguard Worker if (regs[i] >= first_reg && regs[i] <= last_reg)
2062*61046927SAndroid Build Coastguard Worker continue;
2063*61046927SAndroid Build Coastguard Worker } else {
2064*61046927SAndroid Build Coastguard Worker if (regs[i] < first_reg || regs[i] > last_reg)
2065*61046927SAndroid Build Coastguard Worker continue;
2066*61046927SAndroid Build Coastguard Worker }
2067*61046927SAndroid Build Coastguard Worker
2068*61046927SAndroid Build Coastguard Worker if (fd_reg_stomp_allowed(CHIP, regs[i]))
2069*61046927SAndroid Build Coastguard Worker tu_cs_emit_write_reg(cs, regs[i], 0xffffffff);
2070*61046927SAndroid Build Coastguard Worker }
2071*61046927SAndroid Build Coastguard Worker }
2072*61046927SAndroid Build Coastguard Worker
2073*61046927SAndroid Build Coastguard Worker static void
tu_init_dbg_reg_stomper(struct tu_device * device)2074*61046927SAndroid Build Coastguard Worker tu_init_dbg_reg_stomper(struct tu_device *device)
2075*61046927SAndroid Build Coastguard Worker {
2076*61046927SAndroid Build Coastguard Worker const char *stale_reg_range_str =
2077*61046927SAndroid Build Coastguard Worker os_get_option("TU_DEBUG_STALE_REGS_RANGE");
2078*61046927SAndroid Build Coastguard Worker if (!stale_reg_range_str)
2079*61046927SAndroid Build Coastguard Worker return;
2080*61046927SAndroid Build Coastguard Worker
2081*61046927SAndroid Build Coastguard Worker uint32_t first_reg, last_reg;
2082*61046927SAndroid Build Coastguard Worker
2083*61046927SAndroid Build Coastguard Worker if (sscanf(stale_reg_range_str, "%x,%x", &first_reg, &last_reg) != 2) {
2084*61046927SAndroid Build Coastguard Worker mesa_loge("Incorrect TU_DEBUG_STALE_REGS_RANGE");
2085*61046927SAndroid Build Coastguard Worker return;
2086*61046927SAndroid Build Coastguard Worker }
2087*61046927SAndroid Build Coastguard Worker
2088*61046927SAndroid Build Coastguard Worker uint64_t debug_flags = debug_get_flags_option("TU_DEBUG_STALE_REGS_FLAGS",
2089*61046927SAndroid Build Coastguard Worker tu_reg_stomper_options,
2090*61046927SAndroid Build Coastguard Worker TU_DEBUG_REG_STOMP_CMDBUF);
2091*61046927SAndroid Build Coastguard Worker
2092*61046927SAndroid Build Coastguard Worker struct tu_cs *cmdbuf_cs = (struct tu_cs *) calloc(1, sizeof(struct tu_cs));
2093*61046927SAndroid Build Coastguard Worker tu_cs_init(cmdbuf_cs, device, TU_CS_MODE_GROW, 4096,
2094*61046927SAndroid Build Coastguard Worker "cmdbuf reg stomp cs");
2095*61046927SAndroid Build Coastguard Worker tu_cs_begin(cmdbuf_cs);
2096*61046927SAndroid Build Coastguard Worker
2097*61046927SAndroid Build Coastguard Worker struct tu_cs *rp_cs = (struct tu_cs *) calloc(1, sizeof(struct tu_cs));
2098*61046927SAndroid Build Coastguard Worker tu_cs_init(rp_cs, device, TU_CS_MODE_GROW, 4096, "rp reg stomp cs");
2099*61046927SAndroid Build Coastguard Worker tu_cs_begin(rp_cs);
2100*61046927SAndroid Build Coastguard Worker
2101*61046927SAndroid Build Coastguard Worker bool inverse = debug_flags & TU_DEBUG_REG_STOMP_INVERSE;
2102*61046927SAndroid Build Coastguard Worker TU_CALLX(device, tu_cs_dbg_stomp_regs)(cmdbuf_cs, false, first_reg, last_reg, inverse);
2103*61046927SAndroid Build Coastguard Worker TU_CALLX(device, tu_cs_dbg_stomp_regs)(rp_cs, true, first_reg, last_reg, inverse);
2104*61046927SAndroid Build Coastguard Worker
2105*61046927SAndroid Build Coastguard Worker tu_cs_end(cmdbuf_cs);
2106*61046927SAndroid Build Coastguard Worker tu_cs_end(rp_cs);
2107*61046927SAndroid Build Coastguard Worker
2108*61046927SAndroid Build Coastguard Worker device->dbg_cmdbuf_stomp_cs = cmdbuf_cs;
2109*61046927SAndroid Build Coastguard Worker device->dbg_renderpass_stomp_cs = rp_cs;
2110*61046927SAndroid Build Coastguard Worker }
2111*61046927SAndroid Build Coastguard Worker
2112*61046927SAndroid Build Coastguard Worker /* It is unknown what this workaround is for and what it fixes. */
2113*61046927SAndroid Build Coastguard Worker static VkResult
tu_init_cmdbuf_start_a725_quirk(struct tu_device * device)2114*61046927SAndroid Build Coastguard Worker tu_init_cmdbuf_start_a725_quirk(struct tu_device *device)
2115*61046927SAndroid Build Coastguard Worker {
2116*61046927SAndroid Build Coastguard Worker struct tu_cs *cs;
2117*61046927SAndroid Build Coastguard Worker
2118*61046927SAndroid Build Coastguard Worker if (!(device->cmdbuf_start_a725_quirk_cs =
2119*61046927SAndroid Build Coastguard Worker (struct tu_cs *) calloc(1, sizeof(struct tu_cs)))) {
2120*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY,
2121*61046927SAndroid Build Coastguard Worker "OOM");
2122*61046927SAndroid Build Coastguard Worker }
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker if (!(device->cmdbuf_start_a725_quirk_entry =
2125*61046927SAndroid Build Coastguard Worker (struct tu_cs_entry *) calloc(1, sizeof(struct tu_cs_entry)))) {
2126*61046927SAndroid Build Coastguard Worker free(device->cmdbuf_start_a725_quirk_cs);
2127*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY,
2128*61046927SAndroid Build Coastguard Worker "OOM");
2129*61046927SAndroid Build Coastguard Worker }
2130*61046927SAndroid Build Coastguard Worker
2131*61046927SAndroid Build Coastguard Worker cs = device->cmdbuf_start_a725_quirk_cs;
2132*61046927SAndroid Build Coastguard Worker tu_cs_init(cs, device, TU_CS_MODE_SUB_STREAM, 57, "a725 workaround cs");
2133*61046927SAndroid Build Coastguard Worker
2134*61046927SAndroid Build Coastguard Worker struct tu_cs shader_cs;
2135*61046927SAndroid Build Coastguard Worker tu_cs_begin_sub_stream(cs, 10, &shader_cs);
2136*61046927SAndroid Build Coastguard Worker
2137*61046927SAndroid Build Coastguard Worker uint32_t raw_shader[] = {
2138*61046927SAndroid Build Coastguard Worker 0x00040000, 0x40600000, // mul.f hr0.x, hr0.x, hr1.x
2139*61046927SAndroid Build Coastguard Worker 0x00050001, 0x40600001, // mul.f hr0.y, hr0.y, hr1.y
2140*61046927SAndroid Build Coastguard Worker 0x00060002, 0x40600002, // mul.f hr0.z, hr0.z, hr1.z
2141*61046927SAndroid Build Coastguard Worker 0x00070003, 0x40600003, // mul.f hr0.w, hr0.w, hr1.w
2142*61046927SAndroid Build Coastguard Worker 0x00000000, 0x03000000, // end
2143*61046927SAndroid Build Coastguard Worker };
2144*61046927SAndroid Build Coastguard Worker
2145*61046927SAndroid Build Coastguard Worker tu_cs_emit_array(&shader_cs, raw_shader, ARRAY_SIZE(raw_shader));
2146*61046927SAndroid Build Coastguard Worker struct tu_cs_entry shader_entry = tu_cs_end_sub_stream(cs, &shader_cs);
2147*61046927SAndroid Build Coastguard Worker uint64_t shader_iova = shader_entry.bo->iova + shader_entry.offset;
2148*61046927SAndroid Build Coastguard Worker
2149*61046927SAndroid Build Coastguard Worker struct tu_cs sub_cs;
2150*61046927SAndroid Build Coastguard Worker tu_cs_begin_sub_stream(cs, 47, &sub_cs);
2151*61046927SAndroid Build Coastguard Worker
2152*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, HLSQ_INVALIDATE_CMD(A7XX,
2153*61046927SAndroid Build Coastguard Worker .vs_state = true, .hs_state = true, .ds_state = true,
2154*61046927SAndroid Build Coastguard Worker .gs_state = true, .fs_state = true, .gfx_ibo = true,
2155*61046927SAndroid Build Coastguard Worker .cs_bindless = 0xff, .gfx_bindless = 0xff));
2156*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, HLSQ_CS_CNTL(A7XX,
2157*61046927SAndroid Build Coastguard Worker .constlen = 4,
2158*61046927SAndroid Build Coastguard Worker .enabled = true));
2159*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_CONFIG(.enabled = true));
2160*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_CTRL_REG0(
2161*61046927SAndroid Build Coastguard Worker .threadmode = MULTI,
2162*61046927SAndroid Build Coastguard Worker .threadsize = THREAD128,
2163*61046927SAndroid Build Coastguard Worker .mergedregs = true));
2164*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_UNKNOWN_A9B1(.shared_size = 1));
2165*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, HLSQ_CS_KERNEL_GROUP_X(A7XX, 1),
2166*61046927SAndroid Build Coastguard Worker HLSQ_CS_KERNEL_GROUP_Y(A7XX, 1),
2167*61046927SAndroid Build Coastguard Worker HLSQ_CS_KERNEL_GROUP_Z(A7XX, 1));
2168*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_INSTRLEN(.sp_cs_instrlen = 1));
2169*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_TEX_COUNT(0));
2170*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_IBO_COUNT(0));
2171*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, HLSQ_CS_CNTL_1(A7XX,
2172*61046927SAndroid Build Coastguard Worker .linearlocalidregid = regid(63, 0),
2173*61046927SAndroid Build Coastguard Worker .threadsize = THREAD128,
2174*61046927SAndroid Build Coastguard Worker .workgrouprastorderzfirsten = true,
2175*61046927SAndroid Build Coastguard Worker .wgtilewidth = 4,
2176*61046927SAndroid Build Coastguard Worker .wgtileheight = 17));
2177*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_SP_CS_CNTL_0(
2178*61046927SAndroid Build Coastguard Worker .wgidconstid = regid(51, 3),
2179*61046927SAndroid Build Coastguard Worker .wgsizeconstid = regid(48, 0),
2180*61046927SAndroid Build Coastguard Worker .wgoffsetconstid = regid(63, 0),
2181*61046927SAndroid Build Coastguard Worker .localidregid = regid(63, 0)));
2182*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, SP_CS_CNTL_1(A7XX,
2183*61046927SAndroid Build Coastguard Worker .linearlocalidregid = regid(63, 0),
2184*61046927SAndroid Build Coastguard Worker .threadsize = THREAD128,
2185*61046927SAndroid Build Coastguard Worker .workitemrastorder = WORKITEMRASTORDER_TILED));
2186*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A7XX_SP_CS_UNKNOWN_A9BE(0));
2187*61046927SAndroid Build Coastguard Worker
2188*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs,
2189*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_0(A7XX, .kerneldim = 3,
2190*61046927SAndroid Build Coastguard Worker .localsizex = 255,
2191*61046927SAndroid Build Coastguard Worker .localsizey = 1,
2192*61046927SAndroid Build Coastguard Worker .localsizez = 1),
2193*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_1(A7XX, .globalsize_x = 3072),
2194*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_2(A7XX, .globaloff_x = 0),
2195*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_3(A7XX, .globalsize_y = 1),
2196*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_4(A7XX, .globaloff_y = 0),
2197*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_5(A7XX, .globalsize_z = 1),
2198*61046927SAndroid Build Coastguard Worker HLSQ_CS_NDRANGE_6(A7XX, .globaloff_z = 0));
2199*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A7XX_HLSQ_CS_LOCAL_SIZE(
2200*61046927SAndroid Build Coastguard Worker .localsizex = 255,
2201*61046927SAndroid Build Coastguard Worker .localsizey = 0,
2202*61046927SAndroid Build Coastguard Worker .localsizez = 0));
2203*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt4(&sub_cs, REG_A6XX_SP_CS_OBJ_FIRST_EXEC_OFFSET, 3);
2204*61046927SAndroid Build Coastguard Worker tu_cs_emit(&sub_cs, 0);
2205*61046927SAndroid Build Coastguard Worker tu_cs_emit_qw(&sub_cs, shader_iova);
2206*61046927SAndroid Build Coastguard Worker
2207*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(&sub_cs, CP_EXEC_CS, 4);
2208*61046927SAndroid Build Coastguard Worker tu_cs_emit(&sub_cs, 0x00000000);
2209*61046927SAndroid Build Coastguard Worker tu_cs_emit(&sub_cs, CP_EXEC_CS_1_NGROUPS_X(12));
2210*61046927SAndroid Build Coastguard Worker tu_cs_emit(&sub_cs, CP_EXEC_CS_2_NGROUPS_Y(1));
2211*61046927SAndroid Build Coastguard Worker tu_cs_emit(&sub_cs, CP_EXEC_CS_3_NGROUPS_Z(1));
2212*61046927SAndroid Build Coastguard Worker
2213*61046927SAndroid Build Coastguard Worker *device->cmdbuf_start_a725_quirk_entry = tu_cs_end_sub_stream(cs, &sub_cs);
2214*61046927SAndroid Build Coastguard Worker
2215*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2216*61046927SAndroid Build Coastguard Worker }
2217*61046927SAndroid Build Coastguard Worker
2218*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)2219*61046927SAndroid Build Coastguard Worker tu_CreateDevice(VkPhysicalDevice physicalDevice,
2220*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *pCreateInfo,
2221*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2222*61046927SAndroid Build Coastguard Worker VkDevice *pDevice)
2223*61046927SAndroid Build Coastguard Worker {
2224*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_physical_device, physical_device, physicalDevice);
2225*61046927SAndroid Build Coastguard Worker VkResult result;
2226*61046927SAndroid Build Coastguard Worker struct tu_device *device;
2227*61046927SAndroid Build Coastguard Worker bool border_color_without_format = false;
2228*61046927SAndroid Build Coastguard Worker
2229*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const (ext, pCreateInfo->pNext) {
2230*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
2231*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
2232*61046927SAndroid Build Coastguard Worker border_color_without_format =
2233*61046927SAndroid Build Coastguard Worker ((const VkPhysicalDeviceCustomBorderColorFeaturesEXT *) ext)
2234*61046927SAndroid Build Coastguard Worker ->customBorderColorWithoutFormat;
2235*61046927SAndroid Build Coastguard Worker break;
2236*61046927SAndroid Build Coastguard Worker default:
2237*61046927SAndroid Build Coastguard Worker break;
2238*61046927SAndroid Build Coastguard Worker }
2239*61046927SAndroid Build Coastguard Worker }
2240*61046927SAndroid Build Coastguard Worker
2241*61046927SAndroid Build Coastguard Worker device = (struct tu_device *) vk_zalloc2(
2242*61046927SAndroid Build Coastguard Worker &physical_device->instance->vk.alloc, pAllocator, sizeof(*device), 8,
2243*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
2244*61046927SAndroid Build Coastguard Worker if (!device)
2245*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY, "OOM");
2246*61046927SAndroid Build Coastguard Worker
2247*61046927SAndroid Build Coastguard Worker struct vk_device_dispatch_table dispatch_table;
2248*61046927SAndroid Build Coastguard Worker bool override_initial_entrypoints = true;
2249*61046927SAndroid Build Coastguard Worker
2250*61046927SAndroid Build Coastguard Worker if (physical_device->instance->vk.trace_mode & VK_TRACE_MODE_RMV) {
2251*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2252*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_rmv_device_entrypoints, true);
2253*61046927SAndroid Build Coastguard Worker override_initial_entrypoints = false;
2254*61046927SAndroid Build Coastguard Worker }
2255*61046927SAndroid Build Coastguard Worker
2256*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2257*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_device_entrypoints, override_initial_entrypoints);
2258*61046927SAndroid Build Coastguard Worker
2259*61046927SAndroid Build Coastguard Worker switch (fd_dev_gen(&physical_device->dev_id)) {
2260*61046927SAndroid Build Coastguard Worker case 6:
2261*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2262*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_device_entrypoints_a6xx, false);
2263*61046927SAndroid Build Coastguard Worker break;
2264*61046927SAndroid Build Coastguard Worker case 7:
2265*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2266*61046927SAndroid Build Coastguard Worker &dispatch_table, &tu_device_entrypoints_a7xx, false);
2267*61046927SAndroid Build Coastguard Worker }
2268*61046927SAndroid Build Coastguard Worker
2269*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2270*61046927SAndroid Build Coastguard Worker &dispatch_table, &wsi_device_entrypoints, false);
2271*61046927SAndroid Build Coastguard Worker
2272*61046927SAndroid Build Coastguard Worker const struct vk_device_entrypoint_table *knl_device_entrypoints =
2273*61046927SAndroid Build Coastguard Worker physical_device->instance->knl->device_entrypoints;
2274*61046927SAndroid Build Coastguard Worker if (knl_device_entrypoints) {
2275*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(
2276*61046927SAndroid Build Coastguard Worker &dispatch_table, knl_device_entrypoints, false);
2277*61046927SAndroid Build Coastguard Worker }
2278*61046927SAndroid Build Coastguard Worker
2279*61046927SAndroid Build Coastguard Worker result = vk_device_init(&device->vk, &physical_device->vk,
2280*61046927SAndroid Build Coastguard Worker &dispatch_table, pCreateInfo, pAllocator);
2281*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2282*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
2283*61046927SAndroid Build Coastguard Worker return vk_startup_errorf(physical_device->instance, result,
2284*61046927SAndroid Build Coastguard Worker "vk_device_init failed");
2285*61046927SAndroid Build Coastguard Worker }
2286*61046927SAndroid Build Coastguard Worker
2287*61046927SAndroid Build Coastguard Worker device->instance = physical_device->instance;
2288*61046927SAndroid Build Coastguard Worker device->physical_device = physical_device;
2289*61046927SAndroid Build Coastguard Worker device->device_idx = device->physical_device->device_count++;
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Worker result = tu_drm_device_init(device);
2292*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2293*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
2294*61046927SAndroid Build Coastguard Worker return result;
2295*61046927SAndroid Build Coastguard Worker }
2296*61046927SAndroid Build Coastguard Worker
2297*61046927SAndroid Build Coastguard Worker device->vk.command_buffer_ops = &tu_cmd_buffer_ops;
2298*61046927SAndroid Build Coastguard Worker device->vk.check_status = tu_device_check_status;
2299*61046927SAndroid Build Coastguard Worker
2300*61046927SAndroid Build Coastguard Worker mtx_init(&device->bo_mutex, mtx_plain);
2301*61046927SAndroid Build Coastguard Worker mtx_init(&device->pipeline_mutex, mtx_plain);
2302*61046927SAndroid Build Coastguard Worker mtx_init(&device->autotune_mutex, mtx_plain);
2303*61046927SAndroid Build Coastguard Worker mtx_init(&device->kgsl_profiling_mutex, mtx_plain);
2304*61046927SAndroid Build Coastguard Worker u_rwlock_init(&device->dma_bo_lock);
2305*61046927SAndroid Build Coastguard Worker pthread_mutex_init(&device->submit_mutex, NULL);
2306*61046927SAndroid Build Coastguard Worker
2307*61046927SAndroid Build Coastguard Worker if (physical_device->has_set_iova) {
2308*61046927SAndroid Build Coastguard Worker mtx_init(&device->vma_mutex, mtx_plain);
2309*61046927SAndroid Build Coastguard Worker util_vma_heap_init(&device->vma, physical_device->va_start,
2310*61046927SAndroid Build Coastguard Worker ROUND_DOWN_TO(physical_device->va_size, os_page_size));
2311*61046927SAndroid Build Coastguard Worker }
2312*61046927SAndroid Build Coastguard Worker
2313*61046927SAndroid Build Coastguard Worker if (TU_DEBUG(BOS))
2314*61046927SAndroid Build Coastguard Worker device->bo_sizes = _mesa_hash_table_create(NULL, _mesa_hash_string, _mesa_key_string_equal);
2315*61046927SAndroid Build Coastguard Worker
2316*61046927SAndroid Build Coastguard Worker if (physical_device->instance->vk.trace_mode & VK_TRACE_MODE_RMV)
2317*61046927SAndroid Build Coastguard Worker tu_memory_trace_init(device);
2318*61046927SAndroid Build Coastguard Worker
2319*61046927SAndroid Build Coastguard Worker /* kgsl is not a drm device: */
2320*61046927SAndroid Build Coastguard Worker if (!is_kgsl(physical_device->instance))
2321*61046927SAndroid Build Coastguard Worker vk_device_set_drm_fd(&device->vk, device->fd);
2322*61046927SAndroid Build Coastguard Worker
2323*61046927SAndroid Build Coastguard Worker struct tu6_global *global = NULL;
2324*61046927SAndroid Build Coastguard Worker uint32_t global_size = sizeof(struct tu6_global);
2325*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache_create_info pcc_info = { };
2326*61046927SAndroid Build Coastguard Worker
2327*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
2328*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *queue_create =
2329*61046927SAndroid Build Coastguard Worker &pCreateInfo->pQueueCreateInfos[i];
2330*61046927SAndroid Build Coastguard Worker uint32_t qfi = queue_create->queueFamilyIndex;
2331*61046927SAndroid Build Coastguard Worker device->queues[qfi] = (struct tu_queue *) vk_alloc(
2332*61046927SAndroid Build Coastguard Worker &device->vk.alloc,
2333*61046927SAndroid Build Coastguard Worker queue_create->queueCount * sizeof(struct tu_queue), 8,
2334*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
2335*61046927SAndroid Build Coastguard Worker if (!device->queues[qfi]) {
2336*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2337*61046927SAndroid Build Coastguard Worker VK_ERROR_OUT_OF_HOST_MEMORY,
2338*61046927SAndroid Build Coastguard Worker "OOM");
2339*61046927SAndroid Build Coastguard Worker goto fail_queues;
2340*61046927SAndroid Build Coastguard Worker }
2341*61046927SAndroid Build Coastguard Worker
2342*61046927SAndroid Build Coastguard Worker memset(device->queues[qfi], 0,
2343*61046927SAndroid Build Coastguard Worker queue_create->queueCount * sizeof(struct tu_queue));
2344*61046927SAndroid Build Coastguard Worker
2345*61046927SAndroid Build Coastguard Worker device->queue_count[qfi] = queue_create->queueCount;
2346*61046927SAndroid Build Coastguard Worker
2347*61046927SAndroid Build Coastguard Worker for (unsigned q = 0; q < queue_create->queueCount; q++) {
2348*61046927SAndroid Build Coastguard Worker result = tu_queue_init(device, &device->queues[qfi][q], q, queue_create,
2349*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.globalPriorityQuery);
2350*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2351*61046927SAndroid Build Coastguard Worker device->queue_count[qfi] = q;
2352*61046927SAndroid Build Coastguard Worker goto fail_queues;
2353*61046927SAndroid Build Coastguard Worker }
2354*61046927SAndroid Build Coastguard Worker }
2355*61046927SAndroid Build Coastguard Worker }
2356*61046927SAndroid Build Coastguard Worker
2357*61046927SAndroid Build Coastguard Worker {
2358*61046927SAndroid Build Coastguard Worker struct ir3_compiler_options ir3_options = {
2359*61046927SAndroid Build Coastguard Worker .robust_buffer_access2 = device->vk.enabled_features.robustBufferAccess2,
2360*61046927SAndroid Build Coastguard Worker .push_ubo_with_preamble = true,
2361*61046927SAndroid Build Coastguard Worker .disable_cache = true,
2362*61046927SAndroid Build Coastguard Worker .bindless_fb_read_descriptor = -1,
2363*61046927SAndroid Build Coastguard Worker .bindless_fb_read_slot = -1,
2364*61046927SAndroid Build Coastguard Worker .storage_16bit = physical_device->info->a6xx.storage_16bit,
2365*61046927SAndroid Build Coastguard Worker .storage_8bit = physical_device->info->a7xx.storage_8bit,
2366*61046927SAndroid Build Coastguard Worker .shared_push_consts = !TU_DEBUG(PUSH_CONSTS_PER_STAGE),
2367*61046927SAndroid Build Coastguard Worker };
2368*61046927SAndroid Build Coastguard Worker device->compiler = ir3_compiler_create(
2369*61046927SAndroid Build Coastguard Worker NULL, &physical_device->dev_id, physical_device->info, &ir3_options);
2370*61046927SAndroid Build Coastguard Worker }
2371*61046927SAndroid Build Coastguard Worker if (!device->compiler) {
2372*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2373*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
2374*61046927SAndroid Build Coastguard Worker "failed to initialize ir3 compiler");
2375*61046927SAndroid Build Coastguard Worker goto fail_queues;
2376*61046927SAndroid Build Coastguard Worker }
2377*61046927SAndroid Build Coastguard Worker
2378*61046927SAndroid Build Coastguard Worker /* Initialize sparse array for refcounting imported BOs */
2379*61046927SAndroid Build Coastguard Worker util_sparse_array_init(&device->bo_map, sizeof(struct tu_bo), 512);
2380*61046927SAndroid Build Coastguard Worker
2381*61046927SAndroid Build Coastguard Worker if (physical_device->has_set_iova) {
2382*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(TU_MAX_QUEUE_FAMILIES == 1);
2383*61046927SAndroid Build Coastguard Worker if (!u_vector_init(&device->zombie_vmas, 64,
2384*61046927SAndroid Build Coastguard Worker sizeof(struct tu_zombie_vma))) {
2385*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2386*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
2387*61046927SAndroid Build Coastguard Worker "zombie_vmas create failed");
2388*61046927SAndroid Build Coastguard Worker goto fail_free_zombie_vma;
2389*61046927SAndroid Build Coastguard Worker }
2390*61046927SAndroid Build Coastguard Worker }
2391*61046927SAndroid Build Coastguard Worker
2392*61046927SAndroid Build Coastguard Worker /* initial sizes, these will increase if there is overflow */
2393*61046927SAndroid Build Coastguard Worker device->vsc_draw_strm_pitch = 0x1000 + VSC_PAD;
2394*61046927SAndroid Build Coastguard Worker device->vsc_prim_strm_pitch = 0x4000 + VSC_PAD;
2395*61046927SAndroid Build Coastguard Worker
2396*61046927SAndroid Build Coastguard Worker if (device->vk.enabled_features.customBorderColors)
2397*61046927SAndroid Build Coastguard Worker global_size += TU_BORDER_COLOR_COUNT * sizeof(struct bcolor_entry);
2398*61046927SAndroid Build Coastguard Worker
2399*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_init(
2400*61046927SAndroid Build Coastguard Worker &device->pipeline_suballoc, device, 128 * 1024,
2401*61046927SAndroid Build Coastguard Worker (enum tu_bo_alloc_flags) (TU_BO_ALLOC_GPU_READ_ONLY |
2402*61046927SAndroid Build Coastguard Worker TU_BO_ALLOC_ALLOW_DUMP |
2403*61046927SAndroid Build Coastguard Worker TU_BO_ALLOC_INTERNAL_RESOURCE),
2404*61046927SAndroid Build Coastguard Worker "pipeline_suballoc");
2405*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_init(&device->autotune_suballoc, device,
2406*61046927SAndroid Build Coastguard Worker 128 * 1024, TU_BO_ALLOC_INTERNAL_RESOURCE,
2407*61046927SAndroid Build Coastguard Worker "autotune_suballoc");
2408*61046927SAndroid Build Coastguard Worker if (is_kgsl(physical_device->instance)) {
2409*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_init(&device->kgsl_profiling_suballoc, device,
2410*61046927SAndroid Build Coastguard Worker 128 * 1024, TU_BO_ALLOC_INTERNAL_RESOURCE,
2411*61046927SAndroid Build Coastguard Worker "kgsl_profiling_suballoc");
2412*61046927SAndroid Build Coastguard Worker }
2413*61046927SAndroid Build Coastguard Worker
2414*61046927SAndroid Build Coastguard Worker result = tu_bo_init_new(
2415*61046927SAndroid Build Coastguard Worker device, NULL, &device->global_bo, global_size,
2416*61046927SAndroid Build Coastguard Worker (enum tu_bo_alloc_flags) (TU_BO_ALLOC_ALLOW_DUMP |
2417*61046927SAndroid Build Coastguard Worker TU_BO_ALLOC_INTERNAL_RESOURCE),
2418*61046927SAndroid Build Coastguard Worker "global");
2419*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2420*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result, "BO init");
2421*61046927SAndroid Build Coastguard Worker goto fail_global_bo;
2422*61046927SAndroid Build Coastguard Worker }
2423*61046927SAndroid Build Coastguard Worker
2424*61046927SAndroid Build Coastguard Worker result = tu_bo_map(device, device->global_bo, NULL);
2425*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2426*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result, "BO map");
2427*61046927SAndroid Build Coastguard Worker goto fail_global_bo_map;
2428*61046927SAndroid Build Coastguard Worker }
2429*61046927SAndroid Build Coastguard Worker
2430*61046927SAndroid Build Coastguard Worker global = (struct tu6_global *)device->global_bo->map;
2431*61046927SAndroid Build Coastguard Worker device->global_bo_map = global;
2432*61046927SAndroid Build Coastguard Worker tu_init_clear_blit_shaders(device);
2433*61046927SAndroid Build Coastguard Worker
2434*61046927SAndroid Build Coastguard Worker result = tu_init_empty_shaders(device);
2435*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2436*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result, "empty shaders");
2437*61046927SAndroid Build Coastguard Worker goto fail_empty_shaders;
2438*61046927SAndroid Build Coastguard Worker }
2439*61046927SAndroid Build Coastguard Worker
2440*61046927SAndroid Build Coastguard Worker global->predicate = 0;
2441*61046927SAndroid Build Coastguard Worker global->vtx_stats_query_not_running = 1;
2442*61046927SAndroid Build Coastguard Worker global->dbg_one = (uint32_t)-1;
2443*61046927SAndroid Build Coastguard Worker global->dbg_gmem_total_loads = 0;
2444*61046927SAndroid Build Coastguard Worker global->dbg_gmem_taken_loads = 0;
2445*61046927SAndroid Build Coastguard Worker global->dbg_gmem_total_stores = 0;
2446*61046927SAndroid Build Coastguard Worker global->dbg_gmem_taken_stores = 0;
2447*61046927SAndroid Build Coastguard Worker for (int i = 0; i < TU_BORDER_COLOR_BUILTIN; i++) {
2448*61046927SAndroid Build Coastguard Worker VkClearColorValue border_color = vk_border_color_value((VkBorderColor) i);
2449*61046927SAndroid Build Coastguard Worker tu6_pack_border_color(&global->bcolor_builtin[i], &border_color,
2450*61046927SAndroid Build Coastguard Worker vk_border_color_is_int((VkBorderColor) i));
2451*61046927SAndroid Build Coastguard Worker }
2452*61046927SAndroid Build Coastguard Worker
2453*61046927SAndroid Build Coastguard Worker /* initialize to ones so ffs can be used to find unused slots */
2454*61046927SAndroid Build Coastguard Worker BITSET_ONES(device->custom_border_color);
2455*61046927SAndroid Build Coastguard Worker
2456*61046927SAndroid Build Coastguard Worker result = tu_init_dynamic_rendering(device);
2457*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2458*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result, "dynamic rendering");
2459*61046927SAndroid Build Coastguard Worker goto fail_dynamic_rendering;
2460*61046927SAndroid Build Coastguard Worker }
2461*61046927SAndroid Build Coastguard Worker
2462*61046927SAndroid Build Coastguard Worker device->mem_cache = vk_pipeline_cache_create(&device->vk, &pcc_info,
2463*61046927SAndroid Build Coastguard Worker NULL);
2464*61046927SAndroid Build Coastguard Worker if (!device->mem_cache) {
2465*61046927SAndroid Build Coastguard Worker result = VK_ERROR_OUT_OF_HOST_MEMORY;
2466*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result, "create pipeline cache failed");
2467*61046927SAndroid Build Coastguard Worker goto fail_pipeline_cache;
2468*61046927SAndroid Build Coastguard Worker }
2469*61046927SAndroid Build Coastguard Worker
2470*61046927SAndroid Build Coastguard Worker if (device->vk.enabled_features.performanceCounterQueryPools) {
2471*61046927SAndroid Build Coastguard Worker /* Prepare command streams setting pass index to the PERF_CNTRS_REG
2472*61046927SAndroid Build Coastguard Worker * from 0 to 31. One of these will be picked up at cmd submit time
2473*61046927SAndroid Build Coastguard Worker * when the perf query is executed.
2474*61046927SAndroid Build Coastguard Worker */
2475*61046927SAndroid Build Coastguard Worker struct tu_cs *cs;
2476*61046927SAndroid Build Coastguard Worker
2477*61046927SAndroid Build Coastguard Worker if (!(device->perfcntrs_pass_cs =
2478*61046927SAndroid Build Coastguard Worker (struct tu_cs *) calloc(1, sizeof(struct tu_cs)))) {
2479*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(device->instance,
2480*61046927SAndroid Build Coastguard Worker VK_ERROR_OUT_OF_HOST_MEMORY, "OOM");
2481*61046927SAndroid Build Coastguard Worker goto fail_perfcntrs_pass_alloc;
2482*61046927SAndroid Build Coastguard Worker }
2483*61046927SAndroid Build Coastguard Worker
2484*61046927SAndroid Build Coastguard Worker device->perfcntrs_pass_cs_entries =
2485*61046927SAndroid Build Coastguard Worker (struct tu_cs_entry *) calloc(32, sizeof(struct tu_cs_entry));
2486*61046927SAndroid Build Coastguard Worker if (!device->perfcntrs_pass_cs_entries) {
2487*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(device->instance,
2488*61046927SAndroid Build Coastguard Worker VK_ERROR_OUT_OF_HOST_MEMORY, "OOM");
2489*61046927SAndroid Build Coastguard Worker goto fail_perfcntrs_pass_entries_alloc;
2490*61046927SAndroid Build Coastguard Worker }
2491*61046927SAndroid Build Coastguard Worker
2492*61046927SAndroid Build Coastguard Worker cs = device->perfcntrs_pass_cs;
2493*61046927SAndroid Build Coastguard Worker tu_cs_init(cs, device, TU_CS_MODE_SUB_STREAM, 96, "perfcntrs cs");
2494*61046927SAndroid Build Coastguard Worker
2495*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 32; i++) {
2496*61046927SAndroid Build Coastguard Worker struct tu_cs sub_cs;
2497*61046927SAndroid Build Coastguard Worker
2498*61046927SAndroid Build Coastguard Worker result = tu_cs_begin_sub_stream(cs, 3, &sub_cs);
2499*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2500*61046927SAndroid Build Coastguard Worker vk_startup_errorf(device->instance, result,
2501*61046927SAndroid Build Coastguard Worker "failed to allocate commands streams");
2502*61046927SAndroid Build Coastguard Worker goto fail_prepare_perfcntrs_pass_cs;
2503*61046927SAndroid Build Coastguard Worker }
2504*61046927SAndroid Build Coastguard Worker
2505*61046927SAndroid Build Coastguard Worker tu_cs_emit_regs(&sub_cs, A6XX_CP_SCRATCH_REG(PERF_CNTRS_REG, 1 << i));
2506*61046927SAndroid Build Coastguard Worker tu_cs_emit_pkt7(&sub_cs, CP_WAIT_FOR_ME, 0);
2507*61046927SAndroid Build Coastguard Worker
2508*61046927SAndroid Build Coastguard Worker device->perfcntrs_pass_cs_entries[i] = tu_cs_end_sub_stream(cs, &sub_cs);
2509*61046927SAndroid Build Coastguard Worker }
2510*61046927SAndroid Build Coastguard Worker }
2511*61046927SAndroid Build Coastguard Worker
2512*61046927SAndroid Build Coastguard Worker if (physical_device->info->a7xx.cmdbuf_start_a725_quirk) {
2513*61046927SAndroid Build Coastguard Worker result = tu_init_cmdbuf_start_a725_quirk(device);
2514*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2515*61046927SAndroid Build Coastguard Worker goto fail_a725_workaround;
2516*61046927SAndroid Build Coastguard Worker }
2517*61046927SAndroid Build Coastguard Worker
2518*61046927SAndroid Build Coastguard Worker tu_init_dbg_reg_stomper(device);
2519*61046927SAndroid Build Coastguard Worker
2520*61046927SAndroid Build Coastguard Worker /* Initialize a condition variable for timeline semaphore */
2521*61046927SAndroid Build Coastguard Worker pthread_condattr_t condattr;
2522*61046927SAndroid Build Coastguard Worker if (pthread_condattr_init(&condattr) != 0) {
2523*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2524*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
2525*61046927SAndroid Build Coastguard Worker "pthread condattr init");
2526*61046927SAndroid Build Coastguard Worker goto fail_timeline_cond;
2527*61046927SAndroid Build Coastguard Worker }
2528*61046927SAndroid Build Coastguard Worker if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC) != 0) {
2529*61046927SAndroid Build Coastguard Worker pthread_condattr_destroy(&condattr);
2530*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2531*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
2532*61046927SAndroid Build Coastguard Worker "pthread condattr clock setup");
2533*61046927SAndroid Build Coastguard Worker goto fail_timeline_cond;
2534*61046927SAndroid Build Coastguard Worker }
2535*61046927SAndroid Build Coastguard Worker if (pthread_cond_init(&device->timeline_cond, &condattr) != 0) {
2536*61046927SAndroid Build Coastguard Worker pthread_condattr_destroy(&condattr);
2537*61046927SAndroid Build Coastguard Worker result = vk_startup_errorf(physical_device->instance,
2538*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
2539*61046927SAndroid Build Coastguard Worker "pthread cond init");
2540*61046927SAndroid Build Coastguard Worker goto fail_timeline_cond;
2541*61046927SAndroid Build Coastguard Worker }
2542*61046927SAndroid Build Coastguard Worker pthread_condattr_destroy(&condattr);
2543*61046927SAndroid Build Coastguard Worker
2544*61046927SAndroid Build Coastguard Worker result = tu_autotune_init(&device->autotune, device);
2545*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2546*61046927SAndroid Build Coastguard Worker goto fail_timeline_cond;
2547*61046927SAndroid Build Coastguard Worker }
2548*61046927SAndroid Build Coastguard Worker
2549*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(device->scratch_bos); i++)
2550*61046927SAndroid Build Coastguard Worker mtx_init(&device->scratch_bos[i].construct_mtx, mtx_plain);
2551*61046927SAndroid Build Coastguard Worker
2552*61046927SAndroid Build Coastguard Worker mtx_init(&device->fiber_pvtmem_bo.mtx, mtx_plain);
2553*61046927SAndroid Build Coastguard Worker mtx_init(&device->wave_pvtmem_bo.mtx, mtx_plain);
2554*61046927SAndroid Build Coastguard Worker
2555*61046927SAndroid Build Coastguard Worker mtx_init(&device->mutex, mtx_plain);
2556*61046927SAndroid Build Coastguard Worker
2557*61046927SAndroid Build Coastguard Worker device->use_z24uint_s8uint =
2558*61046927SAndroid Build Coastguard Worker physical_device->info->a6xx.has_z24uint_s8uint &&
2559*61046927SAndroid Build Coastguard Worker (!border_color_without_format ||
2560*61046927SAndroid Build Coastguard Worker physical_device->instance->disable_d24s8_border_color_workaround);
2561*61046927SAndroid Build Coastguard Worker device->use_lrz = !TU_DEBUG(NOLRZ);
2562*61046927SAndroid Build Coastguard Worker
2563*61046927SAndroid Build Coastguard Worker tu_gpu_tracepoint_config_variable();
2564*61046927SAndroid Build Coastguard Worker
2565*61046927SAndroid Build Coastguard Worker device->submit_count = 0;
2566*61046927SAndroid Build Coastguard Worker u_trace_context_init(&device->trace_context, device,
2567*61046927SAndroid Build Coastguard Worker sizeof(uint64_t),
2568*61046927SAndroid Build Coastguard Worker 12,
2569*61046927SAndroid Build Coastguard Worker tu_trace_create_buffer,
2570*61046927SAndroid Build Coastguard Worker tu_trace_destroy_buffer,
2571*61046927SAndroid Build Coastguard Worker TU_CALLX(device, tu_trace_record_ts),
2572*61046927SAndroid Build Coastguard Worker tu_trace_read_ts,
2573*61046927SAndroid Build Coastguard Worker tu_trace_capture_data,
2574*61046927SAndroid Build Coastguard Worker tu_trace_get_data,
2575*61046927SAndroid Build Coastguard Worker tu_trace_delete_flush_data);
2576*61046927SAndroid Build Coastguard Worker
2577*61046927SAndroid Build Coastguard Worker tu_breadcrumbs_init(device);
2578*61046927SAndroid Build Coastguard Worker
2579*61046927SAndroid Build Coastguard Worker if (FD_RD_DUMP(ENABLE)) {
2580*61046927SAndroid Build Coastguard Worker struct vk_app_info *app_info = &device->instance->vk.app_info;
2581*61046927SAndroid Build Coastguard Worker const char *app_name_str = app_info->app_name ?
2582*61046927SAndroid Build Coastguard Worker app_info->app_name : util_get_process_name();
2583*61046927SAndroid Build Coastguard Worker const char *engine_name_str = app_info->engine_name ?
2584*61046927SAndroid Build Coastguard Worker app_info->engine_name : "unknown-engine";
2585*61046927SAndroid Build Coastguard Worker
2586*61046927SAndroid Build Coastguard Worker char app_name[64];
2587*61046927SAndroid Build Coastguard Worker snprintf(app_name, sizeof(app_name), "%s", app_name_str);
2588*61046927SAndroid Build Coastguard Worker
2589*61046927SAndroid Build Coastguard Worker char engine_name[32];
2590*61046927SAndroid Build Coastguard Worker snprintf(engine_name, sizeof(engine_name), "%s", engine_name_str);
2591*61046927SAndroid Build Coastguard Worker
2592*61046927SAndroid Build Coastguard Worker char output_name[128];
2593*61046927SAndroid Build Coastguard Worker snprintf(output_name, sizeof(output_name), "tu_%s.%s_instance%u_device%u",
2594*61046927SAndroid Build Coastguard Worker app_name, engine_name, device->instance->instance_idx,
2595*61046927SAndroid Build Coastguard Worker device->device_idx);
2596*61046927SAndroid Build Coastguard Worker
2597*61046927SAndroid Build Coastguard Worker fd_rd_output_init(&device->rd_output, output_name);
2598*61046927SAndroid Build Coastguard Worker }
2599*61046927SAndroid Build Coastguard Worker
2600*61046927SAndroid Build Coastguard Worker *pDevice = tu_device_to_handle(device);
2601*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2602*61046927SAndroid Build Coastguard Worker
2603*61046927SAndroid Build Coastguard Worker fail_timeline_cond:
2604*61046927SAndroid Build Coastguard Worker if (device->cmdbuf_start_a725_quirk_entry) {
2605*61046927SAndroid Build Coastguard Worker free(device->cmdbuf_start_a725_quirk_entry);
2606*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->cmdbuf_start_a725_quirk_cs);
2607*61046927SAndroid Build Coastguard Worker free(device->cmdbuf_start_a725_quirk_cs);
2608*61046927SAndroid Build Coastguard Worker }
2609*61046927SAndroid Build Coastguard Worker fail_a725_workaround:
2610*61046927SAndroid Build Coastguard Worker fail_prepare_perfcntrs_pass_cs:
2611*61046927SAndroid Build Coastguard Worker free(device->perfcntrs_pass_cs_entries);
2612*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->perfcntrs_pass_cs);
2613*61046927SAndroid Build Coastguard Worker fail_perfcntrs_pass_entries_alloc:
2614*61046927SAndroid Build Coastguard Worker free(device->perfcntrs_pass_cs);
2615*61046927SAndroid Build Coastguard Worker fail_perfcntrs_pass_alloc:
2616*61046927SAndroid Build Coastguard Worker vk_pipeline_cache_destroy(device->mem_cache, &device->vk.alloc);
2617*61046927SAndroid Build Coastguard Worker fail_pipeline_cache:
2618*61046927SAndroid Build Coastguard Worker tu_destroy_dynamic_rendering(device);
2619*61046927SAndroid Build Coastguard Worker fail_dynamic_rendering:
2620*61046927SAndroid Build Coastguard Worker tu_destroy_empty_shaders(device);
2621*61046927SAndroid Build Coastguard Worker fail_empty_shaders:
2622*61046927SAndroid Build Coastguard Worker tu_destroy_clear_blit_shaders(device);
2623*61046927SAndroid Build Coastguard Worker fail_global_bo_map:
2624*61046927SAndroid Build Coastguard Worker TU_RMV(resource_destroy, device, device->global_bo);
2625*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, device->global_bo);
2626*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device->bo_list);
2627*61046927SAndroid Build Coastguard Worker fail_global_bo:
2628*61046927SAndroid Build Coastguard Worker ir3_compiler_destroy(device->compiler);
2629*61046927SAndroid Build Coastguard Worker util_sparse_array_finish(&device->bo_map);
2630*61046927SAndroid Build Coastguard Worker if (physical_device->has_set_iova)
2631*61046927SAndroid Build Coastguard Worker util_vma_heap_finish(&device->vma);
2632*61046927SAndroid Build Coastguard Worker fail_free_zombie_vma:
2633*61046927SAndroid Build Coastguard Worker u_vector_finish(&device->zombie_vmas);
2634*61046927SAndroid Build Coastguard Worker fail_queues:
2635*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < TU_MAX_QUEUE_FAMILIES; i++) {
2636*61046927SAndroid Build Coastguard Worker for (unsigned q = 0; q < device->queue_count[i]; q++)
2637*61046927SAndroid Build Coastguard Worker tu_queue_finish(&device->queues[i][q]);
2638*61046927SAndroid Build Coastguard Worker if (device->queues[i])
2639*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device->queues[i]);
2640*61046927SAndroid Build Coastguard Worker }
2641*61046927SAndroid Build Coastguard Worker
2642*61046927SAndroid Build Coastguard Worker u_rwlock_destroy(&device->dma_bo_lock);
2643*61046927SAndroid Build Coastguard Worker tu_drm_device_finish(device);
2644*61046927SAndroid Build Coastguard Worker vk_device_finish(&device->vk);
2645*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
2646*61046927SAndroid Build Coastguard Worker return result;
2647*61046927SAndroid Build Coastguard Worker }
2648*61046927SAndroid Build Coastguard Worker
2649*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_DestroyDevice(VkDevice _device,const VkAllocationCallbacks * pAllocator)2650*61046927SAndroid Build Coastguard Worker tu_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator)
2651*61046927SAndroid Build Coastguard Worker {
2652*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
2653*61046927SAndroid Build Coastguard Worker
2654*61046927SAndroid Build Coastguard Worker if (!device)
2655*61046927SAndroid Build Coastguard Worker return;
2656*61046927SAndroid Build Coastguard Worker
2657*61046927SAndroid Build Coastguard Worker tu_memory_trace_finish(device);
2658*61046927SAndroid Build Coastguard Worker
2659*61046927SAndroid Build Coastguard Worker if (FD_RD_DUMP(ENABLE))
2660*61046927SAndroid Build Coastguard Worker fd_rd_output_fini(&device->rd_output);
2661*61046927SAndroid Build Coastguard Worker
2662*61046927SAndroid Build Coastguard Worker tu_breadcrumbs_finish(device);
2663*61046927SAndroid Build Coastguard Worker
2664*61046927SAndroid Build Coastguard Worker u_trace_context_fini(&device->trace_context);
2665*61046927SAndroid Build Coastguard Worker
2666*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(device->scratch_bos); i++) {
2667*61046927SAndroid Build Coastguard Worker if (device->scratch_bos[i].initialized)
2668*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, device->scratch_bos[i].bo);
2669*61046927SAndroid Build Coastguard Worker }
2670*61046927SAndroid Build Coastguard Worker
2671*61046927SAndroid Build Coastguard Worker if (device->fiber_pvtmem_bo.bo)
2672*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, device->fiber_pvtmem_bo.bo);
2673*61046927SAndroid Build Coastguard Worker
2674*61046927SAndroid Build Coastguard Worker if (device->wave_pvtmem_bo.bo)
2675*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, device->wave_pvtmem_bo.bo);
2676*61046927SAndroid Build Coastguard Worker
2677*61046927SAndroid Build Coastguard Worker tu_destroy_clear_blit_shaders(device);
2678*61046927SAndroid Build Coastguard Worker
2679*61046927SAndroid Build Coastguard Worker tu_destroy_empty_shaders(device);
2680*61046927SAndroid Build Coastguard Worker
2681*61046927SAndroid Build Coastguard Worker tu_destroy_dynamic_rendering(device);
2682*61046927SAndroid Build Coastguard Worker
2683*61046927SAndroid Build Coastguard Worker ir3_compiler_destroy(device->compiler);
2684*61046927SAndroid Build Coastguard Worker
2685*61046927SAndroid Build Coastguard Worker vk_pipeline_cache_destroy(device->mem_cache, &device->vk.alloc);
2686*61046927SAndroid Build Coastguard Worker
2687*61046927SAndroid Build Coastguard Worker if (device->perfcntrs_pass_cs) {
2688*61046927SAndroid Build Coastguard Worker free(device->perfcntrs_pass_cs_entries);
2689*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->perfcntrs_pass_cs);
2690*61046927SAndroid Build Coastguard Worker free(device->perfcntrs_pass_cs);
2691*61046927SAndroid Build Coastguard Worker }
2692*61046927SAndroid Build Coastguard Worker
2693*61046927SAndroid Build Coastguard Worker if (device->dbg_cmdbuf_stomp_cs) {
2694*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->dbg_cmdbuf_stomp_cs);
2695*61046927SAndroid Build Coastguard Worker free(device->dbg_cmdbuf_stomp_cs);
2696*61046927SAndroid Build Coastguard Worker }
2697*61046927SAndroid Build Coastguard Worker
2698*61046927SAndroid Build Coastguard Worker if (device->dbg_renderpass_stomp_cs) {
2699*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->dbg_renderpass_stomp_cs);
2700*61046927SAndroid Build Coastguard Worker free(device->dbg_renderpass_stomp_cs);
2701*61046927SAndroid Build Coastguard Worker }
2702*61046927SAndroid Build Coastguard Worker
2703*61046927SAndroid Build Coastguard Worker if (device->cmdbuf_start_a725_quirk_entry) {
2704*61046927SAndroid Build Coastguard Worker free(device->cmdbuf_start_a725_quirk_entry);
2705*61046927SAndroid Build Coastguard Worker tu_cs_finish(device->cmdbuf_start_a725_quirk_cs);
2706*61046927SAndroid Build Coastguard Worker free(device->cmdbuf_start_a725_quirk_cs);
2707*61046927SAndroid Build Coastguard Worker }
2708*61046927SAndroid Build Coastguard Worker
2709*61046927SAndroid Build Coastguard Worker tu_autotune_fini(&device->autotune, device);
2710*61046927SAndroid Build Coastguard Worker
2711*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_finish(&device->pipeline_suballoc);
2712*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_finish(&device->autotune_suballoc);
2713*61046927SAndroid Build Coastguard Worker tu_bo_suballocator_finish(&device->kgsl_profiling_suballoc);
2714*61046927SAndroid Build Coastguard Worker
2715*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, device->global_bo);
2716*61046927SAndroid Build Coastguard Worker
2717*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < TU_MAX_QUEUE_FAMILIES; i++) {
2718*61046927SAndroid Build Coastguard Worker for (unsigned q = 0; q < device->queue_count[i]; q++)
2719*61046927SAndroid Build Coastguard Worker tu_queue_finish(&device->queues[i][q]);
2720*61046927SAndroid Build Coastguard Worker if (device->queue_count[i])
2721*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device->queues[i]);
2722*61046927SAndroid Build Coastguard Worker }
2723*61046927SAndroid Build Coastguard Worker
2724*61046927SAndroid Build Coastguard Worker tu_drm_device_finish(device);
2725*61046927SAndroid Build Coastguard Worker
2726*61046927SAndroid Build Coastguard Worker if (device->physical_device->has_set_iova)
2727*61046927SAndroid Build Coastguard Worker util_vma_heap_finish(&device->vma);
2728*61046927SAndroid Build Coastguard Worker
2729*61046927SAndroid Build Coastguard Worker util_sparse_array_finish(&device->bo_map);
2730*61046927SAndroid Build Coastguard Worker u_rwlock_destroy(&device->dma_bo_lock);
2731*61046927SAndroid Build Coastguard Worker
2732*61046927SAndroid Build Coastguard Worker u_vector_finish(&device->zombie_vmas);
2733*61046927SAndroid Build Coastguard Worker
2734*61046927SAndroid Build Coastguard Worker pthread_cond_destroy(&device->timeline_cond);
2735*61046927SAndroid Build Coastguard Worker _mesa_hash_table_destroy(device->bo_sizes, NULL);
2736*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device->bo_list);
2737*61046927SAndroid Build Coastguard Worker vk_device_finish(&device->vk);
2738*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
2739*61046927SAndroid Build Coastguard Worker }
2740*61046927SAndroid Build Coastguard Worker
2741*61046927SAndroid Build Coastguard Worker VkResult
tu_get_scratch_bo(struct tu_device * dev,uint64_t size,struct tu_bo ** bo)2742*61046927SAndroid Build Coastguard Worker tu_get_scratch_bo(struct tu_device *dev, uint64_t size, struct tu_bo **bo)
2743*61046927SAndroid Build Coastguard Worker {
2744*61046927SAndroid Build Coastguard Worker unsigned size_log2 = MAX2(util_logbase2_ceil64(size), MIN_SCRATCH_BO_SIZE_LOG2);
2745*61046927SAndroid Build Coastguard Worker unsigned index = size_log2 - MIN_SCRATCH_BO_SIZE_LOG2;
2746*61046927SAndroid Build Coastguard Worker assert(index < ARRAY_SIZE(dev->scratch_bos));
2747*61046927SAndroid Build Coastguard Worker
2748*61046927SAndroid Build Coastguard Worker for (unsigned i = index; i < ARRAY_SIZE(dev->scratch_bos); i++) {
2749*61046927SAndroid Build Coastguard Worker if (p_atomic_read(&dev->scratch_bos[i].initialized)) {
2750*61046927SAndroid Build Coastguard Worker /* Fast path: just return the already-allocated BO. */
2751*61046927SAndroid Build Coastguard Worker *bo = dev->scratch_bos[i].bo;
2752*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2753*61046927SAndroid Build Coastguard Worker }
2754*61046927SAndroid Build Coastguard Worker }
2755*61046927SAndroid Build Coastguard Worker
2756*61046927SAndroid Build Coastguard Worker /* Slow path: actually allocate the BO. We take a lock because the process
2757*61046927SAndroid Build Coastguard Worker * of allocating it is slow, and we don't want to block the CPU while it
2758*61046927SAndroid Build Coastguard Worker * finishes.
2759*61046927SAndroid Build Coastguard Worker */
2760*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->scratch_bos[index].construct_mtx);
2761*61046927SAndroid Build Coastguard Worker
2762*61046927SAndroid Build Coastguard Worker /* Another thread may have allocated it already while we were waiting on
2763*61046927SAndroid Build Coastguard Worker * the lock. We need to check this in order to avoid double-allocating.
2764*61046927SAndroid Build Coastguard Worker */
2765*61046927SAndroid Build Coastguard Worker if (dev->scratch_bos[index].initialized) {
2766*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->scratch_bos[index].construct_mtx);
2767*61046927SAndroid Build Coastguard Worker *bo = dev->scratch_bos[index].bo;
2768*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2769*61046927SAndroid Build Coastguard Worker }
2770*61046927SAndroid Build Coastguard Worker
2771*61046927SAndroid Build Coastguard Worker unsigned bo_size = 1ull << size_log2;
2772*61046927SAndroid Build Coastguard Worker VkResult result = tu_bo_init_new(dev, NULL, &dev->scratch_bos[index].bo, bo_size,
2773*61046927SAndroid Build Coastguard Worker TU_BO_ALLOC_INTERNAL_RESOURCE, "scratch");
2774*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2775*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->scratch_bos[index].construct_mtx);
2776*61046927SAndroid Build Coastguard Worker return result;
2777*61046927SAndroid Build Coastguard Worker }
2778*61046927SAndroid Build Coastguard Worker
2779*61046927SAndroid Build Coastguard Worker p_atomic_set(&dev->scratch_bos[index].initialized, true);
2780*61046927SAndroid Build Coastguard Worker
2781*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->scratch_bos[index].construct_mtx);
2782*61046927SAndroid Build Coastguard Worker
2783*61046927SAndroid Build Coastguard Worker *bo = dev->scratch_bos[index].bo;
2784*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2785*61046927SAndroid Build Coastguard Worker }
2786*61046927SAndroid Build Coastguard Worker
2787*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_EnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)2788*61046927SAndroid Build Coastguard Worker tu_EnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
2789*61046927SAndroid Build Coastguard Worker VkLayerProperties *pProperties)
2790*61046927SAndroid Build Coastguard Worker {
2791*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
2792*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2793*61046927SAndroid Build Coastguard Worker }
2794*61046927SAndroid Build Coastguard Worker
2795*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_EnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)2796*61046927SAndroid Build Coastguard Worker tu_EnumerateInstanceExtensionProperties(const char *pLayerName,
2797*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
2798*61046927SAndroid Build Coastguard Worker VkExtensionProperties *pProperties)
2799*61046927SAndroid Build Coastguard Worker {
2800*61046927SAndroid Build Coastguard Worker if (pLayerName)
2801*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
2802*61046927SAndroid Build Coastguard Worker
2803*61046927SAndroid Build Coastguard Worker return vk_enumerate_instance_extension_properties(
2804*61046927SAndroid Build Coastguard Worker &tu_instance_extensions_supported, pPropertyCount, pProperties);
2805*61046927SAndroid Build Coastguard Worker }
2806*61046927SAndroid Build Coastguard Worker
2807*61046927SAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
tu_GetInstanceProcAddr(VkInstance _instance,const char * pName)2808*61046927SAndroid Build Coastguard Worker tu_GetInstanceProcAddr(VkInstance _instance, const char *pName)
2809*61046927SAndroid Build Coastguard Worker {
2810*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_instance, instance, _instance);
2811*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr(instance != NULL ? &instance->vk : NULL,
2812*61046927SAndroid Build Coastguard Worker &tu_instance_entrypoints,
2813*61046927SAndroid Build Coastguard Worker pName);
2814*61046927SAndroid Build Coastguard Worker }
2815*61046927SAndroid Build Coastguard Worker
2816*61046927SAndroid Build Coastguard Worker /* The loader wants us to expose a second GetInstanceProcAddr function
2817*61046927SAndroid Build Coastguard Worker * to work around certain LD_PRELOAD issues seen in apps.
2818*61046927SAndroid Build Coastguard Worker */
2819*61046927SAndroid Build Coastguard Worker PUBLIC
2820*61046927SAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
vk_icdGetInstanceProcAddr(VkInstance instance,const char * pName)2821*61046927SAndroid Build Coastguard Worker vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName)
2822*61046927SAndroid Build Coastguard Worker {
2823*61046927SAndroid Build Coastguard Worker return tu_GetInstanceProcAddr(instance, pName);
2824*61046927SAndroid Build Coastguard Worker }
2825*61046927SAndroid Build Coastguard Worker
2826*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_AllocateMemory(VkDevice _device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMem)2827*61046927SAndroid Build Coastguard Worker tu_AllocateMemory(VkDevice _device,
2828*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateInfo *pAllocateInfo,
2829*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2830*61046927SAndroid Build Coastguard Worker VkDeviceMemory *pMem)
2831*61046927SAndroid Build Coastguard Worker {
2832*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
2833*61046927SAndroid Build Coastguard Worker struct tu_device_memory *mem;
2834*61046927SAndroid Build Coastguard Worker VkResult result;
2835*61046927SAndroid Build Coastguard Worker
2836*61046927SAndroid Build Coastguard Worker assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
2837*61046927SAndroid Build Coastguard Worker
2838*61046927SAndroid Build Coastguard Worker struct tu_memory_heap *mem_heap = &device->physical_device->heap;
2839*61046927SAndroid Build Coastguard Worker uint64_t mem_heap_used = p_atomic_read(&mem_heap->used);
2840*61046927SAndroid Build Coastguard Worker if (mem_heap_used > mem_heap->size)
2841*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
2842*61046927SAndroid Build Coastguard Worker
2843*61046927SAndroid Build Coastguard Worker mem = (struct tu_device_memory *) vk_device_memory_create(
2844*61046927SAndroid Build Coastguard Worker &device->vk, pAllocateInfo, pAllocator, sizeof(*mem));
2845*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2846*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2847*61046927SAndroid Build Coastguard Worker
2848*61046927SAndroid Build Coastguard Worker if (pAllocateInfo->allocationSize == 0 && !mem->vk.ahardware_buffer) {
2849*61046927SAndroid Build Coastguard Worker vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
2850*61046927SAndroid Build Coastguard Worker /* Apparently, this is allowed */
2851*61046927SAndroid Build Coastguard Worker *pMem = VK_NULL_HANDLE;
2852*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2853*61046927SAndroid Build Coastguard Worker }
2854*61046927SAndroid Build Coastguard Worker
2855*61046927SAndroid Build Coastguard Worker const VkImportMemoryFdInfoKHR *fd_info =
2856*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_FD_INFO_KHR);
2857*61046927SAndroid Build Coastguard Worker
2858*61046927SAndroid Build Coastguard Worker if (fd_info && fd_info->handleType) {
2859*61046927SAndroid Build Coastguard Worker assert(fd_info->handleType ==
2860*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
2861*61046927SAndroid Build Coastguard Worker fd_info->handleType ==
2862*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
2863*61046927SAndroid Build Coastguard Worker
2864*61046927SAndroid Build Coastguard Worker /*
2865*61046927SAndroid Build Coastguard Worker * TODO Importing the same fd twice gives us the same handle without
2866*61046927SAndroid Build Coastguard Worker * reference counting. We need to maintain a per-instance handle-to-bo
2867*61046927SAndroid Build Coastguard Worker * table and add reference count to tu_bo.
2868*61046927SAndroid Build Coastguard Worker */
2869*61046927SAndroid Build Coastguard Worker result = tu_bo_init_dmabuf(device, &mem->bo,
2870*61046927SAndroid Build Coastguard Worker pAllocateInfo->allocationSize, fd_info->fd);
2871*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS) {
2872*61046927SAndroid Build Coastguard Worker /* take ownership and close the fd */
2873*61046927SAndroid Build Coastguard Worker close(fd_info->fd);
2874*61046927SAndroid Build Coastguard Worker }
2875*61046927SAndroid Build Coastguard Worker } else if (mem->vk.ahardware_buffer) {
2876*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
2877*61046927SAndroid Build Coastguard Worker const native_handle_t *handle = AHardwareBuffer_getNativeHandle(mem->vk.ahardware_buffer);
2878*61046927SAndroid Build Coastguard Worker assert(handle->numFds > 0);
2879*61046927SAndroid Build Coastguard Worker size_t size = lseek(handle->data[0], 0, SEEK_END);
2880*61046927SAndroid Build Coastguard Worker result = tu_bo_init_dmabuf(device, &mem->bo, size, handle->data[0]);
2881*61046927SAndroid Build Coastguard Worker #else
2882*61046927SAndroid Build Coastguard Worker result = VK_ERROR_FEATURE_NOT_PRESENT;
2883*61046927SAndroid Build Coastguard Worker #endif
2884*61046927SAndroid Build Coastguard Worker } else {
2885*61046927SAndroid Build Coastguard Worker uint64_t client_address = 0;
2886*61046927SAndroid Build Coastguard Worker BITMASK_ENUM(tu_bo_alloc_flags) alloc_flags = TU_BO_ALLOC_NO_FLAGS;
2887*61046927SAndroid Build Coastguard Worker
2888*61046927SAndroid Build Coastguard Worker const VkMemoryOpaqueCaptureAddressAllocateInfo *replay_info =
2889*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pAllocateInfo->pNext,
2890*61046927SAndroid Build Coastguard Worker MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO);
2891*61046927SAndroid Build Coastguard Worker if (replay_info && replay_info->opaqueCaptureAddress) {
2892*61046927SAndroid Build Coastguard Worker client_address = replay_info->opaqueCaptureAddress;
2893*61046927SAndroid Build Coastguard Worker alloc_flags |= TU_BO_ALLOC_REPLAYABLE;
2894*61046927SAndroid Build Coastguard Worker }
2895*61046927SAndroid Build Coastguard Worker
2896*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateFlagsInfo *flags_info = vk_find_struct_const(
2897*61046927SAndroid Build Coastguard Worker pAllocateInfo->pNext, MEMORY_ALLOCATE_FLAGS_INFO);
2898*61046927SAndroid Build Coastguard Worker if (flags_info &&
2899*61046927SAndroid Build Coastguard Worker (flags_info->flags &
2900*61046927SAndroid Build Coastguard Worker VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT)) {
2901*61046927SAndroid Build Coastguard Worker alloc_flags |= TU_BO_ALLOC_REPLAYABLE;
2902*61046927SAndroid Build Coastguard Worker }
2903*61046927SAndroid Build Coastguard Worker
2904*61046927SAndroid Build Coastguard Worker const VkExportMemoryAllocateInfo *export_info =
2905*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO);
2906*61046927SAndroid Build Coastguard Worker if (export_info && (export_info->handleTypes &
2907*61046927SAndroid Build Coastguard Worker (VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
2908*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)))
2909*61046927SAndroid Build Coastguard Worker alloc_flags |= TU_BO_ALLOC_SHAREABLE;
2910*61046927SAndroid Build Coastguard Worker
2911*61046927SAndroid Build Coastguard Worker
2912*61046927SAndroid Build Coastguard Worker char name[64] = "vkAllocateMemory()";
2913*61046927SAndroid Build Coastguard Worker if (device->bo_sizes)
2914*61046927SAndroid Build Coastguard Worker snprintf(name, ARRAY_SIZE(name), "vkAllocateMemory(%ldkb)",
2915*61046927SAndroid Build Coastguard Worker (long)DIV_ROUND_UP(pAllocateInfo->allocationSize, 1024));
2916*61046927SAndroid Build Coastguard Worker VkMemoryPropertyFlags mem_property =
2917*61046927SAndroid Build Coastguard Worker device->physical_device->memory.types[pAllocateInfo->memoryTypeIndex];
2918*61046927SAndroid Build Coastguard Worker result = tu_bo_init_new_explicit_iova(
2919*61046927SAndroid Build Coastguard Worker device, &mem->vk.base, &mem->bo, pAllocateInfo->allocationSize,
2920*61046927SAndroid Build Coastguard Worker client_address, mem_property, alloc_flags, name);
2921*61046927SAndroid Build Coastguard Worker }
2922*61046927SAndroid Build Coastguard Worker
2923*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS) {
2924*61046927SAndroid Build Coastguard Worker mem_heap_used = p_atomic_add_return(&mem_heap->used, mem->bo->size);
2925*61046927SAndroid Build Coastguard Worker if (mem_heap_used > mem_heap->size) {
2926*61046927SAndroid Build Coastguard Worker p_atomic_add(&mem_heap->used, -mem->bo->size);
2927*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, mem->bo);
2928*61046927SAndroid Build Coastguard Worker result = vk_errorf(device, VK_ERROR_OUT_OF_DEVICE_MEMORY,
2929*61046927SAndroid Build Coastguard Worker "Out of heap memory");
2930*61046927SAndroid Build Coastguard Worker }
2931*61046927SAndroid Build Coastguard Worker }
2932*61046927SAndroid Build Coastguard Worker
2933*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2934*61046927SAndroid Build Coastguard Worker vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
2935*61046927SAndroid Build Coastguard Worker return result;
2936*61046927SAndroid Build Coastguard Worker }
2937*61046927SAndroid Build Coastguard Worker
2938*61046927SAndroid Build Coastguard Worker /* Track in the device whether our BO list contains any implicit-sync BOs, so
2939*61046927SAndroid Build Coastguard Worker * we can suppress implicit sync on non-WSI usage.
2940*61046927SAndroid Build Coastguard Worker */
2941*61046927SAndroid Build Coastguard Worker const struct wsi_memory_allocate_info *wsi_info =
2942*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pAllocateInfo->pNext, WSI_MEMORY_ALLOCATE_INFO_MESA);
2943*61046927SAndroid Build Coastguard Worker if (wsi_info && wsi_info->implicit_sync) {
2944*61046927SAndroid Build Coastguard Worker mtx_lock(&device->bo_mutex);
2945*61046927SAndroid Build Coastguard Worker if (!mem->bo->implicit_sync) {
2946*61046927SAndroid Build Coastguard Worker mem->bo->implicit_sync = true;
2947*61046927SAndroid Build Coastguard Worker device->implicit_sync_bo_count++;
2948*61046927SAndroid Build Coastguard Worker }
2949*61046927SAndroid Build Coastguard Worker mtx_unlock(&device->bo_mutex);
2950*61046927SAndroid Build Coastguard Worker }
2951*61046927SAndroid Build Coastguard Worker
2952*61046927SAndroid Build Coastguard Worker const VkMemoryDedicatedAllocateInfo *dedicate_info =
2953*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pAllocateInfo->pNext, MEMORY_DEDICATED_ALLOCATE_INFO);
2954*61046927SAndroid Build Coastguard Worker if (dedicate_info) {
2955*61046927SAndroid Build Coastguard Worker mem->image = tu_image_from_handle(dedicate_info->image);
2956*61046927SAndroid Build Coastguard Worker } else {
2957*61046927SAndroid Build Coastguard Worker mem->image = NULL;
2958*61046927SAndroid Build Coastguard Worker }
2959*61046927SAndroid Build Coastguard Worker
2960*61046927SAndroid Build Coastguard Worker TU_RMV(heap_create, device, pAllocateInfo, mem);
2961*61046927SAndroid Build Coastguard Worker
2962*61046927SAndroid Build Coastguard Worker *pMem = tu_device_memory_to_handle(mem);
2963*61046927SAndroid Build Coastguard Worker
2964*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2965*61046927SAndroid Build Coastguard Worker }
2966*61046927SAndroid Build Coastguard Worker
2967*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_FreeMemory(VkDevice _device,VkDeviceMemory _mem,const VkAllocationCallbacks * pAllocator)2968*61046927SAndroid Build Coastguard Worker tu_FreeMemory(VkDevice _device,
2969*61046927SAndroid Build Coastguard Worker VkDeviceMemory _mem,
2970*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2971*61046927SAndroid Build Coastguard Worker {
2972*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
2973*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, mem, _mem);
2974*61046927SAndroid Build Coastguard Worker
2975*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2976*61046927SAndroid Build Coastguard Worker return;
2977*61046927SAndroid Build Coastguard Worker
2978*61046927SAndroid Build Coastguard Worker TU_RMV(resource_destroy, device, mem);
2979*61046927SAndroid Build Coastguard Worker
2980*61046927SAndroid Build Coastguard Worker p_atomic_add(&device->physical_device->heap.used, -mem->bo->size);
2981*61046927SAndroid Build Coastguard Worker tu_bo_finish(device, mem->bo);
2982*61046927SAndroid Build Coastguard Worker vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
2983*61046927SAndroid Build Coastguard Worker }
2984*61046927SAndroid Build Coastguard Worker
2985*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_MapMemory2KHR(VkDevice _device,const VkMemoryMapInfoKHR * pMemoryMapInfo,void ** ppData)2986*61046927SAndroid Build Coastguard Worker tu_MapMemory2KHR(VkDevice _device, const VkMemoryMapInfoKHR *pMemoryMapInfo, void **ppData)
2987*61046927SAndroid Build Coastguard Worker {
2988*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
2989*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, mem, pMemoryMapInfo->memory);
2990*61046927SAndroid Build Coastguard Worker VkResult result;
2991*61046927SAndroid Build Coastguard Worker
2992*61046927SAndroid Build Coastguard Worker if (mem == NULL) {
2993*61046927SAndroid Build Coastguard Worker *ppData = NULL;
2994*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2995*61046927SAndroid Build Coastguard Worker }
2996*61046927SAndroid Build Coastguard Worker
2997*61046927SAndroid Build Coastguard Worker void *placed_addr = NULL;
2998*61046927SAndroid Build Coastguard Worker if (pMemoryMapInfo->flags & VK_MEMORY_MAP_PLACED_BIT_EXT) {
2999*61046927SAndroid Build Coastguard Worker const VkMemoryMapPlacedInfoEXT *placed_info =
3000*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pMemoryMapInfo->pNext, MEMORY_MAP_PLACED_INFO_EXT);
3001*61046927SAndroid Build Coastguard Worker assert(placed_info != NULL);
3002*61046927SAndroid Build Coastguard Worker placed_addr = placed_info->pPlacedAddress;
3003*61046927SAndroid Build Coastguard Worker }
3004*61046927SAndroid Build Coastguard Worker
3005*61046927SAndroid Build Coastguard Worker result = tu_bo_map(device, mem->bo, placed_addr);
3006*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
3007*61046927SAndroid Build Coastguard Worker return result;
3008*61046927SAndroid Build Coastguard Worker
3009*61046927SAndroid Build Coastguard Worker *ppData = (char *) mem->bo->map + pMemoryMapInfo->offset;
3010*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3011*61046927SAndroid Build Coastguard Worker }
3012*61046927SAndroid Build Coastguard Worker
3013*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_UnmapMemory2KHR(VkDevice _device,const VkMemoryUnmapInfoKHR * pMemoryUnmapInfo)3014*61046927SAndroid Build Coastguard Worker tu_UnmapMemory2KHR(VkDevice _device, const VkMemoryUnmapInfoKHR *pMemoryUnmapInfo)
3015*61046927SAndroid Build Coastguard Worker {
3016*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3017*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, mem, pMemoryUnmapInfo->memory);
3018*61046927SAndroid Build Coastguard Worker
3019*61046927SAndroid Build Coastguard Worker if (mem == NULL)
3020*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3021*61046927SAndroid Build Coastguard Worker
3022*61046927SAndroid Build Coastguard Worker return tu_bo_unmap(device, mem->bo, pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT);
3023*61046927SAndroid Build Coastguard Worker }
3024*61046927SAndroid Build Coastguard Worker static VkResult
sync_cache(VkDevice _device,enum tu_mem_sync_op op,uint32_t count,const VkMappedMemoryRange * ranges)3025*61046927SAndroid Build Coastguard Worker sync_cache(VkDevice _device,
3026*61046927SAndroid Build Coastguard Worker enum tu_mem_sync_op op,
3027*61046927SAndroid Build Coastguard Worker uint32_t count,
3028*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *ranges)
3029*61046927SAndroid Build Coastguard Worker {
3030*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3031*61046927SAndroid Build Coastguard Worker
3032*61046927SAndroid Build Coastguard Worker if (!device->physical_device->has_cached_non_coherent_memory) {
3033*61046927SAndroid Build Coastguard Worker tu_finishme(
3034*61046927SAndroid Build Coastguard Worker "data cache clean and invalidation are unsupported on this arch!");
3035*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3036*61046927SAndroid Build Coastguard Worker }
3037*61046927SAndroid Build Coastguard Worker
3038*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; i++) {
3039*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, mem, ranges[i].memory);
3040*61046927SAndroid Build Coastguard Worker tu_bo_sync_cache(device, mem->bo, ranges[i].offset, ranges[i].size, op);
3041*61046927SAndroid Build Coastguard Worker }
3042*61046927SAndroid Build Coastguard Worker
3043*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3044*61046927SAndroid Build Coastguard Worker }
3045*61046927SAndroid Build Coastguard Worker
3046*61046927SAndroid Build Coastguard Worker VkResult
tu_FlushMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)3047*61046927SAndroid Build Coastguard Worker tu_FlushMappedMemoryRanges(VkDevice _device,
3048*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
3049*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
3050*61046927SAndroid Build Coastguard Worker {
3051*61046927SAndroid Build Coastguard Worker return sync_cache(_device, TU_MEM_SYNC_CACHE_TO_GPU, memoryRangeCount,
3052*61046927SAndroid Build Coastguard Worker pMemoryRanges);
3053*61046927SAndroid Build Coastguard Worker }
3054*61046927SAndroid Build Coastguard Worker
3055*61046927SAndroid Build Coastguard Worker VkResult
tu_InvalidateMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)3056*61046927SAndroid Build Coastguard Worker tu_InvalidateMappedMemoryRanges(VkDevice _device,
3057*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
3058*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
3059*61046927SAndroid Build Coastguard Worker {
3060*61046927SAndroid Build Coastguard Worker return sync_cache(_device, TU_MEM_SYNC_CACHE_FROM_GPU, memoryRangeCount,
3061*61046927SAndroid Build Coastguard Worker pMemoryRanges);
3062*61046927SAndroid Build Coastguard Worker }
3063*61046927SAndroid Build Coastguard Worker
3064*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_GetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes)3065*61046927SAndroid Build Coastguard Worker tu_GetDeviceMemoryCommitment(VkDevice device,
3066*61046927SAndroid Build Coastguard Worker VkDeviceMemory memory,
3067*61046927SAndroid Build Coastguard Worker VkDeviceSize *pCommittedMemoryInBytes)
3068*61046927SAndroid Build Coastguard Worker {
3069*61046927SAndroid Build Coastguard Worker *pCommittedMemoryInBytes = 0;
3070*61046927SAndroid Build Coastguard Worker }
3071*61046927SAndroid Build Coastguard Worker
3072*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateFramebuffer(VkDevice _device,const VkFramebufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFramebuffer * pFramebuffer)3073*61046927SAndroid Build Coastguard Worker tu_CreateFramebuffer(VkDevice _device,
3074*61046927SAndroid Build Coastguard Worker const VkFramebufferCreateInfo *pCreateInfo,
3075*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
3076*61046927SAndroid Build Coastguard Worker VkFramebuffer *pFramebuffer)
3077*61046927SAndroid Build Coastguard Worker {
3078*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3079*61046927SAndroid Build Coastguard Worker
3080*61046927SAndroid Build Coastguard Worker if (TU_DEBUG(DYNAMIC))
3081*61046927SAndroid Build Coastguard Worker return vk_common_CreateFramebuffer(_device, pCreateInfo, pAllocator,
3082*61046927SAndroid Build Coastguard Worker pFramebuffer);
3083*61046927SAndroid Build Coastguard Worker
3084*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_render_pass, pass, pCreateInfo->renderPass);
3085*61046927SAndroid Build Coastguard Worker struct tu_framebuffer *framebuffer;
3086*61046927SAndroid Build Coastguard Worker
3087*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO);
3088*61046927SAndroid Build Coastguard Worker
3089*61046927SAndroid Build Coastguard Worker bool imageless = pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT;
3090*61046927SAndroid Build Coastguard Worker
3091*61046927SAndroid Build Coastguard Worker size_t size = sizeof(*framebuffer);
3092*61046927SAndroid Build Coastguard Worker if (!imageless)
3093*61046927SAndroid Build Coastguard Worker size += sizeof(struct tu_attachment_info) * pCreateInfo->attachmentCount;
3094*61046927SAndroid Build Coastguard Worker framebuffer = (struct tu_framebuffer *) vk_object_alloc(
3095*61046927SAndroid Build Coastguard Worker &device->vk, pAllocator, size, VK_OBJECT_TYPE_FRAMEBUFFER);
3096*61046927SAndroid Build Coastguard Worker if (framebuffer == NULL)
3097*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
3098*61046927SAndroid Build Coastguard Worker
3099*61046927SAndroid Build Coastguard Worker framebuffer->attachment_count = pCreateInfo->attachmentCount;
3100*61046927SAndroid Build Coastguard Worker framebuffer->width = pCreateInfo->width;
3101*61046927SAndroid Build Coastguard Worker framebuffer->height = pCreateInfo->height;
3102*61046927SAndroid Build Coastguard Worker framebuffer->layers = pCreateInfo->layers;
3103*61046927SAndroid Build Coastguard Worker
3104*61046927SAndroid Build Coastguard Worker if (!imageless) {
3105*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) {
3106*61046927SAndroid Build Coastguard Worker VkImageView _iview = pCreateInfo->pAttachments[i];
3107*61046927SAndroid Build Coastguard Worker struct tu_image_view *iview = tu_image_view_from_handle(_iview);
3108*61046927SAndroid Build Coastguard Worker framebuffer->attachments[i].attachment = iview;
3109*61046927SAndroid Build Coastguard Worker }
3110*61046927SAndroid Build Coastguard Worker }
3111*61046927SAndroid Build Coastguard Worker
3112*61046927SAndroid Build Coastguard Worker tu_framebuffer_tiling_config(framebuffer, device, pass);
3113*61046927SAndroid Build Coastguard Worker
3114*61046927SAndroid Build Coastguard Worker *pFramebuffer = tu_framebuffer_to_handle(framebuffer);
3115*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3116*61046927SAndroid Build Coastguard Worker }
3117*61046927SAndroid Build Coastguard Worker
3118*61046927SAndroid Build Coastguard Worker void
tu_setup_dynamic_framebuffer(struct tu_cmd_buffer * cmd_buffer,const VkRenderingInfo * pRenderingInfo)3119*61046927SAndroid Build Coastguard Worker tu_setup_dynamic_framebuffer(struct tu_cmd_buffer *cmd_buffer,
3120*61046927SAndroid Build Coastguard Worker const VkRenderingInfo *pRenderingInfo)
3121*61046927SAndroid Build Coastguard Worker {
3122*61046927SAndroid Build Coastguard Worker struct tu_render_pass *pass = &cmd_buffer->dynamic_pass;
3123*61046927SAndroid Build Coastguard Worker struct tu_framebuffer *framebuffer = &cmd_buffer->dynamic_framebuffer;
3124*61046927SAndroid Build Coastguard Worker
3125*61046927SAndroid Build Coastguard Worker framebuffer->attachment_count = pass->attachment_count;
3126*61046927SAndroid Build Coastguard Worker framebuffer->width = pRenderingInfo->renderArea.offset.x +
3127*61046927SAndroid Build Coastguard Worker pRenderingInfo->renderArea.extent.width;
3128*61046927SAndroid Build Coastguard Worker framebuffer->height = pRenderingInfo->renderArea.offset.y +
3129*61046927SAndroid Build Coastguard Worker pRenderingInfo->renderArea.extent.height;
3130*61046927SAndroid Build Coastguard Worker framebuffer->layers = pRenderingInfo->layerCount;
3131*61046927SAndroid Build Coastguard Worker
3132*61046927SAndroid Build Coastguard Worker tu_framebuffer_tiling_config(framebuffer, cmd_buffer->device, pass);
3133*61046927SAndroid Build Coastguard Worker }
3134*61046927SAndroid Build Coastguard Worker
3135*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_DestroyFramebuffer(VkDevice _device,VkFramebuffer _fb,const VkAllocationCallbacks * pAllocator)3136*61046927SAndroid Build Coastguard Worker tu_DestroyFramebuffer(VkDevice _device,
3137*61046927SAndroid Build Coastguard Worker VkFramebuffer _fb,
3138*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
3139*61046927SAndroid Build Coastguard Worker {
3140*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3141*61046927SAndroid Build Coastguard Worker
3142*61046927SAndroid Build Coastguard Worker if (TU_DEBUG(DYNAMIC)) {
3143*61046927SAndroid Build Coastguard Worker vk_common_DestroyFramebuffer(_device, _fb, pAllocator);
3144*61046927SAndroid Build Coastguard Worker return;
3145*61046927SAndroid Build Coastguard Worker }
3146*61046927SAndroid Build Coastguard Worker
3147*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_framebuffer, fb, _fb);
3148*61046927SAndroid Build Coastguard Worker
3149*61046927SAndroid Build Coastguard Worker if (!fb)
3150*61046927SAndroid Build Coastguard Worker return;
3151*61046927SAndroid Build Coastguard Worker
3152*61046927SAndroid Build Coastguard Worker vk_object_free(&device->vk, pAllocator, fb);
3153*61046927SAndroid Build Coastguard Worker }
3154*61046927SAndroid Build Coastguard Worker
3155*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_GetMemoryFdKHR(VkDevice _device,const VkMemoryGetFdInfoKHR * pGetFdInfo,int * pFd)3156*61046927SAndroid Build Coastguard Worker tu_GetMemoryFdKHR(VkDevice _device,
3157*61046927SAndroid Build Coastguard Worker const VkMemoryGetFdInfoKHR *pGetFdInfo,
3158*61046927SAndroid Build Coastguard Worker int *pFd)
3159*61046927SAndroid Build Coastguard Worker {
3160*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3161*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, memory, pGetFdInfo->memory);
3162*61046927SAndroid Build Coastguard Worker
3163*61046927SAndroid Build Coastguard Worker assert(pGetFdInfo->sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
3164*61046927SAndroid Build Coastguard Worker
3165*61046927SAndroid Build Coastguard Worker /* At the moment, we support only the below handle types. */
3166*61046927SAndroid Build Coastguard Worker assert(pGetFdInfo->handleType ==
3167*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
3168*61046927SAndroid Build Coastguard Worker pGetFdInfo->handleType ==
3169*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
3170*61046927SAndroid Build Coastguard Worker
3171*61046927SAndroid Build Coastguard Worker int prime_fd = tu_bo_export_dmabuf(device, memory->bo);
3172*61046927SAndroid Build Coastguard Worker if (prime_fd < 0)
3173*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
3174*61046927SAndroid Build Coastguard Worker
3175*61046927SAndroid Build Coastguard Worker *pFd = prime_fd;
3176*61046927SAndroid Build Coastguard Worker
3177*61046927SAndroid Build Coastguard Worker if (memory->image) {
3178*61046927SAndroid Build Coastguard Worker struct fdl_layout *l = &memory->image->layout[0];
3179*61046927SAndroid Build Coastguard Worker uint64_t modifier;
3180*61046927SAndroid Build Coastguard Worker if (l->ubwc) {
3181*61046927SAndroid Build Coastguard Worker modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
3182*61046927SAndroid Build Coastguard Worker } else if (l->tile_mode == 2) {
3183*61046927SAndroid Build Coastguard Worker modifier = DRM_FORMAT_MOD_QCOM_TILED2;
3184*61046927SAndroid Build Coastguard Worker } else if (l->tile_mode == 3) {
3185*61046927SAndroid Build Coastguard Worker modifier = DRM_FORMAT_MOD_QCOM_TILED3;
3186*61046927SAndroid Build Coastguard Worker } else {
3187*61046927SAndroid Build Coastguard Worker assert(!l->tile_mode);
3188*61046927SAndroid Build Coastguard Worker modifier = DRM_FORMAT_MOD_LINEAR;
3189*61046927SAndroid Build Coastguard Worker }
3190*61046927SAndroid Build Coastguard Worker struct fdl_metadata metadata = {
3191*61046927SAndroid Build Coastguard Worker .modifier = modifier,
3192*61046927SAndroid Build Coastguard Worker };
3193*61046927SAndroid Build Coastguard Worker tu_bo_set_metadata(device, memory->bo, &metadata, sizeof(metadata));
3194*61046927SAndroid Build Coastguard Worker }
3195*61046927SAndroid Build Coastguard Worker
3196*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3197*61046927SAndroid Build Coastguard Worker }
3198*61046927SAndroid Build Coastguard Worker
3199*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_GetMemoryFdPropertiesKHR(VkDevice _device,VkExternalMemoryHandleTypeFlagBits handleType,int fd,VkMemoryFdPropertiesKHR * pMemoryFdProperties)3200*61046927SAndroid Build Coastguard Worker tu_GetMemoryFdPropertiesKHR(VkDevice _device,
3201*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits handleType,
3202*61046927SAndroid Build Coastguard Worker int fd,
3203*61046927SAndroid Build Coastguard Worker VkMemoryFdPropertiesKHR *pMemoryFdProperties)
3204*61046927SAndroid Build Coastguard Worker {
3205*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device, device, _device);
3206*61046927SAndroid Build Coastguard Worker assert(handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
3207*61046927SAndroid Build Coastguard Worker pMemoryFdProperties->memoryTypeBits =
3208*61046927SAndroid Build Coastguard Worker (1 << device->physical_device->memory.type_count) - 1;
3209*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
3210*61046927SAndroid Build Coastguard Worker }
3211*61046927SAndroid Build Coastguard Worker
3212*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_GetPhysicalDeviceMultisamplePropertiesEXT(VkPhysicalDevice physicalDevice,VkSampleCountFlagBits samples,VkMultisamplePropertiesEXT * pMultisampleProperties)3213*61046927SAndroid Build Coastguard Worker tu_GetPhysicalDeviceMultisamplePropertiesEXT(
3214*61046927SAndroid Build Coastguard Worker VkPhysicalDevice physicalDevice,
3215*61046927SAndroid Build Coastguard Worker VkSampleCountFlagBits samples,
3216*61046927SAndroid Build Coastguard Worker VkMultisamplePropertiesEXT* pMultisampleProperties)
3217*61046927SAndroid Build Coastguard Worker {
3218*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
3219*61046927SAndroid Build Coastguard Worker
3220*61046927SAndroid Build Coastguard Worker if (samples <= VK_SAMPLE_COUNT_4_BIT && pdevice->vk.supported_extensions.EXT_sample_locations)
3221*61046927SAndroid Build Coastguard Worker pMultisampleProperties->maxSampleLocationGridSize = (VkExtent2D){ 1, 1 };
3222*61046927SAndroid Build Coastguard Worker else
3223*61046927SAndroid Build Coastguard Worker pMultisampleProperties->maxSampleLocationGridSize = (VkExtent2D){ 0, 0 };
3224*61046927SAndroid Build Coastguard Worker }
3225*61046927SAndroid Build Coastguard Worker
tu_GetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo)3226*61046927SAndroid Build Coastguard Worker uint64_t tu_GetDeviceMemoryOpaqueCaptureAddress(
3227*61046927SAndroid Build Coastguard Worker VkDevice device,
3228*61046927SAndroid Build Coastguard Worker const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
3229*61046927SAndroid Build Coastguard Worker {
3230*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_device_memory, mem, pInfo->memory);
3231*61046927SAndroid Build Coastguard Worker return mem->bo->iova;
3232*61046927SAndroid Build Coastguard Worker }
3233*61046927SAndroid Build Coastguard Worker
3234*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry {
3235*61046927SAndroid Build Coastguard Worker uint32_t count;
3236*61046927SAndroid Build Coastguard Worker uint64_t size;
3237*61046927SAndroid Build Coastguard Worker const char *name;
3238*61046927SAndroid Build Coastguard Worker };
3239*61046927SAndroid Build Coastguard Worker
3240*61046927SAndroid Build Coastguard Worker const char *
tu_debug_bos_add(struct tu_device * dev,uint64_t size,const char * name)3241*61046927SAndroid Build Coastguard Worker tu_debug_bos_add(struct tu_device *dev, uint64_t size, const char *name)
3242*61046927SAndroid Build Coastguard Worker {
3243*61046927SAndroid Build Coastguard Worker assert(name);
3244*61046927SAndroid Build Coastguard Worker
3245*61046927SAndroid Build Coastguard Worker if (likely(!dev->bo_sizes))
3246*61046927SAndroid Build Coastguard Worker return NULL;
3247*61046927SAndroid Build Coastguard Worker
3248*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->bo_mutex);
3249*61046927SAndroid Build Coastguard Worker struct hash_entry *entry = _mesa_hash_table_search(dev->bo_sizes, name);
3250*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *debug_bos;
3251*61046927SAndroid Build Coastguard Worker
3252*61046927SAndroid Build Coastguard Worker if (!entry) {
3253*61046927SAndroid Build Coastguard Worker debug_bos = (struct tu_debug_bos_entry *) calloc(
3254*61046927SAndroid Build Coastguard Worker 1, sizeof(struct tu_debug_bos_entry));
3255*61046927SAndroid Build Coastguard Worker debug_bos->name = strdup(name);
3256*61046927SAndroid Build Coastguard Worker _mesa_hash_table_insert(dev->bo_sizes, debug_bos->name, debug_bos);
3257*61046927SAndroid Build Coastguard Worker } else {
3258*61046927SAndroid Build Coastguard Worker debug_bos = (struct tu_debug_bos_entry *) entry->data;
3259*61046927SAndroid Build Coastguard Worker }
3260*61046927SAndroid Build Coastguard Worker
3261*61046927SAndroid Build Coastguard Worker debug_bos->count++;
3262*61046927SAndroid Build Coastguard Worker debug_bos->size += align(size, 4096);
3263*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->bo_mutex);
3264*61046927SAndroid Build Coastguard Worker
3265*61046927SAndroid Build Coastguard Worker return debug_bos->name;
3266*61046927SAndroid Build Coastguard Worker }
3267*61046927SAndroid Build Coastguard Worker
3268*61046927SAndroid Build Coastguard Worker void
tu_debug_bos_del(struct tu_device * dev,struct tu_bo * bo)3269*61046927SAndroid Build Coastguard Worker tu_debug_bos_del(struct tu_device *dev, struct tu_bo *bo)
3270*61046927SAndroid Build Coastguard Worker {
3271*61046927SAndroid Build Coastguard Worker if (likely(!dev->bo_sizes) || !bo->name)
3272*61046927SAndroid Build Coastguard Worker return;
3273*61046927SAndroid Build Coastguard Worker
3274*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->bo_mutex);
3275*61046927SAndroid Build Coastguard Worker struct hash_entry *entry =
3276*61046927SAndroid Build Coastguard Worker _mesa_hash_table_search(dev->bo_sizes, bo->name);
3277*61046927SAndroid Build Coastguard Worker /* If we're finishing the BO, it should have been added already */
3278*61046927SAndroid Build Coastguard Worker assert(entry);
3279*61046927SAndroid Build Coastguard Worker
3280*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *debug_bos =
3281*61046927SAndroid Build Coastguard Worker (struct tu_debug_bos_entry *) entry->data;
3282*61046927SAndroid Build Coastguard Worker debug_bos->count--;
3283*61046927SAndroid Build Coastguard Worker debug_bos->size -= align(bo->size, 4096);
3284*61046927SAndroid Build Coastguard Worker if (!debug_bos->count) {
3285*61046927SAndroid Build Coastguard Worker _mesa_hash_table_remove(dev->bo_sizes, entry);
3286*61046927SAndroid Build Coastguard Worker free((void *) debug_bos->name);
3287*61046927SAndroid Build Coastguard Worker free(debug_bos);
3288*61046927SAndroid Build Coastguard Worker }
3289*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->bo_mutex);
3290*61046927SAndroid Build Coastguard Worker }
3291*61046927SAndroid Build Coastguard Worker
debug_bos_count_compare(const void * in_a,const void * in_b)3292*61046927SAndroid Build Coastguard Worker static int debug_bos_count_compare(const void *in_a, const void *in_b)
3293*61046927SAndroid Build Coastguard Worker {
3294*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *a = *(struct tu_debug_bos_entry **)in_a;
3295*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *b = *(struct tu_debug_bos_entry **)in_b;
3296*61046927SAndroid Build Coastguard Worker return a->count - b->count;
3297*61046927SAndroid Build Coastguard Worker }
3298*61046927SAndroid Build Coastguard Worker
3299*61046927SAndroid Build Coastguard Worker void
tu_debug_bos_print_stats(struct tu_device * dev)3300*61046927SAndroid Build Coastguard Worker tu_debug_bos_print_stats(struct tu_device *dev)
3301*61046927SAndroid Build Coastguard Worker {
3302*61046927SAndroid Build Coastguard Worker if (likely(!dev->bo_sizes))
3303*61046927SAndroid Build Coastguard Worker return;
3304*61046927SAndroid Build Coastguard Worker
3305*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->bo_mutex);
3306*61046927SAndroid Build Coastguard Worker
3307*61046927SAndroid Build Coastguard Worker /* Put the HT's sizes data in an array so we can sort by number of allocations. */
3308*61046927SAndroid Build Coastguard Worker struct util_dynarray dyn;
3309*61046927SAndroid Build Coastguard Worker util_dynarray_init(&dyn, NULL);
3310*61046927SAndroid Build Coastguard Worker
3311*61046927SAndroid Build Coastguard Worker uint32_t size = 0;
3312*61046927SAndroid Build Coastguard Worker uint32_t count = 0;
3313*61046927SAndroid Build Coastguard Worker hash_table_foreach(dev->bo_sizes, entry)
3314*61046927SAndroid Build Coastguard Worker {
3315*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *debug_bos =
3316*61046927SAndroid Build Coastguard Worker (struct tu_debug_bos_entry *) entry->data;
3317*61046927SAndroid Build Coastguard Worker util_dynarray_append(&dyn, struct tu_debug_bos_entry *, debug_bos);
3318*61046927SAndroid Build Coastguard Worker size += debug_bos->size / 1024;
3319*61046927SAndroid Build Coastguard Worker count += debug_bos->count;
3320*61046927SAndroid Build Coastguard Worker }
3321*61046927SAndroid Build Coastguard Worker
3322*61046927SAndroid Build Coastguard Worker qsort(dyn.data,
3323*61046927SAndroid Build Coastguard Worker util_dynarray_num_elements(&dyn, struct tu_debug_bos_entry *),
3324*61046927SAndroid Build Coastguard Worker sizeof(struct tu_debug_bos_entryos_entry *), debug_bos_count_compare);
3325*61046927SAndroid Build Coastguard Worker
3326*61046927SAndroid Build Coastguard Worker util_dynarray_foreach(&dyn, struct tu_debug_bos_entry *, entryp)
3327*61046927SAndroid Build Coastguard Worker {
3328*61046927SAndroid Build Coastguard Worker struct tu_debug_bos_entry *debug_bos = *entryp;
3329*61046927SAndroid Build Coastguard Worker mesa_logi("%30s: %4d bos, %lld kb\n", debug_bos->name, debug_bos->count,
3330*61046927SAndroid Build Coastguard Worker (long long) (debug_bos->size / 1024));
3331*61046927SAndroid Build Coastguard Worker }
3332*61046927SAndroid Build Coastguard Worker
3333*61046927SAndroid Build Coastguard Worker mesa_logi("submitted %d bos (%d MB)\n", count, DIV_ROUND_UP(size, 1024));
3334*61046927SAndroid Build Coastguard Worker
3335*61046927SAndroid Build Coastguard Worker util_dynarray_fini(&dyn);
3336*61046927SAndroid Build Coastguard Worker
3337*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->bo_mutex);
3338*61046927SAndroid Build Coastguard Worker }
3339*61046927SAndroid Build Coastguard Worker
3340*61046927SAndroid Build Coastguard Worker void
tu_CmdBeginDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer,const VkDebugUtilsLabelEXT * pLabelInfo)3341*61046927SAndroid Build Coastguard Worker tu_CmdBeginDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer,
3342*61046927SAndroid Build Coastguard Worker const VkDebugUtilsLabelEXT *pLabelInfo)
3343*61046927SAndroid Build Coastguard Worker {
3344*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, _commandBuffer);
3345*61046927SAndroid Build Coastguard Worker
3346*61046927SAndroid Build Coastguard Worker vk_common_CmdBeginDebugUtilsLabelEXT(_commandBuffer, pLabelInfo);
3347*61046927SAndroid Build Coastguard Worker
3348*61046927SAndroid Build Coastguard Worker /* Note that the spec says:
3349*61046927SAndroid Build Coastguard Worker *
3350*61046927SAndroid Build Coastguard Worker * "An application may open a debug label region in one command buffer and
3351*61046927SAndroid Build Coastguard Worker * close it in another, or otherwise split debug label regions across
3352*61046927SAndroid Build Coastguard Worker * multiple command buffers or multiple queue submissions. When viewed
3353*61046927SAndroid Build Coastguard Worker * from the linear series of submissions to a single queue, the calls to
3354*61046927SAndroid Build Coastguard Worker * vkCmdBeginDebugUtilsLabelEXT and vkCmdEndDebugUtilsLabelEXT must be
3355*61046927SAndroid Build Coastguard Worker * matched and balanced."
3356*61046927SAndroid Build Coastguard Worker *
3357*61046927SAndroid Build Coastguard Worker * But if you're beginning labeling during a renderpass and ending outside
3358*61046927SAndroid Build Coastguard Worker * it, or vice versa, these trace ranges in perfetto will be unbalanced. I
3359*61046927SAndroid Build Coastguard Worker * expect that u_trace and perfetto will do something like take just one of
3360*61046927SAndroid Build Coastguard Worker * the begins/ends, or drop the event entirely, but not crash. Similarly,
3361*61046927SAndroid Build Coastguard Worker * I think we'll have problems if the tracepoints are split across cmd
3362*61046927SAndroid Build Coastguard Worker * buffers. Still, getting the simple case of cmd buffer annotation into
3363*61046927SAndroid Build Coastguard Worker * perfetto should prove useful.
3364*61046927SAndroid Build Coastguard Worker */
3365*61046927SAndroid Build Coastguard Worker const char *label = pLabelInfo->pLabelName;
3366*61046927SAndroid Build Coastguard Worker if (cmd_buffer->state.pass) {
3367*61046927SAndroid Build Coastguard Worker trace_start_cmd_buffer_annotation_rp(
3368*61046927SAndroid Build Coastguard Worker &cmd_buffer->trace, &cmd_buffer->draw_cs, strlen(label), label);
3369*61046927SAndroid Build Coastguard Worker } else {
3370*61046927SAndroid Build Coastguard Worker trace_start_cmd_buffer_annotation(&cmd_buffer->trace, &cmd_buffer->cs,
3371*61046927SAndroid Build Coastguard Worker strlen(label), label);
3372*61046927SAndroid Build Coastguard Worker }
3373*61046927SAndroid Build Coastguard Worker }
3374*61046927SAndroid Build Coastguard Worker
3375*61046927SAndroid Build Coastguard Worker void
tu_CmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer)3376*61046927SAndroid Build Coastguard Worker tu_CmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer)
3377*61046927SAndroid Build Coastguard Worker {
3378*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, _commandBuffer);
3379*61046927SAndroid Build Coastguard Worker
3380*61046927SAndroid Build Coastguard Worker if (cmd_buffer->vk.labels.size > 0) {
3381*61046927SAndroid Build Coastguard Worker if (cmd_buffer->state.pass) {
3382*61046927SAndroid Build Coastguard Worker trace_end_cmd_buffer_annotation_rp(&cmd_buffer->trace,
3383*61046927SAndroid Build Coastguard Worker &cmd_buffer->draw_cs);
3384*61046927SAndroid Build Coastguard Worker } else {
3385*61046927SAndroid Build Coastguard Worker trace_end_cmd_buffer_annotation(&cmd_buffer->trace, &cmd_buffer->cs);
3386*61046927SAndroid Build Coastguard Worker }
3387*61046927SAndroid Build Coastguard Worker }
3388*61046927SAndroid Build Coastguard Worker
3389*61046927SAndroid Build Coastguard Worker vk_common_CmdEndDebugUtilsLabelEXT(_commandBuffer);
3390*61046927SAndroid Build Coastguard Worker }
3391