Fix issue where we should be using device supported version instead of instance version for Vulkan
This commit is contained in:
parent
015dc492de
commit
2562c06032
@ -378,9 +378,7 @@ Error VulkanContext::_obtain_vulkan_version() {
|
||||
uint32_t api_version;
|
||||
VkResult res = func(&api_version);
|
||||
if (res == VK_SUCCESS) {
|
||||
vulkan_major = VK_API_VERSION_MAJOR(api_version);
|
||||
vulkan_minor = VK_API_VERSION_MINOR(api_version);
|
||||
vulkan_patch = VK_API_VERSION_PATCH(api_version);
|
||||
instance_api_version = api_version;
|
||||
} else {
|
||||
// According to the documentation this shouldn't fail with anything except a memory allocation error
|
||||
// in which case we're in deep trouble anyway.
|
||||
@ -388,13 +386,7 @@ Error VulkanContext::_obtain_vulkan_version() {
|
||||
}
|
||||
} else {
|
||||
print_line("vkEnumerateInstanceVersion not available, assuming Vulkan 1.0.");
|
||||
}
|
||||
|
||||
// We don't go above 1.2.
|
||||
if ((vulkan_major > 1) || (vulkan_major == 1 && vulkan_minor > 2)) {
|
||||
vulkan_major = 1;
|
||||
vulkan_minor = 2;
|
||||
vulkan_patch = 0;
|
||||
instance_api_version = VK_API_VERSION_1_0;
|
||||
}
|
||||
|
||||
return OK;
|
||||
@ -832,7 +824,7 @@ Error VulkanContext::_check_capabilities() {
|
||||
VkPhysicalDeviceProperties2 physicalDeviceProperties{};
|
||||
void *nextptr = nullptr;
|
||||
|
||||
if (!(vulkan_major == 1 && vulkan_minor == 0)) {
|
||||
if (device_api_version >= VK_API_VERSION_1_1) { // Vulkan 1.1 or higher
|
||||
subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
|
||||
subgroupProperties.pNext = nextptr;
|
||||
|
||||
@ -937,15 +929,21 @@ Error VulkanContext::_create_instance() {
|
||||
enabled_extension_names[enabled_extension_count++] = extension_name.ptr();
|
||||
}
|
||||
|
||||
// We'll set application version to the Vulkan version we're developing against, even if our instance is based on
|
||||
// an older Vulkan version, devices can still support newer versions of Vulkan.
|
||||
// The exception is when we're on Vulkan 1.0, we should not set this to anything but 1.0.
|
||||
// Note that this value is only used by validation layers to warn us about version issues.
|
||||
uint32_t application_api_version = instance_api_version == VK_API_VERSION_1_0 ? VK_API_VERSION_1_0 : VK_API_VERSION_1_2;
|
||||
|
||||
CharString cs = GLOBAL_GET("application/config/name").operator String().utf8();
|
||||
const VkApplicationInfo app = {
|
||||
/*sType*/ VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
||||
/*pNext*/ nullptr,
|
||||
/*pApplicationName*/ cs.get_data(),
|
||||
/*applicationVersion*/ 0,
|
||||
/*applicationVersion*/ 0, // It would be really nice if we store a version number in project settings, say "application/config/version"
|
||||
/*pEngineName*/ VERSION_NAME,
|
||||
/*engineVersion*/ VK_MAKE_VERSION(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH),
|
||||
/*apiVersion*/ VK_MAKE_VERSION(vulkan_major, vulkan_minor, 0)
|
||||
/*apiVersion*/ application_api_version
|
||||
};
|
||||
VkInstanceCreateInfo inst_info{};
|
||||
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||
@ -1257,12 +1255,12 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) {
|
||||
}
|
||||
}
|
||||
|
||||
print_line(
|
||||
"Vulkan API " + itos(vulkan_major) + "." + itos(vulkan_minor) + "." + itos(vulkan_patch) +
|
||||
" - " + "Using Vulkan Device #" + itos(device_index) + ": " + device_vendor + " - " + device_name);
|
||||
|
||||
// Get device version
|
||||
device_api_version = gpu_props.apiVersion;
|
||||
|
||||
// Output our device version
|
||||
print_line("Vulkan API " + get_device_api_version() + " - " + "Using Vulkan Device #" + itos(device_index) + ": " + device_vendor + " - " + device_name);
|
||||
|
||||
{
|
||||
Error _err = _initialize_device_extensions();
|
||||
if (_err != OK) {
|
||||
@ -1345,7 +1343,7 @@ Error VulkanContext::_create_device() {
|
||||
VkPhysicalDeviceVulkan11Features vulkan11features = {};
|
||||
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
|
||||
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
|
||||
if (vulkan_major > 1 || vulkan_minor >= 2) {
|
||||
if (device_api_version >= VK_API_VERSION_1_2) {
|
||||
// In Vulkan 1.2 and newer we use a newer struct to enable various features.
|
||||
|
||||
vulkan11features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
|
||||
@ -1373,7 +1371,7 @@ Error VulkanContext::_create_device() {
|
||||
storage_feature.storageInputOutput16 = storage_buffer_capabilities.storage_input_output_16;
|
||||
nextptr = &storage_feature;
|
||||
|
||||
if (vulkan_major == 1 && vulkan_minor == 1) {
|
||||
if (device_api_version >= VK_API_VERSION_1_1) { // any Vulkan 1.1.x version
|
||||
multiview_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
|
||||
multiview_features.pNext = nextptr;
|
||||
multiview_features.multiview = multiview_capabilities.is_supported;
|
||||
@ -2644,7 +2642,7 @@ RenderingDevice::DeviceType VulkanContext::get_device_type() const {
|
||||
}
|
||||
|
||||
String VulkanContext::get_device_api_version() const {
|
||||
return vformat("%d.%d.%d", vulkan_major, vulkan_minor, vulkan_patch);
|
||||
return vformat("%d.%d.%d", VK_API_VERSION_MAJOR(device_api_version), VK_API_VERSION_MINOR(device_api_version), VK_API_VERSION_PATCH(device_api_version));
|
||||
}
|
||||
|
||||
String VulkanContext::get_device_pipeline_cache_uuid() const {
|
||||
|
@ -110,10 +110,7 @@ private:
|
||||
bool device_initialized = false;
|
||||
bool inst_initialized = false;
|
||||
|
||||
// Vulkan 1.0 doesn't return version info so we assume this by default until we know otherwise.
|
||||
uint32_t vulkan_major = 1;
|
||||
uint32_t vulkan_minor = 0;
|
||||
uint32_t vulkan_patch = 0;
|
||||
uint32_t instance_api_version = VK_API_VERSION_1_0;
|
||||
SubgroupCapabilities subgroup_capabilities;
|
||||
MultiviewCapabilities multiview_capabilities;
|
||||
VRSCapabilities vrs_capabilities;
|
||||
@ -276,8 +273,8 @@ public:
|
||||
bool supports_renderpass2() const { return is_device_extension_enabled(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME); }
|
||||
VkResult vkCreateRenderPass2KHR(VkDevice p_device, const VkRenderPassCreateInfo2 *p_create_info, const VkAllocationCallbacks *p_allocator, VkRenderPass *p_render_pass);
|
||||
|
||||
uint32_t get_vulkan_major() const { return vulkan_major; };
|
||||
uint32_t get_vulkan_minor() const { return vulkan_minor; };
|
||||
uint32_t get_vulkan_major() const { return VK_API_VERSION_MAJOR(device_api_version); };
|
||||
uint32_t get_vulkan_minor() const { return VK_API_VERSION_MINOR(device_api_version); };
|
||||
const SubgroupCapabilities &get_subgroup_capabilities() const { return subgroup_capabilities; };
|
||||
const MultiviewCapabilities &get_multiview_capabilities() const { return multiview_capabilities; };
|
||||
const VRSCapabilities &get_vrs_capabilities() const { return vrs_capabilities; };
|
||||
|
Loading…
Reference in New Issue
Block a user