为了缩小问题,先说明下测试环境:
Magic4Pro 9.0.0.210系统
高通骁龙8Gen1(所以理论上只支持vk1.1)
模组:(游戏版本1.21.11)
第一个禁用的vulkan为原版vulkanmod(vk1.2/1.3)第二个开启的为大佬修补后的(支持vulkan1.1),两者交叉测试,全试过
第四个mod是手机支持库,运行必须
同时大佬修补过的模组在其他机型上面几乎都能用
---
使用开源vulkan驱动:Turnip及其变体(都是支持vk的版本)
日志:https://mclogs.lemwood.icu/73w5i5K(选取其一,报错都一样)
更详细的日志:https://mclogs.lemwood.icu/pu7yELu
Ai分析(基于deepseek3.2 1M上下文版)
1. 开源驱动(Turnip / PurpleVK)——内核崩溃(SIGSEGV)
涉及驱动包括 libvulkan_freedreno.so(Turnip 开源驱动,版本包括 24.3.4 和 25.0.0 衍生的 PurpleVK),启动参数中通过 DRIVER_PATH 指定自定义驱动,日志显示 AdrenoSupp: Loaded Turnip。
崩溃特征为致命信号 SIGSEGV(段错误),问题帧位于 C [libvulkan_freedreno.so+0x658f08] kgsl_syncobj_merge(kgsl_syncobj const**, unsigned int)+0x1b0,崩溃位置在内核驱动函数 kgsl_syncobj_merge,属于 KGSL(Adreno GPU 内核驱动模块)的一部分。调用栈显示从 vkQueueSubmit 一路进入内核驱动,最终在 kgsl_syncobj_merge 崩溃。崩溃时机在游戏启动后不久,提交渲染帧时触发。
原因分析:kgsl_syncobj_merge 是 KGSL 内核驱动中用于合并同步对象的函数。崩溃时访问了非法内存地址(si_addr=0x1a0),表明内核驱动在处理同步对象时存在指针解引用错误。无论用户切换何种版本的开源驱动(Turnip 24.3.4、25.0.0 衍生的 PurpleVK),崩溃位置完全相同,说明问题不在用户态驱动本身,而在于内核 KGSL 驱动的固有缺陷。该缺陷可能仅存在于特定内核版本(5.10.236)或设备厂商定制的 GPU 固件中。其他品牌同处理器设备可能使用不同的内核补丁或固件,因此未触发此崩溃。
结论:开源驱动无法绕过内核缺陷,所有基于 KGSL 的用户态驱动(包括 Turnip)最终都会调用存在 bug 的内核函数,导致崩溃。
---
使用系统闭源驱动:上述报错消失,出现新的问题
日志:https://mclogs.lemwood.icu/5FvIhp9
Ai分析
2. 系统驱动(Qualcomm Adreno 闭源驱动)——VulkanMod 初始化失败
涉及驱动为系统原生 Vulkan 驱动,识别为 Adreno (TM) 730,Vulkan 版本 1.3.0,可能位于 /vendor/lib64/hw/vulkan.adreno.so。启动参数中保留 -Dorg.lwjgl.vulkan.libname=libvulkan.so,由系统加载默认驱动。
崩溃特征为无内核崩溃(避免了 SIGSEGV),但 VulkanMod 初始化过程中抛出 Java 异常:java.lang.RuntimeException: Failed to find queue family with transfer support。堆栈显示在 Queue.findQueueFamilies 中失败,设备报告显示 Device: Adreno (TM) 730, Vulkan Version: 1.3.0, All required extensions are supported。
原因分析:Vulkan 设备通过队列族(queue family)提供命令提交功能。通常,一个设备至少有一个支持图形和传输操作的队列族,也可能有独立的传输专用队列族。Adreno 730 的系统驱动将传输功能合并到了图形队列族中,即同一队列族同时支持 VK_QUEUE_GRAPHICS_BIT 和 VK_QUEUE_TRANSFER_BIT,而没有提供仅支持传输的独立队列族。VulkanMod 的队列族选择逻辑(Queue.findQueueFamilies)可能强制要求存在一个独立的传输队列族(VK_QUEUE_TRANSFER_BIT 单独出现),而 Adreno 系统驱动不满足此条件,导致设备被判定为不可用,初始化失败。此问题属于 VulkanMod 与特定驱动实现的兼容性缺陷,并非驱动本身损坏。
结论:系统驱动本身功能完整(可正常用于其他 Vulkan 应用),但与 VulkanMod 的队列族检测逻辑不兼容。尝试修改 VulkanMod 配置(如 useDedicatedTransferQueue)无效,因为该版本(0.5.x)未提供相关配置选项。
---
但话又说回来了,该mod修补版在许多骁龙soc上都能正常运行,甚至隔壁Mali架构天玑700都能200帧运行,模组理应没有问题 |