Skip to content

feat(shader): schedule parallel compilation with ARB/KHR backends - #33

Merged
hzqst merged 2 commits into
mainfrom
feat/parallel-shader-compile-32
Oct 26, 2026
Merged

hzqst merged 2 commits into
mainfrom
feat/parallel-shader-compile-32

Conversation

@hzqst

@hzqst hzqst commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

为 #32 实现真正的批量 Shader 编译调度。原路径在编译后立即查询状态,缓存预热也进入绘制路径;本次将提交、轮询、最终化和需求等待拆开,避免预热过程中逐项阻塞。

草稿,尚未达到合并验收门槛。 存在一次未定位的 0xC0000374 启动退出,完整游戏视觉、内存和性能验收也未完成。关联 #32,不自动关闭 issue。

Architecture

  • 按扩展标志和对应入口选择 ARB → KHR → Sync;hint 0 / 0xFFFFFFFF 遵循扩展语义。
  • 调度器拥有源码、宏、路径、回调和 GL 对象;完整输入去重,ticket 带 Context generation。
  • submit 立即提交所有 stage 和 link,不查阻塞状态;completion 就绪后查 link status,再初始化 Uniform。
  • 实际绘制 Require 同一任务,允许一次明确的同步等待;Sync 普通预热保留到真实需求。
  • HUD_Frame 标记游戏 tick,GL_BeginRendering 每游戏帧 pump 一次,有提交数、inflight 和 CPU 预算。
  • 固定 HUD 23 个程序(无 OIT 为 21 个)先排队再通过启动屏障完成;公开同步 API、ABI、GLSL 和 gamedata 不变。
loader/draw -> shared factory -> owned request -> Queued
frame       -> compile stages + link          -> Linking
later frame -> completion -> link status -> Uniform -> Ready
draw        -> Require same ticket -> wait if needed -> use
shutdown    -> save -> delete/discard -> advance generation

Changed files

文件 变更目的
src/gl_shader_parallel.h backend、任务、ticket、统计及可注入 GL 边界
src/gl_shader_parallel.cpp 有界队列、去重、公平调度、poll、需求等待、诊断和资源清理
src/gl_shader_cache.h 使用调用方 filename 解析状态;非法行拒绝及去重
src/gl_shader.h 内部 request/require/pump 接口及 CVar 声明
src/gl_shader.cpp 共用预处理、上下文初始化、同步 API 所有权、缓存与统计
src/gl_rmain.cpp 帧推进、启动参数、CVar、保存与关闭生命周期
src/gl_wsurf.cpp WSurf 共用工厂和 request-only loader
src/gl_water.cpp Water 共用工厂和 request-only loader
src/gl_light.cpp DLight/DFinal 共用工厂和 request-only loader
src/gl_studio.cpp Studio 共用工厂、Ready location 与变体表清理
src/gl_sprite.cpp Sprite/TriAPI 共用工厂和 request-only loader
src/gl_portal.cpp Portal 共用工厂、loader 和 gamma flag 映射
src/gl_hud.cpp UI 状态工厂及固定后处理批量启动屏障
cmake/Sources.cmake 编译生产调度器
tests/CMakeLists.txt 注册三项测试并保留 Release 断言
tests/gl_parallel_shader_compile_tests.cpp 对齐 hint 和探测覆盖
tests/gl_shader_parallel_scheduler_tests.cpp 生产调度器 mock、失败/取消/预算/去重/资源计数
tests/gl_shader_cache_tests.cpp 十类 filename 路由和状态文本边界
tests/gl_shader_parallel_integration_tests.cpp 真实 Sync/ARB/KHR/回退、FBO、错误隔离及性能采样
README.md 英文功能入口
README.zh-CN.md 中文功能入口
docs/en/features.md 英文功能说明
docs/zh-CN/features.md 中文功能说明
docs/en/parallel-shader-compile.md 英文架构、控制台参数与复现说明
docs/zh-CN/parallel-shader-compile.md 中文架构、控制台参数与复现说明
memory/ParallelShaderCompile.md 架构、验证证据、性能与未解决项
memory/build_and_verification.md 追加本次验证记录,标记验收未完成

Tests

环境:Windows、VS 2022 / MSVC 14.44、SDK 26100、Win32/x86;聚合工程 D:/MetaHookSv。基线 7225f589548fcc664c4d0e540eb91ccff22c3650。

实际执行 结果
cmake --build build/x86/Debug --config Debug --target Renderer Renderer_AVX2(及全部测试目标) exit 0
cmake --build build/x86/Release --config Release --target Renderer Renderer_AVX2(及全部测试目标) exit 0
ctest --test-dir build/x86/Debug/Plugins/Renderer -C Debug --output-on-failure exit 0;18/18;0 fail / 0 skip;65.67 s
ctest --test-dir build/x86/Release/Plugins/Renderer -C Release --output-on-failure exit 0;18/18;0 fail / 0 skip;27.63 s
ctest --test-dir build/x86/Release/Plugins/Renderer -C Release -R "^gl_shader_parallel_integration_tests$" -V exit 0;1/1;3.03 s
cmake --build build/renderer32-format --target format-check exit 0;103 files / 0 differences;创建 PR 前再次执行
git diff --cached --check exit 0

