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

openharmony系统移植之gpu mesa3d适配

openharmony系统移植之gpu mesa3d适配

文章目录

  • openharmony系统移植之gpu mesa3d适配
  • 1. 环境说明
  • 2. gpu内核panfrost驱动
    • 2.1 使能panfrost驱动
    • 2.2 panfrost dts配置
  • 3. buildroot下测试gpu驱动
    • 3.1 buildroot配置编译
  • 4. ohos下mesa3d适配
    • 4.1 ohos下mesa3d编译调试
      • 4.1.2 编译
      • 4.1.3 glmark2测试
    • 4.2 ohos使能gpu
      • 4.2.1 使能gpu
      • 4.2.2 使能gpu后开机启动黑屏问题解决

1. 环境说明

  • 芯片平台: 第三方soc cortex-A7

  • gpu:mail-T628

  • 系统:openharmony-v4.0-release tag

gpu mesa3d适配的前提是先完成cpu点屏,再进行gpu适配,整个调试过程困难重重,感谢DIEMIT,Algoldeas大佬的指导。

下面主要描述整个移植过程和一些经验分享。

前期参考DIEMIT大佬的视频从零开始移植OpenHarmony_第4节_CPU亮屏,已经完成openharmony下cpu点屏,在此过程中遇到了显示花屏也困扰很久,具体解决情况见链接openharmony4.0 cpu点屏图像显示花屏。

2. gpu内核panfrost驱动

panfrost的是对ARM 系列GPU驱动的开源实现,它的功能主要是完成对GPU硬件的初始化,以及以job的方式,完成对渲染数据硬件处理。对应应用层,GPU相关的配置,渲染管理等都是通过Mesa3D对panfrost ioctl来实现的。

在drivers/gpu/drm/panfrost/panfrost_drv.c源码中dt_match可以确定panfrost是支持mail-t628 gpu的,那么下一步主要是defconfig中打开panfrost驱动配置,以及dts相关的配置。

static const struct of_device_id dt_match[] = {/* Set first to probe before the generic compatibles */{ .compatible = "amlogic,meson-gxm-mali",.data = &amlogic_data, },{ .compatible = "amlogic,meson-g12a-mali",.data = &amlogic_data, },{ .compatible = "arm,mali-t604", .data = &default_data, },{ .compatible = "arm,mali-t624", .data = &default_data, },{ .compatible = "arm,mali-t628", .data = &default_data, },{ .compatible = "arm,mali-t720", .data = &default_data, },{ .compatible = "arm,mali-t760", .data = &default_data, },{ .compatible = "arm,mali-t820", .data = &default_data, },{ .compatible = "arm,mali-t830", .data = &default_data, },{ .compatible = "arm,mali-t860", .data = &default_data, },{ .compatible = "arm,mali-t880", .data = &default_data, },{ .compatible = "arm,mali-bifrost", .data = &default_data, },{}
};
MODULE_DEVICE_TABLE(of, dt_match);

2.1 使能panfrost驱动

在对应的defconfig中配置如下即可

CONFIG_DRM_PANFROST=y

2.2 panfrost dts配置

在kernel源码中搜索"arm,mali-t628",可以看到arch/arm/boot/dts/exynos5420.dtsi中有实现,刚好可以作为参考。

