diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-06-07 21:04:46 +0300 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-06-07 21:04:46 +0300 | 
| commit | 88ac2812b421f1eb5ab2af6fb793b23025da29a4 (patch) | |
| tree | bcb2c7e6d61a91aeda14b7fa6424dfe1e50d5f83 /indra/llwindow | |
| parent | e00edbeb4a7edfe4f190ac7bf2197aa8240e50c6 (diff) | |
| parent | 4623b822386accfae5907c88099c2a88377a0271 (diff) | |
Merge branch 'master' into DRTVWR-522-maint
Diffstat (limited to 'indra/llwindow')
| -rw-r--r-- | indra/llwindow/llwindowsdl.cpp | 48 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 67 | 
2 files changed, 58 insertions, 57 deletions
| 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 f774cd0d31..b2b123f0da 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -483,7 +483,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  	memset(mPrevGammaRamp, 0, sizeof(mPrevGammaRamp));  	mCustomGammaSet = FALSE;  	mWindowHandle = NULL; - +	  	if (!SystemParametersInfo(SPI_GETMOUSEVANISH, 0, &mMouseVanish, 0))  	{  		mMouseVanish = TRUE; @@ -746,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 @@ -1271,22 +1302,22 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO      {          // 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(); +		close();              return FALSE;          }      }      catch (...)      {          LOG_UNHANDLED_EXCEPTION("ChoosePixelFormat"); -        OSMessageBox(mCallbacks->translateString("MBPixelFmtErr"), -            mCallbacks->translateString("MBError"), OSMB_OK); +		OSMessageBox(mCallbacks->translateString("MBPixelFmtErr"), +			mCallbacks->translateString("MBError"), OSMB_OK);          close(); -        return FALSE; -    } +		return FALSE; +	}  	LL_INFOS("Window") << "Pixel format chosen." << LL_ENDL ; @@ -1513,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]; | 
