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

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 <[email protected]>
This commit is contained in:
milescovielloandClaude Opus 5.5 authored and JJenkx committed 2026-10-21 09:13:09 -04:00
1 parent 27bcd6a29e
commit e7ea490325
22 files changed
+375 -16

No files matched your search

+5
View File
@@ -4,6 +4,7 @@
#include "Recompiler.hpp"
#include "RdnaDecoder/RdnaDescriptorFormat.hpp"
#include "prx/libc/include/HostThreadLocal.hpp"
#include <bit>
#include <cstdlib>
#include <stdexcept>
#include <type_traits>
@@ -233,6 +234,10 @@ private:
append(key, value.fetchEmbedded);
append(key, value.paClVsOutCntl);
append(key, value.depthRemapMode);
append(key, value.pointList);
append(key, std::bit_cast<std::uint32_t>(value.pointSize));
append(key, std::bit_cast<std::uint32_t>(value.pointSizeMin));
append(key, std::bit_cast<std::uint32_t>(value.pointSizeMax));
if (value.resourcesNum > value.resources.size()) throw std::runtime_error("Shader cache: invalid vertex resource count");
append(key, value.resourcesNum);
for (std::uint32_t i = 0; i < value.resourcesNum; ++i) {