From 39a7096711fa991e78fe297960137941b52120eb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 13 Apr 2013 00:48:53 -0500 Subject: [PATCH] Extend our OSD class to support callbacks on init, onframe, and shutdown. --- .../Core/VideoCommon/Src/OnScreenDisplay.cpp | 35 +++++++++++++++++++ Source/Core/VideoCommon/Src/OnScreenDisplay.h | 12 +++++++ Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 4 ++- Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 12 ++++++- .../Plugin_VideoSoftware/Src/SWRenderer.cpp | 5 +++ .../Plugin_VideoSoftware/Src/SWmain.cpp | 20 +++++++---- 6 files changed, 79 insertions(+), 9 deletions(-) diff --git a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp index 10cf5b84af..ffe0766e44 100644 --- a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp +++ b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp @@ -24,6 +24,8 @@ #include "RenderBase.h" #include "Timer.h" +#include + namespace OSD { @@ -39,6 +41,26 @@ struct MESSAGE u32 dwTimeStamp; }; +class CALLBACK +{ +private: + CallbackPtr m_functionptr; + CallbackType m_type; + u32 m_data; +public: + CALLBACK(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) + { + m_type = OnType; + m_functionptr = FuncPtr; + m_data = UserData; + } + void Call() + { + m_functionptr(m_data); + } + CallbackType Type() { return m_type; } +}; +std::vector m_callbacks; static std::list s_listMsgs; void AddMessage(const char* pstr, u32 ms) @@ -86,4 +108,17 @@ void ClearMessages() it = s_listMsgs.erase(it); } +// On-Screen Display Callbacks +void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) +{ + m_callbacks.push_back(CALLBACK(OnType, FuncPtr, UserData)); +} + +void DoCallbacks(CallbackType OnType) +{ + for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) + if (it->Type() == OnType) + it->Call(); +} + } // namespace diff --git a/Source/Core/VideoCommon/Src/OnScreenDisplay.h b/Source/Core/VideoCommon/Src/OnScreenDisplay.h index 80187b8ac3..d90d4c35e4 100644 --- a/Source/Core/VideoCommon/Src/OnScreenDisplay.h +++ b/Source/Core/VideoCommon/Src/OnScreenDisplay.h @@ -26,6 +26,18 @@ void AddMessage(const char* str, u32 ms = 2000); void DrawMessages(); // draw the current messages on the screen. Only call once per frame. void ClearMessages(); +// On-screen callbacks +enum CallbackType +{ + OSD_INIT = 0, + OSD_ONFRAME, + OSD_SHUTDOWN +}; +typedef void(*CallbackPtr)(u32); + +void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData); + +void DoCallbacks(CallbackType OnType); } // namespace #endif // _OSD_H_ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index d6c161614e..ea2f02f365 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -1409,7 +1409,9 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons DrawDebugText(); GL_REPORT_ERRORD(); - + + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_ONFRAME); OSD::DrawMessages(); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index b1720789d1..6ff0d6af1b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -157,7 +157,10 @@ void VideoBackend::ShowConfig(void *_hParent) diag.ShowModal(); #endif } - +void Test(u32 Data) +{ + printf("Data: %d\n", Data); +} bool VideoBackend::Initialize(void *&window_handle) { InitializeShared(); @@ -175,6 +178,9 @@ bool VideoBackend::Initialize(void *&window_handle) if (!GLInterface->Create(window_handle)) return false; + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_INIT); + s_BackendInitialized = true; return true; @@ -222,6 +228,10 @@ void VideoBackend::Video_Prepare() void VideoBackend::Shutdown() { s_BackendInitialized = false; + + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_SHUTDOWN); + GLInterface->Shutdown(); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp index 2151a0647d..65112c9a36 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp @@ -23,6 +23,8 @@ #include "SWRenderer.h" #include "SWStatistics.h" +#include "OnScreenDisplay.h" + static GLuint s_RenderTarget = 0; static GLint attr_pos = -1, attr_tex = -1; @@ -181,6 +183,9 @@ void SWRenderer::DrawTexture(u8 *texture, int width, int height) void SWRenderer::SwapBuffer() { + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_ONFRAME); + DrawDebugText(); glFlush(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp index 84987b4dcf..e9511f1c02 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp @@ -43,6 +43,7 @@ #include "SWVertexLoader.h" #include "SWStatistics.h" +#include "OnScreenDisplay.h" #define VSYNC_ENABLED 0 namespace SW @@ -81,6 +82,8 @@ bool VideoSoftware::Initialize(void *&window_handle) INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n"); return false; } + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_INIT); InitBPMemory(); InitXFMemory(); @@ -111,15 +114,15 @@ void VideoSoftware::DoState(PointerWrap& p) OpcodeDecoder::DoState(p); Clipper::DoState(p); p.Do(swxfregs); - p.Do(bpmem); + p.Do(bpmem); p.DoPOD(swstats); // CP Memory - p.DoArray(arraybases, 16); - p.DoArray(arraystrides, 16); - p.Do(MatrixIndexA); - p.Do(MatrixIndexB); - p.Do(g_VtxDesc.Hex); + p.DoArray(arraybases, 16); + p.DoArray(arraystrides, 16); + p.Do(MatrixIndexA); + p.Do(MatrixIndexB); + p.Do(g_VtxDesc.Hex); p.DoArray(g_VtxAttr, 8); p.DoMarker("CP Memory"); @@ -162,7 +165,10 @@ void VideoSoftware::Shutdown() // TODO: should be in Video_Cleanup HwRasterizer::Shutdown(); SWRenderer::Shutdown(); - + + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_SHUTDOWN); + GLInterface->Shutdown(); }