草庐IT

OpenHarmony富设备移植指南(6.3)GPU调试经验分享

Diemit 2023-03-28 原文

想了解更多关于开源的内容,请访问:

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

本人使用树莓派4和小米6进行OpenHarmony适配GPU时产生过许多问题,这里回顾一下我移植GPU的过程,同时也做一些总结和经验分享,希望大家看过之后能少走一些弯路。

1、树莓派4GPU移植

树莓派4的GPU驱动组成比较复杂,在Linux的gpu驱动目录中drm目录下存放着vc4和v3d两个目录,vc4既包含Display驱动也包含GPU驱动,主要用于树莓派3及之前的SoC;而v3d则只包含gpu驱动,专用于树莓派4。由于vc4和v3d的Display硬件差异不大,为了让树莓派4最大化利用vc4现有的Display驱动,树莓派驱动的开发者并没有分离代码,所以树莓派的GPU驱动需要同时启用vc4和v3d。同时,我在查阅mesa3d的文档中有关v3d的描述中也有类似的说明,原文如下:

The V3D Mesa drivers communicate directly with the V3D kernel DRM driver for scheduling GPU commands. Additionally, on the Raspberry Pi 4, the kernel uses the VC4 DRM driver for display support, so Mesa exposes a vc4_dri.so using the kmsro helpers to do behind-the-scenes buffer management between the two kernel drivers, while executing rendering on the V3D kernel module.

查资料时我看到树莓派的mesa3d驱动还需要kmsro,当时我不太理解,经过好几天的网上搜索,最终抱着不确定的心态,使用了以下的参数编译mesa:

-Dplatforms=ohos -Degl-native-platform=ohos -Ddri-drivers= -Dgallium-drivers=v3d,vc4,kmsro \
-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools= -Ddri-search-path=/vendor/lib/chipsetsdk
在复制编译好的lib文件加入编译框架,并在config.json中设置启用gpu。

"graphic_standard_feature_ace_enable_gpu = true",
编译烧录之后运行黑屏,受到SIG-OpenGfxDrv群里的大神指导,调试gpu可以先设置cpu合成,gpu渲染的模式,即保持config.json中设置启用gpu,同时修改foundation/graphic/graphic_2d/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp中的NeedForceCPU函数,强制使用cpu合成。

//bool forceCPU = false;
bool forceCPU = true;
再次编译,烧录运行,发现屏幕能点亮,但是显示异常,经过各种探索,仍然无法解决,第一次移植失败。

经过断断续续的查找资料,对比验证,找到了验证gpu工作的方法,就是通过opengl的api调用一个简单的gpu绘图程序,结果仍然撕裂,这时我基本确定问题不在编译参数了。

接口能调用成功,但是显示异常,这种bug不会报错,没有图形相关经验的我根本定位不到原因,最终我想到树莓派4有安卓的移植项目,随后查到安卓也是用mesa3d,然后我找到了两个树莓派4移植项目, 【lineage-rpi】和【 android-rpi】,对比了两个仓中的mesa3d代码之后,终于给我在【 android-rpi】中发现了关键代码,树莓派4适配安卓仅仅修改了下面这些地方:

然后再看OpenHarmony的mesa3d的代码,之前我对比过platform_ohos.c跟platform_android.c的区别,差异是有,但是总体比较类似,同时我也发现了注释中有说明platform_ohos是基于platform_android修改。

经过对比,我把android-rpi对mesa的修改手动同步到了OpenHarmony的mesa中,修改如下。

经过重新编译,烧录,测试例子终于能够正常显示,前后历时四个多月,从3.2beta3跨到了3.2beta4。

cpu合成+cpu渲染组合下,调用OpenGLApi进行三角形的绘制:


启用GPU渲染后,能够感知到帧率有提升,打个比方,cpu合成+cpu渲染在竖屏旋转下只有7帧/秒,cpu合成+gpu渲染下能达到14帧/秒,有提升但是仍然卡顿严重,经过多方求教仍未解决问题。

在初步打通gpu调用之后,夜里脑子仍在思考着问题的解决办法,不断排列组合,最终想到了3.2beta4的一个公告内容,RS侧支持GPU合成,然后又联系到了几个月前我看到过的一个关于gpu的issue,描述到了【graphic_standard_feature_rs_enable_eglimage】这个参数,最后爬起来把这个参数设置成了true,编译烧录一套走起,最后居然给干成了,流畅度可感知的达到了60fps那种流畅。

通过树莓派4适配GPU的经历,我总结出GPU适配的思路如下:

1.不启用GPU功能,在CPU合成+CPU渲染的环境下,确认GPU驱动正常工作。

