more osx64 work

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@963 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
tmator 2008-10-25 17:47:46 +00:00
parent d3da9a67d7
commit 8f3aa9e67b
11 changed files with 300 additions and 29 deletions

View File

@ -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?
{

View File

@ -34,8 +34,11 @@
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
#define I_NEED_OS2_H // HAXXOR
//#include <GL/glew.h>
#if !defined(OSX64)
#include <GL/glxew.h>
#else
#include <GL/glew.h>
#endif
#if defined(__APPLE__)
#include <OpenGL/gl.h>
@ -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;

View File

@ -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 <wx/wx.h>
#include <wx/filepicker.h>
#include <wx/notebook.h>
#include <wx/dialog.h>
#include <wx/aboutdlg.h>
#endif
#include "Globals.h"

View File

@ -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<u16> 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, "");
// ================

View File

@ -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;

View File

@ -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
)

View File

@ -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;

View File

@ -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)

View File

@ -0,0 +1,27 @@
#import <Cocoa/Cocoa.h>
#import <OpenGL/CGLRenderers.h>
#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

View File

@ -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];
}

View File

@ -21,11 +21,13 @@
#include "OS/Win32.h"
#endif
#if defined(__APPLE__)
#if defined(__APPLE__) && !defined(OSX64)
#include <SDL.h>
#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;