summaryrefslogtreecommitdiffstats
path: root/src/video_core/command_classes
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2020-12-28 07:21:41 +0100
committerameerj <52414509+ameerj@users.noreply.github.com>2021-01-07 20:33:45 +0100
commit06cef3355e415be83db3bc6d19b022de0b977580 (patch)
treee4252a544bf01586f651238a8a08c76bb2a3377f /src/video_core/command_classes
parentnvdec syncpt incorporation (diff)
downloadyuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar.gz
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar.bz2
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar.lz
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar.xz
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.tar.zst
yuzu-06cef3355e415be83db3bc6d19b022de0b977580.zip
Diffstat (limited to 'src/video_core/command_classes')
-rw-r--r--src/video_core/command_classes/host1x.cpp21
-rw-r--r--src/video_core/command_classes/host1x.h49
2 files changed, 9 insertions, 61 deletions
diff --git a/src/video_core/command_classes/host1x.cpp b/src/video_core/command_classes/host1x.cpp
index 9d0a1b4d9..b12494528 100644
--- a/src/video_core/command_classes/host1x.cpp
+++ b/src/video_core/command_classes/host1x.cpp
@@ -10,22 +10,14 @@ Tegra::Host1x::Host1x(GPU& gpu_) : gpu(gpu_) {}
Tegra::Host1x::~Host1x() = default;
-void Tegra::Host1x::StateWrite(u32 offset, u32 arguments) {
- u8* const state_offset = reinterpret_cast<u8*>(&state) + offset * sizeof(u32);
- std::memcpy(state_offset, &arguments, sizeof(u32));
-}
-
-void Tegra::Host1x::ProcessMethod(Method method, const std::vector<u32>& arguments) {
- StateWrite(static_cast<u32>(method), arguments[0]);
+void Tegra::Host1x::ProcessMethod(Method method, u32 argument) {
switch (method) {
- case Method::WaitSyncpt:
- Execute(arguments[0]);
- break;
case Method::LoadSyncptPayload32:
- syncpoint_value = arguments[0];
+ syncpoint_value = argument;
break;
+ case Method::WaitSyncpt:
case Method::WaitSyncpt32:
- Execute(arguments[0]);
+ Execute(argument);
break;
default:
UNIMPLEMENTED_MSG("Host1x method 0x{:X}", static_cast<u32>(method));
@@ -34,8 +26,5 @@ void Tegra::Host1x::ProcessMethod(Method method, const std::vector<u32>& argumen
}
void Tegra::Host1x::Execute(u32 data) {
- u32 syncpointId = (data & 0xFF);
- u32 threshold = state.load_syncpoint_payload32;
-
- gpu.WaitFence(syncpointId, threshold);
+ gpu.WaitFence(data, syncpoint_value);
}
diff --git a/src/video_core/command_classes/host1x.h b/src/video_core/command_classes/host1x.h
index 013eaa0c1..7e94799dd 100644
--- a/src/video_core/command_classes/host1x.h
+++ b/src/video_core/command_classes/host1x.h
@@ -14,64 +14,23 @@ class Nvdec;
class Host1x {
public:
- struct Host1xClassRegisters {
- u32 incr_syncpt{};
- u32 incr_syncpt_ctrl{};
- u32 incr_syncpt_error{};
- INSERT_PADDING_WORDS(5);
- u32 wait_syncpt{};
- u32 wait_syncpt_base{};
- u32 wait_syncpt_incr{};
- u32 load_syncpt_base{};
- u32 incr_syncpt_base{};
- u32 clear{};
- u32 wait{};
- u32 wait_with_interrupt{};
- u32 delay_use{};
- u32 tick_count_high{};
- u32 tick_count_low{};
- u32 tick_ctrl{};
- INSERT_PADDING_WORDS(23);
- u32 ind_ctrl{};
- u32 ind_off2{};
- u32 ind_off{};
- std::array<u32, 31> ind_data{};
- INSERT_PADDING_WORDS(1);
- u32 load_syncpoint_payload32{};
- u32 stall_ctrl{};
- u32 wait_syncpt32{};
- u32 wait_syncpt_base32{};
- u32 load_syncpt_base32{};
- u32 incr_syncpt_base32{};
- u32 stall_count_high{};
- u32 stall_count_low{};
- u32 xref_ctrl{};
- u32 channel_xref_high{};
- u32 channel_xref_low{};
- };
- static_assert(sizeof(Host1xClassRegisters) == 0x164, "Host1xClassRegisters is an invalid size");
-
enum class Method : u32 {
- WaitSyncpt = offsetof(Host1xClassRegisters, wait_syncpt) / 4,
- LoadSyncptPayload32 = offsetof(Host1xClassRegisters, load_syncpoint_payload32) / 4,
- WaitSyncpt32 = offsetof(Host1xClassRegisters, wait_syncpt32) / 4,
+ WaitSyncpt = 0x8,
+ LoadSyncptPayload32 = 0x4e,
+ WaitSyncpt32 = 0x50,
};
explicit Host1x(GPU& gpu);
~Host1x();
/// Writes the method into the state, Invoke Execute() if encountered
- void ProcessMethod(Method method, const std::vector<u32>& arguments);
+ void ProcessMethod(Method method, u32 argument);
private:
/// For Host1x, execute is waiting on a syncpoint previously written into the state
void Execute(u32 data);
- /// Write argument into the provided offset
- void StateWrite(u32 offset, u32 arguments);
-
u32 syncpoint_value{};
- Host1xClassRegisters state{};
GPU& gpu;
};