summaryrefslogtreecommitdiff
path: root/Source/Core/Common/GL/GLInterface/BGL.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-01-05 16:09:43 +0100
committerGitHub <noreply@github.com>2021-01-05 16:09:43 +0100
commiteafb9de0479f6b507063fe78d6ceeeb8343ead66 (patch)
treec8cffa23dae823f9efd82196e218ae860f116e72 /Source/Core/Common/GL/GLInterface/BGL.cpp
parent840ecfb32f0ff7e625de7bb1fa98c6259efb4640 (diff)
parent2df11d3911284c72cb9ee583945d410028178017 (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.cpp96
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());
+}