在 Android 中将外部缓冲区导入 Vulkan 时出现问题

2023-12-21

我正在尝试使用 Vulkan 在 Android 10 中显示图像。管道看起来像这样

MediaCodec -> ImageReader -> AHardwareBuffer(传递到 Vulkan 上下文) -> 映射到 Vulkan -> 使用 Vulkan API 显示它

在 Native CPP 层中,在 Vulkan Context 中完成以下操作以导入 hardwarebuffer:查找 AHardwareBuffer 的属性 -> 创建 VkImage ->创建设备内存(专用内存)-> 将缓冲区映射到 VkImage -> 使用 YUVSampler 进行采样

问题在于“创建设备内存”是 Vulkan 验证层显示错误的步骤。它抱怨该格式不受支持。请注意,我使用的是外部格式(SPEC 允许这样做),因此格式处理是不透明的。 这现在不起作用,我每次都只看到一个黑框。有人可以评论一下吗?我在将 AHardwareBuffer 导入 Vulkan 上下文的逻辑中缺少什么。

为什么是外部格式?好吧,因为我无法控制不同设备上解码器的输出,并且想要一些不透明的方法来处理它。

另外,我使用以下设置来创建 ImageReader

ImageReader.newInstance(1920, 1080, ImageFormat.PRIVATE, MAX_IMAGE_SIZE + 1,
    HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE);

Vulkan 中的代码,从我收到 AHardwareBuffer 到验证层认为导致问题的 API,如下所示。我尝试仅将相关代码保留到此处的映射。

VkAndroidHardwareBufferFormatPropertiesANDROID hardwareBufferFormat{
    .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID,
    .pNext = nullptr,
};

VkAndroidHardwareBufferPropertiesANDROID hardwareBufferProperties{
    .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID,
    .pNext = &hardwareBufferFormat,
};

/* Find the properties of AHardwareBuffer that is to be imported */
vkGetAndroidHardwareBufferPropertiesANDROID(mLogicalDevice, buffer, &hardwareBufferProperties);

// mTexture.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkImage Image_local;
VkExternalFormatANDROID externalFormatAndroid{
    .sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID,
    .pNext = nullptr,
    .externalFormat = hardwareBufferFormat.externalFormat,
};

VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo{
    .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
    .pNext = &externalFormatAndroid,
    .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
};

VkImageCreateInfo imageCreateInfo{
    .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
    .pNext = &externalMemoryImageCreateInfo,
    .flags = 0,
    .imageType = VK_IMAGE_TYPE_2D,
    .format = VK_FORMAT_UNDEFINED,
    .extent = {1920, 1080, 1},
    .mipLevels = 1,
    .arrayLayers = hardwareBufferDesc.layers,
    .samples = VK_SAMPLE_COUNT_1_BIT,
    .tiling = VK_IMAGE_TILING_OPTIMAL,
    .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
    .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
    .queueFamilyIndexCount = 0,
    .pQueueFamilyIndices = nullptr,
    .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
};

vkCreateImage(mLogicalDevice, &imageCreateInfo, nullptr, &Image_local);

VkImportAndroidHardwareBufferInfoANDROID hardwareBufferInfo{
    .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
    .pNext = nullptr,
    .buffer = buffer};

VkMemoryDedicatedAllocateInfo memoryDedicatedAllocateInfo{
    .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
    .pNext = &hardwareBufferInfo,
    .image = Image_local,
    .buffer = VK_NULL_HANDLE,
};

uint32_t mem_index = GetMemoryType(hardwareBufferProperties.memoryTypeBits, 0);
VkMemoryAllocateInfo memoryAllocateInfo{
    .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
    .pNext = &memoryDedicatedAllocateInfo,
    .allocationSize = hardwareBufferProperties.allocationSize,
    .memoryTypeIndex = mem_index,
};

/* So this API here does not return any erros, however the validation layer says that the format
 * is not supported. I am using an external Format, so assuming that this should not complain.
 */
vkAllocateMemory(mLogicalDevice, &memoryAllocateInfo, nullptr, &mTexture.deviceMemory)

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中将外部缓冲区导入 Vulkan 时出现问题 的相关文章

