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適配完成,過程困難重重,希望后續他人能夠避免踩坑。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80626.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka生產者send方法詳解

Kafka生產者send方法詳解 1. send方法的工作原理 1.1 基本流程 #mermaid-svg-EXvKiyf8oSlenrxK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EXvKiyf8oSlenrxK .error-icon{fill:#552222;}#mermaid-svg-EXvKiyf…

【sdkman】sdk命令使用簡介

SDKMAN! 使用指南 SDKMAN! 是一個用于管理多個軟件開發工具包版本的命令行工具。 基本命令 安裝 SDK # 安裝最新穩定版 sdk install java# 安裝特定版本 sdk install scala 3.4.2# 安裝本地版本 sdk install groovy 3.0.0-SNAPSHOT /path/to/groovy-3.0.0-SNAPSHOT sdk ins…

開源字體設計工具字玩 FontPlayer

開源字體設計工具字玩 FontPlayer 內測版 v0.2.0 于 2025 年 5 月 9 日發布 基礎功能&#xff1a;用戶可以使用該工具繪制字體并導出 otf 字體文件&#xff0c;設計屬于自己的字庫。腳本功能&#xff1a;提供了腳本功能&#xff0c;用戶可以用程序的方式繪制字形組件&#xff0…

快速入門深度學習系列(3)----神經網絡

本文只針對圖進行解釋重要內容 這就是入門所需要掌握的大部分內容 對于不懂的名詞或概念 你可以及時去查 對于層數 標在上面 對于該層的第幾個元素 標在下面 輸入層算作第0層 對于第一層的w b 參數 維度如下w:4*3 b:4*1 這個叫做神經元 比如對于第一層的神經元 這里說的很…

【Python 算法零基礎 2.模擬 ⑤ 基于棧和隊列】

目錄 基于棧 Ⅰ、1441. 用棧操作構建數組 算法與思路 ① 初始化操作序列 ② 遍歷數字范圍 ③ 判斷并添加操作 ④ 提前結束循環 ⑤ 返回操作序列 基于隊列 Ⅰ、1700. 無法吃午餐的學生數量 思路與算法 ① 統計學生對三明治的需求&#xff1a; ② 遍歷三明治供應順序&#xff1a;…

管家婆實用貼-如何在Excel中清除空格

我們在使用管家婆軟件時&#xff0c;經常會用到Excel表格導入導出數據&#xff0c;在使用Excel整理數據時&#xff0c;數據中的空格可能會導致計算和分析出現問題。無論是多余的前導空格、尾部空格還是單元格中的不必要空格&#xff0c;清除它們都是確保數據準確性的關鍵。今天…

uniapp-商城-53-后臺 商家信息(更新修改和深淺copy)

1、概述 文章主要討論了在數據庫管理中如何處理用戶上傳和修改商家信息的問題&#xff0c;特別是通過深淺拷貝技術來確保數據更新的準確性和安全性。 首先&#xff0c;解釋了深拷貝和淺拷貝的區別&#xff1a;淺拷貝使得兩個變量共享相同的內存地址&#xff0c;而深拷貝則創建新…

numpy模塊綜合使用

一、numpy模塊的綜合使用方法 # 使用矩陣的好處&#xff0c;矩陣對于python中列表&#xff0c;字典等數據類型一個一個拿來計算是會方便計算很多的&#xff0c;底層使用的是c語言 # 在數據分析和數據處理的時候也經常常用 import numpy as np array np.array([[1,2,3],[2,3,4…

【github分享】開發者學習路線圖

地址&#xff1a;GitHub - kamranahmedse/developer-roadmap: Interactive roadmaps, guides and other educational content to help developers grow in their careers. 介紹&#xff1a;涵蓋了所有領域的開發者路線圖&#xff0c;前端、后端、運維、全棧、編程語言、AI等。…

《Linux命令行大全(第2版)》PDF下載

內容簡介 本書對Linux命令行進行詳細的介紹&#xff0c;全書內容包括4個部分&#xff0c;第一部分由Shell的介紹開啟命令行基礎知識的學習之旅&#xff1b;第二部分講述配置文件的編輯&#xff0c;如何通過命令行控制計算機&#xff1b;第三部分探討常見的任務與必備工具&…

[Java實戰]Spring Boot 解決跨域問題(十四)

