-
Notifications
You must be signed in to change notification settings - Fork 0
Panfrost GPU stack for ODROID-M1 (B안) — PanVK 서피스 생성 실패로 폐기 #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: odroid-m1-bsp-kernel
Are you sure you want to change the base?
Changes from all commits
ed3452f
a62a86e
a730397
2fc7b7d
160dc66
2dd8487
6417b0c
1246f47
c5bb853
38ab148
04c0e46
370edb0
5f1cf74
284a895
20925ba
0b0bb02
6940774
c41b089
506ab9a
9d0d091
7c6e0c3
26ccdce
72f3ad4
001010c
1fee322
5edfab0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,80 @@ | ||
| --- a/src/video/SDL_egl.c | ||
| +++ b/src/video/SDL_egl.c | ||
| @@ -37,6 +37,54 @@ | ||
| #include "SDL_egl_c.h" | ||
| #include "SDL_loadso.h" | ||
| #include "SDL_hints.h" | ||
| +#include <stdio.h> | ||
| +#include <time.h> | ||
| + | ||
| +/* frametime logger (env FRAMETIME_LOG). Wraps the eglSwapBuffers function | ||
| + * pointer itself instead of the generic SDL_EGL_SwapBuffers() helper: on | ||
| + * this board (and any Wayland/KMSDRM backend), the per-backend SwapWindow | ||
| + * implementations (Wayland_GLES_SwapWindow, KMSDRM_GLES_SwapWindow) call | ||
| + * _this->egl_data->eglSwapBuffers() directly and never go through | ||
| + * SDL_EGL_SwapBuffers() - a hook there is dead code for those backends. | ||
| + * The function pointer is the true single choke point for every backend | ||
| + * (SDL_EGL_SwapBuffers() itself also calls through this same pointer, so | ||
| + * wrapping it here covers that path too without double-counting). */ | ||
| +static EGLBoolean (EGLAPIENTRY *FT_real_eglSwapBuffers)(EGLDisplay, EGLSurface); | ||
| +static FILE *FT_log; | ||
| +static EGLBoolean EGLAPIENTRY FT_log_eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) | ||
| +{ | ||
| + struct timespec ts_; | ||
| + clock_gettime(CLOCK_MONOTONIC, &ts_); | ||
| + fprintf(FT_log, "%lld\n", | ||
| + (long long)(ts_.tv_sec * 1000000LL + ts_.tv_nsec / 1000)); | ||
| + return FT_real_eglSwapBuffers(dpy, surf); | ||
| +} | ||
| + | ||
| +/* FRAMETIME_LOG is set on the *frontend* (emulationstation) process so that | ||
| + * the game it forks/execs inherits it - but emulationstation itself also | ||
| + * links this same libSDL2 and does its own swaps (still-live background | ||
| + * redraws even with a game "in front"), so it would otherwise open and | ||
| + * write into the same log file as the game it launched, corrupting it with | ||
| + * interleaved/out-of-order timestamps from two independent processes | ||
| + * (confirmed live: ES held an open FD on the game's FRAMETIME_LOG path, | ||
| + * producing multi-hundred-second jumps in the CSV). Exclude the frontend | ||
| + * itself by process name so only the actual emulator process logs. */ | ||
| +static int FT_skip_self(void) | ||
| +{ | ||
| + static int cached = -1; | ||
| + if (cached < 0) { | ||
| + char comm[16] = {0}; | ||
| + FILE *cf = fopen("/proc/self/comm", "r"); | ||
| + if (cf) { | ||
| + if (!fgets(comm, sizeof(comm), cf)) { | ||
| + comm[0] = '\0'; | ||
| + } | ||
| + fclose(cf); | ||
| + } | ||
| + cached = (SDL_strncmp(comm, "emulationstatio", 15) == 0); | ||
| + } | ||
| + return cached; | ||
| +} | ||
|
|
||
| #ifdef EGL_KHR_create_context | ||
| /* EGL_OPENGL_ES3_BIT_KHR was added in version 13 of the extension. */ | ||
| @@ -479,6 +527,22 @@ | ||
| _this->egl_data = NULL; | ||
| return -1; | ||
| } | ||
| + | ||
| + /* frametime logger: substitute logging wrapper if requested. Guarded by | ||
| + * a pointer-identity check so a second LoadLibraryOnly() call (video | ||
| + * reinit) doesn't double-wrap. Skipped entirely for the emulationstation | ||
| + * frontend itself (see FT_skip_self() above). */ | ||
| + if (!FT_skip_self()) { | ||
| + const char *ft_path = SDL_getenv("FRAMETIME_LOG"); | ||
| + if (ft_path && !FT_log) { | ||
| + FT_log = fopen(ft_path, "w"); | ||
| + if (FT_log) setvbuf(FT_log, NULL, _IOLBF, 0); | ||
| + } | ||
| + if (FT_log && _this->egl_data->eglSwapBuffers != FT_log_eglSwapBuffers) { | ||
| + FT_real_eglSwapBuffers = _this->egl_data->eglSwapBuffers; | ||
| + _this->egl_data->eglSwapBuffers = FT_log_eglSwapBuffers; | ||
| + } | ||
| + } | ||
| return 0; | ||
| } | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # Copy (or symlink) this file to output/rk3568-odroidm1/local.mk to build | ||
| # the kernel straight from a live local checkout instead of downloading | ||
| # Pyohwan/linux's panfrost-enable branch - skips buildroot's | ||
| # download/extract steps entirely. Edit the kernel source, then | ||
| # `make linux-rebuild all`, no commit/push needed per iteration. | ||
| # | ||
| # Requires the matching docker mount: pass KERNEL_SRCDIR=<host path to the | ||
| # linux-odroidm1 checkout> on every `make rk3568-odroidm1-build` | ||
| # invocation (see docker/docker.mk's KERNEL_SRCDIR opt-in) - the container | ||
| # only sees the checkout at /kernel-src if that variable is set, e.g.: | ||
| # | ||
| # make rk3568-odroidm1-build BATCH_MODE=1 KERNEL_SRCDIR=/mnt/2026_990pro_2tb_1_data/git_projects/linux-odroidm1 | ||
| # | ||
| # Why this exists: buildroot's git-download cache keys its dl/ tarball | ||
| # filename off BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION's literal string, not | ||
| # off the commit it resolves to. A branch name never changes that string, | ||
| # so pushing new commits to an already-downloaded branch is invisible to | ||
| # buildroot forever - this cost two full iterations of the odroid-m1- | ||
| # panfrost debugging cycle silently rebuilding the same stale commit | ||
| # (see Joplin "B트랙 buildroot 커널 캐시 오염" note, 2026-08-08). This | ||
| # OVERRIDE_SRCDIR mechanism is buildroot's own documented answer for | ||
| # "actively editing source, rebuilding often" (manual: "Using Buildroot | ||
| # during development") - it bypasses the download cache instead of | ||
| # fighting it. | ||
| # | ||
| # Caveat: while this is active, the working tree - not git history - is | ||
| # what's actually being built. Check `git status`/`git stash list` in the | ||
| # kernel repo before trusting what a given image contains, and commit | ||
| # anything worth keeping. Once a build is verified good enough to archive, | ||
| # delete/rename this file and go back to pinning | ||
| # BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION to that commit's full hash in the | ||
| # .board file instead - the two mechanisms are meant to be swapped between, | ||
| # not run at the same time. | ||
| LINUX_OVERRIDE_SRCDIR = /kernel-src |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,30 @@ | ||
| include batocera-board.common | ||
|
|
||
| # Build machine job cap - not a board property, but MAKE_JLEVEL passed on | ||
| # the make command line doesn't reach this .config (add-defconfig | ||
| # plumbing doesn't apply to plain <board>-build), and hand-editing the | ||
| # generated _defconfig doesn't stick (gets regenerated from this file). | ||
| # BR2_JLEVEL=0 (auto = nproc+1=17) pushed a 16-core/15GB host into ~8GB of | ||
| # swap compiling LLVM+Mesa3D for the Panfrost experiment - that pairing is | ||
| # the actual risk (LLVM's own build parallelism stacks on top of buildroot's). | ||
| # Bumped 4->8 (2026-08-08): during a kernel-only rebuild (no LLVM/Mesa3D in | ||
| # the dependency chain), `docker stats` showed the build container using | ||
| # only ~2.7GiB/15GiB even at JLEVEL=4 - plenty of headroom for a plain C | ||
| # compile. Watch `docker stats`/`free -h` again next time LLVM+Mesa3D are | ||
| # actually in the build (fresh from-scratch image, not just this kernel | ||
| # iteration loop) and drop back toward 4 if swap grows the same way. | ||
| BR2_JLEVEL=8 | ||
|
|
||
| # Target definition | ||
| BR2_aarch64=y | ||
| BR2_cortex_a55=y | ||
| BR2_ARM_FPU_NEON_FP_ARMV8=y | ||
| BR2_PACKAGE_BATOCERA_TARGET_RK3568=y | ||
| # This dedicated target's own board identity, distinct from | ||
| # BR2_PACKAGE_UBOOT_ODROID_M1 (also set by the shared 11-board | ||
| # batocera-rk3568.board target, which builds an odroid-m1 image variant | ||
| # too - not a valid "is this our dedicated target" proxy). | ||
| BR2_PACKAGE_BATOCERA_TARGET_BSP_ODROIDM1=y | ||
| BR2_TARGET_OPTIMIZATION="-pipe -fsigned-char" | ||
| BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y | ||
| # NOT rk3568/patches: its ffmpeg/mpv patches add v4l2-request HEVC support | ||
|
|
@@ -18,11 +38,34 @@ BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y | |
| BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/patches $(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/patches $(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/bsp-odroidm1/patches" | ||
| BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/fsoverlay $(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/fsoverlay $(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/rk3568/fsoverlay $(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/bsp-odroidm1/fsoverlay" | ||
|
|
||
| # Kernel - our hardkernel BSP fork (HDMI+DSI dual livelock fix), not mainline | ||
| # Kernel - our hardkernel BSP fork (HDMI+DSI dual livelock fix), not mainline. | ||
| # odroid-m1-panfrost branch (this file) tracks the panfrost-enable kernel | ||
| # branch specifically - NOT fix-hdmi-dsi-dual-livelock, which track A (blob) | ||
| # still uses directly. panfrost-enable carries a DTS fix (interrupt-names | ||
| # case + a separate, ungated GPU OPP table) that panfrost's probe needs but | ||
| # the vendor-kbase-oriented base tree doesn't provide - see rk356x.dtsi gpu | ||
| # node history. This pointer was accidentally left on the shared base | ||
| # branch for the first panfrost build attempt (the DTS gap was masked by a | ||
| # different bug at the time); real-hardware dmesg is what surfaced it. | ||
| BR2_LINUX_KERNEL=y | ||
| BR2_LINUX_KERNEL_CUSTOM_GIT=y | ||
| BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/Pyohwan/linux.git" | ||
| BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="fix-hdmi-dsi-dual-livelock" | ||
| # Pinned to a commit hash, not the branch name, on purpose: buildroot's git | ||
| # download cache keys its dl/ tarball filename off this literal string, not | ||
| # off the commit it resolves to. With a branch name, pushing new commits to | ||
| # panfrost-enable is invisible to buildroot forever once the first tarball | ||
| # for that name exists - v2/v3/v4 all silently rebuilt v2's tree this way | ||
| # (dl/linux/git's checked-out HEAD stayed at 1139cde0 through two more real | ||
| # pushes). Bump this hash by hand after every commit meant to actually | ||
| # change what gets built; a branch name is only safe once iteration is done. | ||
| # | ||
| # For active same-day DTS iteration instead, skip this pointer entirely: | ||
| # use board/batocera/rockchip/bsp-odroidm1/local.mk.example (copy to | ||
| # output/rk3568-odroidm1/local.mk, build with KERNEL_SRCDIR=<local kernel | ||
| # checkout>) to build straight from the working tree via buildroot's | ||
| # LINUX_OVERRIDE_SRCDIR - no commit/push/hash-bump per iteration. Switch | ||
| # back to a hash pin here once a build is verified good enough to archive. | ||
| BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="13fcfde92b934f0dca1905fe98d976ff003cf369" | ||
|
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ✅ 브랜치명 → 커밋 해시 고정과 그 사유(buildroot의 dl 캐시가 리터럴 문자열로 키를 만든다)는 정확합니다. |
||
| BR2_KERNEL_HEADERS_6_1=y | ||
| BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y | ||
| BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_BATOCERA_PATH)/board/batocera/rockchip/bsp-odroidm1/linux-defconfig.config" | ||
|
|
@@ -47,10 +90,58 @@ BR2_PACKAGE_HOST_DTC=y | |
| BR2_PACKAGE_BATOCERA_KODI21=y | ||
| BR2_TARGET_ROOTFS_SQUASHFS4_ZSTD=y | ||
|
|
||
| # GPU - Mali-G52 blob (hardkernel). The kernel also builds Panfrost as an | ||
| # unused module (matches the real device: loaded, refcount 0) but we use | ||
| # the proprietary blob, matching what's verified working on hardware. | ||
| BR2_PACKAGE_MALI_G52_ODROIDM1=y | ||
| # GPU - Panfrost (Mesa gallium), replacing the Mali-G52 blob for the | ||
| # Panfrost A/B experiment (branch odroid-m1-panfrost / kernel branch | ||
| # panfrost-enable). Static DTS check confirmed a clean match against | ||
| # panfrost's of_match_table before this switch: compatible = "arm,mali- | ||
| # bifrost" (drivers/gpu/drm/panfrost/panfrost_drv.c dt_match), clock | ||
| # lookup is unnamed/positional (devm_clk_get(dev, NULL) grabs the first | ||
| # listed clock, which is the SCMI-backed "clk_mali" - no clk-scmi -517 | ||
| # risk since CONFIG_COMMON_CLK_SCMI is already =y), and the "mali-supply" | ||
| # regulator property matches panfrost's default_supplies[] = {"mali", | ||
| # NULL} exactly. Board dtsi override (rk3568-evb.dtsi &gpu) only adds | ||
| # mali-supply + status=okay, no custom kbase-only properties - this DTS | ||
| # was effectively already mainline-shaped. Kernel side: CONFIG_MALI_ | ||
| # BIFROST unset, CONFIG_DRM_PANFROST=y (see linux-defconfig.config). | ||
| # BR2_PACKAGE_MALI_G52_ODROIDM1=y | ||
|
|
||
| # (TRX/Tomb-Raider auto-select used to be gated on !BR2_PACKAGE_MALI_ | ||
| # G52_ODROIDM1 specifically as a stand-in for "this board has no desktop | ||
| # GL" - flipped back on and hard-stopped the build once that package was | ||
| # disabled here. Fixed at the real root cause instead: batocera-system/ | ||
| # Config.in's TRX select now checks BR2_PACKAGE_HAS_LIBGL directly, which | ||
| # is false for both the blob and Panfrost/GLES-only Mesa on this board.) | ||
|
|
||
| # Mesa3D with the panfrost gallium driver takes over as the HAS_LIBEGL/ | ||
| # HAS_LIBGLES/HAS_LIBGBM provider (mali-g52-odroidm1's Config.in used to | ||
| # do this via BR2_PACKAGE_PROVIDES_LIBEGL=mali-g52-odroidm1 etc.). | ||
| BR2_PACKAGE_MESA3D=y | ||
| BR2_PACKAGE_MESA3D_LLVM=y | ||
| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y | ||
| BR2_PACKAGE_MESA3D_OPENGL_EGL=y | ||
| BR2_PACKAGE_MESA3D_OPENGL_ES=y | ||
|
|
||
| # PanVK (Mesa's own Panfrost Vulkan driver) - the blob (Track A) has zero | ||
| # Vulkan support at all, so this is a B-only capability, not an A/B | ||
| # comparison axis. The GLES-only-comparison rationale that used to be here | ||
| # was based on an unverified "PanVK is non-conformant on G52" assumption - | ||
| # checked Mesa 26.1.5's docs/features.txt directly: Vulkan 1.0 is listed as | ||
| # fully DONE on panvk with no Bifrost/Valhall gen qualifier (only some 1.1+ | ||
| # extensions are gen-gated to "panvk/v10+" i.e. Valhall-only), so G52 | ||
| # (Bifrost) gets a real Vulkan 1.0 implementation, not a token/broken one. | ||
| # Setting BR2_PACKAGE_BATOCERA_VULKAN=y directly (rather than going through | ||
| # BR2_PACKAGE_BATOCERA_PANFROST_MESA3D, which this board doesn't use since | ||
| # it sets granular MESA3D_* flags above instead of that meta-select) is | ||
| # what actually flips every emulator .mk's `ifeq ($(BR2_PACKAGE_BATOCERA_ | ||
| # VULKAN),y)` build flag (flycast/beetle-psx/ppsspp/azahar/ps2/dolphin/ | ||
| # retroarch --enable-vulkan/vkquake*) - this is additive, not a replacement | ||
| # for the existing GLES path: standalone emulators expose Vulkan as a | ||
| # runtime-selectable gfxbackend alongside OpenGL, and retroarch cores built | ||
| # with USE_VULKAN=ON still keep their GL renderer, Vulkan just becomes an | ||
| # additional selectable video driver. Existing GL-path fps numbers already | ||
| # recorded in Joplin remain valid as the default/baseline. | ||
| BR2_PACKAGE_BATOCERA_VULKAN=y | ||
| BR2_PACKAGE_MESA3D_VULKAN_DRIVER_PANFROST=y | ||
|
|
||
| # No compositor (labwc/Wayland): the vendor Mali blob's Wayland-client EGL | ||
| # platform is broken (confirmed live on hardware - eglGetPlatformDisplayEXT | ||
|
|
@@ -105,6 +196,12 @@ BR2_PACKAGE_LIBRETRO_FBNEO_KOREAN=y | |
| # instead of full Mesa. Needs kronos.mk patched to not require full mesa3d | ||
| # on this board (unclear yet whether it actually needs anything beyond | ||
| # headers for the FORCE_GLES path) before this can be turned back on. | ||
| # NOTE (odroid-m1-panfrost branch only): this specific blocker (mesa3d- | ||
| # headers vs full mesa3d hard-stop) no longer applies here now that the | ||
| # board runs full BR2_PACKAGE_MESA3D for panfrost - kronos could likely | ||
| # just be turned on as-is on this branch. Left off anyway to keep the | ||
| # Panfrost A/B diff scoped to GPU driver only; worth revisiting once | ||
| # panfrost itself is confirmed working on hardware. | ||
| # BR2_PACKAGE_LIBRETRO_KRONOS=y | ||
|
|
||
| # NDS: upstream only selects libretro-melonds-ds when BR2_PACKAGE_ | ||
|
|
@@ -116,6 +213,84 @@ BR2_PACKAGE_LIBRETRO_FBNEO_KOREAN=y | |
| # a Software render mode that doesn't need GL at all, worth trying. | ||
| BR2_PACKAGE_LIBRETRO_MELONDS_DS=y | ||
|
|
||
| # Vulkan-capable systems/cores, added alongside PanVK above. All additive | ||
| # to the existing GLES matrix (see BR2_PACKAGE_BATOCERA_VULKAN note above) - | ||
| # none of these replace an already-tested GL path, they're either brand new | ||
| # systems or extra selectable renderers on top of what's already recorded. | ||
| # | ||
| # PCSX2 (PS2) - never tested on this board before (no PS2 core at all | ||
| # previously - libretro-play/libretro-ps2 below are the only alternatives, | ||
| # both also new). Explicitly supports aarch64 in its own Config.in | ||
| # (depends on BR2_x86_64 || BR2_aarch64) and needs BR2_PACKAGE_XORG7, which | ||
|
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기서는 "needs 이 타겟에서 XORG7 자체를 끌 수 있는지 확인해 보시면, SDL3_X11·TRX·moonlight-qt 특례가 한꺼번에 사라질 수 있습니다.
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이것도 이번엔 안 건드렸습니다 — XORG7을 완전히 끌 수 있는지는 PCSX2 빌드 의존성까지 걸린 문제라 검증 없이 손대기엔 리스크가 커서, 지적하신 내용 그대로를 여전히 열린 질문으로 남겨둡니다. |
||
| # this board already has on. Vulkan is PCSX2's modern primary renderer. | ||
| BR2_PACKAGE_PCSX2=y | ||
|
|
||
| # Dolphin standalone (GameCube/Wii) - distinct from libretro-dolphin above | ||
| # (which is what this session's A/B GameCube headline case used, GL only). | ||
| # Standalone Dolphin has its own Vulkan gfxbackend (dolphinGenerator.py | ||
| # already wires system.config.get("gfxbackend")=="Vulkan"), a completely | ||
| # different render path from the libretro GL backend, worth retrying here. | ||
| BR2_PACKAGE_DOLPHIN_EMU=y | ||
|
|
||
| # ParaLLEl-RDP N64 core - Vulkan-capable N64 renderer, not one of the 4 | ||
| # renderers (mupen64plus-next/GLideN64/glide64mk2/Rice) already tested | ||
| # this session, all of which were GL/GLES only. | ||
| BR2_PACKAGE_LIBRETRO_PARALLEL_N64=y | ||
|
|
||
| # Dedicated Vulkan-only Dreamcast core (separate from libretro-flycast, | ||
| # which is already on and GL-tested this session at 44fps/Gunbird 2) - | ||
| # tried and reverted. libretro-flycastvl.mk only has ARM platform/ARCH | ||
| # branches wired up for specific boards (RPi4/5, RK3326, H3/H5/H6, ...); | ||
| # this board (rk3568/odroidm1) isn't one of them, so it silently falls | ||
| # through to the x86_64 default LIBRETRO_PLATFORM, which drags in xbyak's | ||
| # x86 JIT code unconditionally - confirmed via a real build failure | ||
| # ("fatal error: cpuid.h: No such file or directory" compiling | ||
| # core/hw/aica/dsp_x64.cpp). This is a genuinely stale, unmaintained fork | ||
| # (pinned commit from Oct 2021) that would need real upstream-style ARM | ||
| # platform wiring to fix properly, and libretro-flycast above already | ||
| # covers Dreamcast/Vulkan once built with BATOCERA_VULKAN=y - not worth | ||
| # patching a 5-year-stale duplicate for. Left off. | ||
| # BR2_PACKAGE_LIBRETRO_FLYCASTVL is not set | ||
|
|
||
| # libretro PPSSPP core - distinct build from the standalone PPSSPP already | ||
| # tested this session (GL, 30fps min/Tekken 6). Standalone's own Vulkan | ||
| # gfxbackend is covered by BATOCERA_VULKAN above; this is an independent | ||
| # second PSP core to compare against. | ||
| BR2_PACKAGE_LIBRETRO_PPSSPP=y | ||
|
|
||
| # libretro Azahar (3DS) core - no 3DS system was buildable on this board | ||
| # before at all (standalone azahar was never enabled either). | ||
| BR2_PACKAGE_LIBRETRO_AZAHAR=y | ||
|
|
||
| # Play! - additional PS2 core option alongside PCSX2 above. | ||
| BR2_PACKAGE_LIBRETRO_PLAY=y | ||
|
|
||
| # libretro-ps2 tried and reverted: its own CMakeLists.txt/BuildParameters. | ||
| # cmake can't identify our cross-compile target at all ("Unsupported | ||
| # architecture: unknown", confirmed via a real build failure) - a deeper | ||
| # upstream CMake arch-detection issue, not a quick one-line fix like the | ||
| # other cores above. PS2 is already covered twice over by PCSX2 and | ||
| # libretro-play, so not worth chasing a third path for. | ||
| # BR2_PACKAGE_LIBRETRO_PS2 is not set | ||
|
|
||
| # vkquake/vkquake3 need no explicit line here - batocera-system's Config.in | ||
| # auto-selects both once BR2_PACKAGE_BATOCERA_VULKAN=y is set (vkquake3 is | ||
| # only excluded on JH7110 targets, which this board isn't; it falls back to | ||
| # GL4ES for the bits that aren't pure Vulkan since HAS_LIBGL is false here). | ||
| # These are native Vulkan-only ports with no GL fallback at all - impossible | ||
| # on the blob (Track A) by construction, not just untested. | ||
| # | ||
| # vkquake2 is the one exception: it builds ref_gl.so *and* ref_vk.so side | ||
| # by side (real dual-renderer engine, not vestigial), so it genuinely needs | ||
| # desktop GLU/GLX - not available here (Panfrost only provides GLES/EGL, | ||
| # same reason TRX/dolphin-libretro are excluded above). A first build | ||
| # attempt confirmed a hard buildroot stop over this ("libgl is in the | ||
| # dependency chain of libglu... Stop.") - a defconfig "is not set" line | ||
| # can't override batocera-system's forced `select`, so fixed at the real | ||
| # root cause instead: added "&& BR2_PACKAGE_HAS_LIBGL" to vkquake2's | ||
| # auto-select condition in batocera-system/Config.in (this was a latent | ||
| # gap there - nothing GLES-only-with-Vulkan existed to expose it before). | ||
|
|
||
| # Firmware | ||
| BR2_PACKAGE_FIRMWARE_ARMBIAN=y | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
베이스 브랜치(
odroid-m1-bsp-kernel)에도 같은 주석과 함께BR2_JLEVEL=8이 이미 들어가 있습니다(위치만 다릅니다). 지금 상태로 머지하면 같은 파일에BR2_JLEVEL=8이 두 줄 생깁니다.local.mk.example과docker/docker.mk의KERNEL_SRCDIR도 #3·#4가 각각 들고 있습니다. 현재 base 위로 리베이스하면 diff가 B안 고유 변경만 남아 리뷰 비용이 크게 줄어듭니다.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이번 라운드에서는 리베이스는 안 했습니다 — B는 v9까지 진행 후 PanVK KHR_display 실패로 최종 폐기 확정된 상태라(PR 본문 갱신함, C안 PR #4와 교차 확인), 실사용 diff 정리보다 결론 기록이 우선이라고 판단했습니다. BR2_JLEVEL 중복 자체는 여전히 남아있는 상태입니다.