1 // Copyright 2016 Citra Emulator Project 2 // Licensed under GPLv2 or any later version 3 // Refer to the license.txt file included. 4 5 #include "common/microprofile.h" 6 #include "video_core/shader/shader.h" 7 #include "video_core/shader/shader_jit_x64.h" 8 #include "video_core/shader/shader_jit_x64_compiler.h" 9 10 namespace Pica::Shader { 11 12 JitX64Engine::JitX64Engine() = default; 13 JitX64Engine::~JitX64Engine() = default; 14 SetupBatch(ShaderSetup & setup,unsigned int entry_point)15void JitX64Engine::SetupBatch(ShaderSetup& setup, unsigned int entry_point) { 16 ASSERT(entry_point < MAX_PROGRAM_CODE_LENGTH); 17 setup.engine_data.entry_point = entry_point; 18 19 u64 code_hash = setup.GetProgramCodeHash(); 20 u64 swizzle_hash = setup.GetSwizzleDataHash(); 21 22 u64 cache_key = code_hash ^ swizzle_hash; 23 auto iter = cache.find(cache_key); 24 if (iter != cache.end()) { 25 setup.engine_data.cached_shader = iter->second.get(); 26 } else { 27 auto shader = std::make_unique<JitShader>(); 28 shader->Compile(&setup.program_code, &setup.swizzle_data); 29 setup.engine_data.cached_shader = shader.get(); 30 cache.emplace_hint(iter, cache_key, std::move(shader)); 31 } 32 } 33 34 MICROPROFILE_DECLARE(GPU_Shader); 35 Run(const ShaderSetup & setup,UnitState & state) const36void JitX64Engine::Run(const ShaderSetup& setup, UnitState& state) const { 37 ASSERT(setup.engine_data.cached_shader != nullptr); 38 39 MICROPROFILE_SCOPE(GPU_Shader); 40 41 const JitShader* shader = static_cast<const JitShader*>(setup.engine_data.cached_shader); 42 shader->Run(setup, state, setup.engine_data.entry_point); 43 } 44 45 } // namespace Pica::Shader 46