mirror of
https://github.com/godotengine/godot
synced 2024-10-14 11:19:11 +00:00
Enabling additional vulkan extension and adding further checks
This commit is contained in:
parent
cd3e03432a
commit
318656d326
|
@ -1666,34 +1666,27 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T
|
||||||
image_create_info.pNext = nullptr;
|
image_create_info.pNext = nullptr;
|
||||||
image_create_info.flags = 0;
|
image_create_info.flags = 0;
|
||||||
|
|
||||||
// TODO: Check for support via RenderingDevice to enable on mobile when possible.
|
|
||||||
|
|
||||||
#ifndef ANDROID_ENABLED
|
|
||||||
|
|
||||||
// vkCreateImage fails with format list on Android (VK_ERROR_OUT_OF_HOST_MEMORY)
|
|
||||||
VkImageFormatListCreateInfoKHR format_list_create_info; // Keep out of the if, needed for creation.
|
VkImageFormatListCreateInfoKHR format_list_create_info; // Keep out of the if, needed for creation.
|
||||||
Vector<VkFormat> allowed_formats; // Keep out of the if, needed for creation.
|
Vector<VkFormat> allowed_formats; // Keep out of the if, needed for creation.
|
||||||
#endif
|
|
||||||
if (p_format.shareable_formats.size()) {
|
if (p_format.shareable_formats.size()) {
|
||||||
image_create_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
|
image_create_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
|
||||||
|
|
||||||
#ifndef ANDROID_ENABLED
|
if (context->is_device_extension_enabled(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME)) {
|
||||||
|
for (int i = 0; i < p_format.shareable_formats.size(); i++) {
|
||||||
|
allowed_formats.push_back(vulkan_formats[p_format.shareable_formats[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < p_format.shareable_formats.size(); i++) {
|
format_list_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
|
||||||
allowed_formats.push_back(vulkan_formats[p_format.shareable_formats[i]]);
|
format_list_create_info.pNext = nullptr;
|
||||||
|
format_list_create_info.viewFormatCount = allowed_formats.size();
|
||||||
|
format_list_create_info.pViewFormats = allowed_formats.ptr();
|
||||||
|
image_create_info.pNext = &format_list_create_info;
|
||||||
|
|
||||||
|
ERR_FAIL_COND_V_MSG(p_format.shareable_formats.find(p_format.format) == -1, RID(),
|
||||||
|
"If supplied a list of shareable formats, the current format must be present in the list");
|
||||||
|
ERR_FAIL_COND_V_MSG(p_view.format_override != DATA_FORMAT_MAX && p_format.shareable_formats.find(p_view.format_override) == -1, RID(),
|
||||||
|
"If supplied a list of shareable formats, the current view format override must be present in the list");
|
||||||
}
|
}
|
||||||
|
|
||||||
format_list_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
|
|
||||||
format_list_create_info.pNext = nullptr;
|
|
||||||
format_list_create_info.viewFormatCount = allowed_formats.size();
|
|
||||||
format_list_create_info.pViewFormats = allowed_formats.ptr();
|
|
||||||
image_create_info.pNext = &format_list_create_info;
|
|
||||||
|
|
||||||
ERR_FAIL_COND_V_MSG(p_format.shareable_formats.find(p_format.format) == -1, RID(),
|
|
||||||
"If supplied a list of shareable formats, the current format must be present in the list");
|
|
||||||
ERR_FAIL_COND_V_MSG(p_view.format_override != DATA_FORMAT_MAX && p_format.shareable_formats.find(p_view.format_override) == -1, RID(),
|
|
||||||
"If supplied a list of shareable formats, the current view format override must be present in the list");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_format.texture_type == TEXTURE_TYPE_CUBE || p_format.texture_type == TEXTURE_TYPE_CUBE_ARRAY) {
|
if (p_format.texture_type == TEXTURE_TYPE_CUBE || p_format.texture_type == TEXTURE_TYPE_CUBE_ARRAY) {
|
||||||
|
@ -2096,49 +2089,54 @@ RID RenderingDeviceVulkan::texture_create_shared(const TextureView &p_view, RID
|
||||||
}
|
}
|
||||||
|
|
||||||
VkImageViewUsageCreateInfo usage_info;
|
VkImageViewUsageCreateInfo usage_info;
|
||||||
usage_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO;
|
if (context->is_device_extension_enabled(VK_KHR_MAINTENANCE_2_EXTENSION_NAME)) {
|
||||||
usage_info.pNext = nullptr;
|
// May need to make VK_KHR_maintenance2 manditory and thus has Vulkan 1.1 be our minimum supported version
|
||||||
if (p_view.format_override != DATA_FORMAT_MAX) {
|
// if we require setting this information. Vulkan 1.0 may simply not care..
|
||||||
// Need to validate usage with vulkan.
|
|
||||||
|
|
||||||
usage_info.usage = 0;
|
usage_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO;
|
||||||
|
usage_info.pNext = nullptr;
|
||||||
|
if (p_view.format_override != DATA_FORMAT_MAX) {
|
||||||
|
// Need to validate usage with vulkan.
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_SAMPLING_BIT) {
|
usage_info.usage = 0;
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_STORAGE_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_SAMPLING_BIT) {
|
||||||
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_STORAGE_BIT)) {
|
usage_info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_STORAGE_BIT) {
|
||||||
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_COLOR_ATTACHMENT_BIT)) {
|
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_STORAGE_BIT)) {
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
usage_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_INPUT_ATTACHMENT_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) {
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_COLOR_ATTACHMENT_BIT)) {
|
||||||
}
|
usage_info.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_INPUT_ATTACHMENT_BIT) {
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
usage_info.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_UPDATE_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
usage_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||||
}
|
}
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT) {
|
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT) {
|
if (texture.usage_flags & TEXTURE_USAGE_CAN_UPDATE_BIT) {
|
||||||
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
}
|
}
|
||||||
|
if (texture.usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT) {
|
||||||
|
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
image_view_create_info.pNext = &usage_info;
|
if (texture.usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT) {
|
||||||
|
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
image_view_create_info.pNext = &usage_info;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult err = vkCreateImageView(device, &image_view_create_info, nullptr, &texture.view);
|
VkResult err = vkCreateImageView(device, &image_view_create_info, nullptr, &texture.view);
|
||||||
|
@ -4278,7 +4276,7 @@ RID RenderingDeviceVulkan::sampler_create(const SamplerState &p_state) {
|
||||||
sampler_create_info.addressModeW = address_modes[p_state.repeat_w];
|
sampler_create_info.addressModeW = address_modes[p_state.repeat_w];
|
||||||
|
|
||||||
sampler_create_info.mipLodBias = p_state.lod_bias;
|
sampler_create_info.mipLodBias = p_state.lod_bias;
|
||||||
sampler_create_info.anisotropyEnable = p_state.use_anisotropy;
|
sampler_create_info.anisotropyEnable = p_state.use_anisotropy && context->get_physical_device_features().samplerAnisotropy;
|
||||||
sampler_create_info.maxAnisotropy = p_state.anisotropy_max;
|
sampler_create_info.maxAnisotropy = p_state.anisotropy_max;
|
||||||
sampler_create_info.compareEnable = p_state.enable_compare;
|
sampler_create_info.compareEnable = p_state.enable_compare;
|
||||||
|
|
||||||
|
@ -9368,7 +9366,7 @@ bool RenderingDeviceVulkan::has_feature(const Features p_feature) const {
|
||||||
return multiview_capabilies.is_supported && multiview_capabilies.max_view_count > 1;
|
return multiview_capabilies.is_supported && multiview_capabilies.max_view_count > 1;
|
||||||
} break;
|
} break;
|
||||||
case SUPPORTS_FSR_HALF_FLOAT: {
|
case SUPPORTS_FSR_HALF_FLOAT: {
|
||||||
return context->get_shader_capabilities().shader_float16_is_supported && context->get_storage_buffer_capabilities().storage_buffer_16_bit_access_is_supported;
|
return context->get_shader_capabilities().shader_float16_is_supported && context->get_physical_device_features().shaderInt16 && context->get_storage_buffer_capabilities().storage_buffer_16_bit_access_is_supported;
|
||||||
} break;
|
} break;
|
||||||
case SUPPORTS_ATTACHMENT_VRS: {
|
case SUPPORTS_ATTACHMENT_VRS: {
|
||||||
VulkanContext::VRSCapabilities vrs_capabilities = context->get_vrs_capabilities();
|
VulkanContext::VRSCapabilities vrs_capabilities = context->get_vrs_capabilities();
|
||||||
|
|
|
@ -413,6 +413,7 @@ Error VulkanContext::_initialize_instance_extensions() {
|
||||||
register_requested_instance_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, false);
|
register_requested_instance_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This extension allows us to use the properties2 features to query additional device capabilities
|
||||||
register_requested_instance_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, false);
|
register_requested_instance_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, false);
|
||||||
|
|
||||||
// Only enable debug utils in verbose mode or DEV_ENABLED.
|
// Only enable debug utils in verbose mode or DEV_ENABLED.
|
||||||
|
@ -493,7 +494,10 @@ Error VulkanContext::_initialize_device_extensions() {
|
||||||
register_requested_device_extension(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, false);
|
register_requested_device_extension(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, false);
|
||||||
register_requested_device_extension(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, false);
|
register_requested_device_extension(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, false);
|
||||||
register_requested_device_extension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false);
|
register_requested_device_extension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false);
|
||||||
|
register_requested_device_extension(VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, false);
|
||||||
register_requested_device_extension(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, false);
|
register_requested_device_extension(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, false);
|
||||||
|
register_requested_device_extension(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, false);
|
||||||
|
register_requested_device_extension(VK_KHR_MAINTENANCE_2_EXTENSION_NAME, false);
|
||||||
|
|
||||||
// TODO consider the following extensions:
|
// TODO consider the following extensions:
|
||||||
// - VK_KHR_spirv_1_4
|
// - VK_KHR_spirv_1_4
|
||||||
|
@ -744,48 +748,90 @@ Error VulkanContext::_check_capabilities() {
|
||||||
}
|
}
|
||||||
if (vkGetPhysicalDeviceFeatures2_func != nullptr) {
|
if (vkGetPhysicalDeviceFeatures2_func != nullptr) {
|
||||||
// Check our extended features.
|
// Check our extended features.
|
||||||
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {
|
void *next = nullptr;
|
||||||
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR,
|
|
||||||
/*pNext*/ nullptr,
|
|
||||||
/*pipelineFragmentShadingRate*/ false,
|
|
||||||
/*primitiveFragmentShadingRate*/ false,
|
|
||||||
/*attachmentFragmentShadingRate*/ false,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = {
|
// We must check that the relative extension is present before assuming a
|
||||||
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR,
|
// feature as enabled.
|
||||||
/*pNext*/ &vrs_features,
|
// See also: https://github.com/godotengine/godot/issues/65409
|
||||||
/*shaderFloat16*/ false,
|
|
||||||
/*shaderInt8*/ false,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {
|
VkPhysicalDeviceVulkan12Features device_features_vk12 = {};
|
||||||
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,
|
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = {};
|
||||||
/*pNext*/ &shader_features,
|
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
|
||||||
/*storageBuffer16BitAccess*/ false,
|
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
|
||||||
/*uniformAndStorageBuffer16BitAccess*/ false,
|
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
|
||||||
/*storagePushConstant16*/ false,
|
|
||||||
/*storageInputOutput16*/ false,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkPhysicalDeviceMultiviewFeatures multiview_features = {
|
if (device_api_version >= VK_API_VERSION_1_2) {
|
||||||
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
|
device_features_vk12.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
|
||||||
/*pNext*/ &storage_feature,
|
device_features_vk12.pNext = next;
|
||||||
/*multiview*/ false,
|
next = &device_features_vk12;
|
||||||
/*multiviewGeometryShader*/ false,
|
} else {
|
||||||
/*multiviewTessellationShader*/ false,
|
if (is_device_extension_enabled(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
||||||
};
|
shader_features = {
|
||||||
|
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR,
|
||||||
|
/*pNext*/ next,
|
||||||
|
/*shaderFloat16*/ false,
|
||||||
|
/*shaderInt8*/ false,
|
||||||
|
};
|
||||||
|
next = &shader_features;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_device_extension_enabled(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
||||||
|
vrs_features = {
|
||||||
|
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR,
|
||||||
|
/*pNext*/ next,
|
||||||
|
/*pipelineFragmentShadingRate*/ false,
|
||||||
|
/*primitiveFragmentShadingRate*/ false,
|
||||||
|
/*attachmentFragmentShadingRate*/ false,
|
||||||
|
};
|
||||||
|
next = &vrs_features;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_device_extension_enabled(VK_KHR_16BIT_STORAGE_EXTENSION_NAME)) {
|
||||||
|
storage_feature = {
|
||||||
|
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,
|
||||||
|
/*pNext*/ next,
|
||||||
|
/*storageBuffer16BitAccess*/ false,
|
||||||
|
/*uniformAndStorageBuffer16BitAccess*/ false,
|
||||||
|
/*storagePushConstant16*/ false,
|
||||||
|
/*storageInputOutput16*/ false,
|
||||||
|
};
|
||||||
|
next = &storage_feature;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_device_extension_enabled(VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
|
||||||
|
multiview_features = {
|
||||||
|
/*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
|
||||||
|
/*pNext*/ next,
|
||||||
|
/*multiview*/ false,
|
||||||
|
/*multiviewGeometryShader*/ false,
|
||||||
|
/*multiviewTessellationShader*/ false,
|
||||||
|
};
|
||||||
|
next = &multiview_features;
|
||||||
|
}
|
||||||
|
|
||||||
VkPhysicalDeviceFeatures2 device_features;
|
VkPhysicalDeviceFeatures2 device_features;
|
||||||
device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
|
device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
|
||||||
device_features.pNext = &multiview_features;
|
device_features.pNext = next;
|
||||||
|
|
||||||
vkGetPhysicalDeviceFeatures2_func(gpu, &device_features);
|
vkGetPhysicalDeviceFeatures2_func(gpu, &device_features);
|
||||||
|
|
||||||
// We must check that the relative extension is present before assuming a
|
if (device_api_version >= VK_API_VERSION_1_2) {
|
||||||
// feature as enabled. Actually, according to the spec we shouldn't add the
|
#ifdef MACOS_ENABLED
|
||||||
// structs in pNext at all, but this works fine.
|
ERR_FAIL_COND_V_MSG(!device_features_vk12.shaderSampledImageArrayNonUniformIndexing, ERR_CANT_CREATE, "Your GPU doesn't support shaderSampledImageArrayNonUniformIndexing which is required to use the Vulkan-based renderers in Godot.");
|
||||||
// See also: https://github.com/godotengine/godot/issues/65409
|
#endif
|
||||||
|
|
||||||
|
if (is_device_extension_enabled(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
||||||
|
shader_capabilities.shader_float16_is_supported = device_features_vk12.shaderFloat16;
|
||||||
|
shader_capabilities.shader_int8_is_supported = device_features_vk12.shaderInt8;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (is_device_extension_enabled(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
||||||
|
shader_capabilities.shader_float16_is_supported = shader_features.shaderFloat16;
|
||||||
|
shader_capabilities.shader_int8_is_supported = shader_features.shaderInt8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (is_device_extension_enabled(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
if (is_device_extension_enabled(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
||||||
vrs_capabilities.pipeline_vrs_supported = vrs_features.pipelineFragmentShadingRate;
|
vrs_capabilities.pipeline_vrs_supported = vrs_features.pipelineFragmentShadingRate;
|
||||||
vrs_capabilities.primitive_vrs_supported = vrs_features.primitiveFragmentShadingRate;
|
vrs_capabilities.primitive_vrs_supported = vrs_features.primitiveFragmentShadingRate;
|
||||||
|
@ -798,11 +844,6 @@ Error VulkanContext::_check_capabilities() {
|
||||||
multiview_capabilities.tessellation_shader_is_supported = multiview_features.multiviewTessellationShader;
|
multiview_capabilities.tessellation_shader_is_supported = multiview_features.multiviewTessellationShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_device_extension_enabled(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
|
||||||
shader_capabilities.shader_float16_is_supported = shader_features.shaderFloat16;
|
|
||||||
shader_capabilities.shader_int8_is_supported = shader_features.shaderInt8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_device_extension_enabled(VK_KHR_16BIT_STORAGE_EXTENSION_NAME)) {
|
if (is_device_extension_enabled(VK_KHR_16BIT_STORAGE_EXTENSION_NAME)) {
|
||||||
storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported = storage_feature.storageBuffer16BitAccess;
|
storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported = storage_feature.storageBuffer16BitAccess;
|
||||||
storage_buffer_capabilities.uniform_and_storage_buffer_16_bit_access_is_supported = storage_feature.uniformAndStorageBuffer16BitAccess;
|
storage_buffer_capabilities.uniform_and_storage_buffer_16_bit_access_is_supported = storage_feature.uniformAndStorageBuffer16BitAccess;
|
||||||
|
@ -1279,6 +1320,10 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) {
|
||||||
// features based on this query
|
// features based on this query
|
||||||
vkGetPhysicalDeviceFeatures(gpu, &physical_device_features);
|
vkGetPhysicalDeviceFeatures(gpu, &physical_device_features);
|
||||||
|
|
||||||
|
// Check required features
|
||||||
|
ERR_FAIL_COND_V_MSG(!physical_device_features.imageCubeArray, ERR_CANT_CREATE, "Your GPU doesn't support image cube arrays which are required to use the Vulkan-based renderers in Godot.");
|
||||||
|
ERR_FAIL_COND_V_MSG(!physical_device_features.independentBlend, ERR_CANT_CREATE, "Your GPU doesn't support independentBlend which is required to use the Vulkan-based renderers in Godot.");
|
||||||
|
|
||||||
physical_device_features.robustBufferAccess = false; // Turn off robust buffer access, which can hamper performance on some hardware.
|
physical_device_features.robustBufferAccess = false; // Turn off robust buffer access, which can hamper performance on some hardware.
|
||||||
|
|
||||||
#define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \
|
#define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \
|
||||||
|
|
|
@ -280,6 +280,7 @@ public:
|
||||||
const VRSCapabilities &get_vrs_capabilities() const { return vrs_capabilities; };
|
const VRSCapabilities &get_vrs_capabilities() const { return vrs_capabilities; };
|
||||||
const ShaderCapabilities &get_shader_capabilities() const { return shader_capabilities; };
|
const ShaderCapabilities &get_shader_capabilities() const { return shader_capabilities; };
|
||||||
const StorageBufferCapabilities &get_storage_buffer_capabilities() const { return storage_buffer_capabilities; };
|
const StorageBufferCapabilities &get_storage_buffer_capabilities() const { return storage_buffer_capabilities; };
|
||||||
|
const VkPhysicalDeviceFeatures &get_physical_device_features() const { return physical_device_features; };
|
||||||
|
|
||||||
VkDevice get_device();
|
VkDevice get_device();
|
||||||
VkPhysicalDevice get_physical_device();
|
VkPhysicalDevice get_physical_device();
|
||||||
|
|
Loading…
Reference in a new issue