|
|
@@ -30,127 +30,125 @@ namespace bgfx { namespace gl
|
|
|
_layer.opaque = true;
|
|
|
|
|
|
_layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys
|
|
|
- : [NSNumber numberWithBool:false]
|
|
|
- , kEAGLDrawablePropertyRetainedBacking
|
|
|
- , kEAGLColorFormatRGBA8
|
|
|
- , kEAGLDrawablePropertyColorFormat
|
|
|
- , nil
|
|
|
- ];
|
|
|
+ : [NSNumber numberWithBool:false]
|
|
|
+ , kEAGLDrawablePropertyRetainedBacking
|
|
|
+ , kEAGLColorFormatRGBA8
|
|
|
+ , kEAGLDrawablePropertyColorFormat
|
|
|
+ , nil];
|
|
|
|
|
|
+ [EAGLContext setCurrentContext:_context];
|
|
|
|
|
|
- [EAGLContext setCurrentContext:_context];
|
|
|
+ GL_CHECK(glGenFramebuffers(1, &m_fbo) );
|
|
|
+ GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
|
|
|
- GL_CHECK(glGenFramebuffers(1, &m_fbo) );
|
|
|
- GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
+ GL_CHECK(glGenRenderbuffers(1, &m_colorRbo) );
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
|
|
|
- GL_CHECK(glGenRenderbuffers(1, &m_colorRbo) );
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
+ [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_layer];
|
|
|
+ GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRbo) );
|
|
|
|
|
|
- [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_layer];
|
|
|
- GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRbo) );
|
|
|
+ GLint width;
|
|
|
+ GLint height;
|
|
|
+ GL_CHECK(glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width) );
|
|
|
+ GL_CHECK(glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height) );
|
|
|
+ BX_TRACE("Screen size: %d x %d", width, height);
|
|
|
|
|
|
- GLint width;
|
|
|
- GLint height;
|
|
|
- GL_CHECK(glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width) );
|
|
|
- GL_CHECK(glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height) );
|
|
|
- BX_TRACE("Screen size: %d x %d", width, height);
|
|
|
+ m_width = width;
|
|
|
+ m_height = height;
|
|
|
+ m_layer = _layer;
|
|
|
|
|
|
- m_width = width;
|
|
|
- m_height = height;
|
|
|
- m_layer = _layer;
|
|
|
-
|
|
|
- createFrameBuffers(m_width, m_height);
|
|
|
+ createFrameBuffers(m_width, m_height);
|
|
|
}
|
|
|
|
|
|
~SwapChainGL()
|
|
|
{
|
|
|
- destroyFrameBuffers();
|
|
|
+ destroyFrameBuffers();
|
|
|
}
|
|
|
|
|
|
- void destroyFrameBuffers()
|
|
|
- {
|
|
|
- GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, 0) );
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) );
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) );
|
|
|
- if (0 != m_fbo)
|
|
|
- {
|
|
|
- GL_CHECK(glDeleteFramebuffers(1, &m_fbo) );
|
|
|
- m_fbo = 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (0 != m_colorRbo)
|
|
|
- {
|
|
|
- GL_CHECK(glDeleteRenderbuffers(1, &m_colorRbo) );
|
|
|
- m_colorRbo = 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (0 != m_depthStencilRbo)
|
|
|
- {
|
|
|
- GL_CHECK(glDeleteRenderbuffers(1, &m_depthStencilRbo) );
|
|
|
- m_depthStencilRbo = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void createFrameBuffers(GLint _width, GLint _height)
|
|
|
- {
|
|
|
- GL_CHECK(glGenRenderbuffers(1, &m_depthStencilRbo) );
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
- GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, _width, _height) ); // from OES_packed_depth_stencil
|
|
|
- GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
- GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
-
|
|
|
- BX_CHECK(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
|
- , "glCheckFramebufferStatus failed 0x%08x"
|
|
|
- , glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
|
- );
|
|
|
-
|
|
|
- makeCurrent();
|
|
|
- GL_CHECK(glClearColor(0.0f, 0.0f, 0.0f, 0.0f) );
|
|
|
- GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
- swapBuffers();
|
|
|
- GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
- swapBuffers();
|
|
|
- }
|
|
|
+ void destroyFrameBuffers()
|
|
|
+ {
|
|
|
+ GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, 0) );
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) );
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0) );
|
|
|
+ if (0 != m_fbo)
|
|
|
+ {
|
|
|
+ GL_CHECK(glDeleteFramebuffers(1, &m_fbo) );
|
|
|
+ m_fbo = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (0 != m_colorRbo)
|
|
|
+ {
|
|
|
+ GL_CHECK(glDeleteRenderbuffers(1, &m_colorRbo) );
|
|
|
+ m_colorRbo = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (0 != m_depthStencilRbo)
|
|
|
+ {
|
|
|
+ GL_CHECK(glDeleteRenderbuffers(1, &m_depthStencilRbo) );
|
|
|
+ m_depthStencilRbo = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void createFrameBuffers(GLint _width, GLint _height)
|
|
|
+ {
|
|
|
+ GL_CHECK(glGenRenderbuffers(1, &m_depthStencilRbo) );
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
+ GL_CHECK(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, _width, _height) ); // from OES_packed_depth_stencil
|
|
|
+ GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
+ GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilRbo) );
|
|
|
+
|
|
|
+ BX_CHECK(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
|
+ , "glCheckFramebufferStatus failed 0x%08x"
|
|
|
+ , glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
|
+ );
|
|
|
+
|
|
|
+ makeCurrent();
|
|
|
+ GL_CHECK(glClearColor(0.0f, 0.0f, 0.0f, 0.0f) );
|
|
|
+ GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
+ swapBuffers();
|
|
|
+ GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
+ swapBuffers();
|
|
|
+ }
|
|
|
|
|
|
void makeCurrent()
|
|
|
{
|
|
|
- [EAGLContext setCurrentContext:m_context];
|
|
|
- GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
+ [EAGLContext setCurrentContext:m_context];
|
|
|
+ GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
|
|
|
- GLint newWidth = m_layer.bounds.size.width*[UIScreen mainScreen].scale;
|
|
|
- GLint newHeight = m_layer.bounds.size.height*[UIScreen mainScreen].scale;
|
|
|
- resize(newWidth, newHeight);
|
|
|
+ GLint newWidth = m_layer.bounds.size.width*[UIScreen mainScreen].scale;
|
|
|
+ GLint newHeight = m_layer.bounds.size.height*[UIScreen mainScreen].scale;
|
|
|
+ resize(newWidth, newHeight);
|
|
|
}
|
|
|
|
|
|
- void resize(GLint _width, GLint _height)
|
|
|
- {
|
|
|
- if(m_width == _width && m_height == _height)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
+ void resize(GLint _width, GLint _height)
|
|
|
+ {
|
|
|
+ if(m_width == _width && m_height == _height)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- destroyFrameBuffers();
|
|
|
+ destroyFrameBuffers();
|
|
|
|
|
|
- m_width = _width;
|
|
|
- m_height = _height;
|
|
|
+ m_width = _width;
|
|
|
+ m_height = _height;
|
|
|
|
|
|
- createFrameBuffers(m_width, m_height);
|
|
|
- }
|
|
|
+ createFrameBuffers(m_width, m_height);
|
|
|
+ }
|
|
|
|
|
|
void swapBuffers()
|
|
|
{
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
- [m_context presentRenderbuffer:GL_RENDERBUFFER];
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
+ [m_context presentRenderbuffer:GL_RENDERBUFFER];
|
|
|
}
|
|
|
|
|
|
EAGLContext* m_context;
|
|
|
|
|
|
- CAEAGLLayer *m_layer;
|
|
|
+ CAEAGLLayer *m_layer;
|
|
|
GLuint m_fbo;
|
|
|
GLuint m_colorRbo;
|
|
|
GLuint m_depthStencilRbo;
|
|
|
- GLint m_width;
|
|
|
- GLint m_height;
|
|
|
+ GLint m_width;
|
|
|
+ GLint m_height;
|
|
|
};
|
|
|
|
|
|
void GlContext::create(uint32_t _width, uint32_t _height)
|
|
|
@@ -201,12 +199,12 @@ namespace bgfx { namespace gl
|
|
|
, glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
|
);
|
|
|
|
|
|
- makeCurrent();
|
|
|
- GL_CHECK(glClearColor(0.0f, 0.0f, 0.0f, 0.0f) );
|
|
|
- GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
- swap(NULL);
|
|
|
- GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
- swap(NULL);
|
|
|
+ makeCurrent();
|
|
|
+ GL_CHECK(glClearColor(0.0f, 0.0f, 0.0f, 0.0f) );
|
|
|
+ GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
+ swap(NULL);
|
|
|
+ GL_CHECK(glClear(GL_COLOR_BUFFER_BIT) );
|
|
|
+ swap(NULL);
|
|
|
|
|
|
import();
|
|
|
|
|
|
@@ -306,18 +304,18 @@ namespace bgfx { namespace gl
|
|
|
|
|
|
void GlContext::swap(SwapChainGL* _swapChain)
|
|
|
{
|
|
|
- makeCurrent(_swapChain);
|
|
|
-
|
|
|
- if (NULL == _swapChain)
|
|
|
- {
|
|
|
- GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
- EAGLContext* context = (EAGLContext*)m_context;
|
|
|
- [context presentRenderbuffer:GL_RENDERBUFFER];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _swapChain->swapBuffers();
|
|
|
- }
|
|
|
+ makeCurrent(_swapChain);
|
|
|
+
|
|
|
+ if (NULL == _swapChain)
|
|
|
+ {
|
|
|
+ GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, m_colorRbo) );
|
|
|
+ EAGLContext* context = (EAGLContext*)m_context;
|
|
|
+ [context presentRenderbuffer:GL_RENDERBUFFER];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _swapChain->swapBuffers();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void GlContext::makeCurrent(SwapChainGL* _swapChain)
|
|
|
@@ -328,8 +326,8 @@ namespace bgfx { namespace gl
|
|
|
|
|
|
if (NULL == _swapChain)
|
|
|
{
|
|
|
- [EAGLContext setCurrentContext:(EAGLContext*)m_context];
|
|
|
- GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
+ [EAGLContext setCurrentContext:(EAGLContext*)m_context];
|
|
|
+ GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_fbo) );
|
|
|
}
|
|
|
else
|
|
|
{
|