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加载日志如下。
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显示效果如下:
至此,基本验证的底层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,如下所示。
参考博客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修改记录,如下
另外查看这笔提交只修改了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绘制三角形程序效果如下:
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
查看芯片手册后,分析gpu不支持EGL_OPENGL_ES3_BIT,改为EGL_OPENGL_ES2_BIT后eglChooseConfig执行正常。
InitializeEglContext初始正常。
2DGraphics: InitializeEglContext: Create EGL context successfully, version 1.4
但后续流程出现报错:2DGraphics: SetUpGrContext: SetUpGrContext failed to make native interface
分析源码,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.…...

Linux58 ssh服务配置 jumpserver 测试双网卡 为何不能ping通ip地址
判断为NAT模式网卡 能ping 通外网 ens34为仅主机模式网卡 [rootlocalhost network-scripts]# ip route show default default via 10.1.1.254 dev ens33 proto static metric 100 10.0.0.0/8 dev ens33 proto kernel scope link src 10.1.1.37 metric 100 11.0.0.0/8 dev…...
LangChain:大语言模型应用的“瑞士军刀”入门指南
LanChain入门指南 什么是LangChain?LangChain的核心价值1. 模块化设计 - AI界的"乐高积木"2. 典型应用场景 快速入门实战环境准备第一个示例:公司命名生成器进阶功能:带记忆的对话机器人 学习路线建议常见问题解答总结 什么是LangC…...
网站网页经常 400 错误,清缓存后就好了的原因剖析
目录 一、HTTP 400 错误的常见起因(一)URL 有问题(二)缓存或 Cookie 出状况(三)文件尺寸超标(四)请求头信息不对劲二、清缓存为何能奏效三、其他可以尝试的解决办法(一)重新检查 URL(二)暂时关闭浏览器插件(三)切换网络环境(四)更新浏览器版本(五)检查服务器…...
Redis BigKey 问题是什么
BigKey 问题是什么 BigKey 的具体表现是 redis 中的 key 对应的 value 很大,占用的 redis 空间比较大,本质上是大 value 问题。 BigKey怎么找 redis-cli --bigkeysscanBig Key 产生的原因 1.redis数据结构使用不恰当 2.未及时清理垃圾数据 3.对业务预…...

web 自动化之 selenium+webdriver 环境搭建及原理讲解
文章目录 一、web 自动化测试学习说明二、什么 web 自动化测试三、selenium 简介四、web自动化测试环境搭建五、web 自动化测试第一个脚本六、selenium 原理及源码讲解 一、web 自动化测试学习说明 进阶 web 自动化测试学习:掌握 python 编程基础 二、什么 web 自…...

2025ISCC练武校级赛部分题解WP
Web 战胜卞相壹 <!-- 路过的酒罐王柯洁九段说: --> <!-- 会叠棋子有什么用!你得在棋盘内战胜他!我教你个定式,要一直记得!一直! --> <!-- SGF B[ae];B[ce];B[df];B[cg];B[ag];B[ai];B[ci];…...

PyTorch 版本、torchvision 版本和 Python 版本的对应关系
PyTorch 版本、torchvision 版本和 Python 版本的对应关系 在深度学习领域,PyTorch 及其配套库 torchvision 的使用极为广泛。但不同版本的 PyTorch、torchvision 与 Python 之间存在严格的对应关系,若版本搭配不当,会导致代码运行出错…...
uniapp-商城-49-后台 分类数据的生成(方法加精)
前面47和48章节对代码进行了分析和解读。但是还是又很多地方需要加精。如方法中的注释,执行中的提示,特别是添加和修改中,相关值的初始化,另外还有页面的刷新,并且在页面刷新时的异步操作 同步化实现。 但这里唯一不好…...
nginx 配置后端健康检查模块
nginx自带的针对后端节点健康检查的功能比较简单,通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的参数来完成,当后端节点出现故障时,自动切换到健康节点来提供访问。但是nginx不能事先知道后端节点状态是否健康,后端即使有不健康节点,负载均…...

RS485和RS232 通信配置
RS232 目前硬件上支持RS232的有以下板卡: LubanCat-5IO底板(含有RS232x2) 7.1. 引脚定义 具体的引脚定义可以参考背面的丝印 LubanCat-5IO底板 引脚定义图 7.2. 跳帽配置 LubanCat-5IO底板 鲁班买5IO底板上的RS485和RS232是共用同一组…...

zst-2001 历年真题 设计模式
设计模式 - 第1题 a 设计模式 - 第2题 一个产品可以产生多个就是抽象,一个就是工厂 比如这样 第二题a是意图 bc: d 设计模式 - 第3题 b 设计模式 - 第4题 类图里全是builder,疯狂暗示 设计模式 - 第5题 aa 设计模式 - 第6题 只有工厂方法是创…...
微软系统 红帽系统 网络故障排查:ping、traceroute、netstat
在微软(Windows)和红帽(Red Hat Enterprise Linux,RHEL)等系统中,网络故障排查是确保系统正常运行的重要环节。 ping、traceroute(在Windows中为tracert)和netstat是三个常用的网络…...
11.多用组合和少继承
11.多用组合和少继承 目录介绍 01.前言思考的介绍 1.1 组合优于继承思考1.2 实际中的案例1.3 思考继承的争议 02.绘图应用程序案例 2.1 案例的背景2.2 用继承实现多形状2.3 用组合实现多形状 03.不同鸟类程序案例 3.1 案例的背景3.2 用继承实现多鸟类3.3 继承的问题暴露3.4 用…...
【AWS+Wordpress】将本地 WordPress 网站部署到AWS
前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地开发机:macOS(Sequoia 15.0.1) 服务器:AWS EC2(Amazon Linux 2023) 目标:从本地迁移 WordPress 到云…...

