Path: blob/master/libmupen64plus/mupen64plus-video-jabo/main.cpp
2 views
/* Mupen64plus-video-jabo */12#include <windows.h>3#include <stdio.h>4#include <stdlib.h>5#include <iostream>6#include <fstream>7#include <iomanip>89#define M64P_PLUGIN_PROTOTYPES 110#include "m64p_types.h"11#include "m64p_plugin.h"12#include "m64p_common.h"13#include "m64p_config.h"1415#include "main.h"16#include "typedefs.h"17#include "Config.h"1819//#define LOG(x) { std::ofstream myfile; myfile.open ("jabo_wrapper_log.txt", std::ios::app); myfile << x << "\n"; myfile.close(); }20#define LOG(x)2122namespace OldAPI23{24#include "jabo_api.h"25ptr_InitiateGFX InitiateGFX = NULL;26ptr_ProcessDList ProcessDList = NULL;27ptr_ProcessRDPList ProcessRDPList = NULL;28ptr_ShowCFB ShowCFB = NULL;29ptr_ViStatusChanged ViStatusChanged = NULL;30ptr_ViWidthChanged ViWidthChanged = NULL;31ptr_RomOpen RomOpen = NULL;32ptr_RomClosed RomClosed = NULL;33ptr_CloseDLL CloseDLL = NULL;3435ptr_DrawScreen DrawScreen = NULL;36ptr_MoveScreen MoveScreen = NULL;37ptr_UpdateScreen UpdateScreen = NULL;38ptr_DllConfig DllConfig = NULL;39ptr_GetDllInfo GetDllInfo = NULL;40}4142ptr_ConfigOpenSection ConfigOpenSection = NULL;43ptr_ConfigSetParameter ConfigSetParameter = NULL;44ptr_ConfigGetParameter ConfigGetParameter = NULL;45ptr_ConfigGetParameterHelp ConfigGetParameterHelp = NULL;46ptr_ConfigSetDefaultInt ConfigSetDefaultInt = NULL;47ptr_ConfigSetDefaultFloat ConfigSetDefaultFloat = NULL;48ptr_ConfigSetDefaultBool ConfigSetDefaultBool = NULL;49ptr_ConfigSetDefaultString ConfigSetDefaultString = NULL;50ptr_ConfigGetParamInt ConfigGetParamInt = NULL;51ptr_ConfigGetParamFloat ConfigGetParamFloat = NULL;52ptr_ConfigGetParamBool ConfigGetParamBool = NULL;53ptr_ConfigGetParamString ConfigGetParamString = NULL;5455/* local variables */56static void (*l_DebugCallback)(void *, int, const char *) = NULL;57static void *l_DebugCallContext = NULL;58static int l_PluginInit = 0;5960HMODULE JaboDLL;6162HMODULE D3D8Dll;6364typedef void (*ptr_D3D8_SetRenderingCallback)(void (*callback)(int));65ptr_D3D8_SetRenderingCallback D3D8_SetRenderingCallback = NULL;66typedef void (*ptr_D3D8_ReadScreen)(void *dest, int *width, int *height);67ptr_D3D8_ReadScreen D3D8_ReadScreen = NULL;68typedef void (*ptr_D3D8_CloseDLL)();69ptr_D3D8_CloseDLL D3D8_CloseDLL = NULL;7071DWORD old_options;72DWORD old_initflags;7374void setup_jabo_functions()75{76JaboDLL = LoadLibrary("Jabo_Direct3D8_patched.dll");7778if (JaboDLL != NULL)79{80OldAPI::InitiateGFX = (OldAPI::ptr_InitiateGFX)GetProcAddress(JaboDLL,"InitiateGFX");81OldAPI::ProcessDList = (OldAPI::ptr_ProcessDList)GetProcAddress(JaboDLL,"ProcessDList");82OldAPI::ProcessRDPList = (OldAPI::ptr_ProcessRDPList)GetProcAddress(JaboDLL,"ProcessRDPList");83OldAPI::ShowCFB = (OldAPI::ptr_ShowCFB)GetProcAddress(JaboDLL,"ShowCFB");84OldAPI::ViStatusChanged = (OldAPI::ptr_ViStatusChanged)GetProcAddress(JaboDLL,"ViStatusChanged");85OldAPI::ViWidthChanged = (OldAPI::ptr_ViWidthChanged)GetProcAddress(JaboDLL,"ViWidthChanged");86OldAPI::RomOpen = (OldAPI::ptr_RomOpen)GetProcAddress(JaboDLL,"RomOpen");87OldAPI::RomClosed = (OldAPI::ptr_RomClosed)GetProcAddress(JaboDLL,"RomClosed");88OldAPI::CloseDLL = (OldAPI::ptr_CloseDLL)GetProcAddress(JaboDLL,"CloseDLL");8990OldAPI::DrawScreen = (OldAPI::ptr_DrawScreen)GetProcAddress(JaboDLL,"DrawScreen");91OldAPI::MoveScreen = (OldAPI::ptr_MoveScreen)GetProcAddress(JaboDLL,"MoveScreen");92OldAPI::UpdateScreen = (OldAPI::ptr_UpdateScreen)GetProcAddress(JaboDLL,"UpdateScreen");93OldAPI::DllConfig = (OldAPI::ptr_DllConfig)GetProcAddress(JaboDLL,"DllConfig");94OldAPI::GetDllInfo = (OldAPI::ptr_GetDllInfo)GetProcAddress(JaboDLL,"GetDllInfo");95}9697D3D8Dll = LoadLibrary("D3D8.dll");98if (D3D8Dll != NULL)99{100D3D8_SetRenderingCallback = (ptr_D3D8_SetRenderingCallback)GetProcAddress(D3D8Dll,"SetRenderingCallback");101D3D8_ReadScreen = (ptr_D3D8_ReadScreen)GetProcAddress(D3D8Dll,"ReadScreen");102D3D8_CloseDLL = (ptr_D3D8_CloseDLL)GetProcAddress(D3D8Dll,"CloseDLL");103}104}105106BOOL readOptionsInitflags (DWORD* options_val, DWORD* initflags_val)107{108HKEY mainkey;109if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",0,KEY_READ,&mainkey) != ERROR_SUCCESS)110{111// key doesn't exist, so we need to create it first112if (RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",NULL,NULL,NULL,KEY_READ,NULL,&mainkey,NULL) != ERROR_SUCCESS)113{114// Couldn't create the key115printf("readOptionsInitflags: Couldn't create the key\n");116return (FALSE);117}118}119120// Key exists, try to find the Options Value121DWORD type;122DWORD cbData;123int options_value;124LSTATUS result = RegQueryValueEx(mainkey, "Options", NULL, &type, (LPBYTE)&options_value, &cbData);125if (result != ERROR_SUCCESS)126{127options_value = 0;128printf("readOptionsInitflags: fail A\n");129}130*options_val = options_value;131132// Try to find the Direct3D init flags subkey Value133int initflags_value;134result = RegQueryValueEx(mainkey, "Direct3D8.InitFlags", NULL, &type, (LPBYTE)&initflags_value, &cbData);135if (result != ERROR_SUCCESS)136{137printf("readOptionsInitflags: fail B\n");138initflags_value = 0x00e00000;139}140*initflags_val = initflags_value;141142RegCloseKey(mainkey);143return(TRUE);144}145146BOOL writeOptionsInitflags(DWORD options_val, DWORD initflags_val)147{148// Open the key for writing149HKEY mainkey;150if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",0,KEY_WRITE,&mainkey) != ERROR_SUCCESS)151{152printf("writeOptionsInitflags: Failure to open key for write\n");153return (FALSE);154}155156// Store our options value157DWORD new_val = options_val;158if (RegSetValueEx(mainkey, "Options", NULL, REG_DWORD, (BYTE *)&new_val, 4) != ERROR_SUCCESS)159{160printf("writeOptionsInitflags: Couldn't write options value\n");161}162163// Store our init flags value164new_val = initflags_val;165if (RegSetValueEx(mainkey, "Direct3D8.InitFlags", NULL, REG_DWORD, (BYTE *)&new_val, 4) != ERROR_SUCCESS)166{167LOG("writeOptionsInitflags: Couldn't write init flags value");168}169170RegCloseKey(mainkey);171return(TRUE);172}173174void createRDBFile(unsigned char * header, int resolution_width, int resolution_height, int clear_mode)175{176std::ofstream rdbFile;177rdbFile.open("Project64.rdb", std::ios::trunc | std::ios::out);178179// File can't seem to have data on the first line. It has to be a comment or blank180rdbFile << "\n";181182rdbFile << "[";183184rdbFile << std::hex << std::setfill('0') << std::setw(2) << std::uppercase;185rdbFile << (int)header[16] << (int)header[17] << (int)header[18] << (int)header[19];186rdbFile << "-";187rdbFile << (int)header[20] << (int)header[21] << (int)header[22] << (int)header[23];188rdbFile << "-C:";189rdbFile << (int)header[62] << "]\n";190191rdbFile << std::dec << std::nouppercase;192rdbFile << "Clear Frame=" << clear_mode << "\n";193rdbFile << "Resolution Width=" << resolution_width << "\n";194rdbFile << "Resolution Height=" << resolution_height << "\n";195rdbFile.close();196}197198/* Global functions */199static void DebugMessage(int level, const char *message, ...)200{201char msgbuf[1024];202va_list args;203204if (l_DebugCallback == NULL)205return;206207va_start(args, message);208vsprintf(msgbuf, message, args);209210(*l_DebugCallback)(l_DebugCallContext, level, msgbuf);211212va_end(args);213}214215#pragma region (De-)Initialization216217/* Mupen64Plus plugin functions */218EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context,219void (*DebugCallback)(void *, int, const char *))220{221LOG("API WRAPPER:\t PluginStartup")222setup_jabo_functions();223224ptr_CoreGetAPIVersions CoreAPIVersionFunc;225226int ConfigAPIVersion, DebugAPIVersion, VidextAPIVersion;227228if (l_PluginInit)229return M64ERR_ALREADY_INIT;230231/* first thing is to set the callback function for debug info */232l_DebugCallback = DebugCallback;233l_DebugCallContext = Context;234235/* attach and call the CoreGetAPIVersions function, check Config API version for compatibility */236CoreAPIVersionFunc = (ptr_CoreGetAPIVersions) GetProcAddress(CoreLibHandle, "CoreGetAPIVersions");237238if (CoreAPIVersionFunc == NULL)239{240DebugMessage(M64MSG_ERROR, "Core emulator broken; no CoreAPIVersionFunc() function found.");241return M64ERR_INCOMPATIBLE;242}243244(*CoreAPIVersionFunc)(&ConfigAPIVersion, &DebugAPIVersion, &VidextAPIVersion, NULL);245if ((ConfigAPIVersion & 0xffff0000) != (CONFIG_API_VERSION & 0xffff0000))246{247DebugMessage(M64MSG_ERROR, "Emulator core Config API (v%i.%i.%i) incompatible with plugin (v%i.%i.%i)",248VERSION_PRINTF_SPLIT(ConfigAPIVersion), VERSION_PRINTF_SPLIT(CONFIG_API_VERSION));249return M64ERR_INCOMPATIBLE;250}251252ConfigOpenSection = (ptr_ConfigOpenSection) GetProcAddress(CoreLibHandle, "ConfigOpenSection");253ConfigSetParameter = (ptr_ConfigSetParameter) GetProcAddress(CoreLibHandle, "ConfigSetParameter");254ConfigGetParameter = (ptr_ConfigGetParameter) GetProcAddress(CoreLibHandle, "ConfigGetParameter");255ConfigSetDefaultInt = (ptr_ConfigSetDefaultInt) GetProcAddress(CoreLibHandle, "ConfigSetDefaultInt");256ConfigSetDefaultFloat = (ptr_ConfigSetDefaultFloat) GetProcAddress(CoreLibHandle, "ConfigSetDefaultFloat");257ConfigSetDefaultBool = (ptr_ConfigSetDefaultBool) GetProcAddress(CoreLibHandle, "ConfigSetDefaultBool");258ConfigSetDefaultString = (ptr_ConfigSetDefaultString) GetProcAddress(CoreLibHandle, "ConfigSetDefaultString");259ConfigGetParamInt = (ptr_ConfigGetParamInt) GetProcAddress(CoreLibHandle, "ConfigGetParamInt");260ConfigGetParamFloat = (ptr_ConfigGetParamFloat) GetProcAddress(CoreLibHandle, "ConfigGetParamFloat");261ConfigGetParamBool = (ptr_ConfigGetParamBool) GetProcAddress(CoreLibHandle, "ConfigGetParamBool");262ConfigGetParamString = (ptr_ConfigGetParamString) GetProcAddress(CoreLibHandle, "ConfigGetParamString");263264l_PluginInit = 1;265return M64ERR_SUCCESS;266}267268EXPORT m64p_error CALL PluginShutdown(void)269{270LOG("API WRAPPER:\t PluginShutdown")271OldAPI::CloseDLL();272273D3D8_CloseDLL();274FreeLibrary(D3D8Dll);275FreeLibrary(JaboDLL);276277writeOptionsInitflags(old_options,old_initflags);278279if (!l_PluginInit)280return M64ERR_NOT_INIT;281282/* reset some local variables */283l_DebugCallback = NULL;284l_DebugCallContext = NULL;285286l_PluginInit = 0;287return M64ERR_SUCCESS;288}289290EXPORT int CALL RomOpen(void)291{292LOG("API WRAPPER:\t RomOpen")293OldAPI::RomOpen();294295remove("Project64.rdb");296297if (!l_PluginInit)298return 0;299300return 1;301}302303EXPORT void CALL RomClosed( void )304{305LOG("API WRAPPER:\t RomClosed")306OldAPI::RomClosed();307308if (!l_PluginInit)309return;310}311312#pragma endregion313314#pragma region Pluginversion315EXPORT m64p_error CALL PluginGetVersion(m64p_plugin_type *PluginType, int *PluginVersion, int *APIVersion, const char **PluginNamePtr, int *Capabilities)316{317LOG("API WRAPPER:\t PluginGetVersion")318319OldAPI::PLUGIN_INFO info;320OldAPI::GetDllInfo(&info);321322/* set version info */323if (PluginType != NULL)324*PluginType = M64PLUGIN_GFX;325326if (PluginVersion != NULL)327*PluginVersion = PLUGIN_VERSION;328329if (APIVersion != NULL)330*APIVersion = VIDEO_PLUGIN_API_VERSION;331332if (PluginNamePtr != NULL)333*PluginNamePtr = PLUGIN_NAME;334335if (Capabilities != NULL)336{337*Capabilities = 0;338}339340return M64ERR_SUCCESS;341}342#pragma endregion343344// IGNORE345EXPORT void CALL ChangeWindow (void)346{347LOG("API WRAPPER:\t ChangeWindow")348}349350// NOTE: NEW GFX_INFO vs old351EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info)352{353LOG("API WRAPPER:\t InitiateGFX")354355Config_Open();356357SETTINGS settings;358settings.anisotropic_level = (int)Config_ReadInt("anisotropic_level","ANISOTROPIC_FILTERING_LEVEL",0,TRUE,FALSE);359settings.brightness = (int)Config_ReadInt("brightness","Brightness level",0,TRUE,FALSE);360settings.antialiasing_level = (int)Config_ReadInt("antialiasing_level","Antialiasing level",0,TRUE,FALSE);361settings.super2xsal = (BOOL)Config_ReadInt("super2xsal","Enables Super2xSal textures",FALSE);362settings.texture_filter = (BOOL)Config_ReadInt("texture_filter","Always use texture filter",FALSE);363settings.adjust_aspect_ratio = (BOOL)Config_ReadInt("adjust_aspect_ratio","Adjust game aspect ratio to match yours",FALSE);364settings.legacy_pixel_pipeline = (BOOL)Config_ReadInt("legacy_pixel_pipeline","Use legacy pixel pipeline",FALSE);365settings.alpha_blending = (BOOL)Config_ReadInt("alpha_blending","Force alpha blending",FALSE);366367// As far as I can tell there is no way to apply this setting without opening the dll config window368//settings.wireframe = (BOOL)Config_ReadInt("wireframe","Wireframe rendering",FALSE);369370settings.direct3d_transformation_pipeline = (BOOL)Config_ReadInt("direct3d_transformation_pipeline","Use Direct3D transformation pipeline",FALSE);371settings.z_compare = (BOOL)Config_ReadInt("z_compare","Force Z Compare",FALSE);372settings.copy_framebuffer = (BOOL)Config_ReadInt("copy_framebuffer","Copy framebuffer to RDRAM",FALSE);373settings.resolution_width = (int)Config_ReadInt("resolution_width","Emulated Width",-1,TRUE,FALSE);374settings.resolution_height = (int)Config_ReadInt("resolution_height","Emulated Height",-1,TRUE,FALSE);375settings.clear_mode = (int)Config_ReadInt("clear_mode","Direct3D Clear Mode Height",0,TRUE,FALSE);376377DWORD new_options_val = 0;378if (settings.copy_framebuffer == TRUE) { new_options_val |= 0x20000000; }379if (settings.z_compare == TRUE) { new_options_val |= 0x10000000; }380if (settings.legacy_pixel_pipeline == TRUE) { new_options_val |= 0x08000000; }381if (settings.alpha_blending == TRUE) { new_options_val |= 0x04000000; }382if (settings.adjust_aspect_ratio == TRUE) { new_options_val |= 0x02000000; }383if (settings.texture_filter == TRUE) { new_options_val |= 0x01000000; }384if (settings.super2xsal == TRUE) { new_options_val |= 0x00001000; }385new_options_val |= (((settings.brightness - 100) / 3) & 0x1F) << 19;386switch (settings.antialiasing_level)387{388case 1: new_options_val |= 0x00004000; break;389case 2: new_options_val |= 0x00008000; break;390case 3: new_options_val |= 0x00010000; break;391}392switch (settings.anisotropic_level)393{394case 1: new_options_val |= 0x00000020; break;395case 2: new_options_val |= 0x00000040; break;396case 3: new_options_val |= 0x00000080; break;397case 4: new_options_val |= 0x00000100; break;398}399400int width, height;401Config_ReadScreenResolution(&width,&height);402if (width == 320 && height == 240) { new_options_val |= 0x00000000; }403else if (width == 400 && height == 300) { new_options_val |= 0x00000001; }404else if (width == 512 && height == 384) { new_options_val |= 0x00000002; }405else if (width == 640 && height == 480) { new_options_val |= 0x00000003; }406else if (width == 800 && height == 600) { new_options_val |= 0x00000004; }407else if (width == 1024 && height == 768) { new_options_val |= 0x00000005; }408else if (width == 1152 && height == 864) { new_options_val |= 0x00000006; }409else if (width == 1280 && height == 960) { new_options_val |= 0x00000007; }410else if (width == 1600 && height == 1200) { new_options_val |= 0x00000008; }411else if (width == 848 && height == 480) { new_options_val |= 0x00000009; }412else if (width == 1024 && height == 576) { new_options_val |= 0x0000000a; }413else if (width == 1380 && height == 768) { new_options_val |= 0x0000000b; }414else { /* will pick 320x240 */ }415416DWORD new_initflags_val = 0x00e00000;417if (settings.direct3d_transformation_pipeline == TRUE) { new_initflags_val = 0x00a00000; }418419readOptionsInitflags(&old_options,&old_initflags);420421writeOptionsInitflags(new_options_val,new_initflags_val);422423createRDBFile(Gfx_Info.HEADER, settings.resolution_height, settings.resolution_width, settings.clear_mode);424425OldAPI::GFX_INFO blah;426427blah.hWnd = GetDesktopWindow();428blah.hStatusBar = NULL;429blah.MemoryBswaped = true;430431blah.HEADER = Gfx_Info.HEADER;432433blah.RDRAM = Gfx_Info.RDRAM;434blah.DMEM = Gfx_Info.DMEM;435blah.IMEM = Gfx_Info.IMEM;436437blah.MI_INTR_REG = (DWORD *)Gfx_Info.MI_INTR_REG;438439blah.DPC_START_REG = (DWORD *)Gfx_Info.DPC_START_REG;440blah.DPC_END_REG = (DWORD *)Gfx_Info.DPC_END_REG;441blah.DPC_CURRENT_REG = (DWORD *)Gfx_Info.DPC_CURRENT_REG;442blah.DPC_STATUS_REG = (DWORD *)Gfx_Info.DPC_STATUS_REG;443blah.DPC_CLOCK_REG = (DWORD *)Gfx_Info.DPC_CLOCK_REG;444blah.DPC_BUFBUSY_REG = (DWORD *)Gfx_Info.DPC_BUFBUSY_REG;445blah.DPC_PIPEBUSY_REG = (DWORD *)Gfx_Info.DPC_PIPEBUSY_REG;446blah.DPC_TMEM_REG = (DWORD *)Gfx_Info.DPC_TMEM_REG;447448blah.VI_STATUS_REG = (DWORD *)Gfx_Info.VI_STATUS_REG;449blah.VI_ORIGIN_REG = (DWORD *)Gfx_Info.VI_ORIGIN_REG;450blah.VI_WIDTH_REG = (DWORD *)Gfx_Info.VI_WIDTH_REG;451blah.VI_INTR_REG = (DWORD *)Gfx_Info.VI_INTR_REG;452blah.VI_V_CURRENT_LINE_REG = (DWORD *)Gfx_Info.VI_V_CURRENT_LINE_REG;453blah.VI_TIMING_REG = (DWORD *)Gfx_Info.VI_TIMING_REG;454blah.VI_V_SYNC_REG = (DWORD *)Gfx_Info.VI_V_SYNC_REG;455blah.VI_H_SYNC_REG = (DWORD *)Gfx_Info.VI_H_SYNC_REG;456blah.VI_LEAP_REG = (DWORD *)Gfx_Info.VI_LEAP_REG;457blah.VI_H_START_REG = (DWORD *)Gfx_Info.VI_H_START_REG;458blah.VI_V_START_REG = (DWORD *)Gfx_Info.VI_V_START_REG;459blah.VI_V_BURST_REG = (DWORD *)Gfx_Info.VI_V_BURST_REG;460blah.VI_X_SCALE_REG = (DWORD *)Gfx_Info.VI_X_SCALE_REG;461blah.VI_Y_SCALE_REG = (DWORD *)Gfx_Info.VI_Y_SCALE_REG;462463blah.CheckInterrupts = Gfx_Info.CheckInterrupts;464465OldAPI::InitiateGFX(blah);466467return(TRUE);468}469470EXPORT void CALL MoveScreen (int xpos, int ypos)471{472LOG("API WRAPPER:\t MoveScreen")473OldAPI::MoveScreen(xpos, ypos);474}475476EXPORT void CALL ProcessDList(void)477{478LOG("API WRAPPER:\t ProcessDList")479OldAPI::ProcessDList();480}481482EXPORT void CALL ProcessRDPList(void)483{484LOG("API WRAPPER:\t ProcessRDPList")485OldAPI::ProcessRDPList();486}487488EXPORT void CALL ShowCFB(void)489{490LOG("API WRAPPER:\t ShowCFB")491OldAPI::ShowCFB();492}493494EXPORT void CALL UpdateScreen(void)495{496LOG("API WRAPPER:\t UpdateScreen")497OldAPI::UpdateScreen();498}499500EXPORT void CALL ViStatusChanged(void)501{502LOG("API WRAPPER:\t ViStatusChanged")503OldAPI::ViStatusChanged();504}505506EXPORT void CALL ViWidthChanged(void)507{508LOG("API WRAPPER:\t ViWidthChanged")509OldAPI::ViWidthChanged();510}511512EXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int bFront)513{514LOG("API WRAPPER:\t ReadScreen2")515if (D3D8_ReadScreen != NULL)516{517D3D8_ReadScreen(dest, width, height);518}519}520521EXPORT void CALL SetRenderingCallback(void (*callback)(int))522{523LOG("API WRAPPER:\t SetRenderingCallback")524if (D3D8_SetRenderingCallback != NULL)525{526D3D8_SetRenderingCallback(callback);527}528}529530// IMPLEMENT LATER?531EXPORT void CALL FBRead(uint32 addr)532{533LOG("API WRAPPER:\t FBRead")534}535536// IMPLEMENT LATER?537EXPORT void CALL FBWrite(uint32 addr, uint32 size)538{539LOG("API WRAPPER:\t FBWrite")540}541542// ???543EXPORT void CALL FBGetFrameBufferInfo(void *p)544{545LOG("API WRAPPER:\t FBGetFrameBufferInfo")546//FrameBufferInfo * pinfo = (FrameBufferInfo *)p;547}548549550