Files
NazaraEngine/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp
Jérôme Leclercq d05df45cb6 Fix EGL context sharing
It seems contexts must be part of the same display to be shared, and that using default display with window isn't an issue on Windows/X11
2020-09-02 15:40:57 +02:00

81 lines
2.4 KiB
C++

// Copyright (C) 2020 Jérôme Leclercq
// This file is part of the "Nazara Engine - OpenGL Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_OPENGLRENDERER_EGLCONTEXT_HPP
#define NAZARA_OPENGLRENDERER_EGLCONTEXT_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Core/DynLib.hpp>
#include <Nazara/Platform/WindowHandle.hpp>
#include <Nazara/OpenGLRenderer/Config.hpp>
#include <Nazara/OpenGLRenderer/Wrapper/Context.hpp>
#include <Nazara/OpenGLRenderer/Wrapper/EGL/EGLFunctions.hpp>
#include <string>
#include <type_traits>
#include <unordered_set>
namespace Nz::GL
{
class EGLLoader;
// This class isn't called EGLContext to prevent a conflict with EGLContext from EGL
class NAZARA_OPENGLRENDERER_API EGLContextBase : public Context
{
public:
inline EGLContextBase(const OpenGLDevice* device, const EGLLoader& loader);
EGLContextBase(const EGLContextBase&) = delete;
EGLContextBase(EGLContextBase&&) = delete;
~EGLContextBase();
virtual bool Create(const ContextParams& params, const EGLContextBase* shareContext = nullptr);
virtual bool Create(const ContextParams& params, WindowHandle window, const EGLContextBase* shareContext = nullptr);
virtual void Destroy();
void EnableVerticalSync(bool enabled) override;
inline bool HasPlatformExtension(const std::string& str) const;
void SwapBuffers() override;
EGLContextBase& operator=(const EGLContextBase&) = delete;
EGLContextBase& operator=(EGLContextBase&&) = delete;
protected:
bool BindAPI();
bool ChooseConfig(EGLConfig* configs, std::size_t maxConfigCount, std::size_t* configCount);
bool CreateInternal(EGLConfig config, const EGLContextBase* shareContext = nullptr);
bool InitDisplay();
const EGLLoader& m_loader;
EGLDisplay m_display;
EGLSurface m_surface;
private:
bool ImplementFallback(const std::string_view& function) override;
bool Activate() const override;
void Desactivate() const override;
const Loader& GetLoader() override;
bool LoadEGLExt();
struct Fallback
{
using glClearDepthProc = void(*)(double depth);
glClearDepthProc glClearDepth;
};
Fallback fallbacks; //< m_ omitted
std::unordered_set<std::string> m_supportedPlatformExtensions;
EGLContext m_handle;
bool m_ownsDisplay;
};
}
#include <Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.inl>
#endif