随机推荐

  • Numpy:如何按列堆叠数组?

    假设我有 n 个相同长度的 numpy 数组 我现在想创建一个 numpy 矩阵 使得矩阵的每一列都是 numpy 数组之一 我怎样才能实现这个目标 现在我正在循环中执行此操作 但会产生错误的结果 注意 我必须能够迭代地将它们一一堆叠在一起
  • 从 void ** 到 char ** 的转换有多危险

    所以我们知道标准并不强制指针大小相等 here https stackoverflow com questions 1241205 are all data pointers of the same size in one platform
  • jQuery:如何获取表单提交时单击了哪个按钮?

    我有一个 submit 为表单提交设置的事件 我的页面上还有多个表单 但本示例仅提供一个表单 我想知道在没有应用的情况下单击了哪个提交按钮 click 事件对每个人来说 这是设置
  • HTTP 请求标头

    好的 我一直在使用原始 HTTP 请求 发现我可以将原始 HTTP 响应发布到 NSLog 中 并且我几乎已经将原始 HTTP 请求破解到 NSLog 中 我现在有点卡住了 代码示例 NSString CurrentWebURL webVi
  • 日历中的重复事件 - Rails

    我正在寻找对重复事件进行建模的最佳方法 我正在使用 fullcalendar 来显示事件 但我认为重复事件最好在 Rails 后端处理 我已经查看了其他问题和现有示例代码 但没有找到任何合适的内容 它的行为应该类似于谷歌日历 所以应该可以删
  • 如何通过新的 RTTI 设置事件处理程序? [D2010]

    在使用新的 RTTI 模块时 我找不到使用新实用程序设置事件处理程序的方法 尝试这样的事情 LProp TRttiContext Create GetType Form1 ClassInfo AsInstance GetProperty O
  • C语言中如何截断文件?

    我正在使用 C 将一些数据写入文件 我想删除文件中以前写入的文本 以防它比我现在写的长 我想减小文件的大小或截断直到最后 我怎样才能做到这一点 如果您想将文件的先前内容保留到一定长度 大于零的长度 其他答案提供了 则 POSIX 提供tru
  • 计算 Woocommerce 中每个订单状态的不同订单状态计数和总现金

    我需要在 woocommerce 查询中获取几天之间不同状态的订单总数 为了让它循环遍历某天之间的所有订单 我使用以下查询 args array post type gt shop order post status gt publish
  • 获取 I/art:显式并发标记清除 GC 释放

    我正在启动一个服务 gt 后台服务 并开始检查 新线程 中的文件 在日志中我得到以下内容 服务 应用程序被暂停 Log I art Explicit concurrent mark sweep GC freed 25935 1686KB A
  • 如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?

    对于我的应用程序 我一直在使用自己的 Camera 类来拍摄图像和自己的数据库 但很快我就无法真正跟上变化 我决定使用 Android 中的内置相机应用程序来完成这项工作 但是我似乎无法让它保存文件 我在这里缺少什么 应用程序似乎保存了文件
  • Magento - 使用购物车页面上的自定义模块添加自定义块

    我创建了一个自定义模块 并尝试在购物车表之后和总计框之前包含一个块 但我无法将其放在那个确切的位置 我可以让我的块出现在内容部分中 就在其他所有内容的下方 但不在中间 如果我覆盖 checkout xml 和 cart phtml 那么我可
  • 如何向 spaCy tokenizer 添加自定义规则以将 HTML 分解为单个标记?

    我知道有很多资源可以解决这个问题 但我无法让 spaCy 完全满足我的要求 我想向我的 spaCy 分词器添加规则 以便 HTML 标签 例如 br 等等 在我的文本中将是一个标记 我现在正在使用 merge noun chunks 管道
  • 没有强烈扭曲的纹理球体

    我在几款游戏中看到过纹理良好的球 行星和其他球形物体 上次是在 UFO 余波 中 如果你只是将纹理泼洒到纬度 经度作为 u 和 w 坐标 你会得到很多难看的纹理扭曲到极点 我可以认为自己是实现失真最小的球形贴图的一种方法 通过映射三角形而不
  • 将多个 ggplot2 绘图与网格对齐

    Context 我想在同一页面上绘制两个具有相同图例的 ggplot2 http code google com p gridextra wiki arrangeGrob http code google com p gridextra w
  • 为什么 2px 边框在 Firefox 和 Chrome 中渲染的高度高于 2px?

    我正在尝试用两种不同的方式创建一条线 一种是高度为 2px 的 div 和背景 红色 另一个是带有 2px 顶部边框 蓝色 的 div 这是测试代码 line display inline block vertical align top
  • 一个java UDP套接字可以处理多少个请求?

    我需要构建一个 UDP 服务器 它可以处理每秒约 10 000 个请求 从下面的代码开始 测试 java 套接字是否可以处理这些数量的请求 我用大约 9000 个请求轰炸服务器一分钟 Total number of requests sen
  • 使用 Seaborn FacetGrid 设置日期标签格式

    我想制作一个分面网格 以变量名称为列 以部门为行 每个小图表是 y value 和 x date 的散点图 我的数据有点像这样 import pandas as pd import numpy as np import seaborn as
  • 如何使用 jQuery 更改多个元素的样式?

    我有一个 CSS 样式表 其规则如下 h1 h2 h3 h4 contentheading title font size 13px font weight normal font family Arial Geneva Helvetica
  • AsyncValidators 会一直触发吗?

    我正在使用 angular js 1 6 4 版本 我创建了一个用于服务器端验证的指令 我发现它在加载表单时触发 这是错误的 我只想在更改值时触发我的代码 我的 HTML 代码是 div class col xs 6 div class c
  • 在 Android 中将外部缓冲区导入 Vulkan 时出现问题

    我正在尝试使用 Vulkan 在 Android 10 中显示图像 管道看起来像这样 MediaCodec gt ImageReader gt AHardwareBuffer 传递到 Vulkan 上下文 gt 映射到 Vulkan gt