arch/arm/boot/dts/exynos5420.dtsi 参考如下。主要是配置中断,寄存器基地址,供电,clk和opp-table。

                gpu: gpu@11800000 {compatible = "samsung,exynos5420-mali", "arm,mali-t628";reg = <0x11800000 0x5000>;interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "job", "mmu", "gpu";clocks = <&clock CLK_G3D>;clock-names = "core";power-domains = <&g3d_pd>;operating-points-v2 = <&gpu_opp_table>;status = "disabled";#cooling-cells = <2>;gpu_opp_table: opp-table {compatible = "operating-points-v2";opp-177000000 {opp-hz = /bits/ 64 <177000000>;opp-microvolt = <812500>;};opp-266000000 {opp-hz = /bits/ 64 <266000000>;opp-microvolt = <862500>;};opp-350000000 {opp-hz = /bits/ 64 <350000000>;opp-microvolt = <912500>;};opp-420000000 {opp-hz = /bits/ 64 <420000000>;opp-microvolt = <962500>;};opp-480000000 {opp-hz = /bits/ 64 <480000000>;opp-microvolt = <1000000>;};opp-543000000 {opp-hz = /bits/ 64 <543000000>;opp-microvolt = <1037500>;};opp-600000000 {opp-hz = /bits/ 64 <600000000>;opp-microvolt = <1150000>;};};};

结合芯片手册,实际实现如下:

                gpu: gpu@a0100000 {compatible = "arm,mali-t628";reg = <0xa0100000 0x3fff>;interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "job", "mmu", "gpu";clocks = <&gpu_mclk>, <&gpu_adb_aclkmgt>, <&xxx>;clock-names = "core", "bus", "xxx";mali-supply = <&xxx>;#cooling-cells = <2>;operating-points-v2 = <&gpu_opp_table>;gpu_opp_table: opp-table {compatible = "operating-points-v2";opp-156000000 {opp-hz = /bits/ 64 <156000000>;opp-microvolt = <xxx>;};......};};

其中mali-supply需要配置,power-domains方式供电,暂不支持,实现我们在代码中panfrost初始化过程中配置上电。panfrost加载日志如下。

img

3. buildroot下测试gpu驱动

panfrost驱动,目前还无法保证是否正常,需要使用mesa3d glmark2来做验证测试。buildroot比较方便,参考Openharmony之GPU Mesa3D移植一(weston 老框架)来编译测试panfrost驱动。

3.1 buildroot配置编译

使用buildroot-2023.02源码,编译完成后生成root.ext4文件烧录到system分区,原来kernel是加载ramdisk的,现在需要改为加载system分区。将uboot bootargs中进行修改。

删除initrd

initrd=xxx,xxx

修改原来的root=/dev/ram0 init=/init为

root=/dev/mmcblk0p20 init=/linuxrc rootfstype=ext4 rw rootwait

这样kernel启动就会直接加载system分区文件系统,方便测试。

glmark2测试命令如下

mkdir /tmp/xdg  
export XDG_RUNTIME_DIR=/tmp/xdg  
weston --tty 1 &  
glmark2-es2-wayland  

在实际运行中weston --tty 1 & 跑不起来,报错退出。

信息如下:

failed to bind extensions
failed to initialize egl

查询了各种资料,未能解决,此时就先在ohos下mesa3d编译适配(见下一节),依旧glmark2跑不起了。后来想到决定直接使用最新的buildroot源码来再来测试看看。

git clone一份最新官方最新的源码,git check 2025.02 ,切换到最新的稳定tag标签2025.02。

增加configs/mesa3d_defconfig, 内容如下:

BR2_arm=y
BR2_cortex_a7=y
BR2_ARM_FPU_NEON_VFPV4=y
BR2_ARM_EABI=y
BR2_TOOLCHAIN_BUILDROOT_MUSL=y
#BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_KERNEL_HEADERS_5_10=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_KMSRO=y
BR2_PACKAGE_MESA3D=y
BR2_PACKAGE_MESA3D_OPENGL_ES=y
BR2_PACKAGE_MESA3D_OPENGL_EGL=y
BR2_PACKAGE_GLMARK2=y
BR2_PACKAGE_WESTON=y
BR2_PACKAGE_WESTON_DEFAULT_DRM=y
BR2_PACKAGE_LIBDRM=y
BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="100M"

在调试过程,发现还需参考其他芯片增加芯片平台对应的支持。

增加package/mesa3d/0005-gallium-drm-support.patch,内容如下,其中virtsoc需要和实际芯片drm显示驱动中name相同。

rom 390a3b9e146243d706b38e76438490197edea61a Mon Sep 17 00:00:00 2001
From: songze_lee <songze_lee@163.com>
Date: Sun, 20 Apr 2025 10:10:27 +0800
Subject: [PATCH] add virtsoc support---src/gallium/targets/dri/meson.build | 1 +src/gallium/targets/dri/target.c    | 1 +2 files changed, 2 insertions(+)diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build
index 8392524..46ac77a 100644
--- a/src/gallium/targets/dri/meson.build
+++ b/src/gallium/targets/dri/meson.build
@@ -101,6 +101,7 @@ foreach d : [[with_gallium_kmsro, ['stm_dri.so','sun4i-drm_dri.so','udl_dri.so',
+               'virtsoc_dri.so',]],[with_gallium_radeonsi, 'radeonsi_dri.so'],[with_gallium_nouveau, 'nouveau_dri.so'],
diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c
index 415e494..4b82358 100644
--- a/src/gallium/targets/dri/target.c
+++ b/src/gallium/targets/dri/target.c
@@ -129,6 +129,7 @@ DEFINE_LOADER_DRM_ENTRYPOINT(sti)DEFINE_LOADER_DRM_ENTRYPOINT(stm)DEFINE_LOADER_DRM_ENTRYPOINT(sun4i_drm)DEFINE_LOADER_DRM_ENTRYPOINT(udl)
+DEFINE_LOADER_DRM_ENTRYPOINT(virtsoc)#endif#if defined(GALLIUM_LIMA)
--
2.17.1

glmark2测试命令继续进行测试,weston --tty 1 & 可以跑起来,显示屏有实际显示。但glmark2-es2-wayland 跑不起了。各种痛苦折腾查资料,偶尔看见Panfrost使能润和DAYU200(RK3568)使用的是glmark2-es2-drm程序测试的,因此使用glmark2-es2-drm实测,终于出现了令人激动人心的画面。

glmark2-es2-drm显示效果如下:

img

至此,基本验证的底层panfrost驱动是正常的。

4. ohos下mesa3d适配

本节主要参考DIEMIT大佬的视频从零开始移植OpenHarmony_第5节_GPU适配。

主要涉及三部分:

  • third_party/mesa3d编译

  • native_window_wrapper编译

  • glmark2 编译

native_window_wrapper主要作用为转接glmark2渲染到oh窗口

glmark2源码使用:git clone https://gitee.com/diemit/glmark2_2 -b OH4.0

下面主要描述GPU适配过程中实际遇到的问题。

4.1 ohos下mesa3d编译调试

4.1.2 编译

使用build_ohos.py 编译

命令如下

python ohos/build_ohos.py 参数1  参数2 参数3

参数1:ohos源码目录绝对路径

参数2:产品名称

参数3:mesa3d源码目录绝对路径

视频中适配的为树莓派4B gpu,mesa3D中具体的gallium-drivers需要根据具体芯片情况修改,我们使用的panfrost。

diff --git a/ohos/build_ohos.py b/ohos/build_ohos.py
index 8f2485922ed..f2312bcf806 100644
--- a/ohos/build_ohos.py
+++ b/ohos/build_ohos.py
@@ -34,7 +34,7 @@ if __name__ == '__main__':run_build_cmd = 'PKG_CONFIG_PATH=./pkgconfig 'run_build_cmd += 'meson setup '+ sys.argv[3] + ' build-ohos 'run_build_cmd += '-Dplatforms=ohos -Degl-native-platform=ohos -Ddri-drivers= -Dgallium-drivers=panfrost \
-                      -Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools=panfrost -Ddri-search-path=/system/lib '
+                      -Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dgles1=enabled -Dgles2=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools= -Ddri-search-path=/vendor/lib/chipsetsdk '

4.1.3 glmark2测试

ohos下测试glmark2命令为

glmark2-es2-ohos --data-path /lib/glmark2/data

实测中出现eglInitialize 初始化失败,返回0x3001,如下所示。

img

参考博客OpenHarmony富设备移植指南(6.2)GPU测试程序编译尝试移植native_window_ohos, 使用gpu简单绘制三角形程序,测试看看情况,发现还是不行。

此问题也困扰了很久,只能正面加打印分析源码,分析到dri2_dpy->image_driver->createNewScreen2后出现失败,源码复杂,createNewScreen2不清楚具体调用到哪里,各种查资料中,文章Android环境下Mesa初始化流程重学习之eglInitialize,梳理了eglInitialize,经过实际分析后,得到结论,createNewScreen2 最终会调用panfrost_create_screen函数,在此函数加打印分析,panfrost: Unsupported model 0x620, 源码中debug_printf(“panfrost: Unsupported model %X”, dev->gpu_id); debug没有放开,导致关键出错信息没有显示。大致分析出gpu_id不支持。分析源码最终发现src/panfrost/lib/pan_props.c中panfrost_model_list没有T620。

/* Table of supported Mali GPUs */
const struct panfrost_model panfrost_model_list[] = {MODEL(0x720, "T720", "T72x", NO_ANISO, 8192, { .no_hierarchical_tiling = true }),MODEL(0x750, "T760", "T76x", NO_ANISO, 8192, {}),MODEL(0x820, "T820", "T82x", NO_ANISO, 8192, { .no_hierarchical_tiling = true }),MODEL(0x830, "T830", "T83x", NO_ANISO, 8192, { .no_hierarchical_tiling = true }),MODEL(0x860, "T860", "T86x", NO_ANISO, 8192, {}),MODEL(0x880, "T880", "T88x", NO_ANISO, 8192, {}),MODEL(0x6000, "G71", "TMIx", NO_ANISO, 8192, {}),MODEL(0x6221, "G72", "THEx", 0x0030 /* r0p3 */, 16384, {}),MODEL(0x7090, "G51", "TSIx", 0x1010 /* r1p1 */, 16384, {}),MODEL(0x7093, "G31", "TDVx", HAS_ANISO, 16384, {}),MODEL(0x7211, "G76", "TNOx", HAS_ANISO, 16384, {}),MODEL(0x7212, "G52", "TGOx", HAS_ANISO, 16384, {}),MODEL(0x7402, "G52 r1", "TGOx", HAS_ANISO, 16384, {}),MODEL(0x9093, "G57", "TNAx", HAS_ANISO, 16384, {}),
};

并且在docs/drivers/panfrost.rst中提示Other Midgard and Bifrost chips (T604, T628, G71) are not yet supported,此版本暂不支持T620 GPU。

ohos下third_party/mesa3d源码和buildroot-2025.02中mesa3d源码进行对比,ohos下mesa3d版本为mesa-22.2.4,buildroot-2025.02中版本为mesa-24.0.9,版本差异较大,以及查看src/panfrost/lib/pan_props.c中panfrost_model_list和docs/drivers/panfrost.rst发现已经支持T620 GPU。

此时git clone了一份mesa3d官方源码查看src/panfrost/lib/pan_props.c修改记录,如下

img

另外查看这笔提交只修改了panfrost_model_list,没有其他文件修改,另外再git reset --hard到这一笔提交,查看mesa3d版本为22.3.0-devel,和hos下mesa3d版本为mesa-22.2.4比较接近。因此尝试在ohos源码下仅修改src/panfrost/lib/pan_props.c panfrost_model_list测试。

修改如下:

diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c
old mode 100644
new mode 100755
index c013ee4edb1..5de9a288bf1
--- a/src/panfrost/lib/pan_props.c
+++ b/src/panfrost/lib/pan_props.c
@@ -54,6 +54,7 @@/* Table of supported Mali GPUs */const struct panfrost_model panfrost_model_list[] = {
+        MODEL(0x620, "T620", "T62x", NO_ANISO, 8192, {}),MODEL(0x720, "T720", "T72x", NO_ANISO, 8192, { .no_hierarchical_tiling = true }),MODEL(0x750, "T760", "T76x", NO_ANISO, 8192, {}),MODEL(0x820, "T820", "T82x", NO_ANISO, 8192, { .no_hierarchical_tiling = true }),

实测比较幸运,native_window_ohos绘制三角形程序和glmark2-es2-ohos正常了。

native_window_ohos绘制三角形程序效果如下:

img

glmark2-es2-ohos显示效果和buildroot下glmark2-es2-drm一样。

4.2 ohos使能gpu

4.2.1 使能gpu

参考视频中主要做以下修改。

vendor中对应config.json中graphic_2d参数使能gpu,如下所示

            "graphic_2d_feature_ace_enable_gpu = true","graphic_2d_feature_rs_enable_eglimage = true"

third_mesa3d 修改如下:


diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
old mode 100644
new mode 100755
index c1a1d8540af..831d0b258ee
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c@@ -1764,7 +1794,7 @@ _eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target,RETURN_EGL_EVAL(disp, ret);}-static EGLImage EGLAPIENTRY
+EGLAPI EGLImage EGLAPIENTRYeglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,EGLClientBuffer buffer, const EGLint *attr_list){
@@ -1820,7 +1850,7 @@ eglDestroyImage(EGLDisplay dpy, EGLImage image)return _eglDestroyImageCommon(disp, img);}-static EGLBoolean EGLAPIENTRY
+EGLAPI EGLBoolean EGLAPIENTRYeglDestroyImageKHR(EGLDisplay dpy, EGLImage image){_EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -1896,7 +1926,7 @@ _eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list,}-static EGLSync EGLAPIENTRY
+EGLAPI EGLSync EGLAPIENTRYeglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list){_EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -1970,7 +2000,7 @@ eglDestroySync(EGLDisplay dpy, EGLSync sync)return _eglDestroySync(disp, s);}-static EGLBoolean EGLAPIENTRY
+EGLAPI EGLBoolean EGLAPIENTRYeglDestroySyncKHR(EGLDisplay dpy, EGLSync sync){_EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -2024,7 +2054,7 @@ eglClientWaitSync(EGLDisplay dpy, EGLSync sync,return _eglClientWaitSyncCommon(disp, dpy, s, flags, timeout);}-static EGLint EGLAPIENTRY
+EGLAPI EGLint EGLAPIENTRYeglClientWaitSyncKHR(EGLDisplay dpy, EGLSync sync,EGLint flags, EGLTime timeout){
@@ -2059,7 +2089,7 @@ _eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags)RETURN_EGL_EVAL(disp, ret);}-static EGLint EGLAPIENTRY
+EGLAPI EGLint EGLAPIENTRYeglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags){_EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -2129,7 +2159,7 @@ eglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *valu}-static EGLBoolean EGLAPIENTRY
+EGLAPI EGLBoolean EGLAPIENTRYeglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value){_EGLDisplay *disp = _eglLockDisplay(dpy);
@@ -2156,7 +2186,7 @@ eglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *valureturn result;}-static EGLint EGLAPIENTRY
+EGLAPI EGLint EGLAPIENTRYeglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSync sync){_EGLDisplay *disp = _eglLockDisplay(dpy);

foundation/graphic/graphic_2d修改如下:

diff --git a/frameworks/surfaceimage/src/surface_image.cpp b/frameworks/surfaceimage/src/surface_image.cpp
index a4839f88b5..485f746d7d 100644
--- a/frameworks/surfaceimage/src/surface_image.cpp
+++ b/frameworks/surfaceimage/src/surface_image.cpp
@@ -160,9 +160,9 @@ SurfaceError SurfaceImage::UpdateSurfaceImage()uint32_t seqNum = buffer->GetSeqNum();BLOGI("seqNum %{public}d", seqNum);
-    EGLImageKHR img = imageCacheSeqs_[seqNum].eglImage_;
+    //EGLImageKHR img = imageCacheSeqs_[seqNum].eglImage_;glBindTexture(textureTarget_, textureId_);
-    glEGLImageTargetTexture2DOES(textureTarget_, static_cast<GLeglImageOES>(img));
+    //glEGLImageTargetTexture2DOES(textureTarget_, static_cast<GLeglImageOES>(img));while (glGetError() != GL_NO_ERROR) {BLOGE("glEGLImageTargetTexture2DOES error");
diff --git a/graphic_config.gni b/graphic_config.gni
index e156025e5b..7ad24df2bc 100644
--- a/graphic_config.gni
+++ b/graphic_config.gni
@@ -13,7 +13,7 @@declare_args() {graphic_2d_feature_bootanimation_enable = true
-  graphic_2d_feature_ace_enable_gpu = false
+  graphic_2d_feature_ace_enable_gpu = truegraphic_2d_feature_color_gamut_enable = falsegraphic_2d_feature_rs_enable_eglimage = falsegraphic_2d_feature_rs_enable_uni_render = false
diff --git a/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp b/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
index 77c40da430..04f832e1f9 100644
--- a/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
+++ b/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
@@ -785,7 +785,7 @@ sk_sp<SkImage> ImageWithParmOpItem::GetSkImageFromSurfaceBuffer(SkCanvas& canvasglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));
+        //glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));}GrGLTextureInfo textureInfo = { GL_TEXTURE_2D, texId_, GL_RGBA8_OES };
@@ -1027,7 +1027,7 @@ void SurfaceBufferOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) constglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));
+    //glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));// restoreglBindTexture(GL_TEXTURE_2D, originTexture);
(END)ret = eglChooseConfig(eglDisplay_, config_attribs, &config_, 1, &count);if (!(ret && static_cast<unsigned int>(count) >= 1)) {
diff --git a/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp b/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
index 77c40da430..04f832e1f9 100644
--- a/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
+++ b/rosen/modules/render_service_base/src/pipeline/rs_draw_cmd.cpp
@@ -785,7 +785,7 @@ sk_sp<SkImage> ImageWithParmOpItem::GetSkImageFromSurfaceBuffer(SkCanvas& canvasglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));
+        //glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));}GrGLTextureInfo textureInfo = { GL_TEXTURE_2D, texId_, GL_RGBA8_OES };
@@ -1027,7 +1027,7 @@ void SurfaceBufferOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) constglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));
+    //glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, static_cast<GLeglImageOES>(eglImage_));// restoreglBindTexture(GL_TEXTURE_2D, originTexture);
~

