diff --git a/source/Irrlicht/CIrrDeviceLinux.cpp b/source/Irrlicht/CIrrDeviceLinux.cpp index 0f1754a6..95e0b4bc 100644 --- a/source/Irrlicht/CIrrDeviceLinux.cpp +++ b/source/Irrlicht/CIrrDeviceLinux.cpp @@ -314,7 +314,9 @@ bool CIrrDeviceLinux::createWindow() isAvailableGLX=glXQueryExtension(display,&major,&minor); if (isAvailableGLX && glXQueryVersion(display, &major, &minor)) { - if (major==1 && minor>2) +#ifdef GLX_VERSION_1_3 + PFNGLXCHOOSEFBCONFIGPROC glxChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glXGetProcAddress(reinterpret_cast("glxChooseFBConfig")); + if (major==1 && minor>2 && glxChooseFBConfig) { // attribute array for the draw buffer int visualAttrBuffer[] = @@ -327,12 +329,15 @@ bool CIrrDeviceLinux::createWindow() GLX_DEPTH_SIZE, CreationParams.ZBufferBits, GLX_DOUBLEBUFFER, CreationParams.Doublebuffer?True:False, GLX_STENCIL_SIZE, CreationParams.Stencilbuffer?1:0, -#ifdef GLX_ARB_multisample - GLX_SAMPLE_BUFFERS_ARB, 1, - GLX_SAMPLES_ARB, CreationParams.AntiAlias, -#elif defined(GLX_SAMPLE_BUFFERS) +#if defined(GLX_VERSION_1_4) GLX_SAMPLE_BUFFERS, 1, - GLX_SAMPLES, CreationParams.AntiAlias, + GLX_SAMPLES, CreationParams.AntiAlias, // 18,19 +#elif defined(GLX_ARB_multisample) + GLX_SAMPLE_BUFFERS_ARB, 1, + GLX_SAMPLES_ARB, CreationParams.AntiAlias, // 18,19 +#elif defined(GLX_SGIS_multisample) + GLX_SAMPLE_BUFFERS_SGIS, 1, + GLX_SAMPLES_SGIS, CreationParams.AntiAlias, // 18,19 #endif GLX_STEREO, CreationParams.Stereobuffer?True:False, None @@ -347,19 +352,19 @@ bool CIrrDeviceLinux::createWindow() } // first round with unchanged values { - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (!configList && CreationParams.AntiAlias) { while (!configList && (visualAttrBuffer[19]>1)) { visualAttrBuffer[19] -= 1; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); } if (!configList) { visualAttrBuffer[17] = 0; visualAttrBuffer[19] = 0; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (configList) { os::Printer::log("No FSAA available.", ELL_WARNING); @@ -385,19 +390,19 @@ bool CIrrDeviceLinux::createWindow() CreationParams.Stencilbuffer = !CreationParams.Stencilbuffer; visualAttrBuffer[15]=CreationParams.Stencilbuffer?1:0; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (!configList && CreationParams.AntiAlias) { while (!configList && (visualAttrBuffer[19]>1)) { visualAttrBuffer[19] -= 1; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); } if (!configList) { visualAttrBuffer[17] = 0; visualAttrBuffer[19] = 0; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (configList) { os::Printer::log("No FSAA available.", ELL_WARNING); @@ -420,19 +425,19 @@ bool CIrrDeviceLinux::createWindow() visualAttrBuffer[13] = GLX_DONT_CARE; CreationParams.Stencilbuffer = false; visualAttrBuffer[15]=0; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (!configList && CreationParams.AntiAlias) { while (!configList && (visualAttrBuffer[19]>1)) { visualAttrBuffer[19] -= 1; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); } if (!configList) { visualAttrBuffer[17] = 0; visualAttrBuffer[19] = 0; - configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); if (configList) { os::Printer::log("No FSAA available.", ELL_WARNING); @@ -452,10 +457,13 @@ bool CIrrDeviceLinux::createWindow() glxFBConfig=configList[0]; XFree(configList); UseGLXWindow=true; - visual = glXGetVisualFromFBConfig(display,glxFBConfig); + PFNGLXGETVISUALFROMFBCONFIGPROC glxGetVisualFromFBConfig= (PFNGLXGETVISUALFROMFBCONFIGPROC)glXGetProcAddress(reinterpret_cast("glxGetVisualFromFBConfig")); + if (glxGetVisualFromFBConfig) + visual = glxGetVisualFromFBConfig(display,glxFBConfig); } } else +#endif { // attribute array for the draw buffer int visualAttrBuffer[] = @@ -466,12 +474,12 @@ bool CIrrDeviceLinux::createWindow() GLX_BLUE_SIZE, 4, GLX_ALPHA_SIZE, CreationParams.WithAlphaChannel?1:0, GLX_DEPTH_SIZE, CreationParams.ZBufferBits, - GLX_STENCIL_SIZE, CreationParams.Stencilbuffer?1:0, + GLX_STENCIL_SIZE, CreationParams.Stencilbuffer?1:0, // 12,13 // The following attributes have no flags, but are // either present or not. As a no-op we use // GLX_USE_GL, which is silently ignored by glXChooseVisual - CreationParams.Doublebuffer?GLX_DOUBLEBUFFER:GLX_USE_GL, - CreationParams.Stereobuffer?GLX_STEREO:GLX_USE_GL, + CreationParams.Doublebuffer?GLX_DOUBLEBUFFER:GLX_USE_GL, // 14 + CreationParams.Stereobuffer?GLX_STEREO:GLX_USE_GL, // 15 None }; diff --git a/source/Irrlicht/CIrrDeviceLinux.h b/source/Irrlicht/CIrrDeviceLinux.h index 88cd67fe..f464d4a8 100644 --- a/source/Irrlicht/CIrrDeviceLinux.h +++ b/source/Irrlicht/CIrrDeviceLinux.h @@ -121,7 +121,7 @@ namespace irr void pollJoysticks(); - void initXAtoms(); + void initXAtoms(); //! Implementation of the linux cursor control class CCursorControl : public gui::ICursorControl @@ -319,6 +319,8 @@ namespace irr friend class CCursorControl; #ifdef _IRR_COMPILE_WITH_X11_ + friend class COpenGLDriver; + Display *display; XVisualInfo* visual; int screennr; diff --git a/source/Irrlicht/COpenGLDriver.cpp b/source/Irrlicht/COpenGLDriver.cpp index 0b30dd98..10822089 100644 --- a/source/Irrlicht/COpenGLDriver.cpp +++ b/source/Irrlicht/COpenGLDriver.cpp @@ -47,7 +47,7 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params, } //! inits the open gl driver -bool COpenGLDriver::initDriver(irr::SIrrlichtCreationParameters params) +bool COpenGLDriver::initDriver(irr::SIrrlichtCreationParameters params, CIrrDeviceWin32* device) { // Set up pixel format descriptor with desired parameters PIXELFORMATDESCRIPTOR pfd = { @@ -427,6 +427,11 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, #ifdef _DEBUG setDebugName("COpenGLDriver"); #endif +} + +//! inits the open gl driver +bool COpenGLDriver::initDriver(irr::SIrrlichtCreationParameters params, CIrrDeviceLinux* device) +{ ExposedData.OpenGLLinux.X11Context = glXGetCurrentContext(); ExposedData.OpenGLLinux.X11Display = glXGetCurrentDisplay(); ExposedData.OpenGLLinux.X11Window = (unsigned long)params.WindowId; @@ -444,6 +449,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, glXSwapIntervalSGI(1); #endif #endif + return true; } #endif // _IRR_COMPILE_WITH_X11_DEVICE_ @@ -3330,7 +3336,7 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, { #ifdef _IRR_COMPILE_WITH_OPENGL_ COpenGLDriver* ogl = new COpenGLDriver(params, io, device); - if (!ogl->initDriver(params)) + if (!ogl->initDriver(params, device)) { ogl->drop(); ogl = 0; @@ -3365,7 +3371,13 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceLinux* device) { #ifdef _IRR_COMPILE_WITH_OPENGL_ - return new COpenGLDriver(params, io, device); + COpenGLDriver* ogl = new COpenGLDriver(params, io, device); + if (!ogl->initDriver(params, device)) + { + ogl->drop(); + ogl = 0; + } + return ogl; #else return 0; #endif // _IRR_COMPILE_WITH_OPENGL_ diff --git a/source/Irrlicht/COpenGLDriver.h b/source/Irrlicht/COpenGLDriver.h index 2a3731b4..300145d4 100644 --- a/source/Irrlicht/COpenGLDriver.h +++ b/source/Irrlicht/COpenGLDriver.h @@ -37,10 +37,14 @@ namespace video #ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_ COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceWin32* device); + //! inits the windows specific parts of the open gl driver + bool initDriver(SIrrlichtCreationParameters params, CIrrDeviceWin32* device); #endif #ifdef _IRR_COMPILE_WITH_X11_DEVICE_ COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceLinux* device); + //! inits the GLX specific parts of the open gl driver + bool initDriver(SIrrlichtCreationParameters params, CIrrDeviceLinux* device); #endif #ifdef _IRR_COMPILE_WITH_SDL_DEVICE_ @@ -51,11 +55,6 @@ namespace video COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceMacOSX *device); #endif - #ifdef _IRR_WINDOWS_API_ - //! inits the windows specific parts of the open gl driver - bool initDriver(SIrrlichtCreationParameters params); - #endif - //! destructor virtual ~COpenGLDriver();