【问题标题】:VK_FORMAT_UNDEFINED for Android hardware buffer with depth format on VulkanVK_FORMAT_UNDEFINED 用于 Vulkan 上具有深度格式的 Android 硬件缓冲区
【发布时间】:2023-03-25 10:09:01
【问题描述】:

如果我分配具有深度格式 (AHARDWAREBUFFER_FORMAT_D16_UNORM) 的 Android 硬件缓冲区,则 vkGetAndroidHardwareBufferPropertiesANDROID 检索的结果 Vulkan 格式为 VK_FORMAT_UNDEFINED,即使硬件缓冲区深度格式具有直接的 Vulkan 格式等效 (VK_FORMAT_D16_UNORM)。颜色格式不会发生同样的情况:使用 AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM vkGetAndroidHardwareBufferPropertiesANDROID 会按预期产生 VK_FORMAT_R8G8B8A8_UNORM。

是否需要使用特殊参数或扩展名才能正确映射深度格式?

这是一个sn-p的代码:

uint32_t width = 1024;
uint32_t height = 1024;
// uint32_t hardwareBufferFormat = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
uint32_t hardwareBufferFormat = AHARDWAREBUFFER_FORMAT_D16_UNORM;
uint32_t hardwareBufferUsage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
VkAndroidHardwareBufferFormatPropertiesANDROID bufferFormatProperties{VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID};
VkAndroidHardwareBufferPropertiesANDROID bufferProperties{VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID};
bufferProperties.pNext = &bufferFormatProperties;
AHardwareBuffer *hardwareBuffer;
AHardwareBuffer_Desc desc{width, height, 1, hardwareBufferFormat, hardwareBufferUsage, 0, 0, 0};
int error = AHardwareBuffer_allocate(&desc, &hardwareBuffer);
if (error < 0) {
  LOGE("AHardwareBuffer_allocate error: %d", error);
  return;
}

vkGetAndroidHardwareBufferPropertiesANDROID(tutorialDevice, hardwareBuffer, &bufferProperties);

完整代码,在 android-vulkan-tutorials (https://github.com/googlesamples/android-vulkan-tutorials) 的 fork 上的分支,可在此处获得:https://github.com/pm328/android-vulkan-tutorials/pull/1/files

测试设备:三星 Galaxy S20、Galaxy Note 10+ 5G

GPU:Adreno(高通骁龙)

安卓版本:10

我还测试了 AHARDWAREBUFFER_FORMAT_D24_UNORM、AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT 和 AHARDWAREBUFFER_FORMAT_D32_FLOAT,结果完全相同。

【问题讨论】:

    标签: android android-ndk vulkan depth-buffer


    【解决方案1】:

    不保证所有AHARDWAREBUFFER_FORMAT类型都可以通过他的方法分配;可用的是特定于平台的。致电AHardwareBuffer_isSupported() 看看它们是否存在,但如果没有深度缓冲区,我也不会感到惊讶。

    【讨论】:

    • AHardwareBuffer_isSupported 返回 1。我添加了一个提交来检查这一点。它可能不受支持,但这不是 API 告诉我的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多