{\r
namespace video\r
{\r
- \r
+\r
struct SEAGLManagerDataStorage\r
{\r
SEAGLManagerDataStorage() : Layer(0), Context(0)\r
#ifdef _DEBUG\r
setDebugName("CEAGLManager");\r
#endif\r
- \r
+\r
DataStorage = new SEAGLManagerDataStorage();\r
}\r
\r
destroyContext();\r
destroySurface();\r
terminate();\r
- \r
+\r
delete static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
}\r
\r
\r
Params = params;\r
Data = data;\r
- \r
+\r
UIView* view = (__bridge UIView*)data.OpenGLiOS.View;\r
\r
if (view == nil || ![[view layer] isKindOfClass:[CAEAGLLayer class]])\r
os::Printer::log("Could not get EAGL display.");\r
return false;\r
}\r
- \r
+\r
dataStorage->Layer = (CAEAGLLayer*)[view layer];\r
\r
return true;\r
void CEAGLManager::terminate()\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
- \r
+\r
[EAGLContext setCurrentContext:0];\r
- \r
+\r
destroySurface();\r
- \r
+\r
if (dataStorage->Layer != nil)\r
dataStorage->Layer = 0;\r
}\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
CAEAGLLayer* layer = dataStorage->Layer;\r
- \r
+\r
if (layer == nil)\r
return false;\r
- \r
+\r
if (Configured)\r
return true;\r
- \r
+\r
NSDictionary* attribs = [NSDictionary dictionaryWithObjectsAndKeys:\r
[NSNumber numberWithBool:NO],\r
kEAGLDrawablePropertyRetainedBacking,\r
\r
[layer setOpaque:(Params.WithAlphaChannel) ? YES : NO];\r
[layer setDrawableProperties:attribs];\r
- \r
+\r
Configured = true;\r
\r
return true;\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
CAEAGLLayer* layer = dataStorage->Layer;\r
- \r
+\r
if (layer == nil)\r
return;\r
- \r
+\r
[layer setOpaque:NO];\r
[layer setDrawableProperties:nil];\r
- \r
+\r
Configured = false;\r
}\r
\r
os::Printer::log("Could not create EAGL context.", ELL_ERROR);\r
return false;\r
}\r
- \r
+\r
Data.OpenGLiOS.Context = (__bridge void*)dataStorage->Context;\r
\r
os::Printer::log("EAGL context created with OpenGLESVersion: ", core::stringc(static_cast<int>(OpenGLESVersion)), ELL_DEBUG);\r
void CEAGLManager::destroyContext()\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
- \r
+\r
[dataStorage->Context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil];\r
\r
if (FrameBuffer.BufferID != 0)\r
glDeleteFramebuffersOES(1, &FrameBuffer.BufferID);\r
FrameBuffer.BufferID = 0;\r
}\r
- \r
+\r
if (FrameBuffer.ColorBuffer != 0)\r
{\r
glDeleteRenderbuffersOES(1, &FrameBuffer.ColorBuffer);\r
FrameBuffer.ColorBuffer = 0;\r
}\r
- \r
+\r
if (FrameBuffer.DepthBuffer != 0)\r
{\r
glDeleteRenderbuffersOES(1, &FrameBuffer.DepthBuffer);\r
}\r
\r
[EAGLContext setCurrentContext:0];\r
- \r
+\r
if (dataStorage->Context != nil)\r
dataStorage->Context = 0;\r
- \r
+\r
Data.OpenGLiOS.Context = 0;\r
}\r
\r
-bool CEAGLManager::activateContext(const SExposedVideoData& videoData)\r
+bool CEAGLManager::activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero)\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
EAGLContext* context = dataStorage->Context;\r
- \r
+\r
bool status = false;\r
- \r
+\r
if (context != nil)\r
{\r
status = ([EAGLContext currentContext] == context || [EAGLContext setCurrentContext:context]);\r
}\r
- \r
+\r
if (status)\r
{\r
if (FrameBuffer.ColorBuffer == 0)\r
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);\r
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:dataStorage->Layer];\r
}\r
- \r
+\r
if (FrameBuffer.DepthBuffer == 0)\r
{\r
GLenum depth = (Params.ZBufferBits >= 24) ? GL_DEPTH_COMPONENT24_OES : GL_DEPTH_COMPONENT16_OES;\r
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.DepthBuffer);\r
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depth, Params.WindowSize.Width, Params.WindowSize.Height);\r
}\r
- \r
+\r
if (FrameBuffer.BufferID == 0)\r
{\r
glGenFramebuffersOES(1, &FrameBuffer.BufferID);\r
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);\r
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, FrameBuffer.DepthBuffer);\r
}\r
- \r
+\r
glBindFramebufferOES(GL_FRAMEBUFFER_OES, FrameBuffer.BufferID);\r
}\r
else\r
{\r
SEAGLManagerDataStorage* dataStorage = static_cast<SEAGLManagerDataStorage*>(DataStorage);\r
EAGLContext* context = dataStorage->Context;\r
- \r
+\r
bool status = false;\r
- \r
+\r
if (context != nil && context == [EAGLContext currentContext])\r
{\r
glBindRenderbufferOES(GL_RENDERBUFFER_OES, FrameBuffer.ColorBuffer);\r
[context presentRenderbuffer:GL_RENDERBUFFER_OES];\r
- \r
+\r
status = true;\r
}\r
- \r
+\r
return status;\r
}\r
\r