Repository navigation
Ghost of Tsushima Director's Cut (PPSA02225, Windows): black frames despite continuing draw and presentation activity #5166
Description
Summary
I'm investigating a persistent black-screen problem in Ghost of Tsushima Director's Cut running under AnyPS5 on Windows.
The available traces show that drawing and presentation activity continues while sampled output frames are black. Shader-preparation failures are also reproducible across several diagnostic runs, but we have not established whether those failures are related to the black output.
I'm sharing the findings to ask whether anyone recognizes a related issue, knows of relevant upstream fixes, or can suggest a better way to trace shader selection through GPU submission.
Observed evidence
1. Black output with continued graphics activity
During an October 11 diagnostic session:
- Five sampled 960×540 BMP frames were byte-identical black RGB images with an opaque alpha channel.
- A separate draw trace recorded 6,791 completed
VulkanDevice::Drawentries. - Another trace recorded 4,989 draw events and 2,493 presents, with double-buffer alternation and approximately one draw between consecutive presents.
These observations establish black output in the sampled frames, not that every frame throughout the run was black. Successful draw calls and presentation activity also do not establish that the resulting pixels were correct.
2. Repeated shader-preparation failures
Across four October 12 diagnostic runs, shader preparation reported 26, 27, 28 and 28 failure lines. Twenty failing shader identities were common across all four runs.
The relevant error includes:
GetImageResource dword 0 is not a valid runtime value
The error is logged in the shader-registration/preparation path at ShaderRegistry.cpp:632.
The associated resource-validation and SRT diagnostic records provide more information about the failures, but the current evidence does not show that the failing shader identities were selected for the draws responsible for the black output.
3. Drawing and presentation continued during another diagnostic run
The October 12 14:48 diagnostic window recorded:
- 282 draw submissions
- 1,060 submit batches
- 141 flips/presents
- 28 shader-preparation failure lines
That run did not include a pixel capture verifying its visible output, so it cannot be treated as another confirmed black-frame capture.
4. The critical correlation is still missing
The registration-time shader failure log records a shader code address but no draw or submission identifier. The existing [draw-programs] records are deduplicated configurations, not a complete per-draw execution history.
Consequently, we currently cannot establish whether any of the failing shader identities were selected by a particular program, associated with a recorded draw, or included in submitted GPU work.
The investigation has also identified large serialized RecompileRequest error payloads and an older logging implementation that writes long messages through fprintf. Upstream PR #3871 addresses consolidated log-line writes. Logging contention remains a hypothesis, not an established cause of Ghost's black output.
What we have not established
We have not established that:
- The shader-preparation failures cause the black frames.
- A shader associated with one of those failures was submitted for execution.
- Logging contention caused a stall or incomplete scene initialization.
- The October 12 diagnostic runs produced black pixels; those runs lack confirming pixel captures.
The root cause remains unresolved.
Questions for the community
- Does the
GetImageResource dword 0 is not a valid runtime valuefailure resemble a known issue in shader resource tracking, runtime image-table resolution, or shader preparation? - Are there existing fixes or related investigations that we should examine before implementing additional diagnostics?
- What is the most reliable way to correlate a registered shader identity with the selected graphics program, recorded draw, GPU submission and presented surface, including cached pipeline or draw-recipe paths?
- Could the large shader-recompilation error payloads warrant a targeted logging-contention test, and are there known limitations in the current logging path that we should account for?
Pointers to relevant PRs, issues, discussions, or technical approaches would be very helpful. I'm happy to continue collecting evidence and testing a narrowly scoped hypothesis rather than assume a cause prematurely.
Further information
The chronological investigation and existing evidence are documented in Discussion #4461.
Related upstream work includes PR #3871 — fix(libc): write each log line in one call. This is relevant prior art to examine, not a confirmed fix for this issue.
The exact game version and a clean, single-build reproduction have not yet been fully established. The diagnostic runs used different deployed driver builds, so comparisons between runs need to account for that.
Current status: Investigating. The black-screen cause remains unknown.
Activity
MarcZX10 commentedon Oct 13, 2026
I opened PR #5238 with opt-in per-draw shader stage/role and code-address tracing, including submission serial and queue context. This provides a direct address comparison with shader-preparation failures; it does not claim those failures caused the black output.
Validation on Linux: the focused CTest passed (1/1), the production
Draw.cppobject compiled, and the repository convention check passed. No GPU or game runtime tests were run.sktharunbalaji13-cmd commentedon Oct 13, 2026
Investigation progress: draw-to-submission correlation
This is a factual progress update on local, uncommitted diagnostic work. No fix is claimed.
New instrumentation:
Validation:
Remaining blockers:
Conclusion: the cause of the black screen remains unresolved.
sktharunbalaji13-cmd commentedon Oct 13, 2026
Diagnostic correlation PR opened
A focused PR has been opened to add opt-in correlation from draw attempts through shader selection/preparation failures, actual draw-command recording, and recorder batch submission.
The implementation uses draw-correlation tokens and deduplicated token sets per recorder batch, distinguishing a submission attempt from successful queue submission. Best-effort diagnostic logging is designed not to mask original failures or prevent normal submission.
Validation: The clean PR branch (
feat/shader-draw-submission-correlation-5166-fresh, baseorigin/maindacd78525e537a779682032c0ace7f7af120af05, commitaef5a14cf1210d2c96941f5648801e3eb1dd700c) configured successfully, built the full instrumentedlibSceAgcDriver.prx, completed NID patching (OK), and passed 8/8 CaptureTrace tests. No GPU/game-runtime validation was added.Remaining limitations: Game-runtime validation has not established whether shader-preparation failures cause the black screen. The earlier original-build
ERROR_SHARING_VIOLATIONremains a development blocker rather than evidence of the game's root cause; this PR validation avoided it by using an isolated build directory.PR: #5431
sktharunbalaji13-cmd commentedon Oct 13, 2026
End-of-day update ? isolated Windows build and first runtime correlation trace
Today we moved the Ghost of Tsushima PPSA02225 investigation from source-level instrumentation work to a successful isolated Windows build and one controlled runtime experiment. This is a diagnostic milestone, not a confirmed black-screen fix or root-cause finding.
1. Shader-failure-to-submission correlation instrumentation
The correlation implementation is available in PR #5431.
The instrumentation adds opt-in correlation across:
Pm4::ResolveDraw.The recorder metadata permits one batch to contain multiple draw tokens or no draw tokens, instead of incorrectly assigning a single token to every draw in a batch.
2. Successful isolated Windows build
The full Windows Release build of the instrumented
libSceAgcDriver.prxcompleted successfully in an isolated build directory. NID patching also completed successfully.The patched artifact SHA-256 is:
d41824bc58673697126da9465cda3bf0b21ca4b524f59dca08b5981b38e9da9fSize: 11,589,697 bytes.
The four affected production objects compiled, and the focused CaptureTrace suite passed 8/8 tests.
The original build directory had repeatedly failed when opening its PRX output for writing with Win32 error 32 (
ERROR_SHARING_VIOLATION). We avoided overwriting or force-unlocking that original artifact by producing and validating a separate build. The original PRX and existing source/Git WIP were preserved.This validates compilation, full driver linking, NID patching, and focused utility tests. It does not by itself validate GPU rendering or prove the black-screen cause.
3. Isolated runtime staging
A separate runtime was staged at:
C:\Games\ghost\anyps5-pps02225-probe\runtime-correlation-validation-20261014The instrumented PRX was installed only in that isolated runtime's
libsdirectory. Its hash and size matched the build artifact.Robocopy copied 43,642 runtime files, excluding six known root diagnostic outputs: the existing
capture-trace.logandframe_000.bmpthroughframe_004.bmp. The copiedapp0,download0,shader_cache, and_sd_memdirectories were verified to be independent of the original runtime rather than junctions back to it.The original runtime executable, original driver, original trace, and previous evidence remained unchanged.
4. First controlled instrumented runtime run
The isolated executable was launched exactly once:
C:\Games\ghost\anyps5-pps02225-probe\runtime-correlation-validation-20261014\ghost-upstream.exeThe process ran with CaptureTrace, shader-correlation tracing, and GPU diagnostics enabled, and then exited naturally.
The fresh evidence is preserved under:
C:\Games\ghost\anyps5-pps02225-probe\startup-correlation-validation-20261014Key files include:
capture-trace.logstdout.logstderr.logruntime-run-report.txtmissing-draw-recorded-analysis.txtstaging-manifest.txtThe finalized CaptureTrace file size was 26,866,261 bytes.
5. Final runtime event counts
The completed trace contained:
draw-attemptdraw-selecteddraw-shader-request-faileddraw-materialization-faileddraw-submission-faileddraw-recordedsubmitbatch attemptssubmit-confirmedflippresentblitAll generic draw-verdict records had
verdict=0, which the current source enum maps toDrawn.6. Draw-to-submission correlation
Of 600 tokens with
draw-recordedentries, 599 appeared in both their matchingsubmitandsubmit-confirmedrecords.One recorded token, token 797 in batch 2808, had no corresponding submission or confirmation record because the run ended before that batch was flushed. This is an incomplete final-batch correlation, not proof that the batch was successfully submitted.
The trace contained 2,807 submission-attempt records and 2,807 confirmation records. At the completed-trace snapshot, every non-empty batch contained one token, while 2,208 batches had empty token sets.
Queue submission confirmation means that
vkQueueSubmitreturned successfully and the required recorder bookkeeping was finalized. It does not establish GPU completion or visible pixel output.7. The 197 attempts without
draw-recordedThere were 197 attempt tokens without a corresponding
draw-recordedrecord.Source inspection associated these attempts with a documented no-draw/recipe path in which
prepareDrawInputscan markinputs.nothing=true, andDrawWithRecipecan return from recipe handling without callingrecordDrawCommands.The generic draw-verdict records still used
Drawn=0, so these verdicts must not be confused with proof that a Vulkan draw command was actually recorded. Their detailed per-token context is preserved inmissing-draw-recorded-analysis.txt.The repeated no-draw/recipe path associated with address
0x1504910000remains a candidate for further investigation, not a confirmed explanation for the black output.8. Shader-preparation hypothesis: current result
No
draw-shader-request-failed,draw-materialization-failed, ordraw-submission-failedevent occurred in the completed runtime trace.Therefore, this run provides no captured token-level evidence attributing the black-screen condition to a logged shader-preparation failure.
Earlier diagnostic runs did report shader-preparation failures, including the
GetImageResource dword 0 is not a valid runtime valueerror. However, those earlier failures have not been shown to cause the black output.A contemporaneous screenshot showed a black rendering window during the runtime run. The logs show continued draw, submission, and presentation-path activity, but there is no validated pixel-level capture from this run.
The trace reports presentation-path activity at 3840?2160, but
flip,present, andblitrecords do not prove that the expected nonblack pixels appeared on screen.9. Preservation and safety
capture-trace.logremained unchanged.libsdirectory.C:\dev\AnyPS5worktree was not touched.Current conclusion
We now have a successful isolated Windows production build, NID patching, eight passing focused CaptureTrace tests, and a first completed runtime trace connecting hundreds of recorded draw tokens to their confirmed submission batches.
This is meaningful diagnostic progress, but the root cause of the black screen remains unresolved. The first runtime trace did not capture shader-preparation or later materialization/submission failures, and it does not contain validated pixel output.
Related work:
oneandonlydean commentedon Oct 14, 2026
Which
maincommit and game version are these runs on? Please post one run on a cleanmainbuild (no local changes) with the log, so the black output can be tied to a single build.sktharunbalaji13-cmd commentedon Oct 14, 2026
Thanks for calling this out. The October 14 runtime run was performed using the instrumented driver from the shader-failure-to-submission correlation work in PR #5431, staged in an isolated runtime. It was not a clean
mainbaseline run.Build identification
boykopovar/AnyPS5dacd78525e537a779682032c0ace7f7af120af056b5c7fbda03e9b9469e786b34d98a87dde438383PPSA02225The PR base and head identify the PR's recorded lineage; they do not independently establish the exact commit used to produce the driver in the previous runtime run. I won't present either SHA as a verified clean-main runtime build.
Next validation step
The required baseline is a separate run built from a recorded
maincommit with a clean working tree and no local modifications. The run should record the exact source SHA, game version, driver artifact hash, launch configuration, and fresh runtime log.The existing trace showed draw recording, successful queue-submission confirmations, and presentation-path activity, but it did not establish the root cause of the black output. I have not yet verified a clean-main reproduction, so I won't claim that this validation is complete.
I'll keep the baseline evidence separate from the instrumented PR results so the black-output observation can be tied to a specific, reproducible build.
milescoviello commentedon Oct 14, 2026
A Linux data point on the shader-preparation lead: on current
mainthe failures are gone and the output is still black.Ubuntu 24.04, RTX 4070 Ti, NVIDIA 595.99.02, Release, PPSA02225 relinked with
--to-intel,mained835aa plus some open PRs (#5511, #5523, #5536, #5660, #5910, #5937, #5975, #5982):could not be preparedline at all. Withmaind8888df on 10-13 the same title logged 28 shaders that failed to prepare.APS5_DUMP_FRAMES=8 APS5_DUMP_FRAMES_EVERY=1000are black at every sampled pixel, also withAPS5_STORE_AT_FLIP=1, and pad input (cross, options, circle) does not change it.storage image 0x1504910000 / 0x1506940000: guest memory changed while GPU results were pending; keeping the CPU's blocks, both 3840x2160 storage images.sceUserServiceGetEvent,sceSystemServiceReceiveEventno event,sceNetCtlGetInfo, DLC entitlement), plussceAudioOut2PortGetStatereturningSCE_AUDIO_OUT2_ERROR_INVALID_HANDLE3 times.AI-assisted: yes
milescoviello commentedon Oct 16, 2026
More data from plain
main5d9dcc4 on Linux (RTX 4070 Ti, NVIDIA 595.99), PPSA02225, warm shader cache, scripted pad input. It still presents black frames at about 60 FPS. What the title itself is doing:APS5_PROFILE_DRAW=1counts 1,200 draws per 10 s, 2 per presented frame, while compute dispatches keep running. It looks like an early state rather than a scene that renders black.sceVideoOutIsFlipPendinguntil fewer than 2 flips are pending, busy-waiting withrdtscbetween calls. Flips complete, so this is frame pacing, not a hang.APS5_TRACE_WAITSshows every site waking normally (milliseconds per wait, no long waits). All the event flags are audio: 13 WwiseAkEventflags and oneAudioThreadflag.APS5_TRACE_AUDIOOUT2shows one context pushing 93.8 grains per second, 512 samples at 48 kHz, with a mix peak of 0, i.e. silence.APS5_TRACE_APRshows 75 reads in 150 s. They areall_shaders.xpps,lang_english_text.xpps, the init, common, pulse and single-player sound banks, threemusic_*.psarcand two bitmaps. Nothing else after that, so it never asks for front-end or world data.So on this build the title loops each frame without its state advancing, with nothing blocked. It may be waiting on a result rather than a lock, perhaps a value the GPU writes or a service it polls. I haven't found which one yet.
AI-assisted: yes
milescoviello commentedon Oct 16, 2026
Ruling out the system-service side, on Linux (RTX 4070 Ti, NVIDIA 595.99),
main82ddae7 + #6814 (currentmainsegfaults at 1 s here, #6805), warm cache, pad input. Ghost still presents black frames.Under gdb with
dprintfon 400 entry points (NpManager, NpTrophy2, NpUniversalDataSystem, NpSessionSignaling, NpEntitlementAccess, UserService, SystemService, SaveData, AppContent, Http/Ssl, PlayGo), 150 s:sceUserServiceGetEvent,sceNpCheckCallback,sceSystemServiceReceiveEvent,sceSystemServiceGetStatus. Our status is all false (no overlay, no background execution).sceNpRegisterStateCallbackA,sceNpRegisterNpReachabilityStateCallback,sceNpGetState.sceNpEntitlementAccessGetAddcontEntitlementInfofor 13 add-on labels, twice. Each returnsNOT_FOUNDwith noanyps5-entitlements.ini.One guess I tested and ruled out: our
sceNpCheckCallbacknever calls the registered state callback. A throwaway build that delivers one initialSIGNED_OUTcallback from the first check changes nothing: the same 75 file reads (APS5_TRACE_APR) and the same draw count over 150 s.AI-assisted: yes
sktharunbalaji13-cmd commentedon Oct 17, 2026
@milescoviello Thanks for running such a detailed investigation and testing the system-service callback hypothesis. The result is useful, especially the observation that the game keeps presenting frames but appears not to advance beyond its initial state.
My investigation on Windows has reached a similar unresolved point from the rendering side: the sampled color targets remain black, and although the shader-capacity preparation failure has been addressed, I have not established that those failures caused the black output.
Your finding that asset loading stops after the initial boot resources seems particularly important. It raises the possibility that the title is waiting for a particular game-state transition or result rather than simply failing to render an otherwise active scene.
Could you share which specific guest-state transition or condition you think should trigger front-end/world asset loading, and how best to trace why it is not reached? In particular, I would be interested in a narrowly scoped trace of the relevant guest branch, polled value, or result-producing operation, rather than another broad system-service trace.
I also want to avoid conflating the Linux and Windows runs because they use different revisions and environments. For now, I am keeping the shader-preparation hypothesis separate from the question of why the game state appears not to advance.
Thanks again for sharing the evidence. It gives us a more focused direction for the next investigation.
sktharunbalaji13-cmd commentedon Oct 17, 2026
Root Cause Analysis & Technical Diagnostic Update (Ghost of Tsushima PPSA02225)
Over the past week, we conducted an in-depth execution probe and disassembly investigation into the black-screen rendering issue on Windows. Below is the detailed breakdown of the exact mechanisms causing the black screen and preventing 3D scene rendering.
1. Primary Cause: Upstream Engine Viewport Gating (
ghost-upstream.exe)Through disassembly of
ghost-upstream.exearound0x1408e4cc0, we identified that the engine manages 7 distinct rendering passes/viewports located at base address0x1416e52e0(stride0x32c40).Within the pass execution routine at
0x14068a470:At engine startup and during steady state:
(%rdi)isNULL(0x0) across all 7 viewport slots.0x140689e00is completely skipped every single frame.0x20001F3A00, reading constant FP32(0.0, 0.0, 0.0, 1.0)from guest VA0x110A64E600, writing opaque black into intermediate render target0x1500010000.0x1500010000into the active swapchain backbuffer (0x1504910000/0x1506940000).2. Secondary Emulator Defect: Host-Import Overwrite in
Texture.cppIn
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp(lines 1778–1808 and 1932–1968):scanBlocks,GuestMemory::ChangedBlocks()returnsfalseand populatesstampedBlockswithBlockWritten(1).layerOriginalis invalidated whenever the GPU renders into the texture,compareUntracked()evaluates tofalse.changed[layer]to be flagged astrueon every frame, even thoughcpuWrote == false.Refresh()initiates an asynchronouswriteBackLayers()and immediately follows withupload(&changed), which reads uninitialized / zeroed CPU memory and uploads it directly over the Vulkan image, clobbering the GPU's rendered output.3. Engine Thread Stall & System Service Polling
[SAVEDATA:native] setupMemory2 ... existed=0) and shadow seed generation, the engine spawns ~50 worker threads (JobWorker1-5,FaWorkerIo1,MovieDecoder, etc.).libkernel.prx!scePthreadCondWait -> waitUntil -> TimedWait::Condition::waitSignal.sceSystemServiceReceiveEvent, which continuously returnsSYSTEM_SERVICE_ERROR_NO_EVENT(0x80B80001).4. Display Window Focus
In
core/libs/prx/libSceVideoOut/src/DisplayWindow.cpp:63:SDL_WINDOW_SHOWN, but lacks an explicitSDL_RaiseWindow(window)or Win32SetForegroundWindow(). On certain Windows compositors and multi-monitor setups, the created window fails to take foreground focus or remains minimized/hidden behind other windows unless manually focused.Recommended Remediation Steps
Texture.cpp: Guardupload(&changed)when memory is untracked host import andcpuWrote == falseto prevent overwriting GPU-rendered backbuffers with zeroed CPU memory.ghost-upstream.exeexpects fromsceSystemServiceReceiveEvent(e.g. Resume, Focus, User Login, or Display Status).scePthreadCondSignal/scePthreadCondBroadcast) is being lost or dropped between workers and the main thread.SDL_RaiseWindowinDisplayWindow.cppto ensure the render window is brought to the foreground properly.MarcZX10 commentedon Oct 17, 2026
Thanks for adding the disassembly and draw details. For the run described here, the reported null viewport entries and two submitted draws (a fullscreen black clear followed by composition) explain the captured black output: no 3D scene draw is reported in that run. That does not establish why the viewports remain null, and it does not yet connect the earlier shader-preparation failures or the
Texture.cppupload path to the image.Could you pin this diagnostic to the exact AnyPS5 commit/build and include the trace window for those two draws? The issue has earlier captures with thousands of completed draws, so keeping the separate runs and build identities explicit is important. For the
Texture.cpphypothesis, evidence that the relevant presentation target was actually uploaded from guest memory after its GPU draw would distinguish it from the title never submitting the scene in this run. I would hold off on a code change until that path is shown.AI-assisted: yes
sktharunbalaji13-cmd commentedon Oct 17, 2026
@MarcZX100 Thanks for the precise follow-up — here is the exact commit/build identity, the draw trace window, and the evidence clarifying the
Texture.cpphypothesis versus the upstream submission state:1. Exact Commit, Build Identity & Runtime Environment
f40b6930ff156834b786730771518b3bd7fe8648(branchfix/ghost-tsushmina-black-screen) + the 6 approved modified PRX files (Texture.cpp,ShaderInfo.hpp,BindingAllocator.cpp,ResourceTracker.cpp,SrtRuntimeValidator.cpp,RuntimeAbi.hpp).803D5652517984976BB5D51A450266173B2CC92E481DEB72D6A49982D9A2C7A9.C:\dev\AnyPS5-fragment-diag-20261017at commitf40b6930ff15(TraceRevision = f40b6930ff15, DIRTY 1 with diagnostic logging only, no functional logic alterations).ghost-upstream.exe, SHA-256A13603833F7450795BDC0D718B704E188574A8D658313CCF5061C6C3C76BBCDE(65,096,704 bytes, ImageBase0x140000000).2. Trace Window for the Two Draws (First Correlated Frame Timeline)
Captured from
fragdiag-np-probe-evidence-20261017\runtime-outputs\capture-trace.log(events 519–790):packet submission=53 offset=28 header=c0012d00DRAW_INDEX_AUTO(Fill draw packet)diag-fragment index=0 value=00000000,00000000,00000000,3f800000 target=15000100000x1500010000(intermediate buffer)diag-input index=0 srt_words=(0,0,0,1.0) push_word2=e4e4e4e4 push_sel=e40x20001F3A00reads guest constant(0, 0, 0, 1.0)from0x110A64E600draw submission=53 offset=28 target=1500010000 mask=f verdict=0indices=3 instances=1 colorTarget=1)packet submission=55 offset=158 header=c0012d00DRAW_INDEX_AUTO(Composition draw packet)sampled-lookup address=1500010000 width=3840 height=2160 dcc=1501ff00000x1500010000draw submission=55 offset=158 target=1504910000 mask=f verdict=00x1504910000)flip frame=1 submission=55 offset=282 batch=11 unsignaled=0present address=1504910000 width=3840 height=21600x1504910000blit batch=15 slot=0 image=0 direct=0 -> swapchain 1152x648VulkanDevice:1717)Draw Count Reconciliation:
Regarding the "thousands of completed draws" mentioned in earlier captures:
indices=3, instances=1, shaders=2, colorTarget=1).Draw 53clear +Draw 55compose) running across ~525 presented frames. There are zero 3D scene mesh draws or UI geometry draws submitted anywhere in the log.3. Clarification on the
Texture.cppUpload HypothesisYou are completely right to pump the brakes on modifying
Texture.cpp:scanBlockslogged[gpu] storage image 0x1504910000: guest memory changed while GPU results were pending; keeping the CPU's blocksduring host-import checks, our reconstruct probe (reconstruct-0.txt) demonstrated that the presented frame was already opaque black directly out of the GPU fragment shader stage.0x20001F3A00consumes the guest-supplied constant(0, 0, 0, 1.0)at0x110A64E600(which is already populated prior to import in the guest's 64 MiB AGC buffer at0x1108000000..0x110C000000), and writes pure black to0x1500010000.Texture.cppfor this issue.4. Why the Viewports Remain Null (Upstream State)
The core reason the viewports at
0x1416e52e0remain null is upstream in the engine's lifecycle:[SAVEDATA:native] setupMemory2 ... existed=0and shadow seed setup, the title spawns its worker pool (JobWorker1-5,FaWorkerIo1,MovieDecoder, etc.).libkernel.prx!scePthreadCondWait(ntdll.dllalertable wait).sceSystemServiceReceiveEvent, receivingSYSTEM_SERVICE_ERROR_NO_EVENT(0x80B80001).MarcZX10 commentedon Oct 17, 2026
Thanks for the exact build and draw timeline. This rules out the proposed
Texture.cppexplanation for this run: both the intermediate render and composition receive black content from the guest, with no scene draws in the capture. I checked currentmainas a separate lead:sceSystemServiceReceiveEventincore/libs/prx/libSceSystemService/Export.cppvalidates the pointer and then unconditionally returnsSYSTEM_SERVICE_ERROR_NO_EVENT. That could explain a title waiting on this API, but your evidence does not yet show that the polled event is required to build the scene or that returning an event would be correct. Could you capture the caller/RVA and the event structure before the call, and (if the guest code indicates it) the branch taken afterNO_EVENT? That would distinguish a normal empty poll from a missing system-service event the engine needs.sktharunbalaji13-cmd commentedon Oct 17, 2026
@MarcZX100 We just directly tested and instrumented this in our latest 5-minute runtime observation run (Section 23b report), and the result definitively clarifies this path:
1.
sceSystemServiceReceiveEventis Not Polled by the TitleTo test whether
sceSystemServiceReceiveEventwas gating the engine, we instrumentedcore/libs/prx/libSceSystemService/Export.cpp:APS5_SYSEVENT_ONCE=<type>) to deliver a simulated active/resume lifecycle event on the first poll.fragdiag-s23-runtime-20261017) and ran a full 5-minute continuous observation withAPS5_SYSEVENT_ONCE=2.Result:
[sysevent]invocations logged across the entire 5-minute run (6,302 completed draws): 0.sceSystemServiceReceiveEventa single time.ghost-upstream.exeimports two entries from#o(libSceSystemService, PLT indices 149–150), neither is invoked during the steady-state black screen loop.2. What the Main Thread Is Actually Polling
In our sampled hang dumps (Section 20), the guest PC on the main thread was resolved to guest RVA
0xbc7c12in.elf0:This is a standard frame/present pacing loop that queries flip status and syncs against a flip counter. It is not an idle hang or exception handler.
3. Current Focus
Because
sceSystemServiceReceiveEventis completely inactive, the missing trigger lies elsewhere:[SAVEDATA:native] setupMemory2 ... existed=0. We are checking whether the title awaits an asynchronous callback or dialog event (e.g., fromsceSaveDataDialogorsceUserServiceGetEvent).0x1416e52e0remain null. We are statically tracing the writer/allocator function for0x1416e52e0inghost-upstream.exeto isolate the exact guest branch that guards viewport population.1 remaining item
sktharunbalaji13-cmd commentedon Oct 17, 2026
@MarcZX100 Will do. We are currently performing the static cross-reference and disassembly trace on
ghost-upstream.exetargeting both:0x1416e52e0): Identifying the specific function and controlling branch that allocates/populates the 7 viewport descriptor structs checked at0x14068a48f.0x31f7fc8): Tracing the non-NULL store to0x31f7fc8(which is zero-initialized at0x5c7b77) and its connection to the0xbc2e60initializer /libSceSaveDatacallback path.As soon as the writer call-sites, RVAs, and controlling branch conditions are mapped out, we will share the full trace here.
sktharunbalaji13-cmd commentedon Oct 17, 2026
@MarcZX100 Here is the complete disassembly, RVA mapping, and call-site trace resolving both the Viewport Array Writer and the Command-Buffer Submission Boundary:
1. The Viewport Array Writer (
0x1416e52e0)The 7 rendering viewports checked at
0x14068a48flive at base address0x1416e52e0with stride0x32c40:0x1416e52e00x141717f200x14174ab600x14177d7a00x1417b03e00x1417e30200x141815c60The Writer Function:
0x140683a70(RVA0x683a70in.elf0)Component System Registration
0x140683a70is not called via directcall rel32; it is registered as the component constructor/setter in the engine's Component Dispatch Table at file offset0x15b1678(VMA0x1415b4e78in.elf4):0x2bc(700, Camera / Viewport Component).0x140683a70(populates[0x1416e52e0 + index*0x32c40]).0x140683b90(at VMA0x1415b4e98, clears[0x1416e52e0 + index*0x32c40]back to0x0).When the game instantiates a Camera/Viewport entity in the scene, component
0x2bcis registered, writing the non-null pointer into[0x1416e52e0]. At startup, the game has not yet instantiated any scene camera entities because the title has not advanced past the initial save-data / boot state into the active world.2. The Command-Buffer Submission Boundary & Return Address
In our driver submission trace (
s24build), the submission of the black fill buffer (0x110a646600, size 36 dwords, containing Draw 53 at cursor 28) produced:The Submission Call-Site:
0x14074b7ee(RVA0x74b7eein.elf0)With module load base
0x7ff67c570000, runtime address0x7ff67ccbb7f4maps exactly to.elf0RVA0x74b7f4:This loop at
0x14074b750–0x14074b7f4iterates over all built DCB command buffers for the current frame. Because no viewports are registered, the only buffers present in the submission list are the clear pass DCB (0x110a646600) and the compose pass DCB.3. The Counter Table (
0x1431f7fc8) & Producer0x1431f7fc8points to a 32-byte strided table of synchronization counters (shl rax, 0x5).0x14074b1e6and the frame pacer at0xbc7bb0poll[0x1431f7fc8 + slot*32]untilcounter >= bound.Stores into
[0x1431f7fc8 + slot*32]are executed at0x1403e2e1dand0x1405c8012:0x14053f368and0x140f315f8, which interface with thelibSceSaveDatacompletion chain.Conclusion & Next Boundary
The pipeline from command buffer generation$\to$ DCB submission $\to$ GPU execution $\to$ flip is functioning without defect. The fact that the viewports at
0x1416e52e0remain null is because Camera Component0x2bchas not yet been registered by the game world. The title's state machine is holding back camera instantiation pending resolution of the initial save-data / start-up task sequence.sktharunbalaji13-cmd commentedon Oct 18, 2026
End-of-day update: hardware/software context, and the logs behind today's findings
Two days of bounded experiments on this title. Status unchanged: black frames persist, no root cause, no fix proposed. What improved is that several earlier observations can now be classified, and the logs below are the proof for each. A fuller narrative version of this is in the discussion #4461.
All excerpts are trimmed copies; full logs are retained locally per experiment.
Build/revision context (results do not transfer across these)
app.exe5a9fd879…129282, 126.prx1d0537772,app.exe7bd003eb…402852,libSceAgcDriver.prx6dde73c8…ace66e, 127.prxa5cdfa9e4(not a descendant of1d0537772; 31 audio files differ)eboot.bin.esbakab0e3fbc…951d52, unmodifiedHost: Windows 11 26200, 15.29 GiB RAM, RTX 4060 Laptop + AMD iGPU, MinGW-w64 (WinLibs) + Ninja.
1. The fork's default bindless image heaps regress a title that works on v0.1.2
Control title (Dreaming Sarah, PPSA02929), same staging and same window-capture code in every cell; only the executable/library set and one variable differ:
APS5_SYNC_PREPARE_AT_USE=1APS5_NO_BINDLESS_HEAPS=1libSceAgcDriver.prxCell E proves the fork libraries are an interdependent set (single-PRX cross-revision swap is not valid):
And the fork's bindless path is active by default in both titles:
For Ghost, the same knob changes nothing (still black, identical reads) — so Ghost's failure is not the bindless path, but the fork cannot be treated as a drop-in runtime either.
2. The 25 shader-preparation failures are not on any draw path (480 s fork run, bindless off)
Counts and the decisive negative:
[shader-list]recorded 24 states reached by a draw or dispatch — disjoint from the failing 19.could not be prepared after registration: … GetImageResource dword 0 is not a valid runtime value.Conclusion recorded: a real recompiler defect, but on these runs it never reaches scene draws, so a fix cannot be shown to produce pixels.
3. The host-import refusal counter is one range retried ~57,000 times
0x98600000= 2,438.0 MiB;140,102,236 ÷ 57,482 = 2,437.3 MiB— the same range every sample.host import of 0x…+0x… failed at …; falling back to copies= 0 occurrences.fallbacks: idle 37, completions 0, not imported 0, undecodable 0.So: 57k refusals ≠ 57k missing resources.
4. One concrete skipped draw (guest format 56 sampled through an sRGB-forcing sampler)
The draw is not submitted. Caveats:
reportSkipprints one line per distinct reason, so this does not count occurrences;APS5_TRACE_SKIPS=1(existing) would. Recurrence is currently unmeasured.5. Audio: the earlier "audio never runs" negative was run-specific
A hang dump of the official
app.execontains a live SDL playback thread:In the audited source the only path creating that thread is
sceAudioOutOpen → openDevice → SDL_OpenAudioDevice, and SDL names itSDLAudioP<id>— so a port open succeeded in that run, while two earlier runs withAPS5_TRACE_AUDIOOUT=1 APS5_TRACE_AJM=1logged none. Both facts stand; the negative was configuration-specific.The 480 s audio probe could not answer the remaining question — it was safety-stopped during startup:
Before the stop it had reached guest entry, a dozen guest threads, startup file opens and a 1152×648 swapchain — not the content phase. Its zero audio/APR/AJM/shader counters are therefore inconclusive, not a negative.
6. Unknown sysmodule
0x127The guest passes the constant
0x127, checks the result and takes its success path.sceSysmoduleLoadModuleonly increments a counter and returns 0 for unknown ids; the API that maps a host module (sceSysmoduleGetModuleHandleInternal) throws, and no throw occurred. The id is absent from every table examined (285 entries, including HEAD), and the same message occurs in the PAC-MAN report (#3443 item 4, "I do not know what 0x127 is"), where the title boots, renders and plays audio. #2541 maps only0x110.Recorded as a table gap with no demonstrated effect; no mapping was invented.
7. Also worth reporting: the fork build needed MinGW on the Windows PATH
The default build failed only on the relinker's resource step:
windresspawns its preprocessor by bare name, soC:\winlibs\mingw64\binmust be on the Windows PATH (an MSYS-onlyexport PATHis not enough). After that, 921 targets and all 127 PRX build cleanly.8. Prepared, statically validated, not runtime-tested: opt-in audio lifecycle logging
New gate only, off by default:
APS5_TRACE_AUDIO_LIFECYCLE. Existing gates untouched (0 occurrences in added/removed lines).libSceAudioOut/src/AudioOut.cpplibkernel/Apr/src/Apr.cpplibSceAjm.native/src/Ajm.cppAdds: init/open/close events with result+duration; per-call counters only (submissions vs null-drain, per-port counts, total/max duration) with 10 s summaries; drain/pacing accumulation; a rate-limited
drain_capevent recording bytes discarded before the existing 200 ms clear; APR_waitSubmittedtiming with the queue's ownsubmitted/completed/id, individual records only ≥ 1 ms (≤ 8 per 10 s); AJM per-batch id/jobs/duration + per-kind totals, honouring inline execution;tidfromstd::hash<std::thread::id>.Shape:
[audiolc] t=<sec> tid=<id> sub=<audioout|apr|ajm> ev=<event> <k=v…>.Validated:
git apply --check(also--whitespace=error-all), disposable-copy apply (identical, CRLF preserved), and-fsyntax-only -std=gnu++20 -Wformat -Werror=formatfor all three TUs with each target's real CMake defines/includes.Not compiled to objects, linked, installed or run. sha256
b8c42d3f5d76c904b61b980aa409e6fec1f950194d6fc6594d322ee0e9888719. It does not address the black frames.9. What is still not established
0x127, the import budget or audio are causal for the black frames.10. Next
Success criterion unchanged: recognizable in-game visuals persisting for five continuous minutes. Full logs available on request.
milescoviello commentedon Oct 18, 2026
@sktharunbalaji13-cmd sorry for the slow answer. I don't know which transition it is. What I have narrows it down without naming it:
sceVideoOutIsFlipPending, and all ten job-pool threads sleep on the same condition variable. So no job is ever queued that would load front-end or world data. The decision not to load is made on the main thread, inside that loop.How I'd trace it, narrowly:
sceVideoOutIsFlipPendingloop) and disassemble it to find the branch that decides whether to post the next load job. In a boot state machine that is usually a compare on a small state or phase integer near the top of the frame function.watch -l) on that state variable. If it never changes, step back to the compare that guards the transition and read what it tests. That is often a flag written by another subsystem, or a value the GPU writes, such as a label a compute dispatch sets.APS5_STORE_AT_FLIP=1didn't change the frames, but it doesn't cover labels a compute job writes and the CPU polls.I can do step 1 on Linux if you'd like. Say if you already have the frame function's address.
AI-assisted: yes (Claude Code)
MarcZX10 commentedon Oct 18, 2026
Please do step 1 on Linux. I don't have the frame-function address from your samples. A useful result would be the function VA, the disassembly around the branch that posts the next load job, and the state/flag value tested there at the stalled frame. Please include the exact build and input timeline for the capture so we can compare it with the black-output run. That should identify the next trace point without assuming the GPU or shader failures are causal.
milescoviello commentedon Oct 18, 2026
@MarcZX10 will do. I'll use
main13e48ed (before #6112, so #7636's start-up abort can't interfere) with no other PRs, and the scripted pad inputrun_title.shuses. I'll record the exact press timeline. At the stalled frame I'll sample the main thread's guest stack under gdb, dump the frame function and its callees, and identify the branch that would post the next load job and the value it tests. The function VAs will be relative to the convertedeboot's base, so they compare across runs. I'll post it here with the build and input timeline.AI-assisted: yes (Claude Code)
milescoviello commentedon Oct 18, 2026
@MarcZX10 here's step 1 so far: the frame function is located. The branch inside it isn't pinned down yet.
Build and input.
main13e48ed with no other PRs, Linux, RTX 4070 Ti (595.99.02). PPSA02225 converted from the same dump as my earlier runs, warm shader cache, 120 to 150 s. Pad input starts at 8 s: cross, down, cross, options, cross, right, cross, up, circle, cross, one press every 1.5 s, repeating. Black frames as before.Main thread, sampled at 70, 90, 110 and 130 s, then 80, 95 and 110 s in a second run. It's at the same PC every time,
app.elf+0x73bb62. Addresses areapp.elfvirtual addresses, i.e. offsets in the converted eboot. gdb can't unwind there (no unwind info), but the functions keep frame pointers, so I walked therbpchain. It's identical in all three samples:0x738950(0x1a00 bytes of locals,r13= a display object starting3840, 2160)0x73bb620x112cf60with[r13+0x14](thesceVideoOutIsFlipPendingpattern) while 2 or more flips are pending, busy-waiting onrdtscup to a 30 or 60 FPS deadline0x8c7a80, about 53 KB0x8d4d550x67a470on0x17a43e0,0x17d7020and0x1809c60, then0x67a370, then0x738950. After present it flips the buffer index at0x31ebd880x8c7a600x8c7a70for (;;) frame();0x8c14200x8c4453So the decision to post load jobs is in
0x8c7a80's body, before the present call. It isn't in the pacing loop, which only waits on flips.Next step. One-shot breakpoints on every direct call in
0x8c7a80for one frame, recording which call sites run and which don't. The ones that never run include the load-posting path. I'll then read the compares guarding them and their operands at the stalled frame, and post the guard's address, its disassembly and the value it tests.AI-assisted: yes (Claude Code)
milescoviello commentedon Oct 18, 2026
@MarcZX10 @sktharunbalaji13-cmd step 1 is done. Ghost waits in boot phase 0, and the guard that would move it to phase 1 tests the PSN sign-in state. AnyPS5 always reports that as signed out.
Same build and input as above (
main13e48ed, no other PRs). Addresses areapp.elfvirtual addresses.Correction to my last comment first. I wrote some addresses in file-offset space, 0x4000 above their virtual addresses: the pacing import is at
0x1128f60, not0x112cf60, and the globals I listed are at0x17a03e0,0x17d3020,0x1805c60and0x31e7d88. The function addresses were correct. Every address below is a virtual address. I named the imports by computing NIDs from the names in AnyPS5's sources, which covers 561 of the 645 jump slots.0x1128f60issceVideoOutIsFlipPending, as guessed.Coverage. Over one full frame at the stalled state (90 s), 147 of the frame function's 794 call sites run. The imports that never run include
sceSystemServiceHideSplashScreen. The game calls it once a boot step completes, and on its first call only (guarded by a flag at0x16d2fc4).The phase. The frame function (
0x8c7a80) copies a requested phase from0x1bb44b8into a current phase at0x1bb4510(at0x8c8cee-0x8c8d08). Its boot state machine at0x8cc87b(state0x1bb2f28, a jump table at0x137da80) leaves state 0 only when the current phase is 6 (0x8cc89d:cmp $0x6,%eax). Under gdb from launch, with hardware write watchpoints on the requested phase, the current phase and the state, 180 s:0x870127) and 0 at 2.9 s (0x8c7096).The guard. Apart from the callback below, the only instruction that stores a nonzero requested phase is in start-up (the other direct store,
0xbb0e03, is a 64-bit initialization):At
0x8c6cb0, whichever way the check went, it registers an NP state callback (0xbb1150, user data0x1bb4430, so the phase is its field+0x88) and a reachability callback (0xbb11c0). The state callback does the same thing: state 2 sets the phase to 1 if it's 0 or 5, and state 1 resets it to 0:sceNpGetStateinlibSceNpManager/Export.cppalways storesNP_STATE_SIGNED_OUT(1), andmain's callbacks deliver 1 too. So the test at0x8c6c6ffails at start-up, no callback can ever pass it, and the phase never leaves 0.What I haven't shown is that signing in is enough. Phase 1 may need more online answers. To check, I've queued a throwaway build of the same
mainwithsceNpGetStatereturning 2, with the same watchpoints plus a plain run that traces file reads, draws and frames. I'll post what it does. If it gets further, the decision for AnyPS5 is how a signed-in state should be reported while the online calls (sceNpGetAccountIdA, reachability) still fail. That's for the maintainers rather than for me to pick in a PR.AI-assisted: yes (Claude Code)
milescoviello commentedon Oct 19, 2026
@MarcZX10 @sktharunbalaji13-cmd the two throwaway builds I queued. Same base (
main13e48ed), title, input and watchpoints as above, 180 s each. Neither change is meant for a PR as is.1.
sceNpGetStatereportsSIGNED_IN(2). The start-up check passes and the requested phase becomes 1 at 2.9 s. Then thread 71, Ghost's NP worker (0xbb1200), runssceNpCheckNpReachabilityand sets phase 5 in the same moment. The phase stays 5. That call's result goes through a jump table at0xbb1340. For0x80550003,05,06(SIGNED_OUT, AnyPS5's current answer),07,0c,12,14and18it sets phase 5. Other nonzero results also set 5 and pass the code to0xcbc820. A result of 0 sets phase 6.2. Also
sceNpCheckNpReachabilityreturns 0. The NP worker sets phase 6 at 3.05 s. The frame function copies it to the current phase, and the boot state machine leaves state 0 for state 1 (0x1bb2f28= 1, written at0x8cd630). That's the first time it gets past state 0 in any of my runs. Then it stops again, at the same 75 file reads and 2 draws per frame asmain.Where it waits now. State 1 (
0x8cce40) checks two things:[0x1bb3fc0]becomes 1, or when a counter at0x371d59creaches the deadline in0x1bb3f88.[0x1bb3fc0]holds -1 while something is pending.0x1bb3fc4is set and that counter reaches0x1bb3f84.Only the game's own code writes
[0x1bb3fc0]: 1 at0x7076f2(after0x703780) and at0x708aa3, 0 at0xeb07cf.[0x1bb3fc4]is written at0xeb07f6. No imports are next to those writes, so the next gate isn't another NP answer, or not directly. I'll take the same per-call coverage of the frame function in state 1 to see which of those paths ever run.What this means for AnyPS5. Ghost's boot needs a signed-in user whose PSN reachability check succeeds. With AnyPS5's consistent "signed out, PSN unreachable" answers, it waits in phase 0 forever. Ghost can be played offline on a console, so a console without a network presumably reports something this code accepts. Which values a real offline console returns from
sceNpGetStateandsceNpCheckNpReachabilityis a console measurement I can't make here. That, and whether AnyPS5 should report a signed-in, reachable user, is the maintainers' call.AI-assisted: yes (Claude Code)
milescoviello commentedon Oct 19, 2026
@MarcZX10 @sktharunbalaji13-cmd a correction to my last two comments, and what actually holds Ghost back.
Correction. The state machine at
0x1bb2f28isn't Ghost's boot flow. Its state names come from the table at0x1467ec0(Offline, Idle, Query, Submit): it's the game's online cloud-data service, and the NP sign-in and reachability answers only drive that service. Withmain's answers (signed out, unreachable) it stays Offline, which an offline boot doesn't mind. So the two NP changes in my last comment aren't needed, and neither PR below touches NP.The stop is PlayGo. At start Ghost reads its own chunk map,
cache_ps5/playgo.pgm. It then asksscePlayGoGetChunkIdfor up to 1000 ids, builds a set from them, and keeps only theplaygo.pgmentries whose chunk is in that set (0xb76f00to0xb773f5). This dump has onlysce_sys/playgo-scenario.json. For that layout AnyPS5 already answers every chunk id as installed, butscePlayGoGetChunkIdlisted only chunk 0. So nothing in the other chunks was ever marked installed or read: that's the 75-read stall.main's NP answers, Ghost reads its English audio and music archives b and c, and streams its splash movie (movies/cutscene/splash_america.bsf, H.264 throughsceVideodec2).AGC graphics: stencil replacement 0x40 against test value 0xff (masks 0xff/0xff) is unsupported: anEQUAL0xff test whose pass operation isREPLACE_OPwith 0x40. fix(agc): draw a stencil replacement against a known stencil value as an inversion #7725 draws that as anINVERTof the bits that differ (0xbf), which is exact because the test fixes the stencil value at 0xff wherever the operation runs.With both, it gets past the splash screen and stops 41 s in at the next check: a depth-only, alpha-tested pass (
KILL_ENABLE) withPS_ITER_SAMPLEinto a one-sample depth target under a 2x rasterizer withoutMSAA_ENABLE. Since every sample sits at the pixel center there, the per-sample invocations see the same inputs. I have a change that draws such a pass once per pixel in testing now, and I'll post where Ghost gets with it.For comparison, on
main43797ca alone Ghost runs 301 s on those 75 reads, and all 40 frames I dumped are black.AI-assisted: yes (Claude Code)
dantdmdarealguy commentedon Oct 22, 2026
Windows data point on current
main4777cac: a clean build with no local changes. Windows 11 Pro, Intel Core i9-14900K, 128 GB, NVIDIA GeForce RTX 5080 (driver 32.0.16.1742), WinLibs GCC 15.2.0, Release. Ghost of Tsushima DC (PPSA02225) 02.024.000.relinker --windows --registry --module-dir prospero source/eboot.elf app.exe. The eboot importssteamnetworkingsockets.prx, which the title ships inprospero/. Without--module-dir prosperoit stops at load withFailed to load module ... steamnetworkingsockets.prx, error 126.maina6dcea9 (feat(agc): import cleared native multisample D32S8 targets and whole HTILE fills #6300). The black frames this issue describes are now the frames before that refusal.main+ fix(agc): import native multisample D32S8 targets with a separate stencil plane and a depth-only HTILE #9533 (514643a) it stops at +6.7 s onnative multisample depth or HTILE aliases a multisampled colour target whose samples are only on the host. That followsnative multisample depth 0x1544ed0000+0x1fe0000 aliases multisampled colour target 0x1544ed0000+0x1fe0000 (vk format 100, 2 samples), newest clear 0x00000000 ..., the same as on Linux. fix(agc): import native multisample D32S8 targets with a separate stencil plane and a depth-only HTILE #9533's author has announced a follow-up for this.native multisample depth sampled identity or format mismatch, which feat(agc): sample the stencil plane of a native multisampled D32S8 target #9717 covers. With fix(agc): import native multisample D32S8 targets with a separate stencil plane and a depth-only HTILE #9533, feat(agc): sample the stencil plane of a native multisampled D32S8 target #9717, fix(agc): copy a linked pipeline's color sample counts only when it has color attachments #7985, feat(agc): draw one-sample color targets beside a multisampled depth target with sample 0's coverage #8115 and fix(agc): draw a PS_ITER_SAMPLE program once per pixel into a one-sample color target #8121 merged plus that experiment:Ruled out on this machine: no
host import budgetrefusal, and noWAIT_REG_MEMtimeout. The dump is unchanged after the runs. Logs are available on request.EagleBearerYS commentedon Oct 22, 2026
@dantdmdarealguy thanks for the Windows runs of Ghost of Tsushima Director's Cut (PPSA02225), and for taking it past the alias stop to see what follows. The follow-up for that depth-plane alias is up as #9742, stacked on #9533. It accepts the colour target over the depth plane only where the depth-only HTILE proves every tile against
DB_DEPTH_CLEAR, so depth reads the clear value there, never the plane's bytes. A draw or clear into that target afterwards still refuses. If you can run #9742's head (219e925) in place of your local skip, with #9717 and the other PRs as before, we'd like to know whether it reaches the mask screen the same way. #9742 and #9717 are both on #9533's 514643a, and merging them together only meets in adjacent lines (the test registrations, the test file and the debt entry), where keeping both sides resolves it.MarcZX10 commentedon Oct 22, 2026
The Windows run on #9533 reaches the depth/HTILE alias refusal, and #9742 is the targeted follow-up now stacked on that base. Could you post the same launch path and stopping point on #9742 head
219e925509, with #9717 and the other stated prerequisites held constant? Please include whether it reaches the mask screen and any new refusal; that will test the proposed clear-only alias boundary without treating the local skip as a fix. AI-assisted review.milescoviello commentedon Oct 23, 2026
@MarcZX10 for the Linux side of that question: I've run Ghost of Tsushima Director's Cut (PPSA02225) on #9742's head
219e925509, then with #9717 and my PRs added, all with release libs, warm and cold (RTX 4070 Ti, 20 GiB cap):219e925509: the depth-plane alias is accepted, then it stops atnative multisample depth sampled identity or format mismatch, the stencil-plane read feat(agc): sample the stencil plane of a native multisampled D32S8 target #9717 covers.test/ghost-9742-9717(with #9717): no native depth or stencil refusal; 246 s warm and 254 s cold, thena color target's sample count differs from the rasterizer's, which feat(agc): draw one-sample color targets beside a multisampled depth target with sample 0's coverage #8115 handles (now merged).Since then, with #8213, #8608 and #9318 added as well, a 40-minute run got past the brightness screen into the opening cinematic. It was then killed by the 20 GiB memory cap at 1622 s, while building the opening's pipelines. Memory is the next stop on Linux, not a refusal.
AI-assisted: yes (Claude Code)
dantdmdarealguy commentedon Oct 23, 2026
@EagleBearerYS thanks, will do: I'll run #9742 at 219e925 in place of the local skip, with #9533, #9717, #7985, #8115 and #8121 as before (cold and warm, 600 s each) and post the result here. It'll be after the 25th, when my test machine's queue resumes.