4.2.2 使能gpu后开机启动黑屏问题解决

上述修改使能gpu后开机启动出现黑屏,rendor_serivce 会异常退出,通过命令敲hilog查看日志,敲命令感觉滞后看不到有效信息,非常需要将开机过程中的日志存储到文件系统导出来分析。参考hilog落盘修改后,日志能够正常存储。

分析日志有报错:Failed to eglChooseConfig

img

查看芯片手册后,分析gpu不支持EGL_OPENGL_ES3_BIT,改为EGL_OPENGL_ES2_BIT后eglChooseConfig执行正常。
InitializeEglContext初始正常。

img

2DGraphics: InitializeEglContext: Create EGL context successfully, version 1.4

但后续流程出现报错:2DGraphics: SetUpGrContext: SetUpGrContext failed to make native interface

img

img

分析源码,SetUpGrContext glInterface函数会调用到third_party/skia源码中,在 skia中分析GrGLMakeAssembledInterface函数const char* verStr = reinterpret_cast<const char*>(GetString(GR_GL_VERSION)); 返回为null, 分析mesa3d _mesa_GetString( GLenum name )函数,参考https://laval.csdn.net/user/discuss/668bd1d35c462a3f4fd478bf 解决方式

+++ b/meson.build
@@ -505,7 +505,7 @@ foreach platform : _platformspre_args += '-DHAVE_@0@_PLATFORM'.format(platform.to_upper())endforeach-if with_platform_android and get_option('platform-sdk-version') >= 29
+if with_platform_ohos or with_platform_android and get_option('platform-sdk-version') >= 29

