From 61d7295efa9d3b8ebd5452bcd082a8d09ec2924b Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 13 May 2012 15:27:20 +0200 Subject: [PATCH] Changed: #1275 Create an OpenGL ES driver --- .../driver/opengl/driver_opengl_extension.cpp | 2 +- .../driver/opengl/driver_opengl_material.cpp | 93 ++++++++++--------- .../3d/driver/opengl/driver_opengl_states.cpp | 2 - .../driver/opengl/driver_opengl_texture.cpp | 4 +- .../driver_opengl_vertex_buffer_hard.cpp | 18 ++-- .../3d/driver/opengl/driver_opengl_window.cpp | 4 +- .../nel/src/3d/driver/opengles/CMakeLists.txt | 20 +++- 7 files changed, 75 insertions(+), 68 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_extension.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_extension.cpp index 504d987c3..91d9bb1d4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_extension.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_extension.cpp @@ -1521,7 +1521,7 @@ void registerGlExtensions(CGlExtensions &ext) if(ext.NVVertexArrayRange) { - GLint nverts = 10; + GLint nverts = 10; #ifndef USE_OPENGLES glGetIntegerv((GLenum)GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV, &nverts); #endif diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp index cb41958e1..2299f48fe 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp @@ -1234,54 +1234,54 @@ void CDriverGL::setupSpecularPass(uint pass) #ifdef USE_OPENGLES #if 0 - // Ok we can do it in a single pass + // Ok we can do it in a single pass - // Set Stage 1 - // Special: not the same special env if there is or not texture in stage 0. - CTexEnvSpecial newEnvStage1; - if( mat.getTexture(0) == NULL ) - newEnvStage1= TexEnvSpecialSpecularStage1NoText; - else - newEnvStage1= TexEnvSpecialSpecularStage1; - // Test if same env as prec. - if(_CurrentTexEnvSpecial[1] != newEnvStage1) + // Set Stage 1 + // Special: not the same special env if there is or not texture in stage 0. + CTexEnvSpecial newEnvStage1; + if( mat.getTexture(0) == NULL ) + newEnvStage1= TexEnvSpecialSpecularStage1NoText; + else + newEnvStage1= TexEnvSpecialSpecularStage1; + // Test if same env as prec. + if(_CurrentTexEnvSpecial[1] != newEnvStage1) + { + // TexEnv is special. + _CurrentTexEnvSpecial[1] = newEnvStage1; + + _DriverGLStates.activeTextureARB(1); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + // Operator Add (Arg0*Arg2+Arg1) + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); + // Arg0. + glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + // Arg2. + if( newEnvStage1 == TexEnvSpecialSpecularStage1NoText) { - // TexEnv is special. - _CurrentTexEnvSpecial[1] = newEnvStage1; - - _DriverGLStates.activeTextureARB(1); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - // Operator Add (Arg0*Arg2+Arg1) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); - // Arg0. - glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - // Arg2. - if( newEnvStage1 == TexEnvSpecialSpecularStage1NoText) - { - glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_ZERO); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_COLOR); - } - else - { - glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); - } - // Arg1. - glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - // Result : Texture*Previous.Alpha+Previous - // Setup Alpha Diffuse Copy - glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - // Arg2. - glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_ALPHA, GL_ZERO); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - // Arg1. - glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_ZERO ); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_ZERO); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_COLOR); } + else + { + glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); + } + // Arg1. + glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + // Result : Texture*Previous.Alpha+Previous + // Setup Alpha Diffuse Copy + glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + // Arg2. + glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_ALPHA, GL_ZERO); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + // Arg1. + glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_ZERO ); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + } #endif #else /// Support NVidia combine 4 extension to do specular map in a single pass @@ -1398,7 +1398,8 @@ void CDriverGL::setupSpecularPass(uint pass) // We have to do it in 2 passes // For Both Pass, setup correct Env. if( pass == 0 ) - { // Just display the texture + { + // Just display the texture _DriverGLStates.enableBlend(false); _DriverGLStates.activeTextureARB(1); _DriverGLStates.setTextureMode(CDriverGLStates::TextureDisabled); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp index 81b6344b6..5d052349e 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp @@ -705,8 +705,6 @@ void CDriverGLStates::setTexGenMode (uint stage, GLint mode) } } - - // *************************************************************************** void CDriverGLStates::resetTextureMode() { diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp index d3ec9c00e..91e2a49f8 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp @@ -1613,7 +1613,7 @@ bool CDriverGL::activateTexture(uint stage, ITexture *tex) // This maps the CMaterial::TTexOperator static const GLenum OperatorLUT[9]= { GL_REPLACE, GL_MODULATE, GL_ADD, #ifdef USE_OPENGLES - GL_ADD_SIGNED, GL_INTERPOLATE, GL_INTERPOLATE, GL_INTERPOLATE, GL_INTERPOLATE + GL_ADD_SIGNED, GL_INTERPOLATE, GL_INTERPOLATE, GL_INTERPOLATE, GL_INTERPOLATE, GL_INTERPOLATE #else GL_ADD_SIGNED_EXT, GL_INTERPOLATE_EXT, GL_INTERPOLATE_EXT, GL_INTERPOLATE_EXT, GL_INTERPOLATE_EXT, GL_BUMP_ENVMAP_ATI #endif @@ -1986,7 +1986,6 @@ void CDriverGL::forceActivateTexEnvMode(uint stage, const CMaterial::CTexEnv & { // Operator. glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, OperatorLUT[env.Env.OpRGB] ); - // Arg0. glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, SourceLUT[env.Env.SrcArg0RGB] ); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, OperandLUT[env.Env.OpArg0RGB]); @@ -2038,7 +2037,6 @@ void CDriverGL::forceActivateTexEnvMode(uint stage, const CMaterial::CTexEnv & { // Operator. glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, OperatorLUT[env.Env.OpAlpha] ); - // Arg0. glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, SourceLUT[env.Env.SrcArg0Alpha] ); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, OperandLUT[env.Env.OpArg0Alpha]); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp index ba471b8dd..5845d3805 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp @@ -103,10 +103,10 @@ bool CVertexArrayRangeNVidia::allocate(uint32 size, CVertexBuffer::TPreferredM H_AUTO_OGL(CVertexArrayRangeNVidia_allocate) nlassert(_VertexArrayPtr==NULL); -#ifdef NL_OS_WINDOWS // try to allocate AGP or VRAM data. switch(vbType) { +#ifdef NL_OS_WINDOWS case CVertexBuffer::AGPPreferred: _VertexArrayPtr= nwglAllocateMemoryNV(size, 0, 0, 0.5f); break; @@ -116,12 +116,9 @@ bool CVertexArrayRangeNVidia::allocate(uint32 size, CVertexBuffer::TPreferredM else _VertexArrayPtr= nwglAllocateMemoryNV(size, 0, 0, 0.5f); break; - default: - break; - } -#elif defined(NL_OS_UNIX) && !defined(NL_OS_MAC) - switch(vbType) - { +#elif defined(NL_OS_MAC) + // TODO: implement for Mac OS X +#elif defined(NL_OS_UNIX) case CVertexBuffer::AGPPreferred: _VertexArrayPtr= nglXAllocateMemoryNV(size, 0, 0, 0.5f); break; @@ -131,11 +128,10 @@ bool CVertexArrayRangeNVidia::allocate(uint32 size, CVertexBuffer::TPreferredM else _VertexArrayPtr= nglXAllocateMemoryNV(size, 0, 0, 0.5f); break; +#endif // NL_OS_WINDOWS default: break; } -#endif // NL_OS_WINDOWS - // init the allocator. if(_VertexArrayPtr) @@ -175,7 +171,9 @@ void CVertexArrayRangeNVidia::free() #ifdef NL_OS_WINDOWS // Free special memory. nwglFreeMemoryNV(_VertexArrayPtr); -#elif defined(NL_OS_UNIX) && !defined(NL_OS_MAC) +#elif defined(NL_OS_MAC) + // TODO: implement for Mac OS X +#elif defined(NL_OS_UNIX) nglXFreeMemoryNV(_VertexArrayPtr); #endif // NL_OS_WINDOWS diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp index ff3d73a8a..6ed911b85 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -106,7 +106,7 @@ bool GlWndProc(CDriverGL *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - H_AUTO_OGL(DriverGL_WndProc) + H_AUTO_OGL(DriverGL_WndProc); // Get the driver pointer.. CDriverGL *pDriver=(CDriverGL*)GetWindowLongPtr (hWnd, GWLP_USERDATA); @@ -1567,7 +1567,7 @@ bool CDriverGL::createWindow(const GfxMode &mode) { nlwarning("3D: Couldn't allocate XClassHint"); } - + #endif // NL_OS_UNIX _win = window; diff --git a/code/nel/src/3d/driver/opengles/CMakeLists.txt b/code/nel/src/3d/driver/opengles/CMakeLists.txt index d0d792985..86b775f8b 100644 --- a/code/nel/src/3d/driver/opengles/CMakeLists.txt +++ b/code/nel/src/3d/driver/opengles/CMakeLists.txt @@ -1,3 +1,15 @@ +FIND_PACKAGE(OpenGLES) + +IF(NOT WIN32) + IF(APPLE) + FIND_LIBRARY(CARBON NAMES Carbon) + FIND_LIBRARY(COCOA NAMES Cocoa) + ELSE(APPLE) + FIND_PACKAGE(X11) + FIND_PACKAGE(XF86VidMode) + ENDIF(APPLE) +ENDIF(NOT WIN32) + SET(SOURCE_DIR ${CMAKE_SOURCE_DIR}/nel/src/3d/driver/opengl) FILE(GLOB SRC ${SOURCE_DIR}/*.cpp ${SOURCE_DIR}/*.h ${SOURCE_DIR}/*.def) @@ -8,6 +20,8 @@ IF(APPLE) SET_SOURCE_FILES_PROPERTIES(${SRC} PROPERTIES COMPILE_FLAGS "-x objective-c++") ENDIF(APPLE) +INCLUDE_DIRECTORIES(${SOURCE_DIR} ${OPENGLES_INCLUDE_DIR}) + ADD_DEFINITIONS(-DUSE_OPENGLES) IF(WIN32) @@ -18,9 +32,7 @@ ENDIF(WIN32) NL_TARGET_DRIVER(${NLDRV_OGLES_LIB} ${SRC}) -INCLUDE_DIRECTORIES(${OPENGLES_INCLUDE_DIR}) - -TARGET_LINK_LIBRARIES(${NLDRV_OGLES_LIB} nel3d nelmisc ${OPENGL_gles_LIBRARY}) +TARGET_LINK_LIBRARIES(${NLDRV_OGLES_LIB} nel3d nelmisc ${OPENGLES_LIBRARIES}) NL_DEFAULT_PROPS(${NLDRV_OGLES_LIB} "NeL, Driver, Video: OpenGL ES") NL_ADD_LIB_SUFFIX(${NLDRV_OGLES_LIB}) NL_ADD_RUNTIME_FLAGS(${NLDRV_OGLES_LIB}) @@ -28,7 +40,7 @@ NL_ADD_RUNTIME_FLAGS(${NLDRV_OGLES_LIB}) IF(WIN32) INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(${NLDRV_OGLES_LIB} ${DXSDK_DINPUT_LIBRARY} ${DXSDK_GUID_LIBRARY}) - ADD_DEFINITIONS(/DDRIVER_OPENGL_EXPORTS) + ADD_DEFINITIONS(/DDRIVER_OPENGLES_EXPORTS) ENDIF(WIN32) IF(APPLE)