]> git.sesse.net Git - nageru/blobdiff - shared/context.cpp
Unify context.cpp from Nageru and Futatabi.
[nageru] / shared / context.cpp
diff --git a/shared/context.cpp b/shared/context.cpp
new file mode 100644 (file)
index 0000000..0b17bfa
--- /dev/null
@@ -0,0 +1,66 @@
+#include <QGL>
+#include <QOffscreenSurface>
+#include <QOpenGLContext>
+#include <QSurface>
+#include <QSurfaceFormat>
+#include <stdio.h>
+#include <string>
+
+QGLWidget *global_share_widget = nullptr;
+
+using namespace std;
+
+QSurface *create_surface()
+{
+       QSurfaceFormat fmt;
+       fmt.setDepthBufferSize(0);
+       fmt.setStencilBufferSize(0);
+       fmt.setProfile(QSurfaceFormat::CoreProfile);
+       fmt.setMajorVersion(4);
+       fmt.setMinorVersion(5);
+       fmt.setSwapInterval(0);
+       QOffscreenSurface *surface = new QOffscreenSurface;
+       surface->setFormat(fmt);
+       surface->create();
+       if (!surface->isValid()) {
+               fprintf(stderr, "ERROR: surface not valid!\n");
+               exit(1);
+       }
+       return surface;
+}
+
+QSurface *create_surface(const QSurfaceFormat &format)
+{
+       QOffscreenSurface *surface = new QOffscreenSurface;
+       surface->setFormat(format);
+       surface->create();
+       if (!surface->isValid()) {
+               fprintf(stderr, "ERROR: surface not valid!\n");
+               exit(1);
+       }
+       return surface;
+}
+
+QSurface *create_surface_with_same_format(const QSurface *surface)
+{
+       return create_surface(surface->format());
+}
+
+QOpenGLContext *create_context(const QSurface *surface)
+{
+       QOpenGLContext *context = new QOpenGLContext;
+       context->setShareContext(global_share_widget->context()->contextHandle());
+       context->setFormat(surface->format());
+       context->create();
+       return context;
+}
+
+bool make_current(QOpenGLContext *context, QSurface *surface)
+{
+       return context->makeCurrent(surface);
+}
+
+void delete_context(QOpenGLContext *context)
+{
+       delete context;
+}