now supports hardware accelerated offscreen opengl using pixel buffers if available

This commit is contained in:
gecko_reverse 2008-04-27 03:13:53 +00:00
parent 8dc26100ec
commit bc128ddd25
2 changed files with 61 additions and 25 deletions

View File

@ -27,7 +27,6 @@ Based on work by yopyop and the DeSmuME team!
#import "preferences.h" #import "preferences.h"
/* /*
FIXME: Hardware acceleration for openglrender.c ??
FIXME: When cross-platform (core) components end emulation due to error - pause should be called (set the menu checkmark) FIXME: When cross-platform (core) components end emulation due to error - pause should be called (set the menu checkmark)
FIXME: .nds.gba support? FIXME: .nds.gba support?
*/ */
@ -191,7 +190,6 @@ void CreateMenu(AppDelegate *delegate)
[loadSlot_item[i] setKeyEquivalentModifierMask:0]; [loadSlot_item[i] setKeyEquivalentModifierMask:0];
} }
//fixme changed save state item function names
/* To be implemented when saves.h provides /* To be implemented when saves.h provides
a way to get the time of a save that's not string/human formatted... a way to get the time of a save that's not string/human formatted...

View File

@ -19,6 +19,7 @@
#import "nds_control.h" #import "nds_control.h"
#import <OpenGL/OpenGL.h> #import <OpenGL/OpenGL.h>
#import <OpenGL/gl.h>
//DeSmuME general includes //DeSmuME general includes
#define OBJ_C #define OBJ_C
@ -88,7 +89,8 @@ struct NDS_fw_config_data firmware;
NSLog(@"No flash file given\n"); NSLog(@"No flash file given\n");
} }
//check if we can sen messages on other threads, which we will use for video update //check if we can send messages on other threads, which we will use for video update
//this is for compatibility for tiger and earlier
timer_based = ([NSObject instancesRespondToSelector:@selector(performSelector:onThread:withObject:waitUntilDone:)]==NO)?true:false; timer_based = ([NSObject instancesRespondToSelector:@selector(performSelector:onThread:withObject:waitUntilDone:)]==NO)?true:false;
//Firmware setup //Firmware setup
@ -99,13 +101,10 @@ struct NDS_fw_config_data firmware;
NDS_CreateDummyFirmware(&firmware); NDS_CreateDummyFirmware(&firmware);
//3D Init //3D Init
bool gl_ready = false;
//Create the pixel format for our gpu
NSOpenGLPixelFormatAttribute attrs[] = NSOpenGLPixelFormatAttribute attrs[] =
{ {
//NSOpenGLPFAAccelerated,
//NSOpenGLPFANoRecovery,
//NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize, 24, NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8, NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 24, NSOpenGLPFADepthSize, 24,
@ -114,28 +113,67 @@ struct NDS_fw_config_data firmware;
0 0
}; };
pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; if((pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]) == nil)
if(pixel_format == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for GPU"); messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for 3D rendering");
return self; context = nil;
}
context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]; } else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil)
if(context == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL context for GPU"); [pixel_format release];
return self; pixel_format = nil;
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL context for 3D rendering");
} else
{
[context makeCurrentContext];
//check extensions
BOOL supports_pixel_buffers = NO;
const char *extension_list = (const char*)glGetString(GL_EXTENSIONS);
if(extension_list)
{
NSArray *extensions = [[NSString stringWithCString:extension_list encoding:NSASCIIStringEncoding] componentsSeparatedByString:@" "];
supports_pixel_buffers = [extensions containsObject:@"GL_APPLE_pixel_buffer"];
}
//attempt to use a pixel-buffer for hopefully hardware accelerated offscreen drawing
if(supports_pixel_buffers == YES)
{
NSOpenGLPixelBuffer *pixel_buffer = [[NSOpenGLPixelBuffer alloc]
initWithTextureTarget:GL_TEXTURE_2D
textureInternalFormat:GL_RGBA
textureMaxMipMapLevel:0
pixelsWide:DS_SCREEN_WIDTH
pixelsHigh:DS_SCREEN_HEIGHT*2];
if(pixel_buffer == nil)
{
GLenum error = glGetError();
messageDialog(NSLocalizedString(@"Error", nil),
[NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error]);
} else
{
[context setPixelBuffer:pixel_buffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0];
[pixel_buffer release];
gl_ready = true;
}
}
//if pixel buffers didn't work out, try simple offscreen renderings (probably software accelerated)
if(!gl_ready)
{
[context setOffScreen:(void*)&gpu_buff width:DS_SCREEN_WIDTH height:DS_SCREEN_HEIGHT rowbytes:DS_SCREEN_WIDTH*5];
gl_ready = true;
}
} }
//offscreen rendering if(gl_ready)
[context setOffScreen:(void*)&gpu_buff width:DS_SCREEN_WIDTH height:DS_SCREEN_HEIGHT rowbytes:DS_SCREEN_WIDTH * 5]; {
[context makeCurrentContext]; NDS_3D_SetDriver(GPU3D_OPENGL);
if(!gpu3D->NDS_3D_Init())
NDS_3D_SetDriver(GPU3D_OPENGL); messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize OpenGL components");
if(!gpu3D->NDS_3D_Init()) }
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize OpenGL components");
//Sound Init //Sound Init
if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0) if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0)
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize sound core"); messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize sound core");