"L. Spiro Engine"
|
00001 00016 #ifndef __LSG_OPENGLES_H__ 00017 #define __LSG_OPENGLES_H__ 00018 00019 #ifdef LSG_OGLES 00020 00021 #include "../Fnd/LSGFndBase.h" 00022 #include "../Fnd/LSGFndConstants.h" 00023 #include "CriticalSection/LSHCriticalSection.h" 00024 #include "Windows/LSSTDWindows.h" 00025 00026 #ifndef APIENTRY 00027 #define APIENTRY 00028 #endif // #ifndef APIENTRY 00029 00030 #ifdef LSE_IPHONE 00031 #include <OpenGLES/ES2/gl.h> 00032 #include <OpenGLES/ES2/glext.h> 00033 #else 00034 #error "Unrecognized OpenGL ES platform." 00035 #endif // #ifdef LSE_IPHONE 00036 00037 00038 #include <cassert> 00039 00040 namespace lsg { 00041 00042 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00043 // CONSTANTS 00044 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00048 enum LSG_BUFFERS { 00049 LSG_B_COLOR_BUFFER = GL_COLOR_BUFFER_BIT, 00050 LSG_B_STENCIL_BUFFER = GL_STENCIL_BUFFER_BIT, 00051 LSG_B_DEPTH_BUFFER = GL_DEPTH_BUFFER_BIT, 00052 LSG_B_ALL = LSG_B_COLOR_BUFFER | LSG_B_STENCIL_BUFFER | LSG_B_DEPTH_BUFFER, 00053 }; 00054 00055 00056 00057 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00058 // TYPES 00059 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00063 typedef class COpenGlEsShaderManager CShaderManager; 00064 class CShader; 00065 00066 00067 00068 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00069 // INTERFACE 00070 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00077 class COpenGlEs { 00078 public : 00079 // == Types. 00083 typedef struct LSG_OPENGLES_METRICS { 00087 LSUINT32 ui32MaxRenderTargetSize; 00088 00092 LSUINT32 ui32MaxTexture; 00093 00097 LSUINT32 ui32MaxAniso; 00098 } * LPLSG_OPENGLES_METRICS, * const LPCLSG_OPENGLES_METRICS; 00099 00100 00101 // == Functions. 00107 static LSBOOL LSE_CALL InitOpenGlEs( LSVOID * _pvParm ); 00108 00112 static LSVOID LSE_CALL PostInitOpenGlEs(); 00113 00117 static LSVOID LSE_CALL DestroyOpenGlEs(); 00118 00122 static LSVOID LSE_CALL LoseDevice(); 00123 00129 static LSBOOL LSE_CALL ResetDevice(); 00130 00134 static LSVOID LSE_CALL SetInitialValues(); 00135 00139 static LSVOID LSE_CALL MakeCurrent(); 00140 00144 static LSVOID LSE_CALL FreeTmpResources(); 00145 00151 static LSVOID LSE_CALL SetGlkView( LSVOID * _pvView ); 00152 00156 static LSVOID LSE_CALL RestoreGlkViewBuffer(); 00157 00171 static CMatrix4x4 LSE_CALL OffsetOrtho( LSREAL _fLeft, LSREAL _fRight, LSREAL _fBottom, LSREAL _fTop, LSREAL _fNear, LSREAL _fFar ); 00172 00173 00174 00175 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00176 // INTERFACE 00177 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00181 static LSE_INLINE LSVOID LSE_FCALL AssertError(); 00182 00188 static LSBOOL LSE_CALL CheckFramebufferError(); 00189 00196 static LSE_INLINE LSBOOL LSE_FCALL DoNothing(); 00197 00206 static LSBOOL LSE_CALL WarnErrorEx( const LSCHAR * _pcHeader, const LSCHAR * _pcFile, LSUINT32 _ui32Line ); 00207 #ifdef _DEBUG 00208 #define glWarnError( _pcHeader ) COpenGlEs::WarnErrorEx( _pcHeader, __FILE__, __LINE__ ) 00209 #else 00210 #define glWarnError( _pcHeader ) COpenGlEs::DoNothing() 00211 #endif // #ifdef _DEBUG 00212 #define glWarnErrorAlways( _pcHeader ) COpenGlEs::WarnErrorEx( _pcHeader, __FILE__, __LINE__ ) 00213 00217 static LSE_INLINE LSVOID LSE_FCALL Present(); 00218 00224 static LSE_INLINE LSVOID LSE_FCALL Clear( LSUINT32 _ui32Mask ); 00225 00229 static LSE_INLINE LSVOID LSE_FCALL ClearAll(); 00230 00239 static LSVOID LSE_CALL SetClearColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA ); 00240 00246 static LSE_INLINE LSVOID LSE_FCALL SetClearDepth( LSREAL _fValue ); 00247 00256 static LSE_INLINE LSVOID LSE_FCALL SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ); 00257 00263 static LSE_INLINE LSVOID LSE_FCALL SetDepthTest( LSBOOL _bVal ); 00264 00270 static LSE_INLINE LSVOID LSE_FCALL SetDepthFunc( LSG_DEPTH_TEST _dtFunc ); 00271 00277 static LSE_INLINE LSVOID LSE_FCALL SetDepthWrite( LSBOOL _bVal ); 00278 00284 static LSE_INLINE LSVOID LSE_FCALL SetCulling( LSBOOL _bVal ); 00285 00291 static LSE_INLINE LSVOID LSE_FCALL SetCullMode( LSG_CULL_MODES _cmMode ); 00292 00298 static LSE_INLINE LSG_CULL_MODES LSE_CALL GetCullMode(); 00299 00305 static LSE_INLINE LSVOID LSE_FCALL SetBlendEnabled( LSBOOL _bVal ); 00306 00313 static LSE_INLINE LSVOID LSE_FCALL SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ); 00314 00320 static LSE_INLINE LSVOID LSE_FCALL SetFillMode( LSG_FILL_MODES _fmMode ); 00321 00327 static LSE_INLINE LSBOOL LSE_FCALL BeginRender(); 00328 00332 static LSE_INLINE LSVOID LSE_FCALL EndRender(); 00333 00339 static LSE_INLINE CShaderManager * LSE_FCALL 00340 GetShaderManager(); 00341 00348 static LSVOID LSE_FCALL SetShader( CShader * _psShader ); 00349 00355 static CShader * LSE_FCALL GetShader(); 00356 00360 static LSVOID LSE_CALL PreRender(); 00361 00367 static LSE_INLINE LSVOID LSE_CALL ActivateTexture( LSUINT32 _ui32Unit ); 00368 00369 00370 00371 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00372 // METRICS 00373 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00379 static LSE_INLINE LSBOOL LSE_CALL NonPo2(); 00380 00386 static LSE_INLINE LSBOOL LSE_CALL FbosSupported(); 00387 00393 static LSE_INLINE LSUINT32 LSE_CALL MaxRenderTargetSize(); 00394 00400 static LSE_INLINE LSUINT32 LSE_CALL MaxTextureSize(); 00401 00402 00403 // == Members. 00407 static CCriticalSection m_csCrit; 00408 00409 protected : 00410 // == Types. 00414 static CShaderManager * m_psmShaderMan; 00415 00419 static LSG_CULL_MODES m_cmCullMode; 00420 00424 static LSUINT32 m_ui32ClearColor; 00425 00429 static GLclampf m_fDepthClear; 00430 00434 static LSBOOL m_bDepthTest; 00435 00439 static LSBOOL m_bCulling; 00440 00444 static LSUINT32 m_ui32LastActiveTexture; 00445 00449 static LSBOOL m_bFbos; 00450 00454 static LSVOID * m_pvView; 00455 00456 00457 // == Functions. 00464 static LSBOOL LSE_CALL HasExtension( const LSCHAR * _pcExt ); 00465 }; 00466 00467 00468 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00469 // DEFINITIONS 00470 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00474 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::AssertError() { 00475 #ifdef _DEBUG 00476 assert( !glWarnError( "COpenGlEs::AssertError()" ) ); 00477 #endif // #ifdef _DEBUG 00478 } 00479 00484 LSE_INLINE LSBOOL LSE_FCALL COpenGlEs::DoNothing() { 00485 return false; 00486 } 00487 00491 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::Present() { 00492 #ifdef LSE_WINDOWS 00493 ::SwapBuffers( m_hDc ); 00494 #endif // #ifdef LSE_WINDOWS 00495 } 00496 00502 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::Clear( LSUINT32 _ui32Mask ) { 00503 if ( _ui32Mask & LSG_B_DEPTH_BUFFER ) { 00504 static const GLenum eVal[] = { 00505 GL_COLOR_ATTACHMENT0 + 0, 00506 GL_COLOR_ATTACHMENT0 + 1, 00507 GL_COLOR_ATTACHMENT0 + 2, 00508 GL_COLOR_ATTACHMENT0 + 3, 00509 }; 00510 ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal ); 00511 } 00512 if ( _ui32Mask & LSG_B_DEPTH_BUFFER ) { 00513 static const GLenum eVal[] = { 00514 GL_DEPTH_ATTACHMENT, 00515 }; 00516 ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal ); 00517 } 00518 if ( _ui32Mask & LSG_B_STENCIL_BUFFER ) { 00519 static const GLenum eVal[] = { 00520 GL_STENCIL_BUFFER_BIT, 00521 }; 00522 ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal ); 00523 } 00524 ::glClear( _ui32Mask ); 00525 } 00526 00530 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::ClearAll() { 00531 Clear( LSG_B_ALL ); 00532 } 00533 00539 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetClearDepth( LSREAL _fValue ) { 00540 if ( m_fDepthClear != static_cast<GLclampf>(_fValue) ) { 00541 m_fDepthClear = static_cast<GLclampf>(_fValue); 00542 00543 ::glClearDepthf( m_fDepthClear ); 00544 } 00545 } 00546 00555 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ) { 00556 ::glViewport(_i32X, 00557 _i32Y, 00558 _i32Width, 00559 _i32Height ); 00560 } 00561 00567 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthTest( LSBOOL _bVal ) { 00568 _bVal = _bVal != false; 00569 if ( m_bDepthTest != _bVal ) { 00570 m_bDepthTest = _bVal; 00571 if ( _bVal ) { ::glEnable( GL_DEPTH_TEST ); } 00572 else { ::glDisable( GL_DEPTH_TEST ); } 00573 } 00574 } 00575 00581 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthFunc( LSG_DEPTH_TEST _dtFunc ) { 00582 if ( CFndBase::m_dtDepthTestFunc != _dtFunc ) { 00583 CFndBase::m_dtDepthTestFunc = _dtFunc; 00584 static const GLenum eFuncs[] = { 00585 GL_NEVER, // LSG_DT_NEVER 00586 GL_ALWAYS, // LSG_DT_ALWAYS 00587 GL_LESS, // LSG_DT_LESS 00588 GL_EQUAL, // LSG_DT_EQUAL 00589 GL_NOTEQUAL, // LSG_DT_NOTEQUAL 00590 GL_LEQUAL, // LSG_DT_LESSEQUAL 00591 GL_GREATER, // LSG_DT_GREATER 00592 GL_GEQUAL, // LSG_DT_GREATEREQUAL 00593 }; 00594 ::glDepthFunc( eFuncs[_dtFunc] ); 00595 } 00596 } 00597 00603 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthWrite( LSBOOL _bVal ) { 00604 _bVal = _bVal != false; 00605 if ( CFndBase::m_bDepthWrite != _bVal ) { 00606 CFndBase::m_bDepthWrite = _bVal; 00607 ::glDepthMask( _bVal ? GL_TRUE : GL_FALSE ); 00608 } 00609 } 00610 00616 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetCulling( LSBOOL _bVal ) { 00617 _bVal = _bVal != false; 00618 if ( m_bCulling != _bVal ) { 00619 m_bCulling = _bVal; 00620 if ( _bVal ) { ::glEnable( GL_CULL_FACE ); } 00621 else { ::glDisable( GL_CULL_FACE ); } 00622 } 00623 } 00624 00630 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetCullMode( LSG_CULL_MODES _cmMode ) { 00631 assert( _cmMode == LSG_CM_CW || _cmMode == LSG_CM_CCW ); 00632 if ( m_cmCullMode != _cmMode ) { 00633 m_cmCullMode = _cmMode; 00634 static const GLenum eModes[] = { 00635 GL_CW, 00636 GL_CCW 00637 }; 00638 ::glFrontFace( eModes[_cmMode] ); 00639 } 00640 } 00641 00647 LSE_INLINE LSG_CULL_MODES LSE_CALL COpenGlEs::GetCullMode() { 00648 return m_cmCullMode; 00649 } 00650 00656 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetBlendEnabled( LSBOOL _bVal ) { 00657 if ( CFndBase::m_bBlending != (_bVal != false) ) { 00658 CFndBase::m_bBlending = (_bVal != false); 00659 if ( CFndBase::m_bBlending ) { ::glEnable( GL_BLEND ); } 00660 else { ::glDisable( GL_BLEND ); } 00661 } 00662 } 00663 00670 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ) { 00671 static const GLenum eModes[] = { 00672 GL_ZERO, // LSG_BM_ZERO 00673 GL_ONE, // LSG_BM_ONE 00674 GL_SRC_COLOR, // LSG_BM_SRC_COLOR 00675 GL_ONE_MINUS_SRC_COLOR, // LSG_BM_INV_SRC_COLOR 00676 GL_DST_COLOR, // LSG_BM_DST_COLOR 00677 GL_ONE_MINUS_DST_COLOR, // LSG_BM_INV_DST_COLOR 00678 GL_SRC_ALPHA, // LSG_BM_SRC_ALPHA 00679 GL_ONE_MINUS_SRC_ALPHA, // LSG_BM_INV_SRC_ALPHA 00680 GL_DST_ALPHA, // LSG_BM_DST_ALPHA 00681 GL_ONE_MINUS_DST_ALPHA, // LSG_BM_INV_DEST_ALPHA 00682 GL_SRC_ALPHA_SATURATE, // LSG_BM_SRC_ALPHA_SAT 00683 }; 00684 00685 if ( CFndBase::m_bmSrcBlend != _bmSrc || CFndBase::m_bmDstBlend != _bmDst ) { 00686 CFndBase::m_bmSrcBlend = _bmSrc; 00687 CFndBase::m_bmDstBlend = _bmDst; 00688 ::glBlendFunc( eModes[_bmSrc], eModes[_bmDst] ); 00689 } 00690 } 00691 00697 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetFillMode( LSG_FILL_MODES /*_fmMode*/ ) { 00698 /*static const GLenum eModes[] = { 00699 GL_FILL, 00700 GL_LINE 00701 }; 00702 ::glPolygonMode( GL_FRONT_AND_BACK, eModes[_fmMode] );*/ 00703 } 00704 00710 LSE_INLINE LSBOOL LSE_FCALL COpenGlEs::BeginRender() { 00711 return true; 00712 } 00713 00717 LSE_INLINE LSVOID LSE_FCALL COpenGlEs::EndRender() { 00718 }; 00719 00725 LSE_INLINE CShaderManager * LSE_FCALL COpenGlEs::GetShaderManager() { 00726 return m_psmShaderMan; 00727 } 00728 00734 LSE_INLINE LSVOID LSE_CALL COpenGlEs::ActivateTexture( LSUINT32 _ui32Unit ) { 00735 if ( m_ui32LastActiveTexture == _ui32Unit ) { return; } 00736 m_ui32LastActiveTexture = _ui32Unit; 00737 ::glActiveTexture( GL_TEXTURE0 + m_ui32LastActiveTexture ); 00738 } 00739 00745 LSE_INLINE LSBOOL LSE_CALL COpenGlEs::NonPo2() { 00746 return CFndBase::m_mMetrics.bNonPo2; 00747 } 00748 00754 LSE_INLINE LSBOOL LSE_CALL COpenGlEs::FbosSupported() { 00755 return m_bFbos; 00756 } 00757 00763 LSE_INLINE LSUINT32 LSE_CALL COpenGlEs::MaxRenderTargetSize() { 00764 return CFndBase::m_mMetrics.ui32MaxRenderTargetSize; 00765 } 00766 00772 LSE_INLINE LSUINT32 LSE_CALL COpenGlEs::MaxTextureSize() { 00773 return CFndBase::m_mMetrics.ui32MaxTextureHeight; 00774 } 00775 00776 } // namespace lsg 00777 00778 #endif // #ifdef LSG_OGLES 00779 00780 #endif // __LSG_OPENGLES_H__