mirror of
https://github.com/id-Software/DOOM-iOS.git
synced 2025-06-04 19:11:03 +00:00
174 lines
5 KiB
Text
Executable file
174 lines
5 KiB
Text
Executable file
/*
|
|
|
|
Copyright (C) 2009-2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
#include "RenderContext.h"
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::idRenderContext
|
|
=========================================
|
|
*/
|
|
idRenderContext::idRenderContext() :
|
|
mViewRenderbuffer( 0 ),
|
|
mViewFramebuffer( 0 ),
|
|
mDepthRenderbuffer( 0 ),
|
|
mEAGLContext( NULL ) {
|
|
|
|
mWidth = 0;
|
|
mHeight = 0;
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::Initialize
|
|
=========================================
|
|
*/
|
|
void idRenderContext::Initialize( EAGLRenderingAPI apiVersion, EAGLSharegroup * sharegroup ) {
|
|
|
|
// Allocate and initialize the Rendering context for this view.
|
|
if( sharegroup == NULL ) {
|
|
mEAGLContext = [[EAGLContext alloc] initWithAPI:apiVersion];
|
|
} else {
|
|
|
|
mEAGLContext = [[EAGLContext alloc] initWithAPI:apiVersion sharegroup: sharegroup];
|
|
}
|
|
|
|
assert( mEAGLContext );
|
|
assert( [mEAGLContext API] == apiVersion );
|
|
|
|
SetActiveContext();
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::~idRenderContext
|
|
=========================================
|
|
*/
|
|
idRenderContext::~idRenderContext() {
|
|
|
|
glDeleteFramebuffersOES( 1, &mViewFramebuffer );
|
|
mViewFramebuffer = 0;
|
|
glDeleteRenderbuffersOES( 1, &mViewRenderbuffer );
|
|
mViewRenderbuffer = 0;
|
|
glDeleteRenderbuffersOES( 1, &mDepthRenderbuffer );
|
|
mDepthRenderbuffer = 0;
|
|
|
|
[ mEAGLContext release ];
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::SetActiveContext
|
|
=========================================
|
|
*/
|
|
void idRenderContext::SetActiveContext() {
|
|
|
|
if ( ![EAGLContext setCurrentContext:mEAGLContext]) {
|
|
assert( 0 );
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::SwapBuffers
|
|
=========================================
|
|
*/
|
|
void idRenderContext::SwapBuffers() {
|
|
|
|
glBindRenderbufferOES(GL_RENDERBUFFER_OES, mViewRenderbuffer);
|
|
|
|
// present the renderbuffer for display
|
|
[mEAGLContext presentRenderbuffer:GL_RENDERBUFFER_OES];
|
|
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::RenderBufferStorage
|
|
=========================================
|
|
*/
|
|
void idRenderContext::InitFrameBuffer( CAEAGLLayer * layer ) {
|
|
|
|
|
|
glDeleteFramebuffersOES( 1, &mViewFramebuffer );
|
|
mViewFramebuffer = 0;
|
|
glDeleteRenderbuffersOES( 1, &mViewRenderbuffer );
|
|
mViewRenderbuffer = 0;
|
|
glDeleteRenderbuffersOES( 1, &mDepthRenderbuffer );
|
|
mDepthRenderbuffer = 0;
|
|
|
|
glGenFramebuffersOES(1, &mViewFramebuffer);
|
|
glBindFramebufferOES(GL_FRAMEBUFFER_OES, mViewFramebuffer);
|
|
|
|
glGenRenderbuffersOES(1, &mViewRenderbuffer);
|
|
glBindRenderbufferOES(GL_RENDERBUFFER_OES, mViewRenderbuffer);
|
|
|
|
[mEAGLContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
|
|
|
|
// the backing sizes should be the same as the screen
|
|
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &mWidth);
|
|
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &mHeight);
|
|
|
|
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, mViewRenderbuffer);
|
|
|
|
glGenRenderbuffersOES(1, &mDepthRenderbuffer);
|
|
glBindRenderbufferOES(GL_RENDERBUFFER_OES, mDepthRenderbuffer);
|
|
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, mWidth, mHeight);
|
|
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mDepthRenderbuffer);
|
|
|
|
// the framebuffer will stay constant
|
|
glBindRenderbufferOES(GL_RENDERBUFFER_OES, mViewRenderbuffer);
|
|
glBindFramebufferOES(GL_FRAMEBUFFER_OES, mViewFramebuffer);
|
|
|
|
|
|
if ( glCheckFramebufferStatusOES( GL_FRAMEBUFFER_OES ) != GL_FRAMEBUFFER_COMPLETE_OES ) {
|
|
assert( 0 );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::Begin
|
|
=========================================
|
|
*/
|
|
void idRenderContext::Begin() {
|
|
|
|
SetActiveContext();
|
|
|
|
// Clear the Buffer to begin for a new Frame.
|
|
//GL_Clear( true, true, false );
|
|
|
|
// Set the Viewport for our Context.
|
|
// GL_Viewport( 0, 0, mWidth, mHeight );
|
|
|
|
}
|
|
|
|
/*
|
|
=========================================
|
|
idRenderContext::End
|
|
=========================================
|
|
*/
|
|
void idRenderContext::End() {
|
|
|
|
SwapBuffers();
|
|
}
|