diff --git a/SConstruct b/SConstruct index ad537b1f7855..960b06805a31 100644 --- a/SConstruct +++ b/SConstruct @@ -108,10 +108,10 @@ vars.AddVariables( BoolVariable('verbose', 'Set for compilation line', False), BoolVariable('bundle', 'Set to create bundle', False), BoolVariable('lint', 'Set for lint build (extra warnings)', False), - BoolVariable('nowx', 'Set For Building with no WX libs (WIP)', False), + BoolVariable('nowx', 'Set For Building with no WX libs', False), BoolVariable('openal', 'Build with OpenAL', False), BoolVariable('noao', 'Build without AO', False), - BoolVariable('wxgl', 'Set For Building with WX GL libs (WIP)', False), + BoolVariable('wxgl', 'Set For Building with WX GL libs', False), BoolVariable('opencl', 'Build with OpenCL', False), BoolVariable('nojit', 'Remove entire jit cores', False), BoolVariable('shared_soil', 'Use system shared libSOIL', False), @@ -354,7 +354,6 @@ if not env['SHARED_SFML']: #osx specifics if sys.platform == 'darwin': compileFlags.append('-mmacosx-version-min=10.5') - env['HAVE_COCOA'] = 1 env['HAVE_XRANDR'] = 0 env['HAVE_X11'] = 0 env['CC'] = "gcc-4.2" @@ -365,21 +364,20 @@ if sys.platform == 'darwin': else: env['HAVE_X11'] = conf.CheckPKG('x11') env['HAVE_XRANDR'] = env['HAVE_X11'] and conf.CheckPKG('xrandr') - env['HAVE_COCOA'] = 0 # handling wx flags CCFLAGS should be created before wxmods = ['aui', 'adv', 'core', 'base'] env['USE_WX'] = 0 if env['wxgl']: - wxmods.append('gl') env['USE_WX'] = 1 - -if sys.platform == 'win32': +if sys.platform == 'win32' or sys.platform == 'darwin': env['HAVE_WX'] = 1 env['USE_WX'] = 1 +if env['USE_WX']: + wxmods.append('gl') -# Gui less build +# gui-less build if env['nowx']: env['HAVE_WX'] = 0; else: @@ -415,7 +413,6 @@ conf.Define('HAVE_WX', env['HAVE_WX']) conf.Define('USE_WX', env['USE_WX']) conf.Define('HAVE_X11', env['HAVE_X11']) conf.Define('HAVE_XRANDR', env['HAVE_XRANDR']) -conf.Define('HAVE_COCOA', env['HAVE_COCOA']) conf.Define('HAVE_PORTAUDIO', env['HAVE_PORTAUDIO']) conf.Define('SHARED_SOIL', env['SHARED_SOIL']) conf.Define('SHARED_LZO', env['SHARED_LZO']) diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index 7b27af35e506..330d72ec2b26 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -30,7 +30,7 @@ #include "Frame.h" #include "HotkeyDlg.h" -#if defined(HAVE_COCOA) && HAVE_COCOA +#ifdef __APPLE__ #include #endif @@ -1188,7 +1188,7 @@ void CConfigMain::AddResolutions() main_frame->m_XRRConfig->AddResolutions(arrayStringFor_FullscreenResolution); -#elif defined(HAVE_COCOA) && HAVE_COCOA +#elif defined(__APPLE__) CGDisplayModeRef mode; CFArrayRef array; diff --git a/Source/Core/DolphinWX/Src/MainNoGUI.cpp b/Source/Core/DolphinWX/Src/MainNoGUI.cpp index 42a417fe2e8b..66e976310fa3 100644 --- a/Source/Core/DolphinWX/Src/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/Src/MainNoGUI.cpp @@ -32,7 +32,7 @@ #include "X11Utils.h" #endif -#if defined(HAVE_COCOA) && HAVE_COCOA +#ifdef __APPLE__ #import "cocoaApp.h" #endif @@ -260,7 +260,7 @@ void X11_MainLoop() #endif //for cocoa we need to hijack the main to get event -#if defined(HAVE_COCOA) && HAVE_COCOA +#ifdef __APPLE__ @interface CocoaThread : NSObject { diff --git a/Source/Core/DolphinWX/Src/SConscript b/Source/Core/DolphinWX/Src/SConscript index bba8ef5e38d0..c352f14f64a2 100644 --- a/Source/Core/DolphinWX/Src/SConscript +++ b/Source/Core/DolphinWX/Src/SConscript @@ -44,37 +44,29 @@ if wxenv['HAVE_WX']: 'NetWindow.cpp', ] - CPPDEFINES = [ + CPPDEFINE = [ 'wxNEEDS_CHARPP', ], + compileFlags = [ + ], + + libs = [ 'debwx', 'debugger_ui_util'] + libs -if wxenv['HAVE_COCOA']: - files += [ 'cocoaApp.m', ] - compileFlags = [ - '-x', - 'objective-c++', - ] - wxenv.Append( - CXXFLAGS = compileFlags, - LINKFLAGS = [ - '-pthread', '-framework', 'IOKit' - ], - LIBS = libs - ) -else: - wxenv.Append( - LINKFLAGS = [ - '-pthread', - ], - LIBS = libs - ) +if sys.platform == 'darwin': + files += [ 'cocoaApp.m', ] + compileFlags = [ + '-x', + 'objective-c++', + ] + linkflags = [ + '-pthread', '-framework', 'IOKit' + ] -if sys.platform == 'darwin': exeGUI = env['binary_dir'] + 'Dolphin.app/Contents/MacOS/Dolphin' exeNoGUI = env['binary_dir'] + 'DolphinNoGUI' @@ -96,11 +88,17 @@ if sys.platform == 'darwin': else: exeGUI = env['binary_dir'] + 'dolphin-emu' exeNoGUI = env['binary_dir'] + 'dolphin-emu-nogui' + linkflags = [ '-pthread' ] if wxenv['HAVE_X11']: files += [ 'X11Utils.cpp' ] -#objects = [ wxenv.Object(srcFile) for srcFile in files ] + +wxenv.Append( + CXXFLAGS = compileFlags, + LINKFLAGS = linkflags, + LIBS = libs, +) if wxenv['HAVE_WX']: wxenv.Program(exeGUI, files + [ 'Main.cpp' ]) diff --git a/Source/Dolphin.xcodeproj/project.pbxproj b/Source/Dolphin.xcodeproj/project.pbxproj index 547a5a9bfa05..7f75c811149e 100644 --- a/Source/Dolphin.xcodeproj/project.pbxproj +++ b/Source/Dolphin.xcodeproj/project.pbxproj @@ -454,8 +454,6 @@ 292AC39C11838FD700B8790B /* CheatsWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF8D11838FD600B8790B /* CheatsWindow.h */; }; 292AC39D11838FD700B8790B /* cmdline.c in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF8E11838FD600B8790B /* cmdline.c */; }; 292AC39E11838FD700B8790B /* cmdline.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF8F11838FD600B8790B /* cmdline.h */; }; - 292AC39F11838FD700B8790B /* cocoaApp.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF9011838FD600B8790B /* cocoaApp.h */; }; - 292AC3A011838FD700B8790B /* cocoaApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9111838FD600B8790B /* cocoaApp.m */; }; 292AC3A111838FD700B8790B /* ConfigMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9211838FD600B8790B /* ConfigMain.cpp */; }; 292AC3A211838FD700B8790B /* ConfigMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 292ABF9311838FD600B8790B /* ConfigMain.h */; }; 292AC3A311838FD700B8790B /* Frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292ABF9411838FD600B8790B /* Frame.cpp */; }; @@ -794,8 +792,6 @@ 292AC4F711838FD700B8790B /* XFStructs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC12B11838FD700B8790B /* XFStructs.cpp */; }; 292AC4F811838FD700B8790B /* XFStructs.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC12C11838FD700B8790B /* XFStructs.h */; }; 292AC4F911838FD700B8790B /* BPFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13011838FD700B8790B /* BPFunctions.cpp */; }; - 292AC4FA11838FD700B8790B /* cocoaGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC13111838FD700B8790B /* cocoaGL.h */; }; - 292AC4FB11838FD700B8790B /* cocoaGL.m in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13211838FD700B8790B /* cocoaGL.m */; }; 292AC4FC11838FD700B8790B /* Debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13411838FD700B8790B /* Debugger.cpp */; }; 292AC4FD11838FD700B8790B /* Debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC13511838FD700B8790B /* Debugger.h */; }; 292AC4FE11838FD700B8790B /* DLCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC13611838FD700B8790B /* DLCache.cpp */; }; @@ -837,8 +833,6 @@ 292AC52211838FD700B8790B /* BPMemLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16011838FD700B8790B /* BPMemLoader.h */; }; 292AC52311838FD700B8790B /* Clipper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16111838FD700B8790B /* Clipper.cpp */; }; 292AC52411838FD700B8790B /* Clipper.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16211838FD700B8790B /* Clipper.h */; }; - 292AC52511838FD700B8790B /* cocoaGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16311838FD700B8790B /* cocoaGL.h */; }; - 292AC52611838FD700B8790B /* cocoaGL.m in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16411838FD700B8790B /* cocoaGL.m */; }; 292AC52711838FD700B8790B /* CommandProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16511838FD700B8790B /* CommandProcessor.cpp */; }; 292AC52811838FD700B8790B /* CommandProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC16611838FD700B8790B /* CommandProcessor.h */; }; 292AC52911838FD700B8790B /* CPMemLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 292AC16711838FD700B8790B /* CPMemLoader.cpp */; }; @@ -1778,8 +1772,6 @@ 292ABF8D11838FD600B8790B /* CheatsWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CheatsWindow.h; sourceTree = ""; }; 292ABF8E11838FD600B8790B /* cmdline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cmdline.c; sourceTree = ""; }; 292ABF8F11838FD600B8790B /* cmdline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmdline.h; sourceTree = ""; }; - 292ABF9011838FD600B8790B /* cocoaApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaApp.h; sourceTree = ""; }; - 292ABF9111838FD600B8790B /* cocoaApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaApp.m; sourceTree = ""; }; 292ABF9211838FD600B8790B /* ConfigMain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConfigMain.cpp; sourceTree = ""; }; 292ABF9311838FD600B8790B /* ConfigMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigMain.h; sourceTree = ""; }; 292ABF9411838FD600B8790B /* Frame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Frame.cpp; sourceTree = ""; }; @@ -2148,8 +2140,6 @@ 292AC12C11838FD700B8790B /* XFStructs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XFStructs.h; sourceTree = ""; }; 292AC12E11838FD700B8790B /* Plugin_VideoOGL.vcproj */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Plugin_VideoOGL.vcproj; sourceTree = ""; }; 292AC13011838FD700B8790B /* BPFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BPFunctions.cpp; sourceTree = ""; }; - 292AC13111838FD700B8790B /* cocoaGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaGL.h; sourceTree = ""; }; - 292AC13211838FD700B8790B /* cocoaGL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaGL.m; sourceTree = ""; }; 292AC13411838FD700B8790B /* Debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Debugger.cpp; sourceTree = ""; }; 292AC13511838FD700B8790B /* Debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Debugger.h; sourceTree = ""; }; 292AC13611838FD700B8790B /* DLCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DLCache.cpp; sourceTree = ""; }; @@ -2193,8 +2183,6 @@ 292AC16011838FD700B8790B /* BPMemLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMemLoader.h; sourceTree = ""; }; 292AC16111838FD700B8790B /* Clipper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Clipper.cpp; sourceTree = ""; }; 292AC16211838FD700B8790B /* Clipper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipper.h; sourceTree = ""; }; - 292AC16311838FD700B8790B /* cocoaGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoaGL.h; sourceTree = ""; }; - 292AC16411838FD700B8790B /* cocoaGL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoaGL.m; sourceTree = ""; }; 292AC16511838FD700B8790B /* CommandProcessor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandProcessor.cpp; sourceTree = ""; }; 292AC16611838FD700B8790B /* CommandProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandProcessor.h; sourceTree = ""; }; 292AC16711838FD700B8790B /* CPMemLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPMemLoader.cpp; sourceTree = ""; }; @@ -3378,8 +3366,6 @@ 292ABF8D11838FD600B8790B /* CheatsWindow.h */, 292ABF8E11838FD600B8790B /* cmdline.c */, 292ABF8F11838FD600B8790B /* cmdline.h */, - 292ABF9011838FD600B8790B /* cocoaApp.h */, - 292ABF9111838FD600B8790B /* cocoaApp.m */, 292ABF9211838FD600B8790B /* ConfigMain.cpp */, 292ABF9311838FD600B8790B /* ConfigMain.h */, 292ABF9411838FD600B8790B /* Frame.cpp */, @@ -4075,8 +4061,6 @@ isa = PBXGroup; children = ( 292AC13011838FD700B8790B /* BPFunctions.cpp */, - 292AC13111838FD700B8790B /* cocoaGL.h */, - 292AC13211838FD700B8790B /* cocoaGL.m */, 292AC13311838FD700B8790B /* Debugger */, 292AC13611838FD700B8790B /* DLCache.cpp */, 292AC13711838FD700B8790B /* DLCache.h */, @@ -4159,8 +4143,6 @@ 292AC16011838FD700B8790B /* BPMemLoader.h */, 292AC16111838FD700B8790B /* Clipper.cpp */, 292AC16211838FD700B8790B /* Clipper.h */, - 292AC16311838FD700B8790B /* cocoaGL.h */, - 292AC16411838FD700B8790B /* cocoaGL.m */, 292AC16511838FD700B8790B /* CommandProcessor.cpp */, 292AC16611838FD700B8790B /* CommandProcessor.h */, 292AC16711838FD700B8790B /* CPMemLoader.cpp */, @@ -4605,7 +4587,6 @@ 292AC39A11838FD700B8790B /* BootManager.h in Headers */, 292AC39C11838FD700B8790B /* CheatsWindow.h in Headers */, 292AC39E11838FD700B8790B /* cmdline.h in Headers */, - 292AC39F11838FD700B8790B /* cocoaApp.h in Headers */, 292AC3A211838FD700B8790B /* ConfigMain.h in Headers */, 292AC3A411838FD700B8790B /* Frame.h in Headers */, 292AC3A811838FD700B8790B /* GameListCtrl.h in Headers */, @@ -4769,7 +4750,6 @@ 292AC4F411838FD700B8790B /* TabControl.h in Headers */, 292AC4F611838FD700B8790B /* Thread.h in Headers */, 292AC4F811838FD700B8790B /* XFStructs.h in Headers */, - 292AC4FA11838FD700B8790B /* cocoaGL.h in Headers */, 292AC4FD11838FD700B8790B /* Debugger.h in Headers */, 292AC4FF11838FD700B8790B /* DLCache.h in Headers */, 292AC50111838FD700B8790B /* FramebufferManager.h in Headers */, @@ -4790,7 +4770,6 @@ 292AC52011838FD700B8790B /* XFB.h in Headers */, 292AC52211838FD700B8790B /* BPMemLoader.h in Headers */, 292AC52411838FD700B8790B /* Clipper.h in Headers */, - 292AC52511838FD700B8790B /* cocoaGL.h in Headers */, 292AC52811838FD700B8790B /* CommandProcessor.h in Headers */, 292AC52A11838FD700B8790B /* CPMemLoader.h in Headers */, 292AC52C11838FD700B8790B /* DebugUtil.h in Headers */, @@ -5647,7 +5626,6 @@ 292AC39911838FD700B8790B /* BootManager.cpp in Sources */, 292AC39B11838FD700B8790B /* CheatsWindow.cpp in Sources */, 292AC39D11838FD700B8790B /* cmdline.c in Sources */, - 292AC3A011838FD700B8790B /* cocoaApp.m in Sources */, 292AC3A111838FD700B8790B /* ConfigMain.cpp in Sources */, 292AC3A311838FD700B8790B /* Frame.cpp in Sources */, 292AC3A511838FD700B8790B /* FrameAui.cpp in Sources */, @@ -5823,7 +5801,6 @@ 292AC4F511838FD700B8790B /* Thread.cpp in Sources */, 292AC4F711838FD700B8790B /* XFStructs.cpp in Sources */, 292AC4F911838FD700B8790B /* BPFunctions.cpp in Sources */, - 292AC4FB11838FD700B8790B /* cocoaGL.m in Sources */, 292AC4FC11838FD700B8790B /* Debugger.cpp in Sources */, 292AC4FE11838FD700B8790B /* DLCache.cpp in Sources */, 292AC50011838FD700B8790B /* FramebufferManager.cpp in Sources */, @@ -5845,7 +5822,6 @@ 292AC51F11838FD700B8790B /* XFB.cpp in Sources */, 292AC52111838FD700B8790B /* BPMemLoader.cpp in Sources */, 292AC52311838FD700B8790B /* Clipper.cpp in Sources */, - 292AC52611838FD700B8790B /* cocoaGL.m in Sources */, 292AC52711838FD700B8790B /* CommandProcessor.cpp in Sources */, 292AC52911838FD700B8790B /* CPMemLoader.cpp in Sources */, 292AC52B11838FD700B8790B /* DebugUtil.cpp in Sources */, diff --git a/Source/Plugins/Plugin_GCPad/Src/Config.cpp b/Source/Plugins/Plugin_GCPad/Src/Config.cpp index e8e9e4ff866c..f417349d8338 100644 --- a/Source/Plugins/Plugin_GCPad/Src/Config.cpp +++ b/Source/Plugins/Plugin_GCPad/Src/Config.cpp @@ -122,7 +122,7 @@ static const int gcDefaultControls[] = 0x00, // L semi-press 0x00, // R semi-press }; -#elif defined(HAVE_COCOA) && HAVE_COCOA +#elif defined(__APPLE__) // Reference for Cocoa key codes: // http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes { diff --git a/Source/Plugins/Plugin_GCPad/Src/GCPad.h b/Source/Plugins/Plugin_GCPad/Src/GCPad.h index 6f702c0617af..52fe38578567 100644 --- a/Source/Plugins/Plugin_GCPad/Src/GCPad.h +++ b/Source/Plugins/Plugin_GCPad/Src/GCPad.h @@ -42,9 +42,6 @@ #include #include #include -//no need for Cocoa yet, but I guess ayuanx isn't done yet. -//#elif defined(HAVE_COCOA) && HAVE_COCOA -// #include #endif #include "pluginspecs_pad.h" diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 9c9ae2c5cdd2..9a714eeed57a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -55,8 +55,6 @@ void OpenGL_SwapBuffers() { #if defined(USE_WX) && USE_WX GLWin.glCanvas->SwapBuffers(); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLSwap(GLWin.cocoaCtx,GLWin.cocoaWin); #elif defined(_WIN32) SwapBuffers(hDC); #elif defined(HAVE_X11) && HAVE_X11 @@ -78,8 +76,6 @@ void OpenGL_SetWindowText(const char *text) { #if defined(USE_WX) && USE_WX // GLWin.frame->SetTitle(wxString::FromAscii(text)); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLSetTitle(GLWin.cocoaWin, text); #elif defined(_WIN32) // TODO convert text to unicode and change SetWindowTextA to SetWindowText SetWindowTextA(EmuWindow::GetWnd(), text); @@ -268,12 +264,6 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); -#elif defined(HAVE_COCOA) && HAVE_COCOA - GLWin.width = s_backbuffer_width; - GLWin.height = s_backbuffer_height; - GLWin.cocoaWin = cocoaGLCreateWindow(GLWin.width, GLWin.height); - GLWin.cocoaCtx = cocoaGLInit(g_Config.iMultisampleMode); - #elif defined(_WIN32) g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait...")); if (g_VideoInitialize.pWindowHandle == NULL) @@ -415,8 +405,6 @@ bool OpenGL_MakeCurrent() // connect the glx-context to the window #if defined(USE_WX) && USE_WX GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLMakeCurrent(GLWin.cocoaCtx,GLWin.cocoaWin); #elif defined(_WIN32) return wglMakeCurrent(hDC,hRC); #elif defined(HAVE_X11) && HAVE_X11 @@ -437,11 +425,6 @@ void OpenGL_Update() // TODO fill in -#elif defined(HAVE_COCOA) && HAVE_COCOA - RECT rcWindow = {0}; - rcWindow.right = GLWin.width; - rcWindow.bottom = GLWin.height; - #elif defined(_WIN32) RECT rcWindow; if (!EmuWindow::GetParentWnd()) @@ -481,10 +464,6 @@ void OpenGL_Shutdown() { #if defined(USE_WX) && USE_WX delete GLWin.glCanvas; -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLDeleteWindow(GLWin.cocoaWin); - cocoaGLDelete(GLWin.cocoaCtx); - #elif defined(_WIN32) if (hRC) // Do We Have A Rendering Context? { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h index 9c20a1af961e..12c53fe8e2e5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -48,10 +48,6 @@ #elif defined(USE_SDL) && USE_SDL #include #include - -#elif defined(HAVE_COCOA) && HAVE_COCOA -#include -#include "cocoaGL.h" #endif // end USE_WX #if defined(__APPLE__) @@ -76,10 +72,7 @@ typedef struct { int screen; -#if defined(HAVE_COCOA) && HAVE_COCOA - NSWindow *cocoaWin; - NSOpenGLContext *cocoaCtx; -#elif defined(HAVE_X11) && HAVE_X11 +#if defined(HAVE_X11) && HAVE_X11 Window win; Window parent; Display *dpy; @@ -87,8 +80,7 @@ typedef struct { GLXContext ctx; XSetWindowAttributes attr; Common::Thread *xEventThread; -#endif // X11 -#if defined(USE_WX) && USE_WX +#elif defined(USE_WX) && USE_WX wxGLCanvas *glCanvas; wxPanel *panel; wxGLContext *glCtxt; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript index 4793e4b994bb..2724a150d2c6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SConscript +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -25,8 +25,6 @@ files = [ 'PostProcessing.cpp', 'FramebufferManager.cpp', ] -compileFlags = [ - ] linkFlags = [ ] libs = [ @@ -48,12 +46,6 @@ if gfxenv['HAVE_WX']: 'Debugger/Debugger.cpp', ] -if gfxenv['HAVE_COCOA']: - files += [ 'cocoaGL.m' ] - compileFlags += [ - '-x', - 'objective-c++', - ] if sys.platform == 'win32': files += [ 'OS/Win32.cpp' ] @@ -105,7 +97,6 @@ if gfxenv['USE_WX'] and not gfxenv['HAVE_WX']: print "Must have wx to use wxgl" Return() gfxenv.Append( - CXXFLAGS = compileFlags, LINKFLAGS = linkFlags, ) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h deleted file mode 100644 index cdd2a7065041..000000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h +++ /dev/null @@ -1,29 +0,0 @@ -#import -#import - -#ifdef __cplusplus -extern "C" -{ -#endif - - -void cocoaGLCreateApp(); - -NSWindow *cocoaGLCreateWindow(int w,int h); - -void cocoaGLSetTitle(NSWindow *win, const char *title); - -void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win); - -NSOpenGLContext* cocoaGLInit(int mode); - -void cocoaGLDelete(NSOpenGLContext *ctx); - -void cocoaGLDeleteWindow(NSWindow *window); - -void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window); - -#ifdef __cplusplus -} -#endif - diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m deleted file mode 100755 index 6a821635e2c2..000000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m +++ /dev/null @@ -1,149 +0,0 @@ -#import "cocoaGL.h" - -NSWindow *cocoaGLCreateWindow(int w,int h) -{ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSWindow *window; - window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h) - styleMask:NSTitledWindowMask | NSResizableWindowMask - backing:NSBackingStoreBuffered - defer:FALSE]; - [window setReleasedWhenClosed: YES]; - - [window setTitle:@"Dolphin on OSX"]; - //[window makeKeyAndOrderFront: nil]; - - [pool release]; - - return window; -} - -void cocoaGLSetTitle(NSWindow *win, const char *title) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]]; - - [pool release]; -} - -void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - - int value = 0; - [ctx setValues:&value forParameter:NSOpenGLCPSwapInterval]; - - if (ctx) { - [ctx setView:[win contentView]]; - [ctx update]; - [ctx makeCurrentContext]; - } - else - [NSOpenGLContext clearCurrentContext]; - - [pool release]; -} - - - -NSOpenGLContext* cocoaGLInit(int mode) -{ - NSAutoreleasePool *pool; - - NSOpenGLPixelFormatAttribute attr[32]; - NSOpenGLPixelFormat *fmt; - NSOpenGLContext *context; - int i = 0; - - pool = [[NSAutoreleasePool alloc] init]; - - attr[i++] = NSOpenGLPFADepthSize; - attr[i++] = 24; - attr[i++] = NSOpenGLPFADoubleBuffer; - - attr[i++] = NSOpenGLPFASampleBuffers; - attr[i++] = mode; - attr[i++] = NSOpenGLPFASamples; - attr[i++] = 1; - - attr[i++] = NSOpenGLPFANoRecovery; -#ifdef GL_VERSION_1_3 - -#else -#ifdef GL_VERSION_1_2 -#warning "your card only supports ogl 1.2, dolphin will use software renderer" - //if opengl < 1.3 uncomment this twoo lines to use software renderer - attr[i++] = NSOpenGLPFARendererID; - attr[i++] = kCGLRendererGenericFloatID; -#endif -#endif - attr[i++] = NSOpenGLPFAScreenMask; - attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID()); - - attr[i] = 0; - - fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; - if (fmt == nil) { - printf("failed to create pixel format\n"); - [pool release]; - return NULL; - } - - context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; - - [fmt release]; - - if (context == nil) { - printf("failed to create context\n"); - [pool release]; - return NULL; - } - - [pool release]; - - return context; - -} - -void cocoaGLDelete(NSOpenGLContext *ctx) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - - [ctx clearDrawable]; - [ctx release]; - - [pool release]; - -} -void cocoaGLDeleteWindow(NSWindow *window) -{ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [window close]; - [pool release]; - - return; -} - -void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - [window makeKeyAndOrderFront: nil]; - - ctx = [NSOpenGLContext currentContext]; - if (ctx != nil) - [ctx flushBuffer]; - else - printf("bad cocoa gl ctx\n"); - - [pool release]; -} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp index fb74ce1abff8..abbfaf1cb854 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp @@ -1,544 +1,522 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "main.h" -#include "VideoConfig.h" -#include "IniFile.h" -#include "svnrev.h" -#include "Setup.h" - -//#include "Render.h" - -#if defined(_WIN32) -#include "Win32.h" -#else -struct RECT -{ - int left, top; - int right, bottom; -}; -#endif - -#include "GLUtil.h" - -// Handles OpenGL and the window - -// Window dimensions. -static int s_backbuffer_width; -static int s_backbuffer_height; - -#ifndef _WIN32 -GLWindow GLWin; -#endif - -#if defined(_WIN32) -static HDC hDC = NULL; // Private GDI Device Context -static HGLRC hRC = NULL; // Permanent Rendering Context -extern HINSTANCE g_hInstance; -#endif - -void OpenGL_SwapBuffers() -{ -#if defined(USE_WX) && USE_WX - GLWin.glCanvas->SwapBuffers(); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLSwap(GLWin.cocoaCtx,GLWin.cocoaWin); -#elif defined(_WIN32) - SwapBuffers(hDC); -#elif defined(HAVE_X11) && HAVE_X11 - glXSwapBuffers(GLWin.dpy, GLWin.win); -#endif -} - -u32 OpenGL_GetBackbufferWidth() -{ - return s_backbuffer_width; -} - -u32 OpenGL_GetBackbufferHeight() -{ - return s_backbuffer_height; -} - -void OpenGL_SetWindowText(const char *text) -{ -#if defined(USE_WX) && USE_WX - GLWin.frame->SetTitle(wxString::FromAscii(text)); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLSetTitle(GLWin.cocoaWin, text); -#elif defined(_WIN32) - // TODO convert text to unicode and change SetWindowTextA to SetWindowText - SetWindowTextA(EmuWindow::GetWnd(), text); -#elif defined(HAVE_X11) && HAVE_X11 // GLX - /** - * Tell X to ask the window manager to set the window title. (X - * itself doesn't provide window title functionality.) - */ - XStoreName(GLWin.dpy, GLWin.win, text); -#endif -} - -// ======================================================================================= -// Draw messages on top of the screen -// ------------------ -unsigned int Callback_PeekMessages() -{ -#ifdef _WIN32 - // TODO: peekmessage - MSG msg; - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - return FALSE; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return TRUE; -#else - return FALSE; -#endif -} - -// Show the current FPS -void UpdateFPSDisplay(const char *text) -{ - char temp[512]; - sprintf(temp, "SVN R%s: SW: %s", SVN_REV_STR, text); - OpenGL_SetWindowText(temp); -} -// ========================= - - -// ======================================================================================= -// Create rendering window. -// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -// ------------------ -bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _twidth, int _theight) -{ - int xPos, yPos; - g_VideoInitialize.pRequestWindowSize(xPos, yPos, _twidth, _theight); - - #if defined(_WIN32) - EmuWindow::SetSize(_twidth, _theight); - #endif - // ---------------------------- - - // --------------------------------------------------------------------------------------- - // Control window size and picture scaling - // ------------------ - s_backbuffer_width = _twidth; - s_backbuffer_height = _theight; - - g_VideoInitialize.pPeekMessages = &Callback_PeekMessages; - g_VideoInitialize.pUpdateFPSDisplay = &UpdateFPSDisplay; - -#if defined(USE_WX) && USE_WX - int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0}; - - wxSize size(_twidth, _theight); - if ( g_VideoInitialize.pWindowHandle == NULL) { - GLWin.frame = new wxFrame((wxWindow *)NULL, - -1, _("Dolphin"), wxPoint(50,50), size); - } else { - GLWin.frame = new wxFrame((wxWindow *)g_VideoInitialize.pWindowHandle, - -1, _("Dolphin"), wxPoint(50,50), size); - } - - GLWin.glCanvas = new wxGLCanvas(GLWin.frame, wxID_ANY, args, - wxPoint(0,0), size, wxSUNKEN_BORDER); - GLWin.glCtxt = new wxGLContext(GLWin.glCanvas); - GLWin.frame->Show(TRUE); - GLWin.glCanvas->Show(TRUE); - - GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); - -#elif defined(HAVE_COCOA) && HAVE_COCOA - GLWin.width = s_backbuffer_width; - GLWin.height = s_backbuffer_height; - GLWin.cocoaWin = cocoaGLCreateWindow(GLWin.width, GLWin.height); - GLWin.cocoaCtx = cocoaGLInit(0); - -#elif defined(_WIN32) - // --------------------------------------------------------------------------------------- - // Create rendering window in Windows - // ---------------------- - g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait...")); - - // Show the window - EmuWindow::Show(); - - if (g_VideoInitialize.pWindowHandle == NULL) - { - g_VideoInitialize.pSysMessage("failed to create window"); - return false; - } - - GLuint PixelFormat; // Holds The Results After Searching For A Match - DWORD dwExStyle; // Window Extended Style - DWORD dwStyle; // Window Style - - RECT rcdesktop; - GetWindowRect(GetDesktopWindow(), &rcdesktop); - - dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; - dwStyle = WS_OVERLAPPEDWINDOW; - - RECT rc = {0, 0, s_backbuffer_width, s_backbuffer_height}; - AdjustWindowRectEx(&rc, dwStyle, FALSE, dwExStyle); - - int X = (rcdesktop.right-rcdesktop.left)/2 - (rc.right-rc.left)/2; - int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; - - // EmuWindow::GetWnd() is either the new child window or the new separate window - SetWindowPos(EmuWindow::GetWnd(), NULL, X, Y, rc.right-rc.left, rc.bottom-rc.top, SWP_NOREPOSITION | SWP_NOZORDER); - - PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be - { - sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor - 1, // Version Number - PFD_DRAW_TO_WINDOW | // Format Must Support Window - PFD_SUPPORT_OPENGL | // Format Must Support OpenGL - PFD_DOUBLEBUFFER, // Must Support Double Buffering - PFD_TYPE_RGBA, // Request An RGBA Format - 32, // Select Our Color Depth - 0, 0, 0, 0, 0, 0, // Color Bits Ignored - 0, // 8bit Alpha Buffer - 0, // Shift Bit Ignored - 0, // No Accumulation Buffer - 0, 0, 0, 0, // Accumulation Bits Ignored - 24, // 24Bit Z-Buffer (Depth Buffer) - 8, // 8bit Stencil Buffer - 0, // No Auxiliary Buffer - PFD_MAIN_PLANE, // Main Drawing Layer - 0, // Reserved - 0, 0, 0 // Layer Masks Ignored - }; - - if (!(hDC=GetDC(EmuWindow::GetWnd()))) { - PanicAlert("(1) Can't create an OpenGL Device context. Fail."); - return false; - } - - if (!(PixelFormat = ChoosePixelFormat(hDC,&pfd))) { - PanicAlert("(2) Can't find a suitable PixelFormat."); - return false; - } - - if (!SetPixelFormat(hDC, PixelFormat, &pfd)) { - PanicAlert("(3) Can't set the PixelFormat."); - return false; - } - - if (!(hRC = wglCreateContext(hDC))) { - PanicAlert("(4) Can't create an OpenGL rendering context."); - return false; - } - // -------------------------------------- - -#elif defined(HAVE_X11) && HAVE_X11 - XVisualInfo *vi; - Colormap cmap; - int glxMajorVersion, glxMinorVersion; - Atom wmDelete; - - // attributes for a single buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer - int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8, - GLX_GREEN_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, - None}; - - // attributes for a double buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer - int attrListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 8, - GLX_GREEN_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, - GLX_SAMPLE_BUFFERS_ARB, GLX_SAMPLES_ARB, 1, None }; - - int attrListDefault[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - None }; - - GLWin.dpy = XOpenDisplay(0); - GLWin.parent = (Window)g_VideoInitialize.pWindowHandle; - g_VideoInitialize.pWindowHandle = (HWND)GLWin.dpy; - GLWin.screen = DefaultScreen(GLWin.dpy); - - /* get an appropriate visual */ - vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDbl); - if (vi == NULL) - { - vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListSgl); - if (vi != NULL) - { - ERROR_LOG(VIDEO, "Only Singlebuffered Visual!"); - } - else - { - vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDefault); - if (vi == NULL) - { - ERROR_LOG(VIDEO, "Could not choose visual (glXChooseVisual)"); - exit(0); - } - } - } - else - NOTICE_LOG(VIDEO, "Got Doublebuffered Visual!"); - - glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion); - NOTICE_LOG(VIDEO, "glX-Version %d.%d", glxMajorVersion, glxMinorVersion); - // Create a GLX context. - GLWin.ctx = glXCreateContext(GLWin.dpy, vi, 0, GL_TRUE); - if(!GLWin.ctx) - { - PanicAlert("Couldn't Create GLX context.Quit"); - exit(0); // TODO: Don't bring down entire Emu - } - - if (GLWin.parent == 0) - GLWin.parent = RootWindow(GLWin.dpy, vi->screen); - // Create a color map. - cmap = XCreateColormap(GLWin.dpy, GLWin.parent, vi->visual, AllocNone); - GLWin.attr.colormap = cmap; - GLWin.attr.border_pixel = 0; - XkbSetDetectableAutoRepeat(GLWin.dpy, True, NULL); - - // create a window in window mode - GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | ResizeRedirectMask; - GLWin.win = XCreateWindow(GLWin.dpy, GLWin.parent, - xPos, yPos, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual, - CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr); - // only set window title and handle wm_delete_events if in windowed mode - wmDelete = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.dpy, GLWin.win, &wmDelete, 1); - XSetStandardProperties(GLWin.dpy, GLWin.win, "GPU", - "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.dpy, GLWin.win); - - g_VideoInitialize.pXWindow = (Window *) &GLWin.win; -#endif - return true; -} - -bool OpenGL_MakeCurrent() -{ -#if defined(USE_WX) && USE_WX - GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLMakeCurrent(GLWin.cocoaCtx,GLWin.cocoaWin); -#elif defined(_WIN32) - if (!wglMakeCurrent(hDC,hRC)) { - PanicAlert("(5) Can't Activate The GL Rendering Context."); - return false; - } -#elif defined(HAVE_X11) && HAVE_X11 - Window winDummy; - unsigned int borderDummy; - // connect the glx-context to the window - glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); - XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); - NOTICE_LOG(VIDEO, "GLWin Depth %d", GLWin.depth) - if (glXIsDirect(GLWin.dpy, GLWin.ctx)) { - NOTICE_LOG(VIDEO, "detected direct rendering"); - } else { - ERROR_LOG(VIDEO, "no Direct Rendering possible!"); - } - - // better for pad plugin key input (thc) - XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask ); -#endif - return true; -} -// Update window width, size and etc. Called from Render.cpp -void OpenGL_Update() -{ -#if defined(USE_WX) && USE_WX - RECT rcWindow = {0}; - rcWindow.right = GLWin.width; - rcWindow.bottom = GLWin.height; - - // TODO fill in - -#elif defined(HAVE_COCOA) && HAVE_COCOA - RECT rcWindow = {0}; - rcWindow.right = GLWin.width; - rcWindow.bottom = GLWin.height; - -#elif defined(_WIN32) - RECT rcWindow; - if (!EmuWindow::GetParentWnd()) - { - // We are not rendering to a child window - use client size. - GetClientRect(EmuWindow::GetWnd(), &rcWindow); - } - else - { - // We are rendering to a child window - use parent size. - GetWindowRect(EmuWindow::GetParentWnd(), &rcWindow); - } - - // --------------------------------------------------------------------------------------- - // Get the new window width and height - // ------------------ - // See below for documentation - // ------------------ - int width = rcWindow.right - rcWindow.left; - int height = rcWindow.bottom - rcWindow.top; - - // If we are rendering to a child window - if (EmuWindow::GetParentWnd() != 0) - ::MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE); - - s_backbuffer_width = width; - s_backbuffer_height = height; - -#elif defined(HAVE_X11) && HAVE_X11 - // We just check all of our events here - XEvent event; - int num_events; - for (num_events = XPending(GLWin.dpy);num_events > 0;num_events--) { - XNextEvent(GLWin.dpy, &event); - switch(event.type) { - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy; - XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((ulong) event.xclient.data.l[0] == XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", False)) - g_VideoInitialize.pCoreMessage(WM_USER_STOP); - if ((ulong) event.xclient.data.l[0] == XInternAtom(GLWin.dpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.dpy, GLWin.win, event.xclient.data.l[1], - event.xclient.data.l[2], event.xclient.data.l[3], event.xclient.data.l[4]); - return; - break; - default: - break; - } - } - return; -#endif -} - - -// Close plugin -void OpenGL_Shutdown() -{ -#if defined(USE_WX) && USE_WX - delete GLWin.glCanvas; - delete GLWin.frame; -#elif defined(HAVE_COCOA) && HAVE_COCOA - cocoaGLDeleteWindow(GLWin.cocoaWin); - cocoaGLDelete(GLWin.cocoaCtx); - -#elif defined(_WIN32) - if (hRC) // Do We Have A Rendering Context? - { - if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts? - { - // [F|RES]: if this fails i dont see the message box and - // cant get out of the modal state so i disable it. - // This function fails only if i render to main window - // MessageBox(NULL,"Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); - } - - if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? - { - ERROR_LOG(VIDEO, "Release Rendering Context Failed."); - } - hRC = NULL; // Set RC To NULL - } - - if (hDC && !ReleaseDC(EmuWindow::GetWnd(), hDC)) // Are We Able To Release The DC - { - ERROR_LOG(VIDEO, "Release Device Context Failed."); - hDC = NULL; // Set DC To NULL - } -#elif defined(HAVE_X11) && HAVE_X11 - if (GLWin.ctx) - { - if (!glXMakeCurrent(GLWin.dpy, None, NULL)) - { - ERROR_LOG(VIDEO, "Could not release drawing context.\n"); - } - XUnmapWindow(GLWin.dpy, GLWin.win); - glXDestroyContext(GLWin.dpy, GLWin.ctx); - XCloseDisplay(GLWin.dpy); - GLWin.ctx = NULL; - } -#endif -} - -GLuint OpenGL_ReportGLError(const char *function, const char *file, int line) -{ - GLint err = glGetError(); - if (err != GL_NO_ERROR) - { - ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL error 0x%x - %s\n", file, line, function, err, gluErrorString(err)); - } - return err; -} - -void OpenGL_ReportARBProgramError() -{ - const GLubyte* pstr = glGetString(GL_PROGRAM_ERROR_STRING_ARB); - if (pstr != NULL && pstr[0] != 0) - { - GLint loc = 0; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &loc); - ERROR_LOG(VIDEO, "program error at %d: ", loc); - ERROR_LOG(VIDEO, (char*)pstr); - ERROR_LOG(VIDEO, ""); - } -} - -bool OpenGL_ReportFBOError(const char *function, const char *file, int line) -{ - unsigned int fbo_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (fbo_status != GL_FRAMEBUFFER_COMPLETE_EXT) - { - const char *error = "-"; - switch (fbo_status) - { - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: error = "INCOMPLETE_ATTACHMENT_EXT"; break; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: error = "INCOMPLETE_MISSING_ATTACHMENT_EXT"; break; - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: error = "INCOMPLETE_DIMENSIONS_EXT"; break; - case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: error = "INCOMPLETE_FORMATS_EXT"; break; - case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: error = "INCOMPLETE_DRAW_BUFFER_EXT"; break; - case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: error = "INCOMPLETE_READ_BUFFER_EXT"; break; - case GL_FRAMEBUFFER_UNSUPPORTED_EXT: error = "UNSUPPORTED_EXT"; break; - } - ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL FBO error - %s\n", file, line, function, error); - return false; - } - return true; -} +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "main.h" +#include "VideoConfig.h" +#include "IniFile.h" +#include "svnrev.h" +#include "Setup.h" + +//#include "Render.h" + +#if defined(_WIN32) +#include "Win32.h" +#else +struct RECT +{ + int left, top; + int right, bottom; +}; +#endif + +#include "GLUtil.h" + +// Handles OpenGL and the window + +// Window dimensions. +static int s_backbuffer_width; +static int s_backbuffer_height; + +#ifndef _WIN32 +GLWindow GLWin; +#endif + +#if defined(_WIN32) +static HDC hDC = NULL; // Private GDI Device Context +static HGLRC hRC = NULL; // Permanent Rendering Context +extern HINSTANCE g_hInstance; +#endif + +void OpenGL_SwapBuffers() +{ +#if defined(USE_WX) && USE_WX + GLWin.glCanvas->SwapBuffers(); +#elif defined(_WIN32) + SwapBuffers(hDC); +#elif defined(HAVE_X11) && HAVE_X11 + glXSwapBuffers(GLWin.dpy, GLWin.win); +#endif +} + +u32 OpenGL_GetBackbufferWidth() +{ + return s_backbuffer_width; +} + +u32 OpenGL_GetBackbufferHeight() +{ + return s_backbuffer_height; +} + +void OpenGL_SetWindowText(const char *text) +{ +#if defined(USE_WX) && USE_WX + GLWin.frame->SetTitle(wxString::FromAscii(text)); +#elif defined(_WIN32) + // TODO convert text to unicode and change SetWindowTextA to SetWindowText + SetWindowTextA(EmuWindow::GetWnd(), text); +#elif defined(HAVE_X11) && HAVE_X11 // GLX + /** + * Tell X to ask the window manager to set the window title. (X + * itself doesn't provide window title functionality.) + */ + XStoreName(GLWin.dpy, GLWin.win, text); +#endif +} + +// ======================================================================================= +// Draw messages on top of the screen +// ------------------ +unsigned int Callback_PeekMessages() +{ +#ifdef _WIN32 + // TODO: peekmessage + MSG msg; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + return FALSE; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return TRUE; +#else + return FALSE; +#endif +} + +// Show the current FPS +void UpdateFPSDisplay(const char *text) +{ + char temp[512]; + sprintf(temp, "SVN R%s: SW: %s", SVN_REV_STR, text); + OpenGL_SetWindowText(temp); +} +// ========================= + + +// ======================================================================================= +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +// ------------------ +bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _twidth, int _theight) +{ + int xPos, yPos; + g_VideoInitialize.pRequestWindowSize(xPos, yPos, _twidth, _theight); + + #if defined(_WIN32) + EmuWindow::SetSize(_twidth, _theight); + #endif + // ---------------------------- + + // --------------------------------------------------------------------------------------- + // Control window size and picture scaling + // ------------------ + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + g_VideoInitialize.pPeekMessages = &Callback_PeekMessages; + g_VideoInitialize.pUpdateFPSDisplay = &UpdateFPSDisplay; + +#if defined(USE_WX) && USE_WX + int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0}; + + wxSize size(_twidth, _theight); + if ( g_VideoInitialize.pWindowHandle == NULL) { + GLWin.frame = new wxFrame((wxWindow *)NULL, + -1, _("Dolphin"), wxPoint(50,50), size); + } else { + GLWin.frame = new wxFrame((wxWindow *)g_VideoInitialize.pWindowHandle, + -1, _("Dolphin"), wxPoint(50,50), size); + } + + GLWin.glCanvas = new wxGLCanvas(GLWin.frame, wxID_ANY, args, + wxPoint(0,0), size, wxSUNKEN_BORDER); + GLWin.glCtxt = new wxGLContext(GLWin.glCanvas); + GLWin.frame->Show(TRUE); + GLWin.glCanvas->Show(TRUE); + + GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); +#elif defined(_WIN32) + // --------------------------------------------------------------------------------------- + // Create rendering window in Windows + // ---------------------- + g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait...")); + + // Show the window + EmuWindow::Show(); + + if (g_VideoInitialize.pWindowHandle == NULL) + { + g_VideoInitialize.pSysMessage("failed to create window"); + return false; + } + + GLuint PixelFormat; // Holds The Results After Searching For A Match + DWORD dwExStyle; // Window Extended Style + DWORD dwStyle; // Window Style + + RECT rcdesktop; + GetWindowRect(GetDesktopWindow(), &rcdesktop); + + dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + dwStyle = WS_OVERLAPPEDWINDOW; + + RECT rc = {0, 0, s_backbuffer_width, s_backbuffer_height}; + AdjustWindowRectEx(&rc, dwStyle, FALSE, dwExStyle); + + int X = (rcdesktop.right-rcdesktop.left)/2 - (rc.right-rc.left)/2; + int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; + + // EmuWindow::GetWnd() is either the new child window or the new separate window + SetWindowPos(EmuWindow::GetWnd(), NULL, X, Y, rc.right-rc.left, rc.bottom-rc.top, SWP_NOREPOSITION | SWP_NOZORDER); + + PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be + { + sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor + 1, // Version Number + PFD_DRAW_TO_WINDOW | // Format Must Support Window + PFD_SUPPORT_OPENGL | // Format Must Support OpenGL + PFD_DOUBLEBUFFER, // Must Support Double Buffering + PFD_TYPE_RGBA, // Request An RGBA Format + 32, // Select Our Color Depth + 0, 0, 0, 0, 0, 0, // Color Bits Ignored + 0, // 8bit Alpha Buffer + 0, // Shift Bit Ignored + 0, // No Accumulation Buffer + 0, 0, 0, 0, // Accumulation Bits Ignored + 24, // 24Bit Z-Buffer (Depth Buffer) + 8, // 8bit Stencil Buffer + 0, // No Auxiliary Buffer + PFD_MAIN_PLANE, // Main Drawing Layer + 0, // Reserved + 0, 0, 0 // Layer Masks Ignored + }; + + if (!(hDC=GetDC(EmuWindow::GetWnd()))) { + PanicAlert("(1) Can't create an OpenGL Device context. Fail."); + return false; + } + + if (!(PixelFormat = ChoosePixelFormat(hDC,&pfd))) { + PanicAlert("(2) Can't find a suitable PixelFormat."); + return false; + } + + if (!SetPixelFormat(hDC, PixelFormat, &pfd)) { + PanicAlert("(3) Can't set the PixelFormat."); + return false; + } + + if (!(hRC = wglCreateContext(hDC))) { + PanicAlert("(4) Can't create an OpenGL rendering context."); + return false; + } + // -------------------------------------- + +#elif defined(HAVE_X11) && HAVE_X11 + XVisualInfo *vi; + Colormap cmap; + int glxMajorVersion, glxMinorVersion; + Atom wmDelete; + + // attributes for a single buffered visual in RGBA format with at least + // 8 bits per color and a 24 bit depth buffer + int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + None}; + + // attributes for a double buffered visual in RGBA format with at least + // 8 bits per color and a 24 bit depth buffer + int attrListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + GLX_SAMPLE_BUFFERS_ARB, GLX_SAMPLES_ARB, 1, None }; + + int attrListDefault[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_DEPTH_SIZE, 1, + None }; + + GLWin.dpy = XOpenDisplay(0); + GLWin.parent = (Window)g_VideoInitialize.pWindowHandle; + g_VideoInitialize.pWindowHandle = (HWND)GLWin.dpy; + GLWin.screen = DefaultScreen(GLWin.dpy); + + /* get an appropriate visual */ + vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDbl); + if (vi == NULL) + { + vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListSgl); + if (vi != NULL) + { + ERROR_LOG(VIDEO, "Only Singlebuffered Visual!"); + } + else + { + vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDefault); + if (vi == NULL) + { + ERROR_LOG(VIDEO, "Could not choose visual (glXChooseVisual)"); + exit(0); + } + } + } + else + NOTICE_LOG(VIDEO, "Got Doublebuffered Visual!"); + + glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion); + NOTICE_LOG(VIDEO, "glX-Version %d.%d", glxMajorVersion, glxMinorVersion); + // Create a GLX context. + GLWin.ctx = glXCreateContext(GLWin.dpy, vi, 0, GL_TRUE); + if(!GLWin.ctx) + { + PanicAlert("Couldn't Create GLX context.Quit"); + exit(0); // TODO: Don't bring down entire Emu + } + + if (GLWin.parent == 0) + GLWin.parent = RootWindow(GLWin.dpy, vi->screen); + // Create a color map. + cmap = XCreateColormap(GLWin.dpy, GLWin.parent, vi->visual, AllocNone); + GLWin.attr.colormap = cmap; + GLWin.attr.border_pixel = 0; + XkbSetDetectableAutoRepeat(GLWin.dpy, True, NULL); + + // create a window in window mode + GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | + StructureNotifyMask | ResizeRedirectMask; + GLWin.win = XCreateWindow(GLWin.dpy, GLWin.parent, + xPos, yPos, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr); + // only set window title and handle wm_delete_events if in windowed mode + wmDelete = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.dpy, GLWin.win, &wmDelete, 1); + XSetStandardProperties(GLWin.dpy, GLWin.win, "GPU", + "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.dpy, GLWin.win); + + g_VideoInitialize.pXWindow = (Window *) &GLWin.win; +#endif + return true; +} + +bool OpenGL_MakeCurrent() +{ +#if defined(USE_WX) && USE_WX + GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); +#elif defined(_WIN32) + if (!wglMakeCurrent(hDC,hRC)) { + PanicAlert("(5) Can't Activate The GL Rendering Context."); + return false; + } +#elif defined(HAVE_X11) && HAVE_X11 + Window winDummy; + unsigned int borderDummy; + // connect the glx-context to the window + glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); + XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); + NOTICE_LOG(VIDEO, "GLWin Depth %d", GLWin.depth) + if (glXIsDirect(GLWin.dpy, GLWin.ctx)) { + NOTICE_LOG(VIDEO, "detected direct rendering"); + } else { + ERROR_LOG(VIDEO, "no Direct Rendering possible!"); + } + + // better for pad plugin key input (thc) + XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | + StructureNotifyMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask ); +#endif + return true; +} +// Update window width, size and etc. Called from Render.cpp +void OpenGL_Update() +{ +#if defined(USE_WX) && USE_WX + RECT rcWindow = {0}; + rcWindow.right = GLWin.width; + rcWindow.bottom = GLWin.height; + + // TODO fill in + +#elif defined(_WIN32) + RECT rcWindow; + if (!EmuWindow::GetParentWnd()) + { + // We are not rendering to a child window - use client size. + GetClientRect(EmuWindow::GetWnd(), &rcWindow); + } + else + { + // We are rendering to a child window - use parent size. + GetWindowRect(EmuWindow::GetParentWnd(), &rcWindow); + } + + // --------------------------------------------------------------------------------------- + // Get the new window width and height + // ------------------ + // See below for documentation + // ------------------ + int width = rcWindow.right - rcWindow.left; + int height = rcWindow.bottom - rcWindow.top; + + // If we are rendering to a child window + if (EmuWindow::GetParentWnd() != 0) + ::MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE); + + s_backbuffer_width = width; + s_backbuffer_height = height; + +#elif defined(HAVE_X11) && HAVE_X11 + // We just check all of our events here + XEvent event; + int num_events; + for (num_events = XPending(GLWin.dpy);num_events > 0;num_events--) { + XNextEvent(GLWin.dpy, &event); + switch(event.type) { + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy; + XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); + s_backbuffer_width = GLWin.width; + s_backbuffer_height = GLWin.height; + break; + case ClientMessage: + if ((ulong) event.xclient.data.l[0] == XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", False)) + g_VideoInitialize.pCoreMessage(WM_USER_STOP); + if ((ulong) event.xclient.data.l[0] == XInternAtom(GLWin.dpy, "RESIZE", False)) + XMoveResizeWindow(GLWin.dpy, GLWin.win, event.xclient.data.l[1], + event.xclient.data.l[2], event.xclient.data.l[3], event.xclient.data.l[4]); + return; + break; + default: + break; + } + } + return; +#endif +} + + +// Close plugin +void OpenGL_Shutdown() +{ +#if defined(USE_WX) && USE_WX + delete GLWin.glCanvas; + delete GLWin.frame; +#elif defined(_WIN32) + if (hRC) // Do We Have A Rendering Context? + { + if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts? + { + // [F|RES]: if this fails i dont see the message box and + // cant get out of the modal state so i disable it. + // This function fails only if i render to main window + // MessageBox(NULL,"Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); + } + + if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? + { + ERROR_LOG(VIDEO, "Release Rendering Context Failed."); + } + hRC = NULL; // Set RC To NULL + } + + if (hDC && !ReleaseDC(EmuWindow::GetWnd(), hDC)) // Are We Able To Release The DC + { + ERROR_LOG(VIDEO, "Release Device Context Failed."); + hDC = NULL; // Set DC To NULL + } +#elif defined(HAVE_X11) && HAVE_X11 + if (GLWin.ctx) + { + if (!glXMakeCurrent(GLWin.dpy, None, NULL)) + { + ERROR_LOG(VIDEO, "Could not release drawing context.\n"); + } + XUnmapWindow(GLWin.dpy, GLWin.win); + glXDestroyContext(GLWin.dpy, GLWin.ctx); + XCloseDisplay(GLWin.dpy); + GLWin.ctx = NULL; + } +#endif +} + +GLuint OpenGL_ReportGLError(const char *function, const char *file, int line) +{ + GLint err = glGetError(); + if (err != GL_NO_ERROR) + { + ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL error 0x%x - %s\n", file, line, function, err, gluErrorString(err)); + } + return err; +} + +void OpenGL_ReportARBProgramError() +{ + const GLubyte* pstr = glGetString(GL_PROGRAM_ERROR_STRING_ARB); + if (pstr != NULL && pstr[0] != 0) + { + GLint loc = 0; + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &loc); + ERROR_LOG(VIDEO, "program error at %d: ", loc); + ERROR_LOG(VIDEO, (char*)pstr); + ERROR_LOG(VIDEO, ""); + } +} + +bool OpenGL_ReportFBOError(const char *function, const char *file, int line) +{ + unsigned int fbo_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (fbo_status != GL_FRAMEBUFFER_COMPLETE_EXT) + { + const char *error = "-"; + switch (fbo_status) + { + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: error = "INCOMPLETE_ATTACHMENT_EXT"; break; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: error = "INCOMPLETE_MISSING_ATTACHMENT_EXT"; break; + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: error = "INCOMPLETE_DIMENSIONS_EXT"; break; + case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: error = "INCOMPLETE_FORMATS_EXT"; break; + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: error = "INCOMPLETE_DRAW_BUFFER_EXT"; break; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: error = "INCOMPLETE_READ_BUFFER_EXT"; break; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: error = "UNSUPPORTED_EXT"; break; + } + ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL FBO error - %s\n", file, line, function, error); + return false; + } + return true; +} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.h b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.h index 99d11b4d0331..c4a743447180 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.h @@ -1,148 +1,141 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - - -#ifndef _GLINIT_H_ -#define _GLINIT_H_ - -#if defined GLTEST && GLTEST -#include "nGLUtil.h" -#else -#include "Common.h" -#include -#include "VideoConfig.h" -#include "pluginspecs_video.h" - -#ifdef _WIN32 - -#define GLEW_STATIC - -#include -#include -#include -#include - -#else // linux basic definitions - -#if defined(USE_WX) && USE_WX -#include -#include "wx/wx.h" -#include "wx/glcanvas.h" -#undef HAVE_X11 -#elif defined(HAVE_X11) && HAVE_X11 -#define I_NEED_OS2_H // HAXXOR -#include -#include -#elif defined(USE_SDL) && USE_SDL -#include -#include -#elif defined(HAVE_COCOA) && HAVE_COCOA -#include -#include "cocoaGL.h" -#endif // end USE_WX - -#if defined(__APPLE__) -#include -#else -#include -#endif - -#endif // linux basic definitions - -#ifndef GL_DEPTH24_STENCIL8_EXT // allows FBOs to support stencils -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif - -#ifndef _WIN32 -#if defined(HAVE_X11) && HAVE_X11 -#include -#include -#include -#endif // X11 - -#include -#include - -typedef struct { - int screen; -#if defined(HAVE_COCOA) && HAVE_COCOA - NSWindow *cocoaWin; - NSOpenGLContext *cocoaCtx; -#elif defined(HAVE_X11) && HAVE_X11 - Window win; - Window parent; - Display *dpy; - GLXContext ctx; - XSetWindowAttributes attr; -#endif // X11 -#if defined(USE_WX) && USE_WX - wxGLCanvas *glCanvas; - wxFrame *frame; - wxGLContext *glCtxt; -#endif - int x, y; - unsigned int width, height; - unsigned int depth; -} GLWindow; - -extern GLWindow GLWin; - -#endif - -// Public OpenGL util - -// Initialization / upkeep -bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _width, int _height); -void OpenGL_Shutdown(); -void OpenGL_Update(); -bool OpenGL_MakeCurrent(); -void OpenGL_SwapBuffers(); - -// Get status -u32 OpenGL_GetBackbufferWidth(); -u32 OpenGL_GetBackbufferHeight(); - -// Set things -void OpenGL_SetWindowText(const char *text); - -// Error reporting - use the convenient macros. -void OpenGL_ReportARBProgramError(); -GLuint OpenGL_ReportGLError(const char *function, const char *file, int line); -bool OpenGL_ReportFBOError(const char *function, const char *file, int line); - -#if 1 -#define GL_REPORT_ERROR() OpenGL_ReportGLError (__FUNCTION__, __FILE__, __LINE__) -#define GL_REPORT_PROGRAM_ERROR() OpenGL_ReportARBProgramError() -#define GL_REPORT_FBO_ERROR() OpenGL_ReportFBOError (__FUNCTION__, __FILE__, __LINE__) -#else -#define GL_REPORT_ERROR() GL_NO_ERROR -#define GL_REPORT_PROGRAM_ERROR() -#define GL_REPORT_FBO_ERROR() -#endif - -#if defined(_DEBUG) || defined(DEBUGFAST) -#define GL_REPORT_ERRORD() OpenGL_ReportGLError(__FUNCTION__, __FILE__, __LINE__) -#else -#define GL_REPORT_ERRORD() -#endif - -#endif // GLTEST ?? - -#endif // _GLINIT_H_ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#ifndef _GLINIT_H_ +#define _GLINIT_H_ + +#if defined GLTEST && GLTEST +#include "nGLUtil.h" +#else +#include "Common.h" +#include +#include "VideoConfig.h" +#include "pluginspecs_video.h" + +#ifdef _WIN32 + +#define GLEW_STATIC + +#include +#include +#include +#include + +#else // linux basic definitions + +#if defined(USE_WX) && USE_WX +#include +#include "wx/wx.h" +#include "wx/glcanvas.h" +#undef HAVE_X11 +#elif defined(HAVE_X11) && HAVE_X11 +#define I_NEED_OS2_H // HAXXOR +#include +#include +#elif defined(USE_SDL) && USE_SDL +#include +#include +#endif // end USE_WX + +#if defined(__APPLE__) +#include +#else +#include +#endif + +#endif // linux basic definitions + +#ifndef GL_DEPTH24_STENCIL8_EXT // allows FBOs to support stencils +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif + +#ifndef _WIN32 +#if defined(HAVE_X11) && HAVE_X11 +#include +#include +#include +#endif // X11 + +#include +#include + +typedef struct { + int screen; +#if defined(HAVE_X11) && HAVE_X11 + Window win; + Window parent; + Display *dpy; + GLXContext ctx; + XSetWindowAttributes attr; +#elif defined(USE_WX) && USE_WX + wxGLCanvas *glCanvas; + wxFrame *frame; + wxGLContext *glCtxt; +#endif + int x, y; + unsigned int width, height; + unsigned int depth; +} GLWindow; + +extern GLWindow GLWin; + +#endif + +// Public OpenGL util + +// Initialization / upkeep +bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _width, int _height); +void OpenGL_Shutdown(); +void OpenGL_Update(); +bool OpenGL_MakeCurrent(); +void OpenGL_SwapBuffers(); + +// Get status +u32 OpenGL_GetBackbufferWidth(); +u32 OpenGL_GetBackbufferHeight(); + +// Set things +void OpenGL_SetWindowText(const char *text); + +// Error reporting - use the convenient macros. +void OpenGL_ReportARBProgramError(); +GLuint OpenGL_ReportGLError(const char *function, const char *file, int line); +bool OpenGL_ReportFBOError(const char *function, const char *file, int line); + +#if 1 +#define GL_REPORT_ERROR() OpenGL_ReportGLError (__FUNCTION__, __FILE__, __LINE__) +#define GL_REPORT_PROGRAM_ERROR() OpenGL_ReportARBProgramError() +#define GL_REPORT_FBO_ERROR() OpenGL_ReportFBOError (__FUNCTION__, __FILE__, __LINE__) +#else +#define GL_REPORT_ERROR() GL_NO_ERROR +#define GL_REPORT_PROGRAM_ERROR() +#define GL_REPORT_FBO_ERROR() +#endif + +#if defined(_DEBUG) || defined(DEBUGFAST) +#define GL_REPORT_ERRORD() OpenGL_ReportGLError(__FUNCTION__, __FILE__, __LINE__) +#else +#define GL_REPORT_ERRORD() +#endif + +#endif // GLTEST ?? + +#endif // _GLINIT_H_ diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript index 6732a13b0fc5..9bdd52243cc9 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript @@ -53,9 +53,6 @@ conf = gfxenv.Configure(custom_tests = tests, if sys.platform == 'darwin': gfxenv['FRAMEWORKS'] = ['CoreFoundation', 'System', 'OpenGL', 'Cocoa', 'Cg'] - compileFlags = ['-x','objective-c++',] - files += [ 'cocoaGL.m', ] - conf.CheckPKG('OpenGL') if gfxenv['HAVE_OPENCL']: gfxenv['FRAMEWORKS'] += ['OpenCL'] diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.h b/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.h deleted file mode 100644 index cdd2a7065041..000000000000 --- a/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.h +++ /dev/null @@ -1,29 +0,0 @@ -#import -#import - -#ifdef __cplusplus -extern "C" -{ -#endif - - -void cocoaGLCreateApp(); - -NSWindow *cocoaGLCreateWindow(int w,int h); - -void cocoaGLSetTitle(NSWindow *win, const char *title); - -void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win); - -NSOpenGLContext* cocoaGLInit(int mode); - -void cocoaGLDelete(NSOpenGLContext *ctx); - -void cocoaGLDeleteWindow(NSWindow *window); - -void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window); - -#ifdef __cplusplus -} -#endif - diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.m b/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.m deleted file mode 100755 index 6a821635e2c2..000000000000 --- a/Source/Plugins/Plugin_VideoSoftware/Src/cocoaGL.m +++ /dev/null @@ -1,149 +0,0 @@ -#import "cocoaGL.h" - -NSWindow *cocoaGLCreateWindow(int w,int h) -{ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSWindow *window; - window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h) - styleMask:NSTitledWindowMask | NSResizableWindowMask - backing:NSBackingStoreBuffered - defer:FALSE]; - [window setReleasedWhenClosed: YES]; - - [window setTitle:@"Dolphin on OSX"]; - //[window makeKeyAndOrderFront: nil]; - - [pool release]; - - return window; -} - -void cocoaGLSetTitle(NSWindow *win, const char *title) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]]; - - [pool release]; -} - -void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - - int value = 0; - [ctx setValues:&value forParameter:NSOpenGLCPSwapInterval]; - - if (ctx) { - [ctx setView:[win contentView]]; - [ctx update]; - [ctx makeCurrentContext]; - } - else - [NSOpenGLContext clearCurrentContext]; - - [pool release]; -} - - - -NSOpenGLContext* cocoaGLInit(int mode) -{ - NSAutoreleasePool *pool; - - NSOpenGLPixelFormatAttribute attr[32]; - NSOpenGLPixelFormat *fmt; - NSOpenGLContext *context; - int i = 0; - - pool = [[NSAutoreleasePool alloc] init]; - - attr[i++] = NSOpenGLPFADepthSize; - attr[i++] = 24; - attr[i++] = NSOpenGLPFADoubleBuffer; - - attr[i++] = NSOpenGLPFASampleBuffers; - attr[i++] = mode; - attr[i++] = NSOpenGLPFASamples; - attr[i++] = 1; - - attr[i++] = NSOpenGLPFANoRecovery; -#ifdef GL_VERSION_1_3 - -#else -#ifdef GL_VERSION_1_2 -#warning "your card only supports ogl 1.2, dolphin will use software renderer" - //if opengl < 1.3 uncomment this twoo lines to use software renderer - attr[i++] = NSOpenGLPFARendererID; - attr[i++] = kCGLRendererGenericFloatID; -#endif -#endif - attr[i++] = NSOpenGLPFAScreenMask; - attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID()); - - attr[i] = 0; - - fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; - if (fmt == nil) { - printf("failed to create pixel format\n"); - [pool release]; - return NULL; - } - - context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; - - [fmt release]; - - if (context == nil) { - printf("failed to create context\n"); - [pool release]; - return NULL; - } - - [pool release]; - - return context; - -} - -void cocoaGLDelete(NSOpenGLContext *ctx) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - - [ctx clearDrawable]; - [ctx release]; - - [pool release]; - -} -void cocoaGLDeleteWindow(NSWindow *window) -{ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [window close]; - [pool release]; - - return; -} - -void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window) -{ - NSAutoreleasePool *pool; - - pool = [[NSAutoreleasePool alloc] init]; - [window makeKeyAndOrderFront: nil]; - - ctx = [NSOpenGLContext currentContext]; - if (ctx != nil) - [ctx flushBuffer]; - else - printf("bad cocoa gl ctx\n"); - - [pool release]; -}