Skip to content

feat(agc): draw point lists on the vertex path with their point size - #6639

Closed
milescoviello wants to merge 6 commits into
boykopovar:mainfrom
milescoviello:feat/vertex-point-lists
Closed

milescoviello wants to merge 6 commits into
boykopovar:mainfrom
milescoviello:feat/vertex-point-lists

Conversation

@milescoviello

@milescoviello milescoviello commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

What

OliSe Player (PPSA01153) picks a random MilkDrop preset. With two of its own presets, Che - Escape and Stahlregen + Geiss + Martin - Ouboros (Metal Finish 2), it stops on main 19 s in:

[gpu] driver failure: layer, viewport or auxiliary vertex exports is unsupported (register 0x207 = 0x01210000)

The draw is a point list (VGT_PRIMITIVE_TYPE 1) on the vertex path (VGT_SHADER_STAGES_EN 0x2012010). PA_CL_VS_OUT_CNTL 0x01210000 sets USE_VTX_POINT_SIZE, VS_OUT_MISC_VEC_ENA and VS_OUT_MISC_SIDE_BUS_ENA, so each point's size comes from the X of the misc position export. main accepts USE_VTX_POINT_SIZE only when nothing is drawn as points (#4715). Past that check it would also refuse the draw itself: point-list vertex rendering requires point-size output support. Point lists are drawn only through the geometry path on main.

How

  • Decode. A point list with GS_EN and HS_EN clear decodes as a vertex-path point list, and USE_VTX_POINT_SIZE is accepted on it. PA_SU_POINT_SIZE and PA_SU_POINT_MINMAX are read as half sizes in 12.4 fixed point (a field of 8 is one pixel), the units radeonsi programs. The draw precheck accepts the same bit.
  • Shader. The vertex program writes PointSize. It starts as the PA_SU_POINT_SIZE height. When USE_VTX_POINT_SIZE is set, the misc export's X replaces it, clamped to PA_SU_POINT_MINMAX. The recompiler already mapped that component to gl_PointSize, but the driver never passed bit 16 through. The point state goes into the recompile request as four new vertex fields at the end of the request (version 33; feat(agc): draw line-strip output of NGG geometry programs as mesh lines #5884 took 31 and feat(recompiler): run single-wave wave64 compute programs at one lane per invocation on 32-lane hosts #5405 took 32 on main), and into the cache key, the draw register key and the draw lookup. Shader validation accepts a PointSize output for these draws.
  • Device. largePoints is enabled when available, and a point draw whose size can differ from one pixel requires it.

Vulkan needs a PointSize above zero, so a register size of 0 without USE_VTX_POINT_SIZE and a clamp maximum of 0 with it throw, and the clamp's lower bound is at least the smallest positive float. An exported size of 0 or less, which a clamp minimum of 0 lets through, draws as the device's smallest point. radeonsi programs that minimum for multisampled and sprite points.

Also refused: a register size whose width and height differ, a clamp minimum above its maximum, USE_VTX_POINT_SIZE without VS_OUT_MISC_VEC_ENA, and point sprite texture coordinates (SPI_PS_INPUT_CNTL PT_SPRITE_TEX or PT_SPRITE_TEX_ATTR1 while SPI_INTERP_CONTROL_0.PNT_SPRITE_ENA is set). Nothing on main checks those coordinates, so a point draw that used them would otherwise render wrong silently. The geometry path is unchanged.

Three choices are inferred, not measured. The clamp applies to the exported size but not to the register size, because radeonsi sets both clamps to the register size when the size isn't per vertex. Sizes outside the device's pointSizeRange are clamped by the device. On the console, a point whose size is 0 or less probably covers nothing; here it draws as the smallest point. Both are in the technical debt file.

Tested