[Java實戰]Spring Boot 解決跨域問題&#xff08;十四&#xff09; 一、CORS 問題背景 什么是跨域問題&#xff1f; 當瀏覽器通過 JavaScript 發起跨域請求&#xff08;不同協議、域名、端口&#xff09;時&#xff0c;會觸發同源策略限制&#xff0c;導致請求被攔截。 示例場…

MyBatis快速入門——實操

默認&#xff1a;電腦搭建好了Maven環境 本次入門實驗使用的idea版本&#xff1a;ideaU2022.1 目錄 一&#xff1a;前期準備工作 1. 創建一個springboot工程 2. Maven環境配置 3. 在mysql數據庫中創建一個user表 4. 編寫實體類User 二&#xff1a; 引入MyBatis的相關依賴…

IPLOOK超輕量核心網,助力5G專網和MEC邊緣快速落地

隨著5G深入千行百業&#xff0c;行業客戶對核心網的靈活性、可控性和部署效率提出了更高要求。IPLOOK面向數字化轉型需求&#xff0c;推出了超輕量級核心網解決方案&#xff0c;具備體積小、資源占用少、部署靈活、易于維護等特性&#xff0c;廣泛適用于專網、實驗室、MEC邊緣云…

【前端】【HTML】【總復習】一萬六千字詳解HTML 知識體系

?? HTML 知識體系 一、HTML 基礎入門 1. HTML 簡介與作用 HTML(HyperText Markup Language,超文本標記語言)是構建網頁的基礎語言。它的核心作用是: 定義網頁內容的結構(標題、段落、圖片、表格等)提供語義化標簽,幫助搜索引擎與輔助設備理解頁面內容配合 CSS 實現…

VC++ 獲取CPU信息的兩種方法

文章目錄 方法一&#xff1a;使用 Windows API GetSystemInfo 和 GetNativeSystemInfo (基本信息)編譯和運行代碼解釋 方法二&#xff1a;使用 __cpuid&#xff08;CPU序列號、特性等&#xff09;代碼解釋&#xff1a; 開發過程中需要使用 VC獲取電腦CPU信息&#xff0c;先總結…

Docker Compose 的歷史和發展

這張圖表展示了Docker Compose從V1到V2的演變過程&#xff0c;并解釋了不同版本的Compose文件格式及其支持情況。以下是對圖表的詳細講解&#xff1a; Compose V1 No longer supported: Compose V1已經不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …

24、TypeScript:預言家之書——React 19 類型系統

一、預言家的本質 "TypeScript是魔法世界的預言家之書&#xff0c;用靜態類型編織代碼的命運軌跡&#xff01;" 霍格沃茨符文研究院的巫師揮動魔杖&#xff0c;類型注解與泛型的星軌在空中交織成防護矩陣。 ——基于《國際魔法聯合會》第12號類型協議&#xff0c;Ty…

(2025,AR,NAR,GAN,Diffusion,模型對比,數據集,評估指標,性能對比)文本到圖像生成和編輯:綜述

【本文為我在去年完成的綜述&#xff0c;因某些原因未能及時投稿&#xff0c;但本文仍能為想要全面了解文本到圖像的生成和編輯的學習者提供可靠的參考。目前本文已投稿 ACM Computing Surveys。 完整內容可在如下鏈接獲取&#xff0c;或在 Q 群群文件獲取。 中文版為論文初稿&…

MATLAB的cvpartition函數用法

1. 函數作用 cvpartition 將數據集劃分為訓練集和測試集&#xff0c;支持多種交叉驗證方法&#xff0c;包括&#xff1a; Hold-Out驗證&#xff1a;單次劃分&#xff08;如70%訓練&#xff0c;30%測試&#xff09;K折交叉驗證&#xff1a;數據分為K個子集&#xff0c;依次用其…

Java【網絡原理】(5)深入淺出HTTPS:狀態碼與SSL/TLS加密全解析

目錄 1.前言 2.正文 2.1狀態碼 2.2HTTP與HTTPS的關系 2.3SSL協議 2.3.1對稱加密 2.3.2非對稱加密 2.3.3中間人攻擊 2.3.4校驗機制 2.3.4.1證書 2.3.4.2數字簽名 1. 數字簽名的生成過程 2. 數字簽名的驗證過程 2.4TLS協議&#xff08;握手過程&#xff09; 3.小結…