Merge pull request #6134 from fdfawef324/claude/agc-prepare-dump-name

fix(agc): name preparation-failure shader dumps apart from dispatch captures
This commit is contained in:
Adrià authored and GitHub committed 2026-10-18 23:26:43 +02:00
commit 8256d3a1f3
7 files changed
+25 -12

No files matched your search

@@ -35,6 +35,7 @@
#include <span>
#include <stop_token>
#include <string>
#include <string_view>
#include <unordered_map>
#include <unordered_set>
#include <utility>
@@ -67,7 +68,7 @@ public:
void SettleShaderPreparations(std::span<const Shader* const> stages);
static void FoldDrawOffsets(const ShaderRecompiler::RecompileResult& result, const DrawProgram& program, Pm4::DrawParameters& parameters);
static std::optional<Graphics::IndirectDrawPath> ClassifyIndirectDraw(const ShaderRecompiler::RecompileResult& result, const Graphics::State& graphics, const DrawProgram& frontProgram, const std::shared_ptr<VulkanDevice>& localDevice, Pm4::DrawParameters& drawParameters, bool traceIndirect);
static std::string dumpRequest(std::uint64_t address, const ShaderRecompiler::RecompileRequest& request);
static std::string dumpRequest(std::uint64_t address, const ShaderRecompiler::RecompileRequest& request, std::string_view suffix = {});
DrawEntryCounters DrawCacheCounters();
struct DispatchCacheFootprint {
std::size_t entries = 0;
@@ -49,16 +49,17 @@ void Driver::reportSkip(const char* kind, const std::string& what) {
if (!line.empty()) std::fwrite(line.data(), 1, line.size(), stderr);
}
std::string Driver::dumpRequest(std::uint64_t address, const ShaderRecompiler::RecompileRequest& request) {
std::string Driver::dumpRequest(std::uint64_t address, const ShaderRecompiler::RecompileRequest& request, std::string_view suffix) {
static std::mutex dumpMutex;
static std::set<std::uint64_t> dumped;
char name[64];
std::snprintf(name, sizeof(name), "shader_%llx.req", static_cast<unsigned long long>(address));
static std::set<std::string> dumped;
char hex[32];
std::snprintf(hex, sizeof(hex), "%llx", static_cast<unsigned long long>(address));
const std::string name = "shader_" + std::string(hex) + std::string(suffix) + ".req";
std::lock_guard lock(dumpMutex);
if (!dumped.insert(address).second) return name;
if (!dumped.insert(name).second) return name;
try {
const auto text = ShaderRecompiler::RequestSerializer{}.Serialize(request);
if (std::FILE* file = std::fopen(name, "wb")) {
if (std::FILE* file = std::fopen(name.c_str(), "wb")) {
std::fwrite(text.data(), 1, text.size(), file);
std::fclose(file);
}
@@ -53,7 +53,7 @@ std::shared_ptr<const ShaderRecompiler::SourceHandle> PrepareShaderWithDiagnosti
} catch (...) {
failure = std::current_exception();
try {
if (std::getenv("APS5_DUMP_SHADERS") != nullptr) dump = Driver::dumpRequest(request.shader.codeAddress, request);
if (std::getenv("APS5_DUMP_SHADERS") != nullptr) dump = Driver::dumpRequest(request.shader.codeAddress, request, ".prepare");
} catch (...) {}
}
try {
@@ -1,6 +1,7 @@
#include "VulkanTestDevice.hpp"
#include "Optimization/ResourceProgram.hpp"
#include "ControlFlow/RequestSerializer.hpp"
#include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp"
#include "prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp"
#include "prx/libSceAgcDriver/Graphics/include/ShaderInputState.hpp"
#include "prx/libSceAgcDriver/Execution/include/Driver.hpp"
@@ -202,8 +203,10 @@ void FailureCapture(AgcDriver::VulkanDevice& device) {
const auto expected = failure([&] { static_cast<void>(PrepareShader(request)); });
const char* previous = std::getenv("APS5_DUMP_SHADERS");
const std::string saved = previous != nullptr ? previous : "";
const std::string path = "shader_12345cafe.req";
const std::string path = "shader_12345cafe.prepare.req";
const std::string capturePath = "shader_12345cafe.req";
std::remove(path.c_str());
std::remove(capturePath.c_str());
#ifdef _WIN32
Require(_putenv_s("APS5_DUMP_SHADERS", "") == 0, "cannot disable shader capture");
#else
@@ -224,6 +227,14 @@ void FailureCapture(AgcDriver::VulkanDevice& device) {
std::ostringstream dumpedPrefix;
dumpedPrefix << "shader 0x" << std::hex << request.shader.codeAddress << " stage " << static_cast<unsigned>(request.shader.stage) << " (" << path << "): ";
Require(actual == dumpedPrefix.str() + expected, "enabled shader capture changed the diagnosed failure");
Require(!std::ifstream(capturePath, std::ios::binary).is_open(), "a preparation failure was dumped as a dispatch request");
Require(AgcDriver::DriverDetail::Driver::dumpRequest(request.shader.codeAddress, request) == capturePath, "a dispatch request dump has the wrong name");
std::ifstream capture(capturePath, std::ios::binary);
std::ostringstream captureText;
captureText << capture.rdbuf();
capture.close();
std::remove(capturePath.c_str());
Require(captureText.str() == RequestSerializer{}.Serialize(request), "an earlier preparation failure dump suppressed the dispatch request dump");
#ifdef _WIN32
Require(_putenv_s("APS5_DUMP_SHADERS", saved.c_str()) == 0, "cannot restore shader capture");
#else
@@ -184,7 +184,7 @@ bool Replay(const char* path) {
int main(int argc, char** argv) {
if (argc < 2) {
std::fprintf(stderr, "usage: agc_shader_replay [--dis] [--asm] [--cfg] [--mem] [--spv] [--prepare] [--materialize] [--code] [--maintenance8] [--robust2] <shader.req>...\n the driver writes shader_<address>.req files when APS5_DUMP_SHADERS is set\n");
std::fprintf(stderr, "usage: agc_shader_replay [--dis] [--asm] [--cfg] [--mem] [--spv] [--prepare] [--materialize] [--code] [--maintenance8] [--robust2] <shader.req>...\n the driver writes shader_<address>.req files when APS5_DUMP_SHADERS is set; shader_<address>.prepare.req holds a request whose preparation failed before any resource capture, so replay it with --prepare\n");
return 2;
}
int failures = 0;