Commit cbdb585e authored by hybrid's avatar hybrid

Change Linux device to use GLX extension pointers, adapt OpenGL init to the win32 scheme.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2565 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 30cea2ed
...@@ -314,7 +314,9 @@ bool CIrrDeviceLinux::createWindow() ...@@ -314,7 +314,9 @@ bool CIrrDeviceLinux::createWindow()
isAvailableGLX=glXQueryExtension(display,&major,&minor); isAvailableGLX=glXQueryExtension(display,&major,&minor);
if (isAvailableGLX && glXQueryVersion(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<const GLubyte*>("glxChooseFBConfig"));
if (major==1 && minor>2 && glxChooseFBConfig)
{ {
// attribute array for the draw buffer // attribute array for the draw buffer
int visualAttrBuffer[] = int visualAttrBuffer[] =
...@@ -327,12 +329,15 @@ bool CIrrDeviceLinux::createWindow() ...@@ -327,12 +329,15 @@ bool CIrrDeviceLinux::createWindow()
GLX_DEPTH_SIZE, CreationParams.ZBufferBits, GLX_DEPTH_SIZE, CreationParams.ZBufferBits,
GLX_DOUBLEBUFFER, CreationParams.Doublebuffer?True:False, GLX_DOUBLEBUFFER, CreationParams.Doublebuffer?True:False,
GLX_STENCIL_SIZE, CreationParams.Stencilbuffer?1:0, GLX_STENCIL_SIZE, CreationParams.Stencilbuffer?1:0,
#ifdef GLX_ARB_multisample #if defined(GLX_VERSION_1_4)
GLX_SAMPLE_BUFFERS_ARB, 1,
GLX_SAMPLES_ARB, CreationParams.AntiAlias,
#elif defined(GLX_SAMPLE_BUFFERS)
GLX_SAMPLE_BUFFERS, 1, 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 #endif
GLX_STEREO, CreationParams.Stereobuffer?True:False, GLX_STEREO, CreationParams.Stereobuffer?True:False,
None None
...@@ -347,19 +352,19 @@ bool CIrrDeviceLinux::createWindow() ...@@ -347,19 +352,19 @@ bool CIrrDeviceLinux::createWindow()
} }
// first round with unchanged values // first round with unchanged values
{ {
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (!configList && CreationParams.AntiAlias) if (!configList && CreationParams.AntiAlias)
{ {
while (!configList && (visualAttrBuffer[19]>1)) while (!configList && (visualAttrBuffer[19]>1))
{ {
visualAttrBuffer[19] -= 1; visualAttrBuffer[19] -= 1;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
} }
if (!configList) if (!configList)
{ {
visualAttrBuffer[17] = 0; visualAttrBuffer[17] = 0;
visualAttrBuffer[19] = 0; visualAttrBuffer[19] = 0;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (configList) if (configList)
{ {
os::Printer::log("No FSAA available.", ELL_WARNING); os::Printer::log("No FSAA available.", ELL_WARNING);
...@@ -385,19 +390,19 @@ bool CIrrDeviceLinux::createWindow() ...@@ -385,19 +390,19 @@ bool CIrrDeviceLinux::createWindow()
CreationParams.Stencilbuffer = !CreationParams.Stencilbuffer; CreationParams.Stencilbuffer = !CreationParams.Stencilbuffer;
visualAttrBuffer[15]=CreationParams.Stencilbuffer?1:0; visualAttrBuffer[15]=CreationParams.Stencilbuffer?1:0;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (!configList && CreationParams.AntiAlias) if (!configList && CreationParams.AntiAlias)
{ {
while (!configList && (visualAttrBuffer[19]>1)) while (!configList && (visualAttrBuffer[19]>1))
{ {
visualAttrBuffer[19] -= 1; visualAttrBuffer[19] -= 1;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
} }
if (!configList) if (!configList)
{ {
visualAttrBuffer[17] = 0; visualAttrBuffer[17] = 0;
visualAttrBuffer[19] = 0; visualAttrBuffer[19] = 0;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (configList) if (configList)
{ {
os::Printer::log("No FSAA available.", ELL_WARNING); os::Printer::log("No FSAA available.", ELL_WARNING);
...@@ -420,19 +425,19 @@ bool CIrrDeviceLinux::createWindow() ...@@ -420,19 +425,19 @@ bool CIrrDeviceLinux::createWindow()
visualAttrBuffer[13] = GLX_DONT_CARE; visualAttrBuffer[13] = GLX_DONT_CARE;
CreationParams.Stencilbuffer = false; CreationParams.Stencilbuffer = false;
visualAttrBuffer[15]=0; visualAttrBuffer[15]=0;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (!configList && CreationParams.AntiAlias) if (!configList && CreationParams.AntiAlias)
{ {
while (!configList && (visualAttrBuffer[19]>1)) while (!configList && (visualAttrBuffer[19]>1))
{ {
visualAttrBuffer[19] -= 1; visualAttrBuffer[19] -= 1;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
} }
if (!configList) if (!configList)
{ {
visualAttrBuffer[17] = 0; visualAttrBuffer[17] = 0;
visualAttrBuffer[19] = 0; visualAttrBuffer[19] = 0;
configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); configList=glxChooseFBConfig(display, screennr, visualAttrBuffer,&nitems);
if (configList) if (configList)
{ {
os::Printer::log("No FSAA available.", ELL_WARNING); os::Printer::log("No FSAA available.", ELL_WARNING);
...@@ -452,10 +457,13 @@ bool CIrrDeviceLinux::createWindow() ...@@ -452,10 +457,13 @@ bool CIrrDeviceLinux::createWindow()
glxFBConfig=configList[0]; glxFBConfig=configList[0];
XFree(configList); XFree(configList);
UseGLXWindow=true; UseGLXWindow=true;
visual = glXGetVisualFromFBConfig(display,glxFBConfig); PFNGLXGETVISUALFROMFBCONFIGPROC glxGetVisualFromFBConfig= (PFNGLXGETVISUALFROMFBCONFIGPROC)glXGetProcAddress(reinterpret_cast<const GLubyte*>("glxGetVisualFromFBConfig"));
if (glxGetVisualFromFBConfig)
visual = glxGetVisualFromFBConfig(display,glxFBConfig);
} }
} }
else else
#endif
{ {
// attribute array for the draw buffer // attribute array for the draw buffer
int visualAttrBuffer[] = int visualAttrBuffer[] =
...@@ -466,12 +474,12 @@ bool CIrrDeviceLinux::createWindow() ...@@ -466,12 +474,12 @@ bool CIrrDeviceLinux::createWindow()
GLX_BLUE_SIZE, 4, GLX_BLUE_SIZE, 4,
GLX_ALPHA_SIZE, CreationParams.WithAlphaChannel?1:0, GLX_ALPHA_SIZE, CreationParams.WithAlphaChannel?1:0,
GLX_DEPTH_SIZE, CreationParams.ZBufferBits, 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 // The following attributes have no flags, but are
// either present or not. As a no-op we use // either present or not. As a no-op we use
// GLX_USE_GL, which is silently ignored by glXChooseVisual // GLX_USE_GL, which is silently ignored by glXChooseVisual
CreationParams.Doublebuffer?GLX_DOUBLEBUFFER:GLX_USE_GL, CreationParams.Doublebuffer?GLX_DOUBLEBUFFER:GLX_USE_GL, // 14
CreationParams.Stereobuffer?GLX_STEREO:GLX_USE_GL, CreationParams.Stereobuffer?GLX_STEREO:GLX_USE_GL, // 15
None None
}; };
......
...@@ -121,7 +121,7 @@ namespace irr ...@@ -121,7 +121,7 @@ namespace irr
void pollJoysticks(); void pollJoysticks();
void initXAtoms(); void initXAtoms();
//! Implementation of the linux cursor control //! Implementation of the linux cursor control
class CCursorControl : public gui::ICursorControl class CCursorControl : public gui::ICursorControl
...@@ -319,6 +319,8 @@ namespace irr ...@@ -319,6 +319,8 @@ namespace irr
friend class CCursorControl; friend class CCursorControl;
#ifdef _IRR_COMPILE_WITH_X11_ #ifdef _IRR_COMPILE_WITH_X11_
friend class COpenGLDriver;
Display *display; Display *display;
XVisualInfo* visual; XVisualInfo* visual;
int screennr; int screennr;
......
...@@ -47,7 +47,7 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params, ...@@ -47,7 +47,7 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params,
} }
//! inits the open gl driver //! 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 // Set up pixel format descriptor with desired parameters
PIXELFORMATDESCRIPTOR pfd = { PIXELFORMATDESCRIPTOR pfd = {
...@@ -427,6 +427,11 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -427,6 +427,11 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("COpenGLDriver"); setDebugName("COpenGLDriver");
#endif #endif
}
//! inits the open gl driver
bool COpenGLDriver::initDriver(irr::SIrrlichtCreationParameters params, CIrrDeviceLinux* device)
{
ExposedData.OpenGLLinux.X11Context = glXGetCurrentContext(); ExposedData.OpenGLLinux.X11Context = glXGetCurrentContext();
ExposedData.OpenGLLinux.X11Display = glXGetCurrentDisplay(); ExposedData.OpenGLLinux.X11Display = glXGetCurrentDisplay();
ExposedData.OpenGLLinux.X11Window = (unsigned long)params.WindowId; ExposedData.OpenGLLinux.X11Window = (unsigned long)params.WindowId;
...@@ -444,6 +449,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -444,6 +449,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
glXSwapIntervalSGI(1); glXSwapIntervalSGI(1);
#endif #endif
#endif #endif
return true;
} }
#endif // _IRR_COMPILE_WITH_X11_DEVICE_ #endif // _IRR_COMPILE_WITH_X11_DEVICE_
...@@ -3330,7 +3336,7 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -3330,7 +3336,7 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,
{ {
#ifdef _IRR_COMPILE_WITH_OPENGL_ #ifdef _IRR_COMPILE_WITH_OPENGL_
COpenGLDriver* ogl = new COpenGLDriver(params, io, device); COpenGLDriver* ogl = new COpenGLDriver(params, io, device);
if (!ogl->initDriver(params)) if (!ogl->initDriver(params, device))
{ {
ogl->drop(); ogl->drop();
ogl = 0; ogl = 0;
...@@ -3365,7 +3371,13 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -3365,7 +3371,13 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,
io::IFileSystem* io, CIrrDeviceLinux* device) io::IFileSystem* io, CIrrDeviceLinux* device)
{ {
#ifdef _IRR_COMPILE_WITH_OPENGL_ #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 #else
return 0; return 0;
#endif // _IRR_COMPILE_WITH_OPENGL_ #endif // _IRR_COMPILE_WITH_OPENGL_
......
...@@ -37,10 +37,14 @@ namespace video ...@@ -37,10 +37,14 @@ namespace video
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_ #ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceWin32* 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 #endif
#ifdef _IRR_COMPILE_WITH_X11_DEVICE_ #ifdef _IRR_COMPILE_WITH_X11_DEVICE_
COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceLinux* 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 #endif
#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_ #ifdef _IRR_COMPILE_WITH_SDL_DEVICE_
...@@ -51,11 +55,6 @@ namespace video ...@@ -51,11 +55,6 @@ namespace video
COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceMacOSX *device); COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceMacOSX *device);
#endif #endif
#ifdef _IRR_WINDOWS_API_
//! inits the windows specific parts of the open gl driver
bool initDriver(SIrrlichtCreationParameters params);
#endif
//! destructor //! destructor
virtual ~COpenGLDriver(); virtual ~COpenGLDriver();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment