diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 2923f37ae2..eaae5ef655 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -63,6 +63,8 @@ void OpenGL_SwapBuffers() { #if USE_SDL SDL_GL_SwapBuffers(); +#elif defined(OSX64) + #elif defined(_WIN32) SwapBuffers(hDC); #else // GLX @@ -74,6 +76,8 @@ void OpenGL_SetWindowText(const char *text) { #if USE_SDL SDL_WM_SetCaption(text, NULL); +#elif defined(OSX64) + #elif defined(_WIN32) SetWindowText(EmuWindow::GetWnd(), text); #else // GLX @@ -85,13 +89,19 @@ void OpenGL_SetWindowText(const char *text) #endif } +#if defined(OSX64) +unsigned int Callback_PeekMessages() +#else BOOL Callback_PeekMessages() +#endif { #if USE_SDL // TODO: There is no documentation of this function and the calling code // ignores the return value, so I have no idea what would be the // proper value to return. return FALSE; +#elif defined(OSX64) + return FALSE; #elif defined(_WIN32) //TODO: peekmessage MSG msg; @@ -199,6 +209,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight //setup ogl to use double buffering SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); +#elif defined(OSX64) #elif defined(_WIN32) // create the window @@ -479,6 +490,8 @@ bool OpenGL_MakeCurrent() SDL_Quit(); return false; } +#elif defined(OSX64) + #elif defined(_WIN32) if (!wglMakeCurrent(hDC,hRC)) { MessageBox(NULL,"(5) Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); @@ -515,6 +528,8 @@ void OpenGL_Update() if (!surface) return; nBackbufferWidth = surface->w; nBackbufferHeight = surface->h; +#elif defined(OSX64) + RECT rcWindow; #elif defined(_WIN32) if (!EmuWindow::GetParentWnd()) return; @@ -650,6 +665,8 @@ void OpenGL_Shutdown() { #if USE_SDL SDL_Quit(); +#elif defined(OSX64) + #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 c5522dbe59..2c1a84dea1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -34,8 +34,11 @@ #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) #define I_NEED_OS2_H // HAXXOR //#include +#if !defined(OSX64) #include - +#else +#include +#endif #if defined(__APPLE__) #include @@ -97,11 +100,15 @@ typedef struct { Display *dpy; int screen; Window win; +#if defined(OSX64) + +#else //linux GLXContext ctx; XSetWindowAttributes attr; Bool fs; Bool doubleBuffered; XF86VidModeModeInfo deskMode; +#endif int x, y; unsigned int width, height; unsigned int depth; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp index 5c456addf4..b9e2e9bba7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp @@ -15,11 +15,13 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ +#if !defined(OSX64) #include #include #include #include #include +#endif #include "Globals.h" diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Logging/Logging.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Logging/Logging.cpp index 9a4b769345..5e847239a0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Logging/Logging.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Logging/Logging.cpp @@ -33,9 +33,11 @@ #endif +#if !defined(OSX64) #include "../Debugger/Debugger.h" // for the CDebugger class #include "../Debugger/PBView.h" #include "Console.h" // open and close console, clear console window +#endif #include "../Logging/Logging.h" // for global logging values @@ -71,8 +73,9 @@ std::vector viupd(15); // the length of the update frequency bar // --------------------------------------------------------------------------------------- // Classes // ------------- +#if !defined(OSX64) extern CDebugger* m_frame; - +#endif // ======================================================================================= @@ -143,7 +146,9 @@ void Logging(int a) { std::string sfbuff; sfbuff = sfbuff + writeMessage(ii, 0); +#if !defined(OSX64) aprintf(ii, (char *)sfbuff.c_str()); +#endif } // -------------- @@ -254,7 +259,9 @@ void Logging(int a) // ======================================================================================= // Print // ---------------- +#if !defined(OSX64) ClearScreen(); +#endif __Log("%s", sbuff.c_str()); sbuff.clear(); strcpy(buffer, ""); // ================ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 5095f3dba7..37a8b8d579 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -41,7 +41,9 @@ #include "PixelShaderManager.h" #include "VertexLoader.h" #include "XFB.h" +#if !defined(OSX64) #include "Debugger/Debugger.h" // for the CDebugger class +#endif #include "Logging/Logging.h" // for Logging() #ifdef _WIN32 @@ -59,7 +61,9 @@ struct MESSAGE CGcontext g_cgcontext; CGprofile g_cgvProf, g_cgfProf; +#if !defined(OSX64) extern CDebugger* m_frame; // the debugging class +#endif static int g_MaxTexWidth = 0, g_MaxTexHeight = 0; static RasterFont* s_pfont = NULL; @@ -743,11 +747,12 @@ void Renderer::SwapBuffers() } // Write logging data to debugger +#if !defined(OSX64) if(m_frame) { Logging(0); } - +#endif if (g_Config.bOverlayStats) { char st[2048]; char *p = st; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript index fab0500515..5fecb68dbe 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SConscript +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -26,11 +26,8 @@ files = [ 'VertexLoaderManager.cpp', 'VertexShaderManager.cpp', 'XFB.cpp', - 'GUI/ConfigDlg.cpp', 'Logging/Console.cpp', 'Logging/Logging.cpp', - 'Debugger/Debugger.cpp', - 'Debugger/PBView.cpp', ] compileFlags = [ '-fPIC', @@ -43,6 +40,26 @@ libs = [ gfxenv = env.Clone() +if not gfxenv['osx64']: + files += [ + 'GUI/ConfigDlg.cpp', + 'Debugger/Debugger.cpp', + 'Debugger/PBView.cpp', + ] + +if gfxenv['osx64']: + files += [ 'cocoaGL.m' ] + compileFlags += [ + '-x', + 'objective-c++', + ] + linkFlags += [ + '-framework', + 'cocoa', + '-arch', + 'x86_64' + ] + if sys.platform == 'darwin': platform = 'mac' # SDL is currently the only way to get video on Mac OS X. @@ -87,9 +104,8 @@ gfxenv.Append( LINKFLAGS = linkFlags, ) -if not env['osx64']: - gfxenv.SharedLibrary( +gfxenv.SharedLibrary( '../../../../Binary/%s/Plugins/zeroogl.so' % platform, files, - LIBS = gfxenv['LIBS'] + libs + LIBS = libs ) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h index 7e31c4ab5c..87dd99b8f2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h @@ -25,25 +25,25 @@ class VertexLoaderUID { - u32 id[5]; + u32 vid[5]; public: VertexLoaderUID() {} void InitFromCurrentState(int vtx_attr_group) { - id[0] = g_VtxDesc.Hex & 0xFFFFFFFF; - id[1] = g_VtxDesc.Hex >> 32; - id[2] = g_VtxAttr[vtx_attr_group].g0.Hex & ~VAT_0_FRACBITS; - id[3] = g_VtxAttr[vtx_attr_group].g1.Hex & ~VAT_1_FRACBITS; - id[4] = g_VtxAttr[vtx_attr_group].g2.Hex & ~VAT_2_FRACBITS; + vid[0] = g_VtxDesc.Hex & 0xFFFFFFFF; + vid[1] = g_VtxDesc.Hex >> 32; + vid[2] = g_VtxAttr[vtx_attr_group].g0.Hex & ~VAT_0_FRACBITS; + vid[3] = g_VtxAttr[vtx_attr_group].g1.Hex & ~VAT_1_FRACBITS; + vid[4] = g_VtxAttr[vtx_attr_group].g2.Hex & ~VAT_2_FRACBITS; } bool operator < (const VertexLoaderUID &other) const { - if (id[0] < other.id[0]) + if (vid[0] < other.vid[0]) return true; - else if (id[0] > other.id[0]) + else if (vid[0] > other.vid[0]) return false; for (int i = 1; i < 5; ++i) { - if (id[i] < other.id[i]) + if (vid[i] < other.vid[i]) return true; - else if (id[i] > other.id[i]) + else if (vid[i] > other.vid[i]) return false; } return false; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp index 0331b6fb8a..7bea2d5383 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderManager.cpp @@ -843,29 +843,29 @@ float* VertexShaderMngr::GetPosNormalMat() // Mash together all the inputs that contribute to the code of a generated vertex shader into // a unique identifier, basically containing all the bits. Yup, it's a lot .... -void VertexShaderMngr::GetVertexShaderId(VERTEXSHADERUID& id, u32 components) +void VertexShaderMngr::GetVertexShaderId(VERTEXSHADERUID& vid, u32 components) { u32 zbufrender = (bpmem.ztex2.op == ZTEXTURE_ADD) || Renderer::GetZBufferTarget() != 0; - id.values[0] = components | + vid.values[0] = components | (xfregs.numTexGens << 23) | (xfregs.nNumChans << 27) | ((u32)xfregs.bEnableDualTexTransform << 29) | (zbufrender << 30); for (int i = 0; i < 2; ++i) { - id.values[1+i] = xfregs.colChans[i].color.enablelighting ? + vid.values[1+i] = xfregs.colChans[i].color.enablelighting ? (u32)xfregs.colChans[i].color.hex : (u32)xfregs.colChans[i].color.matsource; - id.values[1+i] |= (xfregs.colChans[i].alpha.enablelighting ? + vid.values[1+i] |= (xfregs.colChans[i].alpha.enablelighting ? (u32)xfregs.colChans[i].alpha.hex : (u32)xfregs.colChans[i].alpha.matsource) << 15; } // fog - id.values[1] |= (((u32)bpmem.fog.c_proj_fsel.fsel & 3) << 30); - id.values[2] |= (((u32)bpmem.fog.c_proj_fsel.fsel >> 2) << 30); + vid.values[1] |= (((u32)bpmem.fog.c_proj_fsel.fsel & 3) << 30); + vid.values[2] |= (((u32)bpmem.fog.c_proj_fsel.fsel >> 2) << 30); - u32* pcurvalue = &id.values[3]; + u32* pcurvalue = &vid.values[3]; for (int i = 0; i < xfregs.numTexGens; ++i) { TexMtxInfo tinfo = xfregs.texcoords[i].texmtxinfo; if (tinfo.texgentype != XF_TEXGEN_EMBOSS_MAP) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h new file mode 100644 index 0000000000..630cdf3c2d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.h @@ -0,0 +1,27 @@ +#import +#import + +#ifdef __cplusplus +extern "C" +{ +#endif + + +void cocoaGLCreateApp(); + +NSWindow *cocoaGLCreateWindow(int w,int h); + +void cocoaGLSetTitle(); + +void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win); + +NSOpenGLContext* cocoaGLInit(int mode); + +void cocoaGLDelete(NSOpenGLContext *ctx); + +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 new file mode 100755 index 0000000000..57047840eb --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/cocoaGL.m @@ -0,0 +1,179 @@ +#import "cocoaGL.h" + +@implementation NSApplication(i) +- (void)appRunning +{ + _running = 1; +} +@end + +@interface cocoaAppDelegate : NSObject +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +@end + +@implementation cocoaAppDelegate : NSObject +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + return NSTerminateCancel; +} +@end + + +void cocoaGLCreateApp() +{ + ProcessSerialNumber psn; + NSAutoreleasePool *pool; + + if (!GetCurrentProcess(&psn)) { + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + SetFrontProcess(&psn); + } + + pool = [[NSAutoreleasePool alloc] init]; + + if (NSApp == nil) { + [NSApplication sharedApplication]; + //TODO : Create menu + [NSApp finishLaunching]; + } + + if ([NSApp delegate] == nil) { + [NSApp setDelegate:[[cocoaAppDelegate alloc] init]]; + } + + [NSApp appRunning]; + + [pool release]; + +} + +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 setTitle:@"Dolphin on OSX"]; + [window makeKeyAndOrderFront: nil]; + + [pool release]; + + return window; +} + +void cocoaGLSetTitle() +{ + //todo + +} + +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; + + //if opengl < 1.3 uncomment this twoo lines to use software renderer + //attr[i++] = NSOpenGLPFARendererID; + //attr[i++] = kCGLRendererGenericFloatID; + + 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 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_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 894d269513..cdae0d0245 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -21,11 +21,13 @@ #include "OS/Win32.h" #endif -#if defined(__APPLE__) +#if defined(__APPLE__) && !defined(OSX64) #include #endif +#if !defined(OSX64) #include "GUI/ConfigDlg.h" +#endif #include "Config.h" #include "LookUpTables.h" @@ -45,14 +47,19 @@ #include "XFBConvert.h" #include "VideoState.h" +#if !defined(OSX64) #include "Debugger/Debugger.h" // for the CDebugger class - +#endif SVideoInitialize g_VideoInitialize; #define VERSION_STRING "0.1" // Create debugging window. We can't use Show() here as usual because then DLL_PROCESS_DETACH will // be called immediately. And if we use ShowModal() we block the main video window from appearing. // So I've made a separate function called DoDllDebugger() that creates the window. +#if defined(OSX64) +void DllDebugger(HWND _hParent) { } +void DoDllDebugger() { } +#else CDebugger* m_frame; void DllDebugger(HWND _hParent) { @@ -71,6 +78,7 @@ void DoDllDebugger() m_frame = new CDebugger(NULL); m_frame->Show(); } +#endif void GetDllInfo (PLUGIN_INFO* _PluginInfo) { @@ -289,8 +297,11 @@ bool ScreenShot(TCHAR *File) } return false; } - +#if defined(OSX64) +unsigned int Video_Screenshot(TCHAR* _szFilename) +#else BOOL Video_Screenshot(TCHAR* _szFilename) +#endif { if (ScreenShot(_szFilename)) return TRUE;