Profiles 3-7 on the three games; a profiled run reports flexible memory

PHASE_LOG records Profiles 3 to 7: torture, GPU and RAM EFB copies and
the 1x-6x ladder at full speed on RE4, Melee and Wind Waker; MSAA after
../PS5_Vulkan R75-R78 (2x, 4x and 8x at full speed, the maximum torture
correct and GPU-bound).

A profiled test run (the driver's /app0/ps5vk-profile.txt survived the
stale test file sweep) prints the flexible memory left every ten
seconds from the log flusher, beside the driver's direct_live, so a
soak's leak shows as a line that only moves one way. verify.sh: all
gates pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MihawkandClaude Opus 5.5 committed 2026-09-25 06:28:27 -04:00
1 parent 99503e7b2a
commit cc75fc1353
2 files changed
+44 -1

No files matched your search

+24
View File
@@ -3324,3 +3324,27 @@ Profile 2 at 1x and 6x on all three games, 1,200 presents per 10 s and every
steady window at 100% (99% in one screenshot window). Melee's first run on a new
build still stalls 30-95 ms on each pipeline it compiles for the first time: the
driver's shader cache is per build, and Profile 8 is where that is measured.
## 2026-09-25 — Profiles 3-7: torture, EFB, the scaling ladder and MSAA
On title 5beca7cc (../PS5_Vulkan R74) and, for MSAA, its successors:
- **Profile 3** (6x, ubershaders, 16x AF, forced filtering, every frame
presented), **4** (6x GPU EFB copies) and **5** (6x EFB copies to RAM):
RE4, Melee and Wind Waker at 100% in every steady window, correct pictures.
RAM EFB copies read back 270 images a second in RE4 at full speed; Wind
Waker's game settings already send its EFB copies to RAM, so its Profiles 4
and 5 are the same run.
- **Profile 6**, 1x to 6x at the accurate baseline: all eighteen runs at 100%,
1,200 presents per 10 s; Wind Waker's GPU time grows from 0.21 to 1.37 ms a
present, Melee's and RE4's stay under 0.2 ms.
- **Profile 7**: 4x MSAA first stopped every game at its first resolve. The
driver refused to sample a four-sample image and could not resolve into
Dolphin's resolve texture, which it stores in rows; ../PS5_Vulkan R75-R77 added
multisampled sampling, GPU resolves and rendering into rows. R78 added 2x and
8x and moved the sample locations to the registers of every pixel of the 2x2
quad (C8 had left the lower two at AGC's defaults). 2x, 4x and 8x at 1x: all
three games at 100%, antialiased. The maximum torture (6x, 8x MSAA,
ubershaders, 16x AF): correct and stable at 92-97% (RE4), 72-77% (Melee) and
60-64% (Wind Waker), GPU-bound -- the uncompressed 8x surfaces at 6x
quadruple the GPU work of Profile 3.
+20 -1
View File
@@ -29,6 +29,7 @@
* says how far it got. See src/trace.hpp.
*/
#include <atomic>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
@@ -53,6 +54,7 @@ extern "C" int rarch_main(int argc, char *argv[], void *data);
extern "C" int sceSystemServiceHideSplashScreen();
extern "C" void ps5_vulkan_profile_init();
extern "C" int sceKernelAvailableFlexibleMemorySize(std::size_t *size);
extern "C" void ps5_crash_report_install();
extern "C" void ps5_core_threads_start();
extern "C" void ps5_sampler_start();
@@ -88,14 +90,26 @@ constexpr const char *config_path = "/app0/config/retroarch.cfg";
* and its what() are written to the trace here - the difference between "the
* compiler refused this shader" and "a wild size reached a container", which are
* not the same bug and were not distinguishable from the outside. */
/* A profiled test run (the driver's /app0/ps5vk-profile.txt survived the stale
* test file sweep) also reports the flexible memory left every ten seconds:
* with the driver's direct_live, a soak's leak is a line that only moves one
* way. Set once main has swept. */
std::atomic<bool> g_memory_report{false};
/* Writes every buffered output stream out -- the trace file and RetroArch's
* log among them -- four times a second, off the threads that log. */
void *log_flusher(void *)
{
const timespec interval = {0, 250 * 1000 * 1000};
for (;;)
for (unsigned tick = 1;; ++tick)
{
nanosleep(&interval, nullptr);
if (tick % 40 == 0 && g_memory_report.load(std::memory_order_relaxed))
{
std::size_t flexible = 0;
sceKernelAvailableFlexibleMemorySize(&flexible);
std::fprintf(stderr, "memory: flexible_free=%zu KiB\n", flexible >> 10);
}
std::fflush(nullptr);
}
return nullptr;
@@ -269,6 +283,11 @@ int main()
if (removed != 0)
ps5::debug::mark_value("stale test files removed", static_cast<int>(removed));
}
if (std::FILE *profile = std::fopen("/app0/ps5vk-profile.txt", "rb"))
{
std::fclose(profile);
g_memory_report.store(true, std::memory_order_relaxed);
}
/* Extra arguments, one per line, from /app0/args.txt when that file is there.
*