From c7ecf10c200ffb16b58a74f6f33aa915d8952406 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sun, 21 Jul 2024 11:17:41 +0300 Subject: [PATCH] anv: split instance from anv_device.c Signed-off-by: Lionel Landwerlin Acked-by: Ivan Briano Part-of: --- src/intel/vulkan/anv_api_version.h | 22 +++ src/intel/vulkan/anv_device.c | 289 +---------------------------- src/intel/vulkan/anv_instance.c | 274 +++++++++++++++++++++++++++ src/intel/vulkan/anv_private.h | 6 + src/intel/vulkan/meson.build | 1 + 5 files changed, 306 insertions(+), 286 deletions(-) create mode 100644 src/intel/vulkan/anv_api_version.h create mode 100644 src/intel/vulkan/anv_instance.c diff --git a/src/intel/vulkan/anv_api_version.h b/src/intel/vulkan/anv_api_version.h new file mode 100644 index 00000000000..2c4a983a7fa --- /dev/null +++ b/src/intel/vulkan/anv_api_version.h @@ -0,0 +1,22 @@ +/* Copyright © 2024 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) || \ + defined(VK_USE_PLATFORM_XCB_KHR) || \ + defined(VK_USE_PLATFORM_XLIB_KHR) || \ + defined(VK_USE_PLATFORM_DISPLAY_KHR) +#define ANV_USE_WSI_PLATFORM +#endif + +#ifdef ANDROID_STRICT +#if ANDROID_API_LEVEL >= 33 +#define ANV_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION) +#else +#define ANV_API_VERSION VK_MAKE_VERSION(1, 1, VK_HEADER_VERSION) +#endif +#else +#define ANV_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION) +#endif diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index e988569c9a6..9cb79a542aa 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -40,6 +40,7 @@ #include #include "anv_private.h" +#include "anv_api_version.h" #include "anv_measure.h" #include "util/u_debug.h" #include "util/build_id.h" @@ -52,7 +53,6 @@ #include "util/u_gralloc/u_gralloc.h" #endif #include "util/u_string.h" -#include "util/driconf.h" #include "git_sha1.h" #include "vk_common_entrypoints.h" #include "vk_util.h" @@ -71,61 +71,6 @@ #include "genxml/gen7_pack.h" #include "genxml/genX_bits.h" -static const driOptionDescription anv_dri_options[] = { - DRI_CONF_SECTION_PERFORMANCE - DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) - DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) - DRI_CONF_VK_KHR_PRESENT_WAIT(false) - DRI_CONF_VK_XWAYLAND_WAIT_READY(false) - DRI_CONF_ANV_ASSUME_FULL_SUBGROUPS(0) - DRI_CONF_ANV_DISABLE_FCV(false) - DRI_CONF_ANV_EXTERNAL_MEMORY_IMPLICIT_SYNC(true) - DRI_CONF_ANV_FORCE_GUC_LOW_LATENCY(false) - DRI_CONF_ANV_SAMPLE_MASK_OUT_OPENGL_BEHAVIOUR(false) - DRI_CONF_ANV_FORCE_FILTER_ADDR_ROUNDING(false) - DRI_CONF_ANV_FP64_WORKAROUND_ENABLED(false) - DRI_CONF_ANV_GENERATED_INDIRECT_THRESHOLD(4) - DRI_CONF_ANV_GENERATED_INDIRECT_RING_THRESHOLD(100) - DRI_CONF_NO_16BIT(false) - DRI_CONF_INTEL_ENABLE_WA_14018912822(false) - DRI_CONF_INTEL_SAMPLER_ROUTE_TO_LSC(false) - DRI_CONF_ANV_QUERY_CLEAR_WITH_BLORP_THRESHOLD(6) - DRI_CONF_ANV_QUERY_COPY_WITH_SHADER_THRESHOLD(6) - DRI_CONF_ANV_FORCE_INDIRECT_DESCRIPTORS(false) - DRI_CONF_SHADER_SPILLING_RATE(0) - DRI_CONF_OPT_B(intel_tbimr, true, "Enable TBIMR tiled rendering") - DRI_CONF_ANV_COMPRESSION_CONTROL_ENABLED(false) - DRI_CONF_ANV_FAKE_NONLOCAL_MEMORY(false) - DRI_CONF_OPT_E(intel_stack_id, 512, 256, 2048, - "Control the number stackIDs (i.e. number of unique rays in the RT subsytem)", - DRI_CONF_ENUM(256, "256 stackids") - DRI_CONF_ENUM(512, "512 stackids") - DRI_CONF_ENUM(1024, "1024 stackids") - DRI_CONF_ENUM(2048, "2048 stackids")) - DRI_CONF_SECTION_END - - DRI_CONF_SECTION_DEBUG - DRI_CONF_ALWAYS_FLUSH_CACHE(false) - DRI_CONF_VK_WSI_FORCE_BGRA8_UNORM_FIRST(false) - DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false) - DRI_CONF_VK_X11_IGNORE_SUBOPTIMAL(false) - DRI_CONF_LIMIT_TRIG_INPUT_RANGE(false) - DRI_CONF_ANV_MESH_CONV_PRIM_ATTRS_TO_VERT_ATTRS(-2) - DRI_CONF_FORCE_VK_VENDOR() - DRI_CONF_FAKE_SPARSE(false) -#if DETECT_OS_ANDROID && ANDROID_API_LEVEL >= 34 - DRI_CONF_VK_REQUIRE_ASTC(true) -#else - DRI_CONF_VK_REQUIRE_ASTC(false) -#endif - DRI_CONF_SECTION_END - - DRI_CONF_SECTION_QUALITY - DRI_CONF_PP_LOWER_DEPTH_RANGE_RATE() - DRI_CONF_SECTION_END -}; - /* This is probably far to big but it reflects the max size used for messages * in OpenGLs KHR_debug. */ @@ -163,70 +108,6 @@ compiler_perf_log(UNUSED void *data, UNUSED unsigned *id, const char *fmt, ...) va_end(args); } -#if defined(VK_USE_PLATFORM_WAYLAND_KHR) || \ - defined(VK_USE_PLATFORM_XCB_KHR) || \ - defined(VK_USE_PLATFORM_XLIB_KHR) || \ - defined(VK_USE_PLATFORM_DISPLAY_KHR) -#define ANV_USE_WSI_PLATFORM -#endif - -#ifdef ANDROID_STRICT -#if ANDROID_API_LEVEL >= 33 -#define ANV_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION) -#else -#define ANV_API_VERSION VK_MAKE_VERSION(1, 1, VK_HEADER_VERSION) -#endif -#else -#define ANV_API_VERSION VK_MAKE_VERSION(1, 3, VK_HEADER_VERSION) -#endif - -VkResult anv_EnumerateInstanceVersion( - uint32_t* pApiVersion) -{ - *pApiVersion = ANV_API_VERSION; - return VK_SUCCESS; -} - -static const struct vk_instance_extension_table instance_extensions = { - .KHR_device_group_creation = true, - .KHR_external_fence_capabilities = true, - .KHR_external_memory_capabilities = true, - .KHR_external_semaphore_capabilities = true, - .KHR_get_physical_device_properties2 = true, - .EXT_debug_report = true, - .EXT_debug_utils = true, - -#ifdef ANV_USE_WSI_PLATFORM - .KHR_get_surface_capabilities2 = true, - .KHR_surface = true, - .KHR_surface_protected_capabilities = true, - .EXT_surface_maintenance1 = true, - .EXT_swapchain_colorspace = true, -#endif -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - .KHR_wayland_surface = true, -#endif -#ifdef VK_USE_PLATFORM_XCB_KHR - .KHR_xcb_surface = true, -#endif -#ifdef VK_USE_PLATFORM_XLIB_KHR - .KHR_xlib_surface = true, -#endif -#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT - .EXT_acquire_xlib_display = true, -#endif -#ifdef VK_USE_PLATFORM_DISPLAY_KHR - .KHR_display = true, - .KHR_get_display_properties2 = true, - .EXT_direct_mode_display = true, - .EXT_display_surface_counter = true, - .EXT_acquire_drm_display = true, -#endif -#ifndef VK_USE_PLATFORM_WIN32_KHR - .EXT_headless_surface = true, -#endif -}; - static void get_device_extensions(const struct anv_physical_device *device, struct vk_device_extension_table *ext) @@ -2369,7 +2250,7 @@ anv_physical_device_get_parameters(struct anv_physical_device *device) } } -static VkResult +VkResult anv_physical_device_try_create(struct vk_instance *vk_instance, struct _drmDevice *drm_device, struct vk_physical_device **out) @@ -2682,7 +2563,7 @@ fail_fd: return result; } -static void +void anv_physical_device_destroy(struct vk_physical_device *vk_device) { struct anv_physical_device *device = @@ -2701,149 +2582,6 @@ anv_physical_device_destroy(struct vk_physical_device *vk_device) vk_free(&device->instance->vk.alloc, device); } -VkResult anv_EnumerateInstanceExtensionProperties( - const char* pLayerName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) -{ - if (pLayerName) - return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); - - return vk_enumerate_instance_extension_properties( - &instance_extensions, pPropertyCount, pProperties); -} - -static void -anv_init_dri_options(struct anv_instance *instance) -{ - driParseOptionInfo(&instance->available_dri_options, anv_dri_options, - ARRAY_SIZE(anv_dri_options)); - driParseConfigFiles(&instance->dri_options, - &instance->available_dri_options, 0, "anv", NULL, NULL, - instance->vk.app_info.app_name, - instance->vk.app_info.app_version, - instance->vk.app_info.engine_name, - instance->vk.app_info.engine_version); - - instance->assume_full_subgroups = - driQueryOptioni(&instance->dri_options, "anv_assume_full_subgroups"); - instance->limit_trig_input_range = - driQueryOptionb(&instance->dri_options, "limit_trig_input_range"); - instance->sample_mask_out_opengl_behaviour = - driQueryOptionb(&instance->dri_options, "anv_sample_mask_out_opengl_behaviour"); - instance->force_filter_addr_rounding = - driQueryOptionb(&instance->dri_options, "anv_force_filter_addr_rounding"); - instance->lower_depth_range_rate = - driQueryOptionf(&instance->dri_options, "lower_depth_range_rate"); - instance->no_16bit = - driQueryOptionb(&instance->dri_options, "no_16bit"); - instance->intel_enable_wa_14018912822 = - driQueryOptionb(&instance->dri_options, "intel_enable_wa_14018912822"); - instance->mesh_conv_prim_attrs_to_vert_attrs = - driQueryOptioni(&instance->dri_options, "anv_mesh_conv_prim_attrs_to_vert_attrs"); - instance->fp64_workaround_enabled = - driQueryOptionb(&instance->dri_options, "fp64_workaround_enabled"); - instance->generated_indirect_threshold = - driQueryOptioni(&instance->dri_options, "generated_indirect_threshold"); - instance->generated_indirect_ring_threshold = - driQueryOptioni(&instance->dri_options, "generated_indirect_ring_threshold"); - instance->query_clear_with_blorp_threshold = - driQueryOptioni(&instance->dri_options, "query_clear_with_blorp_threshold"); - instance->query_copy_with_shader_threshold = - driQueryOptioni(&instance->dri_options, "query_copy_with_shader_threshold"); - instance->force_vk_vendor = - driQueryOptioni(&instance->dri_options, "force_vk_vendor"); - instance->has_fake_sparse = - driQueryOptionb(&instance->dri_options, "fake_sparse"); - instance->enable_tbimr = driQueryOptionb(&instance->dri_options, "intel_tbimr"); - instance->disable_fcv = - driQueryOptionb(&instance->dri_options, "anv_disable_fcv"); - instance->external_memory_implicit_sync = - driQueryOptionb(&instance->dri_options, "anv_external_memory_implicit_sync"); - instance->compression_control_enabled = - driQueryOptionb(&instance->dri_options, "compression_control_enabled"); - instance->anv_fake_nonlocal_memory = - driQueryOptionb(&instance->dri_options, "anv_fake_nonlocal_memory"); - - instance->stack_ids = driQueryOptioni(&instance->dri_options, "intel_stack_id"); - switch (instance->stack_ids) { - case 256: - case 512: - case 1024: - case 2048: - break; - default: - mesa_logw("Invalid value provided for drirc intel_stack_id=%u, reverting to 512.", - instance->stack_ids); - instance->stack_ids = 512; - break; - } - instance->force_guc_low_latency = driQueryOptionb(&instance->dri_options, "force_guc_low_latency"); -} - -VkResult anv_CreateInstance( - const VkInstanceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkInstance* pInstance) -{ - struct anv_instance *instance; - VkResult result; - - assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); - - if (pAllocator == NULL) - pAllocator = vk_default_allocator(); - - instance = vk_alloc(pAllocator, sizeof(*instance), 8, - VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); - if (!instance) - return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY); - - struct vk_instance_dispatch_table dispatch_table; - vk_instance_dispatch_table_from_entrypoints( - &dispatch_table, &anv_instance_entrypoints, true); - vk_instance_dispatch_table_from_entrypoints( - &dispatch_table, &wsi_instance_entrypoints, false); - - result = vk_instance_init(&instance->vk, &instance_extensions, - &dispatch_table, pCreateInfo, pAllocator); - if (result != VK_SUCCESS) { - vk_free(pAllocator, instance); - return vk_error(NULL, result); - } - - instance->vk.physical_devices.try_create_for_drm = anv_physical_device_try_create; - instance->vk.physical_devices.destroy = anv_physical_device_destroy; - - VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false)); - - anv_init_dri_options(instance); - - intel_driver_ds_init(); - - *pInstance = anv_instance_to_handle(instance); - - return VK_SUCCESS; -} - -void anv_DestroyInstance( - VkInstance _instance, - const VkAllocationCallbacks* pAllocator) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - - if (!instance) - return; - - VG(VALGRIND_DESTROY_MEMPOOL(instance)); - - driDestroyOptionCache(&instance->dri_options); - driDestroyOptionInfo(&instance->available_dri_options); - - vk_instance_finish(&instance->vk); - vk_free(&instance->vk.alloc, instance); -} - static const VkQueueFamilyProperties get_anv_queue_family_properties_template(const struct anv_physical_device *device) { @@ -3055,27 +2793,6 @@ void anv_GetPhysicalDeviceMemoryProperties2( } } -PFN_vkVoidFunction anv_GetInstanceProcAddr( - VkInstance _instance, - const char* pName) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - return vk_instance_get_proc_addr(&instance->vk, - &anv_instance_entrypoints, - pName); -} - -/* With version 1+ of the loader interface the ICD should expose - * vk_icdGetInstanceProcAddr to work around certain LD_PRELOAD issues seen in apps. - */ -PUBLIC -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( - VkInstance instance, - const char* pName) -{ - return anv_GetInstanceProcAddr(instance, pName); -} - static void anv_device_init_border_colors(struct anv_device *device) { diff --git a/src/intel/vulkan/anv_instance.c b/src/intel/vulkan/anv_instance.c new file mode 100644 index 00000000000..5c8eb543039 --- /dev/null +++ b/src/intel/vulkan/anv_instance.c @@ -0,0 +1,274 @@ +/* Copyright © 2024 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include "anv_private.h" +#include "anv_api_version.h" + +#include "util/driconf.h" + +static const driOptionDescription anv_dri_options[] = { + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_ADAPTIVE_SYNC(true) + DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) + DRI_CONF_VK_KHR_PRESENT_WAIT(false) + DRI_CONF_VK_XWAYLAND_WAIT_READY(false) + DRI_CONF_ANV_ASSUME_FULL_SUBGROUPS(0) + DRI_CONF_ANV_DISABLE_FCV(false) + DRI_CONF_ANV_EXTERNAL_MEMORY_IMPLICIT_SYNC(true) + DRI_CONF_ANV_FORCE_GUC_LOW_LATENCY(false) + DRI_CONF_ANV_SAMPLE_MASK_OUT_OPENGL_BEHAVIOUR(false) + DRI_CONF_ANV_FORCE_FILTER_ADDR_ROUNDING(false) + DRI_CONF_ANV_FP64_WORKAROUND_ENABLED(false) + DRI_CONF_ANV_GENERATED_INDIRECT_THRESHOLD(4) + DRI_CONF_ANV_GENERATED_INDIRECT_RING_THRESHOLD(100) + DRI_CONF_NO_16BIT(false) + DRI_CONF_INTEL_ENABLE_WA_14018912822(false) + DRI_CONF_INTEL_SAMPLER_ROUTE_TO_LSC(false) + DRI_CONF_ANV_QUERY_CLEAR_WITH_BLORP_THRESHOLD(6) + DRI_CONF_ANV_QUERY_COPY_WITH_SHADER_THRESHOLD(6) + DRI_CONF_ANV_FORCE_INDIRECT_DESCRIPTORS(false) + DRI_CONF_SHADER_SPILLING_RATE(0) + DRI_CONF_OPT_B(intel_tbimr, true, "Enable TBIMR tiled rendering") + DRI_CONF_ANV_COMPRESSION_CONTROL_ENABLED(false) + DRI_CONF_ANV_FAKE_NONLOCAL_MEMORY(false) + DRI_CONF_OPT_E(intel_stack_id, 512, 256, 2048, + "Control the number stackIDs (i.e. number of unique rays in the RT subsytem)", + DRI_CONF_ENUM(256, "256 stackids") + DRI_CONF_ENUM(512, "512 stackids") + DRI_CONF_ENUM(1024, "1024 stackids") + DRI_CONF_ENUM(2048, "2048 stackids")) + DRI_CONF_SECTION_END + + DRI_CONF_SECTION_DEBUG + DRI_CONF_ALWAYS_FLUSH_CACHE(false) + DRI_CONF_VK_WSI_FORCE_BGRA8_UNORM_FIRST(false) + DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false) + DRI_CONF_VK_X11_IGNORE_SUBOPTIMAL(false) + DRI_CONF_LIMIT_TRIG_INPUT_RANGE(false) + DRI_CONF_ANV_MESH_CONV_PRIM_ATTRS_TO_VERT_ATTRS(-2) + DRI_CONF_FORCE_VK_VENDOR() + DRI_CONF_FAKE_SPARSE(false) +#if DETECT_OS_ANDROID && ANDROID_API_LEVEL >= 34 + DRI_CONF_VK_REQUIRE_ASTC(true) +#else + DRI_CONF_VK_REQUIRE_ASTC(false) +#endif + DRI_CONF_SECTION_END + + DRI_CONF_SECTION_QUALITY + DRI_CONF_PP_LOWER_DEPTH_RANGE_RATE() + DRI_CONF_SECTION_END +}; + +VkResult anv_EnumerateInstanceVersion( + uint32_t* pApiVersion) +{ + *pApiVersion = ANV_API_VERSION; + return VK_SUCCESS; +} + +static const struct vk_instance_extension_table instance_extensions = { + .KHR_device_group_creation = true, + .KHR_external_fence_capabilities = true, + .KHR_external_memory_capabilities = true, + .KHR_external_semaphore_capabilities = true, + .KHR_get_physical_device_properties2 = true, + .EXT_debug_report = true, + .EXT_debug_utils = true, + +#ifdef ANV_USE_WSI_PLATFORM + .KHR_get_surface_capabilities2 = true, + .KHR_surface = true, + .KHR_surface_protected_capabilities = true, + .EXT_surface_maintenance1 = true, + .EXT_swapchain_colorspace = true, +#endif +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + .KHR_wayland_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XCB_KHR + .KHR_xcb_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XLIB_KHR + .KHR_xlib_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT + .EXT_acquire_xlib_display = true, +#endif +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + .KHR_display = true, + .KHR_get_display_properties2 = true, + .EXT_direct_mode_display = true, + .EXT_display_surface_counter = true, + .EXT_acquire_drm_display = true, +#endif +#ifndef VK_USE_PLATFORM_WIN32_KHR + .EXT_headless_surface = true, +#endif +}; + +VkResult anv_EnumerateInstanceExtensionProperties( + const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties) +{ + if (pLayerName) + return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); + + return vk_enumerate_instance_extension_properties( + &instance_extensions, pPropertyCount, pProperties); +} + +static void +anv_init_dri_options(struct anv_instance *instance) +{ + driParseOptionInfo(&instance->available_dri_options, anv_dri_options, + ARRAY_SIZE(anv_dri_options)); + driParseConfigFiles(&instance->dri_options, + &instance->available_dri_options, 0, "anv", NULL, NULL, + instance->vk.app_info.app_name, + instance->vk.app_info.app_version, + instance->vk.app_info.engine_name, + instance->vk.app_info.engine_version); + + instance->assume_full_subgroups = + driQueryOptioni(&instance->dri_options, "anv_assume_full_subgroups"); + instance->limit_trig_input_range = + driQueryOptionb(&instance->dri_options, "limit_trig_input_range"); + instance->sample_mask_out_opengl_behaviour = + driQueryOptionb(&instance->dri_options, "anv_sample_mask_out_opengl_behaviour"); + instance->force_filter_addr_rounding = + driQueryOptionb(&instance->dri_options, "anv_force_filter_addr_rounding"); + instance->lower_depth_range_rate = + driQueryOptionf(&instance->dri_options, "lower_depth_range_rate"); + instance->no_16bit = + driQueryOptionb(&instance->dri_options, "no_16bit"); + instance->intel_enable_wa_14018912822 = + driQueryOptionb(&instance->dri_options, "intel_enable_wa_14018912822"); + instance->mesh_conv_prim_attrs_to_vert_attrs = + driQueryOptioni(&instance->dri_options, "anv_mesh_conv_prim_attrs_to_vert_attrs"); + instance->fp64_workaround_enabled = + driQueryOptionb(&instance->dri_options, "fp64_workaround_enabled"); + instance->generated_indirect_threshold = + driQueryOptioni(&instance->dri_options, "generated_indirect_threshold"); + instance->generated_indirect_ring_threshold = + driQueryOptioni(&instance->dri_options, "generated_indirect_ring_threshold"); + instance->query_clear_with_blorp_threshold = + driQueryOptioni(&instance->dri_options, "query_clear_with_blorp_threshold"); + instance->query_copy_with_shader_threshold = + driQueryOptioni(&instance->dri_options, "query_copy_with_shader_threshold"); + instance->force_vk_vendor = + driQueryOptioni(&instance->dri_options, "force_vk_vendor"); + instance->has_fake_sparse = + driQueryOptionb(&instance->dri_options, "fake_sparse"); + instance->enable_tbimr = driQueryOptionb(&instance->dri_options, "intel_tbimr"); + instance->disable_fcv = + driQueryOptionb(&instance->dri_options, "anv_disable_fcv"); + instance->external_memory_implicit_sync = + driQueryOptionb(&instance->dri_options, "anv_external_memory_implicit_sync"); + instance->compression_control_enabled = + driQueryOptionb(&instance->dri_options, "compression_control_enabled"); + instance->anv_fake_nonlocal_memory = + driQueryOptionb(&instance->dri_options, "anv_fake_nonlocal_memory"); + + instance->stack_ids = driQueryOptioni(&instance->dri_options, "intel_stack_id"); + switch (instance->stack_ids) { + case 256: + case 512: + case 1024: + case 2048: + break; + default: + mesa_logw("Invalid value provided for drirc intel_stack_id=%u, reverting to 512.", + instance->stack_ids); + instance->stack_ids = 512; + break; + } + instance->force_guc_low_latency = driQueryOptionb(&instance->dri_options, "force_guc_low_latency"); +} + +VkResult anv_CreateInstance( + const VkInstanceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkInstance* pInstance) +{ + struct anv_instance *instance; + VkResult result; + + assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); + + if (pAllocator == NULL) + pAllocator = vk_default_allocator(); + + instance = vk_alloc(pAllocator, sizeof(*instance), 8, + VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!instance) + return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY); + + struct vk_instance_dispatch_table dispatch_table; + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &anv_instance_entrypoints, true); + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_instance_entrypoints, false); + + result = vk_instance_init(&instance->vk, &instance_extensions, + &dispatch_table, pCreateInfo, pAllocator); + if (result != VK_SUCCESS) { + vk_free(pAllocator, instance); + return vk_error(NULL, result); + } + + instance->vk.physical_devices.try_create_for_drm = anv_physical_device_try_create; + instance->vk.physical_devices.destroy = anv_physical_device_destroy; + + VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false)); + + anv_init_dri_options(instance); + + intel_driver_ds_init(); + + *pInstance = anv_instance_to_handle(instance); + + return VK_SUCCESS; +} + +void anv_DestroyInstance( + VkInstance _instance, + const VkAllocationCallbacks* pAllocator) +{ + ANV_FROM_HANDLE(anv_instance, instance, _instance); + + if (!instance) + return; + + VG(VALGRIND_DESTROY_MEMPOOL(instance)); + + driDestroyOptionCache(&instance->dri_options); + driDestroyOptionInfo(&instance->available_dri_options); + + vk_instance_finish(&instance->vk); + vk_free(&instance->vk.alloc, instance); +} + +PFN_vkVoidFunction anv_GetInstanceProcAddr( + VkInstance _instance, + const char* pName) +{ + ANV_FROM_HANDLE(anv_instance, instance, _instance); + return vk_instance_get_proc_addr(&instance->vk, + &anv_instance_entrypoints, + pName); +} + +/* With version 1+ of the loader interface the ICD should expose + * vk_icdGetInstanceProcAddr to work around certain LD_PRELOAD issues seen in apps. + */ +PUBLIC +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( + VkInstance instance, + const char* pName) +{ + return anv_GetInstanceProcAddr(instance, pName); +} diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d865e3d4a46..5caf43096c3 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1226,6 +1226,12 @@ struct anv_physical_device { uint32_t empty_vs_input[2]; }; +VkResult anv_physical_device_try_create(struct vk_instance *vk_instance, + struct _drmDevice *drm_device, + struct vk_physical_device **out); + +void anv_physical_device_destroy(struct vk_physical_device *vk_device); + static inline uint32_t anv_physical_device_bindless_heap_size(const struct anv_physical_device *device, bool descriptor_buffer) diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build index 0ffad58e1e6..736f9400073 100644 --- a/src/intel/vulkan/meson.build +++ b/src/intel/vulkan/meson.build @@ -156,6 +156,7 @@ libanv_files = files( 'anv_image.c', 'anv_internal_kernels.c', 'anv_internal_kernels.h', + 'anv_instance.c', 'anv_kmd_backend.c', 'anv_kmd_backend.h', 'anv_measure.c',