From 3eea1fe9f1a900fc920209c9d6931c3da84cfb6d Mon Sep 17 00:00:00 2001 From: Emil <65846814+emil28092005@users.noreply.github.com> Date: Thu, 24 Sep 2026 06:38:17 +0300 Subject: [PATCH] Preserve final Windows SwiftShader acceptance evidence --- PLAN.md | 5 +- docs/IMPLEMENTATION.md | 7 +- .../p1-p3-final-2026-09-24/README.md | 2 +- .../windows-swiftshader/.gitattributes | 3 + .../windows-swiftshader/LastTest.log.gz | Bin 0 -> 14959 bytes .../windows-swiftshader/README.md | 27 + .../windows-swiftshader/SHA256SUMS.txt | 18 + .../collect-2d-manifest.json | 274 + .../collect-2d-profile.json | 7644 +++++++++++++++++ .../windows-swiftshader/collect-2d-run.json | 18 + .../collect-2d-validate.json | 12 + .../collect-3d-manifest.json | 301 + .../collect-3d-profile.json | 7644 +++++++++++++++++ .../windows-swiftshader/collect-3d-run.json | 18 + .../collect-3d-validate.json | 12 + .../integration-result-2.json | 31 + .../integration-result-3.json | 31 + .../windows-swiftshader/lua-manifest.json | 299 + .../windows-swiftshader/lua-profile.json | 7644 +++++++++++++++++ .../windows-swiftshader/lua-run.json | 18 + .../windows-swiftshader/lua-validate.json | 12 + .../windows-swiftshader/playable-report.json | 556 ++ .../windows-swiftshader/toolchain.json | 23 + .../windows-swiftshader/vulkan-probe.json | 32 + 24 files changed, 24628 insertions(+), 3 deletions(-) create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/.gitattributes create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/LastTest.log.gz create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/README.md create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/SHA256SUMS.txt create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-2d-manifest.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-2d-profile.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-2d-run.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-2d-validate.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-3d-manifest.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-3d-profile.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-3d-run.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/collect-3d-validate.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/integration-result-2.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/integration-result-3.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/lua-manifest.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/lua-profile.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/lua-run.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/lua-validate.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/playable-report.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/toolchain.json create mode 100644 docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/vulkan-probe.json diff --git a/PLAN.md b/PLAN.md index 093008f..1458d13 100644 --- a/PLAN.md +++ b/PLAN.md @@ -206,7 +206,10 @@ D32 shadow-атласов по 16 MiB; даже 2D-сцена с нулём shad снимка worker, поэтому изменение C++ в очереди не создаёт ложный статус устаревания. [Финальная совмещённая проверка](docs/validation/p1-p3-final-2026-09-24/README.md) повторяет перенос трёх Release-игр на чистом `ed523c6`. Физический Windows GPU -остаётся отдельным покрытием. Dynamic gameplay loading рассматривать при +остаётся отдельным покрытием. На этой же ревизии [Windows graphics +CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35949830251) +прошёл 78/78 CTest и перенос трёх 120-кадровых игр через SwiftShader. +Dynamic gameplay loading рассматривать при подтверждённой проблеме линковки, без обещания C++ hot reload в P1. ### P2. GPU-driven visibility и LOD diff --git a/docs/IMPLEMENTATION.md b/docs/IMPLEMENTATION.md index dd21be1..8430da2 100644 --- a/docs/IMPLEMENTATION.md +++ b/docs/IMPLEMENTATION.md @@ -656,4 +656,9 @@ Debug suite passed 76 of 77 CTests with one compositor-dependent window skip; 120 offscreen frames on the physical RTX 2080 Ti with active Vulkan validation and zero errors while the source project paths were hidden. The [final combined dossier](validation/p1-p3-final-2026-09-24/README.md) holds the -clean-source verifier report and package manifests. +clean-source verifier report and package manifests. At that same code revision, +[Windows graphics CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35949830251) +passed 78/78 CTests, the Release export integration and three relocated +120-frame C++/Lua game runs on SwiftShader. The +[native/manual CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35949830254) +passed Linux and Windows native checks and strict MkDocs. diff --git a/docs/validation/p1-p3-final-2026-09-24/README.md b/docs/validation/p1-p3-final-2026-09-24/README.md index 4fb66d2..5903b95 100644 --- a/docs/validation/p1-p3-final-2026-09-24/README.md +++ b/docs/validation/p1-p3-final-2026-09-24/README.md @@ -21,7 +21,7 @@ profiles preserve the result without duplicating native build directories. | Linux Release P1/P3-focused CTest | 24 passed, 0 failed | | Relocated Release games on physical Linux GPU | C++ 2D, C++ 3D, Lua-only: 120 frames each; validation active, 0 errors | | [Native/manual CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35949830254) | Linux and Windows native checks plus strict MkDocs passed | -| [Windows software-Vulkan CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35949830251) | Final revision run; see linked job result | +| [Windows software-Vulkan CI](windows-swiftshader/README.md) | 78/78 CTests, Release export integration and three relocated 120-frame C++/Lua games passed on SwiftShader; validation layer unavailable | The P1 queued-edit regression verifies that an asynchronous Build or Export reports the gameplay-source hash captured by its worker, not the hash from when diff --git a/docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/.gitattributes b/docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/.gitattributes new file mode 100644 index 0000000..35c5e92 --- /dev/null +++ b/docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/.gitattributes @@ -0,0 +1,3 @@ +# Retain the exact CRLF bytes from the Windows CI artifact for SHA-256 verification. +*.json -text -whitespace +*.gz binary diff --git a/docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/LastTest.log.gz b/docs/validation/p1-p3-final-2026-09-24/windows-swiftshader/LastTest.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..667d5a54b43de85a2bee795b1d18f8a7d0dc62ec GIT binary patch literal 14959 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 xjEFriJ|R3)H?&mtNDL7Rb