diff options
Diffstat (limited to 'indra/llwindow')
| -rw-r--r-- | indra/llwindow/llwindow.cpp | 12 | ||||
| -rw-r--r-- | indra/llwindow/llwindow.h | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.cpp | 30 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.h | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindowsdl.cpp | 48 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 131 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.h | 1 | 
7 files changed, 172 insertions, 54 deletions
| diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index d77997a928..30bc743e72 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -263,6 +263,18 @@ std::vector<std::string> LLWindow::getDynamicFallbackFontList()  #endif  } +// static +std::vector<std::string> LLWindow::getDisplaysResolutionList() +{ +#if LL_WINDOWS +	return LLWindowWin32::getDisplaysResolutionList(); +#elif LL_DARWIN +	return LLWindowMacOSX::getDisplaysResolutionList(); +#else +	return std::vector<std::string>(); +#endif +} +  #define UTF16_IS_HIGH_SURROGATE(U) ((U16)((U) - 0xD800) < 0x0400)  #define UTF16_IS_LOW_SURROGATE(U)  ((U16)((U) - 0xDC00) < 0x0400)  #define UTF16_SURROGATE_PAIR_TO_UTF32(H,L) (((H) << 10) + (L) - (0xD800 << 10) - 0xDC00 + 0x00010000) diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index f1113acd5f..d4d5b76937 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -169,6 +169,8 @@ public:  	// Get system UI size based on DPI (for 96 DPI UI size should be 1.0)  	virtual F32 getSystemUISize() { return 1.0; } +	static std::vector<std::string> getDisplaysResolutionList(); +      // windows only DirectInput8 for joysticks      virtual void* getDirectInput8() { return NULL; };      virtual bool getInputDevices(U32 device_type_filter, void * devices_callback, void* userdata) { return false; }; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 2604a23c85..0d0607a0bb 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -41,6 +41,7 @@  #include <OpenGL/OpenGL.h>  #include <Carbon/Carbon.h>  #include <CoreServices/CoreServices.h> +#include <CoreGraphics/CGDisplayConfiguration.h>  extern BOOL gDebugWindowProc;  BOOL gHiDPISupport = TRUE; @@ -1911,6 +1912,35 @@ void LLWindowMacOSX::interruptLanguageTextInput()  	commitCurrentPreedit(mGLView);  } +std::vector<std::string> LLWindowMacOSX::getDisplaysResolutionList() +{ +	std::vector<std::string> resolution_list; +	 +	CGDirectDisplayID display_ids[10]; +	uint32_t found_displays = 0; +	CGError err = CGGetActiveDisplayList(10, display_ids, &found_displays); +	 +	if (kCGErrorSuccess != err) +	{ +		LL_WARNS() << "Couldn't get a list of active displays" << LL_ENDL; +		return std::vector<std::string>(); +	} +	 +	for (uint32_t i = 0; i < found_displays; i++) +	{ +		S32 monitor_width = CGDisplayPixelsWide(display_ids[i]); +		S32 monitor_height = CGDisplayPixelsHigh(display_ids[i]); +		 +		std::ostringstream sstream; +		sstream << monitor_width << "x" << monitor_height;; +		std::string res = sstream.str(); +		 +		resolution_list.push_back(res); +	} +	 +	return resolution_list; +} +  //static  std::vector<std::string> LLWindowMacOSX::getDynamicFallbackFontList()  { diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 24651027e8..bf45238c8d 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -114,6 +114,8 @@ public:  	/*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);  	/*virtual*/ F32 getSystemUISize(); +	static std::vector<std::string> getDisplaysResolutionList(); +  	static std::vector<std::string> getDynamicFallbackFontList();  	// Provide native key event data diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index c20e639fc7..85eb9d6d1b 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -51,13 +51,13 @@ extern "C" {  # include "fontconfig/fontconfig.h"  } -#if LL_LINUX || LL_SOLARIS +#if LL_LINUX  // not necessarily available on random SDL platforms, so #if LL_LINUX  // for execv(), waitpid(), fork()  # include <unistd.h>  # include <sys/types.h>  # include <sys/wait.h> -#endif // LL_LINUX || LL_SOLARIS +#endif // LL_LINUX  extern BOOL gDebugWindowProc; @@ -323,12 +323,6 @@ static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str)  static int x11_detect_VRAM_kb()  { -#if LL_SOLARIS && defined(__sparc) -      //  NOTE: there's no Xorg server on SPARC so just return 0 -      //        and allow SDL to attempt to get the amount of VRAM -      return(0); -#else -  	std::string x_log_location("/var/log/");  	std::string fname;  	int rtn = 0; // 'could not detect' @@ -409,7 +403,6 @@ static int x11_detect_VRAM_kb()  		}  	}  	return rtn; -#endif // LL_SOLARIS  }  #endif // LL_X11 @@ -484,27 +477,10 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	SDL_GL_SetAttribute(SDL_GL_RED_SIZE,  8);  	SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);  	SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); -#if !LL_SOLARIS -        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, (bits <= 16) ? 16 : 24); +    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, (bits <= 16) ? 16 : 24);  	// We need stencil support for a few (minor) things.  	if (!getenv("LL_GL_NO_STENCIL"))  		SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); -#else -	// NOTE- use smaller Z-buffer to enable more graphics cards -        //     - This should not affect better GPUs and has been proven -        //	 to provide 24-bit z-buffers when available. -	// -        // As the API states:  -	// -        // GLX_DEPTH_SIZE    Must be followed by a nonnegative -        //                   minimum size specification.  If this -        //                   value is zero, visuals with no depth -        //                   buffer are preferred.  Otherwise, the -        //                   largest available depth buffer of at -        //                   least the minimum size is preferred. - -        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); -#endif          SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, (bits <= 16) ? 1 : 8);          // *FIX: try to toggle vsync here? @@ -682,25 +658,13 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	// fixme: actually, it's REALLY important for picking that we get at  	// least 8 bits each of red,green,blue.  Alpha we can be a bit more  	// relaxed about if we have to. -#if LL_SOLARIS && defined(__sparc) -//  again the __sparc required because Xsun support, 32bit are very pricey on SPARC -	if(colorBits < 24)		//HACK:  on SPARC allow 24-bit color -#else  	if (colorBits < 32) -#endif  	{  		close();  		setupFailure( -#if LL_SOLARIS && defined(__sparc) -			"Second Life requires at least 24-bit color on SPARC to run in a window.\n" -			"Please use fbconfig to set your default color depth to 24 bits.\n" -			"You may also need to adjust the X11 setting in SMF.  To do so use\n" -			"  'svccfg -s svc:/application/x11/x11-server setprop options/default_depth=24'\n" -#else  			"Second Life requires True Color (32-bit) to run in a window.\n"  			"Please go to Control Panels -> Display -> Settings and\n"  			"set the screen to 32-bit color.\n" -#endif  			"Alternately, if you choose to run fullscreen, Second Life\n"  			"will automatically adjust the screen each time it runs.",  			"Error", @@ -2503,7 +2467,7 @@ BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b)  }  #endif // LL_GTK -#if LL_LINUX || LL_SOLARIS +#if LL_LINUX  // extracted from spawnWebBrowser for clarity and to eliminate  //  compiler confusion regarding close(int fd) vs. LLWindow::close()  void exec_cmd(const std::string& cmd, const std::string& arg) @@ -2559,7 +2523,7 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async)  	LL_INFOS() << "spawn_web_browser: " << escaped_url << LL_ENDL; -#if LL_LINUX || LL_SOLARIS +#if LL_LINUX  # if LL_X11  	if (mSDL_Display)  	{ @@ -2578,7 +2542,7 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async)  	cmd += "launch_url.sh";  	arg = escaped_url;  	exec_cmd(cmd, arg); -#endif // LL_LINUX || LL_SOLARIS +#endif // LL_LINUX  	LL_INFOS() << "spawn_web_browser returning." << LL_ENDL;  } diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index e8abb9f31a..b2b123f0da 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -38,6 +38,7 @@  // Linden library includes  #include "llerror.h" +#include "llexception.h"  #include "llfasttimer.h"  #include "llgl.h"  #include "llstring.h" @@ -121,7 +122,7 @@ void show_window_creation_error(const std::string& title)  	LL_WARNS("Window") << title << LL_ENDL;  } -HGLRC SafeCreateContext(HDC hdc) +HGLRC SafeCreateContext(HDC &hdc)  {  	__try   	{ @@ -133,6 +134,22 @@ HGLRC SafeCreateContext(HDC hdc)  	}  } +GLuint SafeChoosePixelFormat(HDC &hdc, const PIXELFORMATDESCRIPTOR *ppfd) +{ +    __try +    { +        return ChoosePixelFormat(hdc, ppfd); +    } +    __except (EXCEPTION_EXECUTE_HANDLER) +    { +        // convert to C++ styled exception +        // C exception don't allow classes, so it's a regular char array +        char integer_string[32]; +        sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode()); +        throw std::exception(integer_string); +    } +} +  //static  BOOL LLWindowWin32::sIsClassRegistered = FALSE; @@ -404,6 +421,39 @@ LLWinImm::~LLWinImm()  } +class LLMonitorInfo +{ +public: + +	std::vector<std::string> getResolutionsList() { return mResList; } + +	LLMonitorInfo() +	{ +		EnumDisplayMonitors(0, 0, MonitorEnum, (LPARAM)this); +	} + +private: + +	static BOOL CALLBACK MonitorEnum(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor, LPARAM pData) +	{ +		int monitor_width = lprcMonitor->right - lprcMonitor->left; +		int monitor_height = lprcMonitor->bottom - lprcMonitor->top; +		 +		std::ostringstream sstream; +		sstream << monitor_width << "x" << monitor_height;; +		std::string res = sstream.str(); + +		LLMonitorInfo* pThis = reinterpret_cast<LLMonitorInfo*>(pData); +		pThis->mResList.push_back(res); + +		return TRUE; +	} + +	std::vector<std::string> mResList; +}; + +static LLMonitorInfo sMonitorInfo; +  LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  							 const std::string& title, const std::string& name, S32 x, S32 y, S32 width,  							 S32 height, U32 flags,  @@ -432,6 +482,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  	memset(mCurrentGammaRamp, 0, sizeof(mCurrentGammaRamp));  	memset(mPrevGammaRamp, 0, sizeof(mPrevGammaRamp));  	mCustomGammaSet = FALSE; +	mWindowHandle = NULL;  	if (!SystemParametersInfo(SPI_GETMOUSEVANISH, 0, &mMouseVanish, 0))  	{ @@ -695,6 +746,37 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  	//		TrackMouseEvent( &track_mouse_event );   	//	} +    // SL-12971 dual GPU display +    DISPLAY_DEVICEA display_device; +    int             display_index = -1; +    DWORD           display_flags = 0; // EDD_GET_DEVICE_INTERFACE_NAME ? +    const size_t    display_bytes = sizeof(display_device); + +    do +    { +        if (display_index >= 0) +        { +            // CHAR DeviceName  [ 32] Adapter name +            // CHAR DeviceString[128] +            CHAR text[256]; + +            size_t name_len = strlen(display_device.DeviceName  ); +            size_t desc_len = strlen(display_device.DeviceString); + +            CHAR *name = name_len ? display_device.DeviceName   : "???"; +            CHAR *desc = desc_len ? display_device.DeviceString : "???"; + +            sprintf(text, "Display Device %d: %s, %s", display_index, name, desc); +            LL_INFOS("Window") << text << LL_ENDL; +        } + +        ::ZeroMemory(&display_device,display_bytes); +        display_device.cb = display_bytes; + +        display_index++; +    }  while( EnumDisplayDevicesA(NULL, display_index, &display_device, display_flags )); + +    LL_INFOS("Window") << "Total Display Devices: " << display_index << LL_ENDL;  	//-----------------------------------------------------------------------  	// Create GL drawing context @@ -1157,7 +1239,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO          << " Height: " << (window_rect.bottom - window_rect.top)          << " Fullscreen: " << mFullscreen          << LL_ENDL; -    if (!destroy_window_handler(mWindowHandle)) +    if (mWindowHandle && !destroy_window_handler(mWindowHandle))      {          LL_WARNS("Window") << "Failed to properly close window before recreating it!" << LL_ENDL;      }	 @@ -1216,11 +1298,24 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  	LL_INFOS("Window") << "Device context retrieved." << LL_ENDL ; -	if (!(pixel_format = ChoosePixelFormat(mhDC, &pfd))) +    try +    { +        // Looks like ChoosePixelFormat can crash in case of faulty driver +        if (!(pixel_format = SafeChoosePixelFormat(mhDC, &pfd)))  	{ +            LL_WARNS("Window") << "ChoosePixelFormat failed, code: " << GetLastError() << LL_ENDL; +            OSMessageBox(mCallbacks->translateString("MBPixelFmtErr"), +                mCallbacks->translateString("MBError"), OSMB_OK);  		close(); +            return FALSE; +        } +    } +    catch (...) +    { +        LOG_UNHANDLED_EXCEPTION("ChoosePixelFormat");  		OSMessageBox(mCallbacks->translateString("MBPixelFmtErr"),  			mCallbacks->translateString("MBError"), OSMB_OK); +        close();  		return FALSE;  	} @@ -1449,21 +1544,27 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		LL_INFOS("Window") << "pixel formats done." << LL_ENDL ;  		S32 swap_method = 0; -		S32 cur_format = num_formats-1; +		S32   cur_format  = 0; +const	S32   max_format  = (S32)num_formats - 1;  		GLint swap_query = WGL_SWAP_METHOD_ARB; -		BOOL found_format = FALSE; - -		while (!found_format && wglGetPixelFormatAttribivARB(mhDC, pixel_format, 0, 1, &swap_query, &swap_method)) +		// SL-14705 Fix name tags showing in front of objects with AMD GPUs. +		// On AMD hardware we need to iterate from the first pixel format to the end. +		// Spec: +		//     https://www.khronos.org/registry/OpenGL/extensions/ARB/WGL_ARB_pixel_format.txt +		while (wglGetPixelFormatAttribivARB(mhDC, pixel_formats[cur_format], 0, 1, &swap_query, &swap_method))  		{ -			if (swap_method == WGL_SWAP_UNDEFINED_ARB || cur_format <= 0) +			if (swap_method == WGL_SWAP_UNDEFINED_ARB)  			{ -				found_format = TRUE; +				break;  			} -			else +			else if (cur_format >= max_format)  			{ -				--cur_format; +				cur_format = 0; +				break;  			} + +			++cur_format;  		}  		pixel_format = pixel_formats[cur_format]; @@ -1482,7 +1583,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		}          // Destroy The Window -        if (!destroy_window_handler(mWindowHandle)) +        if (mWindowHandle && !destroy_window_handler(mWindowHandle))          {              LL_WARNS("Window") << "Failed to properly close window!" << LL_ENDL;          }		 @@ -4288,6 +4389,12 @@ F32 LLWindowWin32::getSystemUISize()  }  //static +std::vector<std::string> LLWindowWin32::getDisplaysResolutionList() +{  +	return sMonitorInfo.getResolutionsList(); +} + +//static  std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()  {  	// Fonts previously in getFontListSans() have moved to fonts.xml. diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index ee0df570e9..0b3d14fb16 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -114,6 +114,7 @@ public:  	LLWindowCallbacks::DragNDropResult completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url ); +	static std::vector<std::string> getDisplaysResolutionList();  	static std::vector<std::string> getDynamicFallbackFontList();  	static void setDPIAwareness(); | 