其本质是增加了

c_args += ‘-fno-emulated-tls’
cpp_args += ‘-fno-emulated-tls’

此问题已解决,开机能够进入桌面。

后续遇到使能gpu后内存不足问题,具体解决见zram内存压缩 mkswap报错。

至此,mesa3d适配完成,过程困难重重,希望后续他人能够避免踩坑。

相关文章:

openharmony系统移植之gpu mesa3d适配

openharmony系统移植之gpu mesa3d适配 文章目录 openharmony系统移植之gpu mesa3d适配1. 环境说明2. gpu内核panfrost驱动2.1 使能panfrost驱动2.2 panfrost dts配置 3. buildroot下测试gpu驱动3.1 buildroot配置编译 4. ohos下mesa3d适配4.1 ohos下mesa3d编译调试4.1.2 编译4.…...

Java开发经验——阿里巴巴编码规范经验总结2

摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制&#xff0c;因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…...

Linux中常见开发工具简单介绍

目录 apt/yum 介绍 常用命令 install remove list vim 介绍 常用模式 命令模式 插入模式 批量操作 底行模式 模式替换图 vim的配置文件 gcc/g 介绍 处理过程 预处理 编译 汇编 链接 库 静态库 动态库&#xff08;共享库&#xff09; make/Makefile …...

