From bc248f8941ae5f24e651d5bf029740bc96c3df89 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 31 Jan 2015 11:38:23 +0100 Subject: VideoCommon: use a new async event system for efb access --- Source/Core/VideoCommon/MainBase.cpp | 77 ++++++++++++------------------------ 1 file changed, 25 insertions(+), 52 deletions(-) (limited to 'Source/Core/VideoCommon/MainBase.cpp') diff --git a/Source/Core/VideoCommon/MainBase.cpp b/Source/Core/VideoCommon/MainBase.cpp index b5c6cdebf9..47eab7d941 100644 --- a/Source/Core/VideoCommon/MainBase.cpp +++ b/Source/Core/VideoCommon/MainBase.cpp @@ -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() +u32 VideoBackendHardware::Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData) { - if (s_efbAccessRequested.IsSet()) + if (!g_ActiveConfig.bEFBAccessEnable) { - s_AccessEFBResult = g_renderer->AccessEFB(s_accessEFBArgs.type, s_accessEFBArgs.x, s_accessEFBArgs.y, s_accessEFBArgs.Data); - s_efbAccessRequested.Clear(); - s_efbAccessReadyEvent.Set(); + return 0; } -} -u32 VideoBackendHardware::Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData) -{ - if (s_BackendInitialized && g_ActiveConfig.bEFBAccessEnable) + if (type == POKE_COLOR || type == POKE_Z) { - 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; + 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; } - - return 0; } 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(); } -- cgit v1.2.3