Changeset 311


Ignore:
Timestamp:
08/14/14 21:21:39 (11 years ago)
Author:
epyon
Message:
  • full OpenGL extension loading mechanisms
  • framebuffer_object and framebuffer_blit extension defs added
  • minor fixes
Location:
trunk
Files:
8 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/common.hh

    r270 r311  
    140140#define NV_RETURN_COVERED_DEFAULT( value ) default : return value
    141141#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) )
    142145
    143146namespace nv
  • trunk/nv/lib/detail/gl_functions.inc

    r229 r311  
    180180NV_GL_FUN_EXT( void , glUniformMatrix4x3fv , ( GLint , GLsizei , GLboolean , const GLfloat *) );
    181181
    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  
    5454#include <nv/lib/detail/wgl_types.inc>
    5555#endif
     56#include <nv/lib/detail/gl_ext/gl_ext_all_types.inc>
    5657
    5758#if defined(NV_GL_DYNAMIC)
     
    6768#include <nv/lib/detail/wgl_functions.inc>
    6869#endif
     70#include <nv/lib/detail/gl_ext/gl_ext_all_functions.inc>
    6971
    7072#undef NV_GL_FUN_REN
     
    7577
    7678namespace 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 );
    7896        bool load_gl_no_context( const char* path = NV_GL_PATH );
     97        /* Dynamic load support */
    7998#       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 );
    82101#       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; }
    85104#       endif
    86105}
  • trunk/nv/logging.hh

    r256 r311  
    5656#define NV_LOG(level, message_stream) \
    5757        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 ) \
    5959        {       \
    6060                std::stringstream ss; \
     
    6666#define NV_DEBUG_LOG(level, message_stream) \
    6767        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 ) \
    6969        {       \
    7070                std::stringstream ss; \
  • trunk/src/gl/gl_context.cc

    r303 r311  
    612612        }     
    613613
     614        load_gl_library( NV_GL_PATH, true );
     615        load_wgl_library( NV_GL_PATH, true );
    614616        m_handle = (void*)handle;
    615617#else
  • trunk/src/lib/gl.cc

    r245 r311  
    66
    77#include "nv/common.hh"
     8#include "nv/range.hh"
    89#include "nv/lib/gl.hh"
    910
     
    3334#include <nv/lib/detail/wgl_functions.inc>
    3435#endif
     36#include <nv/lib/detail/gl_ext/gl_ext_all_functions.inc>
    3537#undef NV_GL_FUN_REN
    3638#undef NV_GL_FUN_EXT
     
    3840
    3941static nv::library gl_library;
     42static nv::gl_extensions gl_loaded_extensions = nv::gl_extensions(0);
     43extern "C" void* (NV_GL_APIENTRY *gl_ext_loader) ( const char* ) = nullptr;
    4044static bool gl_library_loaded = false;
    4145static bool wgl_library_loaded = false;
    4246
    43 bool nv::load_gl_library( const char* path )
    44 {
    45         if ( gl_library_loaded ) return true;
     47static 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
     54static 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
     62static 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
     69static 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
     84bool nv::load_gl_library( const char* path, bool force_reload )
     85{
     86        if ( gl_library_loaded && !force_reload ) return true;
    4687#if defined( NV_SDL_GL )
    4788#               define NV_GL_LOAD( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol);
    4889#               define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol);
     90        *(void **) (&gl_ext_loader) = SDL_GL_GetProcAddress;
    4991#else
    5092        if ( !gl_library.is_open() ) gl_library.open( path );
    5193
    52         void * (NV_GL_APIENTRY *ext_loader) (const char* proc) = nullptr;
    5394#       if NV_PLATFORM == NV_WINDOWS
    5495#               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);
    5798#       elif (NV_PLATFORM == NV_LINUX || NV_PLATFORM == NV_APPLE)
    5899#               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);
    61102#       else
    62103#               define NV_GL_LOAD( symbol ) *(void **) (&symbol) = gl_library.get(#symbol);
     
    77118}
    78119
    79 bool nv::load_wgl_library( const char* path /*= NV_GL_PATH */ )
    80 {
    81         if ( wgl_library_loaded ) return true;
     120bool nv::load_wgl_library( const char* path /*= NV_GL_PATH */, bool force_reload )
     121{
     122        if ( wgl_library_loaded && !force_reload ) return true;
    82123#if NV_PLATFORM == NV_WINDOWS
    83124#if defined( NV_SDL_GL )
     
    85126#               define NV_GL_LOAD_EXT( symbol ) *(void **) (&symbol) = SDL_GL_GetProcAddress(#symbol);
    86127#           define NV_GL_LOAD_REN( fname, rname )  *(void **) (&rname) = SDL_GL_GetProcAddress(#fname);
     128        (void **) (&gl_ext_loader) = SDL_GL_GetProcAddress;
    87129#else //
    88130        if ( !gl_library.is_open() ) gl_library.open( path );
    89131
    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");
    92133#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);
    94135#define NV_GL_LOAD_REN( fname, rname ) *(void **) (&rname) = gl_library.get(#fname);
    95136#endif
     
    186227}
    187228
     229const 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
     238bool 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
     287nv::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
     297bool nv::is_gl_extension_loaded( gl_extensions extensions )
     298{
     299        return ( gl_loaded_extensions & extensions ) != 0;
     300}
     301
     302bool 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.