深入理解深度Q网络DQN:基于python从零实现

DQN是什么玩意儿&#xff1f; 深度Q网络&#xff08;DQN&#xff09;是深度强化学习领域里一个超厉害的算法。它把Q学习和深度神经网络巧妙地结合在了一起&#xff0c;专门用来搞定那些状态空间维度特别高、特别复杂的难题。它展示了用函数近似来学习价值函数的超能力&#xf…...

使用lldb看看Rust的HashMap

目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时&#xff0c;读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键&#xff0c;&str作为值 使用i32作为键&#xff0c;String作为值 前言 前面使用ldb看了看不同的类型&#xff0c;这篇再使用…...

Vue3简易版购物车的实现。

文章目录 一、话不多说&#xff0c;直接上代码&#xff1f; 一、话不多说&#xff0c;直接上代码&#xff1f; <template><div><input type"text" placeholder"请输入内容" v-model"keywords"><button click"addGood…...

比亚迪全栈自研生态的底层逻辑

比亚迪全栈自研生态的底层逻辑&#xff1a;汽车工程师必须理解的闭环技术革命 引言&#xff1a;当技术壁垒成为护城河 2023年比亚迪销量突破302万辆的震撼数据背后&#xff0c;隐藏着一个更值得工程师深思的事实&#xff1a;其全栈自研体系覆盖了新能源汽车83%的核心零部件。这…...

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下&#xff0c;为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持&#xff0c;无论是开发环境测试还是生产环境部署&#xff0…...

