//----------------------------------------------------------------------------- //* Update Screen //! This function is called in response to a vsync of the //! screen where the VI bit in MI_INTR_REG has already been set //----------------------------------------------------------------------------- EXPORT void CALL UpdateScreen() { if (g_config.getConfig()->screenUpdateSetting == SCREEN_UPDATE_VI) g_graphicsPlugin.drawScreen(); else if (g_config.getConfig()->screenUpdateSetting == SCREEN_UPDATE_CI) g_graphicsPlugin.setDrawScreenSignal(); else { Logger::getSingleton().printMsg("Invalid screen update setting!", M64MSG_WARNING); g_graphicsPlugin.drawScreen(); } }
//----------------------------------------------------------------------------- //* ProcessDList //! This function is called when there is a Dlist to be processed. (High level GFX list) //----------------------------------------------------------------------------- EXPORT void CALL ProcessDList() { Logger::getSingleton().printMsg("ProcessDList\n"); try { g_graphicsPlugin.viStatusChanged(); g_graphicsPlugin.processDisplayList(); } catch (...) { Logger::getSingleton().printMsg("Unknown Error processing DisplayList", M64MSG_WARNING); //MessageBox(0, "Unknown Error processing DisplayList", "Arachnoid Graphics Plugin", MB_OK|MB_SETFOREGROUND); g_graphicsPlugin.dispose(); g_graphicsPlugin.initialize(&g_graphicsInfo); //Trigger Interupts *(g_graphicsInfo.MI_INTR_REG) |= MI_INTR_DP; g_graphicsInfo.CheckInterrupts(); *(g_graphicsInfo.MI_INTR_REG) |= MI_INTR_SP; g_graphicsInfo.CheckInterrupts(); } }
EXPORT m64p_error CALL videoPluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context, void (*DebugCallback)(void *, int, const char *)) { char logMsg[530]; Logger::getSingleton().initialize(DebugCallback, Context); Logger::getSingleton().printMsg("PluginStartup"); //Read configuration if (g_config.initialize()) { g_config.load(); g_graphicsPlugin.setConfig(g_config.getConfig()); } return M64ERR_SUCCESS; }
//----------------------------------------------------------------------------- //* InitiateGFX //! This function is called when the DLL is started to give //! information from the emulator that the n64 graphics //! uses. This is not called from the emulation thread. //! @param[in] Gfx_Info Information about rom and emulator //! @return true on success, FALSE on failure to initialise //! //! @note on interrupts : //! To generate an interrupt set the appropriate bit in MI_INTR_REG //! and then the function CheckInterrupts to tell the emulator //! that there is a waiting interrupt. //----------------------------------------------------------------------------- EXPORT BOOL CALL videoInitiateGFX(GFX_INFO Gfx_Info) { char logMsg[530]; Logger::getSingleton().initialize(0, 0); Logger::getSingleton().printMsg("PluginStartup"); //Read configuration // if (g_config.initialize()) // { // g_config.load(); g_graphicsPlugin.setConfig(g_config.getConfig()); // } Logger::getSingleton().printMsg("InitiateGFX"); //Save Graphics Info memcpy(&g_graphicsInfo, &Gfx_Info, sizeof(GFX_INFO)); return true; }
//----------------------------------------------------------------------------- //* ReadScreen2 //! This function reads the pixels of the currently displayed screen //----------------------------------------------------------------------------- EXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int front) { g_graphicsPlugin.takeScreenshot(dest, width, height, front); }
//----------------------------------------------------------------------------- //* ChangeWindow //! Toggle between fullscreen and window mode //----------------------------------------------------------------------------- EXPORT void CALL ChangeWindow() { Logger::getSingleton().printMsg("ChangeWindow\n"); //Toggle Fullscreen g_graphicsPlugin.toggleFullscreen(); }
//----------------------------------------------------------------------------- //* Rom Closed //! This function is called when a rom is closed. //----------------------------------------------------------------------------- EXPORT void CALL RomClosed() { //Logger::getSingleton().printMsg("RomClosed\n"); //Destroy g_graphicsPlugin.dispose(); }
//----------------------------------------------------------------------------- //* Rom Open //! This function is called when a rom is open. (from the emulation thread) //----------------------------------------------------------------------------- EXPORT int CALL RomOpen() { Logger::getSingleton().printMsg("RomOpen\n"); return g_graphicsPlugin.initialize(&g_graphicsInfo); }
EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context, void (*DebugCallback)(void *, int, const char *)) { char logMsg[530]; Logger::getSingleton().initialize(DebugCallback, Context); Logger::getSingleton().printMsg("PluginStartup"); /* attach and call the CoreGetAPIVersions function, check Config and Video Extension API versions for compatibility */ ptr_CoreGetAPIVersions CoreAPIVersionFunc; CoreAPIVersionFunc = (ptr_CoreGetAPIVersions) osal_dynlib_getproc(CoreLibHandle, "CoreGetAPIVersions"); if (CoreAPIVersionFunc == NULL) { sprintf(logMsg, "Core emulator broken; no CoreAPIVersionFunc() function found."); Logger::getSingleton().printMsg(logMsg, M64MSG_ERROR); return M64ERR_INCOMPATIBLE; } int ConfigAPIVersion, DebugAPIVersion, VidextAPIVersion; (*CoreAPIVersionFunc)(&ConfigAPIVersion, &DebugAPIVersion, &VidextAPIVersion, NULL); if ((ConfigAPIVersion & 0xffff0000) != (CONFIG_API_VERSION & 0xffff0000)) { sprintf(logMsg, "Emulator core Config API (v%i.%i.%i) incompatible with plugin (v%i.%i.%i)", VERSION_PRINTF_SPLIT(ConfigAPIVersion), VERSION_PRINTF_SPLIT(CONFIG_API_VERSION)); Logger::getSingleton().printMsg(logMsg, M64MSG_ERROR); return M64ERR_INCOMPATIBLE; } if ((VidextAPIVersion & 0xffff0000) != (VIDEXT_API_VERSION & 0xffff0000)) { sprintf(logMsg, "Emulator core Video Extension API (v%i.%i.%i) incompatible with plugin (v%i.%i.%i)", VERSION_PRINTF_SPLIT(VidextAPIVersion), VERSION_PRINTF_SPLIT(VIDEXT_API_VERSION)); Logger::getSingleton().printMsg(logMsg, M64MSG_ERROR); return M64ERR_INCOMPATIBLE; } /* Get the core config function pointers from the library handle */ ConfigOpenSection = (ptr_ConfigOpenSection) osal_dynlib_getproc(CoreLibHandle, "ConfigOpenSection"); ConfigSetParameter = (ptr_ConfigSetParameter) osal_dynlib_getproc(CoreLibHandle, "ConfigSetParameter"); ConfigGetParameter = (ptr_ConfigGetParameter) osal_dynlib_getproc(CoreLibHandle, "ConfigGetParameter"); ConfigSetDefaultInt = (ptr_ConfigSetDefaultInt) osal_dynlib_getproc(CoreLibHandle, "ConfigSetDefaultInt"); ConfigSetDefaultFloat = (ptr_ConfigSetDefaultFloat) osal_dynlib_getproc(CoreLibHandle, "ConfigSetDefaultFloat"); ConfigSetDefaultBool = (ptr_ConfigSetDefaultBool) osal_dynlib_getproc(CoreLibHandle, "ConfigSetDefaultBool"); ConfigSetDefaultString = (ptr_ConfigSetDefaultString) osal_dynlib_getproc(CoreLibHandle, "ConfigSetDefaultString"); ConfigGetParamInt = (ptr_ConfigGetParamInt) osal_dynlib_getproc(CoreLibHandle, "ConfigGetParamInt"); ConfigGetParamFloat = (ptr_ConfigGetParamFloat) osal_dynlib_getproc(CoreLibHandle, "ConfigGetParamFloat"); ConfigGetParamBool = (ptr_ConfigGetParamBool) osal_dynlib_getproc(CoreLibHandle, "ConfigGetParamBool"); ConfigGetParamString = (ptr_ConfigGetParamString) osal_dynlib_getproc(CoreLibHandle, "ConfigGetParamString"); ConfigGetSharedDataFilepath = (ptr_ConfigGetSharedDataFilepath) osal_dynlib_getproc(CoreLibHandle, "ConfigGetSharedDataFilepath"); ConfigGetUserConfigPath = (ptr_ConfigGetUserConfigPath) osal_dynlib_getproc(CoreLibHandle, "ConfigGetUserConfigPath"); ConfigGetUserDataPath = (ptr_ConfigGetUserDataPath) osal_dynlib_getproc(CoreLibHandle, "ConfigGetUserDataPath"); ConfigGetUserCachePath = (ptr_ConfigGetUserCachePath) osal_dynlib_getproc(CoreLibHandle, "ConfigGetUserCachePath"); if (!ConfigOpenSection || !ConfigSetParameter || !ConfigGetParameter || !ConfigSetDefaultInt || !ConfigSetDefaultFloat || !ConfigSetDefaultBool || !ConfigSetDefaultString || !ConfigGetParamInt || !ConfigGetParamFloat || !ConfigGetParamBool || !ConfigGetParamString || !ConfigGetSharedDataFilepath || !ConfigGetUserConfigPath || !ConfigGetUserDataPath || !ConfigGetUserCachePath) { Logger::getSingleton().printMsg("Couldn't connect to Core configuration functions", M64MSG_ERROR); return M64ERR_INCOMPATIBLE; } /* Get the core Video Extension function pointers from the library handle */ CoreVideo_Init = (ptr_VidExt_Init) osal_dynlib_getproc(CoreLibHandle, "VidExt_Init"); CoreVideo_Quit = (ptr_VidExt_Quit) osal_dynlib_getproc(CoreLibHandle, "VidExt_Quit"); CoreVideo_ListFullscreenModes = (ptr_VidExt_ListFullscreenModes) osal_dynlib_getproc(CoreLibHandle, "VidExt_ListFullscreenModes"); CoreVideo_SetVideoMode = (ptr_VidExt_SetVideoMode) osal_dynlib_getproc(CoreLibHandle, "VidExt_SetVideoMode"); CoreVideo_SetCaption = (ptr_VidExt_SetCaption) osal_dynlib_getproc(CoreLibHandle, "VidExt_SetCaption"); CoreVideo_ToggleFullScreen = (ptr_VidExt_ToggleFullScreen) osal_dynlib_getproc(CoreLibHandle, "VidExt_ToggleFullScreen"); CoreVideo_ResizeWindow = (ptr_VidExt_ResizeWindow) osal_dynlib_getproc(CoreLibHandle, "VidExt_ResizeWindow"); CoreVideo_GL_GetProcAddress = (ptr_VidExt_GL_GetProcAddress) osal_dynlib_getproc(CoreLibHandle, "VidExt_GL_GetProcAddress"); CoreVideo_GL_SetAttribute = (ptr_VidExt_GL_SetAttribute) osal_dynlib_getproc(CoreLibHandle, "VidExt_GL_SetAttribute"); CoreVideo_GL_SwapBuffers = (ptr_VidExt_GL_SwapBuffers) osal_dynlib_getproc(CoreLibHandle, "VidExt_GL_SwapBuffers"); if (!CoreVideo_Init || !CoreVideo_Quit || !CoreVideo_ListFullscreenModes || !CoreVideo_SetVideoMode || !CoreVideo_SetCaption || !CoreVideo_ToggleFullScreen || !CoreVideo_GL_GetProcAddress || !CoreVideo_GL_SetAttribute || !CoreVideo_GL_SwapBuffers || !CoreVideo_ResizeWindow) { Logger::getSingleton().printMsg("Couldn't connect to Core video functions", M64MSG_ERROR); return M64ERR_INCOMPATIBLE; } //Read configuration if (g_config.initialize()) { g_config.load(); g_graphicsPlugin.setConfig(g_config.getConfig()); } return M64ERR_SUCCESS; }