1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2019 Raspberry Pi Ltd
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include <assert.h>
25*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
26*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
27*61046927SAndroid Build Coastguard Worker #include <string.h>
28*61046927SAndroid Build Coastguard Worker #include <sys/mman.h>
29*61046927SAndroid Build Coastguard Worker #include <sys/sysinfo.h>
30*61046927SAndroid Build Coastguard Worker #include <unistd.h>
31*61046927SAndroid Build Coastguard Worker #include <xf86drm.h>
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #ifdef MAJOR_IN_MKDEV
34*61046927SAndroid Build Coastguard Worker #include <sys/mkdev.h>
35*61046927SAndroid Build Coastguard Worker #endif
36*61046927SAndroid Build Coastguard Worker #ifdef MAJOR_IN_SYSMACROS
37*61046927SAndroid Build Coastguard Worker #include <sys/sysmacros.h>
38*61046927SAndroid Build Coastguard Worker #endif
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker #include "v3dv_private.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #include "common/v3d_debug.h"
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker #include "compiler/v3d_compiler.h"
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker #include "drm-uapi/v3d_drm.h"
47*61046927SAndroid Build Coastguard Worker #include "vk_android.h"
48*61046927SAndroid Build Coastguard Worker #include "vk_drm_syncobj.h"
49*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
50*61046927SAndroid Build Coastguard Worker #include "git_sha1.h"
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker #include "util/build_id.h"
53*61046927SAndroid Build Coastguard Worker #include "util/os_file.h"
54*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
55*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
58*61046927SAndroid Build Coastguard Worker #include "vk_android.h"
59*61046927SAndroid Build Coastguard Worker #include <vndk/hardware_buffer.h>
60*61046927SAndroid Build Coastguard Worker #include "util/u_gralloc/u_gralloc.h"
61*61046927SAndroid Build Coastguard Worker #endif
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XCB_KHR
64*61046927SAndroid Build Coastguard Worker #include <xcb/xcb.h>
65*61046927SAndroid Build Coastguard Worker #include <xcb/dri3.h>
66*61046927SAndroid Build Coastguard Worker #include <X11/Xlib-xcb.h>
67*61046927SAndroid Build Coastguard Worker #endif
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WAYLAND_KHR
70*61046927SAndroid Build Coastguard Worker #include <wayland-client.h>
71*61046927SAndroid Build Coastguard Worker #include "wayland-drm-client-protocol.h"
72*61046927SAndroid Build Coastguard Worker #endif
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker #define V3DV_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION)
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker #ifdef ANDROID_STRICT
77*61046927SAndroid Build Coastguard Worker #if ANDROID_API_LEVEL <= 32
78*61046927SAndroid Build Coastguard Worker /* Android 12.1 and lower support only Vulkan API v1.1 */
79*61046927SAndroid Build Coastguard Worker #undef V3DV_API_VERSION
80*61046927SAndroid Build Coastguard Worker #define V3DV_API_VERSION VK_MAKE_VERSION(1, 1, VK_HEADER_VERSION)
81*61046927SAndroid Build Coastguard Worker #endif
82*61046927SAndroid Build Coastguard Worker #endif
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_EnumerateInstanceVersion(uint32_t * pApiVersion)85*61046927SAndroid Build Coastguard Worker v3dv_EnumerateInstanceVersion(uint32_t *pApiVersion)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker *pApiVersion = V3DV_API_VERSION;
88*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker #if defined(VK_USE_PLATFORM_WIN32_KHR) || \
92*61046927SAndroid Build Coastguard Worker defined(VK_USE_PLATFORM_WAYLAND_KHR) || \
93*61046927SAndroid Build Coastguard Worker defined(VK_USE_PLATFORM_XCB_KHR) || \
94*61046927SAndroid Build Coastguard Worker defined(VK_USE_PLATFORM_XLIB_KHR) || \
95*61046927SAndroid Build Coastguard Worker defined(VK_USE_PLATFORM_DISPLAY_KHR)
96*61046927SAndroid Build Coastguard Worker #define V3DV_USE_WSI_PLATFORM
97*61046927SAndroid Build Coastguard Worker #endif
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker static const struct vk_instance_extension_table instance_extensions = {
100*61046927SAndroid Build Coastguard Worker .KHR_device_group_creation = true,
101*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_DISPLAY_KHR
102*61046927SAndroid Build Coastguard Worker .KHR_display = true,
103*61046927SAndroid Build Coastguard Worker .KHR_get_display_properties2 = true,
104*61046927SAndroid Build Coastguard Worker .EXT_direct_mode_display = true,
105*61046927SAndroid Build Coastguard Worker .EXT_acquire_drm_display = true,
106*61046927SAndroid Build Coastguard Worker #endif
107*61046927SAndroid Build Coastguard Worker .KHR_external_fence_capabilities = true,
108*61046927SAndroid Build Coastguard Worker .KHR_external_memory_capabilities = true,
109*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_capabilities = true,
110*61046927SAndroid Build Coastguard Worker .KHR_get_physical_device_properties2 = true,
111*61046927SAndroid Build Coastguard Worker #ifdef V3DV_USE_WSI_PLATFORM
112*61046927SAndroid Build Coastguard Worker .KHR_get_surface_capabilities2 = true,
113*61046927SAndroid Build Coastguard Worker .KHR_surface = true,
114*61046927SAndroid Build Coastguard Worker .KHR_surface_protected_capabilities = true,
115*61046927SAndroid Build Coastguard Worker .EXT_surface_maintenance1 = true,
116*61046927SAndroid Build Coastguard Worker .EXT_swapchain_colorspace = true,
117*61046927SAndroid Build Coastguard Worker #endif
118*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WAYLAND_KHR
119*61046927SAndroid Build Coastguard Worker .KHR_wayland_surface = true,
120*61046927SAndroid Build Coastguard Worker #endif
121*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XCB_KHR
122*61046927SAndroid Build Coastguard Worker .KHR_xcb_surface = true,
123*61046927SAndroid Build Coastguard Worker #endif
124*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_KHR
125*61046927SAndroid Build Coastguard Worker .KHR_xlib_surface = true,
126*61046927SAndroid Build Coastguard Worker #endif
127*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
128*61046927SAndroid Build Coastguard Worker .EXT_acquire_xlib_display = true,
129*61046927SAndroid Build Coastguard Worker #endif
130*61046927SAndroid Build Coastguard Worker #ifndef VK_USE_PLATFORM_WIN32_KHR
131*61046927SAndroid Build Coastguard Worker .EXT_headless_surface = true,
132*61046927SAndroid Build Coastguard Worker #endif
133*61046927SAndroid Build Coastguard Worker .EXT_debug_report = true,
134*61046927SAndroid Build Coastguard Worker .EXT_debug_utils = true,
135*61046927SAndroid Build Coastguard Worker };
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker static void
get_device_extensions(const struct v3dv_physical_device * device,struct vk_device_extension_table * ext)138*61046927SAndroid Build Coastguard Worker get_device_extensions(const struct v3dv_physical_device *device,
139*61046927SAndroid Build Coastguard Worker struct vk_device_extension_table *ext)
140*61046927SAndroid Build Coastguard Worker {
141*61046927SAndroid Build Coastguard Worker *ext = (struct vk_device_extension_table) {
142*61046927SAndroid Build Coastguard Worker .KHR_8bit_storage = true,
143*61046927SAndroid Build Coastguard Worker .KHR_16bit_storage = true,
144*61046927SAndroid Build Coastguard Worker .KHR_bind_memory2 = true,
145*61046927SAndroid Build Coastguard Worker .KHR_buffer_device_address = true,
146*61046927SAndroid Build Coastguard Worker .KHR_copy_commands2 = true,
147*61046927SAndroid Build Coastguard Worker .KHR_create_renderpass2 = true,
148*61046927SAndroid Build Coastguard Worker .KHR_dedicated_allocation = true,
149*61046927SAndroid Build Coastguard Worker .KHR_device_group = true,
150*61046927SAndroid Build Coastguard Worker .KHR_driver_properties = true,
151*61046927SAndroid Build Coastguard Worker .KHR_descriptor_update_template = true,
152*61046927SAndroid Build Coastguard Worker .KHR_depth_stencil_resolve = true,
153*61046927SAndroid Build Coastguard Worker .KHR_dynamic_rendering = true,
154*61046927SAndroid Build Coastguard Worker .KHR_external_fence = true,
155*61046927SAndroid Build Coastguard Worker .KHR_external_fence_fd = true,
156*61046927SAndroid Build Coastguard Worker .KHR_external_memory = true,
157*61046927SAndroid Build Coastguard Worker .KHR_external_memory_fd = true,
158*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore = true,
159*61046927SAndroid Build Coastguard Worker .KHR_external_semaphore_fd = true,
160*61046927SAndroid Build Coastguard Worker .KHR_format_feature_flags2 = true,
161*61046927SAndroid Build Coastguard Worker .KHR_get_memory_requirements2 = true,
162*61046927SAndroid Build Coastguard Worker .KHR_image_format_list = true,
163*61046927SAndroid Build Coastguard Worker .KHR_imageless_framebuffer = true,
164*61046927SAndroid Build Coastguard Worker .KHR_index_type_uint8 = true,
165*61046927SAndroid Build Coastguard Worker .KHR_line_rasterization = true,
166*61046927SAndroid Build Coastguard Worker .KHR_load_store_op_none = true,
167*61046927SAndroid Build Coastguard Worker .KHR_performance_query = device->caps.perfmon,
168*61046927SAndroid Build Coastguard Worker .KHR_relaxed_block_layout = true,
169*61046927SAndroid Build Coastguard Worker .KHR_maintenance1 = true,
170*61046927SAndroid Build Coastguard Worker .KHR_maintenance2 = true,
171*61046927SAndroid Build Coastguard Worker .KHR_maintenance3 = true,
172*61046927SAndroid Build Coastguard Worker .KHR_maintenance4 = true,
173*61046927SAndroid Build Coastguard Worker .KHR_maintenance5 = true,
174*61046927SAndroid Build Coastguard Worker .KHR_multiview = true,
175*61046927SAndroid Build Coastguard Worker .KHR_pipeline_executable_properties = true,
176*61046927SAndroid Build Coastguard Worker .KHR_separate_depth_stencil_layouts = true,
177*61046927SAndroid Build Coastguard Worker .KHR_shader_expect_assume = true,
178*61046927SAndroid Build Coastguard Worker .KHR_shader_float_controls = true,
179*61046927SAndroid Build Coastguard Worker .KHR_shader_non_semantic_info = true,
180*61046927SAndroid Build Coastguard Worker .KHR_shader_relaxed_extended_instruction = true,
181*61046927SAndroid Build Coastguard Worker .KHR_sampler_mirror_clamp_to_edge = true,
182*61046927SAndroid Build Coastguard Worker .KHR_sampler_ycbcr_conversion = true,
183*61046927SAndroid Build Coastguard Worker .KHR_spirv_1_4 = true,
184*61046927SAndroid Build Coastguard Worker .KHR_storage_buffer_storage_class = true,
185*61046927SAndroid Build Coastguard Worker .KHR_timeline_semaphore = true,
186*61046927SAndroid Build Coastguard Worker .KHR_uniform_buffer_standard_layout = true,
187*61046927SAndroid Build Coastguard Worker .KHR_shader_integer_dot_product = true,
188*61046927SAndroid Build Coastguard Worker .KHR_shader_terminate_invocation = true,
189*61046927SAndroid Build Coastguard Worker .KHR_synchronization2 = true,
190*61046927SAndroid Build Coastguard Worker .KHR_workgroup_memory_explicit_layout = true,
191*61046927SAndroid Build Coastguard Worker #ifdef V3DV_USE_WSI_PLATFORM
192*61046927SAndroid Build Coastguard Worker .KHR_swapchain = true,
193*61046927SAndroid Build Coastguard Worker .KHR_swapchain_mutable_format = true,
194*61046927SAndroid Build Coastguard Worker .KHR_incremental_present = true,
195*61046927SAndroid Build Coastguard Worker #endif
196*61046927SAndroid Build Coastguard Worker .KHR_variable_pointers = true,
197*61046927SAndroid Build Coastguard Worker .KHR_vertex_attribute_divisor = true,
198*61046927SAndroid Build Coastguard Worker .KHR_vulkan_memory_model = true,
199*61046927SAndroid Build Coastguard Worker .KHR_zero_initialize_workgroup_memory = true,
200*61046927SAndroid Build Coastguard Worker .EXT_4444_formats = true,
201*61046927SAndroid Build Coastguard Worker .EXT_attachment_feedback_loop_layout = true,
202*61046927SAndroid Build Coastguard Worker .EXT_border_color_swizzle = true,
203*61046927SAndroid Build Coastguard Worker .EXT_color_write_enable = true,
204*61046927SAndroid Build Coastguard Worker .EXT_custom_border_color = true,
205*61046927SAndroid Build Coastguard Worker .EXT_depth_clamp_zero_one = device->devinfo.ver >= 71,
206*61046927SAndroid Build Coastguard Worker .EXT_depth_clip_control = true,
207*61046927SAndroid Build Coastguard Worker .EXT_depth_clip_enable = device->devinfo.ver >= 71,
208*61046927SAndroid Build Coastguard Worker .EXT_load_store_op_none = true,
209*61046927SAndroid Build Coastguard Worker .EXT_inline_uniform_block = true,
210*61046927SAndroid Build Coastguard Worker .EXT_extended_dynamic_state = true,
211*61046927SAndroid Build Coastguard Worker .EXT_extended_dynamic_state2 = true,
212*61046927SAndroid Build Coastguard Worker .EXT_external_memory_dma_buf = true,
213*61046927SAndroid Build Coastguard Worker .EXT_host_query_reset = true,
214*61046927SAndroid Build Coastguard Worker .EXT_image_drm_format_modifier = true,
215*61046927SAndroid Build Coastguard Worker .EXT_image_robustness = true,
216*61046927SAndroid Build Coastguard Worker .EXT_index_type_uint8 = true,
217*61046927SAndroid Build Coastguard Worker .EXT_line_rasterization = true,
218*61046927SAndroid Build Coastguard Worker .EXT_memory_budget = true,
219*61046927SAndroid Build Coastguard Worker .EXT_multi_draw = true,
220*61046927SAndroid Build Coastguard Worker .EXT_physical_device_drm = true,
221*61046927SAndroid Build Coastguard Worker .EXT_pipeline_creation_cache_control = true,
222*61046927SAndroid Build Coastguard Worker .EXT_pipeline_creation_feedback = true,
223*61046927SAndroid Build Coastguard Worker .EXT_pipeline_robustness = true,
224*61046927SAndroid Build Coastguard Worker .EXT_primitive_topology_list_restart = true,
225*61046927SAndroid Build Coastguard Worker .EXT_private_data = true,
226*61046927SAndroid Build Coastguard Worker .EXT_provoking_vertex = true,
227*61046927SAndroid Build Coastguard Worker .EXT_queue_family_foreign = true,
228*61046927SAndroid Build Coastguard Worker .EXT_separate_stencil_usage = true,
229*61046927SAndroid Build Coastguard Worker .EXT_shader_demote_to_helper_invocation = true,
230*61046927SAndroid Build Coastguard Worker .EXT_shader_module_identifier = true,
231*61046927SAndroid Build Coastguard Worker .EXT_subgroup_size_control = true,
232*61046927SAndroid Build Coastguard Worker #ifdef V3DV_USE_WSI_PLATFORM
233*61046927SAndroid Build Coastguard Worker .EXT_swapchain_maintenance1 = true,
234*61046927SAndroid Build Coastguard Worker #endif
235*61046927SAndroid Build Coastguard Worker .EXT_texel_buffer_alignment = true,
236*61046927SAndroid Build Coastguard Worker .EXT_tooling_info = true,
237*61046927SAndroid Build Coastguard Worker .EXT_vertex_attribute_divisor = true,
238*61046927SAndroid Build Coastguard Worker };
239*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
240*61046927SAndroid Build Coastguard Worker if (vk_android_get_ugralloc() != NULL) {
241*61046927SAndroid Build Coastguard Worker ext->ANDROID_external_memory_android_hardware_buffer = true;
242*61046927SAndroid Build Coastguard Worker ext->ANDROID_native_buffer = true;
243*61046927SAndroid Build Coastguard Worker }
244*61046927SAndroid Build Coastguard Worker #endif
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker static void
get_features(const struct v3dv_physical_device * physical_device,struct vk_features * features)248*61046927SAndroid Build Coastguard Worker get_features(const struct v3dv_physical_device *physical_device,
249*61046927SAndroid Build Coastguard Worker struct vk_features *features)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker *features = (struct vk_features) {
252*61046927SAndroid Build Coastguard Worker /* Vulkan 1.0 */
253*61046927SAndroid Build Coastguard Worker .robustBufferAccess = true, /* This feature is mandatory */
254*61046927SAndroid Build Coastguard Worker .fullDrawIndexUint32 = physical_device->devinfo.ver >= 71,
255*61046927SAndroid Build Coastguard Worker .imageCubeArray = true,
256*61046927SAndroid Build Coastguard Worker .independentBlend = true,
257*61046927SAndroid Build Coastguard Worker .geometryShader = true,
258*61046927SAndroid Build Coastguard Worker .tessellationShader = false,
259*61046927SAndroid Build Coastguard Worker .sampleRateShading = true,
260*61046927SAndroid Build Coastguard Worker .dualSrcBlend = false,
261*61046927SAndroid Build Coastguard Worker .logicOp = true,
262*61046927SAndroid Build Coastguard Worker .multiDrawIndirect = false,
263*61046927SAndroid Build Coastguard Worker .drawIndirectFirstInstance = true,
264*61046927SAndroid Build Coastguard Worker .depthClamp = physical_device->devinfo.ver >= 71,
265*61046927SAndroid Build Coastguard Worker .depthClampZeroOne = physical_device->devinfo.ver >= 71,
266*61046927SAndroid Build Coastguard Worker .depthBiasClamp = true,
267*61046927SAndroid Build Coastguard Worker .fillModeNonSolid = true,
268*61046927SAndroid Build Coastguard Worker .depthBounds = physical_device->devinfo.ver >= 71,
269*61046927SAndroid Build Coastguard Worker .wideLines = true,
270*61046927SAndroid Build Coastguard Worker .largePoints = true,
271*61046927SAndroid Build Coastguard Worker .alphaToOne = true,
272*61046927SAndroid Build Coastguard Worker .multiViewport = false,
273*61046927SAndroid Build Coastguard Worker .samplerAnisotropy = true,
274*61046927SAndroid Build Coastguard Worker .textureCompressionETC2 = true,
275*61046927SAndroid Build Coastguard Worker .textureCompressionASTC_LDR = true,
276*61046927SAndroid Build Coastguard Worker /* Note that textureCompressionBC requires that the driver support all
277*61046927SAndroid Build Coastguard Worker * the BC formats. V3D 4.2 only support the BC1-3, so we can't claim
278*61046927SAndroid Build Coastguard Worker * that we support it.
279*61046927SAndroid Build Coastguard Worker */
280*61046927SAndroid Build Coastguard Worker .textureCompressionBC = false,
281*61046927SAndroid Build Coastguard Worker .occlusionQueryPrecise = true,
282*61046927SAndroid Build Coastguard Worker .pipelineStatisticsQuery = false,
283*61046927SAndroid Build Coastguard Worker .vertexPipelineStoresAndAtomics = true,
284*61046927SAndroid Build Coastguard Worker .fragmentStoresAndAtomics = true,
285*61046927SAndroid Build Coastguard Worker .shaderTessellationAndGeometryPointSize = true,
286*61046927SAndroid Build Coastguard Worker .shaderImageGatherExtended = true,
287*61046927SAndroid Build Coastguard Worker .shaderStorageImageExtendedFormats = true,
288*61046927SAndroid Build Coastguard Worker .shaderStorageImageMultisample = false,
289*61046927SAndroid Build Coastguard Worker .shaderStorageImageReadWithoutFormat = true,
290*61046927SAndroid Build Coastguard Worker .shaderStorageImageWriteWithoutFormat = false,
291*61046927SAndroid Build Coastguard Worker .shaderUniformBufferArrayDynamicIndexing = false,
292*61046927SAndroid Build Coastguard Worker .shaderSampledImageArrayDynamicIndexing = false,
293*61046927SAndroid Build Coastguard Worker .shaderStorageBufferArrayDynamicIndexing = false,
294*61046927SAndroid Build Coastguard Worker .shaderStorageImageArrayDynamicIndexing = false,
295*61046927SAndroid Build Coastguard Worker .shaderClipDistance = true,
296*61046927SAndroid Build Coastguard Worker .shaderCullDistance = false,
297*61046927SAndroid Build Coastguard Worker .shaderFloat64 = false,
298*61046927SAndroid Build Coastguard Worker .shaderInt64 = false,
299*61046927SAndroid Build Coastguard Worker .shaderInt16 = false,
300*61046927SAndroid Build Coastguard Worker .shaderResourceResidency = false,
301*61046927SAndroid Build Coastguard Worker .shaderResourceMinLod = false,
302*61046927SAndroid Build Coastguard Worker .sparseBinding = false,
303*61046927SAndroid Build Coastguard Worker .sparseResidencyBuffer = false,
304*61046927SAndroid Build Coastguard Worker .sparseResidencyImage2D = false,
305*61046927SAndroid Build Coastguard Worker .sparseResidencyImage3D = false,
306*61046927SAndroid Build Coastguard Worker .sparseResidency2Samples = false,
307*61046927SAndroid Build Coastguard Worker .sparseResidency4Samples = false,
308*61046927SAndroid Build Coastguard Worker .sparseResidency8Samples = false,
309*61046927SAndroid Build Coastguard Worker .sparseResidency16Samples = false,
310*61046927SAndroid Build Coastguard Worker .sparseResidencyAliased = false,
311*61046927SAndroid Build Coastguard Worker .variableMultisampleRate = false,
312*61046927SAndroid Build Coastguard Worker .inheritedQueries = true,
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker /* Vulkan 1.1 */
315*61046927SAndroid Build Coastguard Worker .storageBuffer16BitAccess = true,
316*61046927SAndroid Build Coastguard Worker .uniformAndStorageBuffer16BitAccess = true,
317*61046927SAndroid Build Coastguard Worker .storagePushConstant16 = true,
318*61046927SAndroid Build Coastguard Worker .storageInputOutput16 = false,
319*61046927SAndroid Build Coastguard Worker .multiview = true,
320*61046927SAndroid Build Coastguard Worker .multiviewGeometryShader = false,
321*61046927SAndroid Build Coastguard Worker .multiviewTessellationShader = false,
322*61046927SAndroid Build Coastguard Worker .variablePointersStorageBuffer = true,
323*61046927SAndroid Build Coastguard Worker /* FIXME: this needs support for non-constant index on UBO/SSBO */
324*61046927SAndroid Build Coastguard Worker .variablePointers = false,
325*61046927SAndroid Build Coastguard Worker .protectedMemory = false,
326*61046927SAndroid Build Coastguard Worker .samplerYcbcrConversion = true,
327*61046927SAndroid Build Coastguard Worker .shaderDrawParameters = false,
328*61046927SAndroid Build Coastguard Worker
329*61046927SAndroid Build Coastguard Worker /* Vulkan 1.2 */
330*61046927SAndroid Build Coastguard Worker .hostQueryReset = true,
331*61046927SAndroid Build Coastguard Worker .uniformAndStorageBuffer8BitAccess = true,
332*61046927SAndroid Build Coastguard Worker .uniformBufferStandardLayout = true,
333*61046927SAndroid Build Coastguard Worker /* V3D 4.2 wraps TMU vector accesses to 16-byte boundaries, so loads and
334*61046927SAndroid Build Coastguard Worker * stores of vectors that cross these boundaries would not work correctly
335*61046927SAndroid Build Coastguard Worker * with scalarBlockLayout and would need to be split into smaller vectors
336*61046927SAndroid Build Coastguard Worker * (and/or scalars) that don't cross these boundaries. For load/stores
337*61046927SAndroid Build Coastguard Worker * with dynamic offsets where we can't identify if the offset is
338*61046927SAndroid Build Coastguard Worker * problematic, we would always have to scalarize. Overall, this would
339*61046927SAndroid Build Coastguard Worker * not lead to best performance so let's just not support it.
340*61046927SAndroid Build Coastguard Worker */
341*61046927SAndroid Build Coastguard Worker .scalarBlockLayout = physical_device->devinfo.ver >= 71,
342*61046927SAndroid Build Coastguard Worker /* This tells applications 2 things:
343*61046927SAndroid Build Coastguard Worker *
344*61046927SAndroid Build Coastguard Worker * 1. If they can select just one aspect for barriers. For us barriers
345*61046927SAndroid Build Coastguard Worker * decide if we need to split a job and we don't care if it is only
346*61046927SAndroid Build Coastguard Worker * for one of the aspects of the image or both, so we don't really
347*61046927SAndroid Build Coastguard Worker * benefit from seeing barriers that select just one aspect.
348*61046927SAndroid Build Coastguard Worker *
349*61046927SAndroid Build Coastguard Worker * 2. If they can program different layouts for each aspect. We
350*61046927SAndroid Build Coastguard Worker * generally don't care about layouts, so again, we don't get any
351*61046927SAndroid Build Coastguard Worker * benefits from this to limit the scope of image layout transitions.
352*61046927SAndroid Build Coastguard Worker *
353*61046927SAndroid Build Coastguard Worker * Still, Vulkan 1.2 requires this feature to be supported so we
354*61046927SAndroid Build Coastguard Worker * advertise it even though we don't really take advantage of it.
355*61046927SAndroid Build Coastguard Worker */
356*61046927SAndroid Build Coastguard Worker .separateDepthStencilLayouts = true,
357*61046927SAndroid Build Coastguard Worker .storageBuffer8BitAccess = true,
358*61046927SAndroid Build Coastguard Worker .storagePushConstant8 = true,
359*61046927SAndroid Build Coastguard Worker .imagelessFramebuffer = true,
360*61046927SAndroid Build Coastguard Worker .timelineSemaphore = true,
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker .samplerMirrorClampToEdge = true,
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker /* Extended subgroup types is mandatory by Vulkan 1.2, however, it is
365*61046927SAndroid Build Coastguard Worker * only in effect if the implementation supports non 32-bit types, which
366*61046927SAndroid Build Coastguard Worker * we don't, so in practice setting it to true doesn't have any
367*61046927SAndroid Build Coastguard Worker * implications for us.
368*61046927SAndroid Build Coastguard Worker */
369*61046927SAndroid Build Coastguard Worker .shaderSubgroupExtendedTypes = true,
370*61046927SAndroid Build Coastguard Worker .subgroupBroadcastDynamicId = true,
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker .vulkanMemoryModel = true,
373*61046927SAndroid Build Coastguard Worker .vulkanMemoryModelDeviceScope = true,
374*61046927SAndroid Build Coastguard Worker .vulkanMemoryModelAvailabilityVisibilityChains = true,
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker .bufferDeviceAddress = true,
377*61046927SAndroid Build Coastguard Worker .bufferDeviceAddressCaptureReplay = false,
378*61046927SAndroid Build Coastguard Worker .bufferDeviceAddressMultiDevice = false,
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker /* Vulkan 1.3 */
381*61046927SAndroid Build Coastguard Worker .inlineUniformBlock = true,
382*61046927SAndroid Build Coastguard Worker /* Inline buffers work like push constants, so after their are bound
383*61046927SAndroid Build Coastguard Worker * some of their contents may be copied into the uniform stream as soon
384*61046927SAndroid Build Coastguard Worker * as the next draw/dispatch is recorded in the command buffer. This means
385*61046927SAndroid Build Coastguard Worker * that if the client updates the buffer contents after binding it to
386*61046927SAndroid Build Coastguard Worker * a command buffer, the next queue submit of that command buffer may
387*61046927SAndroid Build Coastguard Worker * not use the latest update to the buffer contents, but the data that
388*61046927SAndroid Build Coastguard Worker * was present in the buffer at the time it was bound to the command
389*61046927SAndroid Build Coastguard Worker * buffer.
390*61046927SAndroid Build Coastguard Worker */
391*61046927SAndroid Build Coastguard Worker .descriptorBindingInlineUniformBlockUpdateAfterBind = false,
392*61046927SAndroid Build Coastguard Worker .pipelineCreationCacheControl = true,
393*61046927SAndroid Build Coastguard Worker .privateData = true,
394*61046927SAndroid Build Coastguard Worker .maintenance4 = true,
395*61046927SAndroid Build Coastguard Worker .shaderZeroInitializeWorkgroupMemory = true,
396*61046927SAndroid Build Coastguard Worker .synchronization2 = true,
397*61046927SAndroid Build Coastguard Worker .robustImageAccess = true,
398*61046927SAndroid Build Coastguard Worker .shaderIntegerDotProduct = true,
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker /* VK_EXT_4444_formats */
401*61046927SAndroid Build Coastguard Worker .formatA4R4G4B4 = true,
402*61046927SAndroid Build Coastguard Worker .formatA4B4G4R4 = true,
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker /* VK_EXT_custom_border_color */
405*61046927SAndroid Build Coastguard Worker .customBorderColors = true,
406*61046927SAndroid Build Coastguard Worker .customBorderColorWithoutFormat = false,
407*61046927SAndroid Build Coastguard Worker
408*61046927SAndroid Build Coastguard Worker /* VK_EXT_index_type_uint8 */
409*61046927SAndroid Build Coastguard Worker .indexTypeUint8 = true,
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker /* VK_EXT_line_rasterization */
412*61046927SAndroid Build Coastguard Worker .rectangularLines = true,
413*61046927SAndroid Build Coastguard Worker .bresenhamLines = true,
414*61046927SAndroid Build Coastguard Worker .smoothLines = true,
415*61046927SAndroid Build Coastguard Worker .stippledRectangularLines = false,
416*61046927SAndroid Build Coastguard Worker .stippledBresenhamLines = false,
417*61046927SAndroid Build Coastguard Worker .stippledSmoothLines = false,
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker /* VK_EXT_color_write_enable */
420*61046927SAndroid Build Coastguard Worker .colorWriteEnable = true,
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state */
423*61046927SAndroid Build Coastguard Worker .extendedDynamicState = true,
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker /* VK_EXT_extended_dynamic_state2 */
426*61046927SAndroid Build Coastguard Worker .extendedDynamicState2 = true,
427*61046927SAndroid Build Coastguard Worker /* We don't support extendedDynamicState2LogicOp as that would require
428*61046927SAndroid Build Coastguard Worker * compile shader variants after the pipeline creation.
429*61046927SAndroid Build Coastguard Worker */
430*61046927SAndroid Build Coastguard Worker .extendedDynamicState2LogicOp = false,
431*61046927SAndroid Build Coastguard Worker /* We don't support extendedDynamicState2PatchControlPoints as we don't
432*61046927SAndroid Build Coastguard Worker * support Tessellation Shaders
433*61046927SAndroid Build Coastguard Worker */
434*61046927SAndroid Build Coastguard Worker .extendedDynamicState2PatchControlPoints = false,
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker /* VK_KHR_pipeline_executable_properties */
437*61046927SAndroid Build Coastguard Worker .pipelineExecutableInfo = true,
438*61046927SAndroid Build Coastguard Worker
439*61046927SAndroid Build Coastguard Worker /* VK_EXT_provoking_vertex */
440*61046927SAndroid Build Coastguard Worker .provokingVertexLast = true,
441*61046927SAndroid Build Coastguard Worker /* FIXME: update when supporting EXT_transform_feedback */
442*61046927SAndroid Build Coastguard Worker .transformFeedbackPreservesProvokingVertex = false,
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker /* VK_EXT_vertex_attribute_divisor */
445*61046927SAndroid Build Coastguard Worker .vertexAttributeInstanceRateDivisor = true,
446*61046927SAndroid Build Coastguard Worker .vertexAttributeInstanceRateZeroDivisor = false,
447*61046927SAndroid Build Coastguard Worker
448*61046927SAndroid Build Coastguard Worker /* VK_KHR_performance_query */
449*61046927SAndroid Build Coastguard Worker .performanceCounterQueryPools = physical_device->caps.perfmon,
450*61046927SAndroid Build Coastguard Worker .performanceCounterMultipleQueryPools = false,
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker /* VK_EXT_texel_buffer_alignment */
453*61046927SAndroid Build Coastguard Worker .texelBufferAlignment = true,
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Worker /* VK_KHR_workgroup_memory_explicit_layout */
456*61046927SAndroid Build Coastguard Worker .workgroupMemoryExplicitLayout = true,
457*61046927SAndroid Build Coastguard Worker .workgroupMemoryExplicitLayoutScalarBlockLayout = false,
458*61046927SAndroid Build Coastguard Worker .workgroupMemoryExplicitLayout8BitAccess = true,
459*61046927SAndroid Build Coastguard Worker .workgroupMemoryExplicitLayout16BitAccess = true,
460*61046927SAndroid Build Coastguard Worker
461*61046927SAndroid Build Coastguard Worker /* VK_EXT_border_color_swizzle */
462*61046927SAndroid Build Coastguard Worker .borderColorSwizzle = true,
463*61046927SAndroid Build Coastguard Worker .borderColorSwizzleFromImage = true,
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker /* VK_EXT_shader_module_identifier */
466*61046927SAndroid Build Coastguard Worker .shaderModuleIdentifier = true,
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker /* VK_EXT_depth_clip_control */
469*61046927SAndroid Build Coastguard Worker .depthClipControl = true,
470*61046927SAndroid Build Coastguard Worker
471*61046927SAndroid Build Coastguard Worker /* VK_EXT_depth_clip_enable */
472*61046927SAndroid Build Coastguard Worker .depthClipEnable = physical_device->devinfo.ver >= 71,
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker /* VK_EXT_attachment_feedback_loop_layout */
475*61046927SAndroid Build Coastguard Worker .attachmentFeedbackLoopLayout = true,
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker /* VK_EXT_primitive_topology_list_restart */
478*61046927SAndroid Build Coastguard Worker .primitiveTopologyListRestart = true,
479*61046927SAndroid Build Coastguard Worker /* FIXME: we don't support tessellation shaders yet */
480*61046927SAndroid Build Coastguard Worker .primitiveTopologyPatchListRestart = false,
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker /* VK_EXT_pipeline_robustness */
483*61046927SAndroid Build Coastguard Worker .pipelineRobustness = true,
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker /* VK_EXT_multi_draw */
486*61046927SAndroid Build Coastguard Worker .multiDraw = true,
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_terminate_invocation */
489*61046927SAndroid Build Coastguard Worker .shaderTerminateInvocation = true,
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker /* VK_EXT_shader_demote_to_helper_invocation */
492*61046927SAndroid Build Coastguard Worker .shaderDemoteToHelperInvocation = true,
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker /* VK_EXT_subgroup_size_control */
495*61046927SAndroid Build Coastguard Worker .subgroupSizeControl = true,
496*61046927SAndroid Build Coastguard Worker .computeFullSubgroups = true,
497*61046927SAndroid Build Coastguard Worker
498*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_expect_assume */
499*61046927SAndroid Build Coastguard Worker .shaderExpectAssume = true,
500*61046927SAndroid Build Coastguard Worker
501*61046927SAndroid Build Coastguard Worker /* VK_KHR_dynamic_rendering */
502*61046927SAndroid Build Coastguard Worker .dynamicRendering = true,
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance5 */
505*61046927SAndroid Build Coastguard Worker .maintenance5 = true,
506*61046927SAndroid Build Coastguard Worker
507*61046927SAndroid Build Coastguard Worker #ifdef V3DV_USE_WSI_PLATFORM
508*61046927SAndroid Build Coastguard Worker /* VK_EXT_swapchain_maintenance1 */
509*61046927SAndroid Build Coastguard Worker .swapchainMaintenance1 = true,
510*61046927SAndroid Build Coastguard Worker #endif
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker /* VK_KHR_shader_relaxed_extended_instruction */
513*61046927SAndroid Build Coastguard Worker .shaderRelaxedExtendedInstruction = true,
514*61046927SAndroid Build Coastguard Worker };
515*61046927SAndroid Build Coastguard Worker }
516*61046927SAndroid Build Coastguard Worker
517*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_EnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)518*61046927SAndroid Build Coastguard Worker v3dv_EnumerateInstanceExtensionProperties(const char *pLayerName,
519*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
520*61046927SAndroid Build Coastguard Worker VkExtensionProperties *pProperties)
521*61046927SAndroid Build Coastguard Worker {
522*61046927SAndroid Build Coastguard Worker /* We don't support any layers */
523*61046927SAndroid Build Coastguard Worker if (pLayerName)
524*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
525*61046927SAndroid Build Coastguard Worker
526*61046927SAndroid Build Coastguard Worker return vk_enumerate_instance_extension_properties(
527*61046927SAndroid Build Coastguard Worker &instance_extensions, pPropertyCount, pProperties);
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker static VkResult enumerate_devices(struct vk_instance *vk_instance);
531*61046927SAndroid Build Coastguard Worker
532*61046927SAndroid Build Coastguard Worker static void destroy_physical_device(struct vk_physical_device *device);
533*61046927SAndroid Build Coastguard Worker
534*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_CreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)535*61046927SAndroid Build Coastguard Worker v3dv_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
536*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
537*61046927SAndroid Build Coastguard Worker VkInstance *pInstance)
538*61046927SAndroid Build Coastguard Worker {
539*61046927SAndroid Build Coastguard Worker struct v3dv_instance *instance;
540*61046927SAndroid Build Coastguard Worker VkResult result;
541*61046927SAndroid Build Coastguard Worker
542*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO);
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Worker if (pAllocator == NULL)
545*61046927SAndroid Build Coastguard Worker pAllocator = vk_default_allocator();
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker instance = vk_alloc(pAllocator, sizeof(*instance), 8,
548*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
549*61046927SAndroid Build Coastguard Worker if (!instance)
550*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY);
551*61046927SAndroid Build Coastguard Worker
552*61046927SAndroid Build Coastguard Worker struct vk_instance_dispatch_table dispatch_table;
553*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(
554*61046927SAndroid Build Coastguard Worker &dispatch_table, &v3dv_instance_entrypoints, true);
555*61046927SAndroid Build Coastguard Worker vk_instance_dispatch_table_from_entrypoints(
556*61046927SAndroid Build Coastguard Worker &dispatch_table, &wsi_instance_entrypoints, false);
557*61046927SAndroid Build Coastguard Worker
558*61046927SAndroid Build Coastguard Worker result = vk_instance_init(&instance->vk,
559*61046927SAndroid Build Coastguard Worker &instance_extensions,
560*61046927SAndroid Build Coastguard Worker &dispatch_table,
561*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator);
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
564*61046927SAndroid Build Coastguard Worker vk_free(pAllocator, instance);
565*61046927SAndroid Build Coastguard Worker return vk_error(NULL, result);
566*61046927SAndroid Build Coastguard Worker }
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker v3d_process_debug_variable();
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.enumerate = enumerate_devices;
571*61046927SAndroid Build Coastguard Worker instance->vk.physical_devices.destroy = destroy_physical_device;
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker /* We start with the default values for the pipeline_cache envvars.
574*61046927SAndroid Build Coastguard Worker *
575*61046927SAndroid Build Coastguard Worker * FIXME: with so many options now, perhaps we could use parse_debug_string
576*61046927SAndroid Build Coastguard Worker */
577*61046927SAndroid Build Coastguard Worker instance->pipeline_cache_enabled = true;
578*61046927SAndroid Build Coastguard Worker instance->default_pipeline_cache_enabled = true;
579*61046927SAndroid Build Coastguard Worker instance->meta_cache_enabled = true;
580*61046927SAndroid Build Coastguard Worker const char *pipeline_cache_str = getenv("V3DV_ENABLE_PIPELINE_CACHE");
581*61046927SAndroid Build Coastguard Worker if (pipeline_cache_str != NULL) {
582*61046927SAndroid Build Coastguard Worker if (strncmp(pipeline_cache_str, "full", 4) == 0) {
583*61046927SAndroid Build Coastguard Worker /* nothing to do, just to filter correct values */
584*61046927SAndroid Build Coastguard Worker } else if (strncmp(pipeline_cache_str, "no-default-cache", 16) == 0) {
585*61046927SAndroid Build Coastguard Worker instance->default_pipeline_cache_enabled = false;
586*61046927SAndroid Build Coastguard Worker } else if (strncmp(pipeline_cache_str, "no-meta-cache", 13) == 0) {
587*61046927SAndroid Build Coastguard Worker instance->meta_cache_enabled = false;
588*61046927SAndroid Build Coastguard Worker } else if (strncmp(pipeline_cache_str, "off", 3) == 0) {
589*61046927SAndroid Build Coastguard Worker instance->pipeline_cache_enabled = false;
590*61046927SAndroid Build Coastguard Worker instance->default_pipeline_cache_enabled = false;
591*61046927SAndroid Build Coastguard Worker instance->meta_cache_enabled = false;
592*61046927SAndroid Build Coastguard Worker } else {
593*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Wrong value for envvar V3DV_ENABLE_PIPELINE_CACHE. "
594*61046927SAndroid Build Coastguard Worker "Allowed values are: full, no-default-cache, no-meta-cache, off\n");
595*61046927SAndroid Build Coastguard Worker }
596*61046927SAndroid Build Coastguard Worker }
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker if (instance->pipeline_cache_enabled == false) {
599*61046927SAndroid Build Coastguard Worker fprintf(stderr, "WARNING: v3dv pipeline cache is disabled. Performance "
600*61046927SAndroid Build Coastguard Worker "can be affected negatively\n");
601*61046927SAndroid Build Coastguard Worker }
602*61046927SAndroid Build Coastguard Worker if (instance->default_pipeline_cache_enabled == false) {
603*61046927SAndroid Build Coastguard Worker fprintf(stderr, "WARNING: default v3dv pipeline cache is disabled. "
604*61046927SAndroid Build Coastguard Worker "Performance can be affected negatively\n");
605*61046927SAndroid Build Coastguard Worker }
606*61046927SAndroid Build Coastguard Worker if (instance->meta_cache_enabled == false) {
607*61046927SAndroid Build Coastguard Worker fprintf(stderr, "WARNING: custom pipeline cache for meta operations are disabled. "
608*61046927SAndroid Build Coastguard Worker "Performance can be affected negatively\n");
609*61046927SAndroid Build Coastguard Worker }
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false));
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
615*61046927SAndroid Build Coastguard Worker struct u_gralloc *u_gralloc = vk_android_init_ugralloc();
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker if (u_gralloc && u_gralloc_get_type(u_gralloc) == U_GRALLOC_TYPE_FALLBACK) {
618*61046927SAndroid Build Coastguard Worker mesa_logw(
619*61046927SAndroid Build Coastguard Worker "v3dv: Gralloc is not supported. Android extensions are disabled.");
620*61046927SAndroid Build Coastguard Worker vk_android_destroy_ugralloc();
621*61046927SAndroid Build Coastguard Worker }
622*61046927SAndroid Build Coastguard Worker #endif
623*61046927SAndroid Build Coastguard Worker
624*61046927SAndroid Build Coastguard Worker *pInstance = v3dv_instance_to_handle(instance);
625*61046927SAndroid Build Coastguard Worker
626*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
627*61046927SAndroid Build Coastguard Worker }
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker static void
v3dv_physical_device_free_disk_cache(struct v3dv_physical_device * device)630*61046927SAndroid Build Coastguard Worker v3dv_physical_device_free_disk_cache(struct v3dv_physical_device *device)
631*61046927SAndroid Build Coastguard Worker {
632*61046927SAndroid Build Coastguard Worker #ifdef ENABLE_SHADER_CACHE
633*61046927SAndroid Build Coastguard Worker if (device->disk_cache)
634*61046927SAndroid Build Coastguard Worker disk_cache_destroy(device->disk_cache);
635*61046927SAndroid Build Coastguard Worker #else
636*61046927SAndroid Build Coastguard Worker assert(device->disk_cache == NULL);
637*61046927SAndroid Build Coastguard Worker #endif
638*61046927SAndroid Build Coastguard Worker }
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker static void
physical_device_finish(struct v3dv_physical_device * device)641*61046927SAndroid Build Coastguard Worker physical_device_finish(struct v3dv_physical_device *device)
642*61046927SAndroid Build Coastguard Worker {
643*61046927SAndroid Build Coastguard Worker v3dv_wsi_finish(device);
644*61046927SAndroid Build Coastguard Worker v3dv_physical_device_free_disk_cache(device);
645*61046927SAndroid Build Coastguard Worker v3d_compiler_free(device->compiler);
646*61046927SAndroid Build Coastguard Worker
647*61046927SAndroid Build Coastguard Worker util_sparse_array_finish(&device->bo_map);
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker close(device->render_fd);
650*61046927SAndroid Build Coastguard Worker if (device->display_fd >= 0)
651*61046927SAndroid Build Coastguard Worker close(device->display_fd);
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker free(device->name);
654*61046927SAndroid Build Coastguard Worker
655*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
656*61046927SAndroid Build Coastguard Worker v3d_simulator_destroy(device->sim_file);
657*61046927SAndroid Build Coastguard Worker #endif
658*61046927SAndroid Build Coastguard Worker
659*61046927SAndroid Build Coastguard Worker vk_physical_device_finish(&device->vk);
660*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->mutex);
661*61046927SAndroid Build Coastguard Worker }
662*61046927SAndroid Build Coastguard Worker
663*61046927SAndroid Build Coastguard Worker static void
destroy_physical_device(struct vk_physical_device * device)664*61046927SAndroid Build Coastguard Worker destroy_physical_device(struct vk_physical_device *device)
665*61046927SAndroid Build Coastguard Worker {
666*61046927SAndroid Build Coastguard Worker physical_device_finish((struct v3dv_physical_device *)device);
667*61046927SAndroid Build Coastguard Worker vk_free(&device->instance->alloc, device);
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_DestroyInstance(VkInstance _instance,const VkAllocationCallbacks * pAllocator)671*61046927SAndroid Build Coastguard Worker v3dv_DestroyInstance(VkInstance _instance,
672*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
673*61046927SAndroid Build Coastguard Worker {
674*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_instance, instance, _instance);
675*61046927SAndroid Build Coastguard Worker
676*61046927SAndroid Build Coastguard Worker if (!instance)
677*61046927SAndroid Build Coastguard Worker return;
678*61046927SAndroid Build Coastguard Worker
679*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
680*61046927SAndroid Build Coastguard Worker vk_android_destroy_ugralloc();
681*61046927SAndroid Build Coastguard Worker #endif
682*61046927SAndroid Build Coastguard Worker
683*61046927SAndroid Build Coastguard Worker VG(VALGRIND_DESTROY_MEMPOOL(instance));
684*61046927SAndroid Build Coastguard Worker
685*61046927SAndroid Build Coastguard Worker vk_instance_finish(&instance->vk);
686*61046927SAndroid Build Coastguard Worker vk_free(&instance->vk.alloc, instance);
687*61046927SAndroid Build Coastguard Worker }
688*61046927SAndroid Build Coastguard Worker
689*61046927SAndroid Build Coastguard Worker static uint64_t
compute_heap_size()690*61046927SAndroid Build Coastguard Worker compute_heap_size()
691*61046927SAndroid Build Coastguard Worker {
692*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
693*61046927SAndroid Build Coastguard Worker /* Query the total ram from the system */
694*61046927SAndroid Build Coastguard Worker struct sysinfo info;
695*61046927SAndroid Build Coastguard Worker sysinfo(&info);
696*61046927SAndroid Build Coastguard Worker
697*61046927SAndroid Build Coastguard Worker uint64_t total_ram = (uint64_t)info.totalram * (uint64_t)info.mem_unit;
698*61046927SAndroid Build Coastguard Worker #else
699*61046927SAndroid Build Coastguard Worker uint64_t total_ram = (uint64_t) v3d_simulator_get_mem_size();
700*61046927SAndroid Build Coastguard Worker #endif
701*61046927SAndroid Build Coastguard Worker
702*61046927SAndroid Build Coastguard Worker /* We don't want to burn too much ram with the GPU. If the user has 4GB
703*61046927SAndroid Build Coastguard Worker * or less, we use at most half. If they have more than 4GB we limit it
704*61046927SAndroid Build Coastguard Worker * to 3/4 with a max. of 4GB since the GPU cannot address more than that.
705*61046927SAndroid Build Coastguard Worker */
706*61046927SAndroid Build Coastguard Worker const uint64_t MAX_HEAP_SIZE = 4ull * 1024ull * 1024ull * 1024ull;
707*61046927SAndroid Build Coastguard Worker uint64_t available;
708*61046927SAndroid Build Coastguard Worker if (total_ram <= MAX_HEAP_SIZE)
709*61046927SAndroid Build Coastguard Worker available = total_ram / 2;
710*61046927SAndroid Build Coastguard Worker else
711*61046927SAndroid Build Coastguard Worker available = MIN2(MAX_HEAP_SIZE, total_ram * 3 / 4);
712*61046927SAndroid Build Coastguard Worker
713*61046927SAndroid Build Coastguard Worker return available;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker
716*61046927SAndroid Build Coastguard Worker static uint64_t
compute_memory_budget(struct v3dv_physical_device * device)717*61046927SAndroid Build Coastguard Worker compute_memory_budget(struct v3dv_physical_device *device)
718*61046927SAndroid Build Coastguard Worker {
719*61046927SAndroid Build Coastguard Worker uint64_t heap_size = device->memory.memoryHeaps[0].size;
720*61046927SAndroid Build Coastguard Worker uint64_t heap_used = device->heap_used;
721*61046927SAndroid Build Coastguard Worker uint64_t sys_available;
722*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
723*61046927SAndroid Build Coastguard Worker ASSERTED bool has_available_memory =
724*61046927SAndroid Build Coastguard Worker os_get_available_system_memory(&sys_available);
725*61046927SAndroid Build Coastguard Worker assert(has_available_memory);
726*61046927SAndroid Build Coastguard Worker #else
727*61046927SAndroid Build Coastguard Worker sys_available = (uint64_t) v3d_simulator_get_mem_free();
728*61046927SAndroid Build Coastguard Worker #endif
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker /* Let's not incite the app to starve the system: report at most 90% of
731*61046927SAndroid Build Coastguard Worker * available system memory.
732*61046927SAndroid Build Coastguard Worker */
733*61046927SAndroid Build Coastguard Worker uint64_t heap_available = sys_available * 9 / 10;
734*61046927SAndroid Build Coastguard Worker return MIN2(heap_size, heap_used + heap_available);
735*61046927SAndroid Build Coastguard Worker }
736*61046927SAndroid Build Coastguard Worker
737*61046927SAndroid Build Coastguard Worker static bool
v3d_has_feature(struct v3dv_physical_device * device,enum drm_v3d_param feature)738*61046927SAndroid Build Coastguard Worker v3d_has_feature(struct v3dv_physical_device *device, enum drm_v3d_param feature)
739*61046927SAndroid Build Coastguard Worker {
740*61046927SAndroid Build Coastguard Worker struct drm_v3d_get_param p = {
741*61046927SAndroid Build Coastguard Worker .param = feature,
742*61046927SAndroid Build Coastguard Worker };
743*61046927SAndroid Build Coastguard Worker if (v3dv_ioctl(device->render_fd, DRM_IOCTL_V3D_GET_PARAM, &p) != 0)
744*61046927SAndroid Build Coastguard Worker return false;
745*61046927SAndroid Build Coastguard Worker return p.value;
746*61046927SAndroid Build Coastguard Worker }
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker static bool
device_has_expected_features(struct v3dv_physical_device * device)749*61046927SAndroid Build Coastguard Worker device_has_expected_features(struct v3dv_physical_device *device)
750*61046927SAndroid Build Coastguard Worker {
751*61046927SAndroid Build Coastguard Worker return v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_TFU) &&
752*61046927SAndroid Build Coastguard Worker v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_CSD) &&
753*61046927SAndroid Build Coastguard Worker v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH) &&
754*61046927SAndroid Build Coastguard Worker device->caps.multisync;
755*61046927SAndroid Build Coastguard Worker }
756*61046927SAndroid Build Coastguard Worker
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker static VkResult
init_uuids(struct v3dv_physical_device * device)759*61046927SAndroid Build Coastguard Worker init_uuids(struct v3dv_physical_device *device)
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker const struct build_id_note *note =
762*61046927SAndroid Build Coastguard Worker build_id_find_nhdr_for_addr(init_uuids);
763*61046927SAndroid Build Coastguard Worker if (!note) {
764*61046927SAndroid Build Coastguard Worker return vk_errorf(device->vk.instance,
765*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
766*61046927SAndroid Build Coastguard Worker "Failed to find build-id");
767*61046927SAndroid Build Coastguard Worker }
768*61046927SAndroid Build Coastguard Worker
769*61046927SAndroid Build Coastguard Worker unsigned build_id_len = build_id_length(note);
770*61046927SAndroid Build Coastguard Worker if (build_id_len < 20) {
771*61046927SAndroid Build Coastguard Worker return vk_errorf(device->vk.instance,
772*61046927SAndroid Build Coastguard Worker VK_ERROR_INITIALIZATION_FAILED,
773*61046927SAndroid Build Coastguard Worker "build-id too short. It needs to be a SHA");
774*61046927SAndroid Build Coastguard Worker }
775*61046927SAndroid Build Coastguard Worker
776*61046927SAndroid Build Coastguard Worker memcpy(device->driver_build_sha1, build_id_data(note), 20);
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker uint32_t vendor_id = v3dv_physical_device_vendor_id(device);
779*61046927SAndroid Build Coastguard Worker uint32_t device_id = v3dv_physical_device_device_id(device);
780*61046927SAndroid Build Coastguard Worker
781*61046927SAndroid Build Coastguard Worker struct mesa_sha1 sha1_ctx;
782*61046927SAndroid Build Coastguard Worker uint8_t sha1[20];
783*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(VK_UUID_SIZE <= sizeof(sha1));
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker /* The pipeline cache UUID is used for determining when a pipeline cache is
786*61046927SAndroid Build Coastguard Worker * invalid. It needs both a driver build and the PCI ID of the device.
787*61046927SAndroid Build Coastguard Worker */
788*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
789*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, build_id_data(note), build_id_len);
790*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &device_id, sizeof(device_id));
791*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
792*61046927SAndroid Build Coastguard Worker memcpy(device->pipeline_cache_uuid, sha1, VK_UUID_SIZE);
793*61046927SAndroid Build Coastguard Worker
794*61046927SAndroid Build Coastguard Worker /* The driver UUID is used for determining sharability of images and memory
795*61046927SAndroid Build Coastguard Worker * between two Vulkan instances in separate processes. People who want to
796*61046927SAndroid Build Coastguard Worker * share memory need to also check the device UUID (below) so all this
797*61046927SAndroid Build Coastguard Worker * needs to be is the build-id.
798*61046927SAndroid Build Coastguard Worker */
799*61046927SAndroid Build Coastguard Worker memcpy(device->driver_uuid, build_id_data(note), VK_UUID_SIZE);
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker /* The device UUID uniquely identifies the given device within the machine.
802*61046927SAndroid Build Coastguard Worker * Since we never have more than one device, this doesn't need to be a real
803*61046927SAndroid Build Coastguard Worker * UUID.
804*61046927SAndroid Build Coastguard Worker */
805*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
806*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &vendor_id, sizeof(vendor_id));
807*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &device_id, sizeof(device_id));
808*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
809*61046927SAndroid Build Coastguard Worker memcpy(device->device_uuid, sha1, VK_UUID_SIZE);
810*61046927SAndroid Build Coastguard Worker
811*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
812*61046927SAndroid Build Coastguard Worker }
813*61046927SAndroid Build Coastguard Worker
814*61046927SAndroid Build Coastguard Worker static void
v3dv_physical_device_init_disk_cache(struct v3dv_physical_device * device)815*61046927SAndroid Build Coastguard Worker v3dv_physical_device_init_disk_cache(struct v3dv_physical_device *device)
816*61046927SAndroid Build Coastguard Worker {
817*61046927SAndroid Build Coastguard Worker #ifdef ENABLE_SHADER_CACHE
818*61046927SAndroid Build Coastguard Worker char timestamp[41];
819*61046927SAndroid Build Coastguard Worker _mesa_sha1_format(timestamp, device->driver_build_sha1);
820*61046927SAndroid Build Coastguard Worker
821*61046927SAndroid Build Coastguard Worker assert(device->name);
822*61046927SAndroid Build Coastguard Worker device->disk_cache = disk_cache_create(device->name, timestamp, v3d_mesa_debug);
823*61046927SAndroid Build Coastguard Worker #else
824*61046927SAndroid Build Coastguard Worker device->disk_cache = NULL;
825*61046927SAndroid Build Coastguard Worker #endif
826*61046927SAndroid Build Coastguard Worker }
827*61046927SAndroid Build Coastguard Worker
828*61046927SAndroid Build Coastguard Worker static void
get_device_properties(const struct v3dv_physical_device * device,struct vk_properties * properties)829*61046927SAndroid Build Coastguard Worker get_device_properties(const struct v3dv_physical_device *device,
830*61046927SAndroid Build Coastguard Worker struct vk_properties *properties)
831*61046927SAndroid Build Coastguard Worker {
832*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(MAX_SAMPLED_IMAGES + MAX_STORAGE_IMAGES + MAX_INPUT_ATTACHMENTS
833*61046927SAndroid Build Coastguard Worker <= V3D_MAX_TEXTURE_SAMPLERS);
834*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(MAX_UNIFORM_BUFFERS >= MAX_DYNAMIC_UNIFORM_BUFFERS);
835*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(MAX_STORAGE_BUFFERS >= MAX_DYNAMIC_STORAGE_BUFFERS);
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker const uint32_t page_size = 4096;
838*61046927SAndroid Build Coastguard Worker const uint64_t mem_size = compute_heap_size();
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker const uint32_t max_varying_components = 16 * 4;
841*61046927SAndroid Build Coastguard Worker
842*61046927SAndroid Build Coastguard Worker const uint32_t max_per_stage_resources = 128;
843*61046927SAndroid Build Coastguard Worker
844*61046927SAndroid Build Coastguard Worker const float v3d_point_line_granularity = 2.0f / (1 << V3D_COORD_SHIFT);
845*61046927SAndroid Build Coastguard Worker const uint32_t max_fb_size = V3D_MAX_IMAGE_DIMENSION;
846*61046927SAndroid Build Coastguard Worker
847*61046927SAndroid Build Coastguard Worker const VkSampleCountFlags supported_sample_counts =
848*61046927SAndroid Build Coastguard Worker VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;
849*61046927SAndroid Build Coastguard Worker
850*61046927SAndroid Build Coastguard Worker const uint8_t max_rts = V3D_MAX_RENDER_TARGETS(device->devinfo.ver);
851*61046927SAndroid Build Coastguard Worker
852*61046927SAndroid Build Coastguard Worker struct timespec clock_res;
853*61046927SAndroid Build Coastguard Worker clock_getres(CLOCK_MONOTONIC, &clock_res);
854*61046927SAndroid Build Coastguard Worker const float timestamp_period =
855*61046927SAndroid Build Coastguard Worker clock_res.tv_sec * 1000000000.0f + clock_res.tv_nsec;
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker /* We don't really have special restrictions for the maximum
858*61046927SAndroid Build Coastguard Worker * descriptors per set, other than maybe not exceeding the limits
859*61046927SAndroid Build Coastguard Worker * of addressable memory in a single allocation on either the host
860*61046927SAndroid Build Coastguard Worker * or the GPU. This will be a much larger limit than any of the
861*61046927SAndroid Build Coastguard Worker * per-stage limits already available in Vulkan though, so in practice,
862*61046927SAndroid Build Coastguard Worker * it is not expected to limit anything beyond what is already
863*61046927SAndroid Build Coastguard Worker * constrained through per-stage limits.
864*61046927SAndroid Build Coastguard Worker */
865*61046927SAndroid Build Coastguard Worker const uint32_t max_host_descriptors =
866*61046927SAndroid Build Coastguard Worker (UINT32_MAX - sizeof(struct v3dv_descriptor_set)) /
867*61046927SAndroid Build Coastguard Worker sizeof(struct v3dv_descriptor);
868*61046927SAndroid Build Coastguard Worker const uint32_t max_gpu_descriptors =
869*61046927SAndroid Build Coastguard Worker (UINT32_MAX / v3dv_X(device, max_descriptor_bo_size)());
870*61046927SAndroid Build Coastguard Worker
871*61046927SAndroid Build Coastguard Worker VkSubgroupFeatureFlags subgroup_ops = VK_SUBGROUP_FEATURE_BASIC_BIT;
872*61046927SAndroid Build Coastguard Worker if (device->devinfo.ver >= 71) {
873*61046927SAndroid Build Coastguard Worker subgroup_ops |= VK_SUBGROUP_FEATURE_BALLOT_BIT |
874*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
875*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT |
876*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_VOTE_BIT |
877*61046927SAndroid Build Coastguard Worker VK_SUBGROUP_FEATURE_QUAD_BIT;
878*61046927SAndroid Build Coastguard Worker }
879*61046927SAndroid Build Coastguard Worker
880*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
881*61046927SAndroid Build Coastguard Worker /* Used to determine the sharedImage prop in
882*61046927SAndroid Build Coastguard Worker * VkPhysicalDevicePresentationPropertiesANDROID
883*61046927SAndroid Build Coastguard Worker */
884*61046927SAndroid Build Coastguard Worker uint64_t front_rendering_usage = 0;
885*61046927SAndroid Build Coastguard Worker struct u_gralloc *gralloc = u_gralloc_create(U_GRALLOC_TYPE_AUTO);
886*61046927SAndroid Build Coastguard Worker if (gralloc != NULL) {
887*61046927SAndroid Build Coastguard Worker u_gralloc_get_front_rendering_usage(gralloc, &front_rendering_usage);
888*61046927SAndroid Build Coastguard Worker u_gralloc_destroy(&gralloc);
889*61046927SAndroid Build Coastguard Worker }
890*61046927SAndroid Build Coastguard Worker VkBool32 shared_image = front_rendering_usage ? VK_TRUE : VK_FALSE;
891*61046927SAndroid Build Coastguard Worker #endif
892*61046927SAndroid Build Coastguard Worker
893*61046927SAndroid Build Coastguard Worker /* FIXME: this will probably require an in-depth review */
894*61046927SAndroid Build Coastguard Worker *properties = (struct vk_properties) {
895*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceProperties, limits and sparse props below */
896*61046927SAndroid Build Coastguard Worker .apiVersion = V3DV_API_VERSION,
897*61046927SAndroid Build Coastguard Worker .driverVersion = vk_get_driver_version(),
898*61046927SAndroid Build Coastguard Worker .vendorID = v3dv_physical_device_vendor_id(device),
899*61046927SAndroid Build Coastguard Worker .deviceID = v3dv_physical_device_device_id(device),
900*61046927SAndroid Build Coastguard Worker .deviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
901*61046927SAndroid Build Coastguard Worker
902*61046927SAndroid Build Coastguard Worker /* Vulkan 1.0 limits */
903*61046927SAndroid Build Coastguard Worker .maxImageDimension1D = V3D_MAX_IMAGE_DIMENSION,
904*61046927SAndroid Build Coastguard Worker .maxImageDimension2D = V3D_MAX_IMAGE_DIMENSION,
905*61046927SAndroid Build Coastguard Worker .maxImageDimension3D = V3D_MAX_IMAGE_DIMENSION,
906*61046927SAndroid Build Coastguard Worker .maxImageDimensionCube = V3D_MAX_IMAGE_DIMENSION,
907*61046927SAndroid Build Coastguard Worker .maxImageArrayLayers = V3D_MAX_ARRAY_LAYERS,
908*61046927SAndroid Build Coastguard Worker .maxTexelBufferElements = (1ul << 28),
909*61046927SAndroid Build Coastguard Worker .maxUniformBufferRange = V3D_MAX_BUFFER_RANGE,
910*61046927SAndroid Build Coastguard Worker .maxStorageBufferRange = V3D_MAX_BUFFER_RANGE,
911*61046927SAndroid Build Coastguard Worker .maxPushConstantsSize = MAX_PUSH_CONSTANTS_SIZE,
912*61046927SAndroid Build Coastguard Worker .maxMemoryAllocationCount = mem_size / page_size,
913*61046927SAndroid Build Coastguard Worker .maxSamplerAllocationCount = 64 * 1024,
914*61046927SAndroid Build Coastguard Worker .bufferImageGranularity = V3D_NON_COHERENT_ATOM_SIZE,
915*61046927SAndroid Build Coastguard Worker .sparseAddressSpaceSize = 0,
916*61046927SAndroid Build Coastguard Worker .maxBoundDescriptorSets = MAX_SETS,
917*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorSamplers = V3D_MAX_TEXTURE_SAMPLERS,
918*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUniformBuffers = MAX_UNIFORM_BUFFERS,
919*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorStorageBuffers = MAX_STORAGE_BUFFERS,
920*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorSampledImages = MAX_SAMPLED_IMAGES,
921*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorStorageImages = MAX_STORAGE_IMAGES,
922*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorInputAttachments = MAX_INPUT_ATTACHMENTS,
923*61046927SAndroid Build Coastguard Worker .maxPerStageResources = max_per_stage_resources,
924*61046927SAndroid Build Coastguard Worker
925*61046927SAndroid Build Coastguard Worker .maxDescriptorSetSamplers =
926*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * V3D_MAX_TEXTURE_SAMPLERS,
927*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUniformBuffers =
928*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_UNIFORM_BUFFERS,
929*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS,
930*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageBuffers =
931*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_STORAGE_BUFFERS,
932*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS,
933*61046927SAndroid Build Coastguard Worker .maxDescriptorSetSampledImages =
934*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_SAMPLED_IMAGES,
935*61046927SAndroid Build Coastguard Worker .maxDescriptorSetStorageImages =
936*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_STORAGE_IMAGES,
937*61046927SAndroid Build Coastguard Worker .maxDescriptorSetInputAttachments = MAX_INPUT_ATTACHMENTS,
938*61046927SAndroid Build Coastguard Worker
939*61046927SAndroid Build Coastguard Worker /* Vertex limits */
940*61046927SAndroid Build Coastguard Worker .maxVertexInputAttributes = MAX_VERTEX_ATTRIBS,
941*61046927SAndroid Build Coastguard Worker .maxVertexInputBindings = MAX_VBS,
942*61046927SAndroid Build Coastguard Worker .maxVertexInputAttributeOffset = 0xffffffff,
943*61046927SAndroid Build Coastguard Worker .maxVertexInputBindingStride = MESA_VK_MAX_VERTEX_BINDING_STRIDE,
944*61046927SAndroid Build Coastguard Worker .maxVertexOutputComponents = max_varying_components,
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker /* Tessellation limits */
947*61046927SAndroid Build Coastguard Worker .maxTessellationGenerationLevel = 0,
948*61046927SAndroid Build Coastguard Worker .maxTessellationPatchSize = 0,
949*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerVertexInputComponents = 0,
950*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerVertexOutputComponents = 0,
951*61046927SAndroid Build Coastguard Worker .maxTessellationControlPerPatchOutputComponents = 0,
952*61046927SAndroid Build Coastguard Worker .maxTessellationControlTotalOutputComponents = 0,
953*61046927SAndroid Build Coastguard Worker .maxTessellationEvaluationInputComponents = 0,
954*61046927SAndroid Build Coastguard Worker .maxTessellationEvaluationOutputComponents = 0,
955*61046927SAndroid Build Coastguard Worker
956*61046927SAndroid Build Coastguard Worker /* Geometry limits */
957*61046927SAndroid Build Coastguard Worker .maxGeometryShaderInvocations = 32,
958*61046927SAndroid Build Coastguard Worker .maxGeometryInputComponents = 64,
959*61046927SAndroid Build Coastguard Worker .maxGeometryOutputComponents = 64,
960*61046927SAndroid Build Coastguard Worker .maxGeometryOutputVertices = 256,
961*61046927SAndroid Build Coastguard Worker .maxGeometryTotalOutputComponents = 1024,
962*61046927SAndroid Build Coastguard Worker
963*61046927SAndroid Build Coastguard Worker /* Fragment limits */
964*61046927SAndroid Build Coastguard Worker .maxFragmentInputComponents = max_varying_components,
965*61046927SAndroid Build Coastguard Worker .maxFragmentOutputAttachments = 4,
966*61046927SAndroid Build Coastguard Worker .maxFragmentDualSrcAttachments = 0,
967*61046927SAndroid Build Coastguard Worker .maxFragmentCombinedOutputResources = max_rts +
968*61046927SAndroid Build Coastguard Worker MAX_STORAGE_BUFFERS +
969*61046927SAndroid Build Coastguard Worker MAX_STORAGE_IMAGES,
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker /* Compute limits */
972*61046927SAndroid Build Coastguard Worker .maxComputeSharedMemorySize = 16384,
973*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupCount = { 65535, 65535, 65535 },
974*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupInvocations = 256,
975*61046927SAndroid Build Coastguard Worker .maxComputeWorkGroupSize = { 256, 256, 256 },
976*61046927SAndroid Build Coastguard Worker
977*61046927SAndroid Build Coastguard Worker .subPixelPrecisionBits = V3D_COORD_SHIFT,
978*61046927SAndroid Build Coastguard Worker .subTexelPrecisionBits = 8,
979*61046927SAndroid Build Coastguard Worker .mipmapPrecisionBits = 8,
980*61046927SAndroid Build Coastguard Worker .maxDrawIndexedIndexValue = device->devinfo.ver >= 71 ?
981*61046927SAndroid Build Coastguard Worker 0xffffffff : 0x00ffffff,
982*61046927SAndroid Build Coastguard Worker .maxDrawIndirectCount = 0x7fffffff,
983*61046927SAndroid Build Coastguard Worker .maxSamplerLodBias = 14.0f,
984*61046927SAndroid Build Coastguard Worker .maxSamplerAnisotropy = 16.0f,
985*61046927SAndroid Build Coastguard Worker .maxViewports = MAX_VIEWPORTS,
986*61046927SAndroid Build Coastguard Worker .maxViewportDimensions = { max_fb_size, max_fb_size },
987*61046927SAndroid Build Coastguard Worker .viewportBoundsRange = { -2.0 * max_fb_size,
988*61046927SAndroid Build Coastguard Worker 2.0 * max_fb_size - 1 },
989*61046927SAndroid Build Coastguard Worker .viewportSubPixelBits = 0,
990*61046927SAndroid Build Coastguard Worker .minMemoryMapAlignment = page_size,
991*61046927SAndroid Build Coastguard Worker .minTexelBufferOffsetAlignment = V3D_TMU_TEXEL_ALIGN,
992*61046927SAndroid Build Coastguard Worker .minUniformBufferOffsetAlignment = 32,
993*61046927SAndroid Build Coastguard Worker .minStorageBufferOffsetAlignment = 32,
994*61046927SAndroid Build Coastguard Worker .minTexelOffset = -8,
995*61046927SAndroid Build Coastguard Worker .maxTexelOffset = 7,
996*61046927SAndroid Build Coastguard Worker .minTexelGatherOffset = -8,
997*61046927SAndroid Build Coastguard Worker .maxTexelGatherOffset = 7,
998*61046927SAndroid Build Coastguard Worker .minInterpolationOffset = -0.5,
999*61046927SAndroid Build Coastguard Worker .maxInterpolationOffset = 0.5,
1000*61046927SAndroid Build Coastguard Worker .subPixelInterpolationOffsetBits = V3D_COORD_SHIFT,
1001*61046927SAndroid Build Coastguard Worker .maxFramebufferWidth = max_fb_size,
1002*61046927SAndroid Build Coastguard Worker .maxFramebufferHeight = max_fb_size,
1003*61046927SAndroid Build Coastguard Worker .maxFramebufferLayers = 256,
1004*61046927SAndroid Build Coastguard Worker .framebufferColorSampleCounts = supported_sample_counts,
1005*61046927SAndroid Build Coastguard Worker .framebufferDepthSampleCounts = supported_sample_counts,
1006*61046927SAndroid Build Coastguard Worker .framebufferStencilSampleCounts = supported_sample_counts,
1007*61046927SAndroid Build Coastguard Worker .framebufferNoAttachmentsSampleCounts = supported_sample_counts,
1008*61046927SAndroid Build Coastguard Worker .maxColorAttachments = max_rts,
1009*61046927SAndroid Build Coastguard Worker .sampledImageColorSampleCounts = supported_sample_counts,
1010*61046927SAndroid Build Coastguard Worker .sampledImageIntegerSampleCounts = supported_sample_counts,
1011*61046927SAndroid Build Coastguard Worker .sampledImageDepthSampleCounts = supported_sample_counts,
1012*61046927SAndroid Build Coastguard Worker .sampledImageStencilSampleCounts = supported_sample_counts,
1013*61046927SAndroid Build Coastguard Worker .storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT,
1014*61046927SAndroid Build Coastguard Worker .maxSampleMaskWords = 1,
1015*61046927SAndroid Build Coastguard Worker .timestampComputeAndGraphics = true,
1016*61046927SAndroid Build Coastguard Worker .timestampPeriod = timestamp_period,
1017*61046927SAndroid Build Coastguard Worker .maxClipDistances = 8,
1018*61046927SAndroid Build Coastguard Worker .maxCullDistances = 0,
1019*61046927SAndroid Build Coastguard Worker .maxCombinedClipAndCullDistances = 8,
1020*61046927SAndroid Build Coastguard Worker .discreteQueuePriorities = 2,
1021*61046927SAndroid Build Coastguard Worker .pointSizeRange = { v3d_point_line_granularity,
1022*61046927SAndroid Build Coastguard Worker V3D_MAX_POINT_SIZE },
1023*61046927SAndroid Build Coastguard Worker .lineWidthRange = { 1.0f, V3D_MAX_LINE_WIDTH },
1024*61046927SAndroid Build Coastguard Worker .pointSizeGranularity = v3d_point_line_granularity,
1025*61046927SAndroid Build Coastguard Worker .lineWidthGranularity = v3d_point_line_granularity,
1026*61046927SAndroid Build Coastguard Worker .strictLines = true,
1027*61046927SAndroid Build Coastguard Worker .standardSampleLocations = false,
1028*61046927SAndroid Build Coastguard Worker .optimalBufferCopyOffsetAlignment = 32,
1029*61046927SAndroid Build Coastguard Worker .optimalBufferCopyRowPitchAlignment = 32,
1030*61046927SAndroid Build Coastguard Worker .nonCoherentAtomSize = V3D_NON_COHERENT_ATOM_SIZE,
1031*61046927SAndroid Build Coastguard Worker
1032*61046927SAndroid Build Coastguard Worker /* Vulkan 1.0 sparse properties */
1033*61046927SAndroid Build Coastguard Worker .sparseResidencyStandard2DBlockShape = false,
1034*61046927SAndroid Build Coastguard Worker .sparseResidencyStandard2DMultisampleBlockShape = false,
1035*61046927SAndroid Build Coastguard Worker .sparseResidencyStandard3DBlockShape = false,
1036*61046927SAndroid Build Coastguard Worker .sparseResidencyAlignedMipSize = false,
1037*61046927SAndroid Build Coastguard Worker .sparseResidencyNonResidentStrict = false,
1038*61046927SAndroid Build Coastguard Worker
1039*61046927SAndroid Build Coastguard Worker /* Vulkan 1.1 properties*/
1040*61046927SAndroid Build Coastguard Worker .deviceLUIDValid = false,
1041*61046927SAndroid Build Coastguard Worker .subgroupSize = V3D_CHANNELS,
1042*61046927SAndroid Build Coastguard Worker .subgroupSupportedStages = VK_SHADER_STAGE_COMPUTE_BIT |
1043*61046927SAndroid Build Coastguard Worker VK_SHADER_STAGE_FRAGMENT_BIT,
1044*61046927SAndroid Build Coastguard Worker .subgroupSupportedOperations = VK_SUBGROUP_FEATURE_BASIC_BIT,
1045*61046927SAndroid Build Coastguard Worker .subgroupQuadOperationsInAllStages = false,
1046*61046927SAndroid Build Coastguard Worker .pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES,
1047*61046927SAndroid Build Coastguard Worker .maxMultiviewViewCount = MAX_MULTIVIEW_VIEW_COUNT,
1048*61046927SAndroid Build Coastguard Worker .maxMultiviewInstanceIndex = UINT32_MAX - 1,
1049*61046927SAndroid Build Coastguard Worker .protectedNoFault = false,
1050*61046927SAndroid Build Coastguard Worker .maxPerSetDescriptors = MIN2(max_host_descriptors, max_gpu_descriptors),
1051*61046927SAndroid Build Coastguard Worker /* Minimum required by the spec */
1052*61046927SAndroid Build Coastguard Worker .maxMemoryAllocationSize = MAX_MEMORY_ALLOCATION_SIZE,
1053*61046927SAndroid Build Coastguard Worker
1054*61046927SAndroid Build Coastguard Worker /* Vulkan 1.2 properties */
1055*61046927SAndroid Build Coastguard Worker .driverID = VK_DRIVER_ID_MESA_V3DV,
1056*61046927SAndroid Build Coastguard Worker .conformanceVersion = {
1057*61046927SAndroid Build Coastguard Worker .major = 1,
1058*61046927SAndroid Build Coastguard Worker .minor = 3,
1059*61046927SAndroid Build Coastguard Worker .subminor = 8,
1060*61046927SAndroid Build Coastguard Worker .patch = 3,
1061*61046927SAndroid Build Coastguard Worker },
1062*61046927SAndroid Build Coastguard Worker .supportedDepthResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
1063*61046927SAndroid Build Coastguard Worker .supportedStencilResolveModes = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
1064*61046927SAndroid Build Coastguard Worker /* FIXME: if we want to support independentResolveNone then we would
1065*61046927SAndroid Build Coastguard Worker * need to honor attachment load operations on resolve attachments,
1066*61046927SAndroid Build Coastguard Worker * which we currently ignore because the resolve makes them irrelevant,
1067*61046927SAndroid Build Coastguard Worker * as it unconditionally writes all pixels in the render area. However,
1068*61046927SAndroid Build Coastguard Worker * with independentResolveNone, it is possible to have one aspect of a
1069*61046927SAndroid Build Coastguard Worker * D/S resolve attachment stay unresolved, in which case the attachment
1070*61046927SAndroid Build Coastguard Worker * load operation is relevant.
1071*61046927SAndroid Build Coastguard Worker *
1072*61046927SAndroid Build Coastguard Worker * NOTE: implementing attachment load for resolve attachments isn't
1073*61046927SAndroid Build Coastguard Worker * immediately trivial because these attachments are not part of the
1074*61046927SAndroid Build Coastguard Worker * framebuffer and therefore we can't use the same mechanism we use
1075*61046927SAndroid Build Coastguard Worker * for framebuffer attachments. Instead, we should probably have to
1076*61046927SAndroid Build Coastguard Worker * emit a meta operation for that right at the start of the render
1077*61046927SAndroid Build Coastguard Worker * pass (or subpass).
1078*61046927SAndroid Build Coastguard Worker */
1079*61046927SAndroid Build Coastguard Worker .independentResolveNone = false,
1080*61046927SAndroid Build Coastguard Worker .independentResolve = false,
1081*61046927SAndroid Build Coastguard Worker .maxTimelineSemaphoreValueDifference = UINT64_MAX,
1082*61046927SAndroid Build Coastguard Worker
1083*61046927SAndroid Build Coastguard Worker .denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
1084*61046927SAndroid Build Coastguard Worker .roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,
1085*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat16 = true,
1086*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat32 = true,
1087*61046927SAndroid Build Coastguard Worker .shaderSignedZeroInfNanPreserveFloat64 = false,
1088*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat16 = true,
1089*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat32 = true,
1090*61046927SAndroid Build Coastguard Worker .shaderDenormPreserveFloat64 = false,
1091*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat16 = false,
1092*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat32 = false,
1093*61046927SAndroid Build Coastguard Worker .shaderDenormFlushToZeroFloat64 = false,
1094*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat16 = true,
1095*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat32 = true,
1096*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTEFloat64 = false,
1097*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat16 = false,
1098*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat32 = false,
1099*61046927SAndroid Build Coastguard Worker .shaderRoundingModeRTZFloat64 = false,
1100*61046927SAndroid Build Coastguard Worker
1101*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindSamplers = V3D_MAX_TEXTURE_SAMPLERS,
1102*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindUniformBuffers = MAX_UNIFORM_BUFFERS,
1103*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindStorageBuffers = MAX_STORAGE_BUFFERS,
1104*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindSampledImages = MAX_SAMPLED_IMAGES,
1105*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindStorageImages = MAX_STORAGE_IMAGES,
1106*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindInputAttachments = MAX_INPUT_ATTACHMENTS,
1107*61046927SAndroid Build Coastguard Worker .maxPerStageUpdateAfterBindResources = max_per_stage_resources,
1108*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindSamplers =
1109*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * V3D_MAX_TEXTURE_SAMPLERS,
1110*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindUniformBuffers =
1111*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_UNIFORM_BUFFERS,
1112*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS,
1113*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageBuffers =
1114*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_STORAGE_BUFFERS,
1115*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS,
1116*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindSampledImages =
1117*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_SAMPLED_IMAGES,
1118*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindStorageImages =
1119*61046927SAndroid Build Coastguard Worker V3DV_SUPPORTED_SHADER_STAGES * MAX_STORAGE_IMAGES,
1120*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindInputAttachments = MAX_INPUT_ATTACHMENTS,
1121*61046927SAndroid Build Coastguard Worker
1122*61046927SAndroid Build Coastguard Worker /* V3D doesn't support min/max filtering */
1123*61046927SAndroid Build Coastguard Worker .filterMinmaxSingleComponentFormats = false,
1124*61046927SAndroid Build Coastguard Worker .filterMinmaxImageComponentMapping = false,
1125*61046927SAndroid Build Coastguard Worker
1126*61046927SAndroid Build Coastguard Worker .framebufferIntegerColorSampleCounts =
1127*61046927SAndroid Build Coastguard Worker VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT,
1128*61046927SAndroid Build Coastguard Worker
1129*61046927SAndroid Build Coastguard Worker /* Vulkan 1.3 properties */
1130*61046927SAndroid Build Coastguard Worker .maxInlineUniformBlockSize = MAX_INLINE_UNIFORM_BLOCK_SIZE,
1131*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorInlineUniformBlocks = MAX_INLINE_UNIFORM_BUFFERS,
1132*61046927SAndroid Build Coastguard Worker .maxDescriptorSetInlineUniformBlocks = MAX_INLINE_UNIFORM_BUFFERS,
1133*61046927SAndroid Build Coastguard Worker .maxInlineUniformTotalSize =
1134*61046927SAndroid Build Coastguard Worker MAX_INLINE_UNIFORM_BUFFERS * MAX_INLINE_UNIFORM_BLOCK_SIZE,
1135*61046927SAndroid Build Coastguard Worker .maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks =
1136*61046927SAndroid Build Coastguard Worker MAX_INLINE_UNIFORM_BUFFERS,
1137*61046927SAndroid Build Coastguard Worker .maxDescriptorSetUpdateAfterBindInlineUniformBlocks =
1138*61046927SAndroid Build Coastguard Worker MAX_INLINE_UNIFORM_BUFFERS,
1139*61046927SAndroid Build Coastguard Worker .maxBufferSize = V3D_MAX_BUFFER_RANGE,
1140*61046927SAndroid Build Coastguard Worker .storageTexelBufferOffsetAlignmentBytes = V3D_TMU_TEXEL_ALIGN,
1141*61046927SAndroid Build Coastguard Worker .storageTexelBufferOffsetSingleTexelAlignment = false,
1142*61046927SAndroid Build Coastguard Worker .uniformTexelBufferOffsetAlignmentBytes = V3D_TMU_TEXEL_ALIGN,
1143*61046927SAndroid Build Coastguard Worker .uniformTexelBufferOffsetSingleTexelAlignment = false,
1144*61046927SAndroid Build Coastguard Worker /* No native acceleration for integer dot product. We use NIR lowering. */
1145*61046927SAndroid Build Coastguard Worker .integerDotProduct8BitUnsignedAccelerated = false,
1146*61046927SAndroid Build Coastguard Worker .integerDotProduct8BitMixedSignednessAccelerated = false,
1147*61046927SAndroid Build Coastguard Worker .integerDotProduct4x8BitPackedUnsignedAccelerated = false,
1148*61046927SAndroid Build Coastguard Worker .integerDotProduct4x8BitPackedSignedAccelerated = false,
1149*61046927SAndroid Build Coastguard Worker .integerDotProduct4x8BitPackedMixedSignednessAccelerated = false,
1150*61046927SAndroid Build Coastguard Worker .integerDotProduct16BitUnsignedAccelerated = false,
1151*61046927SAndroid Build Coastguard Worker .integerDotProduct16BitSignedAccelerated = false,
1152*61046927SAndroid Build Coastguard Worker .integerDotProduct16BitMixedSignednessAccelerated = false,
1153*61046927SAndroid Build Coastguard Worker .integerDotProduct32BitUnsignedAccelerated = false,
1154*61046927SAndroid Build Coastguard Worker .integerDotProduct32BitSignedAccelerated = false,
1155*61046927SAndroid Build Coastguard Worker .integerDotProduct32BitMixedSignednessAccelerated = false,
1156*61046927SAndroid Build Coastguard Worker .integerDotProduct64BitUnsignedAccelerated = false,
1157*61046927SAndroid Build Coastguard Worker .integerDotProduct64BitSignedAccelerated = false,
1158*61046927SAndroid Build Coastguard Worker .integerDotProduct64BitMixedSignednessAccelerated = false,
1159*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating8BitUnsignedAccelerated = false,
1160*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating8BitSignedAccelerated = false,
1161*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated = false,
1162*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated = false,
1163*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated = false,
1164*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = false,
1165*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating16BitUnsignedAccelerated = false,
1166*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating16BitSignedAccelerated = false,
1167*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated = false,
1168*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating32BitUnsignedAccelerated = false,
1169*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating32BitSignedAccelerated = false,
1170*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated = false,
1171*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating64BitUnsignedAccelerated = false,
1172*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating64BitSignedAccelerated = false,
1173*61046927SAndroid Build Coastguard Worker .integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated = false,
1174*61046927SAndroid Build Coastguard Worker
1175*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceCustomBorderColorPropertiesEXT */
1176*61046927SAndroid Build Coastguard Worker .maxCustomBorderColorSamplers = V3D_MAX_TEXTURE_SAMPLERS,
1177*61046927SAndroid Build Coastguard Worker
1178*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceProvokingVertexPropertiesEXT */
1179*61046927SAndroid Build Coastguard Worker .provokingVertexModePerPipeline = true,
1180*61046927SAndroid Build Coastguard Worker /* FIXME: update when supporting EXT_transform_feedback */
1181*61046927SAndroid Build Coastguard Worker .transformFeedbackPreservesTriangleFanProvokingVertex = false,
1182*61046927SAndroid Build Coastguard Worker
1183*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT */
1184*61046927SAndroid Build Coastguard Worker .maxVertexAttribDivisor = V3D_MAX_VERTEX_ATTRIB_DIVISOR,
1185*61046927SAndroid Build Coastguard Worker .supportsNonZeroFirstInstance = true,
1186*61046927SAndroid Build Coastguard Worker
1187*61046927SAndroid Build Coastguard Worker /* VkPhysicalDevicePerformanceQueryPropertiesKHR */
1188*61046927SAndroid Build Coastguard Worker .allowCommandBufferQueryCopies = true,
1189*61046927SAndroid Build Coastguard Worker
1190*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
1191*61046927SAndroid Build Coastguard Worker /* VkPhysicalDevicePresentationPropertiesANDROID */
1192*61046927SAndroid Build Coastguard Worker .sharedImage = shared_image,
1193*61046927SAndroid Build Coastguard Worker #endif
1194*61046927SAndroid Build Coastguard Worker
1195*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceDrmPropertiesEXT */
1196*61046927SAndroid Build Coastguard Worker .drmHasPrimary = device->has_primary,
1197*61046927SAndroid Build Coastguard Worker .drmPrimaryMajor = (int64_t) major(device->primary_devid),
1198*61046927SAndroid Build Coastguard Worker .drmPrimaryMinor = (int64_t) minor(device->primary_devid),
1199*61046927SAndroid Build Coastguard Worker .drmHasRender = device->has_render,
1200*61046927SAndroid Build Coastguard Worker .drmRenderMajor = (int64_t) major(device->render_devid),
1201*61046927SAndroid Build Coastguard Worker .drmRenderMinor = (int64_t) minor(device->render_devid),
1202*61046927SAndroid Build Coastguard Worker
1203*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceLineRasterizationPropertiesEXT */
1204*61046927SAndroid Build Coastguard Worker .lineSubPixelPrecisionBits = V3D_COORD_SHIFT,
1205*61046927SAndroid Build Coastguard Worker
1206*61046927SAndroid Build Coastguard Worker /* VkPhysicalDevicePipelineRobustnessPropertiesEXT */
1207*61046927SAndroid Build Coastguard Worker .defaultRobustnessStorageBuffers =
1208*61046927SAndroid Build Coastguard Worker VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT,
1209*61046927SAndroid Build Coastguard Worker .defaultRobustnessUniformBuffers =
1210*61046927SAndroid Build Coastguard Worker VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT,
1211*61046927SAndroid Build Coastguard Worker .defaultRobustnessVertexInputs =
1212*61046927SAndroid Build Coastguard Worker VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT,
1213*61046927SAndroid Build Coastguard Worker .defaultRobustnessImages =
1214*61046927SAndroid Build Coastguard Worker VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT,
1215*61046927SAndroid Build Coastguard Worker
1216*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceMultiDrawPropertiesEXT */
1217*61046927SAndroid Build Coastguard Worker .maxMultiDrawCount = 2048,
1218*61046927SAndroid Build Coastguard Worker
1219*61046927SAndroid Build Coastguard Worker /* VkPhysicalDevicePCIBusInfoPropertiesEXT is not supported
1220*61046927SAndroid Build Coastguard Worker * and is left unfilled
1221*61046927SAndroid Build Coastguard Worker */
1222*61046927SAndroid Build Coastguard Worker
1223*61046927SAndroid Build Coastguard Worker /* VK_EXT_subgroup_size_control */
1224*61046927SAndroid Build Coastguard Worker .minSubgroupSize = V3D_CHANNELS,
1225*61046927SAndroid Build Coastguard Worker .maxSubgroupSize = V3D_CHANNELS,
1226*61046927SAndroid Build Coastguard Worker .maxComputeWorkgroupSubgroups = 16, /* 256 / 16 */
1227*61046927SAndroid Build Coastguard Worker .requiredSubgroupSizeStages = VK_SHADER_STAGE_COMPUTE_BIT,
1228*61046927SAndroid Build Coastguard Worker
1229*61046927SAndroid Build Coastguard Worker .subgroupSupportedOperations = subgroup_ops,
1230*61046927SAndroid Build Coastguard Worker
1231*61046927SAndroid Build Coastguard Worker /* VK_KHR_maintenance5 */
1232*61046927SAndroid Build Coastguard Worker .earlyFragmentMultisampleCoverageAfterSampleCounting = true,
1233*61046927SAndroid Build Coastguard Worker .earlyFragmentSampleMaskTestBeforeSampleCounting = true,
1234*61046927SAndroid Build Coastguard Worker .depthStencilSwizzleOneSupport = true,
1235*61046927SAndroid Build Coastguard Worker .polygonModePointSize = true,
1236*61046927SAndroid Build Coastguard Worker .nonStrictSinglePixelWideLinesUseParallelogram = true,
1237*61046927SAndroid Build Coastguard Worker .nonStrictWideLinesUseParallelogram = true,
1238*61046927SAndroid Build Coastguard Worker };
1239*61046927SAndroid Build Coastguard Worker
1240*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT */
1241*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(vk_shaderModuleIdentifierAlgorithmUUID) ==
1242*61046927SAndroid Build Coastguard Worker sizeof(properties->shaderModuleIdentifierAlgorithmUUID));
1243*61046927SAndroid Build Coastguard Worker memcpy(properties->shaderModuleIdentifierAlgorithmUUID,
1244*61046927SAndroid Build Coastguard Worker vk_shaderModuleIdentifierAlgorithmUUID,
1245*61046927SAndroid Build Coastguard Worker sizeof(properties->shaderModuleIdentifierAlgorithmUUID));
1246*61046927SAndroid Build Coastguard Worker
1247*61046927SAndroid Build Coastguard Worker /* VkPhysicalDeviceProperties */
1248*61046927SAndroid Build Coastguard Worker snprintf(properties->deviceName, sizeof(properties->deviceName),
1249*61046927SAndroid Build Coastguard Worker "%s", device->name);
1250*61046927SAndroid Build Coastguard Worker memcpy(properties->pipelineCacheUUID,
1251*61046927SAndroid Build Coastguard Worker device->pipeline_cache_uuid, VK_UUID_SIZE);
1252*61046927SAndroid Build Coastguard Worker
1253*61046927SAndroid Build Coastguard Worker /* Vulkan 1.1 properties */
1254*61046927SAndroid Build Coastguard Worker memcpy(properties->deviceUUID, device->device_uuid, VK_UUID_SIZE);
1255*61046927SAndroid Build Coastguard Worker memcpy(properties->driverUUID, device->driver_uuid, VK_UUID_SIZE);
1256*61046927SAndroid Build Coastguard Worker
1257*61046927SAndroid Build Coastguard Worker /* Vulkan 1.2 properties */
1258*61046927SAndroid Build Coastguard Worker memset(properties->driverName, 0, VK_MAX_DRIVER_NAME_SIZE);
1259*61046927SAndroid Build Coastguard Worker snprintf(properties->driverName, VK_MAX_DRIVER_NAME_SIZE, "V3DV Mesa");
1260*61046927SAndroid Build Coastguard Worker memset(properties->driverInfo, 0, VK_MAX_DRIVER_INFO_SIZE);
1261*61046927SAndroid Build Coastguard Worker snprintf(properties->driverInfo, VK_MAX_DRIVER_INFO_SIZE,
1262*61046927SAndroid Build Coastguard Worker "Mesa " PACKAGE_VERSION MESA_GIT_SHA1);
1263*61046927SAndroid Build Coastguard Worker
1264*61046927SAndroid Build Coastguard Worker }
1265*61046927SAndroid Build Coastguard Worker
1266*61046927SAndroid Build Coastguard Worker static VkResult
create_physical_device(struct v3dv_instance * instance,drmDevicePtr gpu_device,drmDevicePtr display_device)1267*61046927SAndroid Build Coastguard Worker create_physical_device(struct v3dv_instance *instance,
1268*61046927SAndroid Build Coastguard Worker drmDevicePtr gpu_device,
1269*61046927SAndroid Build Coastguard Worker drmDevicePtr display_device)
1270*61046927SAndroid Build Coastguard Worker {
1271*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
1272*61046927SAndroid Build Coastguard Worker int32_t display_fd = -1;
1273*61046927SAndroid Build Coastguard Worker int32_t render_fd = -1;
1274*61046927SAndroid Build Coastguard Worker
1275*61046927SAndroid Build Coastguard Worker struct v3dv_physical_device *device =
1276*61046927SAndroid Build Coastguard Worker vk_zalloc(&instance->vk.alloc, sizeof(*device), 8,
1277*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
1278*61046927SAndroid Build Coastguard Worker
1279*61046927SAndroid Build Coastguard Worker if (!device)
1280*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
1281*61046927SAndroid Build Coastguard Worker
1282*61046927SAndroid Build Coastguard Worker struct vk_physical_device_dispatch_table dispatch_table;
1283*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints
1284*61046927SAndroid Build Coastguard Worker (&dispatch_table, &v3dv_physical_device_entrypoints, true);
1285*61046927SAndroid Build Coastguard Worker vk_physical_device_dispatch_table_from_entrypoints(
1286*61046927SAndroid Build Coastguard Worker &dispatch_table, &wsi_physical_device_entrypoints, false);
1287*61046927SAndroid Build Coastguard Worker
1288*61046927SAndroid Build Coastguard Worker result = vk_physical_device_init(&device->vk, &instance->vk, NULL, NULL,
1289*61046927SAndroid Build Coastguard Worker NULL, &dispatch_table);
1290*61046927SAndroid Build Coastguard Worker
1291*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1292*61046927SAndroid Build Coastguard Worker goto fail;
1293*61046927SAndroid Build Coastguard Worker
1294*61046927SAndroid Build Coastguard Worker assert(gpu_device);
1295*61046927SAndroid Build Coastguard Worker const char *path = gpu_device->nodes[DRM_NODE_RENDER];
1296*61046927SAndroid Build Coastguard Worker render_fd = open(path, O_RDWR | O_CLOEXEC);
1297*61046927SAndroid Build Coastguard Worker if (render_fd < 0) {
1298*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Opening %s failed: %s\n", path, strerror(errno));
1299*61046927SAndroid Build Coastguard Worker result = VK_ERROR_INITIALIZATION_FAILED;
1300*61046927SAndroid Build Coastguard Worker goto fail;
1301*61046927SAndroid Build Coastguard Worker }
1302*61046927SAndroid Build Coastguard Worker
1303*61046927SAndroid Build Coastguard Worker /* If we are running on VK_KHR_display we need to acquire the master
1304*61046927SAndroid Build Coastguard Worker * display device now for the v3dv_wsi_init() call below. For anything else
1305*61046927SAndroid Build Coastguard Worker * we postpone that until a swapchain is created.
1306*61046927SAndroid Build Coastguard Worker */
1307*61046927SAndroid Build Coastguard Worker
1308*61046927SAndroid Build Coastguard Worker const char *primary_path;
1309*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
1310*61046927SAndroid Build Coastguard Worker if (display_device)
1311*61046927SAndroid Build Coastguard Worker primary_path = display_device->nodes[DRM_NODE_PRIMARY];
1312*61046927SAndroid Build Coastguard Worker else
1313*61046927SAndroid Build Coastguard Worker primary_path = NULL;
1314*61046927SAndroid Build Coastguard Worker #else
1315*61046927SAndroid Build Coastguard Worker primary_path = gpu_device->nodes[DRM_NODE_PRIMARY];
1316*61046927SAndroid Build Coastguard Worker #endif
1317*61046927SAndroid Build Coastguard Worker
1318*61046927SAndroid Build Coastguard Worker struct stat primary_stat = {0}, render_stat = {0};
1319*61046927SAndroid Build Coastguard Worker
1320*61046927SAndroid Build Coastguard Worker device->has_primary = primary_path;
1321*61046927SAndroid Build Coastguard Worker if (device->has_primary) {
1322*61046927SAndroid Build Coastguard Worker if (stat(primary_path, &primary_stat) != 0) {
1323*61046927SAndroid Build Coastguard Worker result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1324*61046927SAndroid Build Coastguard Worker "failed to stat DRM primary node %s",
1325*61046927SAndroid Build Coastguard Worker primary_path);
1326*61046927SAndroid Build Coastguard Worker goto fail;
1327*61046927SAndroid Build Coastguard Worker }
1328*61046927SAndroid Build Coastguard Worker
1329*61046927SAndroid Build Coastguard Worker device->primary_devid = primary_stat.st_rdev;
1330*61046927SAndroid Build Coastguard Worker }
1331*61046927SAndroid Build Coastguard Worker
1332*61046927SAndroid Build Coastguard Worker if (fstat(render_fd, &render_stat) != 0) {
1333*61046927SAndroid Build Coastguard Worker result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1334*61046927SAndroid Build Coastguard Worker "failed to stat DRM render node %s",
1335*61046927SAndroid Build Coastguard Worker path);
1336*61046927SAndroid Build Coastguard Worker goto fail;
1337*61046927SAndroid Build Coastguard Worker }
1338*61046927SAndroid Build Coastguard Worker device->has_render = true;
1339*61046927SAndroid Build Coastguard Worker device->render_devid = render_stat.st_rdev;
1340*61046927SAndroid Build Coastguard Worker
1341*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
1342*61046927SAndroid Build Coastguard Worker device->device_id = gpu_device->deviceinfo.pci->device_id;
1343*61046927SAndroid Build Coastguard Worker #endif
1344*61046927SAndroid Build Coastguard Worker
1345*61046927SAndroid Build Coastguard Worker if (instance->vk.enabled_extensions.KHR_display ||
1346*61046927SAndroid Build Coastguard Worker instance->vk.enabled_extensions.KHR_xcb_surface ||
1347*61046927SAndroid Build Coastguard Worker instance->vk.enabled_extensions.KHR_xlib_surface ||
1348*61046927SAndroid Build Coastguard Worker instance->vk.enabled_extensions.KHR_wayland_surface ||
1349*61046927SAndroid Build Coastguard Worker instance->vk.enabled_extensions.EXT_acquire_drm_display) {
1350*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
1351*61046927SAndroid Build Coastguard Worker /* Open the primary node on the vc4 display device */
1352*61046927SAndroid Build Coastguard Worker assert(display_device);
1353*61046927SAndroid Build Coastguard Worker display_fd = open(primary_path, O_RDWR | O_CLOEXEC);
1354*61046927SAndroid Build Coastguard Worker #else
1355*61046927SAndroid Build Coastguard Worker /* There is only one device with primary and render nodes.
1356*61046927SAndroid Build Coastguard Worker * Open its primary node.
1357*61046927SAndroid Build Coastguard Worker */
1358*61046927SAndroid Build Coastguard Worker display_fd = open(primary_path, O_RDWR | O_CLOEXEC);
1359*61046927SAndroid Build Coastguard Worker #endif
1360*61046927SAndroid Build Coastguard Worker }
1361*61046927SAndroid Build Coastguard Worker
1362*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
1363*61046927SAndroid Build Coastguard Worker device->sim_file = v3d_simulator_init(render_fd);
1364*61046927SAndroid Build Coastguard Worker #endif
1365*61046927SAndroid Build Coastguard Worker
1366*61046927SAndroid Build Coastguard Worker device->render_fd = render_fd; /* The v3d render node */
1367*61046927SAndroid Build Coastguard Worker device->display_fd = display_fd; /* Master vc4 primary node */
1368*61046927SAndroid Build Coastguard Worker
1369*61046927SAndroid Build Coastguard Worker if (!v3d_get_device_info(device->render_fd, &device->devinfo, &v3dv_ioctl)) {
1370*61046927SAndroid Build Coastguard Worker result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1371*61046927SAndroid Build Coastguard Worker "Failed to get info from device.");
1372*61046927SAndroid Build Coastguard Worker goto fail;
1373*61046927SAndroid Build Coastguard Worker }
1374*61046927SAndroid Build Coastguard Worker
1375*61046927SAndroid Build Coastguard Worker if (device->devinfo.ver < 42) {
1376*61046927SAndroid Build Coastguard Worker result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1377*61046927SAndroid Build Coastguard Worker "Device version < 42.");
1378*61046927SAndroid Build Coastguard Worker goto fail;
1379*61046927SAndroid Build Coastguard Worker }
1380*61046927SAndroid Build Coastguard Worker
1381*61046927SAndroid Build Coastguard Worker device->caps.cpu_queue =
1382*61046927SAndroid Build Coastguard Worker v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_CPU_QUEUE);
1383*61046927SAndroid Build Coastguard Worker
1384*61046927SAndroid Build Coastguard Worker device->caps.multisync =
1385*61046927SAndroid Build Coastguard Worker v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT);
1386*61046927SAndroid Build Coastguard Worker
1387*61046927SAndroid Build Coastguard Worker device->caps.perfmon =
1388*61046927SAndroid Build Coastguard Worker v3d_has_feature(device, DRM_V3D_PARAM_SUPPORTS_PERFMON);
1389*61046927SAndroid Build Coastguard Worker
1390*61046927SAndroid Build Coastguard Worker if (!device_has_expected_features(device)) {
1391*61046927SAndroid Build Coastguard Worker result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
1392*61046927SAndroid Build Coastguard Worker "Kernel driver doesn't have required features.");
1393*61046927SAndroid Build Coastguard Worker goto fail;
1394*61046927SAndroid Build Coastguard Worker }
1395*61046927SAndroid Build Coastguard Worker
1396*61046927SAndroid Build Coastguard Worker result = init_uuids(device);
1397*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1398*61046927SAndroid Build Coastguard Worker goto fail;
1399*61046927SAndroid Build Coastguard Worker
1400*61046927SAndroid Build Coastguard Worker device->compiler = v3d_compiler_init(&device->devinfo,
1401*61046927SAndroid Build Coastguard Worker MAX_INLINE_UNIFORM_BUFFERS);
1402*61046927SAndroid Build Coastguard Worker device->next_program_id = 0;
1403*61046927SAndroid Build Coastguard Worker
1404*61046927SAndroid Build Coastguard Worker ASSERTED int len =
1405*61046927SAndroid Build Coastguard Worker asprintf(&device->name, "V3D %d.%d.%d.%d",
1406*61046927SAndroid Build Coastguard Worker device->devinfo.ver / 10,
1407*61046927SAndroid Build Coastguard Worker device->devinfo.ver % 10,
1408*61046927SAndroid Build Coastguard Worker device->devinfo.rev,
1409*61046927SAndroid Build Coastguard Worker device->devinfo.compat_rev);
1410*61046927SAndroid Build Coastguard Worker assert(len != -1);
1411*61046927SAndroid Build Coastguard Worker
1412*61046927SAndroid Build Coastguard Worker v3dv_physical_device_init_disk_cache(device);
1413*61046927SAndroid Build Coastguard Worker
1414*61046927SAndroid Build Coastguard Worker /* Setup available memory heaps and types */
1415*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties *mem = &device->memory;
1416*61046927SAndroid Build Coastguard Worker mem->memoryHeapCount = 1;
1417*61046927SAndroid Build Coastguard Worker mem->memoryHeaps[0].size = compute_heap_size();
1418*61046927SAndroid Build Coastguard Worker mem->memoryHeaps[0].flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
1419*61046927SAndroid Build Coastguard Worker
1420*61046927SAndroid Build Coastguard Worker /* This is the only combination required by the spec */
1421*61046927SAndroid Build Coastguard Worker mem->memoryTypeCount = 1;
1422*61046927SAndroid Build Coastguard Worker mem->memoryTypes[0].propertyFlags =
1423*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1424*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
1425*61046927SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
1426*61046927SAndroid Build Coastguard Worker mem->memoryTypes[0].heapIndex = 0;
1427*61046927SAndroid Build Coastguard Worker
1428*61046927SAndroid Build Coastguard Worker /* Initialize sparse array for refcounting imported BOs */
1429*61046927SAndroid Build Coastguard Worker util_sparse_array_init(&device->bo_map, sizeof(struct v3dv_bo), 512);
1430*61046927SAndroid Build Coastguard Worker
1431*61046927SAndroid Build Coastguard Worker device->options.merge_jobs = !V3D_DBG(NO_MERGE_JOBS);
1432*61046927SAndroid Build Coastguard Worker
1433*61046927SAndroid Build Coastguard Worker device->drm_syncobj_type = vk_drm_syncobj_get_type(device->render_fd);
1434*61046927SAndroid Build Coastguard Worker
1435*61046927SAndroid Build Coastguard Worker /* We don't support timelines in the uAPI yet and we don't want it getting
1436*61046927SAndroid Build Coastguard Worker * suddenly turned on by vk_drm_syncobj_get_type() without us adding v3dv
1437*61046927SAndroid Build Coastguard Worker * code for it first.
1438*61046927SAndroid Build Coastguard Worker */
1439*61046927SAndroid Build Coastguard Worker device->drm_syncobj_type.features &= ~VK_SYNC_FEATURE_TIMELINE;
1440*61046927SAndroid Build Coastguard Worker
1441*61046927SAndroid Build Coastguard Worker /* Multiwait is required for emulated timeline semaphores and is supported
1442*61046927SAndroid Build Coastguard Worker * by the v3d kernel interface.
1443*61046927SAndroid Build Coastguard Worker */
1444*61046927SAndroid Build Coastguard Worker device->drm_syncobj_type.features |= VK_SYNC_FEATURE_GPU_MULTI_WAIT;
1445*61046927SAndroid Build Coastguard Worker
1446*61046927SAndroid Build Coastguard Worker device->sync_timeline_type =
1447*61046927SAndroid Build Coastguard Worker vk_sync_timeline_get_type(&device->drm_syncobj_type);
1448*61046927SAndroid Build Coastguard Worker
1449*61046927SAndroid Build Coastguard Worker device->sync_types[0] = &device->drm_syncobj_type;
1450*61046927SAndroid Build Coastguard Worker device->sync_types[1] = &device->sync_timeline_type.sync;
1451*61046927SAndroid Build Coastguard Worker device->sync_types[2] = NULL;
1452*61046927SAndroid Build Coastguard Worker device->vk.supported_sync_types = device->sync_types;
1453*61046927SAndroid Build Coastguard Worker
1454*61046927SAndroid Build Coastguard Worker get_device_extensions(device, &device->vk.supported_extensions);
1455*61046927SAndroid Build Coastguard Worker get_features(device, &device->vk.supported_features);
1456*61046927SAndroid Build Coastguard Worker get_device_properties(device, &device->vk.properties);
1457*61046927SAndroid Build Coastguard Worker
1458*61046927SAndroid Build Coastguard Worker result = v3dv_wsi_init(device);
1459*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1460*61046927SAndroid Build Coastguard Worker vk_error(instance, result);
1461*61046927SAndroid Build Coastguard Worker goto fail;
1462*61046927SAndroid Build Coastguard Worker }
1463*61046927SAndroid Build Coastguard Worker
1464*61046927SAndroid Build Coastguard Worker mtx_init(&device->mutex, mtx_plain);
1465*61046927SAndroid Build Coastguard Worker
1466*61046927SAndroid Build Coastguard Worker list_addtail(&device->vk.link, &instance->vk.physical_devices.list);
1467*61046927SAndroid Build Coastguard Worker
1468*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1469*61046927SAndroid Build Coastguard Worker
1470*61046927SAndroid Build Coastguard Worker fail:
1471*61046927SAndroid Build Coastguard Worker vk_physical_device_finish(&device->vk);
1472*61046927SAndroid Build Coastguard Worker vk_free(&instance->vk.alloc, device);
1473*61046927SAndroid Build Coastguard Worker
1474*61046927SAndroid Build Coastguard Worker if (render_fd >= 0)
1475*61046927SAndroid Build Coastguard Worker close(render_fd);
1476*61046927SAndroid Build Coastguard Worker if (display_fd >= 0)
1477*61046927SAndroid Build Coastguard Worker close(display_fd);
1478*61046927SAndroid Build Coastguard Worker
1479*61046927SAndroid Build Coastguard Worker return result;
1480*61046927SAndroid Build Coastguard Worker }
1481*61046927SAndroid Build Coastguard Worker
1482*61046927SAndroid Build Coastguard Worker /* This driver hook is expected to return VK_SUCCESS (unless a memory
1483*61046927SAndroid Build Coastguard Worker * allocation error happened) if no compatible device is found. If a
1484*61046927SAndroid Build Coastguard Worker * compatible device is found, it may return an error code if device
1485*61046927SAndroid Build Coastguard Worker * inialization failed.
1486*61046927SAndroid Build Coastguard Worker */
1487*61046927SAndroid Build Coastguard Worker static VkResult
enumerate_devices(struct vk_instance * vk_instance)1488*61046927SAndroid Build Coastguard Worker enumerate_devices(struct vk_instance *vk_instance)
1489*61046927SAndroid Build Coastguard Worker {
1490*61046927SAndroid Build Coastguard Worker struct v3dv_instance *instance =
1491*61046927SAndroid Build Coastguard Worker container_of(vk_instance, struct v3dv_instance, vk);
1492*61046927SAndroid Build Coastguard Worker
1493*61046927SAndroid Build Coastguard Worker /* FIXME: Check for more devices? */
1494*61046927SAndroid Build Coastguard Worker drmDevicePtr devices[8];
1495*61046927SAndroid Build Coastguard Worker int max_devices;
1496*61046927SAndroid Build Coastguard Worker
1497*61046927SAndroid Build Coastguard Worker max_devices = drmGetDevices2(0, devices, ARRAY_SIZE(devices));
1498*61046927SAndroid Build Coastguard Worker if (max_devices < 1)
1499*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1500*61046927SAndroid Build Coastguard Worker
1501*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
1502*61046927SAndroid Build Coastguard Worker
1503*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
1504*61046927SAndroid Build Coastguard Worker int32_t v3d_idx = -1;
1505*61046927SAndroid Build Coastguard Worker int32_t vc4_idx = -1;
1506*61046927SAndroid Build Coastguard Worker #endif
1507*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < (unsigned)max_devices; i++) {
1508*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
1509*61046927SAndroid Build Coastguard Worker /* In the simulator, we look for an Intel/AMD render node */
1510*61046927SAndroid Build Coastguard Worker const int required_nodes = (1 << DRM_NODE_RENDER) | (1 << DRM_NODE_PRIMARY);
1511*61046927SAndroid Build Coastguard Worker if ((devices[i]->available_nodes & required_nodes) == required_nodes &&
1512*61046927SAndroid Build Coastguard Worker devices[i]->bustype == DRM_BUS_PCI &&
1513*61046927SAndroid Build Coastguard Worker (devices[i]->deviceinfo.pci->vendor_id == 0x8086 ||
1514*61046927SAndroid Build Coastguard Worker devices[i]->deviceinfo.pci->vendor_id == 0x1002)) {
1515*61046927SAndroid Build Coastguard Worker result = create_physical_device(instance, devices[i], NULL);
1516*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS)
1517*61046927SAndroid Build Coastguard Worker break;
1518*61046927SAndroid Build Coastguard Worker }
1519*61046927SAndroid Build Coastguard Worker #else
1520*61046927SAndroid Build Coastguard Worker /* On actual hardware, we should have a gpu device (v3d) and a display
1521*61046927SAndroid Build Coastguard Worker * device (vc4). We will need to use the display device to allocate WSI
1522*61046927SAndroid Build Coastguard Worker * buffers and share them with the render node via prime, but that is a
1523*61046927SAndroid Build Coastguard Worker * privileged operation so we need t have an authenticated display fd
1524*61046927SAndroid Build Coastguard Worker * and for that we need the display server to provide the it (with DRI3),
1525*61046927SAndroid Build Coastguard Worker * so here we only check that the device is present but we don't try to
1526*61046927SAndroid Build Coastguard Worker * open it.
1527*61046927SAndroid Build Coastguard Worker */
1528*61046927SAndroid Build Coastguard Worker if (devices[i]->bustype != DRM_BUS_PLATFORM)
1529*61046927SAndroid Build Coastguard Worker continue;
1530*61046927SAndroid Build Coastguard Worker
1531*61046927SAndroid Build Coastguard Worker if (devices[i]->available_nodes & 1 << DRM_NODE_RENDER) {
1532*61046927SAndroid Build Coastguard Worker char **compat = devices[i]->deviceinfo.platform->compatible;
1533*61046927SAndroid Build Coastguard Worker while (*compat) {
1534*61046927SAndroid Build Coastguard Worker if (strncmp(*compat, "brcm,2711-v3d", 13) == 0 ||
1535*61046927SAndroid Build Coastguard Worker strncmp(*compat, "brcm,2712-v3d", 13) == 0) {
1536*61046927SAndroid Build Coastguard Worker v3d_idx = i;
1537*61046927SAndroid Build Coastguard Worker break;
1538*61046927SAndroid Build Coastguard Worker }
1539*61046927SAndroid Build Coastguard Worker compat++;
1540*61046927SAndroid Build Coastguard Worker }
1541*61046927SAndroid Build Coastguard Worker } else if (devices[i]->available_nodes & 1 << DRM_NODE_PRIMARY) {
1542*61046927SAndroid Build Coastguard Worker char **compat = devices[i]->deviceinfo.platform->compatible;
1543*61046927SAndroid Build Coastguard Worker while (*compat) {
1544*61046927SAndroid Build Coastguard Worker if (strncmp(*compat, "brcm,bcm2712-vc6", 16) == 0 ||
1545*61046927SAndroid Build Coastguard Worker strncmp(*compat, "brcm,bcm2711-vc5", 16) == 0 ||
1546*61046927SAndroid Build Coastguard Worker strncmp(*compat, "brcm,bcm2835-vc4", 16) == 0) {
1547*61046927SAndroid Build Coastguard Worker vc4_idx = i;
1548*61046927SAndroid Build Coastguard Worker break;
1549*61046927SAndroid Build Coastguard Worker }
1550*61046927SAndroid Build Coastguard Worker compat++;
1551*61046927SAndroid Build Coastguard Worker }
1552*61046927SAndroid Build Coastguard Worker }
1553*61046927SAndroid Build Coastguard Worker #endif
1554*61046927SAndroid Build Coastguard Worker }
1555*61046927SAndroid Build Coastguard Worker
1556*61046927SAndroid Build Coastguard Worker #if !USE_V3D_SIMULATOR
1557*61046927SAndroid Build Coastguard Worker if (v3d_idx != -1) {
1558*61046927SAndroid Build Coastguard Worker drmDevicePtr v3d_device = devices[v3d_idx];
1559*61046927SAndroid Build Coastguard Worker drmDevicePtr vc4_device = vc4_idx != -1 ? devices[vc4_idx] : NULL;
1560*61046927SAndroid Build Coastguard Worker result = create_physical_device(instance, v3d_device, vc4_device);
1561*61046927SAndroid Build Coastguard Worker }
1562*61046927SAndroid Build Coastguard Worker #endif
1563*61046927SAndroid Build Coastguard Worker
1564*61046927SAndroid Build Coastguard Worker drmFreeDevices(devices, max_devices);
1565*61046927SAndroid Build Coastguard Worker
1566*61046927SAndroid Build Coastguard Worker return result;
1567*61046927SAndroid Build Coastguard Worker }
1568*61046927SAndroid Build Coastguard Worker
1569*61046927SAndroid Build Coastguard Worker uint32_t
v3dv_physical_device_vendor_id(const struct v3dv_physical_device * dev)1570*61046927SAndroid Build Coastguard Worker v3dv_physical_device_vendor_id(const struct v3dv_physical_device *dev)
1571*61046927SAndroid Build Coastguard Worker {
1572*61046927SAndroid Build Coastguard Worker return 0x14E4; /* Broadcom */
1573*61046927SAndroid Build Coastguard Worker }
1574*61046927SAndroid Build Coastguard Worker
1575*61046927SAndroid Build Coastguard Worker uint32_t
v3dv_physical_device_device_id(const struct v3dv_physical_device * dev)1576*61046927SAndroid Build Coastguard Worker v3dv_physical_device_device_id(const struct v3dv_physical_device *dev)
1577*61046927SAndroid Build Coastguard Worker {
1578*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
1579*61046927SAndroid Build Coastguard Worker return dev->device_id;
1580*61046927SAndroid Build Coastguard Worker #else
1581*61046927SAndroid Build Coastguard Worker switch (dev->devinfo.ver) {
1582*61046927SAndroid Build Coastguard Worker case 42:
1583*61046927SAndroid Build Coastguard Worker return 0xBE485FD3; /* Broadcom deviceID for 2711 */
1584*61046927SAndroid Build Coastguard Worker case 71:
1585*61046927SAndroid Build Coastguard Worker return 0x55701C33; /* Broadcom deviceID for 2712 */
1586*61046927SAndroid Build Coastguard Worker default:
1587*61046927SAndroid Build Coastguard Worker unreachable("Unsupported V3D version");
1588*61046927SAndroid Build Coastguard Worker }
1589*61046927SAndroid Build Coastguard Worker #endif
1590*61046927SAndroid Build Coastguard Worker }
1591*61046927SAndroid Build Coastguard Worker
1592*61046927SAndroid Build Coastguard Worker /* We support exactly one queue family. */
1593*61046927SAndroid Build Coastguard Worker static const VkQueueFamilyProperties
1594*61046927SAndroid Build Coastguard Worker v3dv_queue_family_properties = {
1595*61046927SAndroid Build Coastguard Worker .queueFlags = VK_QUEUE_GRAPHICS_BIT |
1596*61046927SAndroid Build Coastguard Worker VK_QUEUE_COMPUTE_BIT |
1597*61046927SAndroid Build Coastguard Worker VK_QUEUE_TRANSFER_BIT,
1598*61046927SAndroid Build Coastguard Worker .queueCount = 1,
1599*61046927SAndroid Build Coastguard Worker .timestampValidBits = 64,
1600*61046927SAndroid Build Coastguard Worker .minImageTransferGranularity = { 1, 1, 1 },
1601*61046927SAndroid Build Coastguard Worker };
1602*61046927SAndroid Build Coastguard Worker
1603*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties)1604*61046927SAndroid Build Coastguard Worker v3dv_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,
1605*61046927SAndroid Build Coastguard Worker uint32_t *pQueueFamilyPropertyCount,
1606*61046927SAndroid Build Coastguard Worker VkQueueFamilyProperties2 *pQueueFamilyProperties)
1607*61046927SAndroid Build Coastguard Worker {
1608*61046927SAndroid Build Coastguard Worker VK_OUTARRAY_MAKE_TYPED(VkQueueFamilyProperties2, out,
1609*61046927SAndroid Build Coastguard Worker pQueueFamilyProperties, pQueueFamilyPropertyCount);
1610*61046927SAndroid Build Coastguard Worker
1611*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkQueueFamilyProperties2, &out, p) {
1612*61046927SAndroid Build Coastguard Worker p->queueFamilyProperties = v3dv_queue_family_properties;
1613*61046927SAndroid Build Coastguard Worker
1614*61046927SAndroid Build Coastguard Worker vk_foreach_struct(s, p->pNext) {
1615*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(s->sType);
1616*61046927SAndroid Build Coastguard Worker }
1617*61046927SAndroid Build Coastguard Worker }
1618*61046927SAndroid Build Coastguard Worker }
1619*61046927SAndroid Build Coastguard Worker
1620*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties * pMemoryProperties)1621*61046927SAndroid Build Coastguard Worker v3dv_GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1622*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties *pMemoryProperties)
1623*61046927SAndroid Build Coastguard Worker {
1624*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_physical_device, device, physicalDevice);
1625*61046927SAndroid Build Coastguard Worker *pMemoryProperties = device->memory;
1626*61046927SAndroid Build Coastguard Worker }
1627*61046927SAndroid Build Coastguard Worker
1628*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties2 * pMemoryProperties)1629*61046927SAndroid Build Coastguard Worker v3dv_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,
1630*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties2 *pMemoryProperties)
1631*61046927SAndroid Build Coastguard Worker {
1632*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_physical_device, device, physicalDevice);
1633*61046927SAndroid Build Coastguard Worker
1634*61046927SAndroid Build Coastguard Worker v3dv_GetPhysicalDeviceMemoryProperties(physicalDevice,
1635*61046927SAndroid Build Coastguard Worker &pMemoryProperties->memoryProperties);
1636*61046927SAndroid Build Coastguard Worker
1637*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryProperties->pNext) {
1638*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
1639*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
1640*61046927SAndroid Build Coastguard Worker VkPhysicalDeviceMemoryBudgetPropertiesEXT *p =
1641*61046927SAndroid Build Coastguard Worker (VkPhysicalDeviceMemoryBudgetPropertiesEXT *) ext;
1642*61046927SAndroid Build Coastguard Worker p->heapUsage[0] = device->heap_used;
1643*61046927SAndroid Build Coastguard Worker p->heapBudget[0] = compute_memory_budget(device);
1644*61046927SAndroid Build Coastguard Worker
1645*61046927SAndroid Build Coastguard Worker /* The heapBudget and heapUsage values must be zero for array elements
1646*61046927SAndroid Build Coastguard Worker * greater than or equal to VkPhysicalDeviceMemoryProperties::memoryHeapCount
1647*61046927SAndroid Build Coastguard Worker */
1648*61046927SAndroid Build Coastguard Worker for (unsigned i = 1; i < VK_MAX_MEMORY_HEAPS; i++) {
1649*61046927SAndroid Build Coastguard Worker p->heapBudget[i] = 0u;
1650*61046927SAndroid Build Coastguard Worker p->heapUsage[i] = 0u;
1651*61046927SAndroid Build Coastguard Worker }
1652*61046927SAndroid Build Coastguard Worker break;
1653*61046927SAndroid Build Coastguard Worker }
1654*61046927SAndroid Build Coastguard Worker default:
1655*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
1656*61046927SAndroid Build Coastguard Worker break;
1657*61046927SAndroid Build Coastguard Worker }
1658*61046927SAndroid Build Coastguard Worker }
1659*61046927SAndroid Build Coastguard Worker }
1660*61046927SAndroid Build Coastguard Worker
1661*61046927SAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
v3dv_GetInstanceProcAddr(VkInstance _instance,const char * pName)1662*61046927SAndroid Build Coastguard Worker v3dv_GetInstanceProcAddr(VkInstance _instance,
1663*61046927SAndroid Build Coastguard Worker const char *pName)
1664*61046927SAndroid Build Coastguard Worker {
1665*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_instance, instance, _instance);
1666*61046927SAndroid Build Coastguard Worker return vk_instance_get_proc_addr(instance ? &instance->vk : NULL,
1667*61046927SAndroid Build Coastguard Worker &v3dv_instance_entrypoints,
1668*61046927SAndroid Build Coastguard Worker pName);
1669*61046927SAndroid Build Coastguard Worker }
1670*61046927SAndroid Build Coastguard Worker
1671*61046927SAndroid Build Coastguard Worker /* With version 1+ of the loader interface the ICD should expose
1672*61046927SAndroid Build Coastguard Worker * vk_icdGetInstanceProcAddr to work around certain LD_PRELOAD issues seen in apps.
1673*61046927SAndroid Build Coastguard Worker */
1674*61046927SAndroid Build Coastguard Worker PUBLIC
1675*61046927SAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
vk_icdGetInstanceProcAddr(VkInstance instance,const char * pName)1676*61046927SAndroid Build Coastguard Worker vk_icdGetInstanceProcAddr(VkInstance instance,
1677*61046927SAndroid Build Coastguard Worker const char* pName)
1678*61046927SAndroid Build Coastguard Worker {
1679*61046927SAndroid Build Coastguard Worker return v3dv_GetInstanceProcAddr(instance, pName);
1680*61046927SAndroid Build Coastguard Worker }
1681*61046927SAndroid Build Coastguard Worker
1682*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_EnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)1683*61046927SAndroid Build Coastguard Worker v3dv_EnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
1684*61046927SAndroid Build Coastguard Worker VkLayerProperties *pProperties)
1685*61046927SAndroid Build Coastguard Worker {
1686*61046927SAndroid Build Coastguard Worker if (pProperties == NULL) {
1687*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
1688*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1689*61046927SAndroid Build Coastguard Worker }
1690*61046927SAndroid Build Coastguard Worker
1691*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
1692*61046927SAndroid Build Coastguard Worker }
1693*61046927SAndroid Build Coastguard Worker
1694*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,uint32_t * pPropertyCount,VkLayerProperties * pProperties)1695*61046927SAndroid Build Coastguard Worker v3dv_EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
1696*61046927SAndroid Build Coastguard Worker uint32_t *pPropertyCount,
1697*61046927SAndroid Build Coastguard Worker VkLayerProperties *pProperties)
1698*61046927SAndroid Build Coastguard Worker {
1699*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_physical_device, physical_device, physicalDevice);
1700*61046927SAndroid Build Coastguard Worker
1701*61046927SAndroid Build Coastguard Worker if (pProperties == NULL) {
1702*61046927SAndroid Build Coastguard Worker *pPropertyCount = 0;
1703*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1704*61046927SAndroid Build Coastguard Worker }
1705*61046927SAndroid Build Coastguard Worker
1706*61046927SAndroid Build Coastguard Worker return vk_error(physical_device, VK_ERROR_LAYER_NOT_PRESENT);
1707*61046927SAndroid Build Coastguard Worker }
1708*61046927SAndroid Build Coastguard Worker
1709*61046927SAndroid Build Coastguard Worker static void
destroy_queue_syncs(struct v3dv_queue * queue)1710*61046927SAndroid Build Coastguard Worker destroy_queue_syncs(struct v3dv_queue *queue)
1711*61046927SAndroid Build Coastguard Worker {
1712*61046927SAndroid Build Coastguard Worker for (int i = 0; i < V3DV_QUEUE_COUNT; i++) {
1713*61046927SAndroid Build Coastguard Worker if (queue->last_job_syncs.syncs[i]) {
1714*61046927SAndroid Build Coastguard Worker drmSyncobjDestroy(queue->device->pdevice->render_fd,
1715*61046927SAndroid Build Coastguard Worker queue->last_job_syncs.syncs[i]);
1716*61046927SAndroid Build Coastguard Worker }
1717*61046927SAndroid Build Coastguard Worker }
1718*61046927SAndroid Build Coastguard Worker }
1719*61046927SAndroid Build Coastguard Worker
1720*61046927SAndroid Build Coastguard Worker static VkResult
queue_init(struct v3dv_device * device,struct v3dv_queue * queue,const VkDeviceQueueCreateInfo * create_info,uint32_t index_in_family)1721*61046927SAndroid Build Coastguard Worker queue_init(struct v3dv_device *device, struct v3dv_queue *queue,
1722*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *create_info,
1723*61046927SAndroid Build Coastguard Worker uint32_t index_in_family)
1724*61046927SAndroid Build Coastguard Worker {
1725*61046927SAndroid Build Coastguard Worker VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info,
1726*61046927SAndroid Build Coastguard Worker index_in_family);
1727*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1728*61046927SAndroid Build Coastguard Worker return result;
1729*61046927SAndroid Build Coastguard Worker
1730*61046927SAndroid Build Coastguard Worker result = vk_queue_enable_submit_thread(&queue->vk);
1731*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1732*61046927SAndroid Build Coastguard Worker goto fail_submit_thread;
1733*61046927SAndroid Build Coastguard Worker
1734*61046927SAndroid Build Coastguard Worker queue->device = device;
1735*61046927SAndroid Build Coastguard Worker queue->vk.driver_submit = v3dv_queue_driver_submit;
1736*61046927SAndroid Build Coastguard Worker
1737*61046927SAndroid Build Coastguard Worker for (int i = 0; i < V3DV_QUEUE_COUNT; i++) {
1738*61046927SAndroid Build Coastguard Worker queue->last_job_syncs.first[i] = true;
1739*61046927SAndroid Build Coastguard Worker int ret = drmSyncobjCreate(device->pdevice->render_fd,
1740*61046927SAndroid Build Coastguard Worker DRM_SYNCOBJ_CREATE_SIGNALED,
1741*61046927SAndroid Build Coastguard Worker &queue->last_job_syncs.syncs[i]);
1742*61046927SAndroid Build Coastguard Worker if (ret) {
1743*61046927SAndroid Build Coastguard Worker result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
1744*61046927SAndroid Build Coastguard Worker "syncobj create failed: %m");
1745*61046927SAndroid Build Coastguard Worker goto fail_last_job_syncs;
1746*61046927SAndroid Build Coastguard Worker }
1747*61046927SAndroid Build Coastguard Worker }
1748*61046927SAndroid Build Coastguard Worker
1749*61046927SAndroid Build Coastguard Worker queue->noop_job = NULL;
1750*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1751*61046927SAndroid Build Coastguard Worker
1752*61046927SAndroid Build Coastguard Worker fail_last_job_syncs:
1753*61046927SAndroid Build Coastguard Worker destroy_queue_syncs(queue);
1754*61046927SAndroid Build Coastguard Worker fail_submit_thread:
1755*61046927SAndroid Build Coastguard Worker vk_queue_finish(&queue->vk);
1756*61046927SAndroid Build Coastguard Worker return result;
1757*61046927SAndroid Build Coastguard Worker }
1758*61046927SAndroid Build Coastguard Worker
1759*61046927SAndroid Build Coastguard Worker static void
queue_finish(struct v3dv_queue * queue)1760*61046927SAndroid Build Coastguard Worker queue_finish(struct v3dv_queue *queue)
1761*61046927SAndroid Build Coastguard Worker {
1762*61046927SAndroid Build Coastguard Worker if (queue->noop_job)
1763*61046927SAndroid Build Coastguard Worker v3dv_job_destroy(queue->noop_job);
1764*61046927SAndroid Build Coastguard Worker destroy_queue_syncs(queue);
1765*61046927SAndroid Build Coastguard Worker vk_queue_finish(&queue->vk);
1766*61046927SAndroid Build Coastguard Worker }
1767*61046927SAndroid Build Coastguard Worker
1768*61046927SAndroid Build Coastguard Worker static void
init_device_meta(struct v3dv_device * device)1769*61046927SAndroid Build Coastguard Worker init_device_meta(struct v3dv_device *device)
1770*61046927SAndroid Build Coastguard Worker {
1771*61046927SAndroid Build Coastguard Worker mtx_init(&device->meta.mtx, mtx_plain);
1772*61046927SAndroid Build Coastguard Worker v3dv_meta_clear_init(device);
1773*61046927SAndroid Build Coastguard Worker v3dv_meta_blit_init(device);
1774*61046927SAndroid Build Coastguard Worker v3dv_meta_texel_buffer_copy_init(device);
1775*61046927SAndroid Build Coastguard Worker }
1776*61046927SAndroid Build Coastguard Worker
1777*61046927SAndroid Build Coastguard Worker static void
destroy_device_meta(struct v3dv_device * device)1778*61046927SAndroid Build Coastguard Worker destroy_device_meta(struct v3dv_device *device)
1779*61046927SAndroid Build Coastguard Worker {
1780*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->meta.mtx);
1781*61046927SAndroid Build Coastguard Worker v3dv_meta_clear_finish(device);
1782*61046927SAndroid Build Coastguard Worker v3dv_meta_blit_finish(device);
1783*61046927SAndroid Build Coastguard Worker v3dv_meta_texel_buffer_copy_finish(device);
1784*61046927SAndroid Build Coastguard Worker }
1785*61046927SAndroid Build Coastguard Worker
1786*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_CreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)1787*61046927SAndroid Build Coastguard Worker v3dv_CreateDevice(VkPhysicalDevice physicalDevice,
1788*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *pCreateInfo,
1789*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1790*61046927SAndroid Build Coastguard Worker VkDevice *pDevice)
1791*61046927SAndroid Build Coastguard Worker {
1792*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_physical_device, physical_device, physicalDevice);
1793*61046927SAndroid Build Coastguard Worker struct v3dv_instance *instance = (struct v3dv_instance*) physical_device->vk.instance;
1794*61046927SAndroid Build Coastguard Worker VkResult result;
1795*61046927SAndroid Build Coastguard Worker struct v3dv_device *device;
1796*61046927SAndroid Build Coastguard Worker
1797*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
1798*61046927SAndroid Build Coastguard Worker
1799*61046927SAndroid Build Coastguard Worker /* Check requested queues (we only expose one queue ) */
1800*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->queueCreateInfoCount == 1);
1801*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
1802*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex == 0);
1803*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->pQueueCreateInfos[i].queueCount == 1);
1804*61046927SAndroid Build Coastguard Worker if (pCreateInfo->pQueueCreateInfos[i].flags != 0)
1805*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
1806*61046927SAndroid Build Coastguard Worker }
1807*61046927SAndroid Build Coastguard Worker
1808*61046927SAndroid Build Coastguard Worker device = vk_zalloc2(&physical_device->vk.instance->alloc, pAllocator,
1809*61046927SAndroid Build Coastguard Worker sizeof(*device), 8,
1810*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
1811*61046927SAndroid Build Coastguard Worker if (!device)
1812*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
1813*61046927SAndroid Build Coastguard Worker
1814*61046927SAndroid Build Coastguard Worker struct vk_device_dispatch_table dispatch_table;
1815*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
1816*61046927SAndroid Build Coastguard Worker &v3dv_device_entrypoints, true);
1817*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
1818*61046927SAndroid Build Coastguard Worker &wsi_device_entrypoints, false);
1819*61046927SAndroid Build Coastguard Worker result = vk_device_init(&device->vk, &physical_device->vk,
1820*61046927SAndroid Build Coastguard Worker &dispatch_table, pCreateInfo, pAllocator);
1821*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
1822*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
1823*61046927SAndroid Build Coastguard Worker return vk_error(NULL, result);
1824*61046927SAndroid Build Coastguard Worker }
1825*61046927SAndroid Build Coastguard Worker
1826*61046927SAndroid Build Coastguard Worker device->instance = instance;
1827*61046927SAndroid Build Coastguard Worker device->pdevice = physical_device;
1828*61046927SAndroid Build Coastguard Worker
1829*61046927SAndroid Build Coastguard Worker mtx_init(&device->query_mutex, mtx_plain);
1830*61046927SAndroid Build Coastguard Worker cnd_init(&device->query_ended);
1831*61046927SAndroid Build Coastguard Worker
1832*61046927SAndroid Build Coastguard Worker device->vk.command_buffer_ops = &v3dv_cmd_buffer_ops;
1833*61046927SAndroid Build Coastguard Worker
1834*61046927SAndroid Build Coastguard Worker vk_device_set_drm_fd(&device->vk, physical_device->render_fd);
1835*61046927SAndroid Build Coastguard Worker vk_device_enable_threaded_submit(&device->vk);
1836*61046927SAndroid Build Coastguard Worker
1837*61046927SAndroid Build Coastguard Worker result = queue_init(device, &device->queue,
1838*61046927SAndroid Build Coastguard Worker pCreateInfo->pQueueCreateInfos, 0);
1839*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1840*61046927SAndroid Build Coastguard Worker goto fail;
1841*61046927SAndroid Build Coastguard Worker
1842*61046927SAndroid Build Coastguard Worker device->devinfo = physical_device->devinfo;
1843*61046927SAndroid Build Coastguard Worker
1844*61046927SAndroid Build Coastguard Worker if (device->vk.enabled_features.robustBufferAccess)
1845*61046927SAndroid Build Coastguard Worker perf_debug("Device created with Robust Buffer Access enabled.\n");
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker if (device->vk.enabled_features.robustImageAccess)
1848*61046927SAndroid Build Coastguard Worker perf_debug("Device created with Robust Image Access enabled.\n");
1849*61046927SAndroid Build Coastguard Worker
1850*61046927SAndroid Build Coastguard Worker
1851*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
1852*61046927SAndroid Build Coastguard Worker v3dv_X(device, device_check_prepacked_sizes)();
1853*61046927SAndroid Build Coastguard Worker #endif
1854*61046927SAndroid Build Coastguard Worker init_device_meta(device);
1855*61046927SAndroid Build Coastguard Worker v3dv_bo_cache_init(device);
1856*61046927SAndroid Build Coastguard Worker v3dv_pipeline_cache_init(&device->default_pipeline_cache, device, 0,
1857*61046927SAndroid Build Coastguard Worker device->instance->default_pipeline_cache_enabled);
1858*61046927SAndroid Build Coastguard Worker device->default_attribute_float =
1859*61046927SAndroid Build Coastguard Worker v3dv_X(device, create_default_attribute_values)(device, NULL);
1860*61046927SAndroid Build Coastguard Worker
1861*61046927SAndroid Build Coastguard Worker device->device_address_mem_ctx = ralloc_context(NULL);
1862*61046927SAndroid Build Coastguard Worker util_dynarray_init(&device->device_address_bo_list,
1863*61046927SAndroid Build Coastguard Worker device->device_address_mem_ctx);
1864*61046927SAndroid Build Coastguard Worker
1865*61046927SAndroid Build Coastguard Worker mtx_init(&device->events.lock, mtx_plain);
1866*61046927SAndroid Build Coastguard Worker result = v3dv_event_allocate_resources(device);
1867*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1868*61046927SAndroid Build Coastguard Worker goto fail;
1869*61046927SAndroid Build Coastguard Worker
1870*61046927SAndroid Build Coastguard Worker if (list_is_empty(&device->events.free_list)) {
1871*61046927SAndroid Build Coastguard Worker result = vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1872*61046927SAndroid Build Coastguard Worker goto fail;
1873*61046927SAndroid Build Coastguard Worker }
1874*61046927SAndroid Build Coastguard Worker
1875*61046927SAndroid Build Coastguard Worker result = v3dv_query_allocate_resources(device);
1876*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
1877*61046927SAndroid Build Coastguard Worker goto fail;
1878*61046927SAndroid Build Coastguard Worker
1879*61046927SAndroid Build Coastguard Worker *pDevice = v3dv_device_to_handle(device);
1880*61046927SAndroid Build Coastguard Worker
1881*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1882*61046927SAndroid Build Coastguard Worker
1883*61046927SAndroid Build Coastguard Worker fail:
1884*61046927SAndroid Build Coastguard Worker cnd_destroy(&device->query_ended);
1885*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->query_mutex);
1886*61046927SAndroid Build Coastguard Worker queue_finish(&device->queue);
1887*61046927SAndroid Build Coastguard Worker destroy_device_meta(device);
1888*61046927SAndroid Build Coastguard Worker v3dv_pipeline_cache_finish(&device->default_pipeline_cache);
1889*61046927SAndroid Build Coastguard Worker v3dv_event_free_resources(device);
1890*61046927SAndroid Build Coastguard Worker v3dv_query_free_resources(device);
1891*61046927SAndroid Build Coastguard Worker vk_device_finish(&device->vk);
1892*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, device);
1893*61046927SAndroid Build Coastguard Worker
1894*61046927SAndroid Build Coastguard Worker return result;
1895*61046927SAndroid Build Coastguard Worker }
1896*61046927SAndroid Build Coastguard Worker
1897*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_DestroyDevice(VkDevice _device,const VkAllocationCallbacks * pAllocator)1898*61046927SAndroid Build Coastguard Worker v3dv_DestroyDevice(VkDevice _device,
1899*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1900*61046927SAndroid Build Coastguard Worker {
1901*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
1902*61046927SAndroid Build Coastguard Worker
1903*61046927SAndroid Build Coastguard Worker device->vk.dispatch_table.DeviceWaitIdle(_device);
1904*61046927SAndroid Build Coastguard Worker queue_finish(&device->queue);
1905*61046927SAndroid Build Coastguard Worker
1906*61046927SAndroid Build Coastguard Worker v3dv_event_free_resources(device);
1907*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->events.lock);
1908*61046927SAndroid Build Coastguard Worker
1909*61046927SAndroid Build Coastguard Worker v3dv_query_free_resources(device);
1910*61046927SAndroid Build Coastguard Worker
1911*61046927SAndroid Build Coastguard Worker destroy_device_meta(device);
1912*61046927SAndroid Build Coastguard Worker v3dv_pipeline_cache_finish(&device->default_pipeline_cache);
1913*61046927SAndroid Build Coastguard Worker
1914*61046927SAndroid Build Coastguard Worker if (device->default_attribute_float) {
1915*61046927SAndroid Build Coastguard Worker v3dv_bo_free(device, device->default_attribute_float);
1916*61046927SAndroid Build Coastguard Worker device->default_attribute_float = NULL;
1917*61046927SAndroid Build Coastguard Worker }
1918*61046927SAndroid Build Coastguard Worker
1919*61046927SAndroid Build Coastguard Worker ralloc_free(device->device_address_mem_ctx);
1920*61046927SAndroid Build Coastguard Worker
1921*61046927SAndroid Build Coastguard Worker /* Bo cache should be removed the last, as any other object could be
1922*61046927SAndroid Build Coastguard Worker * freeing their private bos
1923*61046927SAndroid Build Coastguard Worker */
1924*61046927SAndroid Build Coastguard Worker v3dv_bo_cache_destroy(device);
1925*61046927SAndroid Build Coastguard Worker
1926*61046927SAndroid Build Coastguard Worker cnd_destroy(&device->query_ended);
1927*61046927SAndroid Build Coastguard Worker mtx_destroy(&device->query_mutex);
1928*61046927SAndroid Build Coastguard Worker
1929*61046927SAndroid Build Coastguard Worker vk_device_finish(&device->vk);
1930*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, device);
1931*61046927SAndroid Build Coastguard Worker }
1932*61046927SAndroid Build Coastguard Worker
1933*61046927SAndroid Build Coastguard Worker static VkResult
device_alloc(struct v3dv_device * device,struct v3dv_device_memory * mem,VkDeviceSize size)1934*61046927SAndroid Build Coastguard Worker device_alloc(struct v3dv_device *device,
1935*61046927SAndroid Build Coastguard Worker struct v3dv_device_memory *mem,
1936*61046927SAndroid Build Coastguard Worker VkDeviceSize size)
1937*61046927SAndroid Build Coastguard Worker {
1938*61046927SAndroid Build Coastguard Worker /* Our kernel interface is 32-bit */
1939*61046927SAndroid Build Coastguard Worker assert(size <= UINT32_MAX);
1940*61046927SAndroid Build Coastguard Worker
1941*61046927SAndroid Build Coastguard Worker mem->bo = v3dv_bo_alloc(device, size, "device_alloc", false);
1942*61046927SAndroid Build Coastguard Worker if (!mem->bo)
1943*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_DEVICE_MEMORY;
1944*61046927SAndroid Build Coastguard Worker
1945*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1946*61046927SAndroid Build Coastguard Worker }
1947*61046927SAndroid Build Coastguard Worker
1948*61046927SAndroid Build Coastguard Worker static void
device_free_wsi_dumb(int32_t display_fd,int32_t dumb_handle)1949*61046927SAndroid Build Coastguard Worker device_free_wsi_dumb(int32_t display_fd, int32_t dumb_handle)
1950*61046927SAndroid Build Coastguard Worker {
1951*61046927SAndroid Build Coastguard Worker assert(display_fd != -1);
1952*61046927SAndroid Build Coastguard Worker if (dumb_handle < 0)
1953*61046927SAndroid Build Coastguard Worker return;
1954*61046927SAndroid Build Coastguard Worker
1955*61046927SAndroid Build Coastguard Worker struct drm_mode_destroy_dumb destroy_dumb = {
1956*61046927SAndroid Build Coastguard Worker .handle = dumb_handle,
1957*61046927SAndroid Build Coastguard Worker };
1958*61046927SAndroid Build Coastguard Worker if (v3dv_ioctl(display_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb)) {
1959*61046927SAndroid Build Coastguard Worker fprintf(stderr, "destroy dumb object %d: %s\n", dumb_handle, strerror(errno));
1960*61046927SAndroid Build Coastguard Worker }
1961*61046927SAndroid Build Coastguard Worker }
1962*61046927SAndroid Build Coastguard Worker
1963*61046927SAndroid Build Coastguard Worker static void
device_free(struct v3dv_device * device,struct v3dv_device_memory * mem)1964*61046927SAndroid Build Coastguard Worker device_free(struct v3dv_device *device, struct v3dv_device_memory *mem)
1965*61046927SAndroid Build Coastguard Worker {
1966*61046927SAndroid Build Coastguard Worker /* If this memory allocation was for WSI, then we need to use the
1967*61046927SAndroid Build Coastguard Worker * display device to free the allocated dumb BO.
1968*61046927SAndroid Build Coastguard Worker */
1969*61046927SAndroid Build Coastguard Worker if (mem->is_for_wsi) {
1970*61046927SAndroid Build Coastguard Worker device_free_wsi_dumb(device->pdevice->display_fd, mem->bo->dumb_handle);
1971*61046927SAndroid Build Coastguard Worker }
1972*61046927SAndroid Build Coastguard Worker
1973*61046927SAndroid Build Coastguard Worker p_atomic_add(&device->pdevice->heap_used, -((int64_t)mem->bo->size));
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker v3dv_bo_free(device, mem->bo);
1976*61046927SAndroid Build Coastguard Worker }
1977*61046927SAndroid Build Coastguard Worker
1978*61046927SAndroid Build Coastguard Worker static void
device_unmap(struct v3dv_device * device,struct v3dv_device_memory * mem)1979*61046927SAndroid Build Coastguard Worker device_unmap(struct v3dv_device *device, struct v3dv_device_memory *mem)
1980*61046927SAndroid Build Coastguard Worker {
1981*61046927SAndroid Build Coastguard Worker assert(mem && mem->bo->map && mem->bo->map_size > 0);
1982*61046927SAndroid Build Coastguard Worker v3dv_bo_unmap(device, mem->bo);
1983*61046927SAndroid Build Coastguard Worker }
1984*61046927SAndroid Build Coastguard Worker
1985*61046927SAndroid Build Coastguard Worker static VkResult
device_map(struct v3dv_device * device,struct v3dv_device_memory * mem)1986*61046927SAndroid Build Coastguard Worker device_map(struct v3dv_device *device, struct v3dv_device_memory *mem)
1987*61046927SAndroid Build Coastguard Worker {
1988*61046927SAndroid Build Coastguard Worker assert(mem && mem->bo);
1989*61046927SAndroid Build Coastguard Worker
1990*61046927SAndroid Build Coastguard Worker /* From the spec:
1991*61046927SAndroid Build Coastguard Worker *
1992*61046927SAndroid Build Coastguard Worker * "After a successful call to vkMapMemory the memory object memory is
1993*61046927SAndroid Build Coastguard Worker * considered to be currently host mapped. It is an application error to
1994*61046927SAndroid Build Coastguard Worker * call vkMapMemory on a memory object that is already host mapped."
1995*61046927SAndroid Build Coastguard Worker *
1996*61046927SAndroid Build Coastguard Worker * We are not concerned with this ourselves (validation layers should
1997*61046927SAndroid Build Coastguard Worker * catch these errors and warn users), however, the driver may internally
1998*61046927SAndroid Build Coastguard Worker * map things (for example for debug CLIF dumps or some CPU-side operations)
1999*61046927SAndroid Build Coastguard Worker * so by the time the user calls here the buffer might already been mapped
2000*61046927SAndroid Build Coastguard Worker * internally by the driver.
2001*61046927SAndroid Build Coastguard Worker */
2002*61046927SAndroid Build Coastguard Worker if (mem->bo->map) {
2003*61046927SAndroid Build Coastguard Worker assert(mem->bo->map_size == mem->bo->size);
2004*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2005*61046927SAndroid Build Coastguard Worker }
2006*61046927SAndroid Build Coastguard Worker
2007*61046927SAndroid Build Coastguard Worker bool ok = v3dv_bo_map(device, mem->bo, mem->bo->size);
2008*61046927SAndroid Build Coastguard Worker if (!ok)
2009*61046927SAndroid Build Coastguard Worker return VK_ERROR_MEMORY_MAP_FAILED;
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2012*61046927SAndroid Build Coastguard Worker }
2013*61046927SAndroid Build Coastguard Worker
2014*61046927SAndroid Build Coastguard Worker static VkResult
device_import_bo(struct v3dv_device * device,const VkAllocationCallbacks * pAllocator,int fd,uint64_t size,struct v3dv_bo ** bo)2015*61046927SAndroid Build Coastguard Worker device_import_bo(struct v3dv_device *device,
2016*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2017*61046927SAndroid Build Coastguard Worker int fd, uint64_t size,
2018*61046927SAndroid Build Coastguard Worker struct v3dv_bo **bo)
2019*61046927SAndroid Build Coastguard Worker {
2020*61046927SAndroid Build Coastguard Worker *bo = NULL;
2021*61046927SAndroid Build Coastguard Worker
2022*61046927SAndroid Build Coastguard Worker off_t real_size = lseek(fd, 0, SEEK_END);
2023*61046927SAndroid Build Coastguard Worker lseek(fd, 0, SEEK_SET);
2024*61046927SAndroid Build Coastguard Worker if (real_size < 0 || (uint64_t) real_size < size)
2025*61046927SAndroid Build Coastguard Worker return VK_ERROR_INVALID_EXTERNAL_HANDLE;
2026*61046927SAndroid Build Coastguard Worker
2027*61046927SAndroid Build Coastguard Worker int render_fd = device->pdevice->render_fd;
2028*61046927SAndroid Build Coastguard Worker assert(render_fd >= 0);
2029*61046927SAndroid Build Coastguard Worker
2030*61046927SAndroid Build Coastguard Worker int ret;
2031*61046927SAndroid Build Coastguard Worker uint32_t handle;
2032*61046927SAndroid Build Coastguard Worker ret = drmPrimeFDToHandle(render_fd, fd, &handle);
2033*61046927SAndroid Build Coastguard Worker if (ret)
2034*61046927SAndroid Build Coastguard Worker return VK_ERROR_INVALID_EXTERNAL_HANDLE;
2035*61046927SAndroid Build Coastguard Worker
2036*61046927SAndroid Build Coastguard Worker struct drm_v3d_get_bo_offset get_offset = {
2037*61046927SAndroid Build Coastguard Worker .handle = handle,
2038*61046927SAndroid Build Coastguard Worker };
2039*61046927SAndroid Build Coastguard Worker ret = v3dv_ioctl(render_fd, DRM_IOCTL_V3D_GET_BO_OFFSET, &get_offset);
2040*61046927SAndroid Build Coastguard Worker if (ret)
2041*61046927SAndroid Build Coastguard Worker return VK_ERROR_INVALID_EXTERNAL_HANDLE;
2042*61046927SAndroid Build Coastguard Worker assert(get_offset.offset != 0);
2043*61046927SAndroid Build Coastguard Worker
2044*61046927SAndroid Build Coastguard Worker *bo = v3dv_device_lookup_bo(device->pdevice, handle);
2045*61046927SAndroid Build Coastguard Worker assert(*bo);
2046*61046927SAndroid Build Coastguard Worker
2047*61046927SAndroid Build Coastguard Worker if ((*bo)->refcnt == 0)
2048*61046927SAndroid Build Coastguard Worker v3dv_bo_init_import(*bo, handle, size, get_offset.offset, false);
2049*61046927SAndroid Build Coastguard Worker else
2050*61046927SAndroid Build Coastguard Worker p_atomic_inc(&(*bo)->refcnt);
2051*61046927SAndroid Build Coastguard Worker
2052*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2053*61046927SAndroid Build Coastguard Worker }
2054*61046927SAndroid Build Coastguard Worker
2055*61046927SAndroid Build Coastguard Worker static VkResult
device_alloc_for_wsi(struct v3dv_device * device,const VkAllocationCallbacks * pAllocator,struct v3dv_device_memory * mem,VkDeviceSize size)2056*61046927SAndroid Build Coastguard Worker device_alloc_for_wsi(struct v3dv_device *device,
2057*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2058*61046927SAndroid Build Coastguard Worker struct v3dv_device_memory *mem,
2059*61046927SAndroid Build Coastguard Worker VkDeviceSize size)
2060*61046927SAndroid Build Coastguard Worker {
2061*61046927SAndroid Build Coastguard Worker /* In the simulator we can get away with a regular allocation since both
2062*61046927SAndroid Build Coastguard Worker * allocation and rendering happen in the same DRM render node. On actual
2063*61046927SAndroid Build Coastguard Worker * hardware we need to allocate our winsys BOs on the vc4 display device
2064*61046927SAndroid Build Coastguard Worker * and import them into v3d.
2065*61046927SAndroid Build Coastguard Worker */
2066*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
2067*61046927SAndroid Build Coastguard Worker return device_alloc(device, mem, size);
2068*61046927SAndroid Build Coastguard Worker #else
2069*61046927SAndroid Build Coastguard Worker VkResult result;
2070*61046927SAndroid Build Coastguard Worker struct v3dv_physical_device *pdevice = device->pdevice;
2071*61046927SAndroid Build Coastguard Worker assert(pdevice->display_fd != -1);
2072*61046927SAndroid Build Coastguard Worker
2073*61046927SAndroid Build Coastguard Worker mem->is_for_wsi = true;
2074*61046927SAndroid Build Coastguard Worker
2075*61046927SAndroid Build Coastguard Worker int display_fd = pdevice->display_fd;
2076*61046927SAndroid Build Coastguard Worker struct drm_mode_create_dumb create_dumb = {
2077*61046927SAndroid Build Coastguard Worker .width = 1024, /* one page */
2078*61046927SAndroid Build Coastguard Worker .height = align(size, 4096) / 4096,
2079*61046927SAndroid Build Coastguard Worker .bpp = util_format_get_blocksizebits(PIPE_FORMAT_RGBA8888_UNORM),
2080*61046927SAndroid Build Coastguard Worker };
2081*61046927SAndroid Build Coastguard Worker
2082*61046927SAndroid Build Coastguard Worker int err;
2083*61046927SAndroid Build Coastguard Worker err = v3dv_ioctl(display_fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb);
2084*61046927SAndroid Build Coastguard Worker if (err < 0)
2085*61046927SAndroid Build Coastguard Worker goto fail_create;
2086*61046927SAndroid Build Coastguard Worker
2087*61046927SAndroid Build Coastguard Worker int fd;
2088*61046927SAndroid Build Coastguard Worker err =
2089*61046927SAndroid Build Coastguard Worker drmPrimeHandleToFD(display_fd, create_dumb.handle, O_CLOEXEC, &fd);
2090*61046927SAndroid Build Coastguard Worker if (err < 0)
2091*61046927SAndroid Build Coastguard Worker goto fail_export;
2092*61046927SAndroid Build Coastguard Worker
2093*61046927SAndroid Build Coastguard Worker result = device_import_bo(device, pAllocator, fd, size, &mem->bo);
2094*61046927SAndroid Build Coastguard Worker close(fd);
2095*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2096*61046927SAndroid Build Coastguard Worker goto fail_import;
2097*61046927SAndroid Build Coastguard Worker
2098*61046927SAndroid Build Coastguard Worker mem->bo->dumb_handle = create_dumb.handle;
2099*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2100*61046927SAndroid Build Coastguard Worker
2101*61046927SAndroid Build Coastguard Worker fail_import:
2102*61046927SAndroid Build Coastguard Worker fail_export:
2103*61046927SAndroid Build Coastguard Worker device_free_wsi_dumb(display_fd, create_dumb.handle);
2104*61046927SAndroid Build Coastguard Worker
2105*61046927SAndroid Build Coastguard Worker fail_create:
2106*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_DEVICE_MEMORY;
2107*61046927SAndroid Build Coastguard Worker #endif
2108*61046927SAndroid Build Coastguard Worker }
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker static void
device_add_device_address_bo(struct v3dv_device * device,struct v3dv_bo * bo)2111*61046927SAndroid Build Coastguard Worker device_add_device_address_bo(struct v3dv_device *device,
2112*61046927SAndroid Build Coastguard Worker struct v3dv_bo *bo)
2113*61046927SAndroid Build Coastguard Worker {
2114*61046927SAndroid Build Coastguard Worker util_dynarray_append(&device->device_address_bo_list,
2115*61046927SAndroid Build Coastguard Worker struct v3dv_bo *,
2116*61046927SAndroid Build Coastguard Worker bo);
2117*61046927SAndroid Build Coastguard Worker }
2118*61046927SAndroid Build Coastguard Worker
2119*61046927SAndroid Build Coastguard Worker static void
device_remove_device_address_bo(struct v3dv_device * device,struct v3dv_bo * bo)2120*61046927SAndroid Build Coastguard Worker device_remove_device_address_bo(struct v3dv_device *device,
2121*61046927SAndroid Build Coastguard Worker struct v3dv_bo *bo)
2122*61046927SAndroid Build Coastguard Worker {
2123*61046927SAndroid Build Coastguard Worker util_dynarray_delete_unordered(&device->device_address_bo_list,
2124*61046927SAndroid Build Coastguard Worker struct v3dv_bo *,
2125*61046927SAndroid Build Coastguard Worker bo);
2126*61046927SAndroid Build Coastguard Worker }
2127*61046927SAndroid Build Coastguard Worker
2128*61046927SAndroid Build Coastguard Worker static void
free_memory(struct v3dv_device * device,struct v3dv_device_memory * mem,const VkAllocationCallbacks * pAllocator)2129*61046927SAndroid Build Coastguard Worker free_memory(struct v3dv_device *device,
2130*61046927SAndroid Build Coastguard Worker struct v3dv_device_memory *mem,
2131*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2132*61046927SAndroid Build Coastguard Worker {
2133*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2134*61046927SAndroid Build Coastguard Worker return;
2135*61046927SAndroid Build Coastguard Worker
2136*61046927SAndroid Build Coastguard Worker if (mem->bo->map)
2137*61046927SAndroid Build Coastguard Worker device_unmap(device, mem);
2138*61046927SAndroid Build Coastguard Worker
2139*61046927SAndroid Build Coastguard Worker if (mem->is_for_device_address)
2140*61046927SAndroid Build Coastguard Worker device_remove_device_address_bo(device, mem->bo);
2141*61046927SAndroid Build Coastguard Worker
2142*61046927SAndroid Build Coastguard Worker device_free(device, mem);
2143*61046927SAndroid Build Coastguard Worker
2144*61046927SAndroid Build Coastguard Worker vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
2145*61046927SAndroid Build Coastguard Worker }
2146*61046927SAndroid Build Coastguard Worker
2147*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_FreeMemory(VkDevice _device,VkDeviceMemory _mem,const VkAllocationCallbacks * pAllocator)2148*61046927SAndroid Build Coastguard Worker v3dv_FreeMemory(VkDevice _device,
2149*61046927SAndroid Build Coastguard Worker VkDeviceMemory _mem,
2150*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2151*61046927SAndroid Build Coastguard Worker {
2152*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2153*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, _mem);
2154*61046927SAndroid Build Coastguard Worker free_memory(device, mem, pAllocator);
2155*61046927SAndroid Build Coastguard Worker }
2156*61046927SAndroid Build Coastguard Worker
2157*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_AllocateMemory(VkDevice _device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMem)2158*61046927SAndroid Build Coastguard Worker v3dv_AllocateMemory(VkDevice _device,
2159*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateInfo *pAllocateInfo,
2160*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2161*61046927SAndroid Build Coastguard Worker VkDeviceMemory *pMem)
2162*61046927SAndroid Build Coastguard Worker {
2163*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2164*61046927SAndroid Build Coastguard Worker struct v3dv_device_memory *mem;
2165*61046927SAndroid Build Coastguard Worker struct v3dv_physical_device *pdevice = device->pdevice;
2166*61046927SAndroid Build Coastguard Worker
2167*61046927SAndroid Build Coastguard Worker assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
2168*61046927SAndroid Build Coastguard Worker
2169*61046927SAndroid Build Coastguard Worker /* We always allocate device memory in multiples of a page, so round up
2170*61046927SAndroid Build Coastguard Worker * requested size to that.
2171*61046927SAndroid Build Coastguard Worker */
2172*61046927SAndroid Build Coastguard Worker const VkDeviceSize alloc_size = align64(pAllocateInfo->allocationSize, 4096);
2173*61046927SAndroid Build Coastguard Worker
2174*61046927SAndroid Build Coastguard Worker if (unlikely(alloc_size > MAX_MEMORY_ALLOCATION_SIZE))
2175*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
2176*61046927SAndroid Build Coastguard Worker
2177*61046927SAndroid Build Coastguard Worker uint64_t heap_used = p_atomic_read(&pdevice->heap_used);
2178*61046927SAndroid Build Coastguard Worker if (unlikely(heap_used + alloc_size > pdevice->memory.memoryHeaps[0].size))
2179*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
2180*61046927SAndroid Build Coastguard Worker
2181*61046927SAndroid Build Coastguard Worker mem = vk_device_memory_create(&device->vk, pAllocateInfo,
2182*61046927SAndroid Build Coastguard Worker pAllocator, sizeof(*mem));
2183*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2184*61046927SAndroid Build Coastguard Worker return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY);
2185*61046927SAndroid Build Coastguard Worker
2186*61046927SAndroid Build Coastguard Worker assert(pAllocateInfo->memoryTypeIndex < pdevice->memory.memoryTypeCount);
2187*61046927SAndroid Build Coastguard Worker mem->type = &pdevice->memory.memoryTypes[pAllocateInfo->memoryTypeIndex];
2188*61046927SAndroid Build Coastguard Worker mem->is_for_wsi = false;
2189*61046927SAndroid Build Coastguard Worker
2190*61046927SAndroid Build Coastguard Worker const struct wsi_memory_allocate_info *wsi_info = NULL;
2191*61046927SAndroid Build Coastguard Worker const VkImportMemoryFdInfoKHR *fd_info = NULL;
2192*61046927SAndroid Build Coastguard Worker const VkMemoryAllocateFlagsInfo *flags_info = NULL;
2193*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pAllocateInfo->pNext) {
2194*61046927SAndroid Build Coastguard Worker switch ((unsigned)ext->sType) {
2195*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA:
2196*61046927SAndroid Build Coastguard Worker wsi_info = (void *)ext;
2197*61046927SAndroid Build Coastguard Worker break;
2198*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
2199*61046927SAndroid Build Coastguard Worker fd_info = (void *)ext;
2200*61046927SAndroid Build Coastguard Worker break;
2201*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
2202*61046927SAndroid Build Coastguard Worker flags_info = (void *)ext;
2203*61046927SAndroid Build Coastguard Worker break;
2204*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
2205*61046927SAndroid Build Coastguard Worker /* We don't have particular optimizations associated with memory
2206*61046927SAndroid Build Coastguard Worker * allocations that won't be suballocated to multiple resources.
2207*61046927SAndroid Build Coastguard Worker */
2208*61046927SAndroid Build Coastguard Worker break;
2209*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
2210*61046927SAndroid Build Coastguard Worker /* The mask of handle types specified here must be supported
2211*61046927SAndroid Build Coastguard Worker * according to VkExternalImageFormatProperties, so it must be
2212*61046927SAndroid Build Coastguard Worker * fd or dmabuf, which don't have special requirements for us.
2213*61046927SAndroid Build Coastguard Worker */
2214*61046927SAndroid Build Coastguard Worker break;
2215*61046927SAndroid Build Coastguard Worker default:
2216*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
2217*61046927SAndroid Build Coastguard Worker break;
2218*61046927SAndroid Build Coastguard Worker }
2219*61046927SAndroid Build Coastguard Worker }
2220*61046927SAndroid Build Coastguard Worker
2221*61046927SAndroid Build Coastguard Worker VkResult result;
2222*61046927SAndroid Build Coastguard Worker
2223*61046927SAndroid Build Coastguard Worker if (wsi_info) {
2224*61046927SAndroid Build Coastguard Worker result = device_alloc_for_wsi(device, pAllocator, mem, alloc_size);
2225*61046927SAndroid Build Coastguard Worker } else if (fd_info && fd_info->handleType) {
2226*61046927SAndroid Build Coastguard Worker assert(fd_info->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
2227*61046927SAndroid Build Coastguard Worker fd_info->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
2228*61046927SAndroid Build Coastguard Worker result = device_import_bo(device, pAllocator,
2229*61046927SAndroid Build Coastguard Worker fd_info->fd, alloc_size, &mem->bo);
2230*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS)
2231*61046927SAndroid Build Coastguard Worker close(fd_info->fd);
2232*61046927SAndroid Build Coastguard Worker } else if (mem->vk.ahardware_buffer) {
2233*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
2234*61046927SAndroid Build Coastguard Worker const native_handle_t *handle = AHardwareBuffer_getNativeHandle(mem->vk.ahardware_buffer);
2235*61046927SAndroid Build Coastguard Worker assert(handle->numFds > 0);
2236*61046927SAndroid Build Coastguard Worker size_t size = lseek(handle->data[0], 0, SEEK_END);
2237*61046927SAndroid Build Coastguard Worker result = device_import_bo(device, pAllocator,
2238*61046927SAndroid Build Coastguard Worker handle->data[0], size, &mem->bo);
2239*61046927SAndroid Build Coastguard Worker #else
2240*61046927SAndroid Build Coastguard Worker result = VK_ERROR_FEATURE_NOT_PRESENT;
2241*61046927SAndroid Build Coastguard Worker #endif
2242*61046927SAndroid Build Coastguard Worker } else {
2243*61046927SAndroid Build Coastguard Worker result = device_alloc(device, mem, alloc_size);
2244*61046927SAndroid Build Coastguard Worker }
2245*61046927SAndroid Build Coastguard Worker
2246*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
2247*61046927SAndroid Build Coastguard Worker vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk);
2248*61046927SAndroid Build Coastguard Worker return vk_error(device, result);
2249*61046927SAndroid Build Coastguard Worker }
2250*61046927SAndroid Build Coastguard Worker
2251*61046927SAndroid Build Coastguard Worker heap_used = p_atomic_add_return(&pdevice->heap_used, mem->bo->size);
2252*61046927SAndroid Build Coastguard Worker if (heap_used > pdevice->memory.memoryHeaps[0].size) {
2253*61046927SAndroid Build Coastguard Worker free_memory(device, mem, pAllocator);
2254*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
2255*61046927SAndroid Build Coastguard Worker }
2256*61046927SAndroid Build Coastguard Worker
2257*61046927SAndroid Build Coastguard Worker /* If this memory can be used via VK_KHR_buffer_device_address then we
2258*61046927SAndroid Build Coastguard Worker * will need to manually add the BO to any job submit that makes use of
2259*61046927SAndroid Build Coastguard Worker * VK_KHR_buffer_device_address, since such jobs may produce buffer
2260*61046927SAndroid Build Coastguard Worker * load/store operations that may access any buffer memory allocated with
2261*61046927SAndroid Build Coastguard Worker * this flag and we don't have any means to tell which buffers will be
2262*61046927SAndroid Build Coastguard Worker * accessed through this mechanism since they don't even have to be bound
2263*61046927SAndroid Build Coastguard Worker * through descriptor state.
2264*61046927SAndroid Build Coastguard Worker */
2265*61046927SAndroid Build Coastguard Worker if (flags_info &&
2266*61046927SAndroid Build Coastguard Worker (flags_info->flags & VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT)) {
2267*61046927SAndroid Build Coastguard Worker mem->is_for_device_address = true;
2268*61046927SAndroid Build Coastguard Worker device_add_device_address_bo(device, mem->bo);
2269*61046927SAndroid Build Coastguard Worker }
2270*61046927SAndroid Build Coastguard Worker
2271*61046927SAndroid Build Coastguard Worker *pMem = v3dv_device_memory_to_handle(mem);
2272*61046927SAndroid Build Coastguard Worker return result;
2273*61046927SAndroid Build Coastguard Worker }
2274*61046927SAndroid Build Coastguard Worker
2275*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_MapMemory(VkDevice _device,VkDeviceMemory _memory,VkDeviceSize offset,VkDeviceSize size,VkMemoryMapFlags flags,void ** ppData)2276*61046927SAndroid Build Coastguard Worker v3dv_MapMemory(VkDevice _device,
2277*61046927SAndroid Build Coastguard Worker VkDeviceMemory _memory,
2278*61046927SAndroid Build Coastguard Worker VkDeviceSize offset,
2279*61046927SAndroid Build Coastguard Worker VkDeviceSize size,
2280*61046927SAndroid Build Coastguard Worker VkMemoryMapFlags flags,
2281*61046927SAndroid Build Coastguard Worker void **ppData)
2282*61046927SAndroid Build Coastguard Worker {
2283*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2284*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, _memory);
2285*61046927SAndroid Build Coastguard Worker
2286*61046927SAndroid Build Coastguard Worker if (mem == NULL) {
2287*61046927SAndroid Build Coastguard Worker *ppData = NULL;
2288*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2289*61046927SAndroid Build Coastguard Worker }
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Worker assert(offset < mem->bo->size);
2292*61046927SAndroid Build Coastguard Worker
2293*61046927SAndroid Build Coastguard Worker /* Since the driver can map BOs internally as well and the mapped range
2294*61046927SAndroid Build Coastguard Worker * required by the user or the driver might not be the same, we always map
2295*61046927SAndroid Build Coastguard Worker * the entire BO and then add the requested offset to the start address
2296*61046927SAndroid Build Coastguard Worker * of the mapped region.
2297*61046927SAndroid Build Coastguard Worker */
2298*61046927SAndroid Build Coastguard Worker VkResult result = device_map(device, mem);
2299*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2300*61046927SAndroid Build Coastguard Worker return vk_error(device, result);
2301*61046927SAndroid Build Coastguard Worker
2302*61046927SAndroid Build Coastguard Worker *ppData = ((uint8_t *) mem->bo->map) + offset;
2303*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2304*61046927SAndroid Build Coastguard Worker }
2305*61046927SAndroid Build Coastguard Worker
2306*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_UnmapMemory(VkDevice _device,VkDeviceMemory _memory)2307*61046927SAndroid Build Coastguard Worker v3dv_UnmapMemory(VkDevice _device,
2308*61046927SAndroid Build Coastguard Worker VkDeviceMemory _memory)
2309*61046927SAndroid Build Coastguard Worker {
2310*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2311*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, _memory);
2312*61046927SAndroid Build Coastguard Worker
2313*61046927SAndroid Build Coastguard Worker if (mem == NULL)
2314*61046927SAndroid Build Coastguard Worker return;
2315*61046927SAndroid Build Coastguard Worker
2316*61046927SAndroid Build Coastguard Worker device_unmap(device, mem);
2317*61046927SAndroid Build Coastguard Worker }
2318*61046927SAndroid Build Coastguard Worker
2319*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_FlushMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)2320*61046927SAndroid Build Coastguard Worker v3dv_FlushMappedMemoryRanges(VkDevice _device,
2321*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
2322*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
2323*61046927SAndroid Build Coastguard Worker {
2324*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2325*61046927SAndroid Build Coastguard Worker }
2326*61046927SAndroid Build Coastguard Worker
2327*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_InvalidateMappedMemoryRanges(VkDevice _device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)2328*61046927SAndroid Build Coastguard Worker v3dv_InvalidateMappedMemoryRanges(VkDevice _device,
2329*61046927SAndroid Build Coastguard Worker uint32_t memoryRangeCount,
2330*61046927SAndroid Build Coastguard Worker const VkMappedMemoryRange *pMemoryRanges)
2331*61046927SAndroid Build Coastguard Worker {
2332*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2333*61046927SAndroid Build Coastguard Worker }
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Worker static void
get_image_memory_requirements(struct v3dv_image * image,VkImageAspectFlagBits planeAspect,VkMemoryRequirements2 * pMemoryRequirements)2336*61046927SAndroid Build Coastguard Worker get_image_memory_requirements(struct v3dv_image *image,
2337*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits planeAspect,
2338*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2339*61046927SAndroid Build Coastguard Worker {
2340*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
2341*61046927SAndroid Build Coastguard Worker .memoryTypeBits = 0x1,
2342*61046927SAndroid Build Coastguard Worker .alignment = image->planes[0].alignment,
2343*61046927SAndroid Build Coastguard Worker .size = image->non_disjoint_size
2344*61046927SAndroid Build Coastguard Worker };
2345*61046927SAndroid Build Coastguard Worker
2346*61046927SAndroid Build Coastguard Worker if (planeAspect != VK_IMAGE_ASPECT_NONE) {
2347*61046927SAndroid Build Coastguard Worker assert(image->format->plane_count > 1);
2348*61046927SAndroid Build Coastguard Worker /* Disjoint images should have a 0 non_disjoint_size */
2349*61046927SAndroid Build Coastguard Worker assert(!pMemoryRequirements->memoryRequirements.size);
2350*61046927SAndroid Build Coastguard Worker
2351*61046927SAndroid Build Coastguard Worker uint8_t plane = v3dv_image_aspect_to_plane(image, planeAspect);
2352*61046927SAndroid Build Coastguard Worker
2353*61046927SAndroid Build Coastguard Worker VkMemoryRequirements *mem_reqs =
2354*61046927SAndroid Build Coastguard Worker &pMemoryRequirements->memoryRequirements;
2355*61046927SAndroid Build Coastguard Worker mem_reqs->alignment = image->planes[plane].alignment;
2356*61046927SAndroid Build Coastguard Worker mem_reqs->size = image->planes[plane].size;
2357*61046927SAndroid Build Coastguard Worker }
2358*61046927SAndroid Build Coastguard Worker
2359*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryRequirements->pNext) {
2360*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
2361*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
2362*61046927SAndroid Build Coastguard Worker VkMemoryDedicatedRequirements *req =
2363*61046927SAndroid Build Coastguard Worker (VkMemoryDedicatedRequirements *) ext;
2364*61046927SAndroid Build Coastguard Worker req->requiresDedicatedAllocation = image->vk.external_handle_types != 0;
2365*61046927SAndroid Build Coastguard Worker req->prefersDedicatedAllocation = image->vk.external_handle_types != 0;
2366*61046927SAndroid Build Coastguard Worker break;
2367*61046927SAndroid Build Coastguard Worker }
2368*61046927SAndroid Build Coastguard Worker default:
2369*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
2370*61046927SAndroid Build Coastguard Worker break;
2371*61046927SAndroid Build Coastguard Worker }
2372*61046927SAndroid Build Coastguard Worker }
2373*61046927SAndroid Build Coastguard Worker }
2374*61046927SAndroid Build Coastguard Worker
2375*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetImageMemoryRequirements2(VkDevice device,const VkImageMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2376*61046927SAndroid Build Coastguard Worker v3dv_GetImageMemoryRequirements2(VkDevice device,
2377*61046927SAndroid Build Coastguard Worker const VkImageMemoryRequirementsInfo2 *pInfo,
2378*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2379*61046927SAndroid Build Coastguard Worker {
2380*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_image, image, pInfo->image);
2381*61046927SAndroid Build Coastguard Worker
2382*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits planeAspect = VK_IMAGE_ASPECT_NONE;
2383*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pInfo->pNext) {
2384*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
2385*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
2386*61046927SAndroid Build Coastguard Worker VkImagePlaneMemoryRequirementsInfo *req =
2387*61046927SAndroid Build Coastguard Worker (VkImagePlaneMemoryRequirementsInfo *) ext;
2388*61046927SAndroid Build Coastguard Worker planeAspect = req->planeAspect;
2389*61046927SAndroid Build Coastguard Worker break;
2390*61046927SAndroid Build Coastguard Worker }
2391*61046927SAndroid Build Coastguard Worker default:
2392*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
2393*61046927SAndroid Build Coastguard Worker break;
2394*61046927SAndroid Build Coastguard Worker }
2395*61046927SAndroid Build Coastguard Worker }
2396*61046927SAndroid Build Coastguard Worker
2397*61046927SAndroid Build Coastguard Worker get_image_memory_requirements(image, planeAspect, pMemoryRequirements);
2398*61046927SAndroid Build Coastguard Worker }
2399*61046927SAndroid Build Coastguard Worker
2400*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetDeviceImageMemoryRequirements(VkDevice _device,const VkDeviceImageMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2401*61046927SAndroid Build Coastguard Worker v3dv_GetDeviceImageMemoryRequirements(
2402*61046927SAndroid Build Coastguard Worker VkDevice _device,
2403*61046927SAndroid Build Coastguard Worker const VkDeviceImageMemoryRequirements *pInfo,
2404*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2405*61046927SAndroid Build Coastguard Worker {
2406*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2407*61046927SAndroid Build Coastguard Worker
2408*61046927SAndroid Build Coastguard Worker struct v3dv_image image = { 0 };
2409*61046927SAndroid Build Coastguard Worker vk_image_init(&device->vk, &image.vk, pInfo->pCreateInfo);
2410*61046927SAndroid Build Coastguard Worker
2411*61046927SAndroid Build Coastguard Worker ASSERTED VkResult result =
2412*61046927SAndroid Build Coastguard Worker v3dv_image_init(device, pInfo->pCreateInfo, NULL, &image);
2413*61046927SAndroid Build Coastguard Worker assert(result == VK_SUCCESS);
2414*61046927SAndroid Build Coastguard Worker
2415*61046927SAndroid Build Coastguard Worker /* From VkDeviceImageMemoryRequirements spec:
2416*61046927SAndroid Build Coastguard Worker *
2417*61046927SAndroid Build Coastguard Worker * " planeAspect is a VkImageAspectFlagBits value specifying the aspect
2418*61046927SAndroid Build Coastguard Worker * corresponding to the image plane to query. This parameter is ignored
2419*61046927SAndroid Build Coastguard Worker * unless pCreateInfo::tiling is
2420*61046927SAndroid Build Coastguard Worker * VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, or pCreateInfo::flags has
2421*61046927SAndroid Build Coastguard Worker * VK_IMAGE_CREATE_DISJOINT_BIT set"
2422*61046927SAndroid Build Coastguard Worker *
2423*61046927SAndroid Build Coastguard Worker * We need to explicitly ignore that flag, or following asserts could be
2424*61046927SAndroid Build Coastguard Worker * triggered.
2425*61046927SAndroid Build Coastguard Worker */
2426*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits planeAspect =
2427*61046927SAndroid Build Coastguard Worker pInfo->pCreateInfo->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT ||
2428*61046927SAndroid Build Coastguard Worker pInfo->pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT ?
2429*61046927SAndroid Build Coastguard Worker pInfo->planeAspect : 0;
2430*61046927SAndroid Build Coastguard Worker
2431*61046927SAndroid Build Coastguard Worker get_image_memory_requirements(&image, planeAspect, pMemoryRequirements);
2432*61046927SAndroid Build Coastguard Worker }
2433*61046927SAndroid Build Coastguard Worker
2434*61046927SAndroid Build Coastguard Worker static void
bind_image_memory(const VkBindImageMemoryInfo * info)2435*61046927SAndroid Build Coastguard Worker bind_image_memory(const VkBindImageMemoryInfo *info)
2436*61046927SAndroid Build Coastguard Worker {
2437*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_image, image, info->image);
2438*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, info->memory);
2439*61046927SAndroid Build Coastguard Worker
2440*61046927SAndroid Build Coastguard Worker /* Valid usage:
2441*61046927SAndroid Build Coastguard Worker *
2442*61046927SAndroid Build Coastguard Worker * "memoryOffset must be an integer multiple of the alignment member of
2443*61046927SAndroid Build Coastguard Worker * the VkMemoryRequirements structure returned from a call to
2444*61046927SAndroid Build Coastguard Worker * vkGetImageMemoryRequirements with image"
2445*61046927SAndroid Build Coastguard Worker */
2446*61046927SAndroid Build Coastguard Worker assert(info->memoryOffset < mem->bo->size);
2447*61046927SAndroid Build Coastguard Worker
2448*61046927SAndroid Build Coastguard Worker uint64_t offset = info->memoryOffset;
2449*61046927SAndroid Build Coastguard Worker if (image->non_disjoint_size) {
2450*61046927SAndroid Build Coastguard Worker /* We only check for plane 0 as it is the only one that actually starts
2451*61046927SAndroid Build Coastguard Worker * at that offset
2452*61046927SAndroid Build Coastguard Worker */
2453*61046927SAndroid Build Coastguard Worker assert(offset % image->planes[0].alignment == 0);
2454*61046927SAndroid Build Coastguard Worker for (uint8_t plane = 0; plane < image->plane_count; plane++) {
2455*61046927SAndroid Build Coastguard Worker image->planes[plane].mem = mem;
2456*61046927SAndroid Build Coastguard Worker image->planes[plane].mem_offset = offset;
2457*61046927SAndroid Build Coastguard Worker }
2458*61046927SAndroid Build Coastguard Worker } else {
2459*61046927SAndroid Build Coastguard Worker const VkBindImagePlaneMemoryInfo *plane_mem_info =
2460*61046927SAndroid Build Coastguard Worker vk_find_struct_const(info->pNext, BIND_IMAGE_PLANE_MEMORY_INFO);
2461*61046927SAndroid Build Coastguard Worker assert(plane_mem_info);
2462*61046927SAndroid Build Coastguard Worker
2463*61046927SAndroid Build Coastguard Worker /*
2464*61046927SAndroid Build Coastguard Worker * From VkBindImagePlaneMemoryInfo spec:
2465*61046927SAndroid Build Coastguard Worker *
2466*61046927SAndroid Build Coastguard Worker * "If the image’s tiling is VK_IMAGE_TILING_LINEAR or
2467*61046927SAndroid Build Coastguard Worker * VK_IMAGE_TILING_OPTIMAL, then planeAspect must be a single valid
2468*61046927SAndroid Build Coastguard Worker * format plane for the image"
2469*61046927SAndroid Build Coastguard Worker *
2470*61046927SAndroid Build Coastguard Worker * <skip>
2471*61046927SAndroid Build Coastguard Worker *
2472*61046927SAndroid Build Coastguard Worker * "If the image’s tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
2473*61046927SAndroid Build Coastguard Worker * then planeAspect must be a single valid memory plane for the
2474*61046927SAndroid Build Coastguard Worker * image"
2475*61046927SAndroid Build Coastguard Worker *
2476*61046927SAndroid Build Coastguard Worker * So planeAspect should only refer to one plane.
2477*61046927SAndroid Build Coastguard Worker */
2478*61046927SAndroid Build Coastguard Worker uint8_t plane = v3dv_plane_from_aspect(plane_mem_info->planeAspect);
2479*61046927SAndroid Build Coastguard Worker assert(offset % image->planes[plane].alignment == 0);
2480*61046927SAndroid Build Coastguard Worker image->planes[plane].mem = mem;
2481*61046927SAndroid Build Coastguard Worker image->planes[plane].mem_offset = offset;
2482*61046927SAndroid Build Coastguard Worker }
2483*61046927SAndroid Build Coastguard Worker }
2484*61046927SAndroid Build Coastguard Worker
2485*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_BindImageMemory2(VkDevice _device,uint32_t bindInfoCount,const VkBindImageMemoryInfo * pBindInfos)2486*61046927SAndroid Build Coastguard Worker v3dv_BindImageMemory2(VkDevice _device,
2487*61046927SAndroid Build Coastguard Worker uint32_t bindInfoCount,
2488*61046927SAndroid Build Coastguard Worker const VkBindImageMemoryInfo *pBindInfos)
2489*61046927SAndroid Build Coastguard Worker {
2490*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < bindInfoCount; i++) {
2491*61046927SAndroid Build Coastguard Worker /* This section is removed by the optimizer for non-ANDROID builds */
2492*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_image, image, pBindInfos[i].image);
2493*61046927SAndroid Build Coastguard Worker if (vk_image_is_android_hardware_buffer(&image->vk)) {
2494*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2495*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, pBindInfos[i].memory);
2496*61046927SAndroid Build Coastguard Worker
2497*61046927SAndroid Build Coastguard Worker VkImageDrmFormatModifierExplicitCreateInfoEXT eci;
2498*61046927SAndroid Build Coastguard Worker VkSubresourceLayout a_plane_layouts[V3DV_MAX_PLANE_COUNT];
2499*61046927SAndroid Build Coastguard Worker VkResult result = vk_android_get_ahb_layout(mem->vk.ahardware_buffer,
2500*61046927SAndroid Build Coastguard Worker &eci, a_plane_layouts,
2501*61046927SAndroid Build Coastguard Worker V3DV_MAX_PLANE_COUNT);
2502*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2503*61046927SAndroid Build Coastguard Worker return result;
2504*61046927SAndroid Build Coastguard Worker
2505*61046927SAndroid Build Coastguard Worker result = v3dv_update_image_layout(device, image,
2506*61046927SAndroid Build Coastguard Worker eci.drmFormatModifier,
2507*61046927SAndroid Build Coastguard Worker /* disjoint = */ false, &eci);
2508*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2509*61046927SAndroid Build Coastguard Worker return result;
2510*61046927SAndroid Build Coastguard Worker }
2511*61046927SAndroid Build Coastguard Worker
2512*61046927SAndroid Build Coastguard Worker const VkBindImageMemorySwapchainInfoKHR *swapchain_info =
2513*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pBindInfos->pNext,
2514*61046927SAndroid Build Coastguard Worker BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR);
2515*61046927SAndroid Build Coastguard Worker if (swapchain_info && swapchain_info->swapchain) {
2516*61046927SAndroid Build Coastguard Worker #if !DETECT_OS_ANDROID
2517*61046927SAndroid Build Coastguard Worker struct v3dv_image *swapchain_image =
2518*61046927SAndroid Build Coastguard Worker v3dv_wsi_get_image_from_swapchain(swapchain_info->swapchain,
2519*61046927SAndroid Build Coastguard Worker swapchain_info->imageIndex);
2520*61046927SAndroid Build Coastguard Worker /* Making the assumption that swapchain images are a single plane */
2521*61046927SAndroid Build Coastguard Worker assert(swapchain_image->plane_count == 1);
2522*61046927SAndroid Build Coastguard Worker VkBindImageMemoryInfo swapchain_bind = {
2523*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
2524*61046927SAndroid Build Coastguard Worker .image = pBindInfos[i].image,
2525*61046927SAndroid Build Coastguard Worker .memory = v3dv_device_memory_to_handle(swapchain_image->planes[0].mem),
2526*61046927SAndroid Build Coastguard Worker .memoryOffset = swapchain_image->planes[0].mem_offset,
2527*61046927SAndroid Build Coastguard Worker };
2528*61046927SAndroid Build Coastguard Worker bind_image_memory(&swapchain_bind);
2529*61046927SAndroid Build Coastguard Worker #endif
2530*61046927SAndroid Build Coastguard Worker } else
2531*61046927SAndroid Build Coastguard Worker {
2532*61046927SAndroid Build Coastguard Worker bind_image_memory(&pBindInfos[i]);
2533*61046927SAndroid Build Coastguard Worker }
2534*61046927SAndroid Build Coastguard Worker }
2535*61046927SAndroid Build Coastguard Worker
2536*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2537*61046927SAndroid Build Coastguard Worker }
2538*61046927SAndroid Build Coastguard Worker
2539*61046927SAndroid Build Coastguard Worker void
v3dv_buffer_init(struct v3dv_device * device,const VkBufferCreateInfo * pCreateInfo,struct v3dv_buffer * buffer,uint32_t alignment)2540*61046927SAndroid Build Coastguard Worker v3dv_buffer_init(struct v3dv_device *device,
2541*61046927SAndroid Build Coastguard Worker const VkBufferCreateInfo *pCreateInfo,
2542*61046927SAndroid Build Coastguard Worker struct v3dv_buffer *buffer,
2543*61046927SAndroid Build Coastguard Worker uint32_t alignment)
2544*61046927SAndroid Build Coastguard Worker {
2545*61046927SAndroid Build Coastguard Worker const VkBufferUsageFlags2CreateInfoKHR *flags2 =
2546*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext,
2547*61046927SAndroid Build Coastguard Worker BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR);
2548*61046927SAndroid Build Coastguard Worker VkBufferUsageFlags2KHR usage;
2549*61046927SAndroid Build Coastguard Worker if (flags2)
2550*61046927SAndroid Build Coastguard Worker usage = flags2->usage;
2551*61046927SAndroid Build Coastguard Worker else
2552*61046927SAndroid Build Coastguard Worker usage = pCreateInfo->usage;
2553*61046927SAndroid Build Coastguard Worker
2554*61046927SAndroid Build Coastguard Worker buffer->size = pCreateInfo->size;
2555*61046927SAndroid Build Coastguard Worker buffer->usage = usage;
2556*61046927SAndroid Build Coastguard Worker buffer->alignment = alignment;
2557*61046927SAndroid Build Coastguard Worker }
2558*61046927SAndroid Build Coastguard Worker
2559*61046927SAndroid Build Coastguard Worker static void
get_buffer_memory_requirements(struct v3dv_buffer * buffer,VkMemoryRequirements2 * pMemoryRequirements)2560*61046927SAndroid Build Coastguard Worker get_buffer_memory_requirements(struct v3dv_buffer *buffer,
2561*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2562*61046927SAndroid Build Coastguard Worker {
2563*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
2564*61046927SAndroid Build Coastguard Worker .memoryTypeBits = 0x1,
2565*61046927SAndroid Build Coastguard Worker .alignment = buffer->alignment,
2566*61046927SAndroid Build Coastguard Worker .size = align64(buffer->size, buffer->alignment),
2567*61046927SAndroid Build Coastguard Worker };
2568*61046927SAndroid Build Coastguard Worker
2569*61046927SAndroid Build Coastguard Worker /* UBO and SSBO may be read using ldunifa, which prefetches the next
2570*61046927SAndroid Build Coastguard Worker * 4 bytes after a read. If the buffer's size is exactly a multiple
2571*61046927SAndroid Build Coastguard Worker * of a page size and the shader reads the last 4 bytes with ldunifa
2572*61046927SAndroid Build Coastguard Worker * the prefetching would read out of bounds and cause an MMU error,
2573*61046927SAndroid Build Coastguard Worker * so we allocate extra space to avoid kernel error spamming.
2574*61046927SAndroid Build Coastguard Worker */
2575*61046927SAndroid Build Coastguard Worker bool can_ldunifa = buffer->usage &
2576*61046927SAndroid Build Coastguard Worker (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
2577*61046927SAndroid Build Coastguard Worker VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
2578*61046927SAndroid Build Coastguard Worker if (can_ldunifa && (buffer->size % 4096 == 0))
2579*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.size += buffer->alignment;
2580*61046927SAndroid Build Coastguard Worker
2581*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryRequirements->pNext) {
2582*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
2583*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
2584*61046927SAndroid Build Coastguard Worker VkMemoryDedicatedRequirements *req =
2585*61046927SAndroid Build Coastguard Worker (VkMemoryDedicatedRequirements *) ext;
2586*61046927SAndroid Build Coastguard Worker req->requiresDedicatedAllocation = false;
2587*61046927SAndroid Build Coastguard Worker req->prefersDedicatedAllocation = false;
2588*61046927SAndroid Build Coastguard Worker break;
2589*61046927SAndroid Build Coastguard Worker }
2590*61046927SAndroid Build Coastguard Worker default:
2591*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
2592*61046927SAndroid Build Coastguard Worker break;
2593*61046927SAndroid Build Coastguard Worker }
2594*61046927SAndroid Build Coastguard Worker }
2595*61046927SAndroid Build Coastguard Worker }
2596*61046927SAndroid Build Coastguard Worker
2597*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetBufferMemoryRequirements2(VkDevice device,const VkBufferMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2598*61046927SAndroid Build Coastguard Worker v3dv_GetBufferMemoryRequirements2(VkDevice device,
2599*61046927SAndroid Build Coastguard Worker const VkBufferMemoryRequirementsInfo2 *pInfo,
2600*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2601*61046927SAndroid Build Coastguard Worker {
2602*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_buffer, buffer, pInfo->buffer);
2603*61046927SAndroid Build Coastguard Worker get_buffer_memory_requirements(buffer, pMemoryRequirements);
2604*61046927SAndroid Build Coastguard Worker }
2605*61046927SAndroid Build Coastguard Worker
2606*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetDeviceBufferMemoryRequirements(VkDevice _device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2607*61046927SAndroid Build Coastguard Worker v3dv_GetDeviceBufferMemoryRequirements(
2608*61046927SAndroid Build Coastguard Worker VkDevice _device,
2609*61046927SAndroid Build Coastguard Worker const VkDeviceBufferMemoryRequirements *pInfo,
2610*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
2611*61046927SAndroid Build Coastguard Worker {
2612*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2613*61046927SAndroid Build Coastguard Worker
2614*61046927SAndroid Build Coastguard Worker struct v3dv_buffer buffer = { 0 };
2615*61046927SAndroid Build Coastguard Worker v3dv_buffer_init(device, pInfo->pCreateInfo, &buffer, V3D_NON_COHERENT_ATOM_SIZE);
2616*61046927SAndroid Build Coastguard Worker get_buffer_memory_requirements(&buffer, pMemoryRequirements);
2617*61046927SAndroid Build Coastguard Worker }
2618*61046927SAndroid Build Coastguard Worker
2619*61046927SAndroid Build Coastguard Worker void
v3dv_buffer_bind_memory(const VkBindBufferMemoryInfo * info)2620*61046927SAndroid Build Coastguard Worker v3dv_buffer_bind_memory(const VkBindBufferMemoryInfo *info)
2621*61046927SAndroid Build Coastguard Worker {
2622*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_buffer, buffer, info->buffer);
2623*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, info->memory);
2624*61046927SAndroid Build Coastguard Worker
2625*61046927SAndroid Build Coastguard Worker /* Valid usage:
2626*61046927SAndroid Build Coastguard Worker *
2627*61046927SAndroid Build Coastguard Worker * "memoryOffset must be an integer multiple of the alignment member of
2628*61046927SAndroid Build Coastguard Worker * the VkMemoryRequirements structure returned from a call to
2629*61046927SAndroid Build Coastguard Worker * vkGetBufferMemoryRequirements with buffer"
2630*61046927SAndroid Build Coastguard Worker */
2631*61046927SAndroid Build Coastguard Worker assert(info->memoryOffset % buffer->alignment == 0);
2632*61046927SAndroid Build Coastguard Worker assert(info->memoryOffset < mem->bo->size);
2633*61046927SAndroid Build Coastguard Worker
2634*61046927SAndroid Build Coastguard Worker buffer->mem = mem;
2635*61046927SAndroid Build Coastguard Worker buffer->mem_offset = info->memoryOffset;
2636*61046927SAndroid Build Coastguard Worker }
2637*61046927SAndroid Build Coastguard Worker
2638*61046927SAndroid Build Coastguard Worker
2639*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_BindBufferMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)2640*61046927SAndroid Build Coastguard Worker v3dv_BindBufferMemory2(VkDevice device,
2641*61046927SAndroid Build Coastguard Worker uint32_t bindInfoCount,
2642*61046927SAndroid Build Coastguard Worker const VkBindBufferMemoryInfo *pBindInfos)
2643*61046927SAndroid Build Coastguard Worker {
2644*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < bindInfoCount; i++)
2645*61046927SAndroid Build Coastguard Worker v3dv_buffer_bind_memory(&pBindInfos[i]);
2646*61046927SAndroid Build Coastguard Worker
2647*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2648*61046927SAndroid Build Coastguard Worker }
2649*61046927SAndroid Build Coastguard Worker
2650*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_CreateBuffer(VkDevice _device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)2651*61046927SAndroid Build Coastguard Worker v3dv_CreateBuffer(VkDevice _device,
2652*61046927SAndroid Build Coastguard Worker const VkBufferCreateInfo *pCreateInfo,
2653*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2654*61046927SAndroid Build Coastguard Worker VkBuffer *pBuffer)
2655*61046927SAndroid Build Coastguard Worker {
2656*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2657*61046927SAndroid Build Coastguard Worker struct v3dv_buffer *buffer;
2658*61046927SAndroid Build Coastguard Worker
2659*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
2660*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->usage != 0);
2661*61046927SAndroid Build Coastguard Worker
2662*61046927SAndroid Build Coastguard Worker /* We don't support any flags for now */
2663*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->flags == 0);
2664*61046927SAndroid Build Coastguard Worker
2665*61046927SAndroid Build Coastguard Worker buffer = vk_object_zalloc(&device->vk, pAllocator, sizeof(*buffer),
2666*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_BUFFER);
2667*61046927SAndroid Build Coastguard Worker if (buffer == NULL)
2668*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2669*61046927SAndroid Build Coastguard Worker
2670*61046927SAndroid Build Coastguard Worker v3dv_buffer_init(device, pCreateInfo, buffer, V3D_NON_COHERENT_ATOM_SIZE);
2671*61046927SAndroid Build Coastguard Worker
2672*61046927SAndroid Build Coastguard Worker /* Limit allocations to 32-bit */
2673*61046927SAndroid Build Coastguard Worker const VkDeviceSize aligned_size = align64(buffer->size, buffer->alignment);
2674*61046927SAndroid Build Coastguard Worker if (aligned_size > UINT32_MAX || aligned_size < buffer->size) {
2675*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, buffer);
2676*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_DEVICE_MEMORY;
2677*61046927SAndroid Build Coastguard Worker }
2678*61046927SAndroid Build Coastguard Worker
2679*61046927SAndroid Build Coastguard Worker *pBuffer = v3dv_buffer_to_handle(buffer);
2680*61046927SAndroid Build Coastguard Worker
2681*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2682*61046927SAndroid Build Coastguard Worker }
2683*61046927SAndroid Build Coastguard Worker
2684*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_DestroyBuffer(VkDevice _device,VkBuffer _buffer,const VkAllocationCallbacks * pAllocator)2685*61046927SAndroid Build Coastguard Worker v3dv_DestroyBuffer(VkDevice _device,
2686*61046927SAndroid Build Coastguard Worker VkBuffer _buffer,
2687*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2688*61046927SAndroid Build Coastguard Worker {
2689*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2690*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_buffer, buffer, _buffer);
2691*61046927SAndroid Build Coastguard Worker
2692*61046927SAndroid Build Coastguard Worker if (!buffer)
2693*61046927SAndroid Build Coastguard Worker return;
2694*61046927SAndroid Build Coastguard Worker
2695*61046927SAndroid Build Coastguard Worker vk_object_free(&device->vk, pAllocator, buffer);
2696*61046927SAndroid Build Coastguard Worker }
2697*61046927SAndroid Build Coastguard Worker
2698*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_CreateFramebuffer(VkDevice _device,const VkFramebufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFramebuffer * pFramebuffer)2699*61046927SAndroid Build Coastguard Worker v3dv_CreateFramebuffer(VkDevice _device,
2700*61046927SAndroid Build Coastguard Worker const VkFramebufferCreateInfo *pCreateInfo,
2701*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2702*61046927SAndroid Build Coastguard Worker VkFramebuffer *pFramebuffer)
2703*61046927SAndroid Build Coastguard Worker {
2704*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2705*61046927SAndroid Build Coastguard Worker struct v3dv_framebuffer *framebuffer;
2706*61046927SAndroid Build Coastguard Worker
2707*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO);
2708*61046927SAndroid Build Coastguard Worker
2709*61046927SAndroid Build Coastguard Worker size_t size = sizeof(*framebuffer) +
2710*61046927SAndroid Build Coastguard Worker sizeof(struct v3dv_image_view *) * pCreateInfo->attachmentCount;
2711*61046927SAndroid Build Coastguard Worker framebuffer = vk_object_zalloc(&device->vk, pAllocator, size,
2712*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_FRAMEBUFFER);
2713*61046927SAndroid Build Coastguard Worker if (framebuffer == NULL)
2714*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2715*61046927SAndroid Build Coastguard Worker
2716*61046927SAndroid Build Coastguard Worker framebuffer->width = pCreateInfo->width;
2717*61046927SAndroid Build Coastguard Worker framebuffer->height = pCreateInfo->height;
2718*61046927SAndroid Build Coastguard Worker framebuffer->layers = pCreateInfo->layers;
2719*61046927SAndroid Build Coastguard Worker framebuffer->has_edge_padding = true;
2720*61046927SAndroid Build Coastguard Worker
2721*61046927SAndroid Build Coastguard Worker const VkFramebufferAttachmentsCreateInfo *imageless =
2722*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext,
2723*61046927SAndroid Build Coastguard Worker FRAMEBUFFER_ATTACHMENTS_CREATE_INFO);
2724*61046927SAndroid Build Coastguard Worker
2725*61046927SAndroid Build Coastguard Worker framebuffer->attachment_count = pCreateInfo->attachmentCount;
2726*61046927SAndroid Build Coastguard Worker framebuffer->color_attachment_count = 0;
2727*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < framebuffer->attachment_count; i++) {
2728*61046927SAndroid Build Coastguard Worker if (!imageless) {
2729*61046927SAndroid Build Coastguard Worker framebuffer->attachments[i] =
2730*61046927SAndroid Build Coastguard Worker v3dv_image_view_from_handle(pCreateInfo->pAttachments[i]);
2731*61046927SAndroid Build Coastguard Worker if (framebuffer->attachments[i]->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT)
2732*61046927SAndroid Build Coastguard Worker framebuffer->color_attachment_count++;
2733*61046927SAndroid Build Coastguard Worker } else {
2734*61046927SAndroid Build Coastguard Worker assert(i < imageless->attachmentImageInfoCount);
2735*61046927SAndroid Build Coastguard Worker if (imageless->pAttachmentImageInfos[i].usage &
2736*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
2737*61046927SAndroid Build Coastguard Worker framebuffer->color_attachment_count++;
2738*61046927SAndroid Build Coastguard Worker }
2739*61046927SAndroid Build Coastguard Worker }
2740*61046927SAndroid Build Coastguard Worker }
2741*61046927SAndroid Build Coastguard Worker
2742*61046927SAndroid Build Coastguard Worker *pFramebuffer = v3dv_framebuffer_to_handle(framebuffer);
2743*61046927SAndroid Build Coastguard Worker
2744*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2745*61046927SAndroid Build Coastguard Worker }
2746*61046927SAndroid Build Coastguard Worker
2747*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_DestroyFramebuffer(VkDevice _device,VkFramebuffer _fb,const VkAllocationCallbacks * pAllocator)2748*61046927SAndroid Build Coastguard Worker v3dv_DestroyFramebuffer(VkDevice _device,
2749*61046927SAndroid Build Coastguard Worker VkFramebuffer _fb,
2750*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2751*61046927SAndroid Build Coastguard Worker {
2752*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2753*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_framebuffer, fb, _fb);
2754*61046927SAndroid Build Coastguard Worker
2755*61046927SAndroid Build Coastguard Worker if (!fb)
2756*61046927SAndroid Build Coastguard Worker return;
2757*61046927SAndroid Build Coastguard Worker
2758*61046927SAndroid Build Coastguard Worker vk_object_free(&device->vk, pAllocator, fb);
2759*61046927SAndroid Build Coastguard Worker }
2760*61046927SAndroid Build Coastguard Worker
2761*61046927SAndroid Build Coastguard Worker void
v3dv_setup_dynamic_framebuffer(struct v3dv_cmd_buffer * cmd_buffer,const VkRenderingInfoKHR * info)2762*61046927SAndroid Build Coastguard Worker v3dv_setup_dynamic_framebuffer(struct v3dv_cmd_buffer *cmd_buffer,
2763*61046927SAndroid Build Coastguard Worker const VkRenderingInfoKHR *info)
2764*61046927SAndroid Build Coastguard Worker {
2765*61046927SAndroid Build Coastguard Worker struct v3dv_device *device = cmd_buffer->device;
2766*61046927SAndroid Build Coastguard Worker
2767*61046927SAndroid Build Coastguard Worker /* Max framebuffer attachments is max_color_RTs + D/S multiplied by two for
2768*61046927SAndroid Build Coastguard Worker * MSAA resolves.
2769*61046927SAndroid Build Coastguard Worker */
2770*61046927SAndroid Build Coastguard Worker const uint32_t max_attachments =
2771*61046927SAndroid Build Coastguard Worker 2 * (V3D_MAX_RENDER_TARGETS(device->devinfo.ver) + 1);
2772*61046927SAndroid Build Coastguard Worker const uint32_t attachments_alloc_size =
2773*61046927SAndroid Build Coastguard Worker sizeof(struct v3dv_image_view *) * max_attachments;
2774*61046927SAndroid Build Coastguard Worker
2775*61046927SAndroid Build Coastguard Worker /* Only allocate the dynamic framebuffer once and will stay valid
2776*61046927SAndroid Build Coastguard Worker * for the duration of the command buffer.
2777*61046927SAndroid Build Coastguard Worker */
2778*61046927SAndroid Build Coastguard Worker struct v3dv_framebuffer *fb = cmd_buffer->state.dynamic_framebuffer;
2779*61046927SAndroid Build Coastguard Worker if (!fb) {
2780*61046927SAndroid Build Coastguard Worker uint32_t alloc_size = sizeof(struct v3dv_framebuffer) +
2781*61046927SAndroid Build Coastguard Worker attachments_alloc_size;
2782*61046927SAndroid Build Coastguard Worker fb = vk_object_zalloc(&cmd_buffer->device->vk, NULL, alloc_size,
2783*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_FRAMEBUFFER);
2784*61046927SAndroid Build Coastguard Worker if (fb == NULL) {
2785*61046927SAndroid Build Coastguard Worker v3dv_flag_oom(cmd_buffer, NULL);
2786*61046927SAndroid Build Coastguard Worker return;
2787*61046927SAndroid Build Coastguard Worker }
2788*61046927SAndroid Build Coastguard Worker cmd_buffer->state.dynamic_framebuffer = fb;
2789*61046927SAndroid Build Coastguard Worker } else {
2790*61046927SAndroid Build Coastguard Worker memset(fb->attachments, 0, attachments_alloc_size);
2791*61046927SAndroid Build Coastguard Worker }
2792*61046927SAndroid Build Coastguard Worker
2793*61046927SAndroid Build Coastguard Worker fb->width = info->renderArea.offset.x + info->renderArea.extent.width;
2794*61046927SAndroid Build Coastguard Worker fb->height = info->renderArea.offset.y + info->renderArea.extent.height;
2795*61046927SAndroid Build Coastguard Worker
2796*61046927SAndroid Build Coastguard Worker /* From the Vulkan spec for VkFramebufferCreateInfo:
2797*61046927SAndroid Build Coastguard Worker *
2798*61046927SAndroid Build Coastguard Worker * "If the render pass uses multiview, then layers must be one (...)"
2799*61046927SAndroid Build Coastguard Worker */
2800*61046927SAndroid Build Coastguard Worker fb->layers = info->viewMask == 0 ? info->layerCount : 1;
2801*61046927SAndroid Build Coastguard Worker
2802*61046927SAndroid Build Coastguard Worker struct v3dv_render_pass *pass = &cmd_buffer->state.dynamic_pass;
2803*61046927SAndroid Build Coastguard Worker assert(pass->subpass_count == 1 && pass->subpasses);
2804*61046927SAndroid Build Coastguard Worker assert(pass->subpasses[0].color_count == info->colorAttachmentCount);
2805*61046927SAndroid Build Coastguard Worker fb->color_attachment_count = info->colorAttachmentCount;
2806*61046927SAndroid Build Coastguard Worker
2807*61046927SAndroid Build Coastguard Worker uint32_t a = 0;
2808*61046927SAndroid Build Coastguard Worker for (int i = 0; i < info->colorAttachmentCount; i++) {
2809*61046927SAndroid Build Coastguard Worker if (info->pColorAttachments[i].imageView == VK_NULL_HANDLE)
2810*61046927SAndroid Build Coastguard Worker continue;
2811*61046927SAndroid Build Coastguard Worker fb->attachments[a++] =
2812*61046927SAndroid Build Coastguard Worker v3dv_image_view_from_handle(info->pColorAttachments[i].imageView);
2813*61046927SAndroid Build Coastguard Worker if (info->pColorAttachments[i].resolveMode != VK_RESOLVE_MODE_NONE) {
2814*61046927SAndroid Build Coastguard Worker fb->attachments[a++] =
2815*61046927SAndroid Build Coastguard Worker v3dv_image_view_from_handle(info->pColorAttachments[i].resolveImageView);
2816*61046927SAndroid Build Coastguard Worker }
2817*61046927SAndroid Build Coastguard Worker }
2818*61046927SAndroid Build Coastguard Worker
2819*61046927SAndroid Build Coastguard Worker if ((info->pDepthAttachment && info->pDepthAttachment->imageView) ||
2820*61046927SAndroid Build Coastguard Worker (info->pStencilAttachment && info->pStencilAttachment->imageView)) {
2821*61046927SAndroid Build Coastguard Worker const struct VkRenderingAttachmentInfo *common_ds_info =
2822*61046927SAndroid Build Coastguard Worker (info->pDepthAttachment &&
2823*61046927SAndroid Build Coastguard Worker info->pDepthAttachment->imageView != VK_NULL_HANDLE) ?
2824*61046927SAndroid Build Coastguard Worker info->pDepthAttachment :
2825*61046927SAndroid Build Coastguard Worker info->pStencilAttachment;
2826*61046927SAndroid Build Coastguard Worker
2827*61046927SAndroid Build Coastguard Worker fb->attachments[a++] =
2828*61046927SAndroid Build Coastguard Worker v3dv_image_view_from_handle(common_ds_info->imageView);
2829*61046927SAndroid Build Coastguard Worker
2830*61046927SAndroid Build Coastguard Worker if (common_ds_info->resolveMode != VK_RESOLVE_MODE_NONE) {
2831*61046927SAndroid Build Coastguard Worker fb->attachments[a++] =
2832*61046927SAndroid Build Coastguard Worker v3dv_image_view_from_handle(common_ds_info->resolveImageView);
2833*61046927SAndroid Build Coastguard Worker }
2834*61046927SAndroid Build Coastguard Worker }
2835*61046927SAndroid Build Coastguard Worker
2836*61046927SAndroid Build Coastguard Worker assert(a == pass->attachment_count);
2837*61046927SAndroid Build Coastguard Worker fb->attachment_count = a;
2838*61046927SAndroid Build Coastguard Worker
2839*61046927SAndroid Build Coastguard Worker /* Dynamic rendering doesn't provide the size of the underlying framebuffer
2840*61046927SAndroid Build Coastguard Worker * so we estimate its size from the render area. This means it is possible
2841*61046927SAndroid Build Coastguard Worker * the underlying attachments are larger and thus we cannot assume we have
2842*61046927SAndroid Build Coastguard Worker * edge padding.
2843*61046927SAndroid Build Coastguard Worker */
2844*61046927SAndroid Build Coastguard Worker fb->has_edge_padding = false;
2845*61046927SAndroid Build Coastguard Worker }
2846*61046927SAndroid Build Coastguard Worker
2847*61046927SAndroid Build Coastguard Worker void
v3dv_destroy_dynamic_framebuffer(struct v3dv_cmd_buffer * cmd_buffer)2848*61046927SAndroid Build Coastguard Worker v3dv_destroy_dynamic_framebuffer(struct v3dv_cmd_buffer *cmd_buffer)
2849*61046927SAndroid Build Coastguard Worker {
2850*61046927SAndroid Build Coastguard Worker if (!cmd_buffer->state.dynamic_framebuffer)
2851*61046927SAndroid Build Coastguard Worker return;
2852*61046927SAndroid Build Coastguard Worker
2853*61046927SAndroid Build Coastguard Worker VkDevice vk_device = v3dv_device_to_handle(cmd_buffer->device);
2854*61046927SAndroid Build Coastguard Worker VkFramebuffer vk_dynamic_fb =
2855*61046927SAndroid Build Coastguard Worker v3dv_framebuffer_to_handle(cmd_buffer->state.dynamic_framebuffer);
2856*61046927SAndroid Build Coastguard Worker v3dv_DestroyFramebuffer(vk_device, vk_dynamic_fb, NULL);
2857*61046927SAndroid Build Coastguard Worker cmd_buffer->state.dynamic_framebuffer = NULL;
2858*61046927SAndroid Build Coastguard Worker }
2859*61046927SAndroid Build Coastguard Worker
2860*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_GetMemoryFdPropertiesKHR(VkDevice _device,VkExternalMemoryHandleTypeFlagBits handleType,int fd,VkMemoryFdPropertiesKHR * pMemoryFdProperties)2861*61046927SAndroid Build Coastguard Worker v3dv_GetMemoryFdPropertiesKHR(VkDevice _device,
2862*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits handleType,
2863*61046927SAndroid Build Coastguard Worker int fd,
2864*61046927SAndroid Build Coastguard Worker VkMemoryFdPropertiesKHR *pMemoryFdProperties)
2865*61046927SAndroid Build Coastguard Worker {
2866*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2867*61046927SAndroid Build Coastguard Worker struct v3dv_physical_device *pdevice = device->pdevice;
2868*61046927SAndroid Build Coastguard Worker
2869*61046927SAndroid Build Coastguard Worker switch (handleType) {
2870*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
2871*61046927SAndroid Build Coastguard Worker pMemoryFdProperties->memoryTypeBits =
2872*61046927SAndroid Build Coastguard Worker (1 << pdevice->memory.memoryTypeCount) - 1;
2873*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2874*61046927SAndroid Build Coastguard Worker default:
2875*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
2876*61046927SAndroid Build Coastguard Worker }
2877*61046927SAndroid Build Coastguard Worker }
2878*61046927SAndroid Build Coastguard Worker
2879*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_GetMemoryFdKHR(VkDevice _device,const VkMemoryGetFdInfoKHR * pGetFdInfo,int * pFd)2880*61046927SAndroid Build Coastguard Worker v3dv_GetMemoryFdKHR(VkDevice _device,
2881*61046927SAndroid Build Coastguard Worker const VkMemoryGetFdInfoKHR *pGetFdInfo,
2882*61046927SAndroid Build Coastguard Worker int *pFd)
2883*61046927SAndroid Build Coastguard Worker {
2884*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2885*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device_memory, mem, pGetFdInfo->memory);
2886*61046927SAndroid Build Coastguard Worker
2887*61046927SAndroid Build Coastguard Worker assert(pGetFdInfo->sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
2888*61046927SAndroid Build Coastguard Worker assert(pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ||
2889*61046927SAndroid Build Coastguard Worker pGetFdInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
2890*61046927SAndroid Build Coastguard Worker
2891*61046927SAndroid Build Coastguard Worker int fd, ret;
2892*61046927SAndroid Build Coastguard Worker ret = drmPrimeHandleToFD(device->pdevice->render_fd,
2893*61046927SAndroid Build Coastguard Worker mem->bo->handle,
2894*61046927SAndroid Build Coastguard Worker DRM_CLOEXEC, &fd);
2895*61046927SAndroid Build Coastguard Worker if (ret)
2896*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2897*61046927SAndroid Build Coastguard Worker
2898*61046927SAndroid Build Coastguard Worker *pFd = fd;
2899*61046927SAndroid Build Coastguard Worker
2900*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2901*61046927SAndroid Build Coastguard Worker }
2902*61046927SAndroid Build Coastguard Worker
2903*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
v3dv_CreateSampler(VkDevice _device,const VkSamplerCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSampler * pSampler)2904*61046927SAndroid Build Coastguard Worker v3dv_CreateSampler(VkDevice _device,
2905*61046927SAndroid Build Coastguard Worker const VkSamplerCreateInfo *pCreateInfo,
2906*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
2907*61046927SAndroid Build Coastguard Worker VkSampler *pSampler)
2908*61046927SAndroid Build Coastguard Worker {
2909*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2910*61046927SAndroid Build Coastguard Worker struct v3dv_sampler *sampler;
2911*61046927SAndroid Build Coastguard Worker
2912*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
2913*61046927SAndroid Build Coastguard Worker
2914*61046927SAndroid Build Coastguard Worker sampler = vk_object_zalloc(&device->vk, pAllocator, sizeof(*sampler),
2915*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_SAMPLER);
2916*61046927SAndroid Build Coastguard Worker if (!sampler)
2917*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
2918*61046927SAndroid Build Coastguard Worker
2919*61046927SAndroid Build Coastguard Worker sampler->plane_count = 1;
2920*61046927SAndroid Build Coastguard Worker
2921*61046927SAndroid Build Coastguard Worker sampler->compare_enable = pCreateInfo->compareEnable;
2922*61046927SAndroid Build Coastguard Worker sampler->unnormalized_coordinates = pCreateInfo->unnormalizedCoordinates;
2923*61046927SAndroid Build Coastguard Worker
2924*61046927SAndroid Build Coastguard Worker const VkSamplerCustomBorderColorCreateInfoEXT *bc_info =
2925*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext,
2926*61046927SAndroid Build Coastguard Worker SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT);
2927*61046927SAndroid Build Coastguard Worker
2928*61046927SAndroid Build Coastguard Worker const VkSamplerYcbcrConversionInfo *ycbcr_conv_info =
2929*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext, SAMPLER_YCBCR_CONVERSION_INFO);
2930*61046927SAndroid Build Coastguard Worker
2931*61046927SAndroid Build Coastguard Worker const struct vk_format_ycbcr_info *ycbcr_info = NULL;
2932*61046927SAndroid Build Coastguard Worker
2933*61046927SAndroid Build Coastguard Worker if (ycbcr_conv_info) {
2934*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(vk_ycbcr_conversion, conversion, ycbcr_conv_info->conversion);
2935*61046927SAndroid Build Coastguard Worker ycbcr_info = vk_format_get_ycbcr_info(conversion->state.format);
2936*61046927SAndroid Build Coastguard Worker if (ycbcr_info) {
2937*61046927SAndroid Build Coastguard Worker sampler->plane_count = ycbcr_info->n_planes;
2938*61046927SAndroid Build Coastguard Worker sampler->conversion = conversion;
2939*61046927SAndroid Build Coastguard Worker }
2940*61046927SAndroid Build Coastguard Worker }
2941*61046927SAndroid Build Coastguard Worker
2942*61046927SAndroid Build Coastguard Worker v3dv_X(device, pack_sampler_state)(device, sampler, pCreateInfo, bc_info);
2943*61046927SAndroid Build Coastguard Worker
2944*61046927SAndroid Build Coastguard Worker *pSampler = v3dv_sampler_to_handle(sampler);
2945*61046927SAndroid Build Coastguard Worker
2946*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
2947*61046927SAndroid Build Coastguard Worker }
2948*61046927SAndroid Build Coastguard Worker
2949*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_DestroySampler(VkDevice _device,VkSampler _sampler,const VkAllocationCallbacks * pAllocator)2950*61046927SAndroid Build Coastguard Worker v3dv_DestroySampler(VkDevice _device,
2951*61046927SAndroid Build Coastguard Worker VkSampler _sampler,
2952*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
2953*61046927SAndroid Build Coastguard Worker {
2954*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_device, device, _device);
2955*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_sampler, sampler, _sampler);
2956*61046927SAndroid Build Coastguard Worker
2957*61046927SAndroid Build Coastguard Worker if (!sampler)
2958*61046927SAndroid Build Coastguard Worker return;
2959*61046927SAndroid Build Coastguard Worker
2960*61046927SAndroid Build Coastguard Worker vk_object_free(&device->vk, pAllocator, sampler);
2961*61046927SAndroid Build Coastguard Worker }
2962*61046927SAndroid Build Coastguard Worker
2963*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes)2964*61046927SAndroid Build Coastguard Worker v3dv_GetDeviceMemoryCommitment(VkDevice device,
2965*61046927SAndroid Build Coastguard Worker VkDeviceMemory memory,
2966*61046927SAndroid Build Coastguard Worker VkDeviceSize *pCommittedMemoryInBytes)
2967*61046927SAndroid Build Coastguard Worker {
2968*61046927SAndroid Build Coastguard Worker *pCommittedMemoryInBytes = 0;
2969*61046927SAndroid Build Coastguard Worker }
2970*61046927SAndroid Build Coastguard Worker
2971*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetImageSparseMemoryRequirements(VkDevice device,VkImage image,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements * pSparseMemoryRequirements)2972*61046927SAndroid Build Coastguard Worker v3dv_GetImageSparseMemoryRequirements(
2973*61046927SAndroid Build Coastguard Worker VkDevice device,
2974*61046927SAndroid Build Coastguard Worker VkImage image,
2975*61046927SAndroid Build Coastguard Worker uint32_t *pSparseMemoryRequirementCount,
2976*61046927SAndroid Build Coastguard Worker VkSparseImageMemoryRequirements *pSparseMemoryRequirements)
2977*61046927SAndroid Build Coastguard Worker {
2978*61046927SAndroid Build Coastguard Worker *pSparseMemoryRequirementCount = 0;
2979*61046927SAndroid Build Coastguard Worker }
2980*61046927SAndroid Build Coastguard Worker
2981*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetImageSparseMemoryRequirements2(VkDevice device,const VkImageSparseMemoryRequirementsInfo2 * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements)2982*61046927SAndroid Build Coastguard Worker v3dv_GetImageSparseMemoryRequirements2(
2983*61046927SAndroid Build Coastguard Worker VkDevice device,
2984*61046927SAndroid Build Coastguard Worker const VkImageSparseMemoryRequirementsInfo2 *pInfo,
2985*61046927SAndroid Build Coastguard Worker uint32_t *pSparseMemoryRequirementCount,
2986*61046927SAndroid Build Coastguard Worker VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements)
2987*61046927SAndroid Build Coastguard Worker {
2988*61046927SAndroid Build Coastguard Worker *pSparseMemoryRequirementCount = 0;
2989*61046927SAndroid Build Coastguard Worker }
2990*61046927SAndroid Build Coastguard Worker
2991*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
v3dv_GetDeviceImageSparseMemoryRequirements(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements)2992*61046927SAndroid Build Coastguard Worker v3dv_GetDeviceImageSparseMemoryRequirements(
2993*61046927SAndroid Build Coastguard Worker VkDevice device,
2994*61046927SAndroid Build Coastguard Worker const VkDeviceImageMemoryRequirements *pInfo,
2995*61046927SAndroid Build Coastguard Worker uint32_t *pSparseMemoryRequirementCount,
2996*61046927SAndroid Build Coastguard Worker VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements)
2997*61046927SAndroid Build Coastguard Worker {
2998*61046927SAndroid Build Coastguard Worker *pSparseMemoryRequirementCount = 0;
2999*61046927SAndroid Build Coastguard Worker }
3000*61046927SAndroid Build Coastguard Worker
3001*61046927SAndroid Build Coastguard Worker VkDeviceAddress
v3dv_GetBufferDeviceAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)3002*61046927SAndroid Build Coastguard Worker v3dv_GetBufferDeviceAddress(VkDevice device,
3003*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo *pInfo)
3004*61046927SAndroid Build Coastguard Worker {
3005*61046927SAndroid Build Coastguard Worker V3DV_FROM_HANDLE(v3dv_buffer, buffer, pInfo->buffer);
3006*61046927SAndroid Build Coastguard Worker return buffer->mem_offset + buffer->mem->bo->offset;
3007*61046927SAndroid Build Coastguard Worker }
3008*61046927SAndroid Build Coastguard Worker
3009*61046927SAndroid Build Coastguard Worker uint64_t
v3dv_GetBufferOpaqueCaptureAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)3010*61046927SAndroid Build Coastguard Worker v3dv_GetBufferOpaqueCaptureAddress(VkDevice device,
3011*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo *pInfo)
3012*61046927SAndroid Build Coastguard Worker {
3013*61046927SAndroid Build Coastguard Worker /* Not implemented */
3014*61046927SAndroid Build Coastguard Worker return 0;
3015*61046927SAndroid Build Coastguard Worker }
3016*61046927SAndroid Build Coastguard Worker
3017*61046927SAndroid Build Coastguard Worker uint64_t
v3dv_GetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo)3018*61046927SAndroid Build Coastguard Worker v3dv_GetDeviceMemoryOpaqueCaptureAddress(
3019*61046927SAndroid Build Coastguard Worker VkDevice device,
3020*61046927SAndroid Build Coastguard Worker const VkDeviceMemoryOpaqueCaptureAddressInfo *pInfo)
3021*61046927SAndroid Build Coastguard Worker {
3022*61046927SAndroid Build Coastguard Worker /* Not implemented */
3023*61046927SAndroid Build Coastguard Worker return 0;
3024*61046927SAndroid Build Coastguard Worker }
3025*61046927SAndroid Build Coastguard Worker
3026*61046927SAndroid Build Coastguard Worker VkResult
v3dv_create_compute_pipeline_from_nir(struct v3dv_device * device,nir_shader * nir,VkPipelineLayout pipeline_layout,VkPipeline * pipeline)3027*61046927SAndroid Build Coastguard Worker v3dv_create_compute_pipeline_from_nir(struct v3dv_device *device,
3028*61046927SAndroid Build Coastguard Worker nir_shader *nir,
3029*61046927SAndroid Build Coastguard Worker VkPipelineLayout pipeline_layout,
3030*61046927SAndroid Build Coastguard Worker VkPipeline *pipeline)
3031*61046927SAndroid Build Coastguard Worker {
3032*61046927SAndroid Build Coastguard Worker struct vk_shader_module cs_m = vk_shader_module_from_nir(nir);
3033*61046927SAndroid Build Coastguard Worker
3034*61046927SAndroid Build Coastguard Worker VkPipelineShaderStageCreateInfo set_event_cs_stage = {
3035*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
3036*61046927SAndroid Build Coastguard Worker .stage = VK_SHADER_STAGE_COMPUTE_BIT,
3037*61046927SAndroid Build Coastguard Worker .module = vk_shader_module_to_handle(&cs_m),
3038*61046927SAndroid Build Coastguard Worker .pName = "main",
3039*61046927SAndroid Build Coastguard Worker };
3040*61046927SAndroid Build Coastguard Worker
3041*61046927SAndroid Build Coastguard Worker VkComputePipelineCreateInfo info = {
3042*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
3043*61046927SAndroid Build Coastguard Worker .stage = set_event_cs_stage,
3044*61046927SAndroid Build Coastguard Worker .layout = pipeline_layout,
3045*61046927SAndroid Build Coastguard Worker };
3046*61046927SAndroid Build Coastguard Worker
3047*61046927SAndroid Build Coastguard Worker VkResult result =
3048*61046927SAndroid Build Coastguard Worker v3dv_CreateComputePipelines(v3dv_device_to_handle(device), VK_NULL_HANDLE,
3049*61046927SAndroid Build Coastguard Worker 1, &info, &device->vk.alloc, pipeline);
3050*61046927SAndroid Build Coastguard Worker
3051*61046927SAndroid Build Coastguard Worker return result;
3052*61046927SAndroid Build Coastguard Worker }
3053