Mesa (main): venus: vn_GetAndroidHardwareBufferPropertiesANDROID (part 2/2)
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu May 20 20:05:51 UTC 2021
Module: Mesa
Branch: main
Commit: 10a826e340de8081a5a26bc1f611a9085fa5d369
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=10a826e340de8081a5a26bc1f611a9085fa5d369
Author: Yiwei Zhang <zzyiwei at chromium.org>
Date: Mon May 17 04:34:06 2021 +0000
venus: vn_GetAndroidHardwareBufferPropertiesANDROID (part 2/2)
Support VkAndroidHardwareBufferFormatPropertiesANDROID query.
Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10847>
---
src/virtio/vulkan/vn_android.c | 117 ++++++++++++++++++++++++++++++++++-------
1 file changed, 99 insertions(+), 18 deletions(-)
diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index ab1d14d4f43..c6dfb06e56c 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -255,10 +255,10 @@ vn_android_get_mem_type_bits_from_dma_buf(VkDevice device,
}
static bool
-vn_get_gralloc_buffer_info(buffer_handle_t handle,
- uint32_t out_strides[4],
- uint32_t out_offsets[4],
- uint64_t *out_format_modifier)
+vn_android_get_gralloc_buffer_info(buffer_handle_t handle,
+ uint32_t out_strides[4],
+ uint32_t out_offsets[4],
+ uint64_t *out_format_modifier)
{
static const int32_t CROS_GRALLOC_DRM_GET_BUFFER_INFO = 4;
struct cros_gralloc0_buffer_info info;
@@ -276,11 +276,11 @@ vn_get_gralloc_buffer_info(buffer_handle_t handle,
}
static VkResult
-vn_num_planes_from_format_and_modifier(VkPhysicalDevice physical_device,
- VkFormat format,
- uint64_t modifier,
- const VkAllocationCallbacks *alloc,
- uint32_t *out_num_planes)
+vn_android_get_modifier_properties(VkPhysicalDevice physical_device,
+ VkFormat format,
+ uint64_t modifier,
+ const VkAllocationCallbacks *alloc,
+ VkDrmFormatModifierPropertiesEXT *out_props)
{
VkDrmFormatModifierPropertiesListEXT mod_prop_list = {
.sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
@@ -312,7 +312,7 @@ vn_num_planes_from_format_and_modifier(VkPhysicalDevice physical_device,
for (uint32_t i = 0; i < mod_prop_list.drmFormatModifierCount; i++) {
if (mod_props[i].drmFormatModifier == modifier) {
- *out_num_planes = mod_props[i].drmFormatModifierPlaneCount;
+ *out_props = mod_props[i];
break;
}
}
@@ -350,30 +350,31 @@ vn_android_image_from_anb(struct vn_device *dev,
uint32_t strides[4] = { 0, 0, 0, 0 };
uint32_t offsets[4] = { 0, 0, 0, 0 };
uint64_t format_modifier = 0;
- uint32_t num_planes = 0;
result = vn_android_get_dma_buf_from_native_handle(anb_info->handle,
&dma_buf_fd);
if (result != VK_SUCCESS)
goto fail;
- if (!vn_get_gralloc_buffer_info(anb_info->handle, strides, offsets,
- &format_modifier) ||
+ if (!vn_android_get_gralloc_buffer_info(anb_info->handle, strides, offsets,
+ &format_modifier) ||
format_modifier == DRM_FORMAT_MOD_INVALID) {
result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
goto fail;
}
- result = vn_num_planes_from_format_and_modifier(
- physical_device, image_info->format, format_modifier, alloc,
- &num_planes);
+ VkDrmFormatModifierPropertiesEXT mod_props;
+ result =
+ vn_android_get_modifier_properties(physical_device, image_info->format,
+ format_modifier, alloc, &mod_props);
if (result != VK_SUCCESS)
goto fail;
/* TODO support multi-planar format */
- if (num_planes != 1) {
+ if (mod_props.drmFormatModifierPlaneCount != 1) {
if (VN_DEBUG(WSI))
- vn_log(dev->instance, "num_planes is %d, expected 1", num_planes);
+ vn_log(dev->instance, "plane count is %d, expected 1",
+ mod_props.drmFormatModifierPlaneCount);
result = VK_ERROR_INVALID_EXTERNAL_HANDLE;
goto fail;
}
@@ -728,6 +729,76 @@ vn_android_wsi_fini(struct vn_device *dev, const VkAllocationCallbacks *alloc)
vk_free(alloc, dev->android_wsi);
}
+static VkResult
+vn_android_get_ahb_format_properties(
+ struct vn_device *dev,
+ const struct AHardwareBuffer *ahb,
+ VkAndroidHardwareBufferFormatPropertiesANDROID *out_props)
+{
+ VkPhysicalDevice physical_device =
+ vn_physical_device_to_handle(dev->physical_device);
+
+ AHardwareBuffer_Desc desc;
+ AHardwareBuffer_describe(ahb, &desc);
+
+ /* AHB usage must include at least one GPU bit for image or buffer */
+ if (!(desc.usage & (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
+ AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER |
+ AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER)))
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ /* We implement AHB extension support with EXT_image_drm_format_modifier.
+ * It requires us to have a compatible VkFormat but not DRM formats. So if
+ * the ahb is not intended for backing a VkBuffer, error out early if the
+ * format is VK_FORMAT_UNDEFINED.
+ */
+ VkFormat format = vn_android_ahb_format_to_vk_format(desc.format);
+ if (format == VK_FORMAT_UNDEFINED) {
+ if (desc.format != AHARDWAREBUFFER_FORMAT_BLOB)
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ out_props->format = format;
+ out_props->externalFormat = desc.format;
+ return VK_SUCCESS;
+ }
+
+ uint32_t strides[4] = { 0, 0, 0, 0 };
+ uint32_t offsets[4] = { 0, 0, 0, 0 };
+ uint64_t format_modifier = 0;
+ const native_handle_t *handle = AHardwareBuffer_getNativeHandle(ahb);
+ if (!vn_android_get_gralloc_buffer_info(handle, strides, offsets,
+ &format_modifier) ||
+ format_modifier == DRM_FORMAT_MOD_INVALID)
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ VkDrmFormatModifierPropertiesEXT mod_props;
+ VkResult result = vn_android_get_modifier_properties(
+ physical_device, format, format_modifier, &dev->base.base.alloc,
+ &mod_props);
+ if (result != VK_SUCCESS)
+ return result;
+
+ *out_props = (VkAndroidHardwareBufferFormatPropertiesANDROID) {
+ .sType = out_props->sType,
+ .pNext = out_props->pNext,
+ .format = format,
+ .externalFormat = desc.format,
+ .formatFeatures = mod_props.drmFormatModifierTilingFeatures,
+ .samplerYcbcrConversionComponents = {
+ .r = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .g = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .b = VK_COMPONENT_SWIZZLE_IDENTITY,
+ .a = VK_COMPONENT_SWIZZLE_IDENTITY,
+ },
+ .suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601,
+ .suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
+ .suggestedXChromaOffset = VK_CHROMA_LOCATION_MIDPOINT,
+ .suggestedYChromaOffset = VK_CHROMA_LOCATION_MIDPOINT,
+ };
+
+ return VK_SUCCESS;
+}
+
VkResult
vn_GetAndroidHardwareBufferPropertiesANDROID(
VkDevice device,
@@ -739,6 +810,16 @@ vn_GetAndroidHardwareBufferPropertiesANDROID(
int dma_buf_fd = -1;
uint32_t mem_type_bits = 0;
+ VkAndroidHardwareBufferFormatPropertiesANDROID *format_props =
+ vk_find_struct(pProperties->pNext,
+ ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID);
+ if (format_props) {
+ result =
+ vn_android_get_ahb_format_properties(dev, buffer, format_props);
+ if (result != VK_SUCCESS)
+ return vn_error(dev->instance, result);
+ }
+
const native_handle_t *handle = AHardwareBuffer_getNativeHandle(buffer);
result = vn_android_get_dma_buf_from_native_handle(handle, &dma_buf_fd);
if (result != VK_SUCCESS)
More information about the mesa-commit
mailing list