summaryrefslogtreecommitdiffstats
path: root/src/video_core/shader
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2016-03-27 03:02:15 +0200
committerbunnei <bunneidev@gmail.com>2016-04-14 05:04:47 +0200
commita5a74eb121e0586706c3196d450c088280f996a5 (patch)
tree1ed5030e828e221d2c34596effaa1e680a678391 /src/video_core/shader
parentshader_jit_x64: Allocate each program independently and persist for emu session. (diff)
downloadyuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar.gz
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar.bz2
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar.lz
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar.xz
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.tar.zst
yuzu-a5a74eb121e0586706c3196d450c088280f996a5.zip
Diffstat (limited to 'src/video_core/shader')
-rw-r--r--src/video_core/shader/shader.cpp5
-rw-r--r--src/video_core/shader/shader_jit_x64.cpp4
-rw-r--r--src/video_core/shader/shader_jit_x64.h7
3 files changed, 6 insertions, 10 deletions
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index e17368a4a..b35413488 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -36,8 +36,7 @@ void Setup(UnitState<false>& state) {
#ifdef ARCHITECTURE_x86_64
if (VideoCore::g_shader_jit_enabled) {
u64 cache_key = (Common::ComputeHash64(&g_state.vs.program_code, sizeof(g_state.vs.program_code)) ^
- Common::ComputeHash64(&g_state.vs.swizzle_data, sizeof(g_state.vs.swizzle_data)) ^
- g_state.regs.vs.main_offset);
+ Common::ComputeHash64(&g_state.vs.swizzle_data, sizeof(g_state.vs.swizzle_data)));
auto iter = shader_map.find(cache_key);
if (iter != shader_map.end()) {
@@ -98,7 +97,7 @@ OutputVertex Run(UnitState<false>& state, const InputVertex& input, int num_attr
#ifdef ARCHITECTURE_x86_64
if (VideoCore::g_shader_jit_enabled)
- jit_shader->Run(&state.registers);
+ jit_shader->Run(&state.registers, g_state.regs.vs.main_offset);
else
RunInterpreter(state);
#else
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index 3da4e51fa..cbdc1e40f 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -838,9 +838,7 @@ void JitCompiler::Compile() {
fixup_branches.clear();
// Jump to start of the shader program
- if (g_state.regs.vs.main_offset != 0) {
- fixup_branches.push_back({ J(true), g_state.regs.vs.main_offset });
- }
+ JMPptr(R(ABI_PARAM2));
// Compile entire program
Compile_Block(static_cast<unsigned>(g_state.vs.program_code.size()));
diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h
index 19f9bdb56..1501d13bf 100644
--- a/src/video_core/shader/shader_jit_x64.h
+++ b/src/video_core/shader/shader_jit_x64.h
@@ -25,8 +25,6 @@ namespace Shader {
/// Memory allocated for each compiled shader (64Kb)
constexpr size_t MAX_SHADER_SIZE = 1024 * 64;
-using CompiledShader = void(void* registers);
-
/**
* This class implements the shader JIT compiler. It recompiles a Pica shader program into x86_64
* code that can be executed on the host machine directly.
@@ -35,8 +33,8 @@ class JitCompiler : public Gen::XCodeBlock {
public:
JitCompiler();
- void Run(void* registers) const {
- program(registers);
+ void Run(void* registers, unsigned offset) const {
+ program(registers, code_ptr[offset]);
}
void Compile();
@@ -111,6 +109,7 @@ private:
/// Branches that need to be fixed up once the entire shader program is compiled
std::vector<std::pair<Gen::FixupBranch, unsigned>> fixup_branches;
+ using CompiledShader = void(void* registers, const u8* start_addr);
CompiledShader* program = nullptr;
};