mirror of https://github.com/mosra/magnum.git
6 changed files with 237 additions and 0 deletions
@ -0,0 +1,49 @@
|
||||
#ifndef Magnum_Contexts_GlxContext_h |
||||
#define Magnum_Contexts_GlxContext_h |
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Class Magnum::Contexts::GlxContext |
||||
*/ |
||||
|
||||
#include "AbstractXContext.h" |
||||
#include "GlxInterface.h" |
||||
|
||||
namespace Magnum { namespace Contexts { |
||||
|
||||
/**
|
||||
@brief GLX context |
||||
|
||||
Uses GlxInterface. |
||||
*/ |
||||
class GlxContext: public AbstractXContext { |
||||
public: |
||||
/**
|
||||
* @brief Constructor |
||||
* @param argc Count of arguments of `main()` function |
||||
* @param argv Arguments of `main()` function |
||||
* @param title Window title |
||||
* @param size Window size |
||||
* |
||||
* Creates window with double-buffered OpenGL 3.3 core context or |
||||
* OpenGL ES 2.0 context, if targetting OpenGL ES. |
||||
*/ |
||||
inline GlxContext(int& argc, char** argv, const std::string& title = "Magnum GLX context", const Math::Vector2<GLsizei>& size = Math::Vector2<GLsizei>(800, 600)): AbstractXContext(new GlxInterface, argc, argv, title, size) {} |
||||
}; |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
@ -0,0 +1,90 @@
|
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
#include "GlxInterface.h" |
||||
|
||||
#include <GL/glxext.h> |
||||
|
||||
namespace Magnum { namespace Contexts { |
||||
|
||||
VisualID GlxInterface::getVisualId(Display* nativeDisplay) { |
||||
display = nativeDisplay; |
||||
|
||||
/* Check version */ |
||||
int major, minor; |
||||
glXQueryVersion(nativeDisplay, &major, &minor); |
||||
if(major == 1 && minor < 4) { |
||||
Error() << "GlxInterface: GLX version 1.4 or greater is required."; |
||||
exit(1); |
||||
} |
||||
|
||||
/* Choose config */ |
||||
int configCount = 0; |
||||
static const int attributes[] = { |
||||
GLX_RENDER_TYPE, GLX_RGBA_BIT, |
||||
GLX_X_RENDERABLE, True, |
||||
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, |
||||
GLX_DOUBLEBUFFER, True, |
||||
GLX_RED_SIZE, 8, |
||||
GLX_GREEN_SIZE, 8, |
||||
GLX_BLUE_SIZE, 8, |
||||
0 |
||||
}; |
||||
configs = glXChooseFBConfig(nativeDisplay, DefaultScreen(nativeDisplay), attributes, &configCount); |
||||
if(!configCount) { |
||||
Error() << "GlxInterface: no supported framebuffer configuration found."; |
||||
exit(1); |
||||
} |
||||
|
||||
/* Get visual ID */ |
||||
XVisualInfo* info = glXGetVisualFromFBConfig(display, configs[0]); |
||||
VisualID visualId = info->visualid; |
||||
XFree(info); |
||||
|
||||
return visualId; |
||||
} |
||||
|
||||
void GlxInterface::createContext(Window nativeWindow) { |
||||
window = nativeWindow; |
||||
|
||||
GLint attributes[] = { |
||||
#ifndef MAGNUM_TARGET_GLES |
||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
||||
GLX_CONTEXT_MINOR_VERSION_ARB, 3, |
||||
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, |
||||
#else |
||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 2, |
||||
GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
||||
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, |
||||
#endif |
||||
0 |
||||
}; |
||||
|
||||
/** @todo Use some extension wrangler for this, not GLEW, as it apparently needs context to create context, yo dawg wtf. */ |
||||
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB"); |
||||
context = glXCreateContextAttribsARB(display, configs[0], 0, True, attributes); |
||||
XFree(configs); |
||||
if(!context) { |
||||
Error() << "GlxInterface: cannot create context."; |
||||
exit(1); |
||||
} |
||||
} |
||||
|
||||
GlxInterface::~GlxInterface() { |
||||
glXMakeCurrent(display, None, nullptr); |
||||
glXDestroyContext(display, context); |
||||
} |
||||
|
||||
}} |
||||
@ -0,0 +1,66 @@
|
||||
#ifndef Magnum_Contexts_EglInterface_h |
||||
#define Magnum_Contexts_EglInterface_h |
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Class Magnum::Contexts::GlxInterface |
||||
*/ |
||||
|
||||
#include "Magnum.h" |
||||
#include <GL/glx.h> |
||||
|
||||
#include "AbstractGlInterface.h" |
||||
|
||||
namespace Magnum { namespace Contexts { |
||||
|
||||
/**
|
||||
@brief GLX interface |
||||
|
||||
Creates OpenGL 3.3 core context or OpenGL ES 2.0 context, if targetting |
||||
OpenGL ES. |
||||
|
||||
Used in GlxContext. |
||||
*/ |
||||
class GlxInterface: public AbstractGlInterface<Display*, VisualID, Window> { |
||||
public: |
||||
~GlxInterface(); |
||||
|
||||
VisualID getVisualId(Display* nativeDisplay); |
||||
void createContext(Window nativeWindow); |
||||
|
||||
/* This must be enabled, otherwise (on my NVidia) it crashes when creating VAO. WTF. */ |
||||
inline ExtensionWrangler::ExperimentalFeatures experimentalExtensionWranglerFeatures() const { |
||||
return ExtensionWrangler::ExperimentalFeatures::Enable; |
||||
} |
||||
|
||||
inline void makeCurrent() { |
||||
glXMakeCurrent(display, window, context); |
||||
} |
||||
|
||||
inline void swapBuffers() { |
||||
glXSwapBuffers(display, window); |
||||
} |
||||
|
||||
private: |
||||
Display* display; |
||||
Window window; |
||||
GLXFBConfig* configs; |
||||
GLXContext context; |
||||
}; |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
Loading…
Reference in new issue