sepperate extern "c" funktionen per Objekt



  • Ich habe eine auf SDL2 aufbauende Lib gebastelt die alle OpenGL Funktionen läd. (alle mir bekannten libs wie GLEW sind zu verbugt und SDL2 eigene Implementierung ist nicht vollständig)

    So schaut es bisher aus und funktioniert wunderbar (leicht gekürzt da es über 2800 Funktionen sind):

    #ifndef GLFUNCTIONS_HPP
    #define GLFUNCTIONS_HPP
    //#include "glTypes.hpp"
    typedef int GLenum;
    typedef float GLfloat;
    
    typedef void  (*PFNGLACCUMPROC)(GLenum op, GLfloat value);
    
    extern "C" PFNGLACCUMPROC glAccum;
    
    void loadFunctionPointers();
    
    #endif
    
    #include "glFunctions.hpp"
    //#include "SDL_video.h"
    
    PFNGLACCUMPROC glAccum;
    
    void loadFunctionPointers()
    {
        glAccum = reinterpret_cast<PFNGLACCUMPROC>(NULL/*SDL_GL_GetProcAddress("glAccum")*/);
    }
    

    Unter Windows kann nun jeder OpenGL Context sepperate Funktionszeiger haben. Und nun suche ich einen Weg wie ich die Funktionen schön in Objekte verpacken könnte.
    Man kann keine extern "C" in Klassen definieren, auch Funktionszeiger kann man nur statisch definieren. Und daher bin ich mir nicht sicher ob es überhaupt möglich ist.

    In meine Wunschvorstellung sehe die zukünftige Benutzung dann folgendermaßen aus:

    glFunctionClass glf1, glf2;
    
    void thread1
    {
        createGlContext();
        glf1.loadFunctionPointers();
        glf1.glAccum(GL_ACCUM, 0.0f);
    }
    void thread2
    {
        createGlContext();
        glf2.loadFunctionPointers();
        glf2.glAccum(GL_ACCUM, 0.0f);
    }
    


  • Du hast keine extern "C" Funktionen, du hast einen extern "C" Funktionszeiger.
    Und Funktionszeiger kannste problemlos in Klassen packen.
    Alternativ kannste auch einfach die ganzen Funktionszeiger als thread_local markieren.



  • Nathan schrieb:

    Du hast keine extern "C" Funktionen, du hast einen extern "C" Funktionszeiger.
    Und Funktionszeiger kannste problemlos in Klassen packen.

    Hört sich vielversprechend an.
    Folgender Code lässt sich leider nicht compilen:

    #ifndef GLFUNCTIONS_HPP
    #define GLFUNCTIONS_HPP
    //#include "glTypes.hpp"
    typedef int GLenum;
    typedef float GLfloat;
    
    typedef void  (*PFNGLACCUMPROC)(GLenum op, GLfloat value);
    
    class glFunctionClass
    {
        void loadFunctionPointers();
        extern "C" PFNGLACCUMPROC glAccum;
    };
    
    #endif
    
    #include "glFunctions.hpp"
    //#include "SDL_video.h"
    
    PFNGLACCUMPROC glFunctionClass::glAccum;
    
    void glFunctionClass::loadFunctionPointers()
    {
        glAccum = reinterpret_cast<PFNGLACCUMPROC>(NULL/*SDL_GL_GetProcAddress("glAccum")*/);
    }
    
    In file included from /home/osbios/dev/glBase/testIt/glFunctions.cpp:1:0:
    /home/osbios/dev/glBase/testIt/glFunctions.hpp:12:12: error: expected unqualified-id before string constant
         extern "C" PFNGLACCUMPROC glAccum;
                ^
    /home/osbios/dev/glBase/testIt/glFunctions.cpp:4:33: error: ‘void (* glFunctionClass::glAccum)(GLenum, GLfloat)’ is not a static member of ‘class glFunctionClass’
     PFNGLACCUMPROC glFunctionClass::glAccum;
                                     ^
    /home/osbios/dev/glBase/testIt/glFunctions.cpp: In member function ‘void glFunctionClass::loadFunctionPointers()’:
    /home/osbios/dev/glBase/testIt/glFunctions.cpp:8:5: error: ‘glAccum’ was not declared in this scope
         glAccum = reinterpret_cast<PFNGLACCUMPROC>(NULL/*SDL_GL_GetProcAddress("glAccum")*/);
         ^
    /home/osbios/dev/glBase/testIt/glFunctions.cpp:8:48: error: ‘NULL’ was not declared in this scope
         glAccum = reinterpret_cast<PFNGLACCUMPROC>(NULL/*SDL_GL_GetProcAddress("glAccum")*/);
                                                    ^
    make[2]: *** [CMakeFiles/testIt.dir/glFunctions.cpp.o] Fehler 1
    make[1]: *** [CMakeFiles/testIt.dir/all] Fehler 2
    make: *** [all] Fehler 2
    


  • typedef int GLenum;
    typedef float GLfloat;
    
    extern "C" typedef void  ( *PFNGLACCUMPROC )( GLenum op, GLfloat value );
    
    class glFunctionClass
    {
        PFNGLACCUMPROC glAccum;
    
    	public:
    		void loadFunctionPointers();
    };
    
    void glFunctionClass::loadFunctionPointers()
    {
        glAccum = reinterpret_cast< PFNGLACCUMPROC >( nullptr /* SDL_GL_GetProcAddress( "glAccum" ) */ );
    }
    
    int main()
    {
    	glFunctionClass gl;
    	gl.loadFunctionPointers();
    }
    


  • Funktioniert wunderbar! Danke!


Anmelden zum Antworten