From 5e7aa33f0162ed055f07dd313e13a51c04f5c6ca Mon Sep 17 00:00:00 2001 From: "spartanj@gmail.com" Date: Mon, 4 Jun 2012 17:20:42 -0300 Subject: [PATCH] GLES2 backend working. Everything is working in the iOS port! --- Makefile | 8 +----- src/graphics/cbatchrenderer.cpp | 2 +- src/graphics/cframebufferfbo.cpp | 35 +++++++++++++++++------ src/graphics/cframebufferfbo.hpp | 4 +++ src/graphics/cshader.cpp | 6 ++-- src/graphics/cshaderprogram.cpp | 4 ++- src/graphics/renderer/cgl.cpp | 11 +++++++- src/graphics/renderer/crenderergl3.cpp | 39 +++++++++----------------- src/test/eetest.cpp | 2 +- 9 files changed, 63 insertions(+), 48 deletions(-) diff --git a/Makefile b/Makefile index b59e050c1..c9f039746 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/src/graphics/cbatchrenderer.cpp b/src/graphics/cbatchrenderer.cpp index 65f54c600..e31d7bacb 100755 --- a/src/graphics/cbatchrenderer.cpp +++ b/src/graphics/cbatchrenderer.cpp @@ -120,7 +120,7 @@ void cBatchRenderer::Flush() { Uint32 alloc = sizeof(eeVertex) * NumVertex; - GLi->VertexPointer ( 2, GL_FP , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) , alloc ); + GLi->VertexPointer ( 2, GL_FP , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) , alloc ); GLi->ColorPointer ( 4, GL_UNSIGNED_BYTE , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) + sizeof(eeVector2f) + sizeof(eeTexCoord) , alloc ); if ( NULL != mTexture ) { diff --git a/src/graphics/cframebufferfbo.cpp b/src/graphics/cframebufferfbo.cpp index a6525a703..8d601241d 100644 --- a/src/graphics/cframebufferfbo.cpp +++ b/src/graphics/cframebufferfbo.cpp @@ -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( frameBuffer ); + mFrameBuffer = static_cast( 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 ); +} + }} diff --git a/src/graphics/cframebufferfbo.hpp b/src/graphics/cframebufferfbo.hpp index ee7d508ae..3b49e7467 100644 --- a/src/graphics/cframebufferfbo.hpp +++ b/src/graphics/cframebufferfbo.hpp @@ -29,6 +29,10 @@ class EE_API cFrameBufferFBO : public cFrameBuffer { protected: Int32 mFrameBuffer; Uint32 mDepthBuffer; + Int32 mLastFB; + Int32 mLastRB; + + void BindFrameBuffer(); }; }} diff --git a/src/graphics/cshader.cpp b/src/graphics/cshader.cpp index 2369eddba..2b8414797 100644 --- a/src/graphics/cshader.cpp +++ b/src/graphics/cshader.cpp @@ -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( &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 diff --git a/src/graphics/cshaderprogram.cpp b/src/graphics/cshaderprogram.cpp index c05521c53..686c66e26 100644 --- a/src/graphics/cshaderprogram.cpp +++ b/src/graphics/cshaderprogram.cpp @@ -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 ); diff --git a/src/graphics/renderer/cgl.cpp b/src/graphics/renderer/cgl.cpp index a416d4c70..c009866e7 100644 --- a/src/graphics/renderer/cgl.cpp +++ b/src/graphics/renderer/cgl.cpp @@ -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 ( cGL::instance()->GetString( GL_SHADING_LANGUAGE_VERSION ) ) ); + char * str = cGL::instance()->GetString( GL_SHADING_LANGUAGE_VERSION ); + + if ( NULL != str ) + return std::string( reinterpret_cast ( str ) ); #endif } diff --git a/src/graphics/renderer/crenderergl3.cpp b/src/graphics/renderer/crenderergl3.cpp index 3627e579d..fcaf0a636 100644 --- a/src/graphics/renderer/crenderergl3.cpp +++ b/src/graphics/renderer/crenderergl3.cpp @@ -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 } } diff --git a/src/test/eetest.cpp b/src/test/eetest.cpp index 7c0edcdc6..b61d0b6ba 100644 --- a/src/test/eetest.cpp +++ b/src/test/eetest.cpp @@ -134,7 +134,7 @@ void cEETest::Init() { eePolygon2f Poly = CreateRoundedPolygon( 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++ ) {