Record why the menu soft focus covers only the in-game menu - #2
Merged
Conversation
The soft focus was extended to the connection dialog, the level-loading screen, and the console. All three are 2D-only frames, which required dropping the backEnd.doneSurfaces gate in every backend. That gate is not just naming a scene: it is the only signal a backend has that the render target holds something the composite may read back, and nothing else in any of the three renderers post-processes a frame without it. Removing it faulted the device inside the ICD on the first connect screen. Those layers are withdrawn and the guards are restored, so the executable behaviour matches 8f79c27 again. What is kept is the reasoning, in the code and in MENU_SOFT_FOCUS.md, so the guards are not read as redundant and removed a second time: - backEnd.doneSurfaces in all three backends. - vk.cmd->last_pipeline = VK_NULL_HANDLE in both Vulkan backends. vk_menu_blur_draw binds descriptor set 0 through vk.pipeline_layout_post_process, and binding through an incompatible layout disturbs the sets bound for vk.pipeline_layout. Nulling the cache is what forces the next draw to rebind them; handing the frame's pipeline back instead faults the device the same way. - The console cannot be a layer at all. It is the only one that finishes the frame's own post-processing via re.FinishBloom, and neither ordering around that call works: before it, bloom's blend-pass descriptors are still bound when the console draws and it does not appear; after it, the Vulkan backends sit in RENDER_PASS_POST_BLOOM. Either ordering also composites over live gameplay while the request fades out, which dims the warmup ready-up prompt. Source gates now hold all of that, so a future change has to argue with a failing test rather than with a comment. cl_menuBlur's cvar help and the changelog no longer promise the withdrawn layers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
A behaviour-neutral change. Executable behaviour is identical to
8f79c27; the diff is guard comments, source gates, cvar help, and docs.I extended
cl_menuBlurto the connection dialog, the level-loading screen, and the console. All three broke the game. This PR withdraws them and records why, so the guards that prevent them are not read as redundant and removed again.Why the extension failed
All three are 2D-only frames, which meant dropping the
backEnd.doneSurfacesgate in every backend. That gate does more than name a scene: it is the only signal a backend has that the render target holds something the composite may read back, and nothing else in any of the three renderers post-processes a frame without one. Removing it faulted the device inside the ICD on the first connect screen — before the loading screen was even reached.The console failed separately and for its own reason. It is the only layer that finishes the frame's own post-processing, calling
re.FinishBloomfrom insideCon_DrawSolidConsole, and neither ordering around that call works:RENDER_PASS_POST_BLOOM, which targets an attachment the pyramid does not sample.Either ordering also composites over live gameplay for the 140 ms the request takes to fade out after the console closes, which dims the warmup ready-up prompt for no reason the player can see.
A third failure is recorded from the same work:
vk_menu_blurmust leavevk.cmd->last_pipelineasVK_NULL_HANDLE.vk_menu_blur_drawbinds descriptor set 0 throughvk.pipeline_layout_post_process, and binding through an incompatible layout disturbs the sets bound forvk.pipeline_layout. Nulling the cache is what forces the next draw to rebind them. Handing the frame's pipeline back — which looks like the tidier mirror of whatvk_bloomdoes for its own binds — faults the device the same way.What changed
backEnd.doneSurfacesrestored intr_arb.cand bothvk.c, each with the reason inline.vk.cmd->last_pipeline = VK_NULL_HANDLEdocumented as load-bearing in both Vulkan backends.cl_menuBlur's cvar help and the changelog no longer promise the withdrawn layers.MENU_SOFT_FOCUS.mdgains a "what cannot be softened, and why" section covering the connect/loading screens, the console, and the pre-existing cgame-overlay limitation.Gates
tests/menu_blur_source_tests.pynow fails if any of it regresses: all three backends must testdoneSurfaces, both Vulkan backends must nulllast_pipeline, the client must request exactly one layer with no client-sidere.FinishBloom, and the settings slider's bounds must match the cvar'sCvar_CheckRange. A future change has to argue with a failing test rather than with a comment.For the reviewer
fix/external-lightmap-paritybranch, which is committed locally and not pushed.🤖 Generated with Claude Code