真实 GL:NVIDIA Corporation / GeForce RTX 5060 PCIe/SSE2,驱动 621.01,GLEW 2.2.0;测试 GL 3.3 core,游戏 GL 4.4.0。真实集成测试分别使用自动 ARB、仅 KHR、屏蔽扩展 Sync 三个 Context,各执行强制 Sync;覆盖 VS/GS/FS、故意阶段错误、Uniform、RGBA8 FBO readback、重建和删除验证。hint 请求/读回 4294967295。

游戏:Sven Co-op 5.26 / SvEngine 10257,1920×1080。执行空缓存启动、菜单、stadium4/osprey、模式切换、threads 0/-1、save/load;两图交替 10 次后 program 稳定 97、failed 0。新版 5 次重初始化均 ready 97,临时 shader 创建/删除 194/194。以上是有限运行回归,不能代替完整视觉矩阵。

测试替换的 4 个 DLL/PDB、11 个状态缓存及 config.cfg 已恢复,16 个文件逐项 SHA-256 一致。

Performance

同 GPU、同 32 个简易程序,两种 history × 两种模式 × 五轮交替次序,共 20 行。未清驱动 binary cache,小型热缓存负载。以下为五轮中位数,submit peak 为各轮最大值;“CPU 百分位”是 pump/require 样本,不是游戏帧时间。

历史 模式 wall ms submit avg / peak ms poll total ms demand 次数 / ms CPU p50 / p95 / p99 ms peak inflight
无 Sync 2.9226 0.033481 / 0.4234 0 32 / 2.7800 0.0870 / 0.1184 / 0.1400 1
无 ARB 2.2451 0.024575 / 0.1450 0 32 / 2.1682 0.0630 / 0.1094 / 0.1232 1
已知 32 状态 Sync 1.6444 0.018284 / 0.0763 0 32 / 1.5863 0.0386 / 0.0936 / 0.0968 1
已知 32 状态 ARB 2.3538 0.062372 / 0.3120 0.2419 0 / 0 0.0001 / 0.4474 / 0.5430 15

请求均唯一,scheduler cache hits=0。已知列表 ARB 预热令 32 个需求均在 Ready 命中,但总 wall 未优于 Sync;不宣称必然吞吐加速。无历史时首次需求仍需等待。原始日志在本地忽略的 build/renderer32-*.log,汇总记录随 PR 提交。

Unresolved

  • 定位一次已知状态缓存 + 强制 Sync 启动时的 0xC0000374 堆损坏退出,发生在 execing config.cfg 附近。没有转储;之后同配置成功,附加调试/地图加载及 8 轮 x86 CDB 启动退出未复现。未证明与本次改动无关,也未宣称修复。
  • 解释重初始化时的进程内存增长。新版第 1→5 轮 private bytes 1,267,200,000→1,475,379,200,handles 969→1052;原部署版 1,229,418,496→1,417,662,464,handles 935→1016。两版均增长,不能据此声称新版进程无泄漏。
  • 完整 Water/Portal/阴影/HBAO/OIT/multiview 等视觉同步对照。
  • 真实显示模式/Context 重建、VRAM 趋势、游戏首帧及加载帧 p50/p95/p99。
  • 严格可比的真实游戏性能 A/B;早期在启动后才纠正配置的试跑未作为有效性能证据。
  • 其他 GPU/驱动/GoldSrc 版本,以及合并前最终验收。

Diff summary

27 个文件,新增 2260 行、删除 318 行。覆盖内部调度、十类缓存/状态工厂及固定 HUD 批次;无公开 ABI、GLSL、gamedata 或第三方源码变更。格式和 diff 检查通过,运行时验收保持未完成状态。

hzqst and others added 2 commits October 26, 2026 23:39
Add bounded submission, completion polling, owned variant jobs, demand barriers,
context-aware cleanup, state-cache prewarming, and fixed HUD startup batches.

Add scheduler/cache/real-GL tests and document measured performance and remaining
runtime acceptance gaps. An intermittent startup heap-corruption exit remains
unresolved; this change is being proposed as a draft for review.

Refs #32

Co-Authored-By: Codex <codex@openai.com>
- Replace the std::function GL boundary with IShaderGLOperations and CShaderGLOperations
- Prefix data types with C, declare one member per line, restore program state typedefs
- Expand single-line if statements and function bodies, name pump and cache limits
- Drive shader compile cvars from one table and add per-module program table clears
- Pass HBAO finalizers explicitly instead of comparing target addresses

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@hzqst
hzqst marked this pull request as ready for review October 26, 2026 16:17
@hzqst
hzqst merged commit 2efb201 into main Oct 26, 2026
3 checks passed
@hzqst
hzqst deleted the feat/parallel-shader-compile-32 branch October 26, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant