1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker */
5*bbecb9d1SAndroid Build Coastguard Worker
6*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_common.h"
7*bbecb9d1SAndroid Build Coastguard Worker
8*bbecb9d1SAndroid Build Coastguard Worker #include <stdarg.h>
9*bbecb9d1SAndroid Build Coastguard Worker #include <stdio.h>
10*bbecb9d1SAndroid Build Coastguard Worker
11*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_info.h"
12*bbecb9d1SAndroid Build Coastguard Worker
13*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_context.h"
14*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_cs.h"
15*bbecb9d1SAndroid Build Coastguard Worker
16*bbecb9d1SAndroid Build Coastguard Worker static const struct vn_info_extension_table vkr_extension_table = {
17*bbecb9d1SAndroid Build Coastguard Worker /* Venus extensions */
18*bbecb9d1SAndroid Build Coastguard Worker .EXT_command_serialization = true,
19*bbecb9d1SAndroid Build Coastguard Worker .MESA_venus_protocol = true,
20*bbecb9d1SAndroid Build Coastguard Worker /* promoted to VK_VERSION_1_1 */
21*bbecb9d1SAndroid Build Coastguard Worker .KHR_16bit_storage = true,
22*bbecb9d1SAndroid Build Coastguard Worker .KHR_bind_memory2 = true,
23*bbecb9d1SAndroid Build Coastguard Worker .KHR_dedicated_allocation = true,
24*bbecb9d1SAndroid Build Coastguard Worker .KHR_descriptor_update_template = true,
25*bbecb9d1SAndroid Build Coastguard Worker .KHR_device_group = true,
26*bbecb9d1SAndroid Build Coastguard Worker .KHR_device_group_creation = true,
27*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_fence = true,
28*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_fence_capabilities = true,
29*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_memory = true,
30*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_memory_capabilities = true,
31*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_semaphore = true,
32*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_semaphore_capabilities = true,
33*bbecb9d1SAndroid Build Coastguard Worker .KHR_get_memory_requirements2 = true,
34*bbecb9d1SAndroid Build Coastguard Worker .KHR_get_physical_device_properties2 = true,
35*bbecb9d1SAndroid Build Coastguard Worker .KHR_maintenance1 = true,
36*bbecb9d1SAndroid Build Coastguard Worker .KHR_maintenance2 = true,
37*bbecb9d1SAndroid Build Coastguard Worker .KHR_maintenance3 = true,
38*bbecb9d1SAndroid Build Coastguard Worker .KHR_multiview = true,
39*bbecb9d1SAndroid Build Coastguard Worker .KHR_relaxed_block_layout = true,
40*bbecb9d1SAndroid Build Coastguard Worker .KHR_sampler_ycbcr_conversion = true,
41*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_draw_parameters = true,
42*bbecb9d1SAndroid Build Coastguard Worker .KHR_storage_buffer_storage_class = true,
43*bbecb9d1SAndroid Build Coastguard Worker .KHR_variable_pointers = true,
44*bbecb9d1SAndroid Build Coastguard Worker /* promoted to VK_VERSION_1_2 */
45*bbecb9d1SAndroid Build Coastguard Worker .KHR_8bit_storage = true,
46*bbecb9d1SAndroid Build Coastguard Worker .KHR_buffer_device_address = true,
47*bbecb9d1SAndroid Build Coastguard Worker .KHR_create_renderpass2 = true,
48*bbecb9d1SAndroid Build Coastguard Worker .KHR_depth_stencil_resolve = true,
49*bbecb9d1SAndroid Build Coastguard Worker .KHR_draw_indirect_count = true,
50*bbecb9d1SAndroid Build Coastguard Worker .KHR_driver_properties = true,
51*bbecb9d1SAndroid Build Coastguard Worker .KHR_image_format_list = true,
52*bbecb9d1SAndroid Build Coastguard Worker .KHR_imageless_framebuffer = true,
53*bbecb9d1SAndroid Build Coastguard Worker .KHR_sampler_mirror_clamp_to_edge = true,
54*bbecb9d1SAndroid Build Coastguard Worker .KHR_separate_depth_stencil_layouts = true,
55*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_atomic_int64 = true,
56*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_float16_int8 = true,
57*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_float_controls = true,
58*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_subgroup_extended_types = true,
59*bbecb9d1SAndroid Build Coastguard Worker .KHR_spirv_1_4 = true,
60*bbecb9d1SAndroid Build Coastguard Worker .KHR_timeline_semaphore = true,
61*bbecb9d1SAndroid Build Coastguard Worker .KHR_uniform_buffer_standard_layout = true,
62*bbecb9d1SAndroid Build Coastguard Worker .KHR_vulkan_memory_model = true,
63*bbecb9d1SAndroid Build Coastguard Worker .EXT_descriptor_indexing = true,
64*bbecb9d1SAndroid Build Coastguard Worker .EXT_host_query_reset = true,
65*bbecb9d1SAndroid Build Coastguard Worker .EXT_sampler_filter_minmax = true,
66*bbecb9d1SAndroid Build Coastguard Worker .EXT_scalar_block_layout = true,
67*bbecb9d1SAndroid Build Coastguard Worker .EXT_separate_stencil_usage = true,
68*bbecb9d1SAndroid Build Coastguard Worker .EXT_shader_viewport_index_layer = true,
69*bbecb9d1SAndroid Build Coastguard Worker /* promoted to VK_VERSION_1_3 */
70*bbecb9d1SAndroid Build Coastguard Worker .KHR_copy_commands2 = true,
71*bbecb9d1SAndroid Build Coastguard Worker .KHR_dynamic_rendering = true,
72*bbecb9d1SAndroid Build Coastguard Worker .KHR_format_feature_flags2 = false,
73*bbecb9d1SAndroid Build Coastguard Worker .KHR_maintenance4 = true,
74*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_integer_dot_product = true,
75*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_non_semantic_info = true,
76*bbecb9d1SAndroid Build Coastguard Worker .KHR_shader_terminate_invocation = true,
77*bbecb9d1SAndroid Build Coastguard Worker .KHR_synchronization2 = true,
78*bbecb9d1SAndroid Build Coastguard Worker .KHR_zero_initialize_workgroup_memory = true,
79*bbecb9d1SAndroid Build Coastguard Worker .EXT_4444_formats = true,
80*bbecb9d1SAndroid Build Coastguard Worker .EXT_extended_dynamic_state = true,
81*bbecb9d1SAndroid Build Coastguard Worker .EXT_extended_dynamic_state2 = true,
82*bbecb9d1SAndroid Build Coastguard Worker .EXT_image_robustness = true,
83*bbecb9d1SAndroid Build Coastguard Worker .EXT_inline_uniform_block = true,
84*bbecb9d1SAndroid Build Coastguard Worker .EXT_pipeline_creation_cache_control = true,
85*bbecb9d1SAndroid Build Coastguard Worker .EXT_pipeline_creation_feedback = true,
86*bbecb9d1SAndroid Build Coastguard Worker /* TODO(VK_EXT_private_data): Support natively in the guest */
87*bbecb9d1SAndroid Build Coastguard Worker .EXT_private_data = true,
88*bbecb9d1SAndroid Build Coastguard Worker .EXT_shader_demote_to_helper_invocation = true,
89*bbecb9d1SAndroid Build Coastguard Worker .EXT_subgroup_size_control = true,
90*bbecb9d1SAndroid Build Coastguard Worker .EXT_texel_buffer_alignment = true,
91*bbecb9d1SAndroid Build Coastguard Worker .EXT_texture_compression_astc_hdr = true,
92*bbecb9d1SAndroid Build Coastguard Worker .EXT_tooling_info = false, /* implementation in driver */
93*bbecb9d1SAndroid Build Coastguard Worker .EXT_ycbcr_2plane_444_formats = true,
94*bbecb9d1SAndroid Build Coastguard Worker /* KHR extensions */
95*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_fence_fd = true,
96*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_memory_fd = true,
97*bbecb9d1SAndroid Build Coastguard Worker .KHR_external_semaphore_fd = true,
98*bbecb9d1SAndroid Build Coastguard Worker .KHR_push_descriptor = true,
99*bbecb9d1SAndroid Build Coastguard Worker /* EXT extensions */
100*bbecb9d1SAndroid Build Coastguard Worker .EXT_calibrated_timestamps = true,
101*bbecb9d1SAndroid Build Coastguard Worker .EXT_conservative_rasterization = true,
102*bbecb9d1SAndroid Build Coastguard Worker .EXT_conditional_rendering = true,
103*bbecb9d1SAndroid Build Coastguard Worker .EXT_custom_border_color = true,
104*bbecb9d1SAndroid Build Coastguard Worker .EXT_depth_clip_control = true,
105*bbecb9d1SAndroid Build Coastguard Worker .EXT_depth_clip_enable = true,
106*bbecb9d1SAndroid Build Coastguard Worker .EXT_external_memory_dma_buf = true,
107*bbecb9d1SAndroid Build Coastguard Worker .EXT_image_drm_format_modifier = true,
108*bbecb9d1SAndroid Build Coastguard Worker .EXT_image_view_min_lod = true,
109*bbecb9d1SAndroid Build Coastguard Worker .EXT_index_type_uint8 = true,
110*bbecb9d1SAndroid Build Coastguard Worker .EXT_line_rasterization = true,
111*bbecb9d1SAndroid Build Coastguard Worker .EXT_multi_draw = true,
112*bbecb9d1SAndroid Build Coastguard Worker .EXT_mutable_descriptor_type = true,
113*bbecb9d1SAndroid Build Coastguard Worker .EXT_pci_bus_info = true,
114*bbecb9d1SAndroid Build Coastguard Worker .EXT_primitive_topology_list_restart = true,
115*bbecb9d1SAndroid Build Coastguard Worker .EXT_primitives_generated_query = true,
116*bbecb9d1SAndroid Build Coastguard Worker .EXT_provoking_vertex = true,
117*bbecb9d1SAndroid Build Coastguard Worker .EXT_queue_family_foreign = true,
118*bbecb9d1SAndroid Build Coastguard Worker .EXT_robustness2 = true,
119*bbecb9d1SAndroid Build Coastguard Worker .EXT_shader_stencil_export = true,
120*bbecb9d1SAndroid Build Coastguard Worker .EXT_transform_feedback = true,
121*bbecb9d1SAndroid Build Coastguard Worker .EXT_vertex_attribute_divisor = true,
122*bbecb9d1SAndroid Build Coastguard Worker /* vendor extensions */
123*bbecb9d1SAndroid Build Coastguard Worker .VALVE_mutable_descriptor_type = true,
124*bbecb9d1SAndroid Build Coastguard Worker };
125*bbecb9d1SAndroid Build Coastguard Worker
126*bbecb9d1SAndroid Build Coastguard Worker void
vkr_log(const char * fmt,...)127*bbecb9d1SAndroid Build Coastguard Worker vkr_log(const char *fmt, ...)
128*bbecb9d1SAndroid Build Coastguard Worker {
129*bbecb9d1SAndroid Build Coastguard Worker const char prefix[] = "vkr: ";
130*bbecb9d1SAndroid Build Coastguard Worker char line[1024];
131*bbecb9d1SAndroid Build Coastguard Worker size_t len;
132*bbecb9d1SAndroid Build Coastguard Worker va_list va;
133*bbecb9d1SAndroid Build Coastguard Worker int ret;
134*bbecb9d1SAndroid Build Coastguard Worker
135*bbecb9d1SAndroid Build Coastguard Worker len = ARRAY_SIZE(prefix) - 1;
136*bbecb9d1SAndroid Build Coastguard Worker memcpy(line, prefix, len);
137*bbecb9d1SAndroid Build Coastguard Worker
138*bbecb9d1SAndroid Build Coastguard Worker va_start(va, fmt);
139*bbecb9d1SAndroid Build Coastguard Worker ret = vsnprintf(line + len, ARRAY_SIZE(line) - len, fmt, va);
140*bbecb9d1SAndroid Build Coastguard Worker va_end(va);
141*bbecb9d1SAndroid Build Coastguard Worker
142*bbecb9d1SAndroid Build Coastguard Worker if (ret < 0) {
143*bbecb9d1SAndroid Build Coastguard Worker const char log_error[] = "log error";
144*bbecb9d1SAndroid Build Coastguard Worker memcpy(line + len, log_error, ARRAY_SIZE(log_error) - 1);
145*bbecb9d1SAndroid Build Coastguard Worker len += ARRAY_SIZE(log_error) - 1;
146*bbecb9d1SAndroid Build Coastguard Worker } else if ((size_t)ret < ARRAY_SIZE(line) - len) {
147*bbecb9d1SAndroid Build Coastguard Worker len += ret;
148*bbecb9d1SAndroid Build Coastguard Worker } else {
149*bbecb9d1SAndroid Build Coastguard Worker len = ARRAY_SIZE(line) - 1;
150*bbecb9d1SAndroid Build Coastguard Worker }
151*bbecb9d1SAndroid Build Coastguard Worker
152*bbecb9d1SAndroid Build Coastguard Worker /* make room for newline */
153*bbecb9d1SAndroid Build Coastguard Worker if (len + 1 >= ARRAY_SIZE(line))
154*bbecb9d1SAndroid Build Coastguard Worker len--;
155*bbecb9d1SAndroid Build Coastguard Worker
156*bbecb9d1SAndroid Build Coastguard Worker line[len++] = '\n';
157*bbecb9d1SAndroid Build Coastguard Worker line[len] = '\0';
158*bbecb9d1SAndroid Build Coastguard Worker
159*bbecb9d1SAndroid Build Coastguard Worker virgl_log("%s", line);
160*bbecb9d1SAndroid Build Coastguard Worker }
161*bbecb9d1SAndroid Build Coastguard Worker
162*bbecb9d1SAndroid Build Coastguard Worker void
vkr_extension_table_init(struct vn_info_extension_table * table,const char * const * exts,uint32_t count)163*bbecb9d1SAndroid Build Coastguard Worker vkr_extension_table_init(struct vn_info_extension_table *table,
164*bbecb9d1SAndroid Build Coastguard Worker const char *const *exts,
165*bbecb9d1SAndroid Build Coastguard Worker uint32_t count)
166*bbecb9d1SAndroid Build Coastguard Worker {
167*bbecb9d1SAndroid Build Coastguard Worker memset(table, 0, sizeof(*table));
168*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; i++) {
169*bbecb9d1SAndroid Build Coastguard Worker const int32_t index = vn_info_extension_index(exts[i]);
170*bbecb9d1SAndroid Build Coastguard Worker if (index >= 0)
171*bbecb9d1SAndroid Build Coastguard Worker table->enabled[index] = true;
172*bbecb9d1SAndroid Build Coastguard Worker }
173*bbecb9d1SAndroid Build Coastguard Worker }
174*bbecb9d1SAndroid Build Coastguard Worker
175*bbecb9d1SAndroid Build Coastguard Worker uint32_t
vkr_extension_get_spec_version(const char * name)176*bbecb9d1SAndroid Build Coastguard Worker vkr_extension_get_spec_version(const char *name)
177*bbecb9d1SAndroid Build Coastguard Worker {
178*bbecb9d1SAndroid Build Coastguard Worker const int32_t index = vn_info_extension_index(name);
179*bbecb9d1SAndroid Build Coastguard Worker if (index < 0 || !vkr_extension_table.enabled[index])
180*bbecb9d1SAndroid Build Coastguard Worker return 0;
181*bbecb9d1SAndroid Build Coastguard Worker
182*bbecb9d1SAndroid Build Coastguard Worker const struct vn_info_extension *ext = vn_info_extension_get(index);
183*bbecb9d1SAndroid Build Coastguard Worker return ext->spec_version;
184*bbecb9d1SAndroid Build Coastguard Worker }
185*bbecb9d1SAndroid Build Coastguard Worker
186*bbecb9d1SAndroid Build Coastguard Worker void
object_array_fini(struct object_array * arr)187*bbecb9d1SAndroid Build Coastguard Worker object_array_fini(struct object_array *arr)
188*bbecb9d1SAndroid Build Coastguard Worker {
189*bbecb9d1SAndroid Build Coastguard Worker if (!arr->objects_stolen) {
190*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < arr->count; i++)
191*bbecb9d1SAndroid Build Coastguard Worker free(arr->objects[i]);
192*bbecb9d1SAndroid Build Coastguard Worker }
193*bbecb9d1SAndroid Build Coastguard Worker
194*bbecb9d1SAndroid Build Coastguard Worker free(arr->objects);
195*bbecb9d1SAndroid Build Coastguard Worker free(arr->handle_storage);
196*bbecb9d1SAndroid Build Coastguard Worker }
197*bbecb9d1SAndroid Build Coastguard Worker
198*bbecb9d1SAndroid Build Coastguard Worker bool
object_array_init(struct vkr_context * ctx,struct object_array * arr,uint32_t count,VkObjectType obj_type,size_t obj_size,size_t handle_size,const void * obj_id_handles)199*bbecb9d1SAndroid Build Coastguard Worker object_array_init(struct vkr_context *ctx,
200*bbecb9d1SAndroid Build Coastguard Worker struct object_array *arr,
201*bbecb9d1SAndroid Build Coastguard Worker uint32_t count,
202*bbecb9d1SAndroid Build Coastguard Worker VkObjectType obj_type,
203*bbecb9d1SAndroid Build Coastguard Worker size_t obj_size,
204*bbecb9d1SAndroid Build Coastguard Worker size_t handle_size,
205*bbecb9d1SAndroid Build Coastguard Worker const void *obj_id_handles)
206*bbecb9d1SAndroid Build Coastguard Worker {
207*bbecb9d1SAndroid Build Coastguard Worker arr->count = count;
208*bbecb9d1SAndroid Build Coastguard Worker
209*bbecb9d1SAndroid Build Coastguard Worker arr->objects = malloc(sizeof(*arr->objects) * count);
210*bbecb9d1SAndroid Build Coastguard Worker if (!arr->objects)
211*bbecb9d1SAndroid Build Coastguard Worker return false;
212*bbecb9d1SAndroid Build Coastguard Worker
213*bbecb9d1SAndroid Build Coastguard Worker arr->handle_storage = malloc(handle_size * count);
214*bbecb9d1SAndroid Build Coastguard Worker if (!arr->handle_storage) {
215*bbecb9d1SAndroid Build Coastguard Worker free(arr->objects);
216*bbecb9d1SAndroid Build Coastguard Worker return false;
217*bbecb9d1SAndroid Build Coastguard Worker }
218*bbecb9d1SAndroid Build Coastguard Worker
219*bbecb9d1SAndroid Build Coastguard Worker arr->objects_stolen = false;
220*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; i++) {
221*bbecb9d1SAndroid Build Coastguard Worker const void *obj_id_handle = (const char *)obj_id_handles + handle_size * i;
222*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object *obj =
223*bbecb9d1SAndroid Build Coastguard Worker vkr_context_alloc_object(ctx, obj_size, obj_type, obj_id_handle);
224*bbecb9d1SAndroid Build Coastguard Worker if (!obj) {
225*bbecb9d1SAndroid Build Coastguard Worker arr->count = i;
226*bbecb9d1SAndroid Build Coastguard Worker object_array_fini(arr);
227*bbecb9d1SAndroid Build Coastguard Worker return false;
228*bbecb9d1SAndroid Build Coastguard Worker }
229*bbecb9d1SAndroid Build Coastguard Worker
230*bbecb9d1SAndroid Build Coastguard Worker arr->objects[i] = obj;
231*bbecb9d1SAndroid Build Coastguard Worker }
232*bbecb9d1SAndroid Build Coastguard Worker
233*bbecb9d1SAndroid Build Coastguard Worker return true;
234*bbecb9d1SAndroid Build Coastguard Worker }
235