Shader Recompiler: Auto stub special registers and dump pipelines on exception.

This commit is contained in:
Fernando Sahmkow 2023-08-27 02:00:48 +02:00
parent 8beda6a2bf
commit 710ca3ca49
2 changed files with 15 additions and 1 deletions

View file

@ -161,7 +161,8 @@ enum class SpecialRegister : u64 {
LOG_WARNING(Shader, "(STUBBED) SR_AFFINITY"); LOG_WARNING(Shader, "(STUBBED) SR_AFFINITY");
return ir.Imm32(0); // This is the default value hardware returns. return ir.Imm32(0); // This is the default value hardware returns.
default: default:
throw NotImplementedException("S2R special register {}", special_register); LOG_CRITICAL(Shader, "(STUBBED) Special register {}", special_register);
return ir.Imm32(0); // This is the default value hardware returns.
} }
} }
} // Anonymous namespace } // Anonymous namespace

View file

@ -664,6 +664,19 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
std::move(modules), infos); std::move(modules), infos);
} catch (const Shader::Exception& exception) { } catch (const Shader::Exception& exception) {
auto hash = key.Hash();
size_t env_index{0};
for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
if (key.unique_hashes[index] == 0) {
continue;
}
Shader::Environment& env{*envs[env_index]};
++env_index;
const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))};
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
env.Dump(hash, key.unique_hashes[index]);
}
LOG_ERROR(Render_Vulkan, "{}", exception.what()); LOG_ERROR(Render_Vulkan, "{}", exception.what());
return nullptr; return nullptr;
} }