aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/dma_pusher.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-06-23 06:31:25 +0200
committercrueter <crueter@eden-emu.dev>2026-06-23 06:31:25 +0200
commit3aa0d462598beb2021308eee1d757d74fe33b312 (patch)
treeed425c3845ba8fa61184d97b0588cb049b518bd7 /src/video_core/dma_pusher.cpp
parentf8facda35fe7f17143f84bbfbdacc4cc48678946 (diff)
[video_core, hle] remove redundant parent references in system structs (#3908)
reworked a bit to remove references of parent objects and instead pass as arguments to methods to prevent useless reloads Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3908 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev>
Diffstat (limited to 'src/video_core/dma_pusher.cpp')
-rw-r--r--src/video_core/dma_pusher.cpp46
1 files changed, 20 insertions, 26 deletions
diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp
index 8a7798e035..41bb43f0c1 100644
--- a/src/video_core/dma_pusher.cpp
+++ b/src/video_core/dma_pusher.cpp
@@ -12,37 +12,32 @@
#include "video_core/guest_memory.h"
#include "video_core/memory_manager.h"
#include "video_core/rasterizer_interface.h"
-#include "video_core/texture_cache/util.h"
-
-#ifdef _MSC_VER
-#include <intrin.h>
-#endif
namespace Tegra {
constexpr u32 MacroRegistersStart = 0xE00;
[[maybe_unused]] constexpr u32 ComputeInline = 0x6D;
-DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_,
- Control::ChannelState& channel_state_)
- : gpu{gpu_}, system{system_}, memory_manager{memory_manager_}, puller{gpu_, memory_manager_,
- *this, channel_state_}, signal_sync{false}, synced{true} {}
+DmaPusher::DmaPusher(Core::System& system_, MemoryManager& memory_manager_, Control::ChannelState& channel_state_)
+ : system{system_}
+ , memory_manager{memory_manager_}
+ , channel_state{channel_state_}
+ , signal_sync{false}
+ , synced{false}
+{}
DmaPusher::~DmaPusher() = default;
void DmaPusher::DispatchCalls() {
-
dma_pushbuffer_subindex = 0;
-
dma_state.is_last_call = true;
-
while (system.IsPoweredOn()) {
if (!Step()) {
break;
}
}
- gpu.FlushCommands();
- gpu.OnCommandListEnd();
+ system.GPU().FlushCommands();
+ system.GPU().OnCommandListEnd();
}
bool DmaPusher::Step() {
@@ -171,9 +166,9 @@ void DmaPusher::SetState(const CommandHeader& command_header) {
dma_state.method_count = command_header.method_count;
}
-void DmaPusher::CallMethod(u32 argument) const {
+void DmaPusher::CallMethod(u32 argument) {
if (dma_state.method < non_puller_methods) {
- puller.CallPullerMethod(Engines::Puller::MethodCall{
+ puller.CallPullerMethod(*this, Engines::Puller::MethodCall{
dma_state.method,
argument,
dma_state.subchannel,
@@ -181,30 +176,29 @@ void DmaPusher::CallMethod(u32 argument) const {
});
} else {
auto subchannel = subchannels[dma_state.subchannel];
- if (subchannel->execution_mask[dma_state.method]) {
- subchannel->ConsumeSink();
- subchannel->current_dma_segment = dma_state.dma_get + dma_state.dma_word_offset;
- subchannel->CallMethod(dma_state.method, argument, dma_state.is_last_call);
- } else {
+ if (!subchannel->execution_mask[dma_state.method]) {
subchannel->method_sink.emplace_back(dma_state.method, argument);
+ } else {
+ subchannel->ConsumeSink(system);
+ subchannel->current_dma_segment = dma_state.dma_get + dma_state.dma_word_offset;
+ subchannel->CallMethod(system, dma_state.method, argument, dma_state.is_last_call);
}
}
}
-void DmaPusher::CallMultiMethod(const u32* base_start, u32 num_methods) const {
+void DmaPusher::CallMultiMethod(const u32* base_start, u32 num_methods) {
if (dma_state.method < non_puller_methods) {
- puller.CallMultiMethod(dma_state.method, dma_state.subchannel, base_start, num_methods, dma_state.method_count);
+ puller.CallMultiMethod(*this, dma_state.method, dma_state.subchannel, base_start, num_methods, dma_state.method_count);
} else {
auto subchannel = subchannels[dma_state.subchannel];
- subchannel->ConsumeSink();
+ subchannel->ConsumeSink(system);
subchannel->current_dma_segment = dma_state.dma_get + dma_state.dma_word_offset;
- subchannel->CallMultiMethod(dma_state.method, base_start, num_methods, dma_state.method_count);
+ subchannel->CallMultiMethod(system, dma_state.method, base_start, num_methods, dma_state.method_count);
}
}
void DmaPusher::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) {
rasterizer = rasterizer_;
- puller.BindRasterizer(rasterizer);
}
} // namespace Tegra