5.1.1 WPF中Command使用介绍

WPF 的命令系统是一种强大的输入处理机制,它比传统的事件处理更加灵活和可重用,特别适合 MVVM (Model, View, ViewModel)模式开发。 一、命令系统核心概念 1.命令系统基本元素: 命令(Command): 即ICommand类,使用最多的是RoutedCommand,也可以自己继承ICommand使用自定…...

设计模式简述(十九)桥梁模式

桥梁模式 描述基本组件使用 描述 桥梁模式是一种相对简单的模式&#xff0c;通常以组合替代继承的方式实现。 从设计原则来讲&#xff0c;可以说是单一职责的一种体现。 将原本在一个类中的功能&#xff0c;按更细的粒度拆分到不同的类中&#xff0c;然后各自独立发展。 基本…...

常用设计模式

一、什么是设计模式 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验总结&#xff0c;旨在解决面向对象设计中反复出现的问题&#xff0c;提升代码的可重用性、可理解性和可靠性。以下从多个维度详细讲解&#xff…...

20242817-李臻-课下作业:Qt和Sqlite

实验内容 阅读附件内容&#xff0c;编译运行附件中第一章&#xff0c;第三章的例子。 实验过程 第一章 t1实践 #include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout>int main(int argc, char *argv[]) {QA…...

嵌入式机器学习平台Edge Impulse图像分类 – 快速入门

陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能&#xff1a; Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…...

JavaWeb, Spring, Spring Boot

出现时间 JavaWeb - Spring - Spring Boot 一、JavaWeb 的发展历程 Servlet 和 JSP&#xff1a; Servlet&#xff1a;1997 年首次发布&#xff0c;用于处理 HTTP 请求和响应。 JSP&#xff1a;1999 年首次发布&#xff0c;用于动态生成 HTML 页面。 特点&#xff1a;提供了基…...

upload-labs靶场通关详解:第五关

一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".ph…...

【问题】Watt加速github访问速度:好用[特殊字符]

前言 GitHub 是全球知名的代码托管平台&#xff0c;主要用于软件开发&#xff0c;提供 Git 仓库托管、协作工具等功能&#xff0c;经常要用到&#xff0c;但是国内用户常因网络问题难以稳定访问 。 Watt Toolkit&#xff08;原名 Steam&#xff09;是由江苏蒸汽凡星科技有限公…...

GitHub打开缓慢甚至失败的解决办法

在C:\Windows\System32\drivers\etc的hosts中增加如下内容&#xff1a; 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…...

【25软考网工】第六章(3)数字签名和数字证书

博客主页&#xff1a;christine-rr-CSDN博客 ​专栏主页&#xff1a;软考中级网络工程师笔记 ​​ 大家好&#xff0c;我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了&#xff0c;每篇笔记都包含详细的知识点&#xff0c;希望能帮助到你&#xff01…...

Android Native 函数 Hook 技术介绍

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段&#xff0c;常见实现包括 PLT Hook、Inline Hook。 PLT Hook 和…...

代码随想录算法训练营第60期第三十二天打卡

大家好&#xff0c;今天是我们贪心算法章节的第三阶段&#xff0c;前面我们讲过的几道题不知道大家理解的情况如何&#xff0c;还是那句话&#xff0c;贪心算法没有固定的套路与模板&#xff0c;一道题一个思路&#xff0c;我们要多思考这样慢慢地我就就可以水到渠成。今天我们…...

Problem C: 异常1

1.题目描述 检测年龄&#xff0c;其中若为负数或大于等于200岁皆为异常&#xff0c;请将下列代码补充完整。 // 你的代码将被嵌入这里 class Main{ public static void main(String[] args){ Person p1new Person("John",80); Person p2new Pers…...

Ollama部署使用以及模型微调和本地部署

ollama是一款开源的本地大语言模型管理工具&#xff0c;专注于简化大语言模型&#xff08;LLM&#xff09;的本地部署和使用。以下是关于 Ollama 应用的详细介绍&#xff1a; Ollama 的主要功能 本地化部署&#xff1a; Ollama 支持在本地运行模型&#xff0c;无需依赖外部云…...

汇编学习——iOS开发对arm64汇编的初步了解

