yuzu-emu
/
yuzu-android
Archived
1
0
Fork 0

Merge pull request #1503 from bunnei/clear-jit-cache

Clear JIT cache
This commit is contained in:
bunnei 2016-03-16 13:18:51 -04:00
commit 96cafbe4cc
3 changed files with 27 additions and 7 deletions

View File

@ -32,6 +32,12 @@ namespace Shader {
static std::unordered_map<u64, CompiledShader*> shader_map; static std::unordered_map<u64, CompiledShader*> shader_map;
static JitCompiler jit; static JitCompiler jit;
static CompiledShader* jit_shader; static CompiledShader* jit_shader;
static void ClearCache() {
shader_map.clear();
jit.Clear();
LOG_INFO(HW_GPU, "Shader JIT cache cleared");
}
#endif // ARCHITECTURE_x86_64 #endif // ARCHITECTURE_x86_64
void Setup(UnitState<false>& state) { void Setup(UnitState<false>& state) {
@ -45,6 +51,12 @@ void Setup(UnitState<false>& state) {
if (iter != shader_map.end()) { if (iter != shader_map.end()) {
jit_shader = iter->second; jit_shader = iter->second;
} else { } else {
// Check if remaining JIT code space is enough for at least one more (massive) shader
if (jit.GetSpaceLeft() < jit_shader_size) {
// If not, clear the cache of all previously compiled shaders
ClearCache();
}
jit_shader = jit.Compile(); jit_shader = jit.Compile();
shader_map.emplace(cache_key, jit_shader); shader_map.emplace(cache_key, jit_shader);
} }
@ -54,7 +66,7 @@ void Setup(UnitState<false>& state) {
void Shutdown() { void Shutdown() {
#ifdef ARCHITECTURE_x86_64 #ifdef ARCHITECTURE_x86_64
shader_map.clear(); ClearCache();
#endif // ARCHITECTURE_x86_64 #endif // ARCHITECTURE_x86_64
} }
@ -135,7 +147,7 @@ OutputVertex Run(UnitState<false>& state, const InputVertex& input, int num_attr
std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f)); std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f));
} }
LOG_TRACE(Render_Software, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), " LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), "
"col(%.2f, %.2f, %.2f, %.2f), tc0(%.2f, %.2f), view(%.2f, %.2f, %.2f)", "col(%.2f, %.2f, %.2f, %.2f), tc0(%.2f, %.2f), view(%.2f, %.2f, %.2f)",
ret.pos.x.ToFloat32(), ret.pos.y.ToFloat32(), ret.pos.z.ToFloat32(), ret.pos.w.ToFloat32(), ret.pos.x.ToFloat32(), ret.pos.y.ToFloat32(), ret.pos.z.ToFloat32(), ret.pos.w.ToFloat32(),
ret.quat.x.ToFloat32(), ret.quat.y.ToFloat32(), ret.quat.z.ToFloat32(), ret.quat.w.ToFloat32(), ret.quat.x.ToFloat32(), ret.quat.y.ToFloat32(), ret.quat.z.ToFloat32(), ret.quat.w.ToFloat32(),

View File

@ -645,7 +645,8 @@ void JitCompiler::Compile_MAD(Instruction instr) {
} }
void JitCompiler::Compile_IF(Instruction instr) { void JitCompiler::Compile_IF(Instruction instr) {
ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards if-statements not supported"); ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards if-statements (%d -> %d) not supported",
*offset_ptr, instr.flow_control.dest_offset.Value());
// Evaluate the "IF" condition // Evaluate the "IF" condition
if (instr.opcode.Value() == OpCode::Id::IFU) { if (instr.opcode.Value() == OpCode::Id::IFU) {
@ -676,7 +677,8 @@ void JitCompiler::Compile_IF(Instruction instr) {
} }
void JitCompiler::Compile_LOOP(Instruction instr) { void JitCompiler::Compile_LOOP(Instruction instr) {
ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards loops not supported"); ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards loops (%d -> %d) not supported",
*offset_ptr, instr.flow_control.dest_offset.Value());
ASSERT_MSG(!looping, "Nested loops not supported"); ASSERT_MSG(!looping, "Nested loops not supported");
looping = true; looping = true;
@ -704,7 +706,8 @@ void JitCompiler::Compile_LOOP(Instruction instr) {
} }
void JitCompiler::Compile_JMP(Instruction instr) { void JitCompiler::Compile_JMP(Instruction instr) {
ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards jumps not supported"); ASSERT_MSG(instr.flow_control.dest_offset > *offset_ptr, "Backwards jumps (%d -> %d) not supported",
*offset_ptr, instr.flow_control.dest_offset.Value());
if (instr.opcode.Value() == OpCode::Id::JMPC) if (instr.opcode.Value() == OpCode::Id::JMPC)
Compile_EvaluateCondition(instr); Compile_EvaluateCondition(instr);
@ -748,7 +751,7 @@ void JitCompiler::Compile_NextInstr(unsigned* offset) {
} else { } else {
// Unhandled instruction // Unhandled instruction
LOG_CRITICAL(HW_GPU, "Unhandled instruction: 0x%02x (0x%08x)", LOG_CRITICAL(HW_GPU, "Unhandled instruction: 0x%02x (0x%08x)",
instr.opcode.Value().EffectiveOpCode(), instr.hex); instr.opcode.Value().EffectiveOpCode(), instr.hex);
} }
} }
@ -787,7 +790,7 @@ CompiledShader* JitCompiler::Compile() {
} }
JitCompiler::JitCompiler() { JitCompiler::JitCompiler() {
AllocCodeSpace(1024 * 1024 * 4); AllocCodeSpace(jit_cache_size);
} }
void JitCompiler::Clear() { void JitCompiler::Clear() {

View File

@ -19,6 +19,11 @@ namespace Pica {
namespace Shader { namespace Shader {
/// Memory needed to be available to compile the next shader (otherwise, clear the cache)
constexpr size_t jit_shader_size = 1024 * 512;
/// Memory allocated for the JIT code space cache
constexpr size_t jit_cache_size = 1024 * 1024 * 8;
using CompiledShader = void(void* registers); using CompiledShader = void(void* registers);
/** /**