From ed2fb8099e4588e058e7a18df6f63543d88bd493 Mon Sep 17 00:00:00 2001 From: Hoe Hao Cheng Date: Thu, 27 May 2021 03:10:09 +0800 Subject: [PATCH] zink: introduce vk_dispatch_table Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/drivers/zink/meson.build | 14 +++++++++++++- src/gallium/drivers/zink/zink_screen.c | 12 +++++++++--- src/gallium/drivers/zink/zink_screen.h | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/meson.build b/src/gallium/drivers/zink/meson.build index 90f743ca6eb..8a7c02e404f 100644 --- a/src/gallium/drivers/zink/meson.build +++ b/src/gallium/drivers/zink/meson.build @@ -73,6 +73,18 @@ zink_nir_algebraic_c = custom_target( depend_files : nir_algebraic_py, ) +zink_dispatch_table = custom_target( + 'zink_dispatch_table.c', + input : join_paths(meson.source_root(), 'src/vulkan/util/vk_dispatch_table_gen.py'), + output : ['zink_dispatch_table.h', 'zink_dispatch_table.c'], + command : [ + prog_python, '@INPUT@', + '--xml', join_paths(meson.source_root(), 'src/vulkan/registry/vk.xml'), + '--out-h', '@OUTPUT0@', + '--out-c', '@OUTPUT1@', + ], +) + zink_c_args = [] inc_zink_vk = [] @@ -89,7 +101,7 @@ endif libzink = static_library( 'zink', - [files_libzink, zink_device_info, zink_instance, zink_nir_algebraic_c], + [files_libzink, zink_device_info, zink_instance, zink_nir_algebraic_c, zink_dispatch_table], gnu_symbol_visibility : 'hidden', include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_vulkan_wsi, inc_vulkan_util, inc_zink_vk], dependencies: [dep_vulkan, idep_nir_headers, idep_mesautil], diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 6a02e84a172..c6e92d20a38 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1664,6 +1664,12 @@ zink_internal_create_screen(const struct pipe_screen_config *config) if (!screen->instance) goto fail; + vk_instance_dispatch_table_load(&screen->vk.instance, &vkGetInstanceProcAddr, screen->instance); + vk_physical_device_dispatch_table_load(&screen->vk.physical_device, &vkGetInstanceProcAddr, screen->instance); + + if (!zink_load_instance_extensions(screen)) + goto fail; + if (screen->instance_info.have_EXT_debug_utils && (zink_debug & ZINK_DEBUG_VALIDATION) && !create_debug(screen)) debug_printf("ZINK: failed to setup debug utils\n"); @@ -1679,9 +1685,6 @@ zink_internal_create_screen(const struct pipe_screen_config *config) screen->have_D24_UNORM_S8_UINT = zink_is_depth_format_supported(screen, VK_FORMAT_D24_UNORM_S8_UINT); - if (!zink_load_instance_extensions(screen)) - goto fail; - if (!zink_get_physical_device_info(screen)) { debug_printf("ZINK: failed to detect features\n"); goto fail; @@ -1703,9 +1706,12 @@ zink_internal_create_screen(const struct pipe_screen_config *config) screen->info.driver_props.driverID == VK_DRIVER_ID_AMD_PROPRIETARY) /* this has bad perf on AMD */ screen->info.have_KHR_push_descriptor = false; + if (!load_device_extensions(screen)) goto fail; + vk_device_dispatch_table_load(&screen->vk.device, &vkGetDeviceProcAddr, screen->dev); + check_base_requirements(screen); screen->base.get_name = zink_get_name; diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index 1a570c6ceae..aeb6e3c3262 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -26,6 +26,7 @@ #include "zink_device_info.h" #include "zink_instance.h" +#include "zink_dispatch_table.h" #include "util/u_idalloc.h" #include "pipe/p_screen.h" @@ -114,6 +115,8 @@ struct zink_screen { bool needs_mesa_wsi; bool needs_mesa_flush_wsi; + struct vk_dispatch_table vk; + PFN_vkGetPhysicalDeviceFeatures2 vk_GetPhysicalDeviceFeatures2; PFN_vkGetPhysicalDeviceProperties2 vk_GetPhysicalDeviceProperties2; PFN_vkGetPhysicalDeviceFormatProperties2 vk_GetPhysicalDeviceFormatProperties2;