汇编学习——iOS开发对arm64汇编的初步了解 文章目录 汇编学习——iOS开发对arm64汇编的初步了解前言栈 指令 寄存器寄存器指令运算指令寻址指令前变基 与 后变基 栈堆&#xff08;Heap&#xff09;内存机制三、栈&#xff08;Stack&#xff09;内存机制 3. 多级调用示例 例子A…...

前端代理问题

在前后端联调的时候&#xff0c;有一次因为前端项目代理配置有问题&#xff0c;导致请求接口对不上&#xff0c; transpileDependencies: true,devServer: {hot: true,port: 8081,proxy: {/api: {target: http://localhost:8080,changeOrigin: true,ws: true,pathRewrite: {^/a…...

E+H流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯

EH流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯 在现代工业自动化的广阔舞台上&#xff0c;Profibus DP与Modbus TCP这两种通信协议各领风骚&#xff0c;它们在不同的应用场景中发挥着举足轻重的作用。但工业生产的复杂性往往要求不同设备、系统之间能够顺畅沟…...

TCP/IP 模型每层的封装格式

TCP/IP 模型是一个四层网络架构&#xff0c;每一层在数据传输时都会对数据进行封装&#xff0c;添加相应的头部&#xff08;和尾部&#xff09;信息。以下是各层的封装格式及关键字段说明&#xff1a; 1. 应用层&#xff08;Application Layer&#xff09; 封装格式&#xff1a…...

openjdk底层汇编指令调用(一)——汇编指令及指令编码基础

汇编指令 计算机在执行过程时只识别代表0或者1的电信号。因此为了让计算机能够执行则须向计算机输入一系列01构成的指令。 例如在x64平台下&#xff0c;0x53&#xff0c;二进制为01010011&#xff0c;表示将rbx寄存器中的值压栈。 但是&#xff0c;对于程序员而言&#xff0c;…...

5G-A来了!5G信号多个A带来哪些改变?

5G-A来了&#xff01;5G信号多个A带来哪些改变&#xff1f; 随着科技不断进步&#xff0c;通信网络的迭代升级也在加速。自4G、5G的推出以来&#xff0c;我们见证了通信技术的飞跃式发展。最近&#xff0c;越来越多的用户发现自己手机屏幕右上角的5G标识已经变成了“5G-A”。那…...

探索虚拟化:云计算时代的资源优化之道

前言 如果您想知道云提供商如何在全球范围内运行无数应用程序&#xff0c;而每个应用程序都没有机架服务器&#xff0c;那么答案就在于虚拟化。 它是为云提供支持的核心技术之一&#xff0c;在幕后悄悄工作&#xff0c;使现代计算高效、可扩展且具有成本效益。 在本文中&#x…...

用户登录构件示例

目录 一、登录构件概述 二、构件内部结构 1. 构件组成元素(表格形式) 2. 组件连接件设计...

【软件测试】基于项目驱动的功能测试报告

目录 一、项目的介绍 1.1 项目背景 二、测试目标 2.1 用户服务模块 2.1.1 用户注册模块 2.1.1.1 测试点 2.1.1.2 边界值分析法(等价类+边界值) 2.1.1.2.1 有效等价类 2.1.1.2.2 无效等价类 2.1.1.2.3 边界值 2.1.1.2.4 测试用例设计 2.2 文章标签模块 2.3 文章模…...

【QT】UDP通讯本地调试

qt已经写好了udp通讯代码&#xff0c;现在要进行测试。 1、终端输入ipconfig查看本机网卡的ipv4地址 2、 用udpBind函数&#xff0c;绑定到此ip和自定义的端口号。 3、 打开网络调试助手&#xff0c;自动检测到本机的ip地址&#xff0c;输入任意一个和程序里不一样的端口号。 …...

web animation API 锋利的css动画控制器 (更新中)

什么是web animation api 以及为什么要使用web animation api&#xff1f; web animation API 是web页面中控制DOM元素动画效果的javascript原生API。 它能够逐个关键帧控制动画效果&#xff0c;具有Timeline 机制‌能通过javascript来实现动画的暂停&#xff0c;播放&#x…...

Nginx的增强与可视化!OpenResty Manager - 现代化UI+高性能反向代理+安全防护

以下是对OpenResty Manager的简要介绍&#xff1a; OpenResty Manager &#xff08;Nginx 增强版&#xff09;&#xff0c;是一款容易使用、功能强大且美观的反向代理工具 &#xff0c;可以作为OpenResty Edge 的开源替代品基于 OpenResty 开发&#xff0c;支持并继承 OpenRes…...

Spring Boot 中的重试机制

Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的&#xff0c;用于自动重试可能会失败的方法。在微服务架构和分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...

[Java实战]Spring Boot 整合 Freemarker (十一)

