From a0355dfcfbebd80418563dd0b67c24dc8c4dd534 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 23 Oct 2023 09:11:26 -0500 Subject: [PATCH] nvk: Advertise Vulkan 1.1 on Turing+ We actually trigger on whether or not NAK is used for everything. If so, we claim 1.1, otherwise claim 1.0. We need NAK for subgroup ops and other advanced shader features in later Vulkan versions. Part-of: --- src/nouveau/vulkan/meson.build | 4 +-- src/nouveau/vulkan/nvk_instance.c | 2 +- src/nouveau/vulkan/nvk_physical_device.c | 33 +++++++++++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/nouveau/vulkan/meson.build b/src/nouveau/vulkan/meson.build index 9564120d33f..41f9ccb636d 100644 --- a/src/nouveau/vulkan/meson.build +++ b/src/nouveau/vulkan/meson.build @@ -126,7 +126,7 @@ nouveau_icd = custom_target( output : 'nouveau_icd.@0@.json'.format(host_machine.cpu()), command : [ prog_python, '@INPUT0@', - '--api-version', '1.0', '--xml', '@INPUT1@', + '--api-version', '1.1', '--xml', '@INPUT1@', '--lib-path', join_paths(icd_lib_path, icd_file_name), '--out', '@OUTPUT@', ], @@ -144,7 +144,7 @@ if meson.version().version_compare('>= 0.58') output : _dev_icdname, command : [ prog_python, '@INPUT0@', - '--api-version', '1.0', '--xml', '@INPUT1@', + '--api-version', '1.1', '--xml', '@INPUT1@', '--lib-path', meson.current_build_dir() / icd_file_name, '--out', '@OUTPUT@', ], diff --git a/src/nouveau/vulkan/nvk_instance.c b/src/nouveau/vulkan/nvk_instance.c index c0b28add1f2..21d99bc2ae3 100644 --- a/src/nouveau/vulkan/nvk_instance.c +++ b/src/nouveau/vulkan/nvk_instance.c @@ -17,7 +17,7 @@ nvk_EnumerateInstanceVersion(uint32_t *pApiVersion) { uint32_t version_override = vk_get_version_override(); *pApiVersion = version_override ? version_override : - VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION); + VK_MAKE_VERSION(1, 1, VK_HEADER_VERSION); return VK_SUCCESS; } diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index ace03c133f9..1817f04b67c 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -41,6 +41,35 @@ #include "clc5c0.h" #include "clc997.h" +static bool +nvk_use_nak(const struct nv_device_info *info) +{ + const VkShaderStageFlags vk10_stages = + VK_SHADER_STAGE_VERTEX_BIT | + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | + VK_SHADER_STAGE_GEOMETRY_BIT | + VK_SHADER_STAGE_FRAGMENT_BIT | + VK_SHADER_STAGE_COMPUTE_BIT; + + return !(vk10_stages & ~nvk_nak_stages(info)); +} + +static uint32_t +nvk_get_vk_version(const struct nv_device_info *info) +{ + /* Version override takes priority */ + const uint32_t version_override = vk_get_version_override(); + if (version_override) + return version_override; + + /* If we're using codegen for anything, lock to version 1.0 */ + if (!nvk_use_nak(info)) + return VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION); + + return VK_MAKE_VERSION(1, 1, VK_HEADER_VERSION); +} + static void nvk_get_device_extensions(const struct nv_device_info *info, struct vk_device_extension_table *ext) @@ -421,15 +450,13 @@ nvk_get_device_properties(const struct nvk_instance *instance, const struct nv_device_info *info, struct vk_properties *properties) { - uint32_t version_override = vk_get_version_override(); const VkSampleCountFlagBits sample_counts = VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT | VK_SAMPLE_COUNT_8_BIT; *properties = (struct vk_properties) { - .apiVersion = version_override ? version_override : - VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION), + .apiVersion = nvk_get_vk_version(info), .driverVersion = vk_get_driver_version(), .vendorID = NVIDIA_VENDOR_ID, .deviceID = info->device_id,