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"
/*
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: .nds.gba support?
*/
@ -191,7 +190,6 @@ void CreateMenu(AppDelegate *delegate)
[loadSlot_item[i] setKeyEquivalentModifierMask:0];
}
//fixme changed save state item function names
/* To be implemented when saves.h provides
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 <OpenGL/OpenGL.h>
#import <OpenGL/gl.h>
//DeSmuME general includes
#define OBJ_C
@ -88,7 +89,8 @@ struct NDS_fw_config_data firmware;
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;
//Firmware setup
@ -99,13 +101,10 @@ struct NDS_fw_config_data firmware;
NDS_CreateDummyFirmware(&firmware);
//3D Init
bool gl_ready = false;
//Create the pixel format for our gpu
NSOpenGLPixelFormatAttribute attrs[] =
{
//NSOpenGLPFAAccelerated,
//NSOpenGLPFANoRecovery,
//NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 24,
@ -114,28 +113,67 @@ struct NDS_fw_config_data firmware;
0
};
pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
if(pixel_format == nil)
if((pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]) == nil)
{
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for GPU");
return self;
}
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for 3D rendering");
context = nil;
context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil];
if(context == nil)
} else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil)
{
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL context for GPU");
return self;
[pixel_format release];
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
[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())
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize OpenGL components");
if(gl_ready)
{
NDS_3D_SetDriver(GPU3D_OPENGL);
if(!gpu3D->NDS_3D_Init())
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize OpenGL components");
}
//Sound Init
if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0)
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize sound core");