now supports hardware accelerated offscreen opengl using pixel buffers if available
This commit is contained in:
parent
8dc26100ec
commit
bc128ddd25
|
@ -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...
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue