系统版本
- SoC :SpacemiT Key Stone K3
- GPU :PowerVR B-Series BXM-4-64 MC1
- 内核版本 :Linux 5.x(SpacemiT 官方 BSP)
- V2D 驱动 :
libv2d_plugin.so(版本未知,随 BSP 发布)
使用场景或测试目标
目标构建一个完整的渲染 → 格式转换 → 编码流水线:
- Vulkan 离屏渲染输出 BGRA 纹理(
VK_FORMAT_B8G8R8A8_UNORM) - 需要转换为 NV12(YUV 4:2:0)格式供 VPU 硬件编码器(
h264_v4l2m2m)使用 - 预期用 V2D 硬件加速替代 CPU 颜色转换,提升
渲染 (GPU) → BGRA → [V2D 硬件转换] → NV12 → VPU 编码 → H.264
操作步骤
1. 环境检查
bash
检查 V2D 设备节点 ls -la /dev/v2d*
输出:/dev/v2d0 存在
检查 V2D 库 ls -la /usr/lib/libv2d_plugin.so
输出:文件存在
2. 官方测试程序验证
bash
运行官方 g2d_test ./g2d_test
3. 引擎集成尝试
在 core/graphics/v2d/v2d_converter.cpp 中:
cpp
// 动态加载 libv2d_plugin.so void* handle = dlopen(“libv2d_plugin.so”, RTLD_LAZY);
// 调用 ASR_V2D_Init 成功
// 调用 ASR_V2D_StartJob 成功
// 调用 ASR_V2D_EndJob 崩溃
结果数据 / 截图 / 日志
官方测试程序崩溃日志
text
$ ./g2d_test [G2D] Version: 1.0.0 [G2D] Device opened: /dev/v2d0 [G2D] Initialization successful [G2D] Starting job… Segmentation fault (core dumped)
引擎集成崩溃堆栈
text
(gdb) bt #0 0x0000fffff7a8b4c0 in ASR_V2D_EndJob () from /usr/lib/libv2d_plugin.so #1 0x0000aaaab4c2d8a0 in V2DConverter::convert() at v2d_converter.cpp:87 #2 0x0000aaaab4c2e000 in main() at test_v2d.cpp:45
符号检查
bash
$ nm -D /usr/lib/libv2d_plugin.so | grep ASR_V2D 0000fffff7a8b000 T ASR_V2D_Init 0000fffff7a8b200 T ASR_V2D_StartJob U ASR_V2D_EndJob # ← 未定义!?
关键发现 :ASR_V2D_EndJob 符号在 .so 中缺失或被剥离,导致调用时跳转到无效地址。
遇到的问题
问题一:V2D 驱动接口不完整
libv2d_plugin.so导出了ASR_V2D_Init和ASR_V2D_StartJob,但ASR_V2D_EndJob符号缺失或为UNDEFINED- 官方提供的测试程序
g2d_test同样崩溃,说明不是引擎集成问题,而是底层驱动/BSP 问题
问题二:缺少 V2D 文档
- 没有公开的 V2D API 文档
- 不清楚正确的 job 提交和等待完成流程
libv2d_plugin.so的调用约定不明确
问题三:社区经验空白
- 在 SpacemiT 官方论坛搜索
V2D关键词,几乎找不到任何开发者分享的使用经验 - 官方 SDK 示例中只有简单的
g2d_test,没有实际生产级示例
你的判断 / 改进建议
根因判断
- BSP 发布不完整 :K3 的 V2D 硬件在设备树中已启用(
/dev/v2d0存在),但用户态驱动libv2d_plugin.so缺少关键 API 实现 - 质量验证不足 :官方测试程序无法正常运行,说明 V2D 软件栈未经过基本质量验证即随 BSP 发布
- 文档缺失 :没有提供完整的 V2D 编程指南或 API 参考手册