diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 17f5880748..b7fc48bfd2 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -326,6 +326,10 @@ union Instruction { BitField<49, 1, u64> negate_a; } alu_integer; + union { + BitField<40, 1, u64> invert; + } popc; + union { BitField<39, 3, u64> pred; BitField<42, 1, u64> neg_pred; diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index ffb37bfcfa..6eb17f1956 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -1305,6 +1305,9 @@ private: case OpCode::Id::POPC_C: case OpCode::Id::POPC_R: case OpCode::Id::POPC_IMM: { + if (instr.popc.invert) { + op_b = "~(" + op_b + ')'; + } regs.SetRegisterToInteger(instr.gpr0, true, 0, "bitCount(" + op_b + ')', 1, 1); break; }