foundation/graphic/graphic_2d/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp中的NeedForceCPU
中修改强制cpu合成
//bool forceCPU = false;
bool forceCPU = true;

vendor/raspberrypi/rpi4/config.json
中设置不启用gpu
"graphic_standard_feature_ace_enable_gpu = false",
2.启用部分GPU功能,在CPU合成+GPU渲染的环境下,确认GPU能正确渲染。

foundation/graphic/graphic_2d/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp中的NeedForceCPU
中修改关闭cpu合成
//bool forceCPU = false;
bool forceCPU = true;

vendor/raspberrypi/rpi4/config.json
中设置启用gpu
"graphic_standard_feature_ace_enable_gpu = true",
3.启用GPU合成+GPU渲染,加速OpenHarmony图形显示。

foundation/graphic/graphic_2d/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp中的NeedForceCPU
中还原关闭cpu合成
bool forceCPU = false;

vendor/raspberrypi/rpi4/config.json
中设置启用gpu,同时启用gpu合成
"graphic_standard_feature_ace_enable_gpu = true",
"graphic_standard_feature_rs_enable_eglimage = true"
同时OpenHarmony开源的GPU移植也可以参考安卓方面的移植。

2、小米6GPU移植

小米6的gpu是Adreno 540,经过网上搜索资料mesa驱动对应的名字是freedreno,所以编译参数对应为:

-Dplatforms=ohos -Degl-native-platform=ohos -Ddri-drivers= -Dgallium-drivers=freedreno \
-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools= -Ddri-search-path=/vendor/lib64/chipsetsdk
但是编译烧录之后运行简单的测试gpu程序始终无法运行,signal 11程序崩溃了。

通过/data/log/faultlog/temp下崩溃日志确认build_id_find_nhdr_callback存在问题。

通过在函数内部加print打印的方式,对比分析之后确认是offset计算不正确,最后我意外发现了OpenHarmony的【third_party_libunwind】有修改过build-id,经过查看pr提交发现了以下关键代码,原来是oh的编译框架在编译出的elf文件头增加了一个非标准的note段,mesa使用标准的方式去解析note内容导致偏移量计算出错,需要处理一下偏移量问题,然而mesa3d这个开源gpu驱动长久没人维护了,这个问题一直没有暴露出来,这给我碰到了。。。同步修改之后解决调用崩溃问题。

同时接口调用也能正常显示了。

但是当我进行移植第二步,CPU合成+GPU渲染时黑屏,无法显示内容,又是一番折腾,加打印然后调试,最后发现关键代码,freedreno中有强制设置对齐。

在hilog中发现Assertion failed。

查看源码发现a5xx系的头文件中有pitch的验证,【&0x3f】相当于判断能否被64整除。

然后我往前找到buffer设置的某个地方尝试着把pich强制64对齐,终于能显示出图像。

不黑屏了,但是仍然显示不正常,很明显能感知到是长度没有对齐导致错位了。

最终在SIG-OpenGfxDrv群里的lhl大神指导下,修改display适配层中的WIDTH_ALIGN参数为64,成功解决显示问题。

确认CPU合成+GPU渲染显示能正常工作之后,启用GPU合成+GPU渲染,成功运行,小米6终于适配GPU成功。

树莓派4和小米6的GPU适配,从代码量来说,适配代码真的很少,但是又异常困难,在此记录一下我走过的坑,希望我走过的坑,后来者不用再掉下去。

想了解更多关于开源的内容,请访问:

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

有关OpenHarmony富设备移植指南(6.3)GPU调试经验分享的更多相关文章

  1. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  2. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  3. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. ruby - Ruby 是否有类似于 Perl 的 "perl -d"的逐步调试器? - 2

    Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby​​2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby​​-debug的后继者 关于ruby-Ruby

  6. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  7. ruby-on-rails - 可移植 Ruby on Rails 环境 - 2

    我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  8. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  9. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  10. ruby-on-rails - 使用 Pow 作为服务器在 RubyMine 中调试 - Ruby 2.1.1 + Rails 4 - 2

    我已经开始使用RubyMine6。我正在处理Rails4、Ruby2.1.1项目。我无法找到如何使用Pow作为服务器调试到RubyMine。你能给我指明正确的方向吗? 最佳答案 我能够使用远程调试从RubyMine进行调试。我正在使用RubyMine6、Rails3、Ruby2.1.1。首先创建一个.powenv文件并添加:exportRUBY_DEBUG_PORT=1234exportPOW_WORKERS=1将以下gem添加到您的Gemfile:gem'ruby-debug-ide'gem'debase'创建一个新的初始化器st

随机推荐