Among other things, this enables wxGLCanvas to be used natively on Wayland. Closes https://github.com/wxWidgets/wxWidgets/pull/2038 Closes #17702.
		
			
				
	
	
		
			180 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/unix/glegl.h
 | 
						|
// Purpose:     class common for all EGL-based wxGLCanvas implementations
 | 
						|
// Author:      Scott Talbert
 | 
						|
// Created:     2017-12-26
 | 
						|
// Copyright:   (c) 2017 Scott Talbert <swt@techie.net>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_UNIX_GLEGL_H_
 | 
						|
#define _WX_UNIX_GLEGL_H_
 | 
						|
 | 
						|
#include <GL/gl.h>
 | 
						|
 | 
						|
// This is to avoid including Wayland & EGL headers here to pollute namespace
 | 
						|
struct wl_compositor;
 | 
						|
struct wl_subcompositor;
 | 
						|
struct wl_callback;
 | 
						|
struct wl_egl_window;
 | 
						|
struct wl_surface;
 | 
						|
struct wl_region;
 | 
						|
struct wl_subsurface;
 | 
						|
typedef void *EGLDisplay;
 | 
						|
typedef void *EGLConfig;
 | 
						|
typedef void *EGLSurface;
 | 
						|
typedef void *EGLContext;
 | 
						|
 | 
						|
class wxGLContextAttrs;
 | 
						|
class wxGLAttributes;
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxGLContext
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_GL wxGLContext : public wxGLContextBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGLContext(wxGLCanvas *win,
 | 
						|
                const wxGLContext *other = NULL,
 | 
						|
                const wxGLContextAttrs *ctxAttrs = NULL);
 | 
						|
    virtual ~wxGLContext();
 | 
						|
 | 
						|
    virtual bool SetCurrent(const wxGLCanvas& win) const wxOVERRIDE;
 | 
						|
 | 
						|
private:
 | 
						|
    EGLContext m_glContext;
 | 
						|
 | 
						|
    wxDECLARE_CLASS(wxGLContext);
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxGLCanvasEGL
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_GL wxGLCanvasEGL : public wxGLCanvasBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    // initialization and dtor
 | 
						|
    // -----------------------
 | 
						|
 | 
						|
    // default ctor doesn't do anything, InitConfig() must be called
 | 
						|
    wxGLCanvasEGL();
 | 
						|
 | 
						|
    // initializes EGLConfig corresponding to the given attributes
 | 
						|
    bool InitVisual(const wxGLAttributes& dispAttrs);
 | 
						|
 | 
						|
    // creates EGLSurface
 | 
						|
    bool CreateSurface();
 | 
						|
 | 
						|
    virtual ~wxGLCanvasEGL();
 | 
						|
 | 
						|
 | 
						|
    // implement wxGLCanvasBase methods
 | 
						|
    // --------------------------------
 | 
						|
 | 
						|
    virtual bool SwapBuffers() wxOVERRIDE;
 | 
						|
 | 
						|
 | 
						|
    // X11-specific methods
 | 
						|
    // --------------------
 | 
						|
 | 
						|
    // get the X11 handle of this window
 | 
						|
    virtual unsigned long GetXWindow() const = 0;
 | 
						|
 | 
						|
 | 
						|
    // override some wxWindow methods
 | 
						|
    // ------------------------------
 | 
						|
 | 
						|
    // return true only if the window is realized: OpenGL context can't be
 | 
						|
    // created until we are
 | 
						|
    virtual bool IsShownOnScreen() const wxOVERRIDE;
 | 
						|
 | 
						|
 | 
						|
    // implementation only from now on
 | 
						|
    // -------------------------------
 | 
						|
 | 
						|
    // get the EGLConfig we use
 | 
						|
    EGLConfig *GetEGLConfig() const { return m_config; }
 | 
						|
    EGLDisplay GetEGLDisplay() const { return m_display; }
 | 
						|
    EGLSurface GetEGLSurface() const { return m_surface; }
 | 
						|
 | 
						|
    static EGLDisplay GetDisplay();
 | 
						|
 | 
						|
    // initialize the global default GL config, return false if matching config
 | 
						|
    // not found
 | 
						|
    static bool InitDefaultConfig(const int *attribList);
 | 
						|
 | 
						|
    // get the default EGL Config (may be NULL, shouldn't be freed by caller)
 | 
						|
    static EGLConfig *GetDefaultConfig() { return ms_glEGLConfig; }
 | 
						|
 | 
						|
    // free the global GL visual, called by wxGLApp
 | 
						|
    static void FreeDefaultConfig();
 | 
						|
 | 
						|
    // initializes EGLConfig
 | 
						|
    //
 | 
						|
    // returns NULL if EGLConfig couldn't be initialized, otherwise caller
 | 
						|
    // is responsible for freeing the pointer
 | 
						|
    static EGLConfig *InitConfig(const wxGLAttributes& dispAttrs);
 | 
						|
 | 
						|
    bool m_readyToDraw;
 | 
						|
    wl_compositor *m_wlCompositor;
 | 
						|
    wl_subcompositor *m_wlSubcompositor;
 | 
						|
    wl_callback *m_wlFrameCallbackHandler;
 | 
						|
    wl_egl_window *m_wlEGLWindow;
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
    EGLConfig *m_config;
 | 
						|
    EGLDisplay m_display;
 | 
						|
    EGLSurface m_surface;
 | 
						|
 | 
						|
    unsigned long m_xwindow;
 | 
						|
    wl_surface *m_wlSurface;
 | 
						|
    wl_region *m_wlRegion;
 | 
						|
    wl_subsurface *m_wlSubsurface;
 | 
						|
 | 
						|
    // the global/default versions of the above
 | 
						|
    static EGLConfig *ms_glEGLConfig;
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxGLApp
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
// this is used in wx/glcanvas.h, prevent it from defining a generic wxGLApp
 | 
						|
#define wxGL_APP_DEFINED
 | 
						|
 | 
						|
class WXDLLIMPEXP_GL wxGLApp : public wxGLAppBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGLApp() : wxGLAppBase() { }
 | 
						|
 | 
						|
    // implement wxGLAppBase method
 | 
						|
    virtual bool InitGLVisual(const int *attribList) wxOVERRIDE
 | 
						|
    {
 | 
						|
        return wxGLCanvasEGL::InitDefaultConfig(attribList);
 | 
						|
    }
 | 
						|
 | 
						|
    // This method is not currently used by the library itself, but remains for
 | 
						|
    // backwards compatibility and also because wxGTK has it we could start
 | 
						|
    // using it for the same purpose in wxX11 too some day.
 | 
						|
    virtual void* GetXVisualInfo() wxOVERRIDE
 | 
						|
    {
 | 
						|
        return wxGLCanvasEGL::GetDefaultConfig();
 | 
						|
    }
 | 
						|
 | 
						|
    // and override this wxApp method to clean up
 | 
						|
    virtual int OnExit() wxOVERRIDE
 | 
						|
    {
 | 
						|
        wxGLCanvasEGL::FreeDefaultConfig();
 | 
						|
 | 
						|
        return wxGLAppBase::OnExit();
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    wxDECLARE_DYNAMIC_CLASS(wxGLApp);
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_UNIX_GLEGL_H_
 |