// // Copyright Contributors to the MaterialX Project // SPDX-License-Identifier: Apache-2.0 // #ifndef MATERIALX_GLCONTEXT_H #define MATERIALX_GLCONTEXT_H /// @file /// OpenGL context class #include #include #if defined(__APPLE__) #include #elif defined(__linux__) || defined(__FreeBSD__) #include #endif MATERIALX_NAMESPACE_BEGIN /// Platform dependent definition of a hardware context #if defined(_WIN32) using HardwareContextHandle = HGLRC; #elif defined(__linux__) || defined(__FreeBSD__) using HardwareContextHandle = GLXContext; #else using HardwareContextHandle = void*; #endif /// SimpleWindow shared pointer using SimpleWindowPtr = std::shared_ptr; /// GLContext shared pointer using GLContextPtr = std::shared_ptr; /// @class GLContext /// An OpenGL context singleton class MX_RENDERGLSL_API GLContext { public: /// Create a new context static GLContextPtr create(SimpleWindowPtr window, HardwareContextHandle context = {}) { return GLContextPtr(new GLContext(window, context)); } /// Default destructor virtual ~GLContext(); /// Return OpenGL context handle HardwareContextHandle contextHandle() const { return _contextHandle; } /// Return if context is valid bool isValid() const { return _isValid; } /// Make the context "current" before execution of OpenGL operations int makeCurrent(); protected: // Create the base context. A OpenGL context to share with can be passed in. GLContext(SimpleWindowPtr window, HardwareContextHandle context = 0); // Simple window SimpleWindowPtr _window; // Context handle HardwareContextHandle _contextHandle; // Flag to indicate validity bool _isValid; #if defined(__linux__) || defined(__FreeBSD__) // An X window used by context operations Window _xWindow; // An X display used by context operations Display* _xDisplay; #endif }; MATERIALX_NAMESPACE_END #endif