From e7dfcdde74e0dfdb3c8da097201d90cbc48c7ff9 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 4 Jun 2018 22:56:28 -0500 Subject: [PATCH] GPU: Corrected the branch targets for the shader bra instruction. --- src/video_core/engines/shader_bytecode.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 8d4ea3401..edb491464 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -328,15 +328,16 @@ union Instruction { } texs; union { - BitField<20, 5, u64> target; + BitField<20, 24, u64> target; BitField<5, 1, u64> constant_buffer; s32 GetBranchTarget() const { // Sign extend the branch target offset - u32 mask = 1U << (5 - 1); + u32 mask = 1U << (24 - 1); u32 value = static_cast(target); - // The branch offset is relative to the next instruction, so add 1 to it. - return static_cast((value ^ mask) - mask) + 1; + // The branch offset is relative to the next instruction and is stored in bytes, so + // divide it by the size of an instruction and add 1 to it. + return static_cast((value ^ mask) - mask) / sizeof(Instruction) + 1; } } bra;