You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-22 15:06:45 +00:00
Enabling additional vulkan extension and adding further checks
This commit is contained in:
@@ -1666,34 +1666,27 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T
|
||||
image_create_info.pNext = nullptr;
|
||||
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.
|
||||
Vector<VkFormat> allowed_formats; // Keep out of the if, needed for creation.
|
||||
#endif
|
||||
if (p_format.shareable_formats.size()) {
|
||||
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++) {
|
||||
allowed_formats.push_back(vulkan_formats[p_format.shareable_formats[i]]);
|
||||
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");
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -2096,49 +2089,54 @@ RID RenderingDeviceVulkan::texture_create_shared(const TextureView &p_view, RID
|
||||
}
|
||||
|
||||
VkImageViewUsageCreateInfo usage_info;
|
||||
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 (context->is_device_extension_enabled(VK_KHR_MAINTENANCE_2_EXTENSION_NAME)) {
|
||||
// May need to make VK_KHR_maintenance2 manditory and thus has Vulkan 1.1 be our minimum supported version
|
||||
// if we require setting this information. Vulkan 1.0 may simply not care..
|
||||
|
||||
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 |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
}
|
||||
usage_info.usage = 0;
|
||||
|
||||
if (texture.usage_flags & TEXTURE_USAGE_STORAGE_BIT) {
|
||||
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_STORAGE_BIT)) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||
if (texture.usage_flags & TEXTURE_USAGE_SAMPLING_BIT) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
if (texture.usage_flags & TEXTURE_USAGE_COLOR_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_STORAGE_BIT) {
|
||||
if (texture_is_format_supported_for_usage(p_view.format_override, TEXTURE_USAGE_STORAGE_BIT)) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (texture.usage_flags & TEXTURE_USAGE_INPUT_ATTACHMENT_BIT) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
||||
}
|
||||
if (texture.usage_flags & TEXTURE_USAGE_COLOR_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) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||
}
|
||||
if (texture.usage_flags & TEXTURE_USAGE_INPUT_ATTACHMENT_BIT) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
|
||||
}
|
||||
|
||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_UPDATE_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;
|
||||
}
|
||||
if (texture.usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||
}
|
||||
|
||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT) {
|
||||
usage_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||
}
|
||||
if (texture.usage_flags & TEXTURE_USAGE_CAN_UPDATE_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);
|
||||
@@ -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.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.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;
|
||||
} break;
|
||||
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;
|
||||
case SUPPORTS_ATTACHMENT_VRS: {
|
||||
VulkanContext::VRSCapabilities vrs_capabilities = context->get_vrs_capabilities();
|
||||
|
||||
Reference in New Issue
Block a user