鸿蒙NEXT开发动画案例4
1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: /*** TODO SpinKit动画组件 - 双粒子旋转缩放动画* author: CSDN-鸿蒙布道师* since: 2025/05/08*/ ComponentV2 export struct SpinFour {// 参数定义Require Param spinSize: number 36…...
Java(day136):Arrays.asList() 方法:如何在 Java 中高效地将数组转化为列表!
前言 在 Java 编程中,数组和集合是两种常用的数据结构。数组是固定大小的容器,而集合则是动态扩展的容器。随着 Java 集合框架的引入,开发者通常更倾向于使用集合类来存储和操作数据,因为集合类提供了更多的功能和灵活性。 然而&a…...

XML语言
XML语言 在开始介绍Mybatis之前,先介绍一下XML语言,XML语言发明最初是用于数据的存储和传输,它是由一个一个的标签嵌套而成 <?xml version"1.0" encoding"UTF-8" ?> <outer> <name>阿伟</name&…...

基于SpringBoot的小区停车位管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

VR博物馆,足不出户云逛展
VR博物馆概念与特点 定义与由来 VR博物馆,即虚拟现实(Virtual Reality)博物馆,是利用计算机技术、互联网和虚拟现实技术,将实体博物馆及其藏品数字化,实现在虚拟空间中的展示和体验的新型博物馆形式。概念起源于20世纪90年代末&…...

uniapp|实现多终端聊天对话组件、表情选择、消息发送
基于UniApp框架,实现跨平台多终端适配的聊天对话组件开发、表情选择交互设计及消息发送,支持文本与表情混合渲染。 目录 聊天界面静态组件实现消息列表布局消息气泡双向布局辅助元素定位与样式静态数据模拟与扩展性设计表情选择器静态模块浮层实现符号网格排列多端样式适配方…...

73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》
这份文档是一份关于 DeepSeek 自学手册的详细指南,涵盖了 DeepSeek V3 和 R1 模型的架构、训练方法、性能表现以及使用技巧等内容。它介绍了 DeepSeek V3 作为强大的 MoE 语言模型在数学、代码等任务上的出色表现以及其训练过程中的创新架构如多头潜在注意力和多 To…...

stm32 WDG看门狗
目录 stm32 WDG看门狗一、WDG基础知识1)WDG(Watchdog)看门狗简介 二、IWDG独立看门狗1)IWDG键寄存器2)IWDG超时时间 三、WWDG窗口看门狗1)WWDG框图2)WWDG工作特性3)WWDG超时时间4&am…...

BUUCTF——Cookie is so stable
BUUCTF——Cookie is so stable 进入靶场 页面有点熟悉 跟之前做过的靶场有点像 先简单看一看靶场信息 有几个功能点 flag.php 随便输了个admin 根据题目提示 应该与cookie有关 抓包看看 构造payload Cookie: PHPSESSIDef0623af2c1a6d2012d57f3529427d52; user{{7*7}}有…...

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)
这里我们来实现这个RPC的client端 为了实现RPC的效果,我们调用的Hello方法,即server端的方法,应该是由代理来调用,让proxy里面封装网络请求,消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中…...

一文读懂 AI
2022年11月30日,OpenAI发布了ChatGPT,2023年3月15日,GPT-4引发全球轰动,让世界上很多人认识了ai这个词。如今已过去快两年半,AI产品层出不穷,如GPT-4、DeepSeek、Cursor、自动驾驶等,但很多人仍…...
第三天 车联网云架构
一、车联网技术演进与行业变革 1.1 从传统Telematics到智能网联汽车 当我们驾驶着搭载智能网联系统的汽车时,车辆每秒会产生超过1GB的数据流量。这些数据包括: 高精度地图的实时更新ADAS传感器采集的环境信息车载娱乐系统交互数据车辆状态监控信息传统基于2G/3G的Telematic…...

【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2&a…...
Unity垃圾回收(GC)
1.GC的作用:定期释放不再使用的内存空间。 注:C不支持GC,需要手动管理内存,使用new()申请内存空间,使用完后通过delete()释放掉,但可能出现忘记释放或者指针…...

SpringBoot3集成Oauth2——1(/oauth2/token方法的升级踩坑)
备注:本文适用于你在SpringBoot2.7以前集成过oauth2,并且项目已经正式投入使用的情况,否则,我建议你直接学习或者找资料学习最新的oauth2集成,就不要纠结于老版本的oauth2。 原因:Spring Security 5.x和Sp…...