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-e03cc46cb475master
parent
30cea2eda0
commit
cbdb585e04
|
@ -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<const GLubyte*>("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<const GLubyte*>("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
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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_
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue