summaryrefslogtreecommitdiff
path: root/src/SFML/Window/Unix/GlxContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/SFML/Window/Unix/GlxContext.cpp')
-rw-r--r--src/SFML/Window/Unix/GlxContext.cpp81
1 files changed, 52 insertions, 29 deletions
diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp
index 7251db2..4efee9f 100644
--- a/src/SFML/Window/Unix/GlxContext.cpp
+++ b/src/SFML/Window/Unix/GlxContext.cpp
@@ -194,8 +194,8 @@ GlxContext::~GlxContext()
// Destroy the window if we own it
if (m_window && m_ownsWindow)
{
- xcb_destroy_window(m_connection, m_window);
- xcb_flush(m_connection);
+ XDestroyWindow(m_display, m_window);
+ XFlush(m_display);
}
// Close the connection with the X server
@@ -211,7 +211,7 @@ GlFunctionPointer GlxContext::getFunction(const char* name)
////////////////////////////////////////////////////////////
-bool GlxContext::makeCurrent()
+bool GlxContext::makeCurrent(bool current)
{
if (!m_context)
return false;
@@ -222,13 +222,20 @@ bool GlxContext::makeCurrent()
bool result = false;
- if (m_pbuffer)
+ if (current)
{
- result = glXMakeContextCurrent(m_display, m_pbuffer, m_pbuffer, m_context);
+ if (m_pbuffer)
+ {
+ result = glXMakeContextCurrent(m_display, m_pbuffer, m_pbuffer, m_context);
+ }
+ else if (m_window)
+ {
+ result = glXMakeCurrent(m_display, m_window, m_context);
+ }
}
- else if (m_window)
+ else
{
- result = glXMakeCurrent(m_display, m_window, m_context);
+ result = glXMakeCurrent(m_display, None, NULL);
}
#if defined(GLX_DEBUGGING)
@@ -444,7 +451,6 @@ void GlxContext::updateSettingsFromWindow()
void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned int height, unsigned int bitsPerPixel)
{
m_display = OpenDisplay();
- m_connection = XGetXCBConnection(m_display);
// Choose the visual according to the context settings
XVisualInfo visualInfo = selectBestVisual(m_display, bitsPerPixel, m_settings);
@@ -482,8 +488,11 @@ void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned
if (visual->visualid == visualInfo.visualid)
{
config = &configs[i];
+ XFree(visual);
break;
}
+
+ XFree(visual);
}
if (config)
@@ -510,28 +519,22 @@ void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned
}
// If pbuffers are not available we use a hidden window as the off-screen surface to draw to
- xcb_screen_t* screen = XCBScreenOfDisplay(m_connection, DefaultScreen(m_display));
+ int screen = DefaultScreen(m_display);
// Define the window attributes
- xcb_colormap_t colormap = xcb_generate_id(m_connection);
- xcb_create_colormap(m_connection, XCB_COLORMAP_ALLOC_NONE, colormap, screen->root, visualInfo.visualid);
- const uint32_t value_list[] = {colormap};
-
- // Create a dummy window (disabled and hidden)
- m_window = xcb_generate_id(m_connection);
- xcb_create_window(
- m_connection,
- static_cast<uint8_t>(visualInfo.depth),
- m_window,
- screen->root,
- 0, 0,
- width, height,
- 0,
- XCB_WINDOW_CLASS_INPUT_OUTPUT,
- visualInfo.visualid,
- XCB_CW_COLORMAP,
- value_list
- );
+ XSetWindowAttributes attributes;
+ attributes.colormap = XCreateColormap(m_display, RootWindow(m_display, screen), visualInfo.visual, AllocNone);
+
+ m_window = XCreateWindow(m_display,
+ RootWindow(m_display, screen),
+ 0, 0,
+ width, height,
+ 0,
+ DefaultDepth(m_display, screen),
+ InputOutput,
+ visualInfo.visual,
+ CWColormap,
+ &attributes);
m_ownsWindow = true;
@@ -543,7 +546,6 @@ void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned
void GlxContext::createSurface(::Window window)
{
m_display = OpenDisplay();
- m_connection = XGetXCBConnection(m_display);
// A window already exists, so just use it
m_window = window;
@@ -640,8 +642,11 @@ void GlxContext::createContext(GlxContext* shared)
if (visual->visualid == visualInfo->visualid)
{
config = &configs[i];
+ XFree(visual);
break;
}
+
+ XFree(visual);
}
if (!config)
@@ -688,6 +693,15 @@ void GlxContext::createContext(GlxContext* shared)
// On an error, glXCreateContextAttribsARB will return 0 anyway
GlxErrorHandler handler(m_display);
+ if (toShare)
+ {
+ if (!glXMakeCurrent(m_display, None, NULL))
+ {
+ err() << "Failed to deactivate shared context before sharing" << std::endl;
+ return;
+ }
+ }
+
// Create the context
m_context = glXCreateContextAttribsARB(m_display, *config, toShare, true, &attributes[0]);
@@ -734,6 +748,15 @@ void GlxContext::createContext(GlxContext* shared)
GlxErrorHandler handler(m_display);
#endif
+ if (toShare)
+ {
+ if (!glXMakeCurrent(m_display, None, NULL))
+ {
+ err() << "Failed to deactivate shared context before sharing" << std::endl;
+ return;
+ }
+ }
+
// Create the context, using the target window's visual
m_context = glXCreateContext(m_display, visualInfo, toShare, true);