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