当前位置: 首页 > news >正文

在Linuxfb环境下利用海思TDE API实现高效的2D图形加速

在嵌入式开发领域,高效的图形绘制对于提升用户体验至关重要。Linuxfb(Linux Framebuffer)提供了一种不依赖于X Window系统的图形绘制方式,而海思TDE(Two Dimension Engine)则为图形加速提供了强大的硬件支持。本文将介绍如何在Linuxfb环境下结合海思TDE API实现高效的2D图形加速。

一、背景知识

Linuxfb简介

Linuxfb是Linux内核提供的一个子系统,它允许用户空间程序直接访问图形硬件,进行图形绘制。Linuxfb抽象了底层的图形硬件细节,为上层应用提供了统一的编程接口。

海思TDE简介

海思TDE是海思半导体提供的一种硬件加速引擎,专门用于2D图形操作。它能够快速完成位图搬移、缩放、颜色填充等操作,显著提升图形处理的效率。

二、目标与动机

将海思TDE API集成到Linuxfb中,可以充分利用硬件加速的优势,提升图形绘制的性能。这对于需要高性能图形显示的嵌入式应用(如工业控制、车载系统等)来说尤为重要。

三、实现步骤详解

1. 初始化TDE设备

在使用TDE功能之前,需要初始化TDE设备。在QLinuxFbScreen::initialize()函数中添加以下代码:

HI_S32 s32Ret = HI_TDE2_Open();
if (s32Ret != HI_SUCCESS) {qErrnoWarning("Failed to open TDE device");close(mFbFd);return false;
}

2. 创建和提交TDE任务

QRegion QLinuxFbScreen::doRedraw()函数中添加TDE相关代码时,需要确保在合适的位置调用TDE的API。以下是具体的建议:

修改后的QRegion QLinuxFbScreen::doRedraw()函数:

QRegion QLinuxFbScreen::doRedraw() {QRegion touched = QFbScreen::doRedraw();if (touched.isEmpty()) {return touched;}// 创建TDE任务TDE_HANDLE tdeHandle = HI_TDE2_BeginJob();if (tdeHandle <= 0) {qErrnoWarning("Failed to create TDE job");return touched;}// 执行位图搬移操作或其他TDE加速操作TDE2_SURFACE_S srcSurface, dstSurface;TDE2_RECT_S srcRect, dstRect;// 配置源位图和目标位图信息srcSurface.PhyAddr = (HI_U64)mMmap[0].data;srcSurface.enColorFmt = TDE2_COLOR_FMT_ARGB8888;srcSurface.u32Width = mGeometry.width();srcSurface.u32Height = mGeometry.height();srcSurface.u32Stride = mBytesPerLine;dstSurface.PhyAddr = (HI_U64)mMmap[1].data;dstSurface.enColorFmt = TDE2_COLOR_FMT_ARGB8888;dstSurface.u32Width = mGeometry.width();dstSurface.u32Height = mGeometry.height();dstSurface.u32Stride = mBytesPerLine;// 配置操作区域srcRect.s32Xpos = 0;srcRect.s32Ypos = 0;srcRect.u32Width = mGeometry.width();srcRect.u32Height = mGeometry.height();dstRect.s32Xpos = 0;dstRect.s32Ypos = 0;dstRect.u32Width = mGeometry.width();dstRect.u32Height = mGeometry.height();// 执行快速位图搬移HI_TDE2_QuickCopy(tdeHandle, &srcSurface, &srcRect, &dstSurface, &dstRect);// 提交TDE任务HI_S32 s32Ret = HI_TDE2_EndJob(tdeHandle, HI_TRUE, HI_TRUE, 20);if (s32Ret != HI_SUCCESS) {qErrnoWarning("Failed to submit TDE job");return touched;}// 如果没有使用mBlitter,可以继续使用QPainter进行绘制if (!mBlitter) {mBlitter = new QPainter(&mFbScreenImage);}mBlitter->setCompositionMode(QPainter::CompositionMode_Source);for (const QRect &rect : touched) {mBlitter->drawImage(rect, *mScreenImage, rect);}return touched;
}

3. 关闭TDE设备

QLinuxFbScreen类的析构函数中关闭TDE设备:

~QLinuxFbScreen() {HI_TDE2_Close();// 其他清理工作...
}

四、调试与优化技巧

调试技巧

  • 在开发过程中,充分使用日志输出来跟踪TDE操作的状态和结果。

  • 使用海思提供的调试工具对TDE任务进行性能分析和调试。