[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎&#xff0c;凭借其简洁语法、卓越性能和灵活扩展性&#xff0c;在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力&#xff0c;开发者能快速构建动态页面、…...

现有预测式外呼系统如何接入AI系统,使用AI辅助,判断出意向客户再转人工

很多用户还在使用老旧的预测式外呼系统&#xff0c;只能外呼接通后播放一个提示音&#xff0c;播放完提示音后在转给人工坐席&#xff0c; 如果重新部署一套AI外呼系统&#xff0c;涉及到业务系统的迁移&#xff0c;非常不方便。 现在我就做一个如何让现有外呼系统&#xff0c…...

实战项目3(04)

​​​​​​目录 ​​​​​​任务场景一 【r1配置】 【sw1配置】 任务场景二 【r1配置】 【sw1配置】 【sw2配置】 任务场景一 某公司网络为了减少广播包对网络的影响&#xff0c;网络管理员对网络进行了VLAN划分&#xff0c;完成VLAN划分后&#xff0c;为了不影响VL…...

[Java实战]Spring Boot 静态资源配置(十三)

[Java实战]Spring Boot 静态资源配置&#xff08;十三&#xff09; 引言 静态资源&#xff08;如 HTML、CSS、JavaScript、图片等&#xff09;是 Web 应用的基石。Spring Boot 通过自动化配置简化了静态资源管理&#xff0c;但面对复杂场景&#xff08;如多模块项目、CDN 集成…...

ESP-ADF wifi_service子模块wifi_ssid_manager凭证管理函数详解

目录 ESP-ADF wifi_service子模块wifi_ssid_manager凭证管理函数详解WiFi凭证管理函数分析wifi_ssid_manager_savewifi_ssid_manager_erase_all 内部实现机制存储策略分析内部数据流向关键辅助函数分析重要的内部辅助函数详解get_stored_id_by_ssidnvs_get_write_idnvs_set_cou…...

数据分析预备篇---NumPy数组

NumPy是数据分析时常用的库,全称为Numerical Python,是很多数据或科学相关Python包的基础,包括pandas,scipy等等,常常被用于科学及工程领域。NumPy最核心的数据结构是ND array,意思是N维数组。 #以下是一个普通列表的操作示例:arr = [5,17,3,26,31]#打印第一个元素 prin…...

解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)

一.开始的设置 1.在VirtualBox中打开设置&#xff0c;常规中修改主机与虚拟机交互设置 2.虚拟机关闭状态下&#xff0c;存储中选中控制器SATA&#xff0c;勾选‘使用主机输入输出’ 3.选中操作系统对应的虚拟文件&#xff0c;.vdi文件&#xff0c;勾选右边的固态驱动器。 4.启…...

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

引言 单细胞RNA测序&#xff08;scRNA-seq&#xff09;技术的出现彻底改变了我们研究复杂生物系统的方式&#xff0c;使科学家能够在前所未有的精细水平上解析细胞异质性。传统的bulk RNA测序只能捕获细胞群体的平均表达特征&#xff0c;而单细胞转录组测序允许我们检测每个细…...

嵌入式硬件篇---UART

文章目录 前言1. UART协议基础1.1 物理层特性两根信号线无时钟信号电平标准TTL UARTRS-232 1.2 数据帧格式1.3 波特率计算波特率 2. STM32F103RCT6的UART配置2.1 硬件连接2.2 CubeMX配置启用USART1引脚分配中断启用&#xff08;可选&#xff09; 3. HAL库代码实现3.1 UART初始化…...

C# 通过ConfigurationManager读写配置文件App.Config

目录 简述代码描述一、构建App.config二、调用代码1、代码步骤说明2、输出结果说明 简述 App.config 是 C#中最常用的配置文件类型。 通常位于项目的根目录中&#xff0c;以 XML 格式存储配置信息。App.config 文件可以包含多个配置节&#xff0c;如 appSettings、connectionS…...

Python3安装HTMLTestRunner

1.下载HTMLTestRunner地址&#xff1a;http://tungwaiyip.info/software/HTMLTestRunner.html 2.下载的HTMLTestRunner.py是针对python2写的&#xff0c;所以需要改成python3适合的内容&#xff1a; 问题1&#xff1a;No module named StringIO&#xff0c; 原因&#xff1a;py…...

图形化编程革命:iVX携手AI 原生开发范式

一、技术核心&#xff1a;图形化编程的底层架构解析 1. 图形化开发的效率优势&#xff1a;代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例&#xff0c;Python 实现需定义函数、处理缩进并编写 …...

GC垃圾回收

Gc是语言提供的自动的内存管理机制&#xff0c;自动释放不需要的内存对象&#xff0c;让出存储器资源。 Go语言变革&#xff1a; V1.5的三色并发标记法 V1.5的三色并发标记为什么需要STW V1.5的三色标记为什么需要屏障机制(“强-弱”&#xff0c;三色不变式、插入屏障、删除屏障…...

“多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计

“多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计 文章目录 “多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计第一章 引言:空战数据链体系的范式革新1.1 空战数据链的演进逻辑1.2 新架构的核心理论价值1…...

Unity3D仿星露谷物语开发42之粒子系统

1、目标 使用例子系统&#xff0c;实现割草后草掉落的特效。 通过PoolManager获取特效预制体&#xff0c;通过VFXManager来触发特效。 2、配置例子特效 在Hierarchy -> PersistentScene下创建新物体命名为Reaping。 给该物体添加Particle System组件。 配置例子系统参数…...