From 21612855b357f28d1df43d35edea021ea0f25c7f Mon Sep 17 00:00:00 2001 From: Joey Fisher Date: Thu, 8 Oct 2026 16:40:32 -0600 Subject: [PATCH] fix(agc): skip registration-time preparation for unsupported shader types --- .../src/Driver/Shaders/ShaderRegistry.cpp | 7 ++++++- .../tests/execution/PreparedShaders.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp index 109b381a7fd8..628cbc13b636 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp @@ -322,7 +322,12 @@ std::vector PrepareRegistered(const ShaderSnapshot& snap case 5: stage = Stage::Local; programRegister = 0x148; resourceRegister = 0x10b; firstUser = 8; break; case 6: stage = Stage::Mesh; programRegister = 0x088; resourceRegister = 0x08b; break; case 7: stage = Stage::TessellationControl; programRegister = 0x108; resourceRegister = 0x10b; break; - default: throw std::runtime_error("AGC driver: unsupported registered shader type"); + default: + if (registration) { + APS5_LOG_ERR("Shader 0x%llx has unsupported registered shader type %u; it is not prepared at registration", static_cast(snapshot.codeAddress), static_cast(snapshot.type)); + return {}; + } + throw std::runtime_error("AGC driver: unsupported registered shader type " + std::to_string(snapshot.type)); } const auto high = RegisterValue(state.shader, programRegister + 1); if ((high & ~0xffu) != 0) throw std::runtime_error("AGC driver: invalid registered program address"); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp index 977f26c1a9bc..53c836486134 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp @@ -189,7 +189,26 @@ void PrepareMultisampledStorage(AgcDriver::VulkanDevice& device) { ExpectFailure([&] { static_cast(PrepareShader(request)); }, "storage image multisampling is unavailable on the target device"); } +void UnsupportedTypeRegistration() { + alignas(256) static const std::array code{0xbf810000u}; + struct Header { + Shader shader{}; + std::array registers{{{0, 0x1218}, {1, 0x40104004}, {2, 0xa0}, {5, 0}, {3, 6}, {4, 0xc}, {6, 0}, {7, 0}}}; + } header; + header.shader.file_header = 0x34333231u; + header.shader.version = 0x18; + header.shader.header_size = sizeof(header); + header.shader.shader_size = sizeof(code); + header.shader.code = code.data(); + header.shader.sh_registers = header.registers.data(); + header.shader.num_sh_registers = header.registers.size(); + header.shader.type = 8; + AgcDriverRegisterShader_nid_postfix(&header.shader); + AgcDriverRegisterShader_nid_postfix(&header.shader); +} + void Registration(bool indirect) { + UnsupportedTypeRegistration(); alignas(256) std::array code{0xbf810000u}; struct Header { Shader shader{};