2010-08-13 19:43:35 +04:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2012-05-21 15:12:37 +04:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/. */
2010-08-13 19:43:35 +04:00
2013-12-09 06:52:54 +04:00
# include "mozilla/ArrayUtils.h"
2011-10-11 09:50:08 +04:00
2010-08-27 19:49:02 +04:00
# include <windows.h>
2011-01-24 18:05:59 +03:00
# include <setupapi.h>
2010-08-13 19:43:35 +04:00
# include "gfxWindowsPlatform.h"
# include "GfxInfo.h"
2010-12-16 23:49:54 +03:00
# include "GfxInfoWebGL.h"
2010-08-27 19:49:02 +04:00
# include "nsUnicharUtils.h"
2010-11-05 22:57:58 +03:00
# include "prenv.h"
# include "prprf.h"
2011-01-20 04:21:07 +03:00
# include "GfxDriverInfo.h"
2011-06-24 21:41:18 +04:00
# include "mozilla/Preferences.h"
2015-05-15 20:43:38 +03:00
# include "mozilla/gfx/Logging.h"
2011-12-15 09:03:01 +04:00
# include "nsPrintfCString.h"
2015-07-13 11:12:41 +03:00
# include "jsapi.h"
2010-08-13 19:43:35 +04:00
2011-05-23 20:54:47 +04:00
# if defined(MOZ_CRASHREPORTER)
2010-08-27 19:49:04 +04:00
# include "nsExceptionHandler.h"
# include "nsICrashReporter.h"
# define NS_CRASHREPORTER_CONTRACTID "@mozilla.org / toolkit / crash-reporter;1"
# endif
2011-10-11 09:50:08 +04:00
using namespace mozilla ;
2010-08-13 19:43:35 +04:00
using namespace mozilla : : widget ;
2011-01-20 04:39:33 +03:00
# ifdef DEBUG
2015-02-09 00:29:13 +03:00
NS_IMPL_ISUPPORTS_INHERITED ( GfxInfo , GfxInfoBase , nsIGfxInfo2 , nsIGfxInfoDebug )
# else
NS_IMPL_ISUPPORTS_INHERITED ( GfxInfo , GfxInfoBase , nsIGfxInfo2 )
2011-01-20 04:39:33 +03:00
# endif
2012-08-22 19:56:38 +04:00
static const uint32_t allWindowsVersions = 0xffffffff ;
2011-01-29 05:12:25 +03:00
2011-01-20 04:37:24 +03:00
GfxInfo : : GfxInfo ( )
2011-12-15 09:03:01 +04:00
: mWindowsVersion ( 0 ) ,
2011-10-02 06:16:19 +04:00
mHasDualGPU ( false ) ,
mIsGPU2Active ( false )
2011-01-20 04:37:24 +03:00
{
}
2010-08-28 18:18:41 +04:00
/* GetD2DEnabled and GetDwriteEnabled shouldn't be called until after gfxPlatform initialization
* has occurred because they depend on it for information . ( See bug 591561 ) */
2010-08-31 01:45:29 +04:00
nsresult
2011-09-29 10:19:26 +04:00
GfxInfo : : GetD2DEnabled ( bool * aEnabled )
2010-08-13 19:43:35 +04:00
{
* aEnabled = gfxWindowsPlatform : : GetPlatform ( ) - > GetRenderMode ( ) = = gfxWindowsPlatform : : RENDER_DIRECT2D ;
return NS_OK ;
}
2010-08-16 11:15:03 +04:00
2010-08-31 01:45:29 +04:00
nsresult
2011-09-29 10:19:26 +04:00
GfxInfo : : GetDWriteEnabled ( bool * aEnabled )
2010-08-16 11:15:03 +04:00
{
* aEnabled = gfxWindowsPlatform : : GetPlatform ( ) - > DWriteEnabled ( ) ;
return NS_OK ;
}
2010-08-27 19:49:02 +04:00
2011-01-14 15:57:17 +03:00
NS_IMETHODIMP
GfxInfo : : GetDWriteVersion ( nsAString & aDwriteVersion )
{
2011-04-21 23:36:49 +04:00
gfxWindowsPlatform : : GetDLLVersion ( L " dwrite.dll " , aDwriteVersion ) ;
2011-01-14 15:57:17 +03:00
return NS_OK ;
}
2011-05-11 04:30:20 +04:00
# define PIXEL_STRUCT_RGB 1
# define PIXEL_STRUCT_BGR 2
NS_IMETHODIMP
GfxInfo : : GetCleartypeParameters ( nsAString & aCleartypeParams )
{
nsTArray < ClearTypeParameterInfo > clearTypeParams ;
gfxWindowsPlatform : : GetPlatform ( ) - > GetCleartypeParams ( clearTypeParams ) ;
2012-08-22 19:56:38 +04:00
uint32_t d , numDisplays = clearTypeParams . Length ( ) ;
2011-05-11 04:30:20 +04:00
bool displayNames = ( numDisplays > 1 ) ;
bool foundData = false ;
nsString outStr ;
for ( d = 0 ; d < numDisplays ; d + + ) {
ClearTypeParameterInfo & params = clearTypeParams [ d ] ;
if ( displayNames ) {
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " %s [ " , params . displayName . get ( ) ) ;
2011-05-11 04:30:20 +04:00
}
if ( params . gamma > = 0 ) {
foundData = true ;
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " Gamma: %d " , params . gamma ) ;
2011-05-11 04:30:20 +04:00
}
if ( params . pixelStructure > = 0 ) {
foundData = true ;
if ( params . pixelStructure = = PIXEL_STRUCT_RGB | |
params . pixelStructure = = PIXEL_STRUCT_BGR )
{
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " Pixel Structure: %s " ,
2011-05-11 04:30:20 +04:00
( params . pixelStructure = = PIXEL_STRUCT_RGB ?
L " RGB " : L " BGR " ) ) ;
} else {
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " Pixel Structure: %d " , params . pixelStructure ) ;
2011-05-11 04:30:20 +04:00
}
}
if ( params . clearTypeLevel > = 0 ) {
foundData = true ;
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " ClearType Level: %d " , params . clearTypeLevel ) ;
2011-05-11 04:30:20 +04:00
}
if ( params . enhancedContrast > = 0 ) {
foundData = true ;
2013-12-03 19:12:57 +04:00
outStr . AppendPrintf ( " Enhanced Contrast: %d " , params . enhancedContrast ) ;
2011-05-11 04:30:20 +04:00
}
if ( displayNames ) {
2013-12-03 19:12:57 +04:00
outStr . Append ( MOZ_UTF16 ( " ] " ) ) ;
2011-05-11 04:30:20 +04:00
}
}
if ( foundData ) {
aCleartypeParams . Assign ( outStr ) ;
return NS_OK ;
}
return NS_ERROR_FAILURE ;
}
2010-09-28 00:18:56 +04:00
static nsresult GetKeyValue ( const WCHAR * keyLocation , const WCHAR * keyName , nsAString & destString , int type )
2010-08-27 19:49:02 +04:00
{
HKEY key ;
DWORD dwcbData ;
DWORD dValue ;
2010-08-28 18:16:00 +04:00
DWORD resultType ;
2010-08-27 19:49:02 +04:00
LONG result ;
nsresult retval = NS_OK ;
result = RegOpenKeyExW ( HKEY_LOCAL_MACHINE , keyLocation , 0 , KEY_QUERY_VALUE , & key ) ;
if ( result ! = ERROR_SUCCESS ) {
return NS_ERROR_FAILURE ;
}
switch ( type ) {
case REG_DWORD : {
// We only use this for vram size
dwcbData = sizeof ( dValue ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , keyName , nullptr , & resultType ,
( LPBYTE ) & dValue , & dwcbData ) ;
2010-08-28 18:16:00 +04:00
if ( result = = ERROR_SUCCESS & & resultType = = REG_DWORD ) {
dValue = dValue / 1024 / 1024 ;
2012-08-22 19:56:38 +04:00
destString . AppendInt ( int32_t ( dValue ) ) ;
2010-08-28 18:16:00 +04:00
} else {
2010-08-27 19:49:02 +04:00
retval = NS_ERROR_FAILURE ;
}
break ;
}
case REG_MULTI_SZ : {
// A chain of null-separated strings; we convert the nulls to spaces
2010-08-28 18:16:00 +04:00
WCHAR wCharValue [ 1024 ] ;
dwcbData = sizeof ( wCharValue ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , keyName , nullptr , & resultType ,
( LPBYTE ) wCharValue , & dwcbData ) ;
2010-08-28 18:16:00 +04:00
if ( result = = ERROR_SUCCESS & & resultType = = REG_MULTI_SZ ) {
// This bit here could probably be cleaner.
bool isValid = false ;
DWORD strLen = dwcbData / sizeof ( wCharValue [ 0 ] ) ;
for ( DWORD i = 0 ; i < strLen ; i + + ) {
if ( wCharValue [ i ] = = ' \0 ' ) {
if ( i < strLen - 1 & & wCharValue [ i + 1 ] = = ' \0 ' ) {
isValid = true ;
break ;
} else {
wCharValue [ i ] = ' ' ;
}
}
}
// ensure wCharValue is null terminated
wCharValue [ strLen - 1 ] = ' \0 ' ;
if ( isValid )
destString = wCharValue ;
} else {
2010-08-27 19:49:02 +04:00
retval = NS_ERROR_FAILURE ;
}
2010-08-28 18:16:00 +04:00
2010-08-27 19:49:02 +04:00
break ;
}
}
RegCloseKey ( key ) ;
return retval ;
}
2011-08-21 03:01:11 +04:00
// The device ID is a string like PCI\VEN_15AD&DEV_0405&SUBSYS_040515AD
// this function is used to extract the id's out of it
2012-08-22 19:56:38 +04:00
uint32_t
2011-08-21 03:01:11 +04:00
ParseIDFromDeviceID ( const nsAString & key , const char * prefix , int length )
{
nsAutoString id ( key ) ;
ToUpperCase ( id ) ;
2012-08-22 19:56:38 +04:00
int32_t start = id . Find ( prefix ) ;
2011-08-21 03:01:11 +04:00
if ( start ! = - 1 ) {
id . Cut ( 0 , start + strlen ( prefix ) ) ;
id . Truncate ( length ) ;
}
nsresult err ;
return id . ToInteger ( & err , 16 ) ;
}
2010-08-27 19:49:02 +04:00
2013-11-22 07:35:40 +04:00
// OS version in 16.16 major/minor form
// based on http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx
enum {
kWindowsUnknown = 0 ,
kWindowsXP = 0x50001 ,
kWindowsServer2003 = 0x50002 ,
kWindowsVista = 0x60000 ,
kWindows7 = 0x60001 ,
kWindows8 = 0x60002 ,
2014-10-04 09:43:01 +04:00
kWindows8_1 = 0x60003 ,
2015-07-29 20:02:00 +03:00
kWindows10 = 0xA0000
2013-11-22 07:35:40 +04:00
} ;
static int32_t
WindowsOSVersion ( )
{
static int32_t winVersion = UNINITIALIZED_VALUE ;
OSVERSIONINFO vinfo ;
if ( winVersion = = UNINITIALIZED_VALUE ) {
vinfo . dwOSVersionInfoSize = sizeof ( vinfo ) ;
2015-02-23 14:15:53 +03:00
# ifdef _MSC_VER
2013-11-22 07:35:40 +04:00
# pragma warning(push)
# pragma warning(disable:4996)
2015-02-23 14:15:53 +03:00
# endif
2013-11-22 07:35:40 +04:00
if ( ! GetVersionEx ( & vinfo ) ) {
2015-02-23 14:15:53 +03:00
# ifdef _MSC_VER
2013-11-22 07:35:40 +04:00
# pragma warning(pop)
2015-02-23 14:15:53 +03:00
# endif
2013-11-22 07:35:40 +04:00
winVersion = kWindowsUnknown ;
} else {
winVersion = int32_t ( vinfo . dwMajorVersion < < 16 ) + vinfo . dwMinorVersion ;
}
}
return winVersion ;
}
2010-08-27 19:49:02 +04:00
/* Other interesting places for info:
* IDXGIAdapter : : GetDesc ( )
* IDirectDraw7 : : GetAvailableVidMem ( )
* e - > GetAvailableTextureMem ( )
* */
# define DEVICE_KEY_PREFIX L"\\Registry\\Machine\\"
2011-01-20 04:33:51 +03:00
nsresult
2010-08-31 01:45:29 +04:00
GfxInfo : : Init ( )
2010-08-27 19:49:02 +04:00
{
2011-01-20 04:33:51 +03:00
nsresult rv = GfxInfoBase : : Init ( ) ;
2010-08-28 18:16:00 +04:00
DISPLAY_DEVICEW displayDevice ;
displayDevice . cb = sizeof ( displayDevice ) ;
2010-08-27 19:49:02 +04:00
int deviceIndex = 0 ;
2013-06-14 23:34:41 +04:00
const char * spoofedWindowsVersion = PR_GetEnv ( " MOZ_GFX_SPOOF_WINDOWS_VERSION " ) ;
if ( spoofedWindowsVersion ) {
PR_sscanf ( spoofedWindowsVersion , " %x " , & mWindowsVersion ) ;
} else {
2013-11-22 07:35:40 +04:00
mWindowsVersion = WindowsOSVersion ( ) ;
2013-06-14 23:34:41 +04:00
}
2010-11-25 23:44:37 +03:00
mDeviceKeyDebug = NS_LITERAL_STRING ( " PrimarySearch " ) ;
2013-10-08 22:48:02 +04:00
while ( EnumDisplayDevicesW ( nullptr , deviceIndex , & displayDevice , 0 ) ) {
2010-11-25 23:44:37 +03:00
if ( displayDevice . StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE ) {
mDeviceKeyDebug = NS_LITERAL_STRING ( " NullSearch " ) ;
2010-08-27 19:49:02 +04:00
break ;
2010-11-25 23:44:37 +03:00
}
2010-08-27 19:49:02 +04:00
deviceIndex + + ;
}
2013-10-08 22:48:02 +04:00
// make sure the string is nullptr terminated
2011-10-11 09:50:08 +04:00
if ( wcsnlen ( displayDevice . DeviceKey , ArrayLength ( displayDevice . DeviceKey ) )
= = ArrayLength ( displayDevice . DeviceKey ) ) {
2013-10-08 22:48:02 +04:00
// we did not find a nullptr
2011-01-20 04:33:51 +03:00
return rv ;
2010-08-27 19:49:02 +04:00
}
2010-11-25 23:44:37 +03:00
mDeviceKeyDebug = displayDevice . DeviceKey ;
/* DeviceKey is "reserved" according to MSDN so we'll be careful with it */
/* check that DeviceKey begins with DEVICE_KEY_PREFIX */
/* some systems have a DeviceKey starting with \REGISTRY\Machine\ so we need to compare case insenstively */
2011-10-11 09:50:08 +04:00
if ( _wcsnicmp ( displayDevice . DeviceKey , DEVICE_KEY_PREFIX , ArrayLength ( DEVICE_KEY_PREFIX ) - 1 ) ! = 0 )
2011-01-20 04:33:51 +03:00
return rv ;
2010-11-25 23:44:37 +03:00
2010-08-27 19:49:02 +04:00
// chop off DEVICE_KEY_PREFIX
2011-10-11 09:50:08 +04:00
mDeviceKey = displayDevice . DeviceKey + ArrayLength ( DEVICE_KEY_PREFIX ) - 1 ;
2010-08-27 19:49:02 +04:00
2010-08-28 18:16:00 +04:00
mDeviceID = displayDevice . DeviceID ;
mDeviceString = displayDevice . DeviceString ;
2010-08-27 19:49:02 +04:00
2013-06-14 23:34:41 +04:00
// On Windows 8 and Server 2012 hosts, we want to not block RDP
// sessions from attempting hardware acceleration. RemoteFX
// provides features and functionaltiy that can give a good D3D10 +
// D2D + DirectWrite experience emulated via a software GPU.
//
2013-10-08 22:48:02 +04:00
// Unfortunately, the Device ID is nullptr, and we can't enumerate
2013-06-14 23:34:41 +04:00
// it using the setup infrastructure (SetupDiGetClassDevsW below
// will return INVALID_HANDLE_VALUE).
2013-11-22 07:35:40 +04:00
if ( mWindowsVersion = = kWindows8 & &
2013-06-14 23:34:41 +04:00
mDeviceID . Length ( ) = = 0 & &
mDeviceString . EqualsLiteral ( " RDPUDD Chained DD " ) )
{
WCHAR sysdir [ 255 ] ;
UINT len = GetSystemDirectory ( sysdir , sizeof ( sysdir ) ) ;
if ( len < sizeof ( sysdir ) ) {
nsString rdpudd ( sysdir ) ;
rdpudd . AppendLiteral ( " \\ rdpudd.dll " ) ;
gfxWindowsPlatform : : GetDLLVersion ( rdpudd . BeginReading ( ) , mDriverVersion ) ;
mDriverDate . AssignLiteral ( " 01-01-1970 " ) ;
// 0x1414 is Microsoft; 0xfefe is an invented (and unused) code
mDeviceID . AssignLiteral ( " PCI \\ VEN_1414&DEV_FEFE&SUBSYS_00000000 " ) ;
}
}
2012-02-23 18:53:55 +04:00
/* create a device information set composed of the current display device */
2013-10-08 22:48:02 +04:00
HDEVINFO devinfo = SetupDiGetClassDevsW ( nullptr , mDeviceID . get ( ) , nullptr ,
2012-02-23 18:53:55 +04:00
DIGCF_PRESENT | DIGCF_PROFILE | DIGCF_ALLCLASSES ) ;
if ( devinfo ! = INVALID_HANDLE_VALUE ) {
HKEY key ;
LONG result ;
WCHAR value [ 255 ] ;
DWORD dwcbData ;
SP_DEVINFO_DATA devinfoData ;
DWORD memberIndex = 0 ;
devinfoData . cbSize = sizeof ( devinfoData ) ;
NS_NAMED_LITERAL_STRING ( driverKeyPre , " System \\ CurrentControlSet \\ Control \\ Class \\ " ) ;
/* enumerate device information elements in the device information set */
while ( SetupDiEnumDeviceInfo ( devinfo , memberIndex + + , & devinfoData ) ) {
/* get a string that identifies the device's driver key */
if ( SetupDiGetDeviceRegistryPropertyW ( devinfo ,
& devinfoData ,
SPDRP_DRIVER ,
2013-10-08 22:48:02 +04:00
nullptr ,
2012-02-23 18:53:55 +04:00
( PBYTE ) value ,
sizeof ( value ) ,
2013-10-08 22:48:02 +04:00
nullptr ) ) {
2012-02-23 18:53:55 +04:00
nsAutoString driverKey ( driverKeyPre ) ;
driverKey + = value ;
2013-12-03 19:12:57 +04:00
result = RegOpenKeyExW ( HKEY_LOCAL_MACHINE , driverKey . get ( ) , 0 , KEY_QUERY_VALUE , & key ) ;
2012-02-23 18:53:55 +04:00
if ( result = = ERROR_SUCCESS ) {
/* we've found the driver we're looking for */
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " DriverVersion " , nullptr , nullptr ,
( LPBYTE ) value , & dwcbData ) ;
2012-09-17 21:56:24 +04:00
if ( result = = ERROR_SUCCESS ) {
2012-02-23 18:53:55 +04:00
mDriverVersion = value ;
2012-09-17 21:56:24 +04:00
} else {
// If the entry wasn't found, assume the worst (0.0.0.0).
mDriverVersion . AssignLiteral ( " 0.0.0.0 " ) ;
}
2012-02-23 18:53:55 +04:00
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " DriverDate " , nullptr , nullptr ,
( LPBYTE ) value , & dwcbData ) ;
2012-09-17 21:56:24 +04:00
if ( result = = ERROR_SUCCESS ) {
2012-02-23 18:53:55 +04:00
mDriverDate = value ;
2012-09-17 21:56:24 +04:00
} else {
// Again, assume the worst
mDriverDate . AssignLiteral ( " 01-01-1970 " ) ;
}
2012-02-23 18:53:55 +04:00
RegCloseKey ( key ) ;
break ;
2011-11-09 19:16:23 +04:00
}
2010-08-27 19:49:02 +04:00
}
2012-02-23 18:53:55 +04:00
}
SetupDiDestroyDeviceInfoList ( devinfo ) ;
}
2011-11-09 19:16:23 +04:00
2012-02-23 18:53:55 +04:00
mAdapterVendorID . AppendPrintf ( " 0x%04x " , ParseIDFromDeviceID ( mDeviceID , " VEN_ " , 4 ) ) ;
mAdapterDeviceID . AppendPrintf ( " 0x%04x " , ParseIDFromDeviceID ( mDeviceID , " &DEV_ " , 4 ) ) ;
2014-07-09 22:21:49 +04:00
mAdapterSubsysID . AppendPrintf ( " %08x " , ParseIDFromDeviceID ( mDeviceID , " &SUBSYS_ " , 8 ) ) ;
2012-02-23 18:53:55 +04:00
// We now check for second display adapter.
// Device interface class for display adapters.
CLSID GUID_DISPLAY_DEVICE_ARRIVAL ;
HRESULT hresult = CLSIDFromString ( L " {1CA05180-A699-450A-9A0C-DE4FBE3DDD89} " ,
& GUID_DISPLAY_DEVICE_ARRIVAL ) ;
if ( hresult = = NOERROR ) {
2013-10-08 22:48:02 +04:00
devinfo = SetupDiGetClassDevsW ( & GUID_DISPLAY_DEVICE_ARRIVAL ,
nullptr , nullptr ,
2012-02-23 18:53:55 +04:00
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE ) ;
if ( devinfo ! = INVALID_HANDLE_VALUE ) {
HKEY key ;
LONG result ;
WCHAR value [ 255 ] ;
DWORD dwcbData ;
SP_DEVINFO_DATA devinfoData ;
DWORD memberIndex = 0 ;
devinfoData . cbSize = sizeof ( devinfoData ) ;
nsAutoString adapterDriver2 ;
nsAutoString deviceID2 ;
nsAutoString driverVersion2 ;
nsAutoString driverDate2 ;
2012-08-22 19:56:38 +04:00
uint32_t adapterVendorID2 ;
uint32_t adapterDeviceID2 ;
2012-02-23 18:53:55 +04:00
NS_NAMED_LITERAL_STRING ( driverKeyPre , " System \\ CurrentControlSet \\ Control \\ Class \\ " ) ;
/* enumerate device information elements in the device information set */
while ( SetupDiEnumDeviceInfo ( devinfo , memberIndex + + , & devinfoData ) ) {
/* get a string that identifies the device's driver key */
if ( SetupDiGetDeviceRegistryPropertyW ( devinfo ,
& devinfoData ,
SPDRP_DRIVER ,
2013-10-08 22:48:02 +04:00
nullptr ,
2012-02-23 18:53:55 +04:00
( PBYTE ) value ,
sizeof ( value ) ,
2013-10-08 22:48:02 +04:00
nullptr ) ) {
2012-02-23 18:53:55 +04:00
nsAutoString driverKey2 ( driverKeyPre ) ;
driverKey2 + = value ;
2013-12-03 19:12:57 +04:00
result = RegOpenKeyExW ( HKEY_LOCAL_MACHINE , driverKey2 . get ( ) , 0 , KEY_QUERY_VALUE , & key ) ;
2012-02-23 18:53:55 +04:00
if ( result = = ERROR_SUCCESS ) {
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " MatchingDeviceId " , nullptr ,
nullptr , ( LPBYTE ) value , & dwcbData ) ;
2012-02-23 18:53:55 +04:00
if ( result ! = ERROR_SUCCESS ) {
continue ;
}
deviceID2 = value ;
nsAutoString adapterVendorID2String ;
nsAutoString adapterDeviceID2String ;
adapterVendorID2 = ParseIDFromDeviceID ( deviceID2 , " VEN_ " , 4 ) ;
adapterVendorID2String . AppendPrintf ( " 0x%04x " , adapterVendorID2 ) ;
adapterDeviceID2 = ParseIDFromDeviceID ( deviceID2 , " &DEV_ " , 4 ) ;
adapterDeviceID2String . AppendPrintf ( " 0x%04x " , adapterDeviceID2 ) ;
if ( mAdapterVendorID = = adapterVendorID2String & &
mAdapterDeviceID = = adapterDeviceID2String ) {
RegCloseKey ( key ) ;
continue ;
2012-02-09 01:04:21 +04:00
}
2012-02-23 18:53:55 +04:00
// If this device is missing driver information, it is unlikely to
// be a real display adapter.
2013-12-03 19:12:57 +04:00
if ( NS_FAILED ( GetKeyValue ( driverKey2 . get ( ) , L " InstalledDisplayDrivers " ,
2012-02-23 18:53:55 +04:00
adapterDriver2 , REG_MULTI_SZ ) ) ) {
RegCloseKey ( key ) ;
continue ;
}
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " DriverVersion " , nullptr , nullptr ,
( LPBYTE ) value , & dwcbData ) ;
2012-02-23 18:53:55 +04:00
if ( result ! = ERROR_SUCCESS ) {
RegCloseKey ( key ) ;
continue ;
}
driverVersion2 = value ;
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " DriverDate " , nullptr , nullptr ,
( LPBYTE ) value , & dwcbData ) ;
2012-02-23 18:53:55 +04:00
if ( result ! = ERROR_SUCCESS ) {
RegCloseKey ( key ) ;
continue ;
}
driverDate2 = value ;
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " Device Description " , nullptr ,
nullptr , ( LPBYTE ) value , & dwcbData ) ;
2012-02-23 18:53:55 +04:00
if ( result ! = ERROR_SUCCESS ) {
dwcbData = sizeof ( value ) ;
2013-10-08 22:48:02 +04:00
result = RegQueryValueExW ( key , L " DriverDesc " , nullptr , nullptr ,
( LPBYTE ) value , & dwcbData ) ;
2012-02-23 18:53:55 +04:00
}
RegCloseKey ( key ) ;
if ( result = = ERROR_SUCCESS ) {
mHasDualGPU = true ;
mDeviceString2 = value ;
mDeviceID2 = deviceID2 ;
mDeviceKey2 = driverKey2 ;
mDriverVersion2 = driverVersion2 ;
mDriverDate2 = driverDate2 ;
mAdapterVendorID2 . AppendPrintf ( " 0x%04x " , adapterVendorID2 ) ;
mAdapterDeviceID2 . AppendPrintf ( " 0x%04x " , adapterDeviceID2 ) ;
2014-07-09 22:21:49 +04:00
mAdapterSubsysID2 . AppendPrintf ( " %08x " , ParseIDFromDeviceID ( mDeviceID2 , " &SUBSYS_ " , 8 ) ) ;
2012-02-23 18:53:55 +04:00
break ;
}
}
2012-02-09 01:04:21 +04:00
}
}
2012-02-23 18:53:55 +04:00
SetupDiDestroyDeviceInfoList ( devinfo ) ;
2010-08-27 19:49:02 +04:00
}
2011-01-24 18:05:59 +03:00
}
2010-08-27 19:49:04 +04:00
2011-10-02 06:16:19 +04:00
mHasDriverVersionMismatch = false ;
2011-12-15 09:03:01 +04:00
if ( mAdapterVendorID = = GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) ) {
2011-01-21 07:31:03 +03:00
// we've had big crashers (bugs 590373 and 595364) apparently correlated
2011-04-21 23:36:49 +04:00
// with bad Intel driver installations where the DriverVersion reported
// by the registry was not the version of the DLL.
2011-09-29 10:19:26 +04:00
bool is64bitApp = sizeof ( void * ) = = 8 ;
2014-01-04 19:02:17 +04:00
const char16_t * dllFileName = is64bitApp
2013-12-03 19:12:57 +04:00
? MOZ_UTF16 ( " igd10umd64.dll " )
: MOZ_UTF16 ( " igd10umd32.dll " ) ,
2013-04-06 22:13:18 +04:00
* dllFileName2 = is64bitApp
2013-12-03 19:12:57 +04:00
? MOZ_UTF16 ( " igd10iumd64.dll " )
: MOZ_UTF16 ( " igd10iumd32.dll " ) ;
2013-04-06 22:13:18 +04:00
nsString dllVersion , dllVersion2 ;
2014-01-04 19:02:17 +04:00
gfxWindowsPlatform : : GetDLLVersion ( ( char16_t * ) dllFileName , dllVersion ) ;
gfxWindowsPlatform : : GetDLLVersion ( ( char16_t * ) dllFileName2 , dllVersion2 ) ;
2011-01-21 07:31:03 +03:00
2013-08-06 06:00:42 +04:00
uint64_t dllNumericVersion = 0 , dllNumericVersion2 = 0 ,
driverNumericVersion = 0 , knownSafeMismatchVersion = 0 ;
2011-01-21 07:31:03 +03:00
ParseDriverVersion ( dllVersion , & dllNumericVersion ) ;
2013-04-06 22:13:18 +04:00
ParseDriverVersion ( dllVersion2 , & dllNumericVersion2 ) ;
2015-05-15 20:43:38 +03:00
2011-01-21 07:31:03 +03:00
ParseDriverVersion ( mDriverVersion , & driverNumericVersion ) ;
2013-08-06 06:00:42 +04:00
ParseDriverVersion ( NS_LITERAL_STRING ( " 9.17.10.0 " ) , & knownSafeMismatchVersion ) ;
// If there's a driver version mismatch, consider this harmful only when
// the driver version is less than knownSafeMismatchVersion. See the
2015-05-15 20:43:38 +03:00
// above comment about crashes with old mismatches. If the GetDllVersion
// call fails, we are not calling it a mismatch.
if ( ( dllNumericVersion ! = 0 & & dllNumericVersion ! = driverNumericVersion ) | |
( dllNumericVersion2 ! = 0 & & dllNumericVersion2 ! = driverNumericVersion ) ) {
if ( driverNumericVersion < knownSafeMismatchVersion | |
std : : max ( dllNumericVersion , dllNumericVersion2 ) < knownSafeMismatchVersion ) {
mHasDriverVersionMismatch = true ;
gfxWarningOnce ( ) < < " Mismatched driver versions between the registry " < < mDriverVersion . get ( ) < < " and DLL(s) " < < NS_ConvertUTF16toUTF8 ( dllVersion ) . get ( ) < < " , " < < NS_ConvertUTF16toUTF8 ( dllVersion2 ) . get ( ) < < " reported. " ;
}
} else if ( dllNumericVersion = = 0 & & dllNumericVersion2 = = 0 ) {
// Leave it as an asserting error for now, to see if we can find
// a system that exhibits this kind of a problem internally.
gfxCriticalErrorOnce ( ) < < " Potential driver version mismatch ignored due to missing DLLs " ;
2013-08-06 06:00:42 +04:00
}
2011-01-21 07:31:03 +03:00
}
2013-04-03 22:47:56 +04:00
const char * spoofedDriverVersionString = PR_GetEnv ( " MOZ_GFX_SPOOF_DRIVER_VERSION " ) ;
if ( spoofedDriverVersionString ) {
mDriverVersion . AssignASCII ( spoofedDriverVersionString ) ;
}
const char * spoofedVendor = PR_GetEnv ( " MOZ_GFX_SPOOF_VENDOR_ID " ) ;
if ( spoofedVendor ) {
mAdapterVendorID . AssignASCII ( spoofedVendor ) ;
}
2011-01-20 04:37:24 +03:00
const char * spoofedDevice = PR_GetEnv ( " MOZ_GFX_SPOOF_DEVICE_ID " ) ;
if ( spoofedDevice ) {
2011-12-15 09:03:01 +04:00
mAdapterDeviceID . AssignASCII ( spoofedDevice ) ;
2011-01-20 04:37:24 +03:00
}
2010-08-27 19:49:04 +04:00
AddCrashReportAnnotations ( ) ;
2011-01-20 04:33:51 +03:00
2015-02-09 00:29:13 +03:00
GetCountryCode ( ) ;
2011-01-20 04:33:51 +03:00
return rv ;
2010-08-27 19:49:02 +04:00
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDescription ( nsAString & aAdapterDescription )
2010-08-27 19:49:02 +04:00
{
aAdapterDescription = mDeviceString ;
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDescription2 ( nsAString & aAdapterDescription )
{
aAdapterDescription = mDeviceString2 ;
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterRAM ( nsAString & aAdapterRAM )
2010-08-27 19:49:02 +04:00
{
2013-12-03 19:12:57 +04:00
if ( NS_FAILED ( GetKeyValue ( mDeviceKey . get ( ) , L " HardwareInformation.MemorySize " , aAdapterRAM , REG_DWORD ) ) )
2010-08-27 19:49:02 +04:00
aAdapterRAM = L " Unknown " ;
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterRAM2 ( nsAString & aAdapterRAM )
{
2011-11-09 19:16:23 +04:00
if ( ! mHasDualGPU ) {
2014-05-26 22:54:53 +04:00
aAdapterRAM . Truncate ( ) ;
2013-12-03 19:12:57 +04:00
} else if ( NS_FAILED ( GetKeyValue ( mDeviceKey2 . get ( ) , L " HardwareInformation.MemorySize " , aAdapterRAM , REG_DWORD ) ) ) {
2011-08-12 17:46:41 +04:00
aAdapterRAM = L " Unknown " ;
2011-11-09 19:16:23 +04:00
}
2011-08-12 17:46:41 +04:00
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDriver ( nsAString & aAdapterDriver )
2010-08-27 19:49:02 +04:00
{
2013-12-03 19:12:57 +04:00
if ( NS_FAILED ( GetKeyValue ( mDeviceKey . get ( ) , L " InstalledDisplayDrivers " , aAdapterDriver , REG_MULTI_SZ ) ) )
2010-08-27 19:49:02 +04:00
aAdapterDriver = L " Unknown " ;
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDriver2 ( nsAString & aAdapterDriver )
{
2011-11-09 19:16:23 +04:00
if ( ! mHasDualGPU ) {
2014-05-26 22:54:53 +04:00
aAdapterDriver . Truncate ( ) ;
2013-12-03 19:12:57 +04:00
} else if ( NS_FAILED ( GetKeyValue ( mDeviceKey2 . get ( ) , L " InstalledDisplayDrivers " , aAdapterDriver , REG_MULTI_SZ ) ) ) {
2011-08-12 17:46:41 +04:00
aAdapterDriver = L " Unknown " ;
2011-11-09 19:16:23 +04:00
}
2011-08-12 17:46:41 +04:00
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDriverVersion ( nsAString & aAdapterDriverVersion )
2010-08-27 19:49:02 +04:00
{
aAdapterDriverVersion = mDriverVersion ;
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDriverDate ( nsAString & aAdapterDriverDate )
2010-08-27 19:49:02 +04:00
{
aAdapterDriverDate = mDriverDate ;
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterDriverVersion2 ( nsAString & aAdapterDriverVersion )
{
aAdapterDriverVersion = mDriverVersion2 ;
return NS_OK ;
}
NS_IMETHODIMP
GfxInfo : : GetAdapterDriverDate2 ( nsAString & aAdapterDriverDate )
{
aAdapterDriverDate = mDriverDate2 ;
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
2011-12-15 09:03:01 +04:00
GfxInfo : : GetAdapterVendorID ( nsAString & aAdapterVendorID )
2010-08-27 19:49:02 +04:00
{
2011-12-15 09:03:01 +04:00
aAdapterVendorID = mAdapterVendorID ;
2010-08-27 19:49:02 +04:00
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
2011-12-15 09:03:01 +04:00
GfxInfo : : GetAdapterVendorID2 ( nsAString & aAdapterVendorID )
2011-08-12 17:46:41 +04:00
{
2011-12-15 09:03:01 +04:00
aAdapterVendorID = mAdapterVendorID2 ;
2011-08-12 17:46:41 +04:00
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
NS_IMETHODIMP
2011-12-15 09:03:01 +04:00
GfxInfo : : GetAdapterDeviceID ( nsAString & aAdapterDeviceID )
2010-08-27 19:49:02 +04:00
{
2011-12-15 09:03:01 +04:00
aAdapterDeviceID = mAdapterDeviceID ;
2010-08-27 19:49:02 +04:00
return NS_OK ;
}
2010-08-27 19:49:04 +04:00
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
2011-12-15 09:03:01 +04:00
GfxInfo : : GetAdapterDeviceID2 ( nsAString & aAdapterDeviceID )
2011-08-12 17:46:41 +04:00
{
2011-12-15 09:03:01 +04:00
aAdapterDeviceID = mAdapterDeviceID2 ;
2011-08-12 17:46:41 +04:00
return NS_OK ;
}
2014-07-09 22:21:49 +04:00
NS_IMETHODIMP
GfxInfo : : GetAdapterSubsysID ( nsAString & aAdapterSubsysID )
{
aAdapterSubsysID = mAdapterSubsysID ;
return NS_OK ;
}
NS_IMETHODIMP
GfxInfo : : GetAdapterSubsysID2 ( nsAString & aAdapterSubsysID )
{
aAdapterSubsysID = mAdapterSubsysID2 ;
return NS_OK ;
}
2011-08-12 17:46:41 +04:00
NS_IMETHODIMP
2011-09-29 10:19:26 +04:00
GfxInfo : : GetIsGPU2Active ( bool * aIsGPU2Active )
2011-08-12 17:46:41 +04:00
{
* aIsGPU2Active = mIsGPU2Active ;
return NS_OK ;
}
2011-05-23 20:54:47 +04:00
# if defined(MOZ_CRASHREPORTER)
2011-02-01 19:30:25 +03:00
/* Cisco's VPN software can cause corruption of the floating point state.
* Make a note of this in our crash reports so that some weird crashes
* make more sense */
static void
CheckForCiscoVPN ( ) {
LONG result ;
HKEY key ;
/* This will give false positives, but hopefully no false negatives */
result = RegOpenKeyExW ( HKEY_LOCAL_MACHINE , L " Software \\ Cisco Systems \\ VPN Client " , 0 , KEY_QUERY_VALUE , & key ) ;
if ( result = = ERROR_SUCCESS ) {
RegCloseKey ( key ) ;
CrashReporter : : AppendAppNotesToCrashReport ( NS_LITERAL_CSTRING ( " Cisco VPN \n " ) ) ;
}
}
# endif
2015-02-09 00:29:13 +03:00
/* interface nsIGfxInfo2 */
NS_IMETHODIMP
GfxInfo : : GetCountryCode ( nsAString & aCountryCode )
{
aCountryCode = mCountryCode ;
return NS_OK ;
}
2010-08-31 01:45:29 +04:00
void
GfxInfo : : AddCrashReportAnnotations ( )
2010-08-27 19:49:04 +04:00
{
2011-05-23 20:54:47 +04:00
# if defined(MOZ_CRASHREPORTER)
2011-02-01 19:30:25 +03:00
CheckForCiscoVPN ( ) ;
2014-03-18 20:02:51 +04:00
if ( mHasDriverVersionMismatch ) {
CrashReporter : : AppendAppNotesToCrashReport ( NS_LITERAL_CSTRING ( " DriverVersionMismatch \n " ) ) ;
}
2014-07-09 22:21:49 +04:00
nsString deviceID , vendorID , driverVersion , subsysID ;
nsCString narrowDeviceID , narrowVendorID , narrowDriverVersion , narrowSubsysID ;
2010-08-27 19:49:04 +04:00
2011-12-15 09:03:01 +04:00
GetAdapterDeviceID ( deviceID ) ;
CopyUTF16toUTF8 ( deviceID , narrowDeviceID ) ;
GetAdapterVendorID ( vendorID ) ;
CopyUTF16toUTF8 ( vendorID , narrowVendorID ) ;
2014-07-09 22:21:49 +04:00
GetAdapterDriverVersion ( driverVersion ) ;
CopyUTF16toUTF8 ( driverVersion , narrowDriverVersion ) ;
GetAdapterSubsysID ( subsysID ) ;
CopyUTF16toUTF8 ( subsysID , narrowSubsysID ) ;
2010-08-27 19:49:04 +04:00
CrashReporter : : AnnotateCrashReport ( NS_LITERAL_CSTRING ( " AdapterVendorID " ) ,
2011-12-15 09:03:01 +04:00
narrowVendorID ) ;
2010-08-27 19:49:04 +04:00
CrashReporter : : AnnotateCrashReport ( NS_LITERAL_CSTRING ( " AdapterDeviceID " ) ,
2011-12-15 09:03:01 +04:00
narrowDeviceID ) ;
2014-07-09 22:21:49 +04:00
CrashReporter : : AnnotateCrashReport ( NS_LITERAL_CSTRING ( " AdapterDriverVersion " ) ,
narrowDriverVersion ) ;
CrashReporter : : AnnotateCrashReport ( NS_LITERAL_CSTRING ( " AdapterSubsysID " ) ,
narrowSubsysID ) ;
2010-08-27 19:49:04 +04:00
/* Add an App Note for now so that we get the data immediately. These
* can go away after we store the above in the socorro db */
2012-09-02 06:35:17 +04:00
nsAutoCString note ;
2010-08-30 22:05:30 +04:00
/* AppendPrintf only supports 32 character strings, mrghh. */
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " AdapterVendorID: " ) ;
2011-12-15 09:03:01 +04:00
note . Append ( narrowVendorID ) ;
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " , AdapterDeviceID: " ) ;
2011-12-15 09:03:01 +04:00
note . Append ( narrowDeviceID ) ;
2014-07-09 22:21:49 +04:00
note . AppendLiteral ( " , AdapterSubsysID: " ) ;
note . Append ( narrowSubsysID ) ;
note . AppendLiteral ( " , AdapterDriverVersion: " ) ;
note . Append ( NS_LossyConvertUTF16toASCII ( driverVersion ) ) ;
2010-11-25 23:44:37 +03:00
2011-12-15 09:03:01 +04:00
if ( vendorID = = GfxDriverInfo : : GetDeviceVendor ( VendorAll ) ) {
/* if we didn't find a valid vendorID lets append the mDeviceID string to try to find out why */
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " , " ) ;
2012-07-06 13:43:28 +04:00
LossyAppendUTF16toASCII ( mDeviceID , note ) ;
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " , " ) ;
2012-07-06 13:43:28 +04:00
LossyAppendUTF16toASCII ( mDeviceKeyDebug , note ) ;
2011-12-15 09:03:01 +04:00
LossyAppendUTF16toASCII ( mDeviceKeyDebug , note ) ;
2010-11-25 23:44:37 +03:00
}
note . Append ( " \n " ) ;
2010-08-30 22:05:30 +04:00
2011-08-12 17:46:41 +04:00
if ( mHasDualGPU ) {
2014-07-09 22:21:49 +04:00
nsString deviceID2 , vendorID2 , subsysID2 ;
2011-08-12 17:46:41 +04:00
nsAutoString adapterDriverVersionString2 ;
2014-07-09 22:21:49 +04:00
nsCString narrowDeviceID2 , narrowVendorID2 , narrowSubsysID2 ;
2011-08-12 17:46:41 +04:00
2011-12-05 13:10:27 +04:00
note . AppendLiteral ( " Has dual GPUs. GPU #2: " ) ;
2011-12-15 09:03:01 +04:00
GetAdapterDeviceID2 ( deviceID2 ) ;
CopyUTF16toUTF8 ( deviceID2 , narrowDeviceID2 ) ;
GetAdapterVendorID2 ( vendorID2 ) ;
CopyUTF16toUTF8 ( vendorID2 , narrowVendorID2 ) ;
2011-08-12 17:46:41 +04:00
GetAdapterDriverVersion2 ( adapterDriverVersionString2 ) ;
2014-07-09 22:21:49 +04:00
GetAdapterSubsysID ( subsysID2 ) ;
CopyUTF16toUTF8 ( subsysID2 , narrowSubsysID2 ) ;
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " AdapterVendorID2: " ) ;
2011-12-15 09:03:01 +04:00
note . Append ( narrowVendorID2 ) ;
2014-05-22 07:48:51 +04:00
note . AppendLiteral ( " , AdapterDeviceID2: " ) ;
2011-12-15 09:03:01 +04:00
note . Append ( narrowDeviceID2 ) ;
2014-07-09 22:21:49 +04:00
note . AppendLiteral ( " , AdapterSubsysID2: " ) ;
note . Append ( narrowSubsysID2 ) ;
note . AppendLiteral ( " , AdapterDriverVersion2: " ) ;
2011-08-12 17:46:41 +04:00
note . Append ( NS_LossyConvertUTF16toASCII ( adapterDriverVersionString2 ) ) ;
}
2010-08-30 22:05:30 +04:00
CrashReporter : : AppendAppNotesToCrashReport ( note ) ;
2010-08-27 19:49:04 +04:00
# endif
}
2010-08-31 01:45:29 +04:00
2015-02-09 00:29:13 +03:00
void
GfxInfo : : GetCountryCode ( )
{
GEOID geoid = GetUserGeoID ( GEOCLASS_NATION ) ;
if ( geoid = = GEOID_NOT_AVAILABLE ) {
return ;
}
// Get required length
int numChars = GetGeoInfoW ( geoid , GEO_ISO2 , nullptr , 0 , 0 ) ;
if ( ! numChars ) {
return ;
}
// Now get the string for real
mCountryCode . SetLength ( numChars ) ;
2015-02-16 14:38:00 +03:00
numChars = GetGeoInfoW ( geoid , GEO_ISO2 , wwc ( mCountryCode . BeginWriting ( ) ) ,
2015-02-09 00:29:13 +03:00
mCountryCode . Length ( ) , 0 ) ;
if ( numChars ) {
// numChars includes null terminator
mCountryCode . Truncate ( numChars - 1 ) ;
}
}
2011-01-20 04:21:07 +03:00
static OperatingSystem
2012-08-22 19:56:38 +04:00
WindowsVersionToOperatingSystem ( int32_t aWindowsVersion )
2010-08-31 01:45:29 +04:00
{
2011-01-20 04:21:07 +03:00
switch ( aWindowsVersion ) {
2013-11-22 07:35:40 +04:00
case kWindowsXP :
2011-01-20 04:21:07 +03:00
return DRIVER_OS_WINDOWS_XP ;
2013-11-22 07:35:40 +04:00
case kWindowsServer2003 :
2011-01-20 04:21:07 +03:00
return DRIVER_OS_WINDOWS_SERVER_2003 ;
2013-11-22 07:35:40 +04:00
case kWindowsVista :
2011-01-20 04:21:07 +03:00
return DRIVER_OS_WINDOWS_VISTA ;
2013-11-22 07:35:40 +04:00
case kWindows7 :
2011-01-20 04:21:07 +03:00
return DRIVER_OS_WINDOWS_7 ;
2013-11-22 07:35:40 +04:00
case kWindows8 :
2012-08-31 20:42:07 +04:00
return DRIVER_OS_WINDOWS_8 ;
2013-11-22 07:35:40 +04:00
case kWindows8_1 :
2013-09-13 22:08:05 +04:00
return DRIVER_OS_WINDOWS_8_1 ;
2015-03-12 00:44:52 +03:00
case kWindows10 :
return DRIVER_OS_WINDOWS_10 ;
2013-11-22 07:35:40 +04:00
case kWindowsUnknown :
2011-01-20 04:21:07 +03:00
default :
return DRIVER_OS_UNKNOWN ;
} ;
2010-08-31 01:45:29 +04:00
}
2011-12-15 09:02:59 +04:00
const nsTArray < GfxDriverInfo > &
2011-11-03 18:50:40 +04:00
GfxInfo : : GetGfxDriverInfo ( )
{
2011-12-15 09:02:59 +04:00
if ( ! mDriverInfo - > Length ( ) ) {
2012-09-22 02:12:28 +04:00
/*
* It should be noted here that more specialized rules on certain features
* should be inserted - before - more generalized restriction . As the first
* match for feature / OS / device found in the list will be used for the final
* blacklisting call .
*/
2011-12-15 09:03:01 +04:00
/*
2011-12-15 09:02:59 +04:00
* NVIDIA entries
*/
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2012-09-22 02:12:28 +04:00
DRIVER_LESS_THAN , V ( 6 , 14 , 11 , 8265 ) , " 182.65 " ) ;
2011-12-15 09:02:59 +04:00
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2012-09-22 02:12:28 +04:00
DRIVER_LESS_THAN , V ( 8 , 17 , 11 , 8265 ) , " 182.65 " ) ;
2011-12-15 09:02:59 +04:00
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2012-09-22 02:12:28 +04:00
DRIVER_LESS_THAN , V ( 8 , 17 , 11 , 8265 ) , " 182.65 " ) ;
2011-12-15 09:02:59 +04:00
/*
* AMD / ATI entries
*/
2012-09-22 02:12:28 +04:00
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_LESS_THAN , V ( 8 , 62 , 0 , 0 ) , " 9.6 " ) ;
2011-12-15 09:02:59 +04:00
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2012-09-22 02:12:28 +04:00
DRIVER_LESS_THAN , V ( 8 , 62 , 0 , 0 ) , " 9.6 " ) ;
2011-12-15 09:02:59 +04:00
2014-12-02 03:21:37 +03:00
// Bug 1099252
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_EQUAL , V ( 8 , 832 , 0 , 0 ) ) ;
2015-02-04 01:27:07 +03:00
// Bug 1118695
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_EQUAL , V ( 8 , 783 , 2 , 2000 ) ) ;
2012-09-14 02:39:37 +04:00
/*
* Bug 783517 - crashes in AMD driver on Windows 8
*/
2013-03-20 04:44:10 +04:00
APPEND_TO_DRIVER_BLOCKLIST_RANGE ( DRIVER_OS_WINDOWS_8 ,
2012-09-14 02:39:37 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2013-03-20 04:44:10 +04:00
DRIVER_BETWEEN_INCLUSIVE_START , V ( 8 , 982 , 0 , 0 ) , V ( 8 , 983 , 0 , 0 ) , " != 8.982.*.* " ) ;
APPEND_TO_DRIVER_BLOCKLIST_RANGE ( DRIVER_OS_WINDOWS_8 ,
2012-09-14 02:39:37 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2013-03-20 04:44:10 +04:00
DRIVER_BETWEEN_INCLUSIVE_START , V ( 8 , 982 , 0 , 0 ) , V ( 8 , 983 , 0 , 0 ) , " != 8.982.*.* " ) ;
2012-09-14 02:39:37 +04:00
2011-12-15 09:02:59 +04:00
/* OpenGL on any ATI/AMD hardware is discouraged
* See :
* bug 619773 - WebGL : Crash with blue screen : " NMI: Parity Check / Memory Parity Error "
* bugs 584403 , 584404 , 620924 - crashes in atioglxx
* + many complaints about incorrect rendering
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_OPENGL_LAYERS , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_WEBGL_OPENGL , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_OPENGL_LAYERS , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_WEBGL_OPENGL , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
/*
* Intel entries
*/
2014-03-18 20:02:51 +04:00
/* The driver versions used here come from bug 594877. They might not
* be particularly relevant anymore .
2011-12-15 09:02:59 +04:00
*/
2011-12-15 09:03:01 +04:00
# define IMPLEMENT_INTEL_DRIVER_BLOCKLIST(winVer, devFamily, driverVer) \
APPEND_TO_DRIVER_BLOCKLIST2 ( winVer , \
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( devFamily ) , \
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION , \
2011-12-15 09:02:59 +04:00
DRIVER_LESS_THAN , driverVer )
2012-09-22 02:12:28 +04:00
2014-07-15 18:40:00 +04:00
# define IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(winVer, devFamily, driverVer) \
APPEND_TO_DRIVER_BLOCKLIST2 ( winVer , \
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( devFamily ) , \
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION , \
DRIVER_LESS_THAN , driverVer )
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelGMA500 , V ( 7 , 14 , 10 , 1006 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelGMA900 , GfxDriverInfo : : allDriverVersions ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelGMA950 , V ( 7 , 14 , 10 , 1504 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelGMA3150 , V ( 7 , 14 , 10 , 2124 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelGMAX3000 , V ( 7 , 15 , 10 , 1666 ) ) ;
2015-07-22 01:04:48 +03:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_VISTA , IntelHDGraphicsToIvyBridge , V ( 8 , 15 , 10 , 2202 ) ) ;
2014-07-15 18:40:00 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelGMA500 , V ( 5 , 0 , 0 , 2026 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelGMA900 , GfxDriverInfo : : allDriverVersions ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelGMA950 , V ( 8 , 15 , 10 , 1930 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelGMA3150 , V ( 8 , 14 , 10 , 2117 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelGMAX3000 , V ( 8 , 15 , 10 , 1930 ) ) ;
2015-07-22 01:04:48 +03:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D ( DRIVER_OS_WINDOWS_7 , IntelHDGraphicsToIvyBridge , V ( 8 , 15 , 10 , 2202 ) ) ;
/* Disable Direct2D on Intel GMAX4500 devices because of rendering corruption discovered
* in bug 1180379. These seems to affect even the most recent drivers . We ' re black listing
* all of the devices to be safe even though we ' ve only confirmed the issue on the G45
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelGMAX4500HD ) ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2014-07-15 18:40:00 +04:00
2012-09-22 02:12:28 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMA500 , V ( 3 , 0 , 20 , 3200 ) ) ;
2011-12-15 09:03:01 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMA900 , V ( 6 , 14 , 10 , 4764 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMA950 , V ( 6 , 14 , 10 , 4926 ) ) ;
2012-09-22 02:12:28 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMA3150 , V ( 6 , 14 , 10 , 5134 ) ) ;
2011-12-15 09:03:01 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMAX3000 , V ( 6 , 14 , 10 , 5218 ) ) ;
2013-08-14 19:56:57 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelGMAX4500HD , V ( 6 , 14 , 10 , 4969 ) ) ;
2015-07-22 01:04:48 +03:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_XP , IntelHDGraphicsToIvyBridge , V ( 6 , 14 , 10 , 4969 ) ) ;
2011-12-15 09:03:01 +04:00
2013-11-07 19:22:08 +04:00
// StrechRect seems to suffer from precision issues which leads to artifacting
// during content drawing starting with at least version 6.14.10.5082
2013-12-18 03:04:48 +04:00
// and going until 6.14.10.5218. See bug 919454 and bug 949275 for more info.
2013-11-07 19:22:08 +04:00
APPEND_TO_DRIVER_BLOCKLIST_RANGE ( DRIVER_OS_WINDOWS_XP ,
const_cast < nsAString & > ( GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) ) ,
const_cast < GfxDeviceFamily * > ( GfxDriverInfo : : GetDeviceFamily ( IntelGMAX4500HD ) ) ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2013-12-18 03:04:48 +04:00
DRIVER_BETWEEN_EXCLUSIVE , V ( 6 , 14 , 10 , 5076 ) , V ( 6 , 14 , 10 , 5218 ) , " 6.14.10.5218 " ) ;
2013-11-07 19:22:08 +04:00
2012-09-22 02:12:28 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMA500 , V ( 3 , 0 , 20 , 3200 ) ) ;
2011-12-15 09:03:01 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMA900 , GfxDriverInfo : : allDriverVersions ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMA950 , V ( 7 , 14 , 10 , 1504 ) ) ;
2012-09-22 02:12:28 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMA3150 , V ( 7 , 14 , 10 , 1910 ) ) ;
2011-12-15 09:03:01 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMAX3000 , V ( 7 , 15 , 10 , 1666 ) ) ;
2014-10-22 17:04:00 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelGMAX4500HD , V ( 7 , 15 , 10 , 1666 ) ) ;
2015-07-22 01:04:48 +03:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_VISTA , IntelHDGraphicsToIvyBridge , V ( 7 , 15 , 10 , 1666 ) ) ;
2011-12-15 09:03:01 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMA500 , V ( 5 , 0 , 0 , 2026 ) ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMA900 , GfxDriverInfo : : allDriverVersions ) ;
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMA950 , V ( 8 , 15 , 10 , 1930 ) ) ;
2012-09-22 02:12:28 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMA3150 , V ( 8 , 14 , 10 , 1972 ) ) ;
2013-08-14 19:56:57 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMAX3000 , V ( 7 , 15 , 10 , 1666 ) ) ;
2014-10-22 17:04:00 +04:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelGMAX4500HD , V ( 7 , 15 , 10 , 1666 ) ) ;
2015-07-22 01:04:48 +03:00
IMPLEMENT_INTEL_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 , IntelHDGraphicsToIvyBridge , V ( 7 , 15 , 10 , 1666 ) ) ;
2011-12-15 09:03:01 +04:00
2014-11-19 13:25:21 +03:00
// Bug 1074378
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) ,
( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelGMAX4500HD ) ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_EQUAL , V ( 8 , 15 , 10 , 1749 ) , " 8.15.10.2342 " ) ;
2015-07-22 01:04:48 +03:00
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) ,
( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelHDGraphicsToIvyBridge ) ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_EQUAL , V ( 8 , 15 , 10 , 1749 ) , " 8.15.10.2342 " ) ;
2014-11-19 13:25:21 +03:00
2011-12-15 09:03:01 +04:00
/* OpenGL on any Intel hardware is discouraged */
2011-12-15 09:02:59 +04:00
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_OPENGL_LAYERS , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
2011-12-15 09:03:01 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , GfxDriverInfo : : allDevices ,
2011-12-15 09:02:59 +04:00
nsIGfxInfo : : FEATURE_WEBGL_OPENGL , nsIGfxInfo : : FEATURE_DISCOURAGED ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2011-12-15 09:03:01 +04:00
2014-08-01 09:59:36 +04:00
/**
2014-09-29 19:57:54 +04:00
* Disable acceleration on Intel HD 3000 for graphics drivers < = 8.15 .10 .2321 .
* See bug 1018278 and bug 1060736.
2014-08-01 09:59:36 +04:00
*/
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelHD3000 ) ,
2014-09-29 19:57:54 +04:00
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2014-08-01 09:59:36 +04:00
DRIVER_LESS_THAN_OR_EQUAL , V ( 8 , 15 , 10 , 2321 ) , " 8.15.10.2342 " ) ;
2013-03-12 23:40:29 +04:00
/* Disable D2D on Win7 on Intel HD Graphics on driver <= 8.15.10.2302
* See bug 806786
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelMobileHDGraphics ) ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_LESS_THAN_OR_EQUAL , V ( 8 , 15 , 10 , 2302 ) ) ;
2013-05-03 01:39:56 +04:00
/* Disable D2D on Win8 on Intel HD Graphics on driver <= 8.15.10.2302
* See bug 804144 and 863683
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_8 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelMobileHDGraphics ) ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_LESS_THAN_OR_EQUAL , V ( 8 , 15 , 10 , 2302 ) ) ;
2015-03-26 02:58:48 +03:00
/* Disable D3D11 layers on Intel G41 express graphics and Intel GM965, Intel X3100, for causing device resets.
* See bug 1116812.
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( Bug1116812 ) ,
nsIGfxInfo : : FEATURE_DIRECT3D_11_LAYERS , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2014-06-04 11:53:08 +04:00
/* Disable D2D on AMD Catalyst 14.4 until 14.6
2014-05-19 02:37:17 +04:00
* See bug 984488
*/
2014-06-04 11:53:08 +04:00
APPEND_TO_DRIVER_BLOCKLIST_RANGE ( DRIVER_OS_ALL ,
2014-05-19 02:37:17 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2014-06-04 11:53:08 +04:00
DRIVER_BETWEEN_INCLUSIVE_START , V ( 14 , 1 , 0 , 0 ) , V ( 14 , 2 , 0 , 0 ) , " ATI Catalyst 14.6+ " ) ;
APPEND_TO_DRIVER_BLOCKLIST_RANGE ( DRIVER_OS_ALL ,
2014-05-19 02:37:17 +04:00
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , GfxDriverInfo : : allDevices ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2014-06-04 11:53:08 +04:00
DRIVER_BETWEEN_INCLUSIVE_START , V ( 14 , 1 , 0 , 0 ) , V ( 14 , 2 , 0 , 0 ) , " ATI Catalyst 14.6+ " ) ;
2014-05-19 02:37:17 +04:00
2011-12-15 09:03:01 +04:00
/* Disable D3D9 layers on NVIDIA 6100/6150/6200 series due to glitches
* whilst scrolling . See bugs : 612007 , 644787 & 645872.
*/
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( NvidiaBlockD3D9Layers ) ,
nsIGfxInfo : : FEATURE_DIRECT3D_9_LAYERS , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2013-06-14 23:34:41 +04:00
/* Microsoft RemoteFX; blocked less than 6.2.0.0 */
APPEND_TO_DRIVER_BLOCKLIST ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorMicrosoft ) , GfxDriverInfo : : allDevices ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_LESS_THAN , V ( 6 , 2 , 0 , 0 ) , " < 6.2.0.0 " ) ;
2014-08-13 08:25:13 +04:00
2014-09-11 00:16:55 +04:00
/* Bug 1008759: Optimus (NVidia) crash. Disable D2D on NV 310M. */
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( Nvidia310M ) ,
nsIGfxInfo : : FEATURE_DIRECT2D , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2015-01-26 03:34:28 +03:00
2015-04-07 09:39:54 +03:00
/* Bug 1151721: Black video on youtube, block DXVA for all older intel cards. */
2015-01-26 03:34:28 +03:00
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( AMDRadeonHD5800 ) ,
2015-04-01 06:06:56 +03:00
nsIGfxInfo : : FEATURE_HARDWARE_VIDEO_DECODING , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
2015-01-26 03:34:28 +03:00
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2015-03-12 00:44:52 +03:00
/* Bug 1139503: DXVA crashes with ATI cards on windows 10. */
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_10 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , GfxDriverInfo : : allDevices ,
2015-04-01 06:06:56 +03:00
nsIGfxInfo : : FEATURE_HARDWARE_VIDEO_DECODING , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2015-03-12 00:44:52 +03:00
DRIVER_EQUAL , V ( 15 , 200 , 1006 , 0 ) ) ;
2015-03-21 22:37:00 +03:00
2015-04-30 00:49:49 +03:00
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( Bug1155608 ) ,
nsIGfxInfo : : FEATURE_HARDWARE_VIDEO_DECODING , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_LESS_THAN_OR_EQUAL , V ( 8 , 15 , 10 , 2869 ) ) ;
2015-04-17 03:41:37 +03:00
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( Nvidia8800GTS ) ,
nsIGfxInfo : : FEATURE_HARDWARE_VIDEO_DECODING , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
DRIVER_EQUAL , V ( 9 , 18 , 13 , 4052 ) ) ;
2015-03-21 22:37:00 +03:00
/* Bug 1137716: XXX this should really check for the matching Intel piece as well.
* Unfortunately , we don ' t have the infrastructure to do that */
APPEND_TO_DRIVER_BLOCKLIST_RANGE_GPU2 ( DRIVER_OS_WINDOWS_7 ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( Bug1137716 ) ,
GfxDriverInfo : : allFeatures , nsIGfxInfo : : FEATURE_BLOCKED_DRIVER_VERSION ,
2015-04-02 21:19:30 +03:00
DRIVER_BETWEEN_INCLUSIVE , V ( 8 , 17 , 12 , 5730 ) , V ( 8 , 17 , 12 , 6901 ) , " Nvidia driver > 8.17.12.6901 " ) ;
2015-03-21 22:37:00 +03:00
2015-04-10 23:17:27 +03:00
/* Bug 1153381: WebGL issues with D3D11 ANGLE on Intel. These may be fixed by an ANGLE update. */
APPEND_TO_DRIVER_BLOCKLIST2 ( DRIVER_OS_ALL ,
( nsAString & ) GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , ( GfxDeviceFamily * ) GfxDriverInfo : : GetDeviceFamily ( IntelGMAX4500HD ) ,
nsIGfxInfo : : FEATURE_DIRECT3D_11_ANGLE , nsIGfxInfo : : FEATURE_BLOCKED_DEVICE ,
DRIVER_LESS_THAN , GfxDriverInfo : : allDriverVersions ) ;
2011-12-15 09:02:59 +04:00
}
return * mDriverInfo ;
2011-11-03 18:50:40 +04:00
}
2010-10-07 08:40:08 +04:00
nsresult
2012-08-22 19:56:38 +04:00
GfxInfo : : GetFeatureStatusImpl ( int32_t aFeature ,
int32_t * aStatus ,
2011-11-03 18:50:40 +04:00
nsAString & aSuggestedDriverVersion ,
2011-12-15 09:02:59 +04:00
const nsTArray < GfxDriverInfo > & aDriverInfo ,
2012-07-30 18:20:58 +04:00
OperatingSystem * aOS /* = nullptr */ )
2010-08-31 01:45:29 +04:00
{
2011-12-15 09:03:08 +04:00
NS_ENSURE_ARG_POINTER ( aStatus ) ;
2011-10-02 06:16:19 +04:00
aSuggestedDriverVersion . SetIsVoid ( true ) ;
2011-12-15 09:03:08 +04:00
OperatingSystem os = WindowsVersionToOperatingSystem ( mWindowsVersion ) ;
* aStatus = nsIGfxInfo : : FEATURE_STATUS_UNKNOWN ;
if ( aOS )
* aOS = os ;
2010-10-07 08:40:08 +04:00
2011-12-15 09:03:08 +04:00
// Don't evaluate special cases if we're checking the downloaded blocklist.
if ( ! aDriverInfo . Length ( ) ) {
nsAutoString adapterVendorID ;
nsAutoString adapterDeviceID ;
nsAutoString adapterDriverVersionString ;
if ( NS_FAILED ( GetAdapterVendorID ( adapterVendorID ) ) | |
NS_FAILED ( GetAdapterDeviceID ( adapterDeviceID ) ) | |
NS_FAILED ( GetAdapterDriverVersion ( adapterDriverVersionString ) ) )
{
return NS_ERROR_FAILURE ;
}
2011-12-15 09:02:59 +04:00
2012-02-21 23:49:06 +04:00
if ( ! adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorIntel ) , nsCaseInsensitiveStringComparator ( ) ) & &
! adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , nsCaseInsensitiveStringComparator ( ) ) & &
! adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorAMD ) , nsCaseInsensitiveStringComparator ( ) ) & &
! adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorATI ) , nsCaseInsensitiveStringComparator ( ) ) & &
2013-06-14 23:34:41 +04:00
! adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorMicrosoft ) , nsCaseInsensitiveStringComparator ( ) ) & &
2011-12-15 09:03:08 +04:00
// FIXME - these special hex values are currently used in xpcshell tests introduced by
// bug 625160 patch 8/8. Maybe these tests need to be adjusted now that we're only whitelisting
// intel/ati/nvidia.
! adapterVendorID . LowerCaseEqualsLiteral ( " 0xabcd " ) & &
! adapterVendorID . LowerCaseEqualsLiteral ( " 0xdcba " ) & &
! adapterVendorID . LowerCaseEqualsLiteral ( " 0xabab " ) & &
! adapterVendorID . LowerCaseEqualsLiteral ( " 0xdcdc " ) )
{
* aStatus = FEATURE_BLOCKED_DEVICE ;
return NS_OK ;
}
2010-11-05 22:57:58 +03:00
2012-08-22 19:56:38 +04:00
uint64_t driverVersion ;
2011-12-15 09:03:08 +04:00
if ( ! ParseDriverVersion ( adapterDriverVersionString , & driverVersion ) ) {
return NS_ERROR_FAILURE ;
}
2011-03-02 04:01:17 +03:00
2011-12-15 09:03:08 +04:00
// special-case the WinXP test slaves: they have out-of-date drivers, but we still want to
// whitelist them, actually we do know that this combination of device and driver version
// works well.
2013-11-22 07:35:40 +04:00
if ( mWindowsVersion = = kWindowsXP & &
2012-02-21 23:49:06 +04:00
adapterVendorID . Equals ( GfxDriverInfo : : GetDeviceVendor ( VendorNVIDIA ) , nsCaseInsensitiveStringComparator ( ) ) & &
2011-12-15 09:03:08 +04:00
adapterDeviceID . LowerCaseEqualsLiteral ( " 0x0861 " ) & & // GeForce 9400
driverVersion = = V ( 6 , 14 , 11 , 7756 ) )
{
2014-07-02 01:44:09 +04:00
* aStatus = FEATURE_STATUS_OK ;
2011-12-15 09:03:08 +04:00
return NS_OK ;
}
2011-01-20 04:21:07 +03:00
2011-12-15 09:03:08 +04:00
// Windows Server 2003 should be just like Windows XP for present purpose, but still has a different version number.
// OTOH Windows Server 2008 R1 and R2 already have the same version numbers as Vista and Seven respectively
if ( os = = DRIVER_OS_WINDOWS_SERVER_2003 )
os = DRIVER_OS_WINDOWS_XP ;
2014-09-11 00:16:55 +04:00
if ( mHasDriverVersionMismatch ) {
2015-05-15 20:43:38 +03:00
* aStatus = nsIGfxInfo : : FEATURE_BLOCKED_MISMATCHED_VERSION ;
2014-11-04 23:58:59 +03:00
return NS_OK ;
2014-09-11 00:16:55 +04:00
}
2011-12-15 09:03:08 +04:00
}
2010-10-07 08:40:08 +04:00
2011-11-03 18:50:40 +04:00
return GfxInfoBase : : GetFeatureStatusImpl ( aFeature , aStatus , aSuggestedDriverVersion , aDriverInfo , & os ) ;
2010-08-31 01:45:29 +04:00
}
2011-01-20 04:39:33 +03:00
2015-07-13 11:12:41 +03:00
nsresult
GfxInfo : : FindMonitors ( JSContext * aCx , JS : : HandleObject aOutArray )
{
int deviceCount = 0 ;
for ( int deviceIndex = 0 ; ; deviceIndex + + ) {
DISPLAY_DEVICEA device ;
device . cb = sizeof ( device ) ;
if ( ! : : EnumDisplayDevicesA ( nullptr , deviceIndex , & device , 0 ) ) {
break ;
}
if ( ! ( device . StateFlags & DISPLAY_DEVICE_ACTIVE ) ) {
continue ;
}
DEVMODEA mode ;
mode . dmSize = sizeof ( mode ) ;
mode . dmDriverExtra = 0 ;
if ( ! : : EnumDisplaySettingsA ( device . DeviceName , ENUM_CURRENT_SETTINGS , & mode ) ) {
continue ;
}
JS : : Rooted < JSObject * > obj ( aCx , JS_NewPlainObject ( aCx ) ) ;
JS : : Rooted < JS : : Value > screenWidth ( aCx , JS : : Int32Value ( mode . dmPelsWidth ) ) ;
JS_SetProperty ( aCx , obj , " screenWidth " , screenWidth ) ;
JS : : Rooted < JS : : Value > screenHeight ( aCx , JS : : Int32Value ( mode . dmPelsHeight ) ) ;
JS_SetProperty ( aCx , obj , " screenHeight " , screenHeight ) ;
JS : : Rooted < JS : : Value > refreshRate ( aCx , JS : : Int32Value ( mode . dmDisplayFrequency ) ) ;
JS_SetProperty ( aCx , obj , " refreshRate " , refreshRate ) ;
JS : : Rooted < JS : : Value > pseudoDisplay ( aCx ,
JS : : BooleanValue ( ! ! ( device . StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER ) ) ) ;
JS_SetProperty ( aCx , obj , " pseudoDisplay " , pseudoDisplay ) ;
JS : : Rooted < JS : : Value > element ( aCx , JS : : ObjectValue ( * obj ) ) ;
JS_SetElement ( aCx , aOutArray , deviceCount + + , element ) ;
}
return NS_OK ;
}
2015-07-20 00:50:35 +03:00
void
GfxInfo : : DescribeFeatures ( JSContext * aCx , JS : : Handle < JSObject * > aObj )
{
JS : : Rooted < JSObject * > obj ( aCx ) ;
gfxWindowsPlatform * platform = gfxWindowsPlatform : : GetPlatform ( ) ;
gfx : : FeatureStatus d3d11 = platform - > GetD3D11Status ( ) ;
if ( ! InitFeatureObject ( aCx , aObj , " d3d11 " , d3d11 , & obj ) ) {
return ;
}
if ( d3d11 = = gfx : : FeatureStatus : : Available ) {
JS : : Rooted < JS : : Value > val ( aCx , JS : : Int32Value ( platform - > GetD3D11Version ( ) ) ) ;
JS_SetProperty ( aCx , obj , " version " , val ) ;
val = JS : : BooleanValue ( platform - > IsWARP ( ) ) ;
JS_SetProperty ( aCx , obj , " warp " , val ) ;
2015-08-05 12:45:06 +03:00
val = JS : : BooleanValue ( platform - > CompositorD3D11TextureSharingWorks ( ) ) ;
2015-07-20 00:50:35 +03:00
JS_SetProperty ( aCx , obj , " textureSharing " , val ) ;
2015-07-28 10:54:33 +03:00
val = JS : : BooleanValue ( ! platform - > CanUseDirect3D11 ( ) ) ;
JS_SetProperty ( aCx , obj , " blacklisted " , val ) ;
2015-07-20 00:50:35 +03:00
}
gfx : : FeatureStatus d2d = platform - > GetD2DStatus ( ) ;
if ( ! InitFeatureObject ( aCx , aObj , " d2d " , d2d , & obj ) ) {
return ;
}
{
const char * version = " 1.0 " ;
if ( platform - > GetD2D1Status ( ) = = gfx : : FeatureStatus : : Available )
version = " 1.1 " ;
JS : : Rooted < JSString * > str ( aCx , JS_NewStringCopyZ ( aCx , version ) ) ;
JS : : Rooted < JS : : Value > val ( aCx , JS : : StringValue ( str ) ) ;
JS_SetProperty ( aCx , obj , " version " , val ) ;
}
}
2011-01-20 04:39:33 +03:00
# ifdef DEBUG
// Implement nsIGfxInfoDebug
2011-12-15 09:04:35 +04:00
NS_IMETHODIMP GfxInfo : : SpoofVendorID ( const nsAString & aVendorID )
2011-01-20 04:39:33 +03:00
{
2011-12-15 09:04:35 +04:00
mAdapterVendorID = aVendorID ;
2011-01-20 04:39:33 +03:00
return NS_OK ;
}
2011-12-15 09:04:35 +04:00
NS_IMETHODIMP GfxInfo : : SpoofDeviceID ( const nsAString & aDeviceID )
2011-01-20 04:39:33 +03:00
{
2011-12-15 09:04:35 +04:00
mAdapterDeviceID = aDeviceID ;
2011-01-20 04:39:33 +03:00
return NS_OK ;
}
NS_IMETHODIMP GfxInfo : : SpoofDriverVersion ( const nsAString & aDriverVersion )
{
mDriverVersion = aDriverVersion ;
return NS_OK ;
}
2012-08-22 19:56:38 +04:00
NS_IMETHODIMP GfxInfo : : SpoofOSVersion ( uint32_t aVersion )
2011-01-20 04:39:33 +03:00
{
mWindowsVersion = aVersion ;
return NS_OK ;
}
# endif