| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 | //-----------------------------------------------------------------------------// Copyright (c) 2012 GarageGames, LLC//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS// IN THE SOFTWARE.//-----------------------------------------------------------------------------#if 0#include "console/console.h"#include "platform/event.h"#include "platform/gameInterface.h"#include "platformX86UNIX/platformX86UNIX.h"#include "platformX86UNIX/platformGL.h"#include "platformX86UNIX/x86UNIXOGLVideo.h"#include "platformX86UNIX/x86UNIXState.h"#include <SDL/SDL.h>#include <SDL/SDL_syswm.h>#include <SDL/SDL_version.h>//------------------------------------------------------------------------------bool InitOpenGL(){   DisplayDevice::init();   // Get the video settings from the prefs:   const char* resString = Con::getVariable( "$pref::Video::resolution" );   char* tempBuf = new char[dStrlen( resString ) + 1];   dStrcpy( tempBuf, resString );   char* temp = dStrtok( tempBuf, " x\0" );   U32 width = ( temp ? dAtoi( temp ) : 800 );   temp = dStrtok( NULL, " x\0" );   U32 height = ( temp ? dAtoi( temp ) : 600 );   temp = dStrtok( NULL, "\0" );   U32 bpp = ( temp ? dAtoi( temp ) : 16 );   delete [] tempBuf;   bool fullScreen = Con::getBoolVariable( "$pref::Video::fullScreen" );   // the only supported video device in unix is OpenGL   if ( !Video::setDevice( "OpenGL", width, height, bpp, fullScreen ) )   {      Con::errorf("Unable to create default OpenGL mode: %d %d %d %d",         width, height, bpp, fullScreen);      // if we can't create the default, attempt to create a "safe" window      if ( !Video::setDevice( "OpenGL", 640, 480, 16, true ) )      {         DisplayErrorAlert("Could not find a compatible OpenGL display " \            "resolution.  Please check your driver configuration.");         return false;      }   }   return true;}//------------------------------------------------------------------------------bool OpenGLDevice::smCanSwitchBitDepth = false;//------------------------------------------------------------------------------OpenGLDevice::OpenGLDevice(){   initDevice();}//------------------------------------------------------------------------------OpenGLDevice::~OpenGLDevice(){}//------------------------------------------------------------------------------void OpenGLDevice::addResolution(S32 width, S32 height, bool check){   Point2I desktopSize = x86UNIXState->getDesktopSize();   U32 desktopBpp = x86UNIXState->getDesktopBpp();   // don't allow any resolution under this size   if (width < 640 || height < 480)      return;   if (check)   {      // don't allow resolutions that exceed the current desktop size      if (width > desktopSize.x || height > desktopSize.y)         return;   }   if (smCanSwitchBitDepth)   {      // add both 16 and 32 bit resolutions      mResolutionList.push_back(Resolution(width, height, 16));      mResolutionList.push_back(Resolution(width, height, 32));   }   else   {      // add just the desktop resolution      mResolutionList.push_back(Resolution(width, height, desktopBpp));   }}//------------------------------------------------------------------------------void OpenGLDevice::initDevice(){   mDeviceName = "OpenGL";   mFullScreenOnly = false;}//------------------------------------------------------------------------------void OpenGLDevice::loadResolutions(){   mResolutionList.clear();   // X cannot switch bit depths on the fly.  In case this feature is   // implemented someday, calling this function will let you take   // advantage of it   if (Con::getBoolVariable("$pref::Unix::CanSwitchBitDepth"))      smCanSwitchBitDepth = true;   // add some default resolutions   addResolution(640, 480);   addResolution(800, 600);   addResolution(1024, 768);   addResolution(1152, 864);   addResolution(1280, 1024);   addResolution(1600, 1200);   // specifying full screen should give us the resolutions that the   // X server allows   SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN);   if (modes &&      (modes != (SDL_Rect **)-1))   {      for (int i = 0; modes[i] != NULL; ++i)      {         // do we already have this mode?         bool found = false;         for (Vector<Resolution>::iterator iter = mResolutionList.begin();              iter != mResolutionList.end();              ++iter)         {            if (iter->w == modes[i]->w && iter->h == modes[i]->h)            {               found = true;               break;            }         }         if (!found)            // don't check these resolutions because they should be OK            // (and checking might drop resolutions that are higher than the            // current desktop bpp)            addResolution(modes[i]->w, modes[i]->h, false);      }   }}//------------------------------------------------------------------------------bool OpenGLDevice::activate( U32 width, U32 height, U32 bpp, bool fullScreen ){   if (!setScreenMode(width, height, bpp, fullScreen))   {      Con::printf("Unable to set screen mode.");      return false;   }   // Output some driver info to the console   const char* vendorString   = (const char*) glGetString( GL_VENDOR );   const char* rendererString = (const char*) glGetString( GL_RENDERER );   const char* versionString  = (const char*) glGetString( GL_VERSION );   Con::printf( "OpenGL driver information:" );   if ( vendorString )      Con::printf( "  Vendor: %s", vendorString );   if ( rendererString )      Con::printf( "  Renderer: %s", rendererString );   if ( versionString )      Con::printf( "  Version: %s", versionString );   GL_EXT_Init();   Con::setVariable( "$pref::Video::displayDevice", mDeviceName );   // Do this here because we now know about the extensions:   if ( gGLState.suppSwapInterval )      setVerticalSync(         !Con::getBoolVariable( "$pref::Video::disableVerticalSync" ) );   Con::setBoolVariable("$pref::OpenGL::allowTexGen", true);   return true;}//------------------------------------------------------------------------------void OpenGLDevice::shutdown(){   // Shutdown is deferred to Platform::shutdown()}//------------------------------------------------------------------------------static void PrintGLAttributes(){   int doubleBuf;   int bufferSize, depthSize, stencilSize;   int red, green, blue, alpha;   int aRed, aGreen, aBlue, aAlpha;   SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doubleBuf);   SDL_GL_GetAttribute(SDL_GL_BUFFER_SIZE, &bufferSize);   SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &depthSize);   SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencilSize);   SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &red);   SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &green);   SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &blue);   SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &alpha);   SDL_GL_GetAttribute(SDL_GL_ACCUM_RED_SIZE, &aRed);   SDL_GL_GetAttribute(SDL_GL_ACCUM_GREEN_SIZE, &aGreen);   SDL_GL_GetAttribute(SDL_GL_ACCUM_BLUE_SIZE, &aBlue);   SDL_GL_GetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, &aAlpha);   Con::printf("OpenGL Attributes:");   Con::printf("  DoubleBuffer: %d", doubleBuf);   Con::printf("  BufferSize: %d, DepthSize: %d, StencilSize: %d",      bufferSize, depthSize, stencilSize);   Con::printf("  Red: %d, Green: %d, Blue: %d, Alpha: %d",      red, green, blue, alpha);   Con::printf("  Accum Red: %d, Green: %d, Blue: %d, Alpha: %d",      aRed, aGreen, aBlue, aAlpha);}//------------------------------------------------------------------------------bool OpenGLDevice::setScreenMode( U32 width, U32 height, U32 bpp,   bool fullScreen, bool forceIt, bool repaint ){   // load resolutions, this is done lazily so that we can check the setting   // of smCanSwitchBitDepth, which may be overridden by console   if (mResolutionList.size()==0)      loadResolutions();   if (mResolutionList.size()==0)   {      Con::printf("No resolutions available!");      return false;   }   if (bpp == 0)   {      // bpp comes in as "0" when it is set to "Default"      bpp = x86UNIXState->getDesktopBpp();   }   if (height == 0 || width == 0)   {      // paranoia check.  set it to the default to prevent crashing      width = 800;      height = 600;   }   U32 desktopDepth = x86UNIXState->getDesktopBpp();   // if we can't switch bit depths and the requested bpp is not equal to   // the desktop bpp, set bpp to the desktop bpp   if (!smCanSwitchBitDepth &&      bpp != desktopDepth)   {      bpp = desktopDepth;   }   bool IsInList = false;   Resolution NewResolution( width, height, bpp );   // See if the desired resolution is in the list   if ( mResolutionList.size() )   {      for ( int i = 0; i < mResolutionList.size(); i++ )      {         if ( width == mResolutionList[i].w              && height == mResolutionList[i].h              && bpp == mResolutionList[i].bpp )         {            IsInList = true;            break;         }      }      if ( !IsInList )      {         Con::printf( "Selected resolution not available: %d %d %d",            width, height, bpp);         return false;      }   }   else   {      AssertFatal( false, "No resolution list found!!" );   }   // Here if we found a matching resolution in the list   bool needResurrect = false;   if (x86UNIXState->windowCreated())   {      Con::printf( "Killing the texture manager..." );      Game->textureKill();      needResurrect = true;   }   // Set the desired GL Attributes   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);// JMQ: NVIDIA 2802+ doesn't like this setting for stencil size//   SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);   SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0);   SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 0);   SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 0);   SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 0);   SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 0);//    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);//    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);//    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);//    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);   U32 flags = SDL_OPENGL;   if (fullScreen)      flags |= SDL_FULLSCREEN;   Con::printf( "Setting screen mode to %dx%dx%d (%s)...", width, height,      bpp, ( fullScreen ? "fs" : "w" ) );   // set the new video mode   if (SDL_SetVideoMode(width, height, bpp, flags) == NULL)   {      Con::printf("Unable to set SDL Video Mode: %s", SDL_GetError());      return false;   }   PrintGLAttributes();   // clear screen here to prevent buffer garbage from being displayed when   // video mode is switched   glClearColor(0.0, 0.0, 0.0, 0.0);   glClear(GL_COLOR_BUFFER_BIT);   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);   if ( needResurrect )   {      // Reload the textures:      Con::printf( "Resurrecting the texture manager..." );      Game->textureResurrect();   }   if ( gGLState.suppSwapInterval )      setVerticalSync( !Con::getBoolVariable( "$pref::Video::disableVerticalSync" ) );   // reset the window in platform state   SDL_SysWMinfo sysinfo;   SDL_VERSION(&sysinfo.version);   if (SDL_GetWMInfo(&sysinfo) == 0)   {      Con::printf("Unable to set SDL Video Mode: %s", SDL_GetError());      return false;   }   x86UNIXState->setWindow(sysinfo.info.x11.window);   // set various other parameters   x86UNIXState->setWindowCreated(true);   smCurrentRes = NewResolution;   Platform::setWindowSize ( width, height );   smIsFullScreen = fullScreen;   Con::setBoolVariable( "$pref::Video::fullScreen", smIsFullScreen );   char tempBuf[15];   dSprintf( tempBuf, sizeof( tempBuf ), "%d %d %d",      smCurrentRes.w, smCurrentRes.h, smCurrentRes.bpp );   Con::setVariable( "$pref::Video::resolution", tempBuf );   // post a TORQUE_SETVIDEOMODE user event   SDL_Event event;   event.type = SDL_USEREVENT;   event.user.code = TORQUE_SETVIDEOMODE;   event.user.data1 = NULL;   event.user.data2 = NULL;   SDL_PushEvent(&event);   // reset the caption   SDL_WM_SetCaption(x86UNIXState->getWindowName(), NULL);   // repaint   if ( repaint )      Con::evaluate( "resetCanvas();" );   return true;}//------------------------------------------------------------------------------void OpenGLDevice::swapBuffers(){   SDL_GL_SwapBuffers();}//------------------------------------------------------------------------------const char* OpenGLDevice::getDriverInfo(){   const char* vendorString   = (const char*) glGetString( GL_VENDOR );   const char* rendererString = (const char*) glGetString( GL_RENDERER );   const char* versionString  = (const char*) glGetString( GL_VERSION );   const char* extensionsString = (const char*) glGetString( GL_EXTENSIONS );   U32 bufferLen = ( vendorString ? dStrlen( vendorString ) : 0 )                 + ( rendererString ? dStrlen( rendererString ) : 0 )                 + ( versionString  ? dStrlen( versionString ) : 0 )                 + ( extensionsString ? dStrlen( extensionsString ) : 0 )                 + 4;   char* returnString = Con::getReturnBuffer( bufferLen );   dSprintf( returnString, bufferLen, "%s\t%s\t%s\t%s",      ( vendorString ? vendorString : "" ),      ( rendererString ? rendererString : "" ),      ( versionString ? versionString : "" ),      ( extensionsString ? extensionsString : "" ) );   return( returnString );}//------------------------------------------------------------------------------bool OpenGLDevice::getGammaCorrection(F32 &g){   U16 redtable[256];   U16 greentable[256];   U16 bluetable[256];   if (SDL_GetGammaRamp(redtable, greentable, bluetable) == -1)   {      Con::warnf("getGammaCorrection error: %s", SDL_GetError());      return false;   }   F32 csum = 0.0;   U32 ccount = 0;   for (U16 i = 0; i < 256; ++i)   {      if (i != 0 && redtable[i] != 0 && redtable[i] != 65535)      {         F64 b = (F64) i/256.0;         F64 a = (F64) redtable[i]/65535.0;         F32 c = (F32) (mLog(a)/mLog(b));         csum += c;         ++ccount;      }   }   g = csum/ccount;   return true;}//------------------------------------------------------------------------------bool OpenGLDevice::setGammaCorrection(F32 g){   U16 redtable[256];   U16 greentable[256];   U16 bluetable[256];   for (U16 i = 0; i < 256; ++i)      redtable[i] = static_cast<U16>(mPow((F32) i/256.0f, g) * 65535.0f);   dMemcpy(greentable,redtable,256*sizeof(U16));   dMemcpy(bluetable,redtable,256*sizeof(U16));   S32 ok = SDL_SetGammaRamp(redtable, greentable, bluetable);   if (ok == -1)      Con::warnf("Error setting gamma correction: %s", SDL_GetError());   return ok != -1;}//------------------------------------------------------------------------------bool OpenGLDevice::setVerticalSync( bool on ){   Con::printf("WARNING: OpenGLDevice::setVerticalSync is unimplemented %s %d\n", __FILE__, __LINE__);   return false;#if 0   if ( !gGLState.suppSwapInterval )      return( false );   return( qwglSwapIntervalEXT( on ? 1 : 0 ) );#endif}//------------------------------------------------------------------------------DisplayDevice* OpenGLDevice::create(){   return new OpenGLDevice();}#endif // 0
 |