diff options
author | Subv <subv2112@gmail.com> | 2018-09-08 22:58:20 +0200 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2018-09-12 20:57:08 +0200 |
commit | bb5eb4f20ac74e06317ed5b0c98282cde1f9e119 (patch) | |
tree | e1b89238165f33c65ff7909eabd846be5f58785c /src/video_core/engines/kepler_memory.h | |
parent | Merge pull request #1303 from lioncash/error (diff) | |
download | yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar.gz yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar.bz2 yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar.lz yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar.xz yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.tar.zst yuzu-bb5eb4f20ac74e06317ed5b0c98282cde1f9e119.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/engines/kepler_memory.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/video_core/engines/kepler_memory.h b/src/video_core/engines/kepler_memory.h new file mode 100644 index 000000000..b0d0078cf --- /dev/null +++ b/src/video_core/engines/kepler_memory.h @@ -0,0 +1,90 @@ +// Copyright 2018 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <array> +#include "common/assert.h" +#include "common/bit_field.h" +#include "common/common_funcs.h" +#include "common/common_types.h" +#include "video_core/memory_manager.h" + +namespace Tegra::Engines { + +#define KEPLERMEMORY_REG_INDEX(field_name) \ + (offsetof(Tegra::Engines::KeplerMemory::Regs, field_name) / sizeof(u32)) + +class KeplerMemory final { +public: + KeplerMemory(MemoryManager& memory_manager); + ~KeplerMemory(); + + /// Write the value to the register identified by method. + void WriteReg(u32 method, u32 value); + + struct Regs { + static constexpr size_t NUM_REGS = 0x7F; + + union { + struct { + INSERT_PADDING_WORDS(0x60); + + u32 line_length_in; + u32 line_count; + + struct { + u32 address_high; + u32 address_low; + u32 pitch; + u32 block_dimensions; + u32 width; + u32 height; + u32 depth; + u32 z; + u32 x; + u32 y; + + GPUVAddr Address() const { + return static_cast<GPUVAddr>((static_cast<GPUVAddr>(address_high) << 32) | + address_low); + } + } dest; + + struct { + union { + BitField<0, 1, u32> linear; + }; + } exec; + + u32 data; + + INSERT_PADDING_WORDS(0x11); + }; + std::array<u32, NUM_REGS> reg_array; + }; + } regs{}; + + struct { + u32 write_offset = 0; + } state{}; + +private: + MemoryManager& memory_manager; + + void ProcessData(u32 data); +}; + +#define ASSERT_REG_POSITION(field_name, position) \ + static_assert(offsetof(KeplerMemory::Regs, field_name) == position * 4, \ + "Field " #field_name " has invalid position") + +ASSERT_REG_POSITION(line_length_in, 0x60); +ASSERT_REG_POSITION(line_count, 0x61); +ASSERT_REG_POSITION(dest, 0x62); +ASSERT_REG_POSITION(exec, 0x6C); +ASSERT_REG_POSITION(data, 0x6D); +#undef ASSERT_REG_POSITION + +} // namespace Tegra::Engines |