1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/unix/glx11.h
3 // Purpose:     class common for all X11-based wxGLCanvas implementations
4 // Author:      Vadim Zeitlin
5 // Created:     2007-04-15
6 // Copyright:   (c) 2007 Vadim Zeitlin <vadim@wxwindows.org>
7 // Licence:     wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_UNIX_GLX11_H_
11 #define _WX_UNIX_GLX11_H_
12 
13 #include <GL/glx.h>
14 
15 // ----------------------------------------------------------------------------
16 // wxGLContext
17 // ----------------------------------------------------------------------------
18 
19 class WXDLLIMPEXP_GL wxGLContext : public wxGLContextBase
20 {
21 public:
22     wxGLContext(wxGLCanvas *win, const wxGLContext *other = NULL);
23     virtual ~wxGLContext();
24 
25     virtual bool SetCurrent(const wxGLCanvas& win) const;
26 
27 private:
28     // attach context to the drawable or unset it (if NULL)
29     static bool MakeCurrent(GLXDrawable drawable, GLXContext context);
30 
31     GLXContext m_glContext;
32 
33     DECLARE_CLASS(wxGLContext)
34 };
35 
36 // ----------------------------------------------------------------------------
37 // wxGLCanvasX11
38 // ----------------------------------------------------------------------------
39 
40 class WXDLLIMPEXP_GL wxGLCanvasX11 : public wxGLCanvasBase
41 {
42 public:
43     // initialization and dtor
44     // -----------------------
45 
46     // default ctor doesn't do anything, InitVisual() must be called
47     wxGLCanvasX11();
48 
49     // initializes the XVisualInfo corresponding to the given attributes
50     bool InitVisual(const int *attribList);
51 
52     // frees XVisualInfo info
53     virtual ~wxGLCanvasX11();
54 
55 
56     // implement wxGLCanvasBase methods
57     // --------------------------------
58 
59     virtual bool SwapBuffers();
60 
61 
62     // X11-specific methods
63     // --------------------
64 
65     // return GLX version: 13 means 1.3 &c
66     static int GetGLXVersion();
67 
68     // return true if multisample extension is available
69     static bool IsGLXMultiSampleAvailable();
70 
71     // get the X11 handle of this window
72     virtual Window GetXWindow() const = 0;
73 
74 
75     // override some wxWindow methods
76     // ------------------------------
77 
78     // return true only if the window is realized: OpenGL context can't be
79     // created until we are
80     virtual bool IsShownOnScreen() const;
81 
82 
83     // implementation only from now on
84     // -------------------------------
85 
86     // get the GLXFBConfig/XVisualInfo we use
GetGLXFBConfig()87     GLXFBConfig *GetGLXFBConfig() const { return m_fbc; }
GetXVisualInfo()88     XVisualInfo *GetXVisualInfo() const { return m_vi; }
89 
90     // initialize the global default GL visual, return false if matching visual
91     // not found
92     static bool InitDefaultVisualInfo(const int *attribList);
93 
94     // get the default GL X11 visual (may be NULL, shouldn't be freed by caller)
GetDefaultXVisualInfo()95     static XVisualInfo *GetDefaultXVisualInfo() { return ms_glVisualInfo; }
96 
97     // free the global GL visual, called by wxGLApp
98     static void FreeDefaultVisualInfo();
99 
100     // initializes XVisualInfo (in any case) and, if supported, GLXFBConfig
101     //
102     // returns false if XVisualInfo couldn't be initialized, otherwise caller
103     // is responsible for freeing the pointers
104     static bool InitXVisualInfo(const int *attribList,
105                                 GLXFBConfig **pFBC, XVisualInfo **pXVisual);
106 
107 private:
108     // fills in glattrs with attributes defined by wxattrs which must be
109     // 0-terminated if it is non-NULL
110     //
111     // n is the max size of glattrs, false is returned if we overflow it, it
112     // should be at least 16 to accommodate the default attributes
113     static bool ConvertWXAttrsToGL(const int *wxattrs, int *glattrs, size_t n);
114 
115 
116     // this is only used if it's supported i.e. if GL >= 1.3
117     GLXFBConfig *m_fbc;
118 
119     // used for all GL versions, obtained from GLXFBConfig for GL >= 1.3
120     XVisualInfo *m_vi;
121 
122     // the global/default versions of the above
123     static GLXFBConfig *ms_glFBCInfo;
124     static XVisualInfo *ms_glVisualInfo;
125 };
126 
127 // ----------------------------------------------------------------------------
128 // wxGLApp
129 // ----------------------------------------------------------------------------
130 
131 // this is used in wx/glcanvas.h, prevent it from defining a generic wxGLApp
132 #define wxGL_APP_DEFINED
133 
134 class WXDLLIMPEXP_GL wxGLApp : public wxGLAppBase
135 {
136 public:
wxGLApp()137     wxGLApp() : wxGLAppBase() { }
138 
139     // implement wxGLAppBase method
InitGLVisual(const int * attribList)140     virtual bool InitGLVisual(const int *attribList)
141     {
142         return wxGLCanvasX11::InitDefaultVisualInfo(attribList);
143     }
144 
145     // and implement this wxGTK::wxApp method too
GetXVisualInfo()146     virtual void *GetXVisualInfo()
147     {
148         return wxGLCanvasX11::GetDefaultXVisualInfo();
149     }
150 
151     // and override this wxApp method to clean up
OnExit()152     virtual int OnExit()
153     {
154         wxGLCanvasX11::FreeDefaultVisualInfo();
155 
156         return wxGLAppBase::OnExit();
157     }
158 
159 private:
160     DECLARE_DYNAMIC_CLASS(wxGLApp)
161 };
162 
163 #endif // _WX_UNIX_GLX11_H_
164 
165