diff --git a/src/intel/vulkan/anv_android.c b/src/intel/vulkan/anv_android.c index d974ffcd3e1..749e5feb33b 100644 --- a/src/intel/vulkan/anv_android.c +++ b/src/intel/vulkan/anv_android.c @@ -167,6 +167,12 @@ android_format_from_vk(unsigned vk_format) } } +static VkFormatFeatureFlags +features2_to_features(VkFormatFeatureFlags2KHR features2) +{ + return features2 & VK_ALL_FORMAT_FEATURE_FLAG_BITS; +} + static VkResult get_ahw_buffer_format_properties( VkDevice device_h, @@ -207,9 +213,10 @@ get_ahw_buffer_format_properties( if (desc.usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER) tiling = VK_IMAGE_TILING_LINEAR; - p->formatFeatures = - anv_get_image_format_features(&device->info, p->format, anv_format, - tiling, NULL); + VkFormatFeatureFlags2KHR features2 = + anv_get_image_format_features2(&device->info, p->format, anv_format, + tiling, NULL); + p->formatFeatures = features2_to_features(features2); /* "Images can be created with an external format even if the Android hardware * buffer has a format which has an equivalent Vulkan format to enable diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index a9f18088357..75fff645d39 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -544,14 +544,14 @@ anv_get_format_aspect(const struct intel_device_info *devinfo, // Format capabilities -VkFormatFeatureFlags -anv_get_image_format_features(const struct intel_device_info *devinfo, - VkFormat vk_format, - const struct anv_format *anv_format, - VkImageTiling vk_tiling, - const struct isl_drm_modifier_info *isl_mod_info) +VkFormatFeatureFlags2KHR +anv_get_image_format_features2(const struct intel_device_info *devinfo, + VkFormat vk_format, + const struct anv_format *anv_format, + VkImageTiling vk_tiling, + const struct isl_drm_modifier_info *isl_mod_info) { - VkFormatFeatureFlags flags = 0; + VkFormatFeatureFlags2KHR flags = 0; if (anv_format == NULL) return 0; @@ -566,18 +566,18 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) return 0; - flags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | - VK_FORMAT_FEATURE_BLIT_SRC_BIT | - VK_FORMAT_FEATURE_BLIT_DST_BIT | - VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | - VK_FORMAT_FEATURE_TRANSFER_DST_BIT; + flags |= VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR | + VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR | + VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR | + VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR | + VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | + VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR; if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT) - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR; if ((aspects & VK_IMAGE_ASPECT_DEPTH_BIT) && devinfo->ver >= 9) - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR; return flags; } @@ -605,13 +605,13 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, return 0; if (isl_format_supports_sampling(devinfo, plane_format.isl_format)) { - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR; if (devinfo->ver >= 9) - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR; if (isl_format_supports_filtering(devinfo, plane_format.isl_format)) - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR; } /* We can render to swizzled formats. However, if the alpha channel is @@ -620,31 +620,31 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, */ if (isl_format_supports_rendering(devinfo, plane_format.isl_format) && plane_format.swizzle.a == ISL_CHANNEL_SELECT_ALPHA) { - flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; + flags |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR; if (isl_format_supports_alpha_blending(devinfo, plane_format.isl_format)) - flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT; + flags |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR; } /* Load/store is determined based on base format. This prevents RGB * formats from showing up as load/store capable. */ if (isl_format_supports_typed_writes(devinfo, base_isl_format)) - flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; + flags |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR; if (base_isl_format == ISL_FORMAT_R32_SINT || base_isl_format == ISL_FORMAT_R32_UINT || base_isl_format == ISL_FORMAT_R32_FLOAT) - flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT; + flags |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR; if (flags) { - flags |= VK_FORMAT_FEATURE_BLIT_SRC_BIT | - VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | - VK_FORMAT_FEATURE_TRANSFER_DST_BIT; + flags |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR | + VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | + VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR; /* Blit destination requires rendering support. */ if (isl_format_supports_rendering(devinfo, plane_format.isl_format)) - flags |= VK_FORMAT_FEATURE_BLIT_DST_BIT; + flags |= VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR; } /* XXX: We handle 3-channel formats by switching them out for RGBX or @@ -658,8 +658,8 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, base_isl_format != ISL_FORMAT_UNSUPPORTED && !util_is_power_of_two_or_zero(isl_format_layouts[base_isl_format].bpb) && isl_format_rgb_to_rgbx(base_isl_format) == ISL_FORMAT_UNSUPPORTED) { - flags &= ~VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; - flags &= ~VK_FORMAT_FEATURE_BLIT_DST_BIT; + flags &= ~VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR; + flags &= ~VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR; } if (anv_format->can_ycbcr) { @@ -671,11 +671,11 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, * sampler. The failures show a slightly out of range values on the * bottom left of the sampled image. */ - flags |= VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT; + flags |= VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR; } else { - flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT | - VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT | - VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT; + flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR | + VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR | + VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR; } /* We can support cosited chroma locations when handle planes with our @@ -684,20 +684,20 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, for (unsigned p = 0; p < anv_format->n_planes; p++) { if (anv_format->planes[p].denominator_scales[0] > 1 || anv_format->planes[p].denominator_scales[1] > 1) { - flags |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT; + flags |= VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR; break; } } if (anv_format->n_planes > 1) - flags |= VK_FORMAT_FEATURE_DISJOINT_BIT; + flags |= VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR; - const VkFormatFeatureFlags disallowed_ycbcr_image_features = - VK_FORMAT_FEATURE_BLIT_SRC_BIT | - VK_FORMAT_FEATURE_BLIT_DST_BIT | - VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | - VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; + const VkFormatFeatureFlags2KHR disallowed_ycbcr_image_features = + VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR | + VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR | + VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | + VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR | + VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR; flags &= ~disallowed_ycbcr_image_features; } @@ -748,7 +748,7 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, if (anv_format->n_planes > 1) { /* For simplicity, keep DISJOINT disabled for multi-planar format. */ - flags &= ~VK_FORMAT_FEATURE_DISJOINT_BIT; + flags &= ~VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR; /* VK_ANDROID_external_memory_android_hardware_buffer in Virtio-GPU * Venus driver layers on top of VK_EXT_image_drm_format_modifier of @@ -779,26 +779,26 @@ anv_get_image_format_features(const struct intel_device_info *devinfo, * eglCreateImage, we require that the dma_buf for the primary surface * and the dma_buf for its aux surface refer to the same bo. */ - flags &= ~VK_FORMAT_FEATURE_DISJOINT_BIT; + flags &= ~VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR; /* When the hardware accesses a storage image, it bypasses the aux * surface. We could support storage access on images with aux * modifiers by resolving the aux surface prior to the storage access. */ - flags &= ~VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; - flags &= ~VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT; + flags &= ~VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR; + flags &= ~VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR; } } return flags; } -static VkFormatFeatureFlags -get_buffer_format_features(const struct intel_device_info *devinfo, - VkFormat vk_format, - const struct anv_format *anv_format) +static VkFormatFeatureFlags2KHR +get_buffer_format_features2(const struct intel_device_info *devinfo, + VkFormat vk_format, + const struct anv_format *anv_format) { - VkFormatFeatureFlags flags = 0; + VkFormatFeatureFlags2KHR flags = 0; if (anv_format == NULL) return 0; @@ -819,20 +819,26 @@ get_buffer_format_features(const struct intel_device_info *devinfo, if (isl_format_supports_sampling(devinfo, isl_format) && !isl_format_is_compressed(isl_format)) - flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT; + flags |= VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR; if (isl_format_supports_vertex_fetch(devinfo, isl_format)) - flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT; + flags |= VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR; if (isl_is_storage_image_format(isl_format)) - flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT; + flags |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR; if (isl_format == ISL_FORMAT_R32_SINT || isl_format == ISL_FORMAT_R32_UINT) - flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT; + flags |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR; return flags; } +static VkFormatFeatureFlags +features2_to_features(VkFormatFeatureFlags2KHR features2) +{ + return features2 & VK_ALL_FORMAT_FEATURE_FLAG_BITS; +} + static void get_drm_format_modifier_properties_list(const struct anv_physical_device *physical_device, VkFormat vk_format, @@ -845,10 +851,11 @@ get_drm_format_modifier_properties_list(const struct anv_physical_device *physic &list->drmFormatModifierCount); isl_drm_modifier_info_for_each(isl_mod_info) { - VkFormatFeatureFlags features = - anv_get_image_format_features(devinfo, vk_format, anv_format, - VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, - isl_mod_info); + VkFormatFeatureFlags2KHR features2 = + anv_get_image_format_features2(devinfo, vk_format, anv_format, + VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, + isl_mod_info); + VkFormatFeatureFlags features = features2_to_features(features2); if (!features) continue; @@ -877,15 +884,17 @@ void anv_GetPhysicalDeviceFormatProperties2( assert(pFormatProperties->sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2); + VkFormatFeatureFlags2KHR linear2, optimal2, buffer2; + linear2 = anv_get_image_format_features2(devinfo, vk_format, anv_format, + VK_IMAGE_TILING_LINEAR, NULL); + optimal2 = anv_get_image_format_features2(devinfo, vk_format, anv_format, + VK_IMAGE_TILING_OPTIMAL, NULL); + buffer2 = get_buffer_format_features2(devinfo, vk_format, anv_format); + pFormatProperties->formatProperties = (VkFormatProperties) { - .linearTilingFeatures = - anv_get_image_format_features(devinfo, vk_format, anv_format, - VK_IMAGE_TILING_LINEAR, NULL), - .optimalTilingFeatures = - anv_get_image_format_features(devinfo, vk_format, anv_format, - VK_IMAGE_TILING_OPTIMAL, NULL), - .bufferFeatures = - get_buffer_format_features(devinfo, vk_format, anv_format), + .linearTilingFeatures = features2_to_features(linear2), + .optimalTilingFeatures = features2_to_features(optimal2), + .bufferFeatures = features2_to_features(buffer2), }; vk_foreach_struct(ext, pFormatProperties->pNext) { @@ -909,7 +918,7 @@ anv_get_image_format_properties( VkImageFormatProperties *pImageFormatProperties, VkSamplerYcbcrConversionImageFormatProperties *pYcbcrImageFormatProperties) { - VkFormatFeatureFlags format_feature_flags; + VkFormatFeatureFlags2KHR format_feature_flags; VkExtent3D maxExtent; uint32_t maxMipLevels; uint32_t maxArraySize; @@ -933,9 +942,9 @@ anv_get_image_format_properties( } assert(format->vk_format == info->format); - format_feature_flags = anv_get_image_format_features(devinfo, info->format, - format, info->tiling, - isl_mod_info); + format_feature_flags = anv_get_image_format_features2(devinfo, info->format, + format, info->tiling, + isl_mod_info); /* Remove the VkFormatFeatureFlags that are incompatible with any declared * image view format. (Removals are more likely to occur when a DRM format @@ -945,11 +954,11 @@ anv_get_image_format_properties( for (uint32_t i = 0; i < format_list_info->viewFormatCount; ++i) { VkFormat vk_view_format = format_list_info->pViewFormats[i]; const struct anv_format *anv_view_format = anv_get_format(vk_view_format); - VkFormatFeatureFlags view_format_features = - anv_get_image_format_features(devinfo, vk_view_format, - anv_view_format, - info->tiling, - isl_mod_info); + VkFormatFeatureFlags2KHR view_format_features = + anv_get_image_format_features2(devinfo, vk_view_format, + anv_view_format, + info->tiling, + isl_mod_info); format_feature_flags &= view_format_features; } } @@ -1032,8 +1041,8 @@ anv_get_image_format_properties( if (info->tiling == VK_IMAGE_TILING_OPTIMAL && info->type == VK_IMAGE_TYPE_2D && - (format_feature_flags & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) && + (format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | + VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) && !(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) && !(info->usage & VK_IMAGE_USAGE_STORAGE_BIT)) { sampleCounts = isl_device_get_sample_counts(&physical_device->isl_dev); @@ -1042,33 +1051,33 @@ anv_get_image_format_properties( if (info->usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) { /* Accept transfers on anything we can sample from or renderer to. */ - if (!(format_feature_flags & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) { + if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | + VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR | + VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR))) { goto unsupported; } } if (info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) { - if (!(format_feature_flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { + if (!(format_feature_flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR)) { goto unsupported; } } if (info->usage & VK_IMAGE_USAGE_STORAGE_BIT) { - if (!(format_feature_flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) { + if (!(format_feature_flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR)) { goto unsupported; } } if (info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { - if (!(format_feature_flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) { + if (!(format_feature_flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR)) { goto unsupported; } } if (info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - if (!(format_feature_flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) { + if (!(format_feature_flags & VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) { goto unsupported; } } @@ -1078,11 +1087,11 @@ anv_get_image_format_properties( * * If format is a multi-planar format, and if imageCreateFormatFeatures * (as defined in Image Creation Limits) does not contain - * VK_FORMAT_FEATURE_DISJOINT_BIT, then flags must not contain + * VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR, then flags must not contain * VK_IMAGE_CREATE_DISJOINT_BIT. */ if (format->n_planes > 1 && - !(format_feature_flags & VK_FORMAT_FEATURE_DISJOINT_BIT)) { + !(format_feature_flags & VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR)) { goto unsupported; } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 2ac3907627b..159ce4cc1c0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -4437,12 +4437,12 @@ anv_rasterization_aa_mode(VkPolygonMode raster_mode, return false; } -VkFormatFeatureFlags -anv_get_image_format_features(const struct intel_device_info *devinfo, - VkFormat vk_format, - const struct anv_format *anv_format, - VkImageTiling vk_tiling, - const struct isl_drm_modifier_info *isl_mod_info); +VkFormatFeatureFlags2KHR +anv_get_image_format_features2(const struct intel_device_info *devinfo, + VkFormat vk_format, + const struct anv_format *anv_format, + VkImageTiling vk_tiling, + const struct isl_drm_modifier_info *isl_mod_info); void anv_fill_buffer_surface_state(struct anv_device *device, struct anv_state state,