xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_device.cc (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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