mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2026-04-29 23:41:05 -06:00
76 lines
2.1 KiB
C++
76 lines
2.1 KiB
C++
// Copyright 2024 Azahar Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "common/settings.h"
|
|
#include "right_eye_disabler.h"
|
|
#include "video_core/gpu.h"
|
|
#include "video_core/gpu_impl.h"
|
|
|
|
namespace VideoCore {
|
|
bool RightEyeDisabler::ShouldAllowCmdQueueTrigger(PAddr addr, u32 size) {
|
|
if (!enabled || !enable_for_frame)
|
|
return true;
|
|
|
|
constexpr u32 top_screen_size = 0x00469000;
|
|
|
|
if (report_end_frame_pending) {
|
|
ReportEndFrame();
|
|
report_end_frame_pending = false;
|
|
}
|
|
cmd_queue_trigger_happened = true;
|
|
|
|
auto guess = gpu.impl->pica.GuessCmdRenderProperties(addr, size);
|
|
if (guess.vp_height == top_screen_size && !top_screen_blocked) {
|
|
if (top_screen_buf == 0) {
|
|
top_screen_buf = guess.paddr;
|
|
}
|
|
top_screen_drawn = true;
|
|
if (top_screen_transfered) {
|
|
cmd_trigger_blocked = true;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
cmd_trigger_blocked = false;
|
|
return true;
|
|
}
|
|
bool RightEyeDisabler::ShouldAllowDisplayTransfer(PAddr src_address, size_t size) {
|
|
if (!enabled || !enable_for_frame)
|
|
return true;
|
|
|
|
if (size >= 400 && !top_screen_blocked) {
|
|
if (top_screen_drawn && src_address == top_screen_buf) {
|
|
top_screen_transfered = true;
|
|
}
|
|
|
|
if (src_address == top_screen_buf && cmd_trigger_blocked) {
|
|
top_screen_blocked = true;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (cmd_queue_trigger_happened)
|
|
display_tranfer_happened = true;
|
|
return true;
|
|
}
|
|
void RightEyeDisabler::ReportEndFrame() {
|
|
if (!enabled)
|
|
return;
|
|
|
|
enable_for_frame = Settings::values.disable_right_eye_render.GetValue();
|
|
|
|
if (display_tranfer_happened) {
|
|
top_screen_drawn = false;
|
|
top_screen_transfered = false;
|
|
top_screen_blocked = false;
|
|
cmd_queue_trigger_happened = false;
|
|
cmd_trigger_blocked = false;
|
|
display_tranfer_happened = false;
|
|
top_screen_buf = 0;
|
|
} else {
|
|
report_end_frame_pending = true;
|
|
}
|
|
}
|
|
} // namespace VideoCore
|