Merge pull request #3946 from danzaio/fix/shader-failure-address
fix(agc): name the shader address and stage in preparation failures
This commit is contained in:
commit
b40a0b17dc
|
|
@ -19,10 +19,12 @@
|
|||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <deque>
|
||||
#include <exception>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <atomic>
|
||||
#include <pthread.h>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <thread>
|
||||
#include "RdnaDecoder/RdnaInstructionDecoder.hpp"
|
||||
|
|
@ -30,14 +32,25 @@
|
|||
namespace AgcDriver::DriverDetail {
|
||||
|
||||
std::shared_ptr<const ShaderRecompiler::SourceHandle> PrepareShaderWithDiagnostics(const ShaderRecompiler::RecompileRequest& request, ShaderRecompiler::ShaderPreparationContext* preparation) {
|
||||
std::exception_ptr failure;
|
||||
std::string dump;
|
||||
try {
|
||||
auto handle = ShaderRecompiler::PrepareShader(request, preparation);
|
||||
return handle;
|
||||
} catch (...) {
|
||||
failure = std::current_exception();
|
||||
try {
|
||||
if (std::getenv("APS5_DUMP_SHADERS") != nullptr) static_cast<void>(Driver::dumpRequest(request.shader.codeAddress, request));
|
||||
if (std::getenv("APS5_DUMP_SHADERS") != nullptr) dump = Driver::dumpRequest(request.shader.codeAddress, request);
|
||||
} catch (...) {}
|
||||
throw;
|
||||
}
|
||||
try {
|
||||
std::rethrow_exception(failure);
|
||||
} catch (const std::exception& error) {
|
||||
std::ostringstream where;
|
||||
where << "shader 0x" << std::hex << request.shader.codeAddress << " stage " << static_cast<unsigned>(request.shader.stage);
|
||||
if (!dump.empty()) where << " (" << dump << ")";
|
||||
where << ": ";
|
||||
throw std::runtime_error(where.str() + error.what());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -200,7 +200,11 @@ void FailureCapture(AgcDriver::VulkanDevice& device) {
|
|||
#else
|
||||
Require(unsetenv("APS5_DUMP_SHADERS") == 0, "cannot disable shader capture");
|
||||
#endif
|
||||
Require(failure([&] { static_cast<void>(AgcDriver::DriverDetail::PrepareShaderWithDiagnostics(request)); }) == expected, "disabled shader capture changed the preparation failure");
|
||||
std::ostringstream prefix;
|
||||
prefix << "shader 0x" << std::hex << request.shader.codeAddress << " stage " << static_cast<unsigned>(request.shader.stage) << ": ";
|
||||
const auto diagnosed = failure([&] { static_cast<void>(AgcDriver::DriverDetail::PrepareShaderWithDiagnostics(request)); });
|
||||
Require(diagnosed.rfind(prefix.str(), 0) == 0, "diagnosed failure names no shader address and stage");
|
||||
Require(diagnosed.substr(prefix.str().size()) == expected, "diagnosed failure changed the reason");
|
||||
Require(!std::ifstream(path, std::ios::binary).is_open(), "disabled shader capture created a request");
|
||||
#ifdef _WIN32
|
||||
Require(_putenv_s("APS5_DUMP_SHADERS", "1") == 0, "cannot enable shader capture");
|
||||
|
|
@ -208,12 +212,14 @@ void FailureCapture(AgcDriver::VulkanDevice& device) {
|
|||
Require(setenv("APS5_DUMP_SHADERS", "1", 1) == 0, "cannot enable shader capture");
|
||||
#endif
|
||||
const auto actual = failure([&] { static_cast<void>(AgcDriver::DriverDetail::PrepareShaderWithDiagnostics(request)); });
|
||||
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");
|
||||
#ifdef _WIN32
|
||||
Require(_putenv_s("APS5_DUMP_SHADERS", saved.c_str()) == 0, "cannot restore shader capture");
|
||||
#else
|
||||
Require((previous != nullptr ? setenv("APS5_DUMP_SHADERS", saved.c_str(), 1) : unsetenv("APS5_DUMP_SHADERS")) == 0, "cannot restore shader capture");
|
||||
#endif
|
||||
Require(actual == expected, "shader capture changed the preparation failure");
|
||||
std::ifstream file(path, std::ios::binary);
|
||||
std::ostringstream text;
|
||||
text << file.rdbuf();
|
||||
|
|
|
|||
Loading…
Reference in New Issue