GLES2 backend working.

Everything is working in the iOS port!
This commit is contained in:
spartanj@gmail.com
2012-06-04 17:20:42 -03:00
parent a817b9fbda
commit 5e7aa33f01
9 changed files with 63 additions and 48 deletions

View File

@@ -344,13 +344,7 @@ endif
ifeq ($(BUILD_OS), linux)
ifeq ($(GLES2),yes)
LINUXLGL = -lGLESv2
else
LINUXLGL = -lGL
endif
LIBS = -lrt -lpthread -lX11 -lopenal $(LINUXLGL) -lXcursor $(LIBSNDFILE) $(SDL_BACKEND_LINK) $(ALLEGRO_BACKEND_LINK) $(LIBFREETYPE2)
LIBS = -lrt -lpthread -lX11 -lopenal -lGL -lXcursor $(LIBSNDFILE) $(SDL_BACKEND_LINK) $(ALLEGRO_BACKEND_LINK) $(LIBFREETYPE2)
OTHERINC = $(INCFREETYPE2)
PLATFORMSRC = $(wildcard ./src/window/platform/x11/*.cpp) $(wildcard ./src/system/platform/posix/*.cpp)

View File

@@ -120,7 +120,7 @@ void cBatchRenderer::Flush() {
Uint32 alloc = sizeof(eeVertex) * NumVertex;
GLi->VertexPointer ( 2, GL_FP , sizeof(eeVertex), reinterpret_cast<char*> ( &mVertex[0] ) , alloc );
GLi->VertexPointer ( 2, GL_FP , sizeof(eeVertex), reinterpret_cast<char*> ( &mVertex[0] ) , alloc );
GLi->ColorPointer ( 4, GL_UNSIGNED_BYTE , sizeof(eeVertex), reinterpret_cast<char*> ( &mVertex[0] ) + sizeof(eeVector2f) + sizeof(eeTexCoord) , alloc );
if ( NULL != mTexture ) {

View File

@@ -6,19 +6,29 @@
namespace EE { namespace Graphics {
bool cFrameBufferFBO::IsSupported() {
#ifdef EE_GLES2
return true;
#elif defined( EE_GLES1 )
return false
#else
return 0 != GLi->IsExtension( EEGL_EXT_framebuffer_object );
#endif
}
cFrameBufferFBO::cFrameBufferFBO( Window::cWindow * window ) :
cFrameBuffer( window ),
mFrameBuffer(0),
mDepthBuffer(0)
mDepthBuffer(0),
mLastFB(0),
mLastRB(0)
{}
cFrameBufferFBO::cFrameBufferFBO( const Uint32& Width, const Uint32& Height, bool DepthBuffer, Window::cWindow * window ) :
cFrameBuffer( window ),
mFrameBuffer(0),
mDepthBuffer(0)
mDepthBuffer(0),
mLastFB(0),
mLastRB(0)
{
Create( Width, Height, DepthBuffer );
}
@@ -64,12 +74,12 @@ bool cFrameBufferFBO::Create( const Uint32& Width, const Uint32& Height, bool De
glGenFramebuffersEXT( 1, &frameBuffer );
mFrameBuffer = static_cast<unsigned int>( frameBuffer );
mFrameBuffer = static_cast<Int32>( frameBuffer );
if ( !mFrameBuffer)
return false;
glBindFramebufferEXT( GL_FRAMEBUFFER, mFrameBuffer );
BindFrameBuffer();
if ( DepthBuffer ) {
GLuint depth = 0;
@@ -101,19 +111,19 @@ bool cFrameBufferFBO::Create( const Uint32& Width, const Uint32& Height, bool De
glFramebufferTexture2DEXT( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture->Handle(), 0 );
if ( glCheckFramebufferStatusEXT( GL_FRAMEBUFFER ) != GL_FRAMEBUFFER_COMPLETE ) {
glBindFramebufferEXT( GL_FRAMEBUFFER, 0 );
glBindFramebufferEXT( GL_FRAMEBUFFER, mLastFB );
return false;
}
glBindFramebufferEXT( GL_FRAMEBUFFER, 0 );
glBindFramebufferEXT( GL_FRAMEBUFFER, mLastFB );
return true;
}
void cFrameBufferFBO::Bind() {
if ( mFrameBuffer ) {
glBindFramebufferEXT( GL_FRAMEBUFFER, mFrameBuffer );
BindFrameBuffer();
SetBufferView();
}
}
@@ -121,7 +131,7 @@ void cFrameBufferFBO::Bind() {
void cFrameBufferFBO::Unbind() {
if ( mFrameBuffer ) {
RecoverView();
glBindFramebufferEXT( GL_FRAMEBUFFER, 0 );
glBindFramebufferEXT( GL_FRAMEBUFFER, mLastFB );
}
}
@@ -129,4 +139,13 @@ void cFrameBufferFBO::Reload() {
Create( mWidth, mHeight, mHasDepthBuffer );
}
void cFrameBufferFBO::BindFrameBuffer() {
GLint curFB;
glGetIntegerv( GL_FRAMEBUFFER_BINDING, &curFB );
mLastFB = (Int32)curFB;
glBindFramebufferEXT( GL_FRAMEBUFFER, mFrameBuffer );
}
}}

View File

@@ -29,6 +29,10 @@ class EE_API cFrameBufferFBO : public cFrameBuffer {
protected:
Int32 mFrameBuffer;
Uint32 mDepthBuffer;
Int32 mLastFB;
Int32 mLastRB;
void BindFrameBuffer();
};
}}

View File

@@ -125,7 +125,7 @@ void cShader::EnsureVersion() {
if ( GLi->Version() == GLv_3 ) {
mSource = "#version 150\nuniform int dgl_TexActive = 1;\ninvariant in vec4 gl_Color;\ninvariant in vec4 gl_TexCoord[ 4 ];\nout vec4 gl_FragColor;\n" + mSource;
} else {
mSource = "uniform int dgl_TexActive;\nvarying vec4 gl_Color;\nvarying vec4 gl_TexCoord[ 4 ];\n" + mSource;
mSource = "precision highp float;\nprecision highp int;\nuniform int dgl_TexActive;\nvarying vec4 gl_Color;\nvarying vec4 gl_TexCoord[ 4 ];\n" + mSource;
}
if ( GLi->Version() == GLv_3 ) {
@@ -208,11 +208,11 @@ bool cShader::Compile() {
glGetShaderInfoLog( GetId(), logarraysize, &logsize, reinterpret_cast<GLchar*>( &mCompileLog[0] ) );
}
cLog::instance()->Write( "Couldn't compile shader " + GetName() + ". Log follows:" );
cLog::instance()->Write( "Couldn't compile shader " + GetName() + ". Log follows:\n" );
cLog::instance()->Write( mCompileLog );
cLog::instance()->Write( mSource );
} else {
cLog::instance()->Write( "Shader " + GetName() + " loaded Succesfully" );
cLog::instance()->Write( "Shader " + GetName() + " compiled succesfully" );
}
#endif

View File

@@ -147,6 +147,8 @@ void cShaderProgram::Init() {
mValid = false;
mUniformLocations.clear();
mAttributeLocations.clear();
} else {
cLog::instance()->Write( "cShaderProgram::Init() " + mName + ": Couldn't create program." );
}
}
@@ -210,7 +212,7 @@ bool cShaderProgram::Link() {
#endif
if ( !mValid ) {
cLog::instance()->Write( "cShaderProgram::Link() " + mName + ": Couldn't link program. Log follows:" + mLinkLog );
cLog::instance()->Write( "cShaderProgram::Link() " + mName + ": Couldn't link program. Log follows:\n" + mLinkLog );
} else {
if ( mLinkLog.size() ) {
cLog::instance()->Write( "cShaderProgram::Link() " + mName + ": Program linked, but recibed some log:\n" + mLinkLog );

View File

@@ -151,7 +151,13 @@ bool cGL::PointSpriteSupported() {
}
bool cGL::ShadersSupported() {
#ifdef EE_GLES2
return true;
#elif defined( EE_GLES1 )
return false;
#else
return IsExtension( EEGL_ARB_shading_language_100 ) && IsExtension( EEGL_ARB_shader_objects ) && IsExtension( EEGL_ARB_vertex_shader ) && IsExtension( EEGL_ARB_fragment_shader );
#endif
}
Uint32 cGL::GetTextureParamEnum( const EE_TEXTURE_PARAM& Type ) {
@@ -355,7 +361,10 @@ std::string cGL::GetVersion() {
std::string cGL::GetShadingLanguageVersion() {
if ( ShadersSupported() ) {
#ifdef GL_SHADING_LANGUAGE_VERSION
return std::string( reinterpret_cast<const char*> ( cGL::instance()->GetString( GL_SHADING_LANGUAGE_VERSION ) ) );
char * str = cGL::instance()->GetString( GL_SHADING_LANGUAGE_VERSION );
if ( NULL != str )
return std::string( reinterpret_cast<const char*> ( str ) );
#endif
}

View File

@@ -45,6 +45,8 @@ const char * EEGL_PLANES_NAME[] = {
const GLchar * EEGL_SHADER_BASE_VS[] = {
"#define MAX_CLIP_PLANES 6\n",
"precision highp float;\n",
"precision highp int;\n",
"uniform mat4 dgl_ProjectionMatrix;\n",
"uniform mat4 dgl_ModelViewMatrix;\n",
"uniform int dgl_ClippingEnabled;\n",
@@ -82,6 +84,7 @@ const GLchar * EEGL_SHADER_BASE_VS[] = {
const GLchar * EEGL_SHADER_BASE_FS[] = {
"#define MAX_CLIP_PLANES 6\n",
"precision highp float;\n",
"precision highp int;\n",
"uniform sampler2D textureUnit0;\n",
"uniform int dgl_TexActive;\n",
"uniform int dgl_PointSpriteActive;\n",
@@ -243,6 +246,10 @@ void cRendererGL3::SetShader( cShaderProgram * Shader ) {
return;
}
DisableClientState( GL_VERTEX_ARRAY );
DisableClientState( GL_TEXTURE_COORD_ARRAY );
DisableClientState( GL_COLOR_ARRAY );
mShaderPrev = mCurShader;
mCurShader = Shader;
mProjectionMatrix_id = mCurShader->UniformLocation( "dgl_ProjectionMatrix" );
@@ -298,12 +305,9 @@ void cRendererGL3::Enable( GLenum cap ) {
switch ( cap ) {
case GL_TEXTURE_2D:
{
if ( !glIsEnabled( cap ) ) {
mTexActive = 1;
mCurShader->SetUniform( mTexActiveLoc, mTexActive );
}
break;
mTexActive = 1;
mCurShader->SetUniform( mTexActiveLoc, mTexActive );
return;
}
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
@@ -337,12 +341,9 @@ void cRendererGL3::Disable ( GLenum cap ) {
switch ( cap ) {
case GL_TEXTURE_2D:
{
if ( glIsEnabled( cap ) ) {
mTexActive = 0;
mCurShader->SetUniform( mTexActiveLoc, mTexActive );
}
break;
mTexActive = 0;
mCurShader->SetUniform( mTexActiveLoc, mTexActive );
return;
}
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
@@ -656,9 +657,7 @@ void cRendererGL3::VertexPointer ( GLint size, GLenum type, GLsizei stride, cons
glBindBufferARB( GL_ARRAY_BUFFER, mVBO[ EEGL_VERTEX_ARRAY ] );
glBufferSubDataARB( GL_ARRAY_BUFFER, 0, allocate, pointer );
#ifdef EE_GLES2
glEnableVertexAttribArray( index );
#endif
glVertexAttribPointerARB( index, size, type, GL_FALSE, stride, 0 );
}
@@ -683,19 +682,13 @@ void cRendererGL3::ColorPointer ( GLint size, GLenum type, GLsizei stride, const
glBindBufferARB( GL_ARRAY_BUFFER, mVBO[ EEGL_COLOR_ARRAY ] );
glBufferSubDataARB( GL_ARRAY_BUFFER, 0, allocate, pointer );
#ifdef EE_GLES2
glEnableVertexAttribArray( index );
#endif
if ( type == GL_UNSIGNED_BYTE ) {
glVertexAttribPointerARB( index, size, type, GL_TRUE, stride, 0 );
} else {
glVertexAttribPointerARB( index, size, type, GL_FALSE, stride, 0 );
}
} else {
#ifdef EE_GLES2
glDisableVertexAttribArray( index );
#endif
}
}
@@ -718,15 +711,9 @@ void cRendererGL3::TexCoordPointer ( GLint size, GLenum type, GLsizei stride, co
glBindBufferARB( GL_ARRAY_BUFFER, mCurTexCoordArray );
glBufferSubDataARB( GL_ARRAY_BUFFER, 0, allocate, pointer );
#ifdef EE_GLES2
glEnableVertexAttribArray( index );
#endif
glVertexAttribPointerARB( index, size, type, GL_FALSE, stride, 0 );
} else {
#ifdef EE_GLES2
glDisableVertexAttribArray( index );
#endif
}
}

View File

@@ -134,7 +134,7 @@ void cEETest::Init() {
eePolygon2f Poly = CreateRoundedPolygon<eeFloat>( 0, 0, 256, 50 );
mVBO = cVertexBuffer::Create( VERTEX_FLAG_GET( VERTEX_FLAG_POSITION ) | VERTEX_FLAG_GET( VERTEX_FLAG_COLOR ), DM_POLYGON );
mVBO = cVertexBuffer::Create( VERTEX_FLAG_GET( VERTEX_FLAG_POSITION ) | VERTEX_FLAG_GET( VERTEX_FLAG_COLOR ), DM_TRIANGLE_FAN );
if ( NULL != mVBO ) {
for ( Uint32 i = 0; i < Poly.Size(); i++ ) {