├── arch ├── mesa-vf2 │ └── PKGBUILD └── pvr-ddk-vf2 │ └── PKGBUILD └── gpu.md /arch/mesa-vf2/PKGBUILD: -------------------------------------------------------------------------------- 1 | pkgname=mesa-vf2-git 2 | pkgdesc="an open-source implementation of the OpenGL specification, git version" 3 | pkgver=21.2.1.142892.59964c2b597.d41d8cd98f00b204e9800998ecf8427e 4 | pkgrel=1 5 | arch=('riscv64') 6 | makedepends=('git' 'python-mako' 'xorgproto' 7 | 'libxml2' 'libx11' 'elfutils' 'libxrandr' 8 | 'wayland-protocols' 'meson' 'ninja' 'glslang' 'libclc' 'valgrind') 9 | depends=('pvr-ddk-vf2' 'libdrm' 'libxxf86vm' 'libxdamage' 'libxshmfence' 'libelf' 10 | 'libunwind' 'libglvnd' 'wayland' 'libclc' 'vulkan-icd-loader' 'zstd' 'expat') 11 | optdepends=('opengl-man-pages: for the OpenGL API man pages') 12 | provides=('mesa' 'vulkan-mesa-layer' 'vulkan-swrast' 'vulkan-driver' 'mesa-libgl' 'opengl-driver' 'libgl' 'libegl') 13 | conflicts=('mesa' 'opencl-mesa' 'vulkan-intel' 'vulkan-radeon' 'vulkan-mesa-layer' 'libva-mesa-driver' 'mesa-vdpau' 'vulkan-swrast' 'mesa-libgl') 14 | url="https://www.mesa3d.org" 15 | license=('custom') 16 | source=('mesa::git+https://github.com/shirok1/mesa.git#branch=jh7110-pvr-dist') 17 | md5sums=('SKIP') 18 | sha512sums=('SKIP') 19 | 20 | # NINJAFLAGS is an env var used to pass commandline options to ninja 21 | # NOTE: It's your responbility to validate the value of $NINJAFLAGS. If unsure, don't set it. 22 | 23 | # MESA_WHICH_LLVM is an environment variable that determines which llvm package tree is used to built mesa-git against. 24 | # Adding a line to ~/.bashrc that sets this value is the simplest way to ensure a specific choice. 25 | # 26 | # NOTE: Aur helpers don't handle this method well, check the sticky comments on mesa-git aur page . 27 | # 28 | # 1: llvm-minimal-git (aur) preferred value 29 | # 2: AUR llvm-git 30 | # 3: llvm-git from LordHeavy unofficial repo 31 | # 4 llvm (stable from extra) Default value 32 | # 33 | 34 | if [[ ! $MESA_WHICH_LLVM ]] ; then 35 | MESA_WHICH_LLVM=4 36 | fi 37 | 38 | case $MESA_WHICH_LLVM in 39 | 1) 40 | # aur llvm-minimal-git 41 | makedepends+=('llvm-minimal-git') 42 | depends+=('llvm-libs-minimal-git') 43 | ;; 44 | 2) 45 | # aur llvm-git 46 | # depending on aur-llvm-* to avoid mixup with LH llvm-git 47 | makedepends+=('aur-llvm-git') 48 | depends+=('aur-llvm-libs-git') 49 | optdepends+=('aur-llvm-git: opencl') 50 | ;; 51 | 3) 52 | # mesa-git/llvm-git (lordheavy unofficial repo) 53 | makedepends+=('llvm-git' 'clang-git') 54 | depends+=('llvm-libs-git') 55 | optdepends+=('clang-git: opencl' 'compiler-rt: opencl') 56 | ;; 57 | 4) 58 | # extra/llvm 59 | makedepends+=(llvm=15.0.7 clang=15.0.7) 60 | depends+=(llvm-libs=15.0.7) 61 | optdepends+=('clang: opencl' 'compiler-rt: opencl') 62 | ;; 63 | *) 64 | esac 65 | 66 | pkgver() { 67 | cd mesa 68 | local _ver 69 | read -r _ver compile_commands.json 140 | ninja $NINJAFLAGS -C _build 141 | } 142 | 143 | package() { 144 | DESTDIR="${pkgdir}" ninja $NINJAFLAGS -C _build install 145 | 146 | # remove script file from /usr/bin 147 | # https://gitlab.freedesktop.org/mesa/mesa/issues/2230 148 | rm "${pkgdir}/usr/bin/mesa-overlay-control.py" 149 | rmdir "${pkgdir}/usr/bin" 150 | 151 | # indirect rendering 152 | ln -s /usr/lib/libGLX_mesa.so.0 "${pkgdir}/usr/lib/libGLX_indirect.so.0" 153 | 154 | # install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" "${srcdir}/LICENSE" 155 | } 156 | -------------------------------------------------------------------------------- /arch/pvr-ddk-vf2/PKGBUILD: -------------------------------------------------------------------------------- 1 | pkgname=(pvr-ddk-vf2 pvr-ddk-vf2-syscl pvr-ddk-vf2-syses pvr-ddk-vf2-tools) 2 | pkgver=1.17.6210866 3 | pkgrel=1 4 | pkgdesc="PowerVR B-Series BXE-4-32 GPU driver, distributed for VisionFive 2 by Starfive" 5 | arch=('riscv64') 6 | url="https://github.com/starfive-tech/soft_3rdpart" 7 | license=('custom') 8 | source=("https://github.com/starfive-tech/soft_3rdpart/raw/JH7110_VisionFive2_devel/IMG_GPU/out/img-gpu-powervr-bin-${pkgver}.tar.gz") 9 | sha256sums=('8ef5eba77c776e0d4444d819e12c64bfa8eee0ae2cdf90b6eb7a3a9df7bd7ef2') 10 | 11 | # usage: ln_multi ... 12 | ln_multi() { 13 | for ln_target in ${@:2}; do 14 | ln -s $1 "${pkgdir}/usr/lib/${ln_target}" 15 | done 16 | } 17 | 18 | # usage: install_lib_ln ... 19 | install_lib_ln() { 20 | install -Dvm644 "$1$2" -t "${pkgdir}/usr/lib" 21 | ln_multi ${@:2} 22 | } 23 | 24 | # usage: install_headers ... 25 | install_headers() { 26 | for dir in $@; do 27 | for i in "staging/usr/include/${dir}/"*.h; do 28 | install -Dvm644 "${i}" -t "${pkgdir}/usr/include/${dir}" 29 | done 30 | done 31 | } 32 | 33 | package_pvr-ddk-vf2() { 34 | depends=('libdrm' 'vulkan-icd-loader') 35 | provides=('opencl-driver' 'opengl-driver' 'vulkan-driver') 36 | optdepends=("pvr-ddk-vf2-syscl: if you want it to take over OpenCL" 37 | "pvr-ddk-vf2-syses: if you want it to take over OpenGL ES" 38 | "pvr-ddk-vf2-tools: some tools for test") 39 | cd img-gpu-powervr-bin-${pkgver} 40 | 41 | install_lib_ln target/usr/lib/ libsrv_um.so.${pkgver} libsrv_um.so 42 | install_lib_ln target/usr/lib/ libusc.so.${pkgver} libusc.so 43 | install_lib_ln target/usr/lib/ libpvr_dri_support.so.${pkgver} libpvr_dri_support.so 44 | install_lib_ln target/usr/lib/ libufwriter.so.${pkgver} libufwriter.so 45 | install_lib_ln target/usr/lib/ libsutu_display.so.${pkgver} libsutu_display.so 46 | install_lib_ln target/usr/lib/ libglslcompiler.so.${pkgver} libglslcompiler.so 47 | 48 | install_lib_ln target/usr/lib/ libGLESv1_CM_PVR_MESA.so.${pkgver} libGLESv1_CM_PVR_MESA.so 49 | install_lib_ln target/usr/lib/ libGLESv2_PVR_MESA.so.${pkgver} libGLESv2_PVR_MESA.so 50 | install_lib_ln target/usr/lib/ libPVROCL.so.${pkgver} libPVROCL.so libPVROCL.so.1 51 | install_lib_ln target/usr/lib/ libPVRScopeServices.so.${pkgver} libPVRScopeServices.so 52 | install_lib_ln target/usr/lib/ libVK_IMG.so.${pkgver} libVK_IMG.so libVK_IMG.so.1 53 | 54 | install_headers drv/CL drv/EGL drv/GLES drv/GLES3 55 | 56 | # You might have already copied this! 57 | # for i in target/lib/firmware/*; do 58 | # install -Dvm644 "${i}" -t "${pkgdir}/usr/lib/firmware" 59 | # done 60 | 61 | install -Dvm644 target/etc/vulkan/icd.d/icdconf.json -t "${pkgdir}/usr/share/vulkan/icd.d" 62 | install -Dvm644 target/etc/OpenCL/vendors/IMG.icd -t "${pkgdir}/etc/OpenCL/vendors" 63 | mv ${pkgdir}/usr/share/vulkan/icd.d/icdconf.json ${pkgdir}/usr/share/vulkan/icd.d/pvr_icd.json 64 | mv ${pkgdir}/etc/OpenCL/vendors/IMG.icd ${pkgdir}/etc/OpenCL/vendors/pvr.icd 65 | # cp target/etc/vulkan/icd.d/icdconf.json ${pkgdir}/usr/share/vulkan/icd.d/pvr_icd.json 66 | # cp target/etc/OpenCL/vendors/IMG.icd ${pkgdir}/etc/OpenCL/vendors/pvr.icd 67 | # chown root:root ${pkgdir}/usr/share/vulkan/icd.d/pvr_icd.json 68 | # chown root:root ${pkgdir}/etc/OpenCL/vendors/pvr.icd 69 | # chmod 644 ${pkgdir}/usr/share/vulkan/icd.d/pvr_icd.json 70 | # chmod 644 ${pkgdir}/etc/OpenCL/vendors/pvr.icd 71 | } 72 | 73 | package_pvr-ddk-vf2-syses() { 74 | pkgdesc+=' (replace system OpenGL driver dispatch loader, note that this will cause Mesa fail!)' 75 | depends=('pvr-ddk-vf2') 76 | provides=('libgles') 77 | provides+=(libGLESv1_CM.so libGLESv2.so) 78 | conflicts=('libglvnd') 79 | 80 | cd img-gpu-powervr-bin-${pkgver} 81 | 82 | mkdir -p ${pkgdir}/usr/lib 83 | ln_multi libGLESv1_CM_PVR_MESA.so.${pkgver} libGLESv1_CM.so libGLESv1_CM.so.1 84 | ln_multi libGLESv2_PVR_MESA.so.${pkgver} libGLESv2.so libGLESv2.so.2 85 | 86 | install_headers GLES GLES2 GLES3 87 | # install_headers EGL GLES GLES2 GLES3 KHR 88 | install -Dvm644 staging/usr/lib/pkgconfig/glesv2.pc -t "${pkgdir}/usr/lib/pkgconfig" 89 | install -Dvm644 staging/usr/lib/pkgconfig/glesv3.pc -t "${pkgdir}/usr/lib/pkgconfig" 90 | } 91 | 92 | package_pvr-ddk-vf2-syscl() { 93 | pkgdesc+=' (replace system OpenCL ICD loader)' 94 | depends=('pvr-ddk-vf2') 95 | provides=('libcl') 96 | provides+=(libOpenCL.so) 97 | conflicts=('ocl-icd') 98 | 99 | cd img-gpu-powervr-bin-${pkgver} 100 | 101 | mkdir -p ${pkgdir}/usr/lib 102 | ln_multi libPVROCL.so.${pkgver} libOpenCL.so.1 libOpenCL.so 103 | 104 | install_headers CL 105 | } 106 | 107 | package_pvr-ddk-vf2-tools() { 108 | pkgdesc+=' (tools)' 109 | depends=('pvr-ddk-vf2') 110 | 111 | cd img-gpu-powervr-bin-${pkgver} 112 | 113 | for i in target/usr/local/bin/*; do 114 | install -Dvm755 "${i}" -t "${pkgdir}/usr/bin" 115 | done 116 | } 117 | 118 | -------------------------------------------------------------------------------- /gpu.md: -------------------------------------------------------------------------------- 1 | # 给 VisionFive 2 安装 GPU 驱动程序 2 | 3 | ## 内核空间驱动 4 | 5 | Buildroot 产物([官方构建](https://github.com/starfive-tech/VisionFive2/releases))携带的内核已包含,刷入 `sdcard.img`,替换 rootfs 时保留内核模块即可。 6 | 7 | ## 用户空间驱动 8 | 9 | Imagination 并未**正式**开源 BXE 系列 GPU 的用户空间驱动。 10 | 11 | ### 预编译 12 | 13 | 在 [starfive-tech/soft_3rdpart](https://github.com/starfive-tech/soft_3rdpart) 的 `IMG_GPU/out` 目录中有预编译的驱动,提供以下目录结构: 14 | 15 | 16 | 17 | ```console 18 | $ tree img-gpu-powervr-bin-1.17.6210866/ 19 | img-gpu-powervr-bin-1.17.6210866/ 20 | ├── staging 21 | │   └── usr 22 | │   ├── include 23 | │   │   ├── CL 24 | │   │   │   ├── cl_egl.h 25 | │   │   │   ├── cl_ext.h 26 | │   │   │   ├── cl_gl.h 27 | │   │   │   ├── cl.h 28 | │   │   │   ├── cl_half.h 29 | │   │   │   ├── cl_icd.h 30 | │   │   │   ├── cl_platform.h 31 | │   │   │   ├── cl_version.h 32 | │   │   │   └── opencl.h 33 | │   │   ├── drv 34 | │   │   │   ├── CL 35 | │   │   │   │   ├── cl_ext.h 36 | │   │   │   │   ├── cl_img_external_semaphore.h 37 | │   │   │   │   ├── cl_img_external_semaphore_sync_fd.h 38 | │   │   │   │   ├── cl_img_safety_mechanisms.h 39 | │   │   │   │   └── cl_img_semaphore.h 40 | │   │   │   ├── EGL 41 | │   │   │   │   └── eglext.h 42 | │   │   │   ├── GLES 43 | │   │   │   │   └── glext.h 44 | │   │   │   └── GLES3 45 | │   │   │   └── glimgext.h 46 | │   │   ├── EGL 47 | │   │   │   ├── eglext.h 48 | │   │   │   ├── egl.h 49 | │   │   │   └── eglplatform.h 50 | │   │   ├── GLES 51 | │   │   │   ├── glext.h 52 | │   │   │   ├── gl.h 53 | │   │   │   └── glplatform.h 54 | │   │   ├── GLES2 55 | │   │   │   ├── gl2ext.h 56 | │   │   │   ├── gl2.h 57 | │   │   │   └── gl2platform.h 58 | │   │   ├── GLES3 59 | │   │   │   ├── gl32.h 60 | │   │   │   ├── gl3ext.h 61 | │   │   │   ├── gl3.h 62 | │   │   │   └── gl3platform.h 63 | │   │   ├── KHR 64 | │   │   │   └── khrplatform.h 65 | │   │   ├── spirv 66 | │   │   │   ├── extinst.glsl.std.450.grammar.json 67 | │   │   │   ├── extinst.opencl.std.100.grammar.json 68 | │   │   │   ├── GLSL.std.450.h 69 | │   │   │   ├── OpenCL.std.h 70 | │   │   │   ├── spirv.core.grammar.json 71 | │   │   │   └── spirv.hpp 72 | │   │   └── vulkan 73 | │   │   ├── vk_icd.h 74 | │   │   ├── vk_layer.h 75 | │   │   ├── vk_platform.h 76 | │   │   ├── vulkan_core.h 77 | │   │   ├── vulkan.h 78 | │   │   ├── vulkan_wayland.h 79 | │   │   ├── vulkan_xcb.h 80 | │   │   └── vulkan_xlib.h 81 | │   └── lib 82 | │   ├── libapicommon.a 83 | │   ├── libcompute.a 84 | │   ├── libcomputehwr.a 85 | │   ├── libdbm.a 86 | │   ├── libffcommon.a 87 | │   ├── libffpfo.a 88 | │   ├── libfftb.a 89 | │   ├── libfftnl.a 90 | │   ├── libGLESv1_CM_PVR_MESA.so -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 91 | │   ├── libGLESv1_CM_PVR_MESA.so.1.17.6210866 92 | │   ├── libGLESv1_CM.so -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 93 | │   ├── libGLESv1_CM.so.1 -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 94 | │   ├── libGLESv2_PVR_MESA.so -> libGLESv2_PVR_MESA.so.1.17.6210866 95 | │   ├── libGLESv2_PVR_MESA.so.1.17.6210866 96 | │   ├── libGLESv2.so -> libGLESv2_PVR_MESA.so.1.17.6210866 97 | │   ├── libGLESv2.so.2 -> libGLESv2_PVR_MESA.so.1.17.6210866 98 | │   ├── libglslcompiler.so -> libglslcompiler.so.1.17.6210866 99 | │   ├── libglslcompiler.so.1.17.6210866 100 | │   ├── libglsllink.a 101 | │   ├── libIMGeglsup.a 102 | │   ├── libimgelf.a 103 | │   ├── libOpenCL.so -> libPVROCL.so.1 104 | │   ├── libOpenCL.so.1 -> libPVROCL.so.1 105 | │   ├── libpds.a 106 | │   ├── libperf_sim.a 107 | │   ├── libpixfmts.a 108 | │   ├── libpvr_dri_support.so -> libpvr_dri_support.so.1.17.6210866 109 | │   ├── libpvr_dri_support.so.1.17.6210866 110 | │   ├── libPVROCL.so -> libPVROCL.so.1.17.6210866 111 | │   ├── libPVROCL.so.1 -> libPVROCL.so.1.17.6210866 112 | │   ├── libPVROCL.so.1.17.6210866 113 | │   ├── libPVRScopeServices.so -> libPVRScopeServices.so.1.17.6210866 114 | │   ├── libPVRScopeServices.so.1.17.6210866 115 | │   ├── libpvrtld.a 116 | │   ├── librenderpass.a 117 | │   ├── librogue2d.a 118 | │   ├── libslotpacking.a 119 | │   ├── libspecobj.a 120 | │   ├── libsrv_um.so -> libsrv_um.so.1.17.6210866 121 | │   ├── libsrv_um.so.1.17.6210866 122 | │   ├── libsrv_um_static.a 123 | │   ├── libsrvut.a 124 | │   ├── libsutu_display.so -> libsutu_display.so.1.17.6210866 125 | │   ├── libsutu_display.so.1.17.6210866 126 | │   ├── libsync_linux.a 127 | │   ├── libufwriter.so -> libufwriter.so.1.17.6210866 128 | │   ├── libufwriter.so.1.17.6210866 129 | │   ├── libuscasm.a 130 | │   ├── libuscdisasm.a 131 | │   ├── libusclink.a 132 | │   ├── libusc.so -> libusc.so.1.17.6210866 133 | │   ├── libusc.so.1.17.6210866 134 | │   ├── libutil_linux.a 135 | │   ├── libvertexunpack.a 136 | │   ├── libVK_IMG.so -> libVK_IMG.so.1.17.6210866 137 | │   ├── libVK_IMG.so.1 -> libVK_IMG.so.1.17.6210866 138 | │   ├── libVK_IMG.so.1.17.6210866 139 | │   ├── libvulkan-1.so -> libvulkan.so.1 140 | │   ├── libvulkan.so -> libvulkan.so.1.17.6210866 141 | │   ├── libvulkan.so.0 -> libvulkan.so.1 142 | │   ├── libvulkan.so.1 -> libvulkan.so.1.17.6210866 143 | │   ├── libvulkan.so.1.17.6210866 144 | │   └── pkgconfig 145 | │   ├── glesv2.pc 146 | │   ├── glesv3.pc 147 | │   └── vulkan.pc 148 | └── target 149 | ├── etc 150 | │   ├── init.d 151 | │   │   └── rc.pvr 152 | │   ├── OpenCL 153 | │   │   └── vendors 154 | │   │   └── IMG.icd 155 | │   └── vulkan 156 | │   └── icd.d 157 | │   └── icdconf.json 158 | ├── lib 159 | │   └── firmware 160 | │   ├── rgx.fw.36.50.54.182 161 | │   └── rgx.sh.36.50.54.182 162 | └── usr 163 | ├── lib 164 | │   ├── libGLESv1_CM_PVR_MESA.so -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 165 | │   ├── libGLESv1_CM_PVR_MESA.so.1.17.6210866 166 | │   ├── libGLESv1_CM.so -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 167 | │   ├── libGLESv1_CM.so.1 -> libGLESv1_CM_PVR_MESA.so.1.17.6210866 168 | │   ├── libGLESv2_PVR_MESA.so -> libGLESv2_PVR_MESA.so.1.17.6210866 169 | │   ├── libGLESv2_PVR_MESA.so.1.17.6210866 170 | │   ├── libGLESv2.so -> libGLESv2_PVR_MESA.so.1.17.6210866 171 | │   ├── libGLESv2.so.2 -> libGLESv2_PVR_MESA.so.1.17.6210866 172 | │   ├── libglslcompiler.so -> libglslcompiler.so.1.17.6210866 173 | │   ├── libglslcompiler.so.1.17.6210866 174 | │   ├── libOpenCL.so -> libPVROCL.so.1 175 | │   ├── libOpenCL.so.1 -> libPVROCL.so.1 176 | │   ├── libpvr_dri_support.so -> libpvr_dri_support.so.1.17.6210866 177 | │   ├── libpvr_dri_support.so.1.17.6210866 178 | │   ├── libPVROCL.so -> libPVROCL.so.1.17.6210866 179 | │   ├── libPVROCL.so.1 -> libPVROCL.so.1.17.6210866 180 | │   ├── libPVROCL.so.1.17.6210866 181 | │   ├── libPVRScopeServices.so -> libPVRScopeServices.so.1.17.6210866 182 | │   ├── libPVRScopeServices.so.1.17.6210866 183 | │   ├── libsrv_um.so -> libsrv_um.so.1.17.6210866 184 | │   ├── libsrv_um.so.1.17.6210866 185 | │   ├── libsutu_display.so -> libsutu_display.so.1.17.6210866 186 | │   ├── libsutu_display.so.1.17.6210866 187 | │   ├── libufwriter.so -> libufwriter.so.1.17.6210866 188 | │   ├── libufwriter.so.1.17.6210866 189 | │   ├── libusc.so -> libusc.so.1.17.6210866 190 | │   ├── libusc.so.1.17.6210866 191 | │   ├── libVK_IMG.so -> libVK_IMG.so.1.17.6210866 192 | │   ├── libVK_IMG.so.1 -> libVK_IMG.so.1.17.6210866 193 | │   ├── libVK_IMG.so.1.17.6210866 194 | │   ├── libvulkan-1.so -> libvulkan.so.1 195 | │   ├── libvulkan.so -> libvulkan.so.1.17.6210866 196 | │   ├── libvulkan.so.0 -> libvulkan.so.1 197 | │   ├── libvulkan.so.1 -> libvulkan.so.1.17.6210866 198 | │   └── libvulkan.so.1.17.6210866 199 | └── local 200 | └── bin 201 | ├── hwperfbin2jsont 202 | ├── hwperfjsonmerge.py 203 | ├── ocl_extended_test 204 | ├── ocl_unit_test 205 | ├── pdump 206 | ├── pdump_optimise.py 207 | ├── pvrdebug 208 | ├── pvrhtb2txt 209 | ├── pvrhtbd 210 | ├── pvrhwperf 211 | ├── pvrlogdump 212 | ├── pvrlogsplit 213 | ├── pvr_memory_test 214 | ├── pvr_mutex_perf_test_mx 215 | ├── pvrsrvctl 216 | ├── pvrtld 217 | ├── rgx_blit_test 218 | ├── rgx_compute_test 219 | ├── rgx_kicksync_test 220 | ├── rgx_triangle_test 221 | ├── rgx_twiddling_test 222 | ├── rogue2d_fbctest 223 | └── rogue2d_unittest 224 | 225 | 32 directories, 173 files 226 | ``` 227 | 228 | 229 | 230 | 看起来像是 Buildroot 的编译产物。 231 | 232 | 其中,Imagination 的内部专有程序库有: 233 | 234 | - `libsrv_um.so`: 提供 `PVRSRV.*` 与 `RGX.*` 系列函数 235 | - 没有动态链接到这些库 236 | - `libusc.so`: 提供 `PVRUniFlex.*` 系列函数 237 | - 动态链接到了 `libsrv_um.so` 238 | - `libpvr_dri_support.so`: 提供 `KEGL.*` 与 `TQ.*` 系列函数 239 | - 动态链接到了 `libsrv_um.so` 240 | - `libufwriter.so`: 提供 `BIL.*` 系列函数 241 | - 动态链接到了 `libsrv_um.so` 和 `libusc.so` 242 | - 导出函数中有一些用内部结构修饰的名字,看样子是用 C++ 写的 243 | - `libsutu_display.so`: 提供 `sutu_Display.*` 系列函数 244 | - 动态链接到了 `libsrv_um.so` 245 | - `libPVRScopeServices.so`: 提供返回实际函数地址的 `pvrssGetProcAddress` 函数 246 | - 没有动态链接到这些库 247 | - 应该是性能调试用的 248 | - `libglslcompiler.so`: GLSL 编译器? 249 | - 动态链接到了 `libsrv_um.so` 和 `libusc.so` 250 | - 导出了 `GLSLCompileToUniflex` 函数,将 GLSL 转译成 Imagination 自己的 IL? 251 | 252 | 实现了标准 API,应当被外部程序加载的专有程序库有: 253 | 254 | - `libPVROCL.so`: 对 OpenCL 的专有实现 255 | - 动态链接到了 `libsrv_um.so` 和 `libusc.so` 256 | - `clGetDeviceInfo` 中显示其硬编码了以下信息: 257 | - PowerVR B-Series BXE-4-32 258 | - Imagination Technologies 259 | - EMBEDDED_PROFILE 260 | - OpenCL 3.0 261 | - OpenCL C 1.2 262 | - SPIR-V_1.2 263 | - 似乎既可以直接作为 `libOpenCL.so` 使用,也可以作为 `opencl-driver`(即被 `ocl-icd` 加载)? 264 | - `libGLESv1_CM_PVR_MESA.so`: 对 OpenGL ES 1 的专有实现? 265 | - 动态链接到了 `libpvr_dri_support.so`、`libsrv_um.so` 和 `libusc.so` 266 | - `glGetString` 中显示其硬编码了以下信息: 267 | - OpenGL ES-CM 1.1 268 | - Imagination Technologies 269 | - PowerVR B-Series BXE-4-32 270 | - `libGLESv2_PVR_MESA.so`: 对 OpenGL ES 2/3 的专有实现? 271 | - 动态链接到了 `libglslcompiler.so`、`libpvr_dri_support.so`、`libsrv_um.so` 和 `libusc.so` 272 | - `glGetString` 中显示其硬编码了以下信息: 273 | - OpenGL ES 3.2 build 1.17@6210866 274 | - Imagination Technologies 275 | - PowerVR B-Series BXE-4-32 276 | - OpenGL ES GLSL ES 3.20 build 1.17@6210866 277 | - `libVK_IMG.so`: Vulkan ICD 驱动 278 | - 动态链接到了 `libsrv_um.so`、`libufwriter.so` 和 `libusc.so` 279 | - 通过 `etc/vulkan/icd.d/icdconf.json` 来配置加载 280 | - `libvulkan.so`: ~~应该是没“加料”的 Khronos 官方 ICD loader~~ 大意了,仔细观察发现其依然硬编码了 `libVK_IMG.so` 的名称,硬编码的日志格式和 Khronos 的不同,甚至可能和 WSI 的加载有关! 281 | 282 | ### Mesa 分支 283 | 284 | 前面的闭源驱动提供了 OpenGL ES 和 Vulkan ICD,但仍然需要我们自行编译 Mesa 来提供 OpenGL 无印和 EGL、GLX 的支持。 285 | 286 | Starfive 的开发人员直接往 Buildroot 的 Mesa 打上了 Imagination 给他们的 [68 个 patch](https://github.com/starfive-tech/buildroot/tree/JH7110_VisionFive2_devel/package/mesa3d),通过动态加载 `libpvr_dri_support.so` 在 DRI 框架下实现了 OpenGL 驱动(见 `drivers/dri/pvr/pvrcompat.c`)。不过 Mesa 在 21.3 版本后只保留了 Gallium 框架的驱动,把 DRI 框架给删了,所以这些 patch 后续也只能合并下 Amber 分支的更新(约等于没更新)。尝试了下在本地手动合并,结果在 [这里](https://github.com/shirok1/mesa/tree/jh7110-pvr)。另外,这些 patch 还包含了 Vulkan WSI 的实现(和窗体系统的集成)。 287 | 288 | 题外话:Imagination 在 2022 年 3 月 22 日提交(准确的说是被 Mesa 方面合并)了 [一份 PowerVR Vulkan 驱动](https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15243),但是这个驱动**只**支持 GX6250、AXE-1-16M 和 BXS-4-64 三款 GPU,跟 JH7110 没有任何关系。 289 | 290 | ### 给 Distro 打包 291 | 292 | 为了更好的划分职能,将以上这些库分为以下包: 293 | 294 | - `pvr-ddk-vf2`:Starfive 提供的闭源程序库。在一些提倡细粒度打包的发行版还可以考虑进一步拆分成: 295 | - `pvr-ddk-vf2-base`:基础程序库,包含 `libsrv_um.so`、`libusc.so`、`libpvr_dri_support.so`、`libufwriter.so`、`libsutu_display.so`、`libPVRScopeServices.so`、`libglslcompiler.so` 296 | - `pvr-ddk-vf2-cl`:`libPVROCL.so` 297 | - `pvr-ddk-vf2-gles`:`libGLESv1_CM_PVR_MESA.so`、`libGLESv2_PVR_MESA.so` 298 | - `pvr-ddk-vf2-vulkan`:`libVK_IMG.so` 299 | - `pvr-ddk-vf2-devel`:`staging` 目录下对用户没什么用的静态库和独占头文件 300 | - `mesa-vf2`:Mesa 分支的构建 301 | 302 | #### Arch Linux 303 | 304 | 分别给闭源程序库和 Mesa 分支写了一份 `PKGBUILD`,其中 Mesa 分支的构建参考了 AUR 上的 `mesa-git`,把源换成合并过 Imagination 的 patch 的 repo。 305 | 306 | Arch Linux 通常情况下使用 `libglvnd` 来实现不同 OpenGL 提供者之间的切换,但是目前 `libglvnd` 加载 `libGLESv2_PVR_MESA.so` 等时有问题,无法正常工作,所以需要改变 Mesa 编译配置,使其直接构建系统级的 `libGL.so`(而不是 `libGL_mesa.so`),另外还需要更改包的 `provides` 属性。对于闭源程序库,把覆盖系统级库的软链接(如 `libGLESv1_CM.so` -> `libGLESv1_CM_PVR_MESA.so.1.17.6210866`)单独做成包,以 `pvr-ddk-vf2-syses` 等命名。 307 | 308 | 目前 `rgx_triangle_test` 等闭源测试可以正常运行,但 EGL 组件有问题,不能正常创建 Wayland 上下文: 309 | - glmark2-es2-drm 提示“Failed to find suitable EGL config” 310 | - eglinfo 提示“Wayland platform: eglinfo: eglInitialize failed” 311 | - sway 日志显示其试图向某个系统设备(具有 EGL client extension)查询 DRM 文件地址然后出错,但能正常加载 Imagination 的 OpenGL ES 驱动,然后指出这个驱动不支持 `GL_EXT_unpack_subimage` 并因此“Failed to create GLES2 renderer”,回退到 pixman CPU 渲染 312 | - weston 日志(完整命令行为 `WAYLAND_DEBUG=1 weston --continue-without-input --xwayland --debug --logger-scopes=log,drm-backend`)无明显问题 313 | - glmark2 非 drm 版本因为 llvmpipe 的问题会爆 Segmentation fault 314 | 315 | Vulkan 驱动可以正确加载,但某个测试显示缺少 WSI 扩展(用于在 Wayland 等中创建 Vulkan 上下文,目前由 Mesa 分支提供),可能是在 pull 上游 amber 时不慎导致合并出错。因为上游 Mesa [更换了编写 WSI 扩展的框架](https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13234>),所以要靠自己(依靠臆想)理解进行 [修正](https://github.com/shirok1/mesa/commit/5e48a6ba47dbcd89d0fb5594e8c6b7c7345b9b6c),有待用回 Imagination 提供的原始版本测试。 316 | 317 | 如果可以,希望能够用回 `libglvnd`。 318 | 319 | #### Gentoo Linux 320 | 321 | (TODO) 322 | --------------------------------------------------------------------------------