Linux (Ubuntu 24.04, GCC 13.3, Release), RTX 4070 Ti, NVIDIA 595.99.

  • agc_driver_vertex_point_size (new, GPU). It draws four points through the recompiler and checks that each one is an exact square of the expected side, in place: register sizes 1, 4 and 3 (the last ignoring a [6, 8] clamp), and exported sizes 2 inside [1, 8], 6 clamped to 4, 1 clamped up to 5, and 6 inside [1, 8] over a register size of 1. Exported sizes 0 and -3 with a clamp of [0, 4] cover at most one pixel (one on NVIDIA). With main's SpirvModuleEmitter.cpp and ShaderInfoCollector.cpp, the size-4 case draws one-pixel points and fails.
  • agc_driver_graphics: Che's registers decode as a vertex point list of one-pixel points, pass the precheck, and give the vertex stage bit 16. A register size decodes in diameters and doesn't turn on bit 16. A triangle draw gets no point size. The refusals above throw, including the two zero sizes. A zero register size with USE_VTX_POINT_SIZE, a zero clamp minimum, and a zero clamp without it still decode. PT_SPRITE_TEX passes with sprites off. The case of the existing inactive-point-size test that expected this point list to be refused now checks a point list on the geometry path instead, which is still refused. These tests use the new state fields, so they don't build on main.
  • request_serializer: the upgrade fixtures now expect version 37 and the new tail, and a point request round-trips and rejects a truncated tail.
  • Those three and agc_driver_inactive_vertex_point_size and agc_driver_zero_position_vertex pass 3 of 3.
  • Rebased onto main eb901bc (10-16, with fix(agc): journal the mesh output primitive size #6784). feat(agc): draw line-strip output of NGG geometry programs as mesh lines #5884 had taken request version 31, so the point fields moved to 32 (3069ed8): agc_shader_memory expects 32 for new requests and rejects 33. Pipeline creation and SPIR-V validation read the point state, so the pipeline journal now carries vertexPoints and the three sizes, the State guard names its new size and the journal format becomes 4 (3ddbd21). A point-list recipe must decode with its sizes in agc_pipeline_journal. ctest (^agc_driver_|^agc_vertex_barrier|recompiler|shader_cache|request_serializer|spirv|^agc_shader|bda|journal, 502 tests, with test(agc): keep the vertex terminate case's code in static storage #6789's one-line test fix applied so agc_driver_graphics reaches this PR's cases): 501 pass. agc_driver_store_over_untracked fails the same way on main; test(agc): keep waiting for the neighbour copy case's result #6385 addresses it. My earlier regex left out agc_shader_memory, which this PR had broken; screamm found it.
  • Rebased onto main 1b1f848 (ea05b78), now with feat(recompiler): run single-wave wave64 compute programs at one lane per invocation on 32-lane hosts #5405, which took request version 32 for spanned waves. The point fields now come with version 33, after that flag (7a3f62e): agc_shader_memory expects 33 for new requests and rejects 34, and the request_serializer fixtures append the spanned-wave byte before the point tail. agc_driver_vertex_point_size, request_serializer and agc_driver_graphics pass 3 of 3. Of the 898 area tests (the regex above plus ^guest_|libc), all pass except main's agc_driver_store_over_untracked and guest_kernel_fcntl; the latter aborted once under ctest -j4 and passes on its own.
  • Rebased 10-22 onto main 895f47f (0116102). feat(agc): draw one-sample color targets beside a multisampled depth target with sample 0's coverage #8115 took journal format 7 and sizeof(State) 808, so this PR's journal format moves to 8 and the State guard to 824 (808 plus the 16 bytes of point state). 8 is the number feat(agc): rasterize geometry points with their point size #6801 has in the queue; feat(agc): rasterize geometry points with their point size #6801 carries these six commits and changes no other journal field, so both claim 8 for the same fields. Request version 43 is still free (main writes 42). Pipeline.cpp keeps feat(agc): draw one-sample color targets beside a multisampled depth target with sample 0's coverage #8115's truncated-coverage check next to this PR's point-size check. The 14 tests matching ^request_serializer$|^agc_shader_memory$|point|journal|^agc_driver_graphics$ pass 3 of 3; with the Khronos validation layer (1.4.363), main passes 11 of 11 and this head 12 of 12 with no VUID on either side. On Windows (Windows 11 VM, GeForce GT 1030 with NVIDIA R580, WinLibs GCC, Release, ANYPS5_REQUIRE_VULKAN=1), the 15 tests matching the same regex pass 3 of 3 on this head.
  • Rebased 10-21 (later) onto main 275e896 (3ccf38f). feat(agc): draw point and line polygon modes #7869 took journal format 6 for its polygon modes, so this PR's journal format moves to 7. sizeof(State) stays 800 with feat(agc): draw point and line polygon modes #7869's field. The debt file keeps feat(agc): draw point and line polygon modes #7869's "Point and line polygon modes" entry next to this PR's "Vertex-path point lists". request_serializer, agc_shader_memory, agc_driver_pipeline_journal, agc_pipeline_journal, agc_pipeline_journal_long_paths, agc_driver_graphics and both point-size tests pass 2 of 2.
  • Rebased 10-21 onto main b6fe513 (fb7eea8). fix(agc): keep the guest's sample order where pixel (0,0)'s locations stand in for a 2x2 grid #6683 took request version 42 for the pixel sample order, so the point fields move to 43, after it:
    • New requests write 43, the point tail is read if (version >= 43u), and 44 is rejected. agc_shader_memory's base64 prefixes for the new and the rejected version follow.
    • A version 42 vertex request from main has no point tail and reads without point state.
    • The merged hull case in request_serializer now round-trips a version 43 request with point state. It cuts the 13-byte tail for version 42, then removes the 16-byte sample order of the pixel fixtures for version 41, then drops the denormal flag for version 39. The merged hull flag is kept, and point state reads as defaults, at each step.
    • The pipeline journal format was still 6 then (main had 5).
    • request_serializer, agc_shader_memory, agc_driver_pipeline_journal, agc_driver_graphics and both point-size tests pass 3 of 3.
    • ctest -R '^agc_|^request_serializer$|^shader' passes 865 of 868. The 3 failures are fix(agc): keep the guest's sample order where pixel (0,0)'s locations stand in for a 2x2 grid #6683's new agc_driver_sample_order, agc_driver_sample_order_grid_reference and agc_driver_sample_order_recipe_depth_locations. They fail the same way on main b6fe513 on this RTX 4070 Ti, 2 of 2 each, with the same messages.
  • Rebased 10-20 (evening) onto main 57fdffd (a31abee). feat(shader): request DenormPreserve 32 where the device preserves f32 denormals #8697 took request version 41 for its f32 denormal-preserve flag, so the point fields move to 42 and come after that flag: new requests write 42, the point tail is read if (version >= 42u) after the version 41 flag, and 43 is rejected. A version 41 vertex request from main has no point tail and reads without point state. The merged hull case in request_serializer (as @JJenkx asked) now round-trips a version 42 request with point state, cuts the 13-byte tail for version 41 (point fields read as defaults, merged hull kept), then drops the denormal flag for version 39. main's version 40 case for the denormal flag stays. The pipeline journal format is 6 (main has 5, from perf(agc): data-only draw hits compare only the user words a stage reads #5656). ctest -R '^(agc_|shader_|request_)' passes 853 of 853, and request_serializer, agc_shader_memory, agc_driver_pipeline_journal and agc_driver_graphics pass 3 of 3.
  • Rebased 10-20 onto main 636aa09 (2134e93). feat(agc): run registered merged hull programs (binary type 3) #6679 took request version 39 for its merged hull flag, so the point fields move to 40: new requests write 40, the point tail is read if (version >= 40u), 41 is rejected, and main's merged hull gate stays at 39. A new request_serializer case (as @JJenkx suggested) round-trips a version 40 request with either merged hull value and point state, then cuts the 13-byte point tail off and sets version 39: the merged hull flag survives and the point fields read as defaults. agc_shader_memory's merged hull test now drops the point tail before it checks older versions. ctest -R '^(agc_|shader_|request_)' passes 835 of 835, and the point, vertex, serializer, journal and tessellation tests pass 3 of 3. The debt entry now leads with its gaps, is under 1000 characters, and names no title.
  • Rebased 10-19 (evening) onto main 3aa4448 (a255453). feat(shader): emulate barycentrics and per-vertex parameters on the mesh path #6941 took request version 38 for its mesh barycentric layout, so the point fields move to 39: read if (version >= 39u), the tests expect 39 and reject 40, and version 35 to 38 requests from main read without a point tail. feat(shader): emulate barycentrics and per-vertex parameters on the mesh path #6941's field sits in the graphics section, so the vertex-only depth-remap fixture still truncates from the tail. ShaderValidation.cpp conflicted only on neighbouring Module fields (feat(shader): emulate barycentrics and per-vertex parameters on the mesh path #6941's mesh ones and this PR's point ones), and both are kept. request_serializer, agc_shader_memory, the point tests and agc_driver_graphics pass, 10 of 10. Under the LunarG SDK's 1.4.363 layer, point|^agc_driver_graphics$ gives no validation messages on main (7 tests) or with this PR (8).
  • Rebased 10-19 (later) onto main 32004df (0111965). main took request version 37 for the stencil operation value export (7563b4a), so the point fields move to 38. They're read if (version >= 38u), the tests expect 38 and reject 39, and version 35 to 37 requests from main read without a point tail. Both sides had changed the same line to 37, so git merged it without a conflict. The 635 broad-set tests pass on main, and 636 of 636 with this PR. The serializer, point, shader-memory and journal tests pass 3 of 3. Under the LunarG SDK's 1.4.363 layer there are no validation messages on either side.
  • Rebased 10-19 onto main 7f596df (24d4689; it merges with 6b8228b cleanly). feat(agc): remap a viewport depth range the device cannot express into the vertex shader #4650 took request version 35 for its depth remap fields and perf(shader): flush f32 denormals in hardware when a startup probe matches the emulation #6503 took 36 for the f32 flush-to-zero flag, so the point fields now come with version 37, after the flush flag, and the tests expect 37 and reject 38. The vertex stage keeps main's depth remap mode beside the point size (Draw.cpp, DrawRegisterKey.cpp, the cache key and ShaderInputInfoBuilder.cpp). main's merged coverage and depth remap already use journal format 4, so the journal format becomes 6 (State 800 bytes), since perf(agc): data-only draw hits compare only the user words a stage reads #5656 took 5 on main. feat(agc): remap a viewport depth range the device cannot express into the vertex shader #4650's depth remap layout check in agc_shader_memory now skips the 13-byte point tail of a vertex request. In State.cpp the point-list export mask sits next to feat(libSceAgcDriver): support quad-list primitive type #6529's quad-list primitive restart rule. On 9817d53 the AGC, shader, request, journal and point set passed 616 of 617, against 615 of 616 on main alone; the one failure on both is agc_driver_bda_device (agc_driver_bda_device times out in vkWaitForFences since the BDA anchor lookup (#5859, d422c760c) #7584). On the final head the 15 point, serializer, journal, shader memory, graphics, quad and primitive tests pass 3 of 3.
  • Rebased onto main 7bc7905 (7944d73; it merges with c8e3fcb cleanly). main took request version 34 for its pixel fields, so a version 34 request from main has no point tail. The point fields now come with version 35 (0ad8628): agc_shader_memory expects 35 for new requests and rejects 36, and the request_serializer fixtures move to 35. In ShaderRegistry.cpp, main now decodes the vertex stage after its deferral check and inside a try, so ApplyPointSize moved there. In State.cpp, main's PixelSampleLocations and this PR's ApplyPointSize both stay. The AGC, shader, request, journal and point set passes 610 of 611, against 609 of 610 on main 7bc7905 alone; the one failure on both is agc_driver_bda_device (agc_driver_bda_device times out in vkWaitForFences since the BDA anchor lookup (#5859, d422c760c) #7584). The 10 point, serializer, journal and shader memory tests pass 3 of 3.
  • Rebased onto main 9f25d0b (1d714dd), with feat(libSceAgcDriver): support polygon primitive type 21 #7175. Its new PolygonPrimitiveTests in tests/Graphics.cpp sits next to this PR's vertexPointListTests; both stay. Request version 33 is still free on main (32 is the newest). The 34 tests matching graphics|point|journal|vertex pass.

OliSe Player, 60 s, scripted pad input, copies of the app whose preset folder holds only one of its own presets:

Preset main 5d9dcc4 this PR
Che - Escape stops at 19 s (2 of 2), line above gets past the point draw. Stops at 20 s on SPI_PS_INPUT_ENA/ADDR 0x4002 (SAMPLE_COVERAGE), which #6530 accepts. With #6530 as well, it reaches the limit (2 of 2) and the visualiser renders
Stahlregen + Geiss + Martin - Ouboros (Metal Finish 2) stops at 19 s, line above (one run) reaches the limit, alone and with #6530 (one run each)

On the Intel VM (Arrow Lake iGPU, Mesa 26.1.6 ANV, Debian 13):

  • agc_driver_vertex_point_size from 8694957 passes 3 of 3, with the same squares as on NVIDIA in every case, including one pixel for exported sizes 0 and -3.
  • With the first commit, the Ouboros copy stops 19 s in on main 5d9dcc4 with the line above, and runs to the 60 s limit with this PR.

@screamm cross-checked it on Windows 11 Pro (RTX 4070, driver 596.21, MinGW-w64 GCC 15.2) at 8694957. request_serializer, agc_driver_graphics, agc_driver_inactive_vertex_point_size, agc_driver_vertex_point_size and agc_driver_zero_position_vertex passed 3 of 3. With main's SpirvModuleEmitter.cpp and ShaderInfoCollector.cpp, agc_driver_vertex_point_size failed with register size 4: a point is not a 4x4 square. In OliSe Player (150 s) with #6530, both presets reached the limit 2 of 2, where main + #6530 stopped on the 0x207 line. There the visualiser composite was black on the default path and rendered with APS5_NO_RESIDENT_TARGETS=1.

@johnmaia ran the full suite on AMD (Radeon RX 7600, RADV NAVI33, Mesa 25.2.8, Ubuntu 24.04) with 3ddbd21 on main 82ddae7. 1287 of 1288 tests pass, and the one failure is main's agc_driver_graphics (#6792). agc_driver_vertex_point_size passes, and with #6789 merged too, agc_driver_graphics passes with and without this PR, so the new Graphics.cpp cases run there.

@screamm rechecked the current head on Windows (ea05b78, stacked with #6530 and #6669 on main 5f61879). agc_shader_memory, request_serializer, the point-size tests and both journal tests pass 3 of 3, including the new point-list journal case. With RequestSerializer.cpp set back to version 32, agc_shader_memory fails on trailing data. OliSe Player (Che - Escape) reaches the 120 s limit 2 of 2, where main stops on register 0x207 2 of 2.

#6530 (mine) also moves the pipeline journal format from 3 to 4, for State::mergedCoverage. Its fields sit before quadSampleMask in the codec, so the two do not conflict there, but whichever merges second will move the format to 5.

Not checked in a title on AMD, or on a console.

Other open PRs touch neighbouring lines: #6529 next to the same 0x207 check, #6530 in Pipeline.cpp, #5859 in SpirvModuleEmitter.cpp. #6470 and #6503 also took request version 31, which #5884 has since used on main; whichever of these lands next takes the next free version. #6679 and #6801 also take version 37, so whichever of the three lands first keeps 37, and the others move to 38 and 39.

  • Khronos validation, as CONTRIBUTING.md asks: Ubuntu's 1.3.275 layer loaded with VK_LAYER_PATH, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1 ctest -V, RTX 4070 Ti, Linux. Neither log reports was not found but was requested by env var VK_INSTANCE_LAYERS. ^agc_driver_graphics$|vertex_point_size|^agc_shader_memory$: on main 7f596df it reports VkDeviceCreateInfo-pNext-pNext ×6 and VkGraphicsPipelineCreateInfo-pLibraries-06681 ×3. With this PR it reports the same two (×9 and ×30, mostly from the new agc_driver_vertex_point_size) and no other VUID. This older layer gives both on main for every device-creating test.
  • The same comparison under the LunarG SDK's 1.4.363 layer, the version Windows reviewers run: no validation messages on main 7f596df or with this PR.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Unblocks: none (Che - Escape also needs feat(agc): draw radeonsi line and polygon smoothing (SAMPLE_COVERAGE, merged mixed samples) #6530)
  • GPUs tested: NVIDIA GeForce RTX 4070 Ti, driver 595.99, Ubuntu 24.04; Intel Arrow Lake iGPU, Mesa 26.1.6 ANV, Debian 13; NVIDIA GeForce RTX 4070, driver 596.21, Windows 11 (screamm); AMD Radeon RX 7600, Mesa 25.2.8 RADV, Ubuntu 24.04 (tests, johnmaia)
  • AI-assisted: yes

🤖 Generated with Claude Code

const bool fromVertex = (result.paClVsOutCntl & (1u << 16u)) != 0;
Require(!fromVertex || (result.paClVsOutCntl & (1u << 21u)) != 0, "USE_VTX_POINT_SIZE without VS_OUT_MISC_VEC_ENA is unsupported");
Require(fromVertex || (size & 0xffffu) == size >> 16u, "points whose PA_SU_POINT_SIZE width and height differ are unsupported");
Require((limits & 0xffffu) <= limits >> 16u, "PA_SU_POINT_MINMAX with a minimum above its maximum is unsupported");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this reject a zero endpoint (or otherwise ensure the emitted value is positive)? With , a 0/0 limit makes write to ; without that bit, a zero writes 0 as well. Vulkan requires the value written to to be greater than zero (spec). only governs sizes greater than 1. If zero has a special AGC meaning, could you document the mapping and cover it in the test?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My previous inline comment was mangled by shell quoting; here is the intended review point. Could this reject a zero PA_SU_POINT_MINMAX endpoint, or otherwise ensure the emitted value is positive? With USE_VTX_POINT_SIZE, a 0/0 limit makes EmitAuxPositionExport write clamp(exportedSize, 0, 0) to PointSize; without that bit, a zero PA_SU_POINT_SIZE writes 0 as well. Vulkan requires the value written to PointSize to be greater than zero: https://docs.vulkan.org/spec/latest/chapters/primsrast.html#primsrast-points. largePoints only governs sizes greater than 1. If zero has a special AGC meaning, could you document the mapping and cover it in the test?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, you're right on both paths. Fixed in 8694957:

  • Without USE_VTX_POINT_SIZE: a PA_SU_POINT_SIZE of 0 throws (points of size 0 (PA_SU_POINT_SIZE 0) are unsupported).
  • With it: a PA_SU_POINT_MINMAX maximum of 0 throws. The clamp's lower bound is at least the smallest positive float, so an exported size of 0 or less is still written as a positive value. A zero minimum alone stays accepted because radeonsi programs it for multisampled and sprite points (util_get_min_point_size). Refusing it would block those draws. The emitter also refuses a non-positive size if the request ever carries one.

I don't know of a special AGC meaning for zero. A zero-radius point probably covers nothing on the console, so the floor draws the device's smallest point where the console likely draws none. That's in the debt entry as inferred.

Tests: agc_driver_graphics covers both refusals and checks that a zero register size with the bit set, a zero minimum, and a zero clamp without the bit still decode. agc_driver_vertex_point_size draws exported sizes 0 and -3 with a [0, 4] clamp and requires at most one pixel per point. NVIDIA draws one pixel for both, so the GPU case checks coverage and validity, not the floor's exact value. The area suite is unchanged: 468 of 469, with the known agc_driver_store_over_untracked failure.

AI-assisted: yes

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for checking both sources and adding the validation plus regression coverage. The distinction for a zero minimum with a positive maximum makes sense, and the latest commit addresses the Vulkan requirement I flagged.

@MarcZX10

Copy link
Copy Markdown
Contributor

I checked the zero-size path again against the emitted SPIR-V. PA_SU_POINT_MINMAX=0 with USE_VTX_POINT_SIZE clamps the exported value to zero, and without that bit PA_SU_POINT_SIZE=0 initializes PointSize to zero. The implementation currently validates min <= max and relies on Vulkan to clamp oversized values, but does not ensure the written value is positive. Could zero be rejected or mapped to a positive value, with a test for each source path? The Vulkan PointSize requirement is documented here: https://docs.vulkan.org/refpages/latest/refpages/source/PointSize.html

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 6959 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp L38, L47
PR 7410 core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L865, L874, L919
PR 7642 core/shader/recompiler/CacheKey.hpp L6
PR 7691 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L251-253
PR 7888 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017, L5309, L5314, L5322, L5365-5366
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L865, L874, L919
core/shader/recompiler/tests/RequestSerializerTests.cpp L59, L217, L222, L257, L262, L283, L287, L413, L417, L433, L440, L456-457, L463
PR 8004 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017, L5309, L5314, L5322, L5368-5369
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L865, L874, L919
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L222, L257, L262, L283, L287, L413, L417, L433, L440, L456-457, L463, L527-528
PR 8564 core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp L626
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L257, L283, L413-414, L433, L456, L463
PR 8612 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017, L5309, L5366-5368
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L865, L874, L919
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L222, L257, L262, L283, L287, L413, L417, L433, L440, L456, L463, L528-529
PR 9020 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp L38
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L874
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp L626
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L257, L283, L413, L433, L456, L463
PR 9193 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017, L5309, L5366-5368
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L865, L874, L919
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L222, L257, L262, L283, L287, L413, L417, L433, L440, L456, L463
PR 9335 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp L38
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L4899, L5017
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L834, L874
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp L626
core/shader/recompiler/tests/RequestSerializerTests.cpp L217, L257, L283, L413, L433, L456, L463
PR 9412 core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp L1259, L1286
docs/dev/debt/libSceAgcDriver.md L26
PR 9450 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp L38
PR 9508 core/shader/recompiler/CacheKey.hpp L6
PR 9856 docs/dev/debt/libSceAgcDriver.md L24
PR 9898 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L252-253

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1191 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
PR 1368 core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 1395 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 2434 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4040 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 4072 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
PR 4448 docs/dev/debt/libSceAgcDriver.md
PR 4449 docs/dev/debt/libSceAgcDriver.md
PR 4472 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 5021 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5058 docs/dev/debt/libSceAgcDriver.md
PR 5115 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 5371 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 5431 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 5441 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
PR 5925 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 6186 docs/dev/debt/libSceAgcDriver.md
PR 6188 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/shader/recompiler/Recompiler.hpp
PR 6194 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6202 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6235 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6292 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6300 docs/dev/debt/libSceAgcDriver.md
PR 6412 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6488 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 6539 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
PR 6548 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6615 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6741 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6788 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6808 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6867 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6868 docs/dev/debt/libSceAgcDriver.md
PR 6879 core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.hpp
PR 6960 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7201 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7275 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7604 docs/dev/debt/libSceAgcDriver.md
PR 7684 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 7689 core/shader/recompiler/Recompiler.hpp
PR 7803 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8077 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 8246 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 8281 docs/dev/debt/libSceAgcDriver.md
PR 8395 core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8424 docs/dev/debt/libSceAgcDriver.md
PR 8527 docs/dev/debt/libSceAgcDriver.md
PR 8592 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8658 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp
PR 8672 docs/dev/debt/libSceAgcDriver.md
PR 9077 docs/dev/debt/libSceAgcDriver.md
PR 9186 docs/dev/debt/libSceAgcDriver.md
PR 9356 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 9387 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9431 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9432 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9592 docs/dev/debt/libSceAgcDriver.md
PR 9672 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9673 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9674 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9675 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9676 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9748 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9891 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9892 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9893 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9895 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp
docs/dev/debt/libSceAgcDriver.md

@screamm

screamm commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Cross-validation on Windows 11 Pro 26220, NVIDIA GeForce RTX 4070 (driver 596.21), WinLibs MinGW-w64 GCC 15.2. PR head 869495776 on main 5d9dcc42d (fast-forward, no conflicts).

  • Build: full build passes except agc_driver_gpu_indirect_arguments_misaligned_writer_ahead_tests (64 KiB alignment on MinGW), which fails the same way on main.
  • request_serializer, agc_driver_graphics, agc_driver_inactive_vertex_point_size, agc_driver_vertex_point_size, agc_driver_zero_position_vertex, --repeat until-fail:3: 3 of 3 each. 40 related agc_driver_ tests (vertex, draw, prepared, provoking vertex, layered vertex, NGG vertex) 3 of 3: no failures, 1 skipped.
  • Negative control: with SpirvModuleEmitter.cpp and ShaderInfoCollector.cpp from main (tests kept), agc_driver_vertex_point_size fails with AGC graphics: register size 4: a point is not a 4x4 square. Restored: it passes.
  • Non-GPU suite (-j6 --timeout 120, loaded host): 830 of 837 pass. 6 of the 7 failures are timeouts that pass serially (conventions_function_bodies*, and hardware_oracle_compare, which also times out on main). One real failure: agc_shader_memory fails with new requests did not use serialization version 30 (core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp:3052, requestPrefix(encoded, 8u) == "NVNQQR4AAAA="). It passes on main and fails in 0.6 s on this PR, so it is the version bump to 31, which that test was not updated for. Your ctest regex does not match it. fix(recompiler): run a pixel shader the guest does not iterate once per pixel #6470 and perf(shader): flush f32 denormals in hardware when a startup probe matches the emulation #6503 also take version 31, so it will need touching again by whichever lands second.
  • tools/check_conventions.py --base origin/main and git diff --check: pass.

OliSe Player PPSA01153 (02.001.000), presets trimmed to one preset, Square pressed once through scripted pad input after the menu renders, 150 s limit. As your description says, Che - Escape also needs #6530, so I built main + #6530 (1fd45dc99) as "before" and main + #6530 + #6639 as "after". Merging the two has one textual conflict, in Graphics/src/Pipeline.cpp (the mergedCoverage and vertexPoints Require lines are adjacent); I kept both lines. Stop line on main and on main + #6530: [gpu] driver failure: layer, viewport or auxiliary vertex exports is unsupported (register 0x207 = 0x01210000).

Build Che - Escape Ouboros (Metal Finish 2)
main 5d9dcc42d 1 run, stops at 13.6 s, the line above 1 run, stops at 9.5 s, the line above
this PR alone 1 run, stops at 9.0 s on AGC graphics: unsupported SPI_PS_INPUT_ENA/ADDR bit combination (ena 0x4002 addr 0x4002) (#6530's refusal) 1 run, reaches the 150 s limit
main + #6530 2 of 2 stop (36.6 s, 50.8 s), the line above 2 of 2 stop (75.7 s, 26.0 s), the line above
main + #6530 + this PR 2 of 2 reach the limit, no stop line; 1 more with APS5_NO_RESIDENT_TARGETS=1 also reaches it 2 of 2 reach the limit; 1 more with APS5_NO_RESIDENT_TARGETS=1 also reaches it

On the default path the visualiser composite is black here: after Square the frame is the menu at half brightness (frame-dump mean 17 to 18, max 140) for the whole run. With APS5_NO_RESIDENT_TARGETS=1 the visualiser renders (Che frame dumps reach mean 54 to 56 with 98 to 100 % non-zero pixels, and the screenshots show the tunnel with dotted streaks). I could not isolate the points from the rest of the preset in those images, so the correctness of the point size rests on agc_driver_vertex_point_size, not on the title. No module played (the download fails here and music/ is empty), so the visualiser had silent input.

Not checked: AMD and Intel GPUs, Linux, a console, a full build of the stacked trees (targeted builds only: libs and the PR, #6530 test targets), a run with a module playing.

Written with Claude Code assistance (validation by a subagent, reviewed in this session).

@milescoviello
milescoviello force-pushed the feat/vertex-point-lists branch from 8694957 to f282d4d Compare October 16, 2026 11:02
@milescoviello

Copy link
Copy Markdown
Contributor Author

Thanks for the Windows run and the title table. You're right about agc_shader_memory: the bump to version 31 left that test requiring the version 30 prefix, and it also used 31 as its unsupported version. My ctest regex didn't include it. f282d4d expects 31 and rejects 32. It passes 3 of 3 here, and the 496-test area run (now with ^agc_shader and bda) has only agc_driver_store_over_untracked failing, as on main. I rebased onto main 7dcfff5 (no conflicts) and added your results to the description.

Noted on #6470 and #6503: whichever of these lands second moves that check again.

AI-assisted: yes

@johnmaia

Copy link
Copy Markdown
Contributor

AMD run with this head (3ddbd21) merged onto main 82ddae7: AMD Radeon RX 7600 (RDNA 3, RADV NAVI33, Mesa 25.2.8), Ubuntu 24.04, GCC 13.3, Release, full ctest -j4.

AI-assisted: yes (Claude Code)

@milescoviello

Copy link
Copy Markdown
Contributor Author

Thanks @johnmaia, the AMD run is very useful, especially confirming that the new Graphics.cpp cases run once #6789 is in. I added it to the description.

AI-assisted: yes

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 16, 2026
@milescoviello
milescoviello force-pushed the feat/vertex-point-lists branch from 3ddbd21 to ea05b78 Compare October 16, 2026 19:49
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 16, 2026
@screamm

screamm commented Oct 17, 2026

Copy link
Copy Markdown
Contributor

Rechecked on head ea05b7804, Windows 11 Pro 26220, RTX 4070 (596.21), WinLibs MinGW-w64 GCC 15.2, Release. Stacked as main 5f61879a9 + #6530 (faea7a221) + this PR + #6669 (8455a5cce). The only conflict is the same pair of adjacent Require lines in Pipeline.cpp; I kept both. Full build: no failures.

What changed since my run on 869495776:

  • agc_shader_memory passes now, 3 of 3. The version handling is consistent. The writer emits 33, and the reader accepts up to 33, reads the spanned-wave flag from 32 and the point tail from 33 (vertex stage only). ShaderMemory.cpp expects NVNQQSEAAAA= (33) and rejects NVNQQSIAAAA= (34), and RequestSerializerTests.cpp uses 33 and 34. No other hard-coded request version is left in the tree.
  • Negative control: with RequestSerializer.cpp set back to version 32 and the tests kept, agc_shader_memory fails with RequestSerializer: unexpected trailing data and request_serializer aborts. Restored, both pass.
  • request_serializer, agc_driver_vertex_point_size, agc_driver_graphics, agc_driver_inactive_vertex_point_size, agc_driver_zero_position_vertex, agc_pipeline_journal and agc_driver_pipeline_journal: 3 of 3 each. The new point-list journal case passes.
  • GPU pass ctest -j1 -R '^agc_driver_' on the stack: 484 of 487 pass and 2 are skipped. The one failure, agc_driver_f16_fma_denormal_modes (v_fma_f16 ... is 0x7fff, expected 0xfe00), fails the same way on plain main 5f61879a9 here. Non-GPU suite: 872 of 876 pass, 2 skipped as on main. The 2 load timeouts pass when run directly.
  • OliSe Player (PPSA01153), presets trimmed to Che - Escape, Square once, 120 s. Main (3b10c7ef0) stops 2 of 2, at 8.2 s and 30.7 s, on [gpu] driver failure: layer, viewport or auxiliary vertex exports is unsupported (register 0x207 = 0x01210000). The stack reaches the limit 2 of 2 (264 and 773 frames) with no driver failure. As before, the composite on the default path is black here.

Not checked: Ouboros this time, APS5_NO_RESIDENT_TARGETS=1, AMD/Intel, Linux.

Written with Claude Code assistance (validation by a subagent, reviewed in this session).

@milescoviello

Copy link
Copy Markdown
Contributor Author

Thanks @screamm for rechecking the request-version change and the journal case on the current head. I added the run to the description.

AI-assisted: yes (Claude Code)

@milescoviello
milescoviello force-pushed the feat/vertex-point-lists branch from ea05b78 to bcbcea8 Compare October 17, 2026 19:18
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 18, 2026
@milescoviello
milescoviello force-pushed the feat/vertex-point-lists branch from bcbcea8 to 1d714dd Compare October 18, 2026 11:00
@milescoviello

Copy link
Copy Markdown
Contributor Author

@JJenkx another restack note for #6801: #7869 merged and took journal format 6. So #6639 is rebased again, onto main 275e896. The new head is 3ccf38feef, still six commits.

The focused 8 tests pass 2 of 2.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 21, 2026
@milescoviello

Copy link
Copy Markdown
Contributor Author

Rebased once more, onto main 74bdc3a, after #8856 (point-list output of NGG geometry programs) and #7911 (RELEASE_MEM of the system counter). The new head is 856256407b, six commits.

The 17 tests matching the serializer, journal, point-size, point and geometry-output names pass 2 of 2. The formats are unchanged: journal 7, request version 43, sizeof(State) 800.

AI-assisted: yes (Claude Code)

milescoviello and others added 6 commits October 22, 2026 23:20
A point list routed through the vertex path was refused, and so was
PA_CL_VS_OUT_CNTL.USE_VTX_POINT_SIZE on it. OliSe Player (PPSA01153)
stops on the latter with two of its MilkDrop presets.

The vertex path now draws point lists as Vulkan points. The vertex stage
writes PointSize: the misc export's X clamped to PA_SU_POINT_MINMAX when
USE_VTX_POINT_SIZE is set, and the PA_SU_POINT_SIZE height otherwise.
The point state travels in the recompile request (version 31) and the
cache and draw keys. Non-square register sizes, inverted clamps, point
sprite texture coordinates and, without largePoints, sizes other than
one pixel throw.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vulkan needs PointSize above zero. A PA_SU_POINT_SIZE of 0 without
USE_VTX_POINT_SIZE, and a PA_SU_POINT_MINMAX maximum of 0 with it, now
throw. With USE_VTX_POINT_SIZE the clamp's lower bound is at least the
smallest positive float, so an exported size of 0 or less, which a
clamp minimum of 0 lets through, is written as a positive value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main took request versions 33 to 42 for other fields, the last of them
the pixel sample order, so requests of those versions from main have no
point-list tail. The point fields now come with version 43, after them,
and the tests expect 43 and reject 44.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pipeline creation and SPIR-V validation read State::vertexPoints and the
three point sizes, so the pipeline journal's recipe codec and canonical
state now carry them, the State layout guard names its new size and the
journal format becomes 8 (main took 5 for the recipe codec change of
boykopovar#5656, 6 for the polygon modes of boykopovar#7869 and 7 for the truncated coverage
of boykopovar#8115).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ll and point state

A tessellated vertex request with the merged hull flag and a point list
serializes as version 43 with both. Without its point tail it reads as
main's version 42, without the pixel sample order as version 41, and
without the f32 denormal preserve flag as version 39, each keeping the
merged hull flag and taking the default point state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The entry was twice the 1000-character limit, led with the behaviour
rather than the gaps, and named a title. It now lists what throws and
what is inferred first, and names no title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@milescoviello
milescoviello force-pushed the feat/vertex-point-lists branch from 8562564 to 0116102 Compare October 22, 2026 23:53
@milescoviello

Copy link
Copy Markdown
Contributor Author

@JJenkx @oneandonlydean #6639 is rebased onto main 895f47f. The new head is 0116102be4, still six commits.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 22, 2026
@milescoviello

Copy link
Copy Markdown
Contributor Author

#6801 is merged (a701f9f), and it carried this PR's six commits, now on main as e7ea490, f3433b0, 11bc7b1, 891bb20, 89be76c and f71ead7. main has the vertex point lists with their point sizes, the zero-size clamp, request version 43, journal format 8 with sizeof(State) == 824, and both point-size tests. Nothing in this PR is left to merge, so I'm closing it as landed through #6801.

Thanks @JJenkx for carrying the commits with their authorship, and @oneandonlydean for the journal ordering.

AI-assisted: yes (Claude Code)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* docs needs rebase Conflicts with main, rebase needed shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants