Sync with viewer-tiger~
Syncs up llmath stuffs. Thanks to Shyotl for the CMakeLists fix for Wbemuuid.
This commit is contained in:
@@ -2,31 +2,25 @@
|
||||
* @file lldxhardware.cpp
|
||||
* @brief LLDXHardware implementation
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -40,9 +34,12 @@
|
||||
#include <dxdiag.h>
|
||||
#undef INITGUID
|
||||
|
||||
#include <wbemidl.h>
|
||||
|
||||
#include <boost/tokenizer.hpp>
|
||||
|
||||
#include "lldxhardware.h"
|
||||
|
||||
#include "llerror.h"
|
||||
|
||||
#include "llstring.h"
|
||||
@@ -59,11 +56,160 @@ LLDXHardware gDXHardware;
|
||||
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
|
||||
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
|
||||
|
||||
std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
|
||||
typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc,
|
||||
OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,
|
||||
RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities );
|
||||
|
||||
HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
|
||||
{
|
||||
HRESULT hr;
|
||||
HRESULT hr;
|
||||
bool bGotMemory = false;
|
||||
HRESULT hrCoInitialize = S_OK;
|
||||
IWbemLocator* pIWbemLocator = nullptr;
|
||||
IWbemServices* pIWbemServices = nullptr;
|
||||
BSTR pNamespace = nullptr;
|
||||
|
||||
*pdwAdapterRam = 0;
|
||||
hrCoInitialize = CoInitialize( 0 );
|
||||
|
||||
hr = CoCreateInstance( CLSID_WbemLocator,
|
||||
nullptr,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_IWbemLocator,
|
||||
( LPVOID* )&pIWbemLocator );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
|
||||
if( SUCCEEDED( hr ) && pIWbemLocator )
|
||||
{
|
||||
// Using the locator, connect to WMI in the given namespace.
|
||||
pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );
|
||||
|
||||
hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L,
|
||||
0L, nullptr, nullptr, &pIWbemServices );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
if( SUCCEEDED( hr ) && pIWbemServices != 0 )
|
||||
{
|
||||
HINSTANCE hinstOle32 = nullptr;
|
||||
|
||||
hinstOle32 = LoadLibraryW( L"ole32.dll" );
|
||||
if( hinstOle32 )
|
||||
{
|
||||
PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr;
|
||||
|
||||
pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" );
|
||||
if( pfnCoSetProxyBlanket != 0 )
|
||||
{
|
||||
// Switch security level to IMPERSONATE.
|
||||
pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
|
||||
RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 );
|
||||
}
|
||||
|
||||
FreeLibrary( hinstOle32 );
|
||||
}
|
||||
|
||||
IEnumWbemClassObject* pEnumVideoControllers = nullptr;
|
||||
BSTR pClassName = nullptr;
|
||||
|
||||
pClassName = SysAllocString( L"Win32_VideoController" );
|
||||
|
||||
hr = pIWbemServices->CreateInstanceEnum( pClassName, 0,
|
||||
nullptr, &pEnumVideoControllers );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
|
||||
if( SUCCEEDED( hr ) && pEnumVideoControllers )
|
||||
{
|
||||
IWbemClassObject* pVideoControllers[10] = {0};
|
||||
DWORD uReturned = 0;
|
||||
BSTR pPropName = nullptr;
|
||||
|
||||
// Get the first one in the list
|
||||
pEnumVideoControllers->Reset();
|
||||
hr = pEnumVideoControllers->Next( 5000, // timeout in 5 seconds
|
||||
10, // return the first 10
|
||||
pVideoControllers,
|
||||
&uReturned );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr );
|
||||
if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" );
|
||||
#endif
|
||||
|
||||
VARIANT var;
|
||||
if( SUCCEEDED( hr ) )
|
||||
{
|
||||
bool bFound = false;
|
||||
for( UINT iController = 0; iController < uReturned; iController++ )
|
||||
{
|
||||
if ( !pVideoControllers[iController] )
|
||||
continue;
|
||||
|
||||
pPropName = SysAllocString( L"PNPDeviceID" );
|
||||
hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) )
|
||||
wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
if( SUCCEEDED( hr ) )
|
||||
{
|
||||
if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
|
||||
bFound = true;
|
||||
}
|
||||
VariantClear( &var );
|
||||
if( pPropName ) SysFreeString( pPropName );
|
||||
|
||||
if( bFound )
|
||||
{
|
||||
pPropName = SysAllocString( L"AdapterRAM" );
|
||||
hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) )
|
||||
wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n",
|
||||
hr );
|
||||
#endif
|
||||
if( SUCCEEDED( hr ) )
|
||||
{
|
||||
bGotMemory = true;
|
||||
*pdwAdapterRam = var.ulVal;
|
||||
}
|
||||
VariantClear( &var );
|
||||
if( pPropName ) SysFreeString( pPropName );
|
||||
break;
|
||||
}
|
||||
SAFE_RELEASE( pVideoControllers[iController] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( pClassName )
|
||||
SysFreeString( pClassName );
|
||||
SAFE_RELEASE( pEnumVideoControllers );
|
||||
}
|
||||
|
||||
if( pNamespace )
|
||||
SysFreeString( pNamespace );
|
||||
SAFE_RELEASE( pIWbemServices );
|
||||
}
|
||||
|
||||
SAFE_RELEASE( pIWbemLocator );
|
||||
|
||||
if( SUCCEEDED( hrCoInitialize ) )
|
||||
CoUninitialize();
|
||||
|
||||
if( bGotMemory )
|
||||
return S_OK;
|
||||
else
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPropValue, int outputSize)
|
||||
{
|
||||
HRESULT hr;
|
||||
VARIANT var;
|
||||
WCHAR wszPropValue[256];
|
||||
|
||||
VariantInit( &var );
|
||||
hr = containerp->GetProp(wszPropName, &var );
|
||||
@@ -82,13 +228,19 @@ std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
|
||||
wcscpy( wszPropValue, (var.boolVal) ? L"true" : L"false" ); /* Flawfinder: ignore */
|
||||
break;
|
||||
case VT_BSTR:
|
||||
wcsncpy( wszPropValue, var.bstrVal, 255 ); /* Flawfinder: ignore */
|
||||
wszPropValue[255] = 0;
|
||||
wcsncpy( wszPropValue, var.bstrVal, outputSize-1 ); /* Flawfinder: ignore */
|
||||
wszPropValue[outputSize-1] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Clear the variant (this is needed to free BSTR memory)
|
||||
VariantClear( &var );
|
||||
}
|
||||
|
||||
std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
|
||||
{
|
||||
WCHAR wszPropValue[256];
|
||||
get_wstring(containerp, wszPropName, wszPropValue, 256);
|
||||
|
||||
return utf16str_to_utf8str(wszPropValue);
|
||||
}
|
||||
@@ -126,7 +278,7 @@ BOOL LLVersion::set(const std::string &version_string)
|
||||
}
|
||||
if (count < 4)
|
||||
{
|
||||
//llwarns << "Potentially bogus version string!" << version_string << llendl;
|
||||
//LL_WARNS() << "Potentially bogus version string!" << version_string << LL_ENDL;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
mFields[i] = 0;
|
||||
@@ -177,6 +329,7 @@ std::string LLDXDriverFile::dump()
|
||||
LLDXDevice::~LLDXDevice()
|
||||
{
|
||||
for_each(mDriverFiles.begin(), mDriverFiles.end(), DeletePairedPointer());
|
||||
mDriverFiles.clear();
|
||||
}
|
||||
|
||||
std::string LLDXDevice::dump()
|
||||
@@ -236,6 +389,7 @@ LLDXHardware::LLDXHardware()
|
||||
void LLDXHardware::cleanup()
|
||||
{
|
||||
// for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer());
|
||||
// mDevices.clear();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -365,8 +519,18 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
|
||||
goto LCleanup;
|
||||
}
|
||||
|
||||
// Get the English VRAM string
|
||||
DWORD vram = 0;
|
||||
|
||||
WCHAR deviceID[512];
|
||||
|
||||
get_wstring(device_containerp, L"szDeviceID", deviceID, 512);
|
||||
|
||||
if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram)))
|
||||
{
|
||||
mVRAM = vram/(1024*1024);
|
||||
}
|
||||
else
|
||||
{ // Get the English VRAM string
|
||||
std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
|
||||
|
||||
// We don't need the device any more
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
// Linden library includes
|
||||
#include "llerror.h"
|
||||
#include "llfasttimer.h"
|
||||
#include "llgl.h"
|
||||
#include "llstring.h"
|
||||
#include "lldir.h"
|
||||
@@ -58,8 +59,6 @@
|
||||
#include <dinput.h>
|
||||
#include <Dbt.h.>
|
||||
|
||||
#include "llfasttimer.h"
|
||||
|
||||
// culled from winuser.h
|
||||
#ifndef WM_MOUSEWHEEL /* Added to be compatible with later SDK's */
|
||||
const S32 WM_MOUSEWHEEL = 0x020A;
|
||||
@@ -87,6 +86,18 @@ void show_window_creation_error(const std::string& title)
|
||||
LL_WARNS("Window") << title << LL_ENDL;
|
||||
}
|
||||
|
||||
HGLRC SafeCreateContext(HDC hdc)
|
||||
{
|
||||
__try
|
||||
{
|
||||
return wglCreateContext(hdc);
|
||||
}
|
||||
__except(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
BOOL LLWindowWin32::sIsClassRegistered = FALSE;
|
||||
|
||||
@@ -163,7 +174,6 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
|
||||
// Check system metrics
|
||||
if ( !GetSystemMetrics( SM_DBCSENABLED ) )
|
||||
return;
|
||||
|
||||
|
||||
mHImmDll = LoadLibraryA("Imm32");
|
||||
if (mHImmDll != NULL)
|
||||
@@ -205,7 +215,7 @@ LLWinImm::LLWinImm() : mHImmDll(NULL)
|
||||
// the case, since it is very unusual; these APIs are available from
|
||||
// the beginning, and all versions of IMM32.DLL should have them all.
|
||||
// Unfortunately, this code may be executed before initialization of
|
||||
// the logging channel (llwarns), and we can't do it here... Yes, this
|
||||
// the logging channel (LL_WARNS()), and we can't do it here... Yes, this
|
||||
// is one of disadvantages to use static constraction to DLL loading.
|
||||
FreeLibrary(mHImmDll);
|
||||
mHImmDll = NULL;
|
||||
@@ -554,6 +564,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
|
||||
if (closest_refresh == 0)
|
||||
{
|
||||
LL_WARNS("Window") << "Couldn't find display mode " << width << " by " << height << " at " << BITS_PER_PIXEL << " bits per pixel" << LL_ENDL;
|
||||
//success = FALSE;
|
||||
|
||||
if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
|
||||
{
|
||||
@@ -1012,7 +1023,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
dw_ex_style = WS_EX_APPWINDOW;
|
||||
dw_style = WS_POPUP;
|
||||
|
||||
// Move window borders out not to cover window contents
|
||||
// Move window borders out not to cover window contents.
|
||||
// This converts client rect to window rect, i.e. expands it by the window border size.
|
||||
AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style);
|
||||
}
|
||||
// If it failed, we don't want to run fullscreen
|
||||
@@ -1059,7 +1071,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
mhInstance,
|
||||
NULL);
|
||||
|
||||
LL_INFOS("Window") << "window is created." << llendl ;
|
||||
LL_INFOS("Window") << "window is created." << LL_ENDL ;
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Create GL drawing context
|
||||
@@ -1092,7 +1104,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LL_INFOS("Window") << "Device context retrieved." << llendl ;
|
||||
LL_INFOS("Window") << "Device context retrieved." << LL_ENDL ;
|
||||
|
||||
if (!(pixel_format = ChoosePixelFormat(mhDC, &pfd)))
|
||||
{
|
||||
@@ -1102,7 +1114,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LL_INFOS("Window") << "Pixel format chosen." << llendl ;
|
||||
LL_INFOS("Window") << "Pixel format chosen." << LL_ENDL ;
|
||||
|
||||
// Verify what pixel format we actually received.
|
||||
if (!DescribePixelFormat(mhDC, pixel_format, sizeof(PIXELFORMATDESCRIPTOR),
|
||||
@@ -1115,35 +1127,35 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
}
|
||||
|
||||
// (EXP-1765) dump pixel data to see if there is a pattern that leads to unreproducible crash
|
||||
LL_INFOS("Window") << "--- begin pixel format dump ---" << llendl ;
|
||||
LL_INFOS("Window") << "pixel_format is " << pixel_format << llendl ;
|
||||
LL_INFOS("Window") << "pfd.nSize: " << pfd.nSize << llendl ;
|
||||
LL_INFOS("Window") << "pfd.nVersion: " << pfd.nVersion << llendl ;
|
||||
LL_INFOS("Window") << "pfd.dwFlags: 0x" << std::hex << pfd.dwFlags << std::dec << llendl ;
|
||||
LL_INFOS("Window") << "pfd.iPixelType: " << (int)pfd.iPixelType << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cColorBits: " << (int)pfd.cColorBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cRedBits: " << (int)pfd.cRedBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cRedShift: " << (int)pfd.cRedShift << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cGreenBits: " << (int)pfd.cGreenBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cGreenShift: " << (int)pfd.cGreenShift << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cBlueBits: " << (int)pfd.cBlueBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cBlueShift: " << (int)pfd.cBlueShift << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAlphaBits: " << (int)pfd.cAlphaBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAlphaShift: " << (int)pfd.cAlphaShift << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAccumBits: " << (int)pfd.cAccumBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAccumRedBits: " << (int)pfd.cAccumRedBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAccumGreenBits: " << (int)pfd.cAccumGreenBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAccumBlueBits: " << (int)pfd.cAccumBlueBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAccumAlphaBits: " << (int)pfd.cAccumAlphaBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cDepthBits: " << (int)pfd.cDepthBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cStencilBits: " << (int)pfd.cStencilBits << llendl ;
|
||||
LL_INFOS("Window") << "pfd.cAuxBuffers: " << (int)pfd.cAuxBuffers << llendl ;
|
||||
LL_INFOS("Window") << "pfd.iLayerType: " << (int)pfd.iLayerType << llendl ;
|
||||
LL_INFOS("Window") << "pfd.bReserved: " << (int)pfd.bReserved << llendl ;
|
||||
LL_INFOS("Window") << "pfd.dwLayerMask: " << pfd.dwLayerMask << llendl ;
|
||||
LL_INFOS("Window") << "pfd.dwVisibleMask: " << pfd.dwVisibleMask << llendl ;
|
||||
LL_INFOS("Window") << "pfd.dwDamageMask: " << pfd.dwDamageMask << llendl ;
|
||||
LL_INFOS("Window") << "--- end pixel format dump ---" << llendl ;
|
||||
LL_INFOS("Window") << "--- begin pixel format dump ---" << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pixel_format is " << pixel_format << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.nSize: " << pfd.nSize << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.nVersion: " << pfd.nVersion << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.dwFlags: 0x" << std::hex << pfd.dwFlags << std::dec << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.iPixelType: " << (int)pfd.iPixelType << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cColorBits: " << (int)pfd.cColorBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cRedBits: " << (int)pfd.cRedBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cRedShift: " << (int)pfd.cRedShift << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cGreenBits: " << (int)pfd.cGreenBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cGreenShift: " << (int)pfd.cGreenShift << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cBlueBits: " << (int)pfd.cBlueBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cBlueShift: " << (int)pfd.cBlueShift << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAlphaBits: " << (int)pfd.cAlphaBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAlphaShift: " << (int)pfd.cAlphaShift << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAccumBits: " << (int)pfd.cAccumBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAccumRedBits: " << (int)pfd.cAccumRedBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAccumGreenBits: " << (int)pfd.cAccumGreenBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAccumBlueBits: " << (int)pfd.cAccumBlueBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAccumAlphaBits: " << (int)pfd.cAccumAlphaBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cDepthBits: " << (int)pfd.cDepthBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cStencilBits: " << (int)pfd.cStencilBits << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.cAuxBuffers: " << (int)pfd.cAuxBuffers << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.iLayerType: " << (int)pfd.iLayerType << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.bReserved: " << (int)pfd.bReserved << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.dwLayerMask: " << pfd.dwLayerMask << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.dwVisibleMask: " << pfd.dwVisibleMask << LL_ENDL ;
|
||||
LL_INFOS("Window") << "pfd.dwDamageMask: " << pfd.dwDamageMask << LL_ENDL ;
|
||||
LL_INFOS("Window") << "--- end pixel format dump ---" << LL_ENDL ;
|
||||
|
||||
if (pfd.cColorBits < 32)
|
||||
{
|
||||
@@ -1169,7 +1181,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!(mhRC = wglCreateContext(mhDC)))
|
||||
if (!(mhRC = SafeCreateContext(mhDC)))
|
||||
{
|
||||
close();
|
||||
OSMessageBox(mCallbacks->translateString("MBGLContextErr"),
|
||||
@@ -1185,7 +1197,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LL_INFOS("Window") << "Drawing context is created." << llendl ;
|
||||
LL_INFOS("Window") << "Drawing context is created." << LL_ENDL ;
|
||||
|
||||
gGLManager.initWGL();
|
||||
|
||||
@@ -1323,142 +1335,15 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL;
|
||||
}
|
||||
|
||||
LL_INFOS("Window") << "pixel formats done." << llendl ;
|
||||
|
||||
/*for(int i = 0; i <= num_formats-1; ++i)
|
||||
{
|
||||
GLint query[] = { WGL_SAMPLE_BUFFERS_ARB,
|
||||
WGL_SAMPLES_ARB,
|
||||
WGL_NUMBER_PIXEL_FORMATS_ARB,
|
||||
WGL_DRAW_TO_WINDOW_ARB,
|
||||
WGL_DRAW_TO_BITMAP_ARB,
|
||||
WGL_ACCELERATION_ARB,
|
||||
WGL_NEED_PALETTE_ARB,
|
||||
WGL_NEED_SYSTEM_PALETTE_ARB,
|
||||
WGL_SWAP_LAYER_BUFFERS_ARB,
|
||||
WGL_SWAP_METHOD_ARB,
|
||||
WGL_NUMBER_OVERLAYS_ARB,
|
||||
WGL_NUMBER_UNDERLAYS_ARB,
|
||||
WGL_TRANSPARENT_ARB,
|
||||
WGL_TRANSPARENT_RED_VALUE_ARB,
|
||||
WGL_TRANSPARENT_GREEN_VALUE_ARB,
|
||||
WGL_TRANSPARENT_BLUE_VALUE_ARB,
|
||||
WGL_TRANSPARENT_ALPHA_VALUE_ARB,
|
||||
WGL_TRANSPARENT_INDEX_VALUE_ARB,
|
||||
WGL_SHARE_DEPTH_ARB,
|
||||
WGL_SHARE_STENCIL_ARB,
|
||||
WGL_SHARE_ACCUM_ARB,
|
||||
WGL_SUPPORT_GDI_ARB,
|
||||
WGL_SUPPORT_OPENGL_ARB,
|
||||
WGL_DOUBLE_BUFFER_ARB,
|
||||
WGL_STEREO_ARB,
|
||||
WGL_PIXEL_TYPE_ARB,
|
||||
WGL_COLOR_BITS_ARB,
|
||||
WGL_RED_BITS_ARB,
|
||||
WGL_RED_SHIFT_ARB,
|
||||
WGL_GREEN_BITS_ARB,
|
||||
WGL_GREEN_SHIFT_ARB,
|
||||
WGL_BLUE_BITS_ARB,
|
||||
WGL_BLUE_SHIFT_ARB,
|
||||
WGL_ALPHA_BITS_ARB,
|
||||
WGL_ALPHA_SHIFT_ARB,
|
||||
WGL_ACCUM_BITS_ARB,
|
||||
WGL_ACCUM_RED_BITS_ARB,
|
||||
WGL_ACCUM_GREEN_BITS_ARB,
|
||||
WGL_ACCUM_BLUE_BITS_ARB,
|
||||
WGL_ACCUM_ALPHA_BITS_ARB,
|
||||
WGL_DEPTH_BITS_ARB,
|
||||
WGL_STENCIL_BITS_ARB,
|
||||
WGL_AUX_BUFFERS_ARB};
|
||||
std::string names[] = { "WGL_SAMPLE_BUFFERS_ARB",
|
||||
"WGL_SAMPLES_ARB",
|
||||
"WGL_NUMBER_PIXEL_FORMATS_ARB",
|
||||
"WGL_DRAW_TO_WINDOW_ARB",
|
||||
"WGL_DRAW_TO_BITMAP_ARB",
|
||||
"WGL_ACCELERATION_ARB",
|
||||
"WGL_NEED_PALETTE_ARB",
|
||||
"WGL_NEED_SYSTEM_PALETTE_ARB",
|
||||
"WGL_SWAP_LAYER_BUFFERS_ARB",
|
||||
"WGL_SWAP_METHOD_ARB",
|
||||
"WGL_NUMBER_OVERLAYS_ARB",
|
||||
"WGL_NUMBER_UNDERLAYS_ARB",
|
||||
"WGL_TRANSPARENT_ARB",
|
||||
"WGL_TRANSPARENT_RED_VALUE_ARB",
|
||||
"WGL_TRANSPARENT_GREEN_VALUE_ARB",
|
||||
"WGL_TRANSPARENT_BLUE_VALUE_ARB",
|
||||
"WGL_TRANSPARENT_ALPHA_VALUE_ARB",
|
||||
"WGL_TRANSPARENT_INDEX_VALUE_ARB",
|
||||
"WGL_SHARE_DEPTH_ARB",
|
||||
"WGL_SHARE_STENCIL_ARB",
|
||||
"WGL_SHARE_ACCUM_ARB",
|
||||
"WGL_SUPPORT_GDI_ARB",
|
||||
"WGL_SUPPORT_OPENGL_ARB",
|
||||
"WGL_DOUBLE_BUFFER_ARB",
|
||||
"WGL_STEREO_ARB",
|
||||
"WGL_PIXEL_TYPE_ARB",
|
||||
"WGL_COLOR_BITS_ARB",
|
||||
"WGL_RED_BITS_ARB",
|
||||
"WGL_RED_SHIFT_ARB",
|
||||
"WGL_GREEN_BITS_ARB",
|
||||
"WGL_GREEN_SHIFT_ARB",
|
||||
"WGL_BLUE_BITS_ARB",
|
||||
"WGL_BLUE_SHIFT_ARB",
|
||||
"WGL_ALPHA_BITS_ARB",
|
||||
"WGL_ALPHA_SHIFT_ARB",
|
||||
"WGL_ACCUM_BITS_ARB",
|
||||
"WGL_ACCUM_RED_BITS_ARB",
|
||||
"WGL_ACCUM_GREEN_BITS_ARB",
|
||||
"WGL_ACCUM_BLUE_BITS_ARB",
|
||||
"WGL_ACCUM_ALPHA_BITS_ARB",
|
||||
"WGL_DEPTH_BITS_ARB",
|
||||
"WGL_STENCIL_BITS_ARB",
|
||||
"WGL_AUX_BUFFERS_ARB"};
|
||||
S32 results[sizeof(query)/sizeof(query[0])]={0};
|
||||
|
||||
if(wglGetPixelFormatAttribivARB(mhDC, pixel_formats[i], 0, sizeof(query)/sizeof(query[0]), query, results))
|
||||
{
|
||||
llinfos << i << ":" << llendl;
|
||||
for(int j = 0; j < sizeof(query)/sizeof(query[0]); ++j)
|
||||
{
|
||||
switch(results[j])
|
||||
{
|
||||
case WGL_NO_ACCELERATION_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_NO_ACCELERATION_ARB" << llendl;
|
||||
break;
|
||||
case WGL_GENERIC_ACCELERATION_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_GENERIC_ACCELERATION_ARB" << llendl;
|
||||
break;
|
||||
case WGL_FULL_ACCELERATION_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_FULL_ACCELERATION_ARB" << llendl;
|
||||
break;
|
||||
case WGL_SWAP_EXCHANGE_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_SWAP_EXCHANGE_ARB" << llendl;
|
||||
break;
|
||||
case WGL_SWAP_COPY_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_SWAP_COPY_ARB" << llendl;
|
||||
break;
|
||||
case WGL_SWAP_UNDEFINED_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_SWAP_UNDEFINED_ARB" << llendl;
|
||||
break;
|
||||
case WGL_TYPE_RGBA_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_TYPE_RGBA_ARB" << llendl;
|
||||
break;
|
||||
case WGL_TYPE_COLORINDEX_ARB:
|
||||
llinfos << " " << names[j] << " = " << "WGL_TYPE_COLORINDEX_ARB" << llendl;
|
||||
break;
|
||||
default:
|
||||
llinfos << " " << names[j] << " = " << results[j] << llendl;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
LL_INFOS("Window") << "pixel formats done." << LL_ENDL ;
|
||||
|
||||
//Singu note: Reversed order of this loop. Generally, choosepixelformat returns an array with the closer matches towards the start.
|
||||
S32 swap_method = 0;
|
||||
S32 cur_format = 0;//num_formats-1;
|
||||
GLint swap_query = WGL_SWAP_METHOD_ARB;
|
||||
|
||||
BOOL found_format = FALSE;
|
||||
|
||||
while (!found_format && wglGetPixelFormatAttribivARB(mhDC, pixel_formats[cur_format], 0, 1, &swap_query, &swap_method))
|
||||
{
|
||||
if (swap_method == WGL_SWAP_UNDEFINED_ARB /*|| cur_format <= 0*/)
|
||||
@@ -1507,7 +1392,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
mhInstance,
|
||||
NULL);
|
||||
|
||||
LL_INFOS("Window") << "recreate window done." << llendl ;
|
||||
LL_INFOS("Window") << "recreate window done." << LL_ENDL ;
|
||||
|
||||
if (!(mhDC = GetDC(mWindowHandle)))
|
||||
{
|
||||
@@ -1747,6 +1632,7 @@ BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
// Inform the application of the new mouse position (needed for per-frame
|
||||
// hover/picking to function).
|
||||
mCallbacks->handleMouseMove(this, position.convert(), (MASK)0);
|
||||
@@ -1996,6 +1882,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
|
||||
// This helps prevent avatar walking after maximizing the window by double-clicking the title bar.
|
||||
static bool sHandleLeftMouseUp = true;
|
||||
|
||||
// Ignore the double click received right after activating app.
|
||||
// This is to avoid triggering double click teleport after returning focus (see MAINT-3786).
|
||||
static bool sHandleDoubleClick = true;
|
||||
|
||||
LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr(h_wnd, GWLP_USERDATA);
|
||||
|
||||
|
||||
@@ -2123,6 +2013,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
|
||||
}
|
||||
}
|
||||
|
||||
if (!activating)
|
||||
{
|
||||
sHandleDoubleClick = false;
|
||||
}
|
||||
|
||||
window_imp->mCallbacks->handleActivateApp(window_imp, activating);
|
||||
|
||||
break;
|
||||
@@ -2347,6 +2242,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
|
||||
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_NCLBUTTONDOWN");
|
||||
// A click in a non-client area, e.g. title bar or window border.
|
||||
sHandleLeftMouseUp = false;
|
||||
sHandleDoubleClick = true;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2391,6 +2287,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
|
||||
//case WM_RBUTTONDBLCLK:
|
||||
{
|
||||
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONDBLCLK");
|
||||
|
||||
if (!sHandleDoubleClick)
|
||||
{
|
||||
sHandleDoubleClick = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Because we move the cursor position in the app, we need to query
|
||||
// to find out where the cursor at the time the event is handled.
|
||||
// If we don't do this, many clicks could get buffered up, and if the
|
||||
|
||||
Reference in New Issue
Block a user