mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-02 04:20:22 +00:00
FifoPlayer: Generate fake VideoInterface updates
This commit is contained in:
parent
2cd9565b18
commit
5a372020ea
Source/Core
Core
FifoPlayer
HW
VideoCommon
@ -72,6 +72,11 @@ FifoDataFile::FifoDataFile() = default;
|
|||||||
|
|
||||||
FifoDataFile::~FifoDataFile() = default;
|
FifoDataFile::~FifoDataFile() = default;
|
||||||
|
|
||||||
|
bool FifoDataFile::ShouldGenerateFakeVIUpdates() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool FifoDataFile::HasBrokenEFBCopies() const
|
bool FifoDataFile::HasBrokenEFBCopies() const
|
||||||
{
|
{
|
||||||
return m_Version < 2;
|
return m_Version < 2;
|
||||||
|
@ -60,6 +60,7 @@ public:
|
|||||||
void SetIsWii(bool isWii);
|
void SetIsWii(bool isWii);
|
||||||
bool GetIsWii() const;
|
bool GetIsWii() const;
|
||||||
bool HasBrokenEFBCopies() const;
|
bool HasBrokenEFBCopies() const;
|
||||||
|
bool ShouldGenerateFakeVIUpdates() const;
|
||||||
|
|
||||||
u32* GetBPMem() { return m_BPMem; }
|
u32* GetBPMem() { return m_BPMem; }
|
||||||
u32* GetCPMem() { return m_CPMem; }
|
u32* GetCPMem() { return m_CPMem; }
|
||||||
|
@ -162,6 +162,16 @@ std::unique_ptr<CPUCoreBase> FifoPlayer::GetCPUCore()
|
|||||||
return std::make_unique<CPUCore>(this);
|
return std::make_unique<CPUCore>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FifoPlayer::IsRunningWithFakeVideoInterfaceUpdates() const
|
||||||
|
{
|
||||||
|
if (!m_File || m_File->GetFrameCount() == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_File->ShouldGenerateFakeVIUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
u32 FifoPlayer::GetFrameObjectCount() const
|
u32 FifoPlayer::GetFrameObjectCount() const
|
||||||
{
|
{
|
||||||
if (m_CurrentFrame < m_FrameInfo.size())
|
if (m_CurrentFrame < m_FrameInfo.size())
|
||||||
|
@ -94,6 +94,8 @@ public:
|
|||||||
void SetFrameWrittenCallback(CallbackFunc callback) { m_FrameWrittenCb = callback; }
|
void SetFrameWrittenCallback(CallbackFunc callback) { m_FrameWrittenCb = callback; }
|
||||||
static FifoPlayer& GetInstance();
|
static FifoPlayer& GetInstance();
|
||||||
|
|
||||||
|
bool IsRunningWithFakeVideoInterfaceUpdates() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class CPUCore;
|
class CPUCore;
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
#include "Core/CoreTiming.h"
|
#include "Core/CoreTiming.h"
|
||||||
|
#include "Core/FifoPlayer/FifoPlayer.h"
|
||||||
#include "Core/HW/MMIO.h"
|
#include "Core/HW/MMIO.h"
|
||||||
#include "Core/HW/ProcessorInterface.h"
|
#include "Core/HW/ProcessorInterface.h"
|
||||||
#include "Core/HW/SI/SI.h"
|
#include "Core/HW/SI/SI.h"
|
||||||
@ -549,8 +550,9 @@ float GetAspectRatio()
|
|||||||
|
|
||||||
// 5. Calculate the final ratio and scale to 4:3
|
// 5. Calculate the final ratio and scale to 4:3
|
||||||
float ratio = horizontal_active_ratio / vertical_active_ratio;
|
float ratio = horizontal_active_ratio / vertical_active_ratio;
|
||||||
if (std::isnormal(
|
bool running_fifo_log = FifoPlayer::GetInstance().IsRunningWithFakeVideoInterfaceUpdates();
|
||||||
ratio)) // Check we have a sane ratio and haven't propagated any infs/nans/zeros
|
if (std::isnormal(ratio) && // Check we have a sane ratio without any infs/nans/zeros
|
||||||
|
!running_fifo_log) // we don't know the correct ratio for fifos
|
||||||
return ratio * (4.0f / 3.0f); // Scale to 4:3
|
return ratio * (4.0f / 3.0f); // Scale to 4:3
|
||||||
else
|
else
|
||||||
return (4.0f / 3.0f); // VI isn't initialized correctly, just return 4:3 instead
|
return (4.0f / 3.0f); // VI isn't initialized correctly, just return 4:3 instead
|
||||||
@ -775,4 +777,44 @@ void Update(u64 ticks)
|
|||||||
UpdateInterrupts();
|
UpdateInterrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a fake VI mode for a fifolog
|
||||||
|
void FakeVIUpdate(u32 xfb_address, u32 fb_width, u32 fb_height)
|
||||||
|
{
|
||||||
|
u32 fb_stride = fb_width;
|
||||||
|
|
||||||
|
bool interlaced = fb_height > 480 / 2;
|
||||||
|
if (interlaced)
|
||||||
|
{
|
||||||
|
fb_height = fb_height / 2;
|
||||||
|
fb_stride = fb_stride * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_XFBInfoTop.POFF = 1;
|
||||||
|
m_XFBInfoBottom.POFF = 1;
|
||||||
|
m_VerticalTimingRegister.ACV = fb_height;
|
||||||
|
m_VerticalTimingRegister.EQU = 6;
|
||||||
|
m_VBlankTimingOdd.PRB = 502 - fb_height * 2;
|
||||||
|
m_VBlankTimingOdd.PSB = 5;
|
||||||
|
m_VBlankTimingEven.PRB = 503 - fb_height * 2;
|
||||||
|
m_VBlankTimingEven.PSB = 4;
|
||||||
|
m_PictureConfiguration.WPL = fb_width / 16;
|
||||||
|
m_PictureConfiguration.STD = fb_stride / 16;
|
||||||
|
|
||||||
|
UpdateParameters();
|
||||||
|
|
||||||
|
u32 total_halflines = GetHalfLinesPerEvenField() + GetHalfLinesPerOddField();
|
||||||
|
|
||||||
|
if ((s_half_line_count - s_even_field_first_hl) % total_halflines <
|
||||||
|
(s_half_line_count - s_odd_field_first_hl) % total_halflines)
|
||||||
|
{
|
||||||
|
// Even/Bottom field is next.
|
||||||
|
m_XFBInfoBottom.FBB = interlaced ? (xfb_address + fb_width * 2) >> 5 : xfb_address >> 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Odd/Top field is next
|
||||||
|
m_XFBInfoTop.FBB = (xfb_address >> 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -373,4 +373,7 @@ u32 GetTicksPerField();
|
|||||||
// result by 1.33333..
|
// result by 1.33333..
|
||||||
float GetAspectRatio();
|
float GetAspectRatio();
|
||||||
|
|
||||||
|
// Create a fake VI mode for a fifolog
|
||||||
|
void FakeVIUpdate(u32 xfb_address, u32 fb_width, u32 fb_height);
|
||||||
|
|
||||||
} // namespace VideoInterface
|
} // namespace VideoInterface
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
#include "Common/Thread.h"
|
#include "Common/Thread.h"
|
||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
|
#include "Core/FifoPlayer/FifoPlayer.h"
|
||||||
#include "Core/FifoPlayer/FifoRecorder.h"
|
#include "Core/FifoPlayer/FifoRecorder.h"
|
||||||
#include "Core/HW/Memmap.h"
|
#include "Core/HW/Memmap.h"
|
||||||
|
#include "Core/HW/VideoInterface.h"
|
||||||
|
|
||||||
#include "VideoCommon/BPFunctions.h"
|
#include "VideoCommon/BPFunctions.h"
|
||||||
#include "VideoCommon/BPMemory.h"
|
#include "VideoCommon/BPMemory.h"
|
||||||
@ -263,6 +265,11 @@ static void BPWritten(const BPCmd& bp)
|
|||||||
|
|
||||||
// This stays in to signal end of a "frame"
|
// This stays in to signal end of a "frame"
|
||||||
g_renderer->RenderToXFB(destAddr, srcRect, destStride, height, s_gammaLUT[PE_copy.gamma]);
|
g_renderer->RenderToXFB(destAddr, srcRect, destStride, height, s_gammaLUT[PE_copy.gamma]);
|
||||||
|
|
||||||
|
if (FifoPlayer::GetInstance().IsRunningWithFakeVideoInterfaceUpdates())
|
||||||
|
{
|
||||||
|
VideoInterface::FakeVIUpdate(destAddr, srcRect.GetWidth(), height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear the rectangular region after copying it.
|
// Clear the rectangular region after copying it.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user