Changeset 311
- Timestamp:
- 08/14/14 21:21:39 (11 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/common.hh
r270 r311 140 140 #define NV_RETURN_COVERED_DEFAULT( value ) default : return value 141 141 #endif 142 143 #define NV_COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) 144 #define NV_SAFE_ARRAY( arr, idx, def ) ( index < NV_COUNT_OF(arr) ? (arr)[idx] : (def) ) 142 145 143 146 namespace nv -
trunk/nv/lib/detail/gl_functions.inc
r229 r311 180 180 NV_GL_FUN_EXT( void , glUniformMatrix4x3fv , ( GLint , GLsizei , GLboolean , const GLfloat *) ); 181 181 182 /* GL_EXT_FRAMEBUFFER */183 NV_GL_FUN_EXT( void , glBindFramebuffer , ( GLenum , GLuint ) );184 NV_GL_FUN_EXT( void , glBindRenderbuffer , ( GLenum , GLuint ) );185 NV_GL_FUN_EXT( GLenum , glCheckFramebufferStatus , ( GLenum ) );186 NV_GL_FUN_EXT( void , glDeleteFramebuffers , ( GLsizei , const GLuint*) );187 NV_GL_FUN_EXT( void , glDeleteRenderbuffers , ( GLsizei , const GLuint*) );188 NV_GL_FUN_EXT( void , glFramebufferRenderbuffer , ( GLenum , GLenum , GLenum , GLuint ) );189 NV_GL_FUN_EXT( void , glFramebufferTexture1D , ( GLenum , GLenum , GLenum , GLuint , GLint ) );190 NV_GL_FUN_EXT( void , glFramebufferTexture2D , ( GLenum , GLenum , GLenum , GLuint , GLint ) );191 NV_GL_FUN_EXT( void , glFramebufferTexture3D , ( GLenum , GLenum , GLenum , GLuint , GLint , GLint ) );192 NV_GL_FUN_EXT( void , glGenFramebuffers , ( GLsizei , GLuint* ) );193 NV_GL_FUN_EXT( void , glGenRenderbuffers , ( GLsizei , GLuint* ) );194 NV_GL_FUN_EXT( void , glGenerateMipmap , ( GLenum ) );195 NV_GL_FUN_EXT( void , glGetFramebufferAttachmentParameteriv , ( GLenum , GLenum , GLenum , GLint* ) );196 NV_GL_FUN_EXT( void , glGetRenderbufferParameteriv , ( GLenum , GLenum , GLint* ) );197 NV_GL_FUN_EXT( GLboolean , glIsFramebuffer , ( GLuint ) );198 NV_GL_FUN_EXT( GLboolean , glIsRenderbuffer , ( GLuint ) );199 NV_GL_FUN_EXT( void , glRenderbufferStorage , ( GLenum , GLenum , GLsizei , GLsizei ) );200 // NV_GL_FUN_EXT( void , glBlitFramebuffer , ( GLint , GLint , GLint , GLint , GLint , GLint , GLint , GLint , GLbitfield , GLenum ) );201 // NV_GL_FUN_EXT( void , glFramebufferTextureLayer , ( GLenum , GLenum , GLuint , GLint , GLint ) );202 // NV_GL_FUN_EXT( void , glRenderbufferStorageMultisample , ( GLenum , GLsizei , GLenum , GLsizei , GLsizei ) );203 204 -
trunk/nv/lib/gl.hh
r245 r311 54 54 #include <nv/lib/detail/wgl_types.inc> 55 55 #endif 56 #include <nv/lib/detail/gl_ext/gl_ext_all_types.inc> 56 57 57 58 #if defined(NV_GL_DYNAMIC) … … 67 68 #include <nv/lib/detail/wgl_functions.inc> 68 69 #endif 70 #include <nv/lib/detail/gl_ext/gl_ext_all_functions.inc> 69 71 70 72 #undef NV_GL_FUN_REN … … 75 77 76 78 namespace nv { 77 /* Dynamic load support */ 79 80 enum gl_extensions 81 { 82 EXT_NONE = 0, 83 #define NV_GL_EXTENSION( count, id, name ) GL_EXT_##id = 1u << (count-1), 84 #include <nv/lib/detail/gl_ext/gl_ext_info.inc> 85 #undef NV_GL_EXTENSION 86 // EXT_PIXEL_BUFFER_OBJECT = 0x00000004, 87 // EXT_TEXTURE_CUBE_MAP = 0x00000008, 88 // EXT_TEXTURE_3D = 0x00000010, 89 }; 90 91 const char* get_gl_extension_name( gl_extensions extension ); 92 bool load_gl_extension( gl_extensions extension ); 93 gl_extensions load_gl_extensions( uint32 extensions ); 94 bool is_gl_extension_loaded( gl_extensions extensions ); 95 bool are_gl_extensions_loaded( uint32 extensions ); 78 96 bool load_gl_no_context( const char* path = NV_GL_PATH ); 97 /* Dynamic load support */ 79 98 # if defined( NV_GL_DYNAMIC ) 80 bool load_gl_library( const char* path = NV_GL_PATH );81 bool load_wgl_library( const char* path = NV_GL_PATH );99 bool load_gl_library( const char* path = NV_GL_PATH, bool force_reload = false ); 100 bool load_wgl_library( const char* path = NV_GL_PATH, bool force_reload = false ); 82 101 # else 83 inline bool load_gl_library( const char* path = "") { return true; }84 inline bool load_wgl_library( const char* path = "") { return true; }102 inline bool load_gl_library( const char* = "", bool = false ) { return true; } 103 inline bool load_wgl_library( const char* = "", bool = false ) { return true; } 85 104 # endif 86 105 } -
trunk/nv/logging.hh
r256 r311 56 56 #define NV_LOG(level, message_stream) \ 57 57 if ( nv::logger_base::is_valid() && \ 58 (unsigned int)nv::logger_base::reference().get_level() >= level ) \58 (unsigned int)nv::logger_base::reference().get_level() >= (unsigned int)level ) \ 59 59 { \ 60 60 std::stringstream ss; \ … … 66 66 #define NV_DEBUG_LOG(level, message_stream) \ 67 67 if ( nv::logger_base::is_valid() && \ 68 (unsigned int)nv::logger_base::reference().get_level() >= level ) \68 (unsigned int)nv::logger_base::reference().get_level() >= (unsigned int)level ) \ 69 69 { \ 70 70 std::stringstream ss; \ -
trunk/src/gl/gl_context.cc
r303 r311 612 612 } 613 613 614 load_gl_library( NV_GL_PATH, true ); 615 load_wgl_library( NV_GL_PATH, true ); 614 616 m_handle = (void*)handle; 615 617 #else -
trunk/src/lib/gl.cc
r245 r311 6 6 7 7 #include "nv/common.hh" 8 #include "nv/range.hh" 8 9 #include "nv/lib/gl.hh" 9 10 … … 33 34 #include <nv/lib/detail/wgl_functions.inc> 34 35 #endif 36 #include <nv/lib/detail/gl_ext/gl_ext_all_functions.inc> 35 37 #undef NV_GL_FUN_REN 36 38 #undef NV_GL_FUN_EXT … … 38 40 39 41 static nv::library gl_library; 42 static nv::gl_extensions gl_loaded_extensions = nv::gl_extensions(0); 43 extern "C" void* (NV_GL_APIENTRY *gl_ext_loader) ( const char* ) = nullptr; 40 44 static bool gl_library_loaded = false; 41 45 static bool wgl_library_loaded = false; 42 46 43 bool nv::load_gl_library( const char* path ) 44 { 45 if ( gl_library_loaded ) return true; 47 static const char *gl_extension_names[] = { 48 "UNKNOWN", 49 #define NV_GL_EXTENSION( count, id, name ) "GL_EXT_"#id, 50 #include <nv/lib/detail/gl_ext/gl_ext_info.inc> 51 #undef NV_GL_EXTENSION 52 }; 53 54 static const char *gl_extension_ids[] = { 55 "UNKNOWN", 56 #define NV_GL_EXTENSION( count, id, name ) #id, 57 #include <nv/lib/detail/gl_ext/gl_ext_info.inc> 58 #undef NV_GL_EXTENSION 59 }; 60 61 62 static void* load_gl_ext_symbol_impl( const char* name, nv::log_level fail_level = nv::LOG_DEBUG ) 63 { 64 void* result = gl_ext_loader( name ); 65 NV_LOG( ( result ? nv::LOG_DEBUG : fail_level ), "load_gl_ext_symbol : " << name << ( result ? " succeded." : "failed." ) ); 66 return result; 67 } 68 69 static void* load_gl_ext_symbol( const char* name, bool iterate, const char* ext ) 70 { 71 void * result = nullptr; 72 result = load_gl_ext_symbol_impl( ext ? ( std::string(name) + ext ).c_str() : name ); 73 if ( result ) return result; 74 if ( iterate ) 75 { 76 result = gl_ext_loader( (std::string(name) + "ARB").c_str() ); 77 if ( result ) return result; 78 result = gl_ext_loader( (std::string(name) + "EXT").c_str() ); 79 if ( result ) return result; 80 } 81 return result; 82 } 83 84 bool nv::load_gl_library( const char* path, bool force_reload ) 85 { 86 if ( gl_library_loaded && !force_reload ) return true; 46 87 #if defined( NV_SDL_GL ) 47 88 # define NV_GL_LOAD( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol); 48 89 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol); 90 *(void **) (&gl_ext_loader) = SDL_GL_GetProcAddress; 49 91 #else 50 92 if ( !gl_library.is_open() ) gl_library.open( path ); 51 93 52 void * (NV_GL_APIENTRY *ext_loader) (const char* proc) = nullptr;53 94 # if NV_PLATFORM == NV_WINDOWS 54 95 # define NV_GL_LOAD( symbol ) *(void **) (&symbol) = gl_library.get(#symbol); 55 *(void **) (& ext_loader) = gl_library.get("wglGetProcAddress");56 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = ext_loader(#symbol);96 *(void **) (&gl_ext_loader) = gl_library.get("wglGetProcAddress"); 97 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = gl_ext_loader(#symbol); 57 98 # elif (NV_PLATFORM == NV_LINUX || NV_PLATFORM == NV_APPLE) 58 99 # define NV_GL_LOAD( symbol ) *(void **) (&symbol) = gl_library.get(#symbol); 59 *(void **) (& ext_loader) = gl_library.get("glXGetProcAddress");60 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = ext_loader(#symbol);100 *(void **) (&gl_ext_loader) = gl_library.get("glXGetProcAddress"); 101 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = gl_ext_loader(#symbol); 61 102 # else 62 103 # define NV_GL_LOAD( symbol ) *(void **) (&symbol) = gl_library.get(#symbol); … … 77 118 } 78 119 79 bool nv::load_wgl_library( const char* path /*= NV_GL_PATH */ )80 { 81 if ( wgl_library_loaded ) return true;120 bool nv::load_wgl_library( const char* path /*= NV_GL_PATH */, bool force_reload ) 121 { 122 if ( wgl_library_loaded && !force_reload ) return true; 82 123 #if NV_PLATFORM == NV_WINDOWS 83 124 #if defined( NV_SDL_GL ) … … 85 126 # define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol); 86 127 # define NV_GL_LOAD_REN( fname, rname ) *(void **) (&rname) = SDL_GL_GetProcAddress(#fname); 128 (void **) (&gl_ext_loader) = SDL_GL_GetProcAddress; 87 129 #else // 88 130 if ( !gl_library.is_open() ) gl_library.open( path ); 89 131 90 void * (NV_GL_APIENTRY *ext_loader) (const char* proc) = nullptr; 91 *(void **) (&ext_loader) = gl_library.get("wglGetProcAddress"); 132 *(void **) (&gl_ext_loader) = gl_library.get("wglGetProcAddress"); 92 133 #define NV_GL_LOAD( symbol ) *(void **) (&symbol) = gl_library.get(#symbol); 93 #define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = ext_loader(#symbol);134 #define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = gl_ext_loader(#symbol); 94 135 #define NV_GL_LOAD_REN( fname, rname ) *(void **) (&rname) = gl_library.get(#fname); 95 136 #endif … … 186 227 } 187 228 229 const char* nv::get_gl_extension_name( gl_extensions extension ) 230 { 231 uint32 value = uint32( extension ); 232 uint32 index = 0; 233 while ( value >>= 1 ) index++; 234 return NV_SAFE_ARRAY(gl_extension_names, index+1, gl_extension_names[0] ); 235 } 236 237 238 bool nv::load_gl_extension( gl_extensions extension ) 239 { 240 const char* name = get_gl_extension_name( extension ); 241 // TODO: first check for support using gl mechanisms 242 // see SDL 2.0 SDL_video.c 243 if ( !gl_library.is_open() ) 244 { 245 NV_LOG( nv::LOG_ERROR, "load_gl_extension used, while gl_library was closed!" ); 246 return false; 247 } 248 249 if ( gl_ext_loader == nullptr ) 250 { 251 NV_LOG( nv::LOG_ERROR, "load_gl_extension used, while gl_ext_loader was undefined!" ); 252 return false; 253 } 254 NV_LOG( nv::LOG_DEBUG, "load_gl_extension - loading extension - \"" << name << "\"..." ); 255 256 uint32 count = 0; 257 uint32 fail_count = 0; 258 259 # define NV_GL_FUN_EXT( rtype, symbol, fparams ) \ 260 *(void **) (&symbol) = load_gl_ext_symbol(#symbol, true, nullptr); \ 261 count++; if ( !symbol ) fail_count++; 262 263 switch ( extension ) 264 { 265 case GL_EXT_FRAMEBUFFER_BLIT : { 266 #include <nv/lib/detail/gl_ext/gl_ext_framebuffer_blit_functions.inc> 267 } break; 268 case GL_EXT_FRAMEBUFFER_OBJECT : { 269 #include <nv/lib/detail/gl_ext/gl_ext_framebuffer_object_functions.inc> 270 } break; 271 default : { 272 NV_LOG( nv::LOG_ERROR, "load_gl_extension - unknown extension \"" << name << "\"!" ); 273 return nullptr; 274 } 275 } 276 # undef NV_GL_FUN_EXT 277 278 if ( fail_count == 0 ) 279 { 280 NV_LOG( nv::LOG_NOTICE, "load_gl_extension - extension \"" << name << "\" loaded (" << count << " symbols)" ); 281 return false; 282 } 283 NV_LOG( nv::LOG_NOTICE, "load_gl_extension - failed to load extension \"" << name << "\" (" << count << "/" << fail_count << " symbols loaded)" ); 284 return true; 285 } 286 287 nv::gl_extensions nv::load_gl_extensions( uint32 extensions ) 288 { 289 gl_extensions result = gl_extensions(0); 290 for ( auto ext : nv::bits( gl_extensions(extensions) ) ) 291 { 292 if ( load_gl_extension(ext) ) result = gl_extensions( result | ext ); 293 } 294 return result; 295 } 296 297 bool nv::is_gl_extension_loaded( gl_extensions extensions ) 298 { 299 return ( gl_loaded_extensions & extensions ) != 0; 300 } 301 302 bool nv::are_gl_extensions_loaded( uint32 extensions ) 303 { 304 for ( auto ext : nv::bits( gl_extensions(extensions) ) ) 305 { 306 if ( !is_gl_extension_loaded(ext) ) return false; 307 } 308 return true; 309 } 310
Note: See TracChangeset
for help on using the changeset viewer.