mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	
						commit
						96cafbe4cc
					
				@ -32,6 +32,12 @@ namespace Shader {
 | 
			
		||||
static std::unordered_map<u64, CompiledShader*> shader_map;
 | 
			
		||||
static JitCompiler jit;
 | 
			
		||||
static CompiledShader* jit_shader;
 | 
			
		||||
 | 
			
		||||
static void ClearCache() {
 | 
			
		||||
    shader_map.clear();
 | 
			
		||||
    jit.Clear();
 | 
			
		||||
    LOG_INFO(HW_GPU, "Shader JIT cache cleared");
 | 
			
		||||
}
 | 
			
		||||
#endif // ARCHITECTURE_x86_64
 | 
			
		||||
 | 
			
		||||
void Setup(UnitState<false>& state) {
 | 
			
		||||
@ -45,6 +51,12 @@ void Setup(UnitState<false>& state) {
 | 
			
		||||
        if (iter != shader_map.end()) {
 | 
			
		||||
            jit_shader = iter->second;
 | 
			
		||||
        } 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();
 | 
			
		||||
            shader_map.emplace(cache_key, jit_shader);
 | 
			
		||||
        }
 | 
			
		||||
@ -54,7 +66,7 @@ void Setup(UnitState<false>& state) {
 | 
			
		||||
 | 
			
		||||
void Shutdown() {
 | 
			
		||||
#ifdef ARCHITECTURE_x86_64
 | 
			
		||||
    shader_map.clear();
 | 
			
		||||
    ClearCache();
 | 
			
		||||
#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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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)",
 | 
			
		||||
        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(),
 | 
			
		||||
 | 
			
		||||
@ -645,7 +645,8 @@ void JitCompiler::Compile_MAD(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
 | 
			
		||||
    if (instr.opcode.Value() == OpCode::Id::IFU) {
 | 
			
		||||
@ -676,7 +677,8 @@ void JitCompiler::Compile_IF(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");
 | 
			
		||||
 | 
			
		||||
    looping = true;
 | 
			
		||||
@ -704,7 +706,8 @@ void JitCompiler::Compile_LOOP(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)
 | 
			
		||||
        Compile_EvaluateCondition(instr);
 | 
			
		||||
@ -748,7 +751,7 @@ void JitCompiler::Compile_NextInstr(unsigned* offset) {
 | 
			
		||||
    } else {
 | 
			
		||||
        // Unhandled instruction
 | 
			
		||||
        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() {
 | 
			
		||||
    AllocCodeSpace(1024 * 1024 * 4);
 | 
			
		||||
    AllocCodeSpace(jit_cache_size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Clear() {
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,11 @@ namespace Pica {
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user