diff options
author | bunnei <bunneidev@gmail.com> | 2020-06-04 17:40:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-04 17:40:52 +0200 |
commit | 34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0 (patch) | |
tree | 95b864039ba58c858b0bb89c2eb6b56a25475d22 /src/video_core/macro/macro_interpreter.h | |
parent | Merge pull request #4039 from FearlessTobi/port-5376 (diff) | |
parent | Default init labels and use initializer list for macro engine (diff) | |
download | yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar.gz yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar.bz2 yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar.lz yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar.xz yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.tar.zst yuzu-34d4abc4f9c264fb4dfc32b9b44aaeecaa4695a0.zip |
Diffstat (limited to 'src/video_core/macro/macro_interpreter.h')
-rw-r--r-- | src/video_core/macro/macro_interpreter.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/video_core/macro/macro_interpreter.h b/src/video_core/macro/macro_interpreter.h new file mode 100644 index 000000000..90217fc89 --- /dev/null +++ b/src/video_core/macro/macro_interpreter.h @@ -0,0 +1,102 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once +#include <array> +#include <optional> +#include <vector> +#include "common/bit_field.h" +#include "common/common_types.h" +#include "video_core/macro/macro.h" + +namespace Tegra { +namespace Engines { +class Maxwell3D; +} + +class MacroInterpreter final : public MacroEngine { +public: + explicit MacroInterpreter(Engines::Maxwell3D& maxwell3d); + +protected: + std::unique_ptr<CachedMacro> Compile(const std::vector<u32>& code) override; + +private: + Engines::Maxwell3D& maxwell3d; +}; + +class MacroInterpreterImpl : public CachedMacro { +public: + MacroInterpreterImpl(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& code); + void Execute(const std::vector<u32>& parameters, u32 method) override; + +private: + /// Resets the execution engine state, zeroing registers, etc. + void Reset(); + + /** + * Executes a single macro instruction located at the current program counter. Returns whether + * the interpreter should keep running. + * @param offset Offset to start execution at. + * @param is_delay_slot Whether the current step is being executed due to a delay slot in a + * previous instruction. + */ + bool Step(bool is_delay_slot); + + /// Calculates the result of an ALU operation. src_a OP src_b; + u32 GetALUResult(Macro::ALUOperation operation, u32 src_a, u32 src_b); + + /// Performs the result operation on the input result and stores it in the specified register + /// (if necessary). + void ProcessResult(Macro::ResultOperation operation, u32 reg, u32 result); + + /// Evaluates the branch condition and returns whether the branch should be taken or not. + bool EvaluateBranchCondition(Macro::BranchCondition cond, u32 value) const; + + /// Reads an opcode at the current program counter location. + Macro::Opcode GetOpcode() const; + + /// Returns the specified register's value. Register 0 is hardcoded to always return 0. + u32 GetRegister(u32 register_id) const; + + /// Sets the register to the input value. + void SetRegister(u32 register_id, u32 value); + + /// Sets the method address to use for the next Send instruction. + void SetMethodAddress(u32 address); + + /// Calls a GPU Engine method with the input parameter. + void Send(u32 value); + + /// Reads a GPU register located at the method address. + u32 Read(u32 method) const; + + /// Returns the next parameter in the parameter queue. + u32 FetchParameter(); + + Engines::Maxwell3D& maxwell3d; + + /// Current program counter + u32 pc; + /// Program counter to execute at after the delay slot is executed. + std::optional<u32> delayed_pc; + + /// General purpose macro registers. + std::array<u32, Macro::NUM_MACRO_REGISTERS> registers = {}; + + /// Method address to use for the next Send instruction. + Macro::MethodAddress method_address = {}; + + /// Input parameters of the current macro. + std::unique_ptr<u32[]> parameters; + std::size_t num_parameters = 0; + std::size_t parameters_capacity = 0; + /// Index of the next parameter that will be fetched by the 'parm' instruction. + u32 next_parameter_index = 0; + + bool carry_flag = false; + const std::vector<u32>& code; +}; + +} // namespace Tegra |