diff options
| author | Léo Lam <leo@leolam.fr> | 2021-01-05 16:09:43 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-05 16:09:43 +0100 |
| commit | eafb9de0479f6b507063fe78d6ceeeb8343ead66 (patch) | |
| tree | c8cffa23dae823f9efd82196e218ae860f116e72 /Source/Core/Common/GL/GLInterface/BGL.cpp | |
| parent | 840ecfb32f0ff7e625de7bb1fa98c6259efb4640 (diff) | |
| parent | 2df11d3911284c72cb9ee583945d410028178017 (diff) | |
Merge pull request #9323 from waddlesplash/haiku
Rehabilitate Haiku support.
Diffstat (limited to 'Source/Core/Common/GL/GLInterface/BGL.cpp')
| -rw-r--r-- | Source/Core/Common/GL/GLInterface/BGL.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/Source/Core/Common/GL/GLInterface/BGL.cpp b/Source/Core/Common/GL/GLInterface/BGL.cpp new file mode 100644 index 0000000000..84ab6dda6f --- /dev/null +++ b/Source/Core/Common/GL/GLInterface/BGL.cpp @@ -0,0 +1,96 @@ +// Copyright 2017 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "Common/GL/GLInterface/BGL.h" + +#include <GLView.h> +#include <Size.h> +#include <Window.h> + +#include "Common/Assert.h" + +BGLView* GLContextBGL::s_current = nullptr; + +GLContextBGL::~GLContextBGL() +{ + if (!m_window) + delete m_gl; +} + +bool GLContextBGL::Initialize(const WindowSystemInfo& wsi, bool stereo, bool core) +{ + m_window = static_cast<BWindow*>(wsi.render_window); + + m_gl = new BGLView(m_window ? m_window->Bounds() : BRect(), "GLContextBGL", B_FOLLOW_ALL_SIDES, 0, + BGL_RGB | BGL_DOUBLE | BGL_ALPHA); + if (m_window) + m_window->AddChild(m_gl); + + m_opengl_mode = Mode::OpenGL; + + m_gl->LockLooper(); + BRect size = m_gl->Frame(); + m_gl->UnlockLooper(); + + m_backbuffer_width = size.IntegerWidth(); + m_backbuffer_height = size.IntegerHeight(); + + MakeCurrent(); + + return true; +} + +bool GLContextBGL::IsHeadless() const +{ + return m_window == nullptr; +} + +bool GLContextBGL::MakeCurrent() +{ + if (s_current) + s_current->UnlockGL(); + m_gl->LockGL(); + s_current = m_gl; + return true; +} + +bool GLContextBGL::ClearCurrent() +{ + if (!s_current) + return true; + + ASSERT(m_gl == s_current); + s_current->UnlockGL(); + s_current = nullptr; + return true; +} + +void GLContextBGL::Swap() +{ + m_gl->SwapBuffers(); +} + +void GLContextBGL::Update() +{ + m_gl->LockLooper(); + BRect size = m_gl->Frame(); + if (m_backbuffer_width == size.IntegerWidth() && m_backbuffer_height == size.IntegerHeight()) + { + m_gl->UnlockLooper(); + return; + } + + ClearCurrent(); + m_gl->FrameResized(size.Width(), size.Height()); + MakeCurrent(); + m_gl->UnlockLooper(); + + m_backbuffer_width = size.IntegerWidth(); + m_backbuffer_height = size.IntegerHeight(); +} + +void* GLContextBGL::GetFuncAddress(const std::string& name) +{ + return m_gl->GetGLProcAddress(name.c_str()); +} |
