Files
MapLibreParticleLab/platform/glfw/glfw_gl_backend.cpp
2026-09-01 18:35:29 +03:00

104 lines
2.4 KiB
C++

#include "glfw_gl_backend.hpp"
#include <mln/gfx/backend_scope.hpp>
#include <mln/gl/renderable_resource.hpp>
#include <mln/util/instrumentation.hpp>
#include <GLFW/glfw3.h>
class GLFWGLRenderableResource final : public mln::gl::RenderableResource {
public:
explicit GLFWGLRenderableResource(GLFWGLBackend& backend_)
: backend(backend_) {}
void bind() override {
MLN_TRACE_FUNC();
backend.setFramebufferBinding(0);
backend.setViewport(0, 0, backend.getFramebufferSize());
}
void swap() override {
MLN_TRACE_FUNC();
backend.swap();
}
private:
GLFWGLBackend& backend;
};
GLFWGLBackend::GLFWGLBackend(GLFWwindow* window_, const bool capFrameRate)
: mln::gl::RendererBackend(mln::gfx::ContextMode::Unique),
mln::gfx::Renderable(
[window_] {
int fbWidth;
int fbHeight;
glfwGetFramebufferSize(window_, &fbWidth, &fbHeight);
return mln::Size{static_cast<uint32_t>(fbWidth), static_cast<uint32_t>(fbHeight)};
}(),
std::make_unique<GLFWGLRenderableResource>(*this)),
window(window_) {
MLN_TRACE_FUNC();
glfwMakeContextCurrent(window);
if (!capFrameRate) {
// Disables vsync on platforms that support it.
glfwSwapInterval(0);
} else {
glfwSwapInterval(1);
}
}
GLFWGLBackend::~GLFWGLBackend() = default;
void GLFWGLBackend::activate() {
MLN_TRACE_FUNC();
glfwMakeContextCurrent(window);
}
void GLFWGLBackend::deactivate() {
MLN_TRACE_FUNC();
glfwMakeContextCurrent(nullptr);
}
mln::gl::ProcAddress GLFWGLBackend::getExtensionFunctionPointer(const char* name) {
return glfwGetProcAddress(name);
}
void GLFWGLBackend::updateAssumedState() {
MLN_TRACE_FUNC();
assumeFramebufferBinding(0);
setViewport(0, 0, getSize());
}
mln::Size GLFWGLBackend::getFramebufferSize() const {
return getSize();
}
void GLFWGLBackend::setFramebufferSize(const mln::Size newSize) {
setRenderableSize(newSize);
}
void GLFWGLBackend::swap() {
MLN_TRACE_FUNC();
glfwSwapBuffers(window);
}
namespace mln {
namespace gfx {
template <>
std::unique_ptr<GLFWBackend> Backend::Create<mln::gfx::Backend::Type::OpenGL>(GLFWwindow* window, bool capFrameRate) {
MLN_TRACE_FUNC();
return std::make_unique<GLFWGLBackend>(window, capFrameRate);
}
} // namespace gfx
} // namespace mln