mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 13:20:27 -06:00
VideoCommon: use a new async event system for efb access
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
#include "Common/Event.h"
|
||||
#include "Core/ConfigManager.h"
|
||||
|
||||
#include "VideoCommon/AsyncRequests.h"
|
||||
#include "VideoCommon/BoundingBox.h"
|
||||
#include "VideoCommon/BPStructs.h"
|
||||
#include "VideoCommon/CommandProcessor.h"
|
||||
@ -20,8 +21,6 @@ bool s_BackendInitialized = false;
|
||||
|
||||
Common::Flag s_swapRequested;
|
||||
static Common::Flag s_FifoShuttingDown;
|
||||
static Common::Flag s_efbAccessRequested;
|
||||
static Common::Event s_efbAccessReadyEvent;
|
||||
|
||||
static Common::Flag s_perfQueryRequested;
|
||||
static Common::Event s_perfQueryReadyEvent;
|
||||
@ -39,16 +38,6 @@ static volatile struct
|
||||
u32 fbHeight;
|
||||
} s_beginFieldArgs;
|
||||
|
||||
static struct
|
||||
{
|
||||
EFBAccessType type;
|
||||
u32 x;
|
||||
u32 y;
|
||||
u32 Data;
|
||||
} s_accessEFBArgs;
|
||||
|
||||
static u32 s_AccessEFBResult = 0;
|
||||
|
||||
void VideoBackendHardware::EmuStateChange(EMUSTATE_CHANGE newState)
|
||||
{
|
||||
EmulatorState((newState == EMUSTATE_CHANGE_PLAY) ? true : false);
|
||||
@ -64,7 +53,6 @@ void VideoBackendHardware::Video_ExitLoop()
|
||||
{
|
||||
ExitGpuLoop();
|
||||
s_FifoShuttingDown.Set();
|
||||
s_efbAccessReadyEvent.Set();
|
||||
s_perfQueryReadyEvent.Set();
|
||||
}
|
||||
|
||||
@ -152,44 +140,36 @@ bool VideoBackendHardware::Video_Screenshot(const std::string& filename)
|
||||
return true;
|
||||
}
|
||||
|
||||
void VideoFifo_CheckEFBAccess()
|
||||
{
|
||||
if (s_efbAccessRequested.IsSet())
|
||||
{
|
||||
s_AccessEFBResult = g_renderer->AccessEFB(s_accessEFBArgs.type, s_accessEFBArgs.x, s_accessEFBArgs.y, s_accessEFBArgs.Data);
|
||||
s_efbAccessRequested.Clear();
|
||||
s_efbAccessReadyEvent.Set();
|
||||
}
|
||||
}
|
||||
|
||||
u32 VideoBackendHardware::Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData)
|
||||
{
|
||||
if (s_BackendInitialized && g_ActiveConfig.bEFBAccessEnable)
|
||||
if (!g_ActiveConfig.bEFBAccessEnable)
|
||||
{
|
||||
SyncGPU(SYNC_GPU_EFB_POKE);
|
||||
|
||||
s_accessEFBArgs.type = type;
|
||||
s_accessEFBArgs.x = x;
|
||||
s_accessEFBArgs.y = y;
|
||||
s_accessEFBArgs.Data = InputData;
|
||||
|
||||
s_efbAccessRequested.Set();
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
|
||||
{
|
||||
s_efbAccessReadyEvent.Reset();
|
||||
if (s_FifoShuttingDown.IsSet())
|
||||
return 0;
|
||||
s_efbAccessRequested.Set();
|
||||
s_efbAccessReadyEvent.Wait();
|
||||
}
|
||||
else
|
||||
VideoFifo_CheckEFBAccess();
|
||||
|
||||
return s_AccessEFBResult;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (type == POKE_COLOR || type == POKE_Z)
|
||||
{
|
||||
AsyncRequests::Event e;
|
||||
e.type = type == POKE_COLOR ? AsyncRequests::Event::EFB_POKE_COLOR : AsyncRequests::Event::EFB_POKE_Z;
|
||||
e.time = 0;
|
||||
e.efb_poke.data = InputData;
|
||||
e.efb_poke.x = x;
|
||||
e.efb_poke.y = y;
|
||||
AsyncRequests::GetInstance()->PushEvent(e, 0);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
AsyncRequests::Event e;
|
||||
u32 result;
|
||||
e.type = type == PEEK_COLOR ? AsyncRequests::Event::EFB_PEEK_COLOR : AsyncRequests::Event::EFB_PEEK_Z;
|
||||
e.time = 0;
|
||||
e.efb_peek.x = x;
|
||||
e.efb_peek.y = y;
|
||||
e.efb_peek.data = &result;
|
||||
AsyncRequests::GetInstance()->PushEvent(e, 1);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
static void VideoFifo_CheckPerfQueryRequest()
|
||||
@ -267,12 +247,9 @@ void VideoBackendHardware::InitializeShared()
|
||||
VideoCommon_Init();
|
||||
|
||||
s_swapRequested.Clear();
|
||||
s_efbAccessRequested.Clear();
|
||||
s_perfQueryRequested.Clear();
|
||||
s_FifoShuttingDown.Clear();
|
||||
memset((void*)&s_beginFieldArgs, 0, sizeof(s_beginFieldArgs));
|
||||
memset(&s_accessEFBArgs, 0, sizeof(s_accessEFBArgs));
|
||||
s_AccessEFBResult = 0;
|
||||
m_invalid = false;
|
||||
}
|
||||
|
||||
@ -292,10 +269,7 @@ void VideoBackendHardware::DoState(PointerWrap& p)
|
||||
p.DoMarker("VideoCommon");
|
||||
|
||||
p.Do(s_swapRequested);
|
||||
p.Do(s_efbAccessRequested);
|
||||
p.Do(s_beginFieldArgs);
|
||||
p.Do(s_accessEFBArgs);
|
||||
p.Do(s_AccessEFBResult);
|
||||
p.DoMarker("VideoBackendHardware");
|
||||
|
||||
// Refresh state.
|
||||
@ -335,7 +309,6 @@ void VideoBackendHardware::RunLoop(bool enable)
|
||||
void VideoFifo_CheckAsyncRequest()
|
||||
{
|
||||
VideoFifo_CheckSwapRequest();
|
||||
VideoFifo_CheckEFBAccess();
|
||||
VideoFifo_CheckPerfQueryRequest();
|
||||
VideoFifo_CheckBBoxRequest();
|
||||
}
|
||||
|
Reference in New Issue
Block a user