性能优化

  • 根据实际需求调整TDE任务的优先级和超时时间。

  • 合理规划位图的操作区域,避免不必要的图形操作。

五、完整示例代码

以下是结合海思TDE API的Linuxfb重绘函数的完整示例代码:

QRegion QLinuxFbScreen::doRedraw() {QRegion touched = QFbScreen::doRedraw();if (touched.isEmpty()) {return touched;}// 创建TDE任务TDE_HANDLE tdeHandle = HI_TDE2_BeginJob();if (tdeHandle <= 0) {qErrnoWarning("Failed to create TDE job");return touched;}// 执行位图搬移操作TDE2_SURFACE_S srcSurface, dstSurface;TDE2_RECT_S srcRect, dstRect;srcSurface.PhyAddr = (HI_U64)mMmap[0].data;srcSurface.enColorFmt = TDE2_COLOR_FMT_ARGB8888;srcSurface.u32Width = mGeometry.width();srcSurface.u32Height = mGeometry.height();srcSurface.u32Stride = mBytesPerLine;dstSurface.PhyAddr = (HI_U64)mMmap[1].data;dstSurface.enColorFmt = TDE2_COLOR_FMT_ARGB8888;dstSurface.u32Width = mGeometry.width();dstSurface.u32Height = mGeometry.height();dstSurface.u32Stride = mBytesPerLine;srcRect.s32Xpos = 0;srcRect.s32Ypos = 0;srcRect.u32Width = mGeometry.width();srcRect.u32Height = mGeometry.height();dstRect.s32Xpos = 0;dstRect.s32Ypos = 0;dstRect.u32Width = mGeometry.width();dstRect.u32Height = mGeometry.height();HI_TDE2_QuickCopy(tdeHandle, &srcSurface, &srcRect, &dstSurface, &dstRect);// 提交TDE任务HI_S32 s32Ret = HI_TDE2_EndJob(tdeHandle, HI_TRUE, HI_TRUE, 20);if (s32Ret != HI_SUCCESS) {qErrnoWarning("Failed to submit TDE job");return touched;}// 使用QPainter进行额外绘制(可选)if (!mBlitter) {mBlitter = new QPainter(&mFbScreenImage);}mBlitter->setCompositionMode(QPainter::CompositionMode_Source);for (const QRect &rect : touched) {mBlitter->drawImage(rect, *mScreenImage, rect);}return touched;
}

六、总结与展望

通过将海思TDE API集成到Linuxfb中,我们能够充分利用硬件加速的优势,显著提升图形绘制的性能。这对于嵌入式系统中的图形密集型应用来说是一个巨大的提升。未来的工作可以进一步探索TDE的高级功能,如多层图形叠加、抗闪烁处理等,以满足更复杂的图形需求。

希望本文能为嵌入式开发人员提供有价值的参考,帮助他们在实际项目中实现高效的图形加速。

http://www.xdnf.cn/news/679159.html

相关文章:

  • Java中的日期类详解
  • 数据泄露频发,Facebook的隐私保护是否到位?
  • 12. CSS 布局与样式技巧
  • [网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发
  • 使用tunasync部署企业内部开源软件镜像站-Centos Stream 9
  • 用ChatGPT辅助UI设计:从需求分析到风格提案的提效秘籍
  • 代码随想录算法训练营第五十一天
  • Day4 记忆内容:priority_queue 高频操作
  • SAAS架构设计2-流程图-注册流程图
  • uni-app 中开发问题汇总
  • 【网络编程】十七、多路转接之 epoll
  • JAVA SE 文件IO
  • Python函数
  • python+tkinter实现GUI界面调用即梦AI文生图片API接口
  • PPO算法里clipfrac变量的作用
  • 《计算机组成原理》第 7 章 - 指令系统
  • 恶意npm与VS Code包窃取数据及加密货币资产
  • 科研级计算服务器 稳定支撑创新研究
  • 系统设计——项目设计经验总结3
  • int c =5; 代码解释
  • 《计算机组成原理》第 5 章 - 输入输出系统
  • 冒泡排序:像煮汤一样让数字「冒泡」
  • centos7安装MySQL(保姆级教学)
  • Linux信号量(32)
  • 鸿蒙OSUniApp 开发的滑动图片墙组件#三方框架 #Uniapp
  • 方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案
  • 如何验证 AXI5 原子操作
  • leetcode刷题日记——完全二叉树的节点个数
  • Java怎么实现父子线程的值传递?InheritableThreadLocal类和transmittable-thread-local类?
  • Unity3D仿星露谷物语开发53之库存管理页面