|
|
@@ -12,6 +12,8 @@
|
|
|
#include "video_core/engines/shader_bytecode.h"
|
|
|
#include "video_core/shader/shader_ir.h"
|
|
|
|
|
|
+#pragma optimize("", off)
|
|
|
+
|
|
|
namespace VideoCommon::Shader {
|
|
|
|
|
|
using Tegra::Shader::Attribute;
|
|
|
@@ -239,6 +241,21 @@ u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) {
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ case OpCode::Id::AL2P: {
|
|
|
+ // Ignore al2p.direction since we don't care about it.
|
|
|
+
|
|
|
+ // Calculate emulation fake physical address.
|
|
|
+ const Node fixed_address{Immediate(static_cast<u32>(instr.al2p.address))};
|
|
|
+ const Node reg{GetRegister(instr.gpr8)};
|
|
|
+ const Node fake_address{Operation(OperationCode::IAdd, NO_PRECISE, reg, fixed_address)};
|
|
|
+
|
|
|
+ // Set the fake address to target register.
|
|
|
+ SetRegister(bb, instr.gpr0, fake_address);
|
|
|
+
|
|
|
+ // Signal the shader IR to declare all possible attributes and varyings
|
|
|
+ use_physical_attributes = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
default:
|
|
|
UNIMPLEMENTED_MSG("Unhandled memory instruction: {}", opcode->get().GetName());
|
|
|
}
|