Cocoa Port:
- Move OpenGL renderer code from the UI code to the emulation core interface code. - Clean up the OpenGL renderer init code, and lazy load the context init. - Fix bug where the wrong display would show when changing display modes after changing video filters. - Do some other random bug fixes.
This commit is contained in:
parent
2dc9077511
commit
2e6ab871c1
|
@ -1781,7 +1781,7 @@
|
||||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 0430;
|
LastUpgradeCheck = 0460;
|
||||||
ORGANIZATIONNAME = "DeSmuME Team";
|
ORGANIZATIONNAME = "DeSmuME Team";
|
||||||
};
|
};
|
||||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 4)" */;
|
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 4)" */;
|
||||||
|
@ -2575,7 +2575,6 @@
|
||||||
AB796D6F15CDCBA200C59155 /* Release */ = {
|
AB796D6F15CDCBA200C59155 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
LLVM_LTO = YES;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -2635,6 +2634,10 @@
|
||||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CLANG_X86_VECTOR_INSTRUCTIONS = sse3;
|
CLANG_X86_VECTOR_INSTRUCTIONS = sse3;
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
|
@ -2655,6 +2658,7 @@
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_SHADOW = YES;
|
GCC_WARN_SHADOW = YES;
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IBC_FLATTEN_NIBS = NO;
|
IBC_FLATTEN_NIBS = NO;
|
||||||
INFOPLIST_FILE = "Info (Debug).plist";
|
INFOPLIST_FILE = "Info (Debug).plist";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||||
|
@ -2674,6 +2678,10 @@
|
||||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CLANG_X86_VECTOR_INSTRUCTIONS = ssse3;
|
CLANG_X86_VECTOR_INSTRUCTIONS = ssse3;
|
||||||
"CLANG_X86_VECTOR_INSTRUCTIONS[arch=i386]" = sse3;
|
"CLANG_X86_VECTOR_INSTRUCTIONS[arch=i386]" = sse3;
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
|
@ -2694,6 +2702,7 @@
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_SHADOW = YES;
|
GCC_WARN_SHADOW = YES;
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
LD_NO_PIE = YES;
|
LD_NO_PIE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||||
|
|
|
@ -179,7 +179,7 @@ static CocoaDSMic *masterMic = nil;
|
||||||
|
|
||||||
- (UInt8) generateWhiteNoiseSample
|
- (UInt8) generateWhiteNoiseSample
|
||||||
{
|
{
|
||||||
return (UInt8)(rand() & 0xFF);
|
return (UInt8)(arc4random() & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) fillWithNullSamples
|
- (void) fillWithNullSamples
|
||||||
|
|
|
@ -250,6 +250,12 @@ bool GetGPULayerState(int gpuType, unsigned int i);
|
||||||
void SetGPUDisplayState(int gpuType, bool state);
|
void SetGPUDisplayState(int gpuType, bool state);
|
||||||
bool GetGPUDisplayState(int gpuType);
|
bool GetGPUDisplayState(int gpuType);
|
||||||
|
|
||||||
|
bool OSXOpenGLRendererInit();
|
||||||
|
bool OSXOpenGLRendererBegin();
|
||||||
|
void OSXOpenGLRendererEnd();
|
||||||
|
|
||||||
|
bool CreateOpenGLRenderer();
|
||||||
|
void DestroyOpenGLRenderer();
|
||||||
void RequestOpenGLRenderer_3_2(bool request_3_2);
|
void RequestOpenGLRenderer_3_2(bool request_3_2);
|
||||||
void SetOpenGLRendererFunctions(bool (*initFunction)(),
|
void SetOpenGLRendererFunctions(bool (*initFunction)(),
|
||||||
bool (*beginOGLFunction)(),
|
bool (*beginOGLFunction)(),
|
||||||
|
|
|
@ -1463,11 +1463,17 @@ GPU3DInterface *core3DList[] = {
|
||||||
[property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"];
|
[property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"];
|
||||||
[property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"];
|
[property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"];
|
||||||
|
|
||||||
|
SetOpenGLRendererFunctions(&OSXOpenGLRendererInit,
|
||||||
|
&OSXOpenGLRendererBegin,
|
||||||
|
&OSXOpenGLRendererEnd);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
|
DestroyOpenGLRenderer();
|
||||||
|
|
||||||
[vf release];
|
[vf release];
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
|
@ -1854,6 +1860,119 @@ bool GetGPUDisplayState(int gpuType)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
|
CGLPBufferObj OSXOpenGLRendererPBuffer = NULL;
|
||||||
|
|
||||||
|
bool OSXOpenGLRendererInit()
|
||||||
|
{
|
||||||
|
static bool isContextAlreadyCreated = false;
|
||||||
|
|
||||||
|
if (!isContextAlreadyCreated)
|
||||||
|
{
|
||||||
|
isContextAlreadyCreated = CreateOpenGLRenderer();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OSXOpenGLRendererBegin()
|
||||||
|
{
|
||||||
|
CGLSetCurrentContext(OSXOpenGLRendererContext);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OSXOpenGLRendererEnd()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CreateOpenGLRenderer()
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
bool useContext_3_2 = false;
|
||||||
|
CGLPixelFormatObj cglPixFormat = NULL;
|
||||||
|
CGLContextObj newContext = NULL;
|
||||||
|
CGLPBufferObj newPBuffer = NULL;
|
||||||
|
GLint virtualScreenCount = 0;
|
||||||
|
|
||||||
|
CGLPixelFormatAttribute attrs[] = {
|
||||||
|
kCGLPFAColorSize, (CGLPixelFormatAttribute)24,
|
||||||
|
kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8,
|
||||||
|
kCGLPFADepthSize, (CGLPixelFormatAttribute)24,
|
||||||
|
kCGLPFAStencilSize, (CGLPixelFormatAttribute)8,
|
||||||
|
kCGLPFAAccelerated,
|
||||||
|
(CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0,
|
||||||
|
(CGLPixelFormatAttribute)0
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef MAC_OS_X_VERSION_10_7
|
||||||
|
// If we can support a 3.2 Core Profile context, then request that in our
|
||||||
|
// pixel format attributes.
|
||||||
|
useContext_3_2 = [CocoaDSUtil OSVersionCheckMajor:10 minor:7 revision:0] ? true : false;
|
||||||
|
if (useContext_3_2)
|
||||||
|
{
|
||||||
|
attrs[9] = kCGLPFAOpenGLProfile;
|
||||||
|
attrs[10] = (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount);
|
||||||
|
if (cglPixFormat == NULL)
|
||||||
|
{
|
||||||
|
// Remove the HW rendering requirement and try again. Note that this will
|
||||||
|
// result in SW rendering, which will cause a substantial speed hit.
|
||||||
|
attrs[8] = (CGLPixelFormatAttribute)0;
|
||||||
|
CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount);
|
||||||
|
if (cglPixFormat == NULL)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLCreateContext(cglPixFormat, NULL, &newContext);
|
||||||
|
CGLReleasePixelFormat(cglPixFormat);
|
||||||
|
|
||||||
|
// Create a PBuffer for legacy contexts since the availability of FBOs
|
||||||
|
// is not guaranteed.
|
||||||
|
if (!useContext_3_2)
|
||||||
|
{
|
||||||
|
CGLCreatePBuffer(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, GL_TEXTURE_2D, GL_RGBA, 0, &newPBuffer);
|
||||||
|
|
||||||
|
if (newPBuffer == NULL)
|
||||||
|
{
|
||||||
|
CGLReleaseContext(newContext);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLint virtualScreenID = 0;
|
||||||
|
|
||||||
|
CGLGetVirtualScreen(newContext, &virtualScreenID);
|
||||||
|
CGLSetPBuffer(newContext, newPBuffer, 0, 0, virtualScreenID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestOpenGLRenderer_3_2(useContext_3_2);
|
||||||
|
OSXOpenGLRendererContext = newContext;
|
||||||
|
OSXOpenGLRendererPBuffer = newPBuffer;
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyOpenGLRenderer()
|
||||||
|
{
|
||||||
|
if (OSXOpenGLRendererContext == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLReleasePBuffer(OSXOpenGLRendererPBuffer);
|
||||||
|
CGLReleaseContext(OSXOpenGLRendererContext);
|
||||||
|
OSXOpenGLRendererContext = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void RequestOpenGLRenderer_3_2(bool request_3_2)
|
void RequestOpenGLRenderer_3_2(bool request_3_2)
|
||||||
{
|
{
|
||||||
#ifdef OGLRENDER_3_2_H
|
#ifdef OGLRENDER_3_2_H
|
||||||
|
|
|
@ -43,7 +43,7 @@ CoreAudioSound::CoreAudioSound(size_t bufferSamples, size_t sampleSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
error = OpenAComponent(comp, &_au);
|
error = OpenAComponent(comp, &_au);
|
||||||
if (comp == NULL)
|
if (error != noErr || comp == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,9 +122,7 @@
|
||||||
@interface OpenGLDisplayView : NSOpenGLView <DisplayViewDelegate>
|
@interface OpenGLDisplayView : NSOpenGLView <DisplayViewDelegate>
|
||||||
{
|
{
|
||||||
CGLContextObj cglDisplayContext;
|
CGLContextObj cglDisplayContext;
|
||||||
NSOpenGLContext *oglRendererContext;
|
|
||||||
|
|
||||||
BOOL useContext_3_2;
|
|
||||||
BOOL isVBOSupported;
|
BOOL isVBOSupported;
|
||||||
BOOL isShadersSupported;
|
BOOL isShadersSupported;
|
||||||
BOOL isVAOSupported;
|
BOOL isVAOSupported;
|
||||||
|
@ -160,9 +158,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setupOpenGL_Legacy;
|
- (void) setupOpenGL_Legacy;
|
||||||
- (void) setupOpenGL_3_2;
|
|
||||||
- (void) drawVideoFrame;
|
- (void) drawVideoFrame;
|
||||||
- (void) uploadDisplayTextures:(const GLvoid *)textureData width:(const GLsizei)texWidth height:(const GLsizei)texHeight;
|
- (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight;
|
||||||
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID;
|
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID;
|
||||||
- (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID;
|
- (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID;
|
||||||
|
|
||||||
|
@ -174,9 +171,6 @@ extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, const char *vertShaderProgram, GLuint *fragShaderID, const char *fragShaderProgram);
|
GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, const char *vertShaderProgram, GLuint *fragShaderID, const char *fragShaderProgram);
|
||||||
bool OSXOpenGLRendererInit();
|
|
||||||
bool OSXOpenGLRendererBegin();
|
|
||||||
void OSXOpenGLRendererEnd();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,8 +85,6 @@ enum OGLVertexAttributeID
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
CGLContextObj OSXOpenGLRendererContext = NULL;
|
|
||||||
|
|
||||||
@implementation DisplayViewDelegate
|
@implementation DisplayViewDelegate
|
||||||
|
|
||||||
@synthesize view;
|
@synthesize view;
|
||||||
|
@ -348,7 +346,7 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
if ( (oldMode == DS_DISPLAY_TYPE_MAIN && displayModeID == DS_DISPLAY_TYPE_TOUCH) ||
|
if ( (oldMode == DS_DISPLAY_TYPE_MAIN && displayModeID == DS_DISPLAY_TYPE_TOUCH) ||
|
||||||
(oldMode == DS_DISPLAY_TYPE_TOUCH && displayModeID == DS_DISPLAY_TYPE_MAIN) )
|
(oldMode == DS_DISPLAY_TYPE_TOUCH && displayModeID == DS_DISPLAY_TYPE_MAIN) )
|
||||||
{
|
{
|
||||||
[view setNeedsDisplay:YES];
|
[CocoaDSUtil messageSendOneWay:self.sendPortDisplay msgID:MESSAGE_REDRAW_VIEW];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1009,82 +1007,11 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
vtxIndexBuffer = new GLubyte[12];
|
vtxIndexBuffer = new GLubyte[12];
|
||||||
vtxBufferOffset = 0;
|
vtxBufferOffset = 0;
|
||||||
|
|
||||||
// Create a new context for the OpenGL-based emulated 3D renderer
|
|
||||||
#ifdef MAC_OS_X_VERSION_10_7
|
|
||||||
NSOpenGLPixelFormatAttribute attrs[] = {
|
|
||||||
NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24,
|
|
||||||
NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8,
|
|
||||||
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24,
|
|
||||||
NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)8,
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
|
|
||||||
(NSOpenGLPixelFormatAttribute)0
|
|
||||||
};
|
|
||||||
|
|
||||||
useContext_3_2 = [CocoaDSUtil OSVersionCheckMajor:10 minor:7 revision:0] ? YES : NO;
|
|
||||||
#else
|
|
||||||
NSOpenGLPixelFormatAttribute attrs[] =
|
|
||||||
{
|
|
||||||
NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24,
|
|
||||||
NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8,
|
|
||||||
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24,
|
|
||||||
NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)8,
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
(NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0,
|
|
||||||
(NSOpenGLPixelFormatAttribute)0
|
|
||||||
};
|
|
||||||
|
|
||||||
useContext_3_2 = NO;
|
|
||||||
#endif
|
|
||||||
// If we're not using a 3.2 Core Profile context, then remove that
|
|
||||||
// requirement from the pixel format.
|
|
||||||
if (!useContext_3_2)
|
|
||||||
{
|
|
||||||
attrs[9] = (NSOpenGLPixelFormatAttribute)0;
|
|
||||||
attrs[10] = (NSOpenGLPixelFormatAttribute)0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSOpenGLPixelFormat *tempPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
|
||||||
if (tempPixelFormat == nil)
|
|
||||||
{
|
|
||||||
// Remove the HW rendering requirement and try again. Note that this will
|
|
||||||
// result in SW rendering, which will cause a substantial speed hit.
|
|
||||||
attrs[8] = (NSOpenGLPixelFormatAttribute)0;
|
|
||||||
tempPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSOpenGLContext *newOGLRendererContext = [[NSOpenGLContext alloc] initWithFormat:tempPixelFormat shareContext:nil];
|
|
||||||
[tempPixelFormat release];
|
|
||||||
|
|
||||||
if (!useContext_3_2)
|
|
||||||
{
|
|
||||||
NSOpenGLPixelBuffer *tempPixelBuffer = [[NSOpenGLPixelBuffer alloc]
|
|
||||||
initWithTextureTarget:GL_TEXTURE_2D
|
|
||||||
textureInternalFormat:GL_BGRA
|
|
||||||
textureMaxMipMapLevel:0
|
|
||||||
pixelsWide:GPU_DISPLAY_WIDTH
|
|
||||||
pixelsHigh:GPU_DISPLAY_HEIGHT*2];
|
|
||||||
|
|
||||||
[newOGLRendererContext setPixelBuffer:tempPixelBuffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:[[self openGLContext] currentVirtualScreen]];
|
|
||||||
[tempPixelBuffer release];
|
|
||||||
}
|
|
||||||
|
|
||||||
oglRendererContext = newOGLRendererContext;
|
|
||||||
OSXOpenGLRendererContext = (CGLContextObj)[oglRendererContext CGLContextObj];
|
|
||||||
|
|
||||||
RequestOpenGLRenderer_3_2(useContext_3_2);
|
|
||||||
SetOpenGLRendererFunctions(&OSXOpenGLRendererInit,
|
|
||||||
&OSXOpenGLRendererBegin,
|
|
||||||
&OSXOpenGLRendererEnd);
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
[oglRendererContext release];
|
|
||||||
OSXOpenGLRendererContext = NULL;
|
|
||||||
|
|
||||||
CGLContextObj prevContext = CGLGetCurrentContext();
|
CGLContextObj prevContext = CGLGetCurrentContext();
|
||||||
CGLSetCurrentContext(cglDisplayContext);
|
CGLSetCurrentContext(cglDisplayContext);
|
||||||
|
|
||||||
|
@ -1182,7 +1109,6 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
{
|
{
|
||||||
// Check the OpenGL capabilities for this renderer
|
// Check the OpenGL capabilities for this renderer
|
||||||
const GLubyte *glExtString = glGetString(GL_EXTENSIONS);
|
const GLubyte *glExtString = glGetString(GL_EXTENSIONS);
|
||||||
BOOL isPBOSupported = gluCheckExtension((const GLubyte *)"GL_ARB_pixel_buffer_object", glExtString);
|
|
||||||
|
|
||||||
// Set up textures
|
// Set up textures
|
||||||
glGenTextures(1, &displayTexID);
|
glGenTextures(1, &displayTexID);
|
||||||
|
@ -1285,22 +1211,22 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
CGLFlushDrawable(cglDisplayContext);
|
CGLFlushDrawable(cglDisplayContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) uploadDisplayTextures:(const GLvoid *)textureData width:(const GLsizei)texWidth height:(const GLsizei)texHeight
|
- (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight
|
||||||
{
|
{
|
||||||
if (textureData == NULL)
|
if (textureData == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const GLint lineOffset = (displayModeID == DS_DISPLAY_TYPE_TOUCH) ? texHeight : 0;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, displayTexID);
|
glBindTexture(GL_TEXTURE_2D, displayTexID);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texWidth, texHeight, GL_RGBA, glTexPixelFormat, textureData);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, lineOffset, texWidth, texHeight, GL_RGBA, glTexPixelFormat, textureData);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID
|
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID
|
||||||
{
|
{
|
||||||
GLubyte *elementPointer = NULL;
|
|
||||||
|
|
||||||
// Assign vertex attributes based on which OpenGL features we have.
|
// Assign vertex attributes based on which OpenGL features we have.
|
||||||
if (isVAOSupported)
|
if (isVAOSupported)
|
||||||
{
|
{
|
||||||
|
@ -1322,7 +1248,6 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
{
|
{
|
||||||
glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, vtxBuffer);
|
glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, vtxBuffer);
|
||||||
glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, texCoordBuffer);
|
glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, texCoordBuffer);
|
||||||
elementPointer = vtxIndexBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnableVertexAttribArray(OGLVertexAttributeID_Position);
|
glEnableVertexAttribArray(OGLVertexAttributeID_Position);
|
||||||
|
@ -1342,7 +1267,6 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
{
|
{
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, texCoordBuffer);
|
glTexCoordPointer(2, GL_FLOAT, 0, texCoordBuffer);
|
||||||
glVertexPointer(2, GL_INT, 0, vtxBuffer);
|
glVertexPointer(2, GL_INT, 0, vtxBuffer);
|
||||||
elementPointer = vtxIndexBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
@ -1364,10 +1288,12 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLsizei vtxElementCount = 6;
|
const GLsizei vtxElementCount = (displayModeID == DS_DISPLAY_TYPE_COMBO) ? 12 : 6;
|
||||||
if (displayModeID == DS_DISPLAY_TYPE_COMBO)
|
GLubyte *elementPointer = isVBOSupported ? NULL : vtxIndexBuffer;
|
||||||
|
|
||||||
|
if (displayModeID == DS_DISPLAY_TYPE_TOUCH)
|
||||||
{
|
{
|
||||||
vtxElementCount = 12;
|
elementPointer += vtxElementCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
@ -1568,7 +1494,7 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
CGLLockContext(cglDisplayContext);
|
CGLLockContext(cglDisplayContext);
|
||||||
|
|
||||||
CGLSetCurrentContext(cglDisplayContext);
|
CGLSetCurrentContext(cglDisplayContext);
|
||||||
[self uploadDisplayTextures:videoFrameData width:frameWidth height:frameHeight];
|
[self uploadDisplayTextures:videoFrameData displayMode:displayModeID width:frameWidth height:frameHeight];
|
||||||
[self renderDisplayUsingDisplayMode:displayModeID];
|
[self renderDisplayUsingDisplayMode:displayModeID];
|
||||||
[self drawVideoFrame];
|
[self drawVideoFrame];
|
||||||
|
|
||||||
|
@ -1738,6 +1664,11 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([dispViewDelegate displayMode] != DS_DISPLAY_TYPE_COMBO)
|
||||||
|
{
|
||||||
|
videoFilterDestSize.height = (uint32_t)videoFilterDestSize.height * 2;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert textures to Power-of-Two to support older GPUs
|
// Convert textures to Power-of-Two to support older GPUs
|
||||||
// Example: Radeon X1600M on the 2006 MacBook Pro
|
// Example: Radeon X1600M on the 2006 MacBook Pro
|
||||||
uint32_t potW = GetNearestPositivePOT((uint32_t)videoFilterDestSize.width);
|
uint32_t potW = GetNearestPositivePOT((uint32_t)videoFilterDestSize.width);
|
||||||
|
@ -1756,31 +1687,19 @@ CGLContextObj OSXOpenGLRendererContext = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLfloat s = (GLfloat)(videoFilterDestSize.width / potW);
|
const GLfloat s = (GLfloat)videoFilterDestSize.width / (GLfloat)potW;
|
||||||
GLfloat t = (GLfloat)(videoFilterDestSize.height / potH);
|
const GLfloat t = (GLfloat)videoFilterDestSize.height / (GLfloat)potH;
|
||||||
|
|
||||||
// Set up texture coordinates
|
// Set up texture coordinates
|
||||||
if ([dispViewDelegate displayMode] == DS_DISPLAY_TYPE_COMBO)
|
texCoordBuffer[0] = 0.0f; texCoordBuffer[1] = 0.0f;
|
||||||
{
|
texCoordBuffer[2] = s; texCoordBuffer[3] = 0.0f;
|
||||||
texCoordBuffer[0] = 0.0f; texCoordBuffer[1] = 0.0f;
|
texCoordBuffer[4] = s; texCoordBuffer[5] = t/2.0f;
|
||||||
texCoordBuffer[2] = s; texCoordBuffer[3] = 0.0f;
|
texCoordBuffer[6] = 0.0f; texCoordBuffer[7] = t/2.0f;
|
||||||
texCoordBuffer[4] = s; texCoordBuffer[5] = t/2.0f;
|
|
||||||
texCoordBuffer[6] = 0.0f; texCoordBuffer[7] = t/2.0f;
|
texCoordBuffer[8] = 0.0f; texCoordBuffer[9] = t/2.0f;
|
||||||
|
texCoordBuffer[10] = s; texCoordBuffer[11] = t/2.0f;
|
||||||
texCoordBuffer[8] = 0.0f; texCoordBuffer[9] = t/2.0f;
|
texCoordBuffer[12] = s; texCoordBuffer[13] = t;
|
||||||
texCoordBuffer[10] = s; texCoordBuffer[11] = t/2.0f;
|
texCoordBuffer[14] = 0.0f; texCoordBuffer[15] = t;
|
||||||
texCoordBuffer[12] = s; texCoordBuffer[13] = t;
|
|
||||||
texCoordBuffer[14] = 0.0f; texCoordBuffer[15] = t;
|
|
||||||
}
|
|
||||||
else // displayMode == DS_DISPLAY_TYPE_MAIN || displayMode == DS_DISPLAY_TYPE_TOUCH
|
|
||||||
{
|
|
||||||
texCoordBuffer[0] = 0.0f; texCoordBuffer[1] = 0.0f;
|
|
||||||
texCoordBuffer[2] = s; texCoordBuffer[3] = 0.0f;
|
|
||||||
texCoordBuffer[4] = s; texCoordBuffer[5] = t;
|
|
||||||
texCoordBuffer[6] = 0.0f; texCoordBuffer[7] = t;
|
|
||||||
|
|
||||||
memcpy(texCoordBuffer + (1 * 8), texCoordBuffer + (0 * 8), sizeof(GLfloat) * (1 * 8));
|
|
||||||
}
|
|
||||||
|
|
||||||
CGLLockContext(cglDisplayContext);
|
CGLLockContext(cglDisplayContext);
|
||||||
|
|
||||||
|
@ -1870,20 +1789,3 @@ GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, const char *vertShad
|
||||||
|
|
||||||
return shaderStatus;
|
return shaderStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OSXOpenGLRendererInit()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXOpenGLRendererBegin()
|
|
||||||
{
|
|
||||||
CGLSetCurrentContext(OSXOpenGLRendererContext);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXOpenGLRendererEnd()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue