summaryrefslogtreecommitdiff
path: root/src/gallium/frontends/lavapipe/lvp_formats.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/frontends/lavapipe/lvp_formats.c')
-rw-r--r--src/gallium/frontends/lavapipe/lvp_formats.c247
1 files changed, 182 insertions, 65 deletions
diff --git a/src/gallium/frontends/lavapipe/lvp_formats.c b/src/gallium/frontends/lavapipe/lvp_formats.c
index 69e1808daba..a22ef4b68ae 100644
--- a/src/gallium/frontends/lavapipe/lvp_formats.c
+++ b/src/gallium/frontends/lavapipe/lvp_formats.c
@@ -22,9 +22,12 @@
*/
#include "lvp_private.h"
+#include "util/detect.h"
+#include "pipe/p_defines.h"
#include "util/format/u_format.h"
#include "util/u_math.h"
#include "vk_util.h"
+#include "vk_enum_defines.h"
static bool lvp_is_filter_minmax_format_supported(VkFormat format)
{
@@ -55,13 +58,16 @@ static bool lvp_is_filter_minmax_format_supported(VkFormat format)
}
}
+
static void
lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_device,
VkFormat format,
- VkFormatProperties *out_properties)
+ VkFormatProperties3 *out_properties)
{
- enum pipe_format pformat = lvp_vk_format_to_pipe_format(format);
- unsigned features = 0, buffer_features = 0;
+ const enum pipe_format pformat = lvp_vk_format_to_pipe_format(format);
+ struct pipe_screen *pscreen = physical_device->pscreen;
+ VkFormatFeatureFlags2 features = 0, buffer_features = 0;
+
if (pformat == PIPE_FORMAT_NONE) {
out_properties->linearTilingFeatures = 0;
out_properties->optimalTilingFeatures = 0;
@@ -69,26 +75,34 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d
return;
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_DEPTH_STENCIL)) {
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_TEXTURE_2D, 0, 0,
+ PIPE_BIND_DEPTH_STENCIL)) {
out_properties->linearTilingFeatures = 0;
- out_properties->optimalTilingFeatures = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
- VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
- VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
+ out_properties->optimalTilingFeatures =
+ (VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT |
+ VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT |
+ VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT |
+ VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT |
+ VK_FORMAT_FEATURE_2_BLIT_SRC_BIT | VK_FORMAT_FEATURE_2_BLIT_DST_BIT |
+ VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT |
+ VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
if (lvp_is_filter_minmax_format_supported(format))
- out_properties->optimalTilingFeatures |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
+ out_properties->optimalTilingFeatures |=
+ VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
out_properties->bufferFeatures = 0;
return;
}
if (util_format_is_compressed(pformat)) {
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
- features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
- features |= VK_FORMAT_FEATURE_BLIT_SRC_BIT;
- features |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_TEXTURE_2D, 0, 0,
+ PIPE_BIND_SAMPLER_VIEW)) {
+ features |= (VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT |
+ VK_FORMAT_FEATURE_2_BLIT_SRC_BIT |
+ VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT |
+ VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT |
+ VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
+ VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT);
}
out_properties->linearTilingFeatures = features;
out_properties->optimalTilingFeatures = features;
@@ -97,66 +111,131 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d
}
if (!util_format_is_srgb(pformat) &&
- physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_BUFFER, 0, 0, PIPE_BIND_VERTEX_BUFFER)) {
- buffer_features |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
+ pscreen->is_format_supported(pscreen, pformat, PIPE_BUFFER, 0, 0,
+ PIPE_BIND_VERTEX_BUFFER)) {
+ buffer_features |= VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT;
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_BUFFER, 0, 0, PIPE_BIND_CONSTANT_BUFFER)) {
- buffer_features |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_BUFFER, 0, 0,
+ PIPE_BIND_CONSTANT_BUFFER)) {
+ buffer_features |= VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT;
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_BUFFER, 0, 0, PIPE_BIND_SHADER_IMAGE)) {
- buffer_features |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_BUFFER, 0, 0,
+ PIPE_BIND_SHADER_IMAGE)) {
+ buffer_features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT |
+ VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT |
+ VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT;
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
- features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_TEXTURE_2D, 0, 0,
+ PIPE_BIND_SAMPLER_VIEW)) {
+ features |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT;
+ if (util_format_has_depth(util_format_description(pformat)))
+ features |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT;
if (!util_format_is_pure_integer(pformat))
- features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
+ features |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
if (lvp_is_filter_minmax_format_supported(format))
- features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
+ features |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
+ const struct vk_format_ycbcr_info *ycbcr_info =
+ vk_format_get_ycbcr_info(format);
+ if (ycbcr_info) {
+ if (ycbcr_info->n_planes > 1)
+ features |= VK_FORMAT_FEATURE_DISJOINT_BIT;
+ else
+ features |= VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT;
+
+ for (uint8_t plane = 0; plane < ycbcr_info->n_planes; plane++) {
+ const struct vk_format_ycbcr_plane *plane_info = &ycbcr_info->planes[plane];
+ if (plane_info->denominator_scales[0] > 1 ||
+ plane_info->denominator_scales[1] > 1)
+ features |= VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT;
+ }
+
+ /* The subsampled formats have no support for linear filters. */
+ const struct util_format_description *desc = util_format_description(pformat);
+ if (desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED)
+ features |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT;
+ }
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_RENDER_TARGET)) {
- features |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_TEXTURE_2D, 0, 0,
+ PIPE_BIND_RENDER_TARGET)) {
+ features |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT;
/* SNORM blending on llvmpipe fails CTS - disable for now */
- if (!util_format_is_snorm(pformat))
- features |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
+ if (!util_format_is_snorm(pformat) &&
+ !util_format_is_pure_integer(pformat))
+ features |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT;
}
- if (physical_device->pscreen->is_format_supported(physical_device->pscreen, pformat,
- PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SHADER_IMAGE)) {
- features |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
+ if (pscreen->is_format_supported(pscreen, pformat, PIPE_TEXTURE_2D, 0, 0,
+ PIPE_BIND_SHADER_IMAGE)) {
+ features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT |
+ VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT |
+ VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT;
}
- if (pformat == PIPE_FORMAT_R32_UINT || pformat == PIPE_FORMAT_R32_SINT) {
- features |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
- buffer_features |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
+ if (pformat == PIPE_FORMAT_R32_UINT ||
+ pformat == PIPE_FORMAT_R32_SINT ||
+ pformat == PIPE_FORMAT_R32_FLOAT) {
+ features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT;
+ buffer_features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
+ } else if (pformat == PIPE_FORMAT_R11G11B10_FLOAT ||
+ pformat == PIPE_FORMAT_R9G9B9E5_FLOAT) {
+ features |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
}
- if (pformat == PIPE_FORMAT_R11G11B10_FLOAT || pformat == PIPE_FORMAT_R9G9B9E5_FLOAT)
- features |= VK_FORMAT_FEATURE_BLIT_SRC_BIT;
-
- if (features && buffer_features != VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
- features |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- if (pformat == PIPE_FORMAT_B5G6R5_UNORM)
- features |= VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
- if ((pformat != PIPE_FORMAT_R9G9B9E5_FLOAT) && util_format_get_nr_components(pformat) != 3 &&
- pformat != PIPE_FORMAT_R10G10B10A2_SNORM && pformat != PIPE_FORMAT_B10G10R10A2_SNORM &&
+ if (features && buffer_features != VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT) {
+ features |= (VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT |
+ VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT);
+ }
+ if (pformat == PIPE_FORMAT_B5G6R5_UNORM) {
+ features |= (VK_FORMAT_FEATURE_2_BLIT_SRC_BIT |
+ VK_FORMAT_FEATURE_2_BLIT_DST_BIT);
+ }
+ if ((pformat != PIPE_FORMAT_R9G9B9E5_FLOAT) &&
+ util_format_get_nr_components(pformat) != 3 &&
+ !util_format_is_subsampled_422(pformat) &&
+ !util_format_is_yuv(pformat) &&
+ pformat != PIPE_FORMAT_R10G10B10A2_SNORM &&
+ pformat != PIPE_FORMAT_B10G10R10A2_SNORM &&
pformat != PIPE_FORMAT_B10G10R10A2_UNORM) {
- features |= VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
+ features |= (VK_FORMAT_FEATURE_2_BLIT_SRC_BIT |
+ VK_FORMAT_FEATURE_2_BLIT_DST_BIT);
}
+
+ switch (format) {
+ case VK_FORMAT_R32G32_SFLOAT:
+ case VK_FORMAT_R32G32B32_SFLOAT:
+ case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ case VK_FORMAT_R16G16_SNORM:
+ case VK_FORMAT_R16G16_UNORM:
+ case VK_FORMAT_R16G16B16A16_SNORM:
+ case VK_FORMAT_R16G16B16A16_UNORM:
+ case VK_FORMAT_R8G8_SNORM:
+ case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R8G8B8A8_SNORM:
+ case VK_FORMAT_R8G8B8A8_UNORM:
+ case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+ buffer_features |= VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR;
+ break;
+ default:
+ break;
+ }
+
out_properties->linearTilingFeatures = features;
out_properties->optimalTilingFeatures = features;
out_properties->bufferFeatures = buffer_features;
- return;
+ if (out_properties->linearTilingFeatures)
+ out_properties->linearTilingFeatures |= VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT;
+ if (out_properties->optimalTilingFeatures)
+ out_properties->optimalTilingFeatures |= VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT;
}
+
VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFormatProperties2(
VkPhysicalDevice physicalDevice,
VkFormat format,
@@ -164,16 +243,30 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFormatProperties2(
{
LVP_FROM_HANDLE(lvp_physical_device, physical_device, physicalDevice);
+ VkFormatProperties3 format_props;
lvp_physical_device_get_format_properties(physical_device,
format,
- &pFormatProperties->formatProperties);
+ &format_props);
+ pFormatProperties->formatProperties.linearTilingFeatures = vk_format_features2_to_features(format_props.linearTilingFeatures);
+ pFormatProperties->formatProperties.optimalTilingFeatures = vk_format_features2_to_features(format_props.optimalTilingFeatures);
+ pFormatProperties->formatProperties.bufferFeatures = vk_format_features2_to_features(format_props.bufferFeatures);
+ VkFormatProperties3 *prop3 = (void*)vk_find_struct_const(pFormatProperties->pNext, FORMAT_PROPERTIES_3);
+ if (prop3) {
+ prop3->linearTilingFeatures = format_props.linearTilingFeatures;
+ prop3->optimalTilingFeatures = format_props.optimalTilingFeatures;
+ prop3->bufferFeatures = format_props.bufferFeatures;
+ }
+ VkSubpassResolvePerformanceQueryEXT *perf = (void*)vk_find_struct_const(pFormatProperties->pNext, SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT);
+ if (perf)
+ perf->optimal = VK_FALSE;
}
+
static VkResult lvp_get_image_format_properties(struct lvp_physical_device *physical_device,
const VkPhysicalDeviceImageFormatInfo2 *info,
VkImageFormatProperties *pImageFormatProperties)
{
- VkFormatProperties format_props;
- VkFormatFeatureFlags format_feature_flags;
+ VkFormatProperties3 format_props;
+ VkFormatFeatureFlags2 format_feature_flags;
VkExtent3D maxExtent;
uint32_t maxMipLevels;
uint32_t maxArraySize;
@@ -216,7 +309,7 @@ static VkResult lvp_get_image_format_properties(struct lvp_physical_device *phys
if (info->tiling == VK_IMAGE_TILING_OPTIMAL &&
!(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
!util_format_is_compressed(pformat) &&
- (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 | VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT)))
sampleCounts |= VK_SAMPLE_COUNT_4_BIT;
break;
case VK_IMAGE_TYPE_3D:
@@ -228,49 +321,53 @@ static VkResult lvp_get_image_format_properties(struct lvp_physical_device *phys
break;
}
+ if (info->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT)
+ goto skip_checks;
+
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)) {
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)) {
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)) {
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)) {
goto unsupported;
}
}
if (info->usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
- if (!(format_feature_flags & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
+ if (!(format_feature_flags & VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT)) {
goto unsupported;
}
}
if (info->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
- if (!(format_feature_flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) {
+ if (!(format_feature_flags & VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT)) {
goto unsupported;
}
}
if (info->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
- if (!(format_feature_flags & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
- VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))) {
+ if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT |
+ VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT))) {
goto unsupported;
}
}
+skip_checks:
*pImageFormatProperties = (VkImageFormatProperties) {
.maxExtent = maxExtent,
.maxMipLevels = maxMipLevels,
@@ -304,6 +401,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL;
VkExternalImageFormatProperties *external_props = NULL;
VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL;
+ VkHostImageCopyDevicePerformanceQueryEXT *hic;
VkResult result;
result = lvp_get_image_format_properties(physical_device, base_info,
&base_props->imageFormatProperties);
@@ -329,6 +427,11 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
ycbcr_props = (void *) s;
break;
+ case VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT:
+ hic = (void*)s;
+ hic->optimalDeviceAccess = VK_TRUE;
+ hic->identicalMemoryLayout = VK_TRUE;
+ break;
default:
break;
}
@@ -340,6 +443,13 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
VkExternalMemoryHandleTypeFlags compat_flags = 0;
switch (external_info->handleType) {
+#ifdef PIPE_MEMORY_FD
+ case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
+ flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
+ export_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+ compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+ break;
+#endif
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
@@ -354,7 +464,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
};
}
if (ycbcr_props)
- ycbcr_props->combinedImageSamplerDescriptorCount = 0;
+ ycbcr_props->combinedImageSamplerDescriptorCount = vk_format_get_plane_count(base_info->format);
return VK_SUCCESS;
}
@@ -362,7 +472,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceSparseImageFormatProperties(
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
- uint32_t samples,
+ VkSampleCountFlagBits samples,
VkImageUsageFlags usage,
VkImageTiling tiling,
uint32_t* pNumProperties,
@@ -391,6 +501,13 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceExternalBufferProperties(
VkExternalMemoryHandleTypeFlags export_flags = 0;
VkExternalMemoryHandleTypeFlags compat_flags = 0;
switch (pExternalBufferInfo->handleType) {
+#ifdef PIPE_MEMORY_FD
+ case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
+ flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
+ export_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+ compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+ break;
+#endif
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;