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
|
|
|
|
2021-04-27 22:45:14 +03:00
|
|
|
#include "GfxInfo.h"
|
2011-10-11 09:50:08 +04:00
|
|
|
|
2016-04-29 07:52:55 +03:00
|
|
|
#include "gfxConfig.h"
|
2021-04-27 22:45:14 +03:00
|
|
|
#include "GfxDriverInfo.h"
|
2010-08-13 19:43:35 +04:00
|
|
|
#include "gfxWindowsPlatform.h"
|
2021-04-27 22:45:14 +03:00
|
|
|
#include "jsapi.h"
|
|
|
|
#include "nsExceptionHandler.h"
|
|
|
|
#include "nsPrintfCString.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"
|
2021-04-27 22:45:14 +03:00
|
|
|
#include "xpcpublic.h"
|
|
|
|
|
2021-02-18 16:26:29 +03:00
|
|
|
#include "mozilla/Components.h"
|
2011-06-24 21:41:18 +04:00
|
|
|
#include "mozilla/Preferences.h"
|
2016-08-24 01:18:55 +03:00
|
|
|
#include "mozilla/gfx/DeviceManagerDx.h"
|
2015-05-15 20:43:38 +03:00
|
|
|
#include "mozilla/gfx/Logging.h"
|
2019-12-12 09:38:39 +03:00
|
|
|
#include "mozilla/SSE.h"
|
2021-04-27 22:45:14 +03:00
|
|
|
#include "mozilla/ArrayUtils.h"
|
2021-04-30 22:54:39 +03:00
|
|
|
#include "mozilla/WindowsProcessMitigations.h"
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2017-09-28 20:51:59 +03:00
|
|
|
#include <intrin.h>
|
2021-04-27 22:45:14 +03:00
|
|
|
#include <windows.h>
|
|
|
|
#include <devguid.h> // for GUID_DEVCLASS_BATTERY
|
|
|
|
#include <setupapi.h> // for SetupDi*
|
|
|
|
#include <winioctl.h> // for IOCTL_*
|
|
|
|
#include <batclass.h> // for BATTERY_*
|
2010-08-13 19:43:35 +04:00
|
|
|
|
2010-08-27 19:49:04 +04:00
|
|
|
#define NS_CRASHREPORTER_CONTRACTID "@mozilla.org/toolkit/crash-reporter;1"
|
|
|
|
|
2011-10-11 09:50:08 +04:00
|
|
|
using namespace mozilla;
|
2016-04-29 07:52:55 +03:00
|
|
|
using namespace mozilla::gfx;
|
2010-08-13 19:43:35 +04:00
|
|
|
using namespace mozilla::widget;
|
|
|
|
|
2011-01-20 04:39:33 +03:00
|
|
|
#ifdef DEBUG
|
2015-07-29 01:45:34 +03:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED(GfxInfo, GfxInfoBase, nsIGfxInfoDebug)
|
2011-01-20 04:39:33 +03:00
|
|
|
#endif
|
|
|
|
|
2021-04-30 22:54:39 +03:00
|
|
|
static void AssertNotWin32kLockdown() {
|
|
|
|
// Check that we are not in Win32k lockdown
|
|
|
|
MOZ_DIAGNOSTIC_ASSERT(!IsWin32kLockedDown(),
|
|
|
|
"Invalid Windows GfxInfo API with Win32k lockdown");
|
2021-04-27 22:45:14 +03:00
|
|
|
}
|
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) */
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult GfxInfo::GetD2DEnabled(bool* aEnabled) {
|
2016-08-16 21:03:29 +03:00
|
|
|
// Telemetry queries this during XPCOM initialization, and there's no
|
|
|
|
// gfxPlatform by then. Just bail out if gfxPlatform isn't initialized.
|
|
|
|
if (!gfxPlatform::Initialized()) {
|
|
|
|
*aEnabled = false;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// We check gfxConfig rather than the actual render mode, since the UI
|
|
|
|
// process does not use Direct2D if the GPU process is enabled. However,
|
|
|
|
// content processes can still use Direct2D.
|
|
|
|
*aEnabled = gfx::gfxConfig::IsEnabled(gfx::Feature::DIRECT2D);
|
2010-08-13 19:43:35 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2010-08-16 11:15:03 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult 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;
|
|
|
|
}
|
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetHasBattery(bool* aHasBattery) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
*aHasBattery = mHasBattery;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2020-10-23 18:12:41 +03:00
|
|
|
int32_t GfxInfo::GetMaxRefreshRate(bool* aMixed) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2020-10-23 18:12:41 +03:00
|
|
|
int32_t maxRefreshRate = -1;
|
|
|
|
if (aMixed) {
|
|
|
|
*aMixed = false;
|
|
|
|
}
|
|
|
|
|
2020-05-15 11:39:43 +03:00
|
|
|
for (auto displayInfo : mDisplayInfo) {
|
2020-10-23 18:12:41 +03:00
|
|
|
int32_t refreshRate = int32_t(displayInfo.mRefreshRate);
|
|
|
|
if (aMixed && maxRefreshRate > 0 && maxRefreshRate != refreshRate) {
|
|
|
|
*aMixed = true;
|
|
|
|
}
|
|
|
|
maxRefreshRate = std::max(maxRefreshRate, refreshRate);
|
2020-05-15 11:39:43 +03:00
|
|
|
}
|
2020-10-23 18:12:41 +03:00
|
|
|
return maxRefreshRate;
|
2020-05-15 11:39:43 +03:00
|
|
|
}
|
|
|
|
|
2020-06-25 20:22:20 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetEmbeddedInFirefoxReality(bool* aEmbeddedInFirefoxReality) {
|
|
|
|
*aEmbeddedInFirefoxReality = gfxVars::FxREmbedded();
|
|
|
|
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) {
|
2016-06-09 10:48:00 +03:00
|
|
|
outStr.AppendPrintf("%S [ ", params.displayName.get());
|
2011-05-11 04:30:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if (params.gamma >= 0) {
|
|
|
|
foundData = true;
|
2016-06-09 11:52:00 +03:00
|
|
|
outStr.AppendPrintf("Gamma: %.4g ", params.gamma / 1000.0);
|
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) {
|
2016-06-09 10:48:00 +03:00
|
|
|
outStr.AppendPrintf(
|
|
|
|
"Pixel Structure: %S ",
|
|
|
|
(params.pixelStructure == PIXEL_STRUCT_RGB ? u"RGB" : u"BGR"));
|
2011-05-11 04:30:20 +04:00
|
|
|
} 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) {
|
2016-07-21 08:03:25 +03:00
|
|
|
outStr.Append(u"] ");
|
2011-05-11 04:30:20 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (foundData) {
|
|
|
|
aCleartypeParams.Assign(outStr);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2019-05-27 03:02:32 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetWindowProtocol(nsAString& aWindowProtocol) {
|
2020-02-10 17:21:30 +03:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetDesktopEnvironment(nsAString& aDesktopEnvironment) {
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
2019-05-27 03:02:32 +03:00
|
|
|
}
|
|
|
|
|
2021-01-25 22:41:04 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetTestType(nsAString& aTestType) { return NS_ERROR_NOT_IMPLEMENTED; }
|
|
|
|
|
2010-09-28 00:18:56 +04:00
|
|
|
static nsresult GetKeyValue(const WCHAR* keyLocation, const WCHAR* keyName,
|
2019-11-26 22:42:06 +03:00
|
|
|
uint32_t& destValue, int type) {
|
|
|
|
MOZ_ASSERT(type == REG_DWORD || type == REG_QWORD);
|
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) {
|
2019-11-26 22:42:06 +03:00
|
|
|
destValue = (uint32_t)(dValue / 1024 / 1024);
|
2010-08-28 18:16:00 +04:00
|
|
|
} else {
|
2010-08-27 19:49:02 +04:00
|
|
|
retval = NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2016-07-07 20:40:40 +03:00
|
|
|
case REG_QWORD: {
|
|
|
|
// We only use this for vram size
|
|
|
|
LONGLONG qValue;
|
|
|
|
dwcbData = sizeof(qValue);
|
|
|
|
result = RegQueryValueExW(key, keyName, nullptr, &resultType,
|
|
|
|
(LPBYTE)&qValue, &dwcbData);
|
|
|
|
if (result == ERROR_SUCCESS && resultType == REG_QWORD) {
|
2019-11-26 22:42:06 +03:00
|
|
|
destValue = (uint32_t)(qValue / 1024 / 1024);
|
2016-07-07 20:40:40 +03:00
|
|
|
} else {
|
|
|
|
retval = NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2019-11-26 22:42:06 +03:00
|
|
|
}
|
|
|
|
RegCloseKey(key);
|
2010-08-28 18:16:00 +04:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
return retval;
|
|
|
|
}
|
2010-08-28 18:16:00 +04:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
static nsresult GetKeyValue(const WCHAR* keyLocation, const WCHAR* keyName,
|
|
|
|
nsAString& destString, int type) {
|
|
|
|
MOZ_ASSERT(type == REG_MULTI_SZ);
|
2019-11-22 00:09:33 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
HKEY key;
|
|
|
|
DWORD dwcbData;
|
|
|
|
DWORD resultType;
|
|
|
|
LONG result;
|
|
|
|
nsresult retval = NS_OK;
|
2019-11-23 03:18:27 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
result =
|
|
|
|
RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyLocation, 0, KEY_QUERY_VALUE, &key);
|
|
|
|
if (result != ERROR_SUCCESS) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2019-11-25 23:50:33 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
// A chain of null-separated strings; we convert the nulls to spaces
|
|
|
|
WCHAR wCharValue[1024];
|
|
|
|
dwcbData = sizeof(wCharValue);
|
|
|
|
|
|
|
|
result = RegQueryValueExW(key, keyName, nullptr, &resultType,
|
|
|
|
(LPBYTE)wCharValue, &dwcbData);
|
|
|
|
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] = ' ';
|
|
|
|
}
|
|
|
|
}
|
2019-11-26 05:49:17 +03:00
|
|
|
}
|
2019-11-26 22:42:06 +03:00
|
|
|
|
|
|
|
// ensure wCharValue is null terminated
|
|
|
|
wCharValue[strLen - 1] = '\0';
|
|
|
|
|
|
|
|
if (isValid) destString = wCharValue;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
retval = NS_ERROR_FAILURE;
|
2010-08-27 19:49:02 +04:00
|
|
|
}
|
2019-11-26 22:42:06 +03:00
|
|
|
|
2010-08-27 19:49:02 +04:00
|
|
|
RegCloseKey(key);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
2017-04-01 22:46:41 +03:00
|
|
|
static nsresult GetKeyValues(const WCHAR* keyLocation, const WCHAR* keyName,
|
|
|
|
nsTArray<nsString>& destStrings) {
|
|
|
|
// First ask for the size of the value
|
|
|
|
DWORD size;
|
|
|
|
LONG rv = RegGetValueW(HKEY_LOCAL_MACHINE, keyLocation, keyName,
|
|
|
|
RRF_RT_REG_MULTI_SZ, nullptr, nullptr, &size);
|
|
|
|
if (rv != ERROR_SUCCESS) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a buffer with the proper size and retrieve the value
|
|
|
|
WCHAR* wCharValue = new WCHAR[size / sizeof(WCHAR)];
|
|
|
|
rv = RegGetValueW(HKEY_LOCAL_MACHINE, keyLocation, keyName,
|
|
|
|
RRF_RT_REG_MULTI_SZ, nullptr, (LPBYTE)wCharValue, &size);
|
|
|
|
if (rv != ERROR_SUCCESS) {
|
|
|
|
delete[] wCharValue;
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The value is a sequence of null-terminated strings, usually terminated by
|
|
|
|
// an empty string (\0). RegGetValue ensures that the value is properly
|
|
|
|
// terminated with a null character.
|
|
|
|
DWORD i = 0;
|
|
|
|
DWORD strLen = size / sizeof(WCHAR);
|
|
|
|
while (i < strLen) {
|
|
|
|
nsString value(wCharValue + i);
|
|
|
|
if (!value.IsEmpty()) {
|
|
|
|
destStrings.AppendElement(value);
|
|
|
|
}
|
|
|
|
i += value.Length() + 1;
|
|
|
|
}
|
|
|
|
delete[] wCharValue;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
uint32_t 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);
|
|
|
|
}
|
2020-05-27 21:11:12 +03:00
|
|
|
if (id.Equals(L"QCOM", nsCaseInsensitiveStringComparator)) {
|
2018-01-06 04:28:02 +03:00
|
|
|
// String format assumptions are broken, so use a Qualcomm PCI Vendor ID
|
|
|
|
// for now. See also GfxDriverInfo::GetDeviceVendor.
|
|
|
|
return 0x5143;
|
|
|
|
}
|
2011-08-21 03:01:11 +04:00
|
|
|
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,
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
static bool HasBattery() {
|
|
|
|
// Helper classes to manage lifetimes of Windows structs.
|
|
|
|
class MOZ_STACK_CLASS HDevInfoHolder final {
|
|
|
|
public:
|
|
|
|
explicit HDevInfoHolder(HDEVINFO aHandle) : mHandle(aHandle) {}
|
2020-02-12 01:36:39 +03:00
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
~HDevInfoHolder() { ::SetupDiDestroyDeviceInfoList(mHandle); }
|
2020-02-12 01:36:39 +03:00
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
private:
|
|
|
|
HDEVINFO mHandle;
|
|
|
|
};
|
|
|
|
|
|
|
|
class MOZ_STACK_CLASS HandleHolder final {
|
|
|
|
public:
|
|
|
|
explicit HandleHolder(HANDLE aHandle) : mHandle(aHandle) {}
|
|
|
|
|
|
|
|
~HandleHolder() { ::CloseHandle(mHandle); }
|
|
|
|
|
|
|
|
private:
|
|
|
|
HANDLE mHandle;
|
|
|
|
};
|
|
|
|
|
|
|
|
HDEVINFO hdev =
|
|
|
|
::SetupDiGetClassDevs(&GUID_DEVCLASS_BATTERY, nullptr, nullptr,
|
|
|
|
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
|
|
|
if (hdev == INVALID_HANDLE_VALUE) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
HDevInfoHolder hdevHolder(hdev);
|
|
|
|
|
|
|
|
DWORD i = 0;
|
|
|
|
SP_DEVICE_INTERFACE_DATA did = {0};
|
|
|
|
did.cbSize = sizeof(did);
|
|
|
|
|
|
|
|
while (::SetupDiEnumDeviceInterfaces(hdev, nullptr, &GUID_DEVCLASS_BATTERY, i,
|
|
|
|
&did)) {
|
|
|
|
DWORD bufferSize = 0;
|
|
|
|
::SetupDiGetDeviceInterfaceDetail(hdev, &did, nullptr, 0, &bufferSize,
|
|
|
|
nullptr);
|
|
|
|
if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
|
|
|
return true;
|
2020-02-12 01:36:39 +03:00
|
|
|
}
|
2020-02-13 18:51:32 +03:00
|
|
|
|
|
|
|
UniquePtr<uint8_t[]> buffer(new (std::nothrow) uint8_t[bufferSize]);
|
|
|
|
if (!buffer) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd =
|
|
|
|
reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(buffer.get());
|
|
|
|
pdidd->cbSize = sizeof(*pdidd);
|
|
|
|
if (!::SetupDiGetDeviceInterfaceDetail(hdev, &did, pdidd, bufferSize,
|
|
|
|
&bufferSize, nullptr)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
HANDLE hbat = ::CreateFile(pdidd->DevicePath, GENERIC_READ | GENERIC_WRITE,
|
|
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr,
|
|
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
|
|
|
|
if (hbat == INVALID_HANDLE_VALUE) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
HandleHolder hbatHolder(hbat);
|
|
|
|
|
|
|
|
BATTERY_QUERY_INFORMATION bqi = {0};
|
|
|
|
DWORD dwWait = 0;
|
|
|
|
DWORD dwOut;
|
|
|
|
|
|
|
|
// We need the tag to query the information below.
|
|
|
|
if (!::DeviceIoControl(hbat, IOCTL_BATTERY_QUERY_TAG, &dwWait,
|
|
|
|
sizeof(dwWait), &bqi.BatteryTag,
|
|
|
|
sizeof(bqi.BatteryTag), &dwOut, nullptr) ||
|
|
|
|
!bqi.BatteryTag) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
BATTERY_INFORMATION bi = {0};
|
|
|
|
bqi.InformationLevel = BatteryInformation;
|
|
|
|
|
|
|
|
if (!::DeviceIoControl(hbat, IOCTL_BATTERY_QUERY_INFORMATION, &bqi,
|
|
|
|
sizeof(bqi), &bi, sizeof(bi), &dwOut, nullptr)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If a battery intended for general use (i.e. system use) is not a UPS
|
|
|
|
// (i.e. short term), then we know for certain we have a battery.
|
|
|
|
if ((bi.Capabilities & BATTERY_SYSTEM_BATTERY) &&
|
|
|
|
!(bi.Capabilities & BATTERY_IS_SHORT_TERM)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Otherwise we check the next battery.
|
|
|
|
++i;
|
2013-11-22 07:35:40 +04:00
|
|
|
}
|
|
|
|
|
2020-02-13 18:51:32 +03:00
|
|
|
// If we fail to enumerate because there are no more batteries to check, then
|
|
|
|
// we can safely say there are indeed no system batteries.
|
|
|
|
return ::GetLastError() != ERROR_NO_MORE_ITEMS;
|
2013-11-22 07:35:40 +04:00
|
|
|
}
|
|
|
|
|
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\\"
|
2010-08-31 01:45:29 +04:00
|
|
|
nsresult GfxInfo::Init() {
|
2011-01-20 04:33:51 +03:00
|
|
|
nsresult rv = GfxInfoBase::Init();
|
2021-03-30 17:08:55 +03:00
|
|
|
|
2021-04-30 22:54:39 +03:00
|
|
|
// If we are locked down in a content process, we can't call any of the
|
|
|
|
// Win32k APIs below. Any method that accesses members of this class should
|
|
|
|
// assert that it's not used in content
|
|
|
|
if (IsWin32kLockedDown()) {
|
2021-04-27 22:45:14 +03:00
|
|
|
return rv;
|
2021-03-30 17:08:55 +03:00
|
|
|
}
|
2011-01-20 04:33:51 +03:00
|
|
|
|
2021-04-27 22:45:14 +03:00
|
|
|
mHasBattery = HasBattery();
|
|
|
|
|
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) {
|
2020-02-13 18:51:32 +03:00
|
|
|
PR_sscanf(spoofedWindowsVersion, "%x,%u", &mWindowsVersion,
|
|
|
|
&mWindowsBuildNumber);
|
2013-06-14 23:34:41 +04:00
|
|
|
} else {
|
2020-02-13 18:51:32 +03:00
|
|
|
OSVERSIONINFO vinfo;
|
|
|
|
vinfo.dwOSVersionInfoSize = sizeof(vinfo);
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
# pragma warning(push)
|
|
|
|
# pragma warning(disable : 4996)
|
|
|
|
#endif
|
|
|
|
if (!GetVersionEx(&vinfo)) {
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
# pragma warning(pop)
|
|
|
|
#endif
|
|
|
|
mWindowsVersion = kWindowsUnknown;
|
|
|
|
} else {
|
|
|
|
mWindowsVersion =
|
|
|
|
int32_t(vinfo.dwMajorVersion << 16) + vinfo.dwMinorVersion;
|
|
|
|
mWindowsBuildNumber = vinfo.dwBuildNumber;
|
|
|
|
}
|
2013-06-14 23:34:41 +04:00
|
|
|
}
|
|
|
|
|
2010-11-25 23:44:37 +03:00
|
|
|
mDeviceKeyDebug = u"PrimarySearch"_ns;
|
|
|
|
|
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 = u"NullSearch"_ns;
|
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 */
|
2020-07-09 01:25:02 +03:00
|
|
|
/* If the device key is empty, we are most likely in a remote desktop
|
|
|
|
* environment. In this case we set the devicekey to an empty string so
|
|
|
|
* it can be handled later.
|
|
|
|
*/
|
|
|
|
if (displayDevice.DeviceKey[0] != '\0') {
|
|
|
|
if (_wcsnicmp(displayDevice.DeviceKey, DEVICE_KEY_PREFIX,
|
|
|
|
ArrayLength(DEVICE_KEY_PREFIX) - 1) != 0) {
|
|
|
|
return rv;
|
|
|
|
}
|
2010-11-25 23:44:37 +03:00
|
|
|
|
2020-07-09 01:25:02 +03:00
|
|
|
// chop off DEVICE_KEY_PREFIX
|
|
|
|
mDeviceKey[0] =
|
|
|
|
displayDevice.DeviceKey + ArrayLength(DEVICE_KEY_PREFIX) - 1;
|
|
|
|
} else {
|
2020-09-23 18:17:15 +03:00
|
|
|
mDeviceKey[0].Truncate();
|
2020-07-09 01:25:02 +03:00
|
|
|
}
|
2010-08-27 19:49:02 +04:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
mDeviceID[0] = displayDevice.DeviceID;
|
|
|
|
mDeviceString[0] = 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).
|
2018-02-28 21:49:09 +03:00
|
|
|
UINT flags = DIGCF_PRESENT | DIGCF_PROFILE | DIGCF_ALLCLASSES;
|
2016-12-01 23:14:42 +03:00
|
|
|
if (mWindowsVersion >= kWindows8 && mDeviceID[0].Length() == 0 &&
|
2016-12-16 19:56:59 +03:00
|
|
|
mDeviceString[0].EqualsLiteral("RDPUDD Chained DD")) {
|
2013-06-14 23:34:41 +04:00
|
|
|
WCHAR sysdir[255];
|
|
|
|
UINT len = GetSystemDirectory(sysdir, sizeof(sysdir));
|
|
|
|
if (len < sizeof(sysdir)) {
|
|
|
|
nsString rdpudd(sysdir);
|
|
|
|
rdpudd.AppendLiteral("\\rdpudd.dll");
|
2016-12-16 19:56:59 +03:00
|
|
|
gfxWindowsPlatform::GetDLLVersion(rdpudd.BeginReading(),
|
|
|
|
mDriverVersion[0]);
|
|
|
|
mDriverDate[0].AssignLiteral("01-01-1970");
|
2013-06-14 23:34:41 +04:00
|
|
|
|
|
|
|
// 0x1414 is Microsoft; 0xfefe is an invented (and unused) code
|
2016-12-16 19:56:59 +03:00
|
|
|
mDeviceID[0].AssignLiteral("PCI\\VEN_1414&DEV_FEFE&SUBSYS_00000000");
|
2018-02-28 21:49:09 +03:00
|
|
|
flags |= DIGCF_DEVICEINTERFACE;
|
2013-06-14 23:34:41 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-23 18:53:55 +04:00
|
|
|
/* create a device information set composed of the current display device */
|
2018-02-28 21:49:09 +03:00
|
|
|
HDEVINFO devinfo =
|
|
|
|
SetupDiGetClassDevsW(nullptr, mDeviceID[0].get(), nullptr, flags);
|
2012-02-23 18:53:55 +04:00
|
|
|
|
|
|
|
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);
|
|
|
|
constexpr auto driverKeyPre =
|
|
|
|
u"System\\CurrentControlSet\\Control\\Class\\"_ns;
|
|
|
|
/* 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,
|
|
|
|
nullptr, (PBYTE)value,
|
|
|
|
sizeof(value), nullptr)) {
|
|
|
|
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) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverVersion[0] = value;
|
2012-09-17 21:56:24 +04:00
|
|
|
} else {
|
|
|
|
// If the entry wasn't found, assume the worst (0.0.0.0).
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverVersion[0].AssignLiteral("0.0.0.0");
|
2012-09-17 21:56:24 +04:00
|
|
|
}
|
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) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverDate[0] = value;
|
2012-09-17 21:56:24 +04:00
|
|
|
} else {
|
|
|
|
// Again, assume the worst
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverDate[0].AssignLiteral("01-01-1970");
|
2012-09-17 21:56:24 +04:00
|
|
|
}
|
2016-06-21 06:32:01 +03:00
|
|
|
RegCloseKey(key);
|
2012-02-23 18:53:55 +04:00
|
|
|
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
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
// It is convenient to have these as integers
|
|
|
|
uint32_t adapterVendorID[2] = {0, 0};
|
|
|
|
uint32_t adapterDeviceID[2] = {0, 0};
|
|
|
|
uint32_t adapterSubsysID[2] = {0, 0};
|
|
|
|
|
|
|
|
adapterVendorID[0] = ParseIDFromDeviceID(mDeviceID[0], "VEN_", 4);
|
|
|
|
adapterDeviceID[0] = ParseIDFromDeviceID(mDeviceID[0], "&DEV_", 4);
|
|
|
|
adapterSubsysID[0] = ParseIDFromDeviceID(mDeviceID[0], "&SUBSYS_", 8);
|
|
|
|
|
2017-04-12 04:39:20 +03:00
|
|
|
// Sometimes we don't get the valid device using this method. For now,
|
|
|
|
// allow zero vendor or device as valid, as long as the other value is
|
|
|
|
// non-zero.
|
|
|
|
bool foundValidDevice = (adapterVendorID[0] != 0 || adapterDeviceID[0] != 0);
|
2012-02-23 18:53:55 +04:00
|
|
|
|
2017-04-12 04:39:20 +03:00
|
|
|
// We now check for second display adapter. If we didn't find the valid
|
|
|
|
// device using the original approach, we will try the alternative.
|
2012-02-23 18:53:55 +04:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
|
|
|
constexpr auto driverKeyPre =
|
|
|
|
u"System\\CurrentControlSet\\Control\\Class\\"_ns;
|
|
|
|
/* 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, nullptr, (PBYTE)value,
|
|
|
|
sizeof(value), nullptr)) {
|
|
|
|
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;
|
2016-12-16 19:56:59 +03:00
|
|
|
adapterVendorID[1] = ParseIDFromDeviceID(deviceID2, "VEN_", 4);
|
|
|
|
adapterDeviceID[1] = ParseIDFromDeviceID(deviceID2, "&DEV_", 4);
|
2017-04-12 04:39:20 +03:00
|
|
|
// Skip the devices we already considered, as well as any
|
|
|
|
// "zero" ones.
|
|
|
|
if ((adapterVendorID[0] == adapterVendorID[1] &&
|
|
|
|
adapterDeviceID[0] == adapterDeviceID[1]) ||
|
|
|
|
(adapterVendorID[1] == 0 && adapterDeviceID[1] == 0)) {
|
2012-02-23 18:53:55 +04:00
|
|
|
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) {
|
2017-04-12 04:39:20 +03:00
|
|
|
// If we didn't find a valid device with the original method
|
|
|
|
// take this one, and continue looking for the second GPU.
|
|
|
|
if (!foundValidDevice) {
|
|
|
|
foundValidDevice = true;
|
|
|
|
adapterVendorID[0] = adapterVendorID[1];
|
|
|
|
adapterDeviceID[0] = adapterDeviceID[1];
|
|
|
|
mDeviceString[0] = value;
|
|
|
|
mDeviceID[0] = deviceID2;
|
|
|
|
mDeviceKey[0] = driverKey2;
|
|
|
|
mDriverVersion[0] = driverVersion2;
|
|
|
|
mDriverDate[0] = driverDate2;
|
|
|
|
adapterSubsysID[0] =
|
|
|
|
ParseIDFromDeviceID(mDeviceID[0], "&SUBSYS_", 8);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-02-23 18:53:55 +04:00
|
|
|
mHasDualGPU = true;
|
2016-12-16 19:56:59 +03:00
|
|
|
mDeviceString[1] = value;
|
|
|
|
mDeviceID[1] = deviceID2;
|
|
|
|
mDeviceKey[1] = driverKey2;
|
|
|
|
mDriverVersion[1] = driverVersion2;
|
|
|
|
mDriverDate[1] = driverDate2;
|
|
|
|
adapterSubsysID[1] =
|
|
|
|
ParseIDFromDeviceID(mDeviceID[1], "&SUBSYS_", 8);
|
|
|
|
mAdapterVendorID[1].AppendPrintf("0x%04x", adapterVendorID[1]);
|
|
|
|
mAdapterDeviceID[1].AppendPrintf("0x%04x", adapterDeviceID[1]);
|
|
|
|
mAdapterSubsysID[1].AppendPrintf("%08x", adapterSubsysID[1]);
|
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
|
|
|
|
2017-04-12 04:39:20 +03:00
|
|
|
mAdapterVendorID[0].AppendPrintf("0x%04x", adapterVendorID[0]);
|
|
|
|
mAdapterDeviceID[0].AppendPrintf("0x%04x", adapterDeviceID[0]);
|
|
|
|
mAdapterSubsysID[0].AppendPrintf("%08x", adapterSubsysID[0]);
|
|
|
|
|
2016-12-16 19:57:51 +03:00
|
|
|
// Sometimes, the enumeration is not quite right and the two adapters
|
|
|
|
// end up being swapped. Actually enumerate the adapters that come
|
|
|
|
// back from the DXGI factory to check, and tag the second as active
|
|
|
|
// if found.
|
|
|
|
if (mHasDualGPU) {
|
|
|
|
nsModuleHandle dxgiModule(LoadLibrarySystem32(L"dxgi.dll"));
|
|
|
|
decltype(CreateDXGIFactory)* createDXGIFactory =
|
|
|
|
(decltype(CreateDXGIFactory)*)GetProcAddress(dxgiModule,
|
|
|
|
"CreateDXGIFactory");
|
|
|
|
|
|
|
|
if (createDXGIFactory) {
|
|
|
|
RefPtr<IDXGIFactory> factory = nullptr;
|
2017-08-25 18:39:30 +03:00
|
|
|
createDXGIFactory(__uuidof(IDXGIFactory), (void**)(&factory));
|
2016-12-16 19:57:51 +03:00
|
|
|
if (factory) {
|
|
|
|
RefPtr<IDXGIAdapter> adapter;
|
|
|
|
if (SUCCEEDED(factory->EnumAdapters(0, getter_AddRefs(adapter)))) {
|
|
|
|
DXGI_ADAPTER_DESC desc;
|
|
|
|
PodZero(&desc);
|
|
|
|
if (SUCCEEDED(adapter->GetDesc(&desc))) {
|
|
|
|
if (desc.VendorId != adapterVendorID[0] &&
|
|
|
|
desc.DeviceId != adapterDeviceID[0] &&
|
|
|
|
desc.VendorId == adapterVendorID[1] &&
|
|
|
|
desc.DeviceId == adapterDeviceID[1]) {
|
|
|
|
mActiveGPUIndex = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-02 06:16:19 +04:00
|
|
|
mHasDriverVersionMismatch = false;
|
2016-12-16 19:56:59 +03:00
|
|
|
if (mAdapterVendorID[mActiveGPUIndex] ==
|
2020-02-14 01:39:10 +03:00
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::Intel)) {
|
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.
|
2017-02-10 20:08:00 +03:00
|
|
|
|
|
|
|
// Note that these start without the .dll extension but eventually gain it.
|
2011-09-29 10:19:26 +04:00
|
|
|
bool is64bitApp = sizeof(void*) == 8;
|
2017-02-10 20:08:00 +03:00
|
|
|
nsAutoString dllFileName(is64bitApp ? u"igd10umd64" : u"igd10umd32");
|
|
|
|
nsAutoString dllFileName2(is64bitApp ? u"igd10iumd64" : u"igd10iumd32");
|
2011-01-21 07:31:03 +03:00
|
|
|
|
2017-02-10 20:08:00 +03:00
|
|
|
nsString dllVersion, dllVersion2;
|
2013-08-06 06:00:42 +04:00
|
|
|
uint64_t dllNumericVersion = 0, dllNumericVersion2 = 0,
|
|
|
|
driverNumericVersion = 0, knownSafeMismatchVersion = 0;
|
2017-02-10 20:08:00 +03:00
|
|
|
|
|
|
|
// Only parse the DLL version for those found in the driver list
|
2017-04-01 22:46:41 +03:00
|
|
|
nsAutoString eligibleDLLs;
|
|
|
|
if (NS_SUCCEEDED(GetAdapterDriver(eligibleDLLs))) {
|
|
|
|
if (FindInReadable(dllFileName, eligibleDLLs)) {
|
2017-02-10 20:08:00 +03:00
|
|
|
dllFileName += u".dll"_ns;
|
|
|
|
gfxWindowsPlatform::GetDLLVersion(dllFileName.get(), dllVersion);
|
|
|
|
ParseDriverVersion(dllVersion, &dllNumericVersion);
|
|
|
|
}
|
2017-04-01 22:46:41 +03:00
|
|
|
if (FindInReadable(dllFileName2, eligibleDLLs)) {
|
2017-02-10 20:08:00 +03:00
|
|
|
dllFileName2 += u".dll"_ns;
|
|
|
|
gfxWindowsPlatform::GetDLLVersion(dllFileName2.get(), dllVersion2);
|
|
|
|
ParseDriverVersion(dllVersion2, &dllNumericVersion2);
|
|
|
|
}
|
|
|
|
}
|
2015-05-15 20:43:38 +03:00
|
|
|
|
2017-04-01 22:46:41 +03:00
|
|
|
// Sometimes the DLL is not in the System32 nor SysWOW64 directories. But
|
|
|
|
// UserModeDriverName (or UserModeDriverNameWow, if available) might provide
|
|
|
|
// the full path to the DLL in some DriverStore FileRepository.
|
|
|
|
if (dllNumericVersion == 0 && dllNumericVersion2 == 0) {
|
|
|
|
nsTArray<nsString> eligibleDLLpaths;
|
|
|
|
const WCHAR* keyLocation = mDeviceKey[mActiveGPUIndex].get();
|
|
|
|
GetKeyValues(keyLocation, L"UserModeDriverName", eligibleDLLpaths);
|
|
|
|
GetKeyValues(keyLocation, L"UserModeDriverNameWow", eligibleDLLpaths);
|
|
|
|
size_t length = eligibleDLLpaths.Length();
|
|
|
|
for (size_t i = 0;
|
|
|
|
i < length && dllNumericVersion == 0 && dllNumericVersion2 == 0;
|
|
|
|
++i) {
|
|
|
|
if (FindInReadable(dllFileName, eligibleDLLpaths[i])) {
|
|
|
|
gfxWindowsPlatform::GetDLLVersion(eligibleDLLpaths[i].get(),
|
|
|
|
dllVersion);
|
|
|
|
ParseDriverVersion(dllVersion, &dllNumericVersion);
|
|
|
|
} else if (FindInReadable(dllFileName2, eligibleDLLpaths[i])) {
|
|
|
|
gfxWindowsPlatform::GetDLLVersion(eligibleDLLpaths[i].get(),
|
|
|
|
dllVersion2);
|
|
|
|
ParseDriverVersion(dllVersion2, &dllNumericVersion2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
ParseDriverVersion(mDriverVersion[mActiveGPUIndex], &driverNumericVersion);
|
2013-08-06 06:00:42 +04:00
|
|
|
ParseDriverVersion(u"9.17.10.0"_ns, &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;
|
2017-04-01 22:46:41 +03:00
|
|
|
gfxCriticalNoteOnce
|
|
|
|
<< "Mismatched driver versions between the registry "
|
|
|
|
<< NS_ConvertUTF16toUTF8(mDriverVersion[mActiveGPUIndex]).get()
|
|
|
|
<< " and DLL(s) " << NS_ConvertUTF16toUTF8(dllVersion).get() << ", "
|
|
|
|
<< NS_ConvertUTF16toUTF8(dllVersion2).get() << " reported.";
|
2015-05-15 20:43:38 +03:00
|
|
|
}
|
|
|
|
} 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.
|
2017-02-10 20:08:00 +03:00
|
|
|
gfxCriticalErrorOnce()
|
|
|
|
<< "Potential driver version mismatch ignored due to missing DLLs "
|
|
|
|
<< NS_ConvertUTF16toUTF8(dllFileName).get()
|
|
|
|
<< " v=" << NS_ConvertUTF16toUTF8(dllVersion).get() << " and "
|
|
|
|
<< NS_ConvertUTF16toUTF8(dllFileName2).get()
|
|
|
|
<< " v=" << NS_ConvertUTF16toUTF8(dllVersion2).get();
|
2013-08-06 06:00:42 +04:00
|
|
|
}
|
2011-01-21 07:31:03 +03:00
|
|
|
}
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
// Get monitor information
|
2021-02-05 02:25:35 +03:00
|
|
|
RefreshMonitors();
|
2019-10-04 02:43:35 +03:00
|
|
|
|
2013-04-03 22:47:56 +04:00
|
|
|
const char* spoofedDriverVersionString =
|
|
|
|
PR_GetEnv("MOZ_GFX_SPOOF_DRIVER_VERSION");
|
|
|
|
if (spoofedDriverVersionString) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverVersion[mActiveGPUIndex].AssignASCII(spoofedDriverVersionString);
|
2013-04-03 22:47:56 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
const char* spoofedVendor = PR_GetEnv("MOZ_GFX_SPOOF_VENDOR_ID");
|
|
|
|
if (spoofedVendor) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mAdapterVendorID[mActiveGPUIndex].AssignASCII(spoofedVendor);
|
2013-04-03 22:47:56 +04:00
|
|
|
}
|
|
|
|
|
2011-01-20 04:37:24 +03:00
|
|
|
const char* spoofedDevice = PR_GetEnv("MOZ_GFX_SPOOF_DEVICE_ID");
|
|
|
|
if (spoofedDevice) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mAdapterDeviceID[mActiveGPUIndex].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
|
|
|
|
|
|
|
return rv;
|
2010-08-27 19:49:02 +04:00
|
|
|
}
|
|
|
|
|
2010-08-31 01:45:29 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDescription(nsAString& aAdapterDescription) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDescription = mDeviceString[mActiveGPUIndex];
|
2010-08-27 19:49:02 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-08-12 17:46:41 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDescription2(nsAString& aAdapterDescription) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDescription = mDeviceString[1 - mActiveGPUIndex];
|
2011-08-12 17:46:41 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2021-02-05 02:25:35 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::RefreshMonitors() {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2021-02-05 02:25:35 +03:00
|
|
|
mDisplayInfo.Clear();
|
|
|
|
|
|
|
|
for (int deviceIndex = 0;; deviceIndex++) {
|
|
|
|
DISPLAY_DEVICEW device;
|
|
|
|
device.cb = sizeof(device);
|
|
|
|
if (!::EnumDisplayDevicesW(nullptr, deviceIndex, &device, 0)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(device.StateFlags & DISPLAY_DEVICE_ACTIVE)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEVMODEW mode;
|
|
|
|
mode.dmSize = sizeof(mode);
|
|
|
|
mode.dmDriverExtra = 0;
|
|
|
|
if (!::EnumDisplaySettingsW(device.DeviceName, ENUM_CURRENT_SETTINGS,
|
|
|
|
&mode)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
DisplayInfo displayInfo;
|
|
|
|
|
|
|
|
displayInfo.mScreenWidth = mode.dmPelsWidth;
|
|
|
|
displayInfo.mScreenHeight = mode.dmPelsHeight;
|
|
|
|
displayInfo.mRefreshRate = mode.dmDisplayFrequency;
|
|
|
|
displayInfo.mIsPseudoDisplay =
|
|
|
|
!!(device.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER);
|
|
|
|
displayInfo.mDeviceString = device.DeviceString;
|
|
|
|
|
|
|
|
mDisplayInfo.AppendElement(displayInfo);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-08-31 01:45:29 +04:00
|
|
|
NS_IMETHODIMP
|
2019-11-26 22:42:06 +03:00
|
|
|
GfxInfo::GetAdapterRAM(uint32_t* aAdapterRAM) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
uint32_t result = 0;
|
2016-12-16 19:56:59 +03:00
|
|
|
if (NS_FAILED(GetKeyValue(mDeviceKey[mActiveGPUIndex].get(),
|
2019-11-26 22:42:06 +03:00
|
|
|
L"HardwareInformation.qwMemorySize", result,
|
2016-12-16 19:56:59 +03:00
|
|
|
REG_QWORD)) ||
|
2019-11-26 22:42:06 +03:00
|
|
|
result == 0) {
|
2016-12-16 19:56:59 +03:00
|
|
|
if (NS_FAILED(GetKeyValue(mDeviceKey[mActiveGPUIndex].get(),
|
2019-11-26 22:42:06 +03:00
|
|
|
L"HardwareInformation.MemorySize", result,
|
2016-12-16 19:56:59 +03:00
|
|
|
REG_DWORD))) {
|
2019-11-26 22:42:06 +03:00
|
|
|
result = 0;
|
2016-07-07 20:40:40 +03:00
|
|
|
}
|
|
|
|
}
|
2019-11-26 22:42:06 +03:00
|
|
|
*aAdapterRAM = result;
|
2010-08-27 19:49:02 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-08-12 17:46:41 +04:00
|
|
|
NS_IMETHODIMP
|
2019-11-26 22:42:06 +03:00
|
|
|
GfxInfo::GetAdapterRAM2(uint32_t* aAdapterRAM) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
uint32_t result = 0;
|
|
|
|
if (mHasDualGPU) {
|
2016-12-16 19:56:59 +03:00
|
|
|
if (NS_FAILED(GetKeyValue(mDeviceKey[1 - mActiveGPUIndex].get(),
|
2019-11-26 22:42:06 +03:00
|
|
|
L"HardwareInformation.qwMemorySize", result,
|
|
|
|
REG_QWORD)) ||
|
|
|
|
result == 0) {
|
|
|
|
if (NS_FAILED(GetKeyValue(mDeviceKey[1 - mActiveGPUIndex].get(),
|
|
|
|
L"HardwareInformation.MemorySize", result,
|
|
|
|
REG_DWORD))) {
|
|
|
|
result = 0;
|
|
|
|
}
|
2016-07-07 20:40:40 +03:00
|
|
|
}
|
2011-11-09 19:16:23 +04:00
|
|
|
}
|
2019-11-26 22:42:06 +03:00
|
|
|
*aAdapterRAM = result;
|
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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
if (NS_FAILED(GetKeyValue(mDeviceKey[mActiveGPUIndex].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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2011-11-09 19:16:23 +04:00
|
|
|
if (!mHasDualGPU) {
|
2014-05-26 22:54:53 +04:00
|
|
|
aAdapterDriver.Truncate();
|
2016-12-16 19:56:59 +03:00
|
|
|
} else if (NS_FAILED(GetKeyValue(mDeviceKey[1 - mActiveGPUIndex].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;
|
|
|
|
}
|
|
|
|
|
2019-04-30 23:29:18 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverVendor(nsAString& aAdapterDriverVendor) {
|
|
|
|
aAdapterDriverVendor.Truncate();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-08-31 01:45:29 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverVersion(nsAString& aAdapterDriverVersion) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDriverVersion = mDriverVersion[mActiveGPUIndex];
|
2010-08-27 19:49:02 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-08-31 01:45:29 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverDate(nsAString& aAdapterDriverDate) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDriverDate = mDriverDate[mActiveGPUIndex];
|
2010-08-27 19:49:02 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2019-04-30 23:29:18 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverVendor2(nsAString& aAdapterDriverVendor) {
|
|
|
|
aAdapterDriverVendor.Truncate();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-08-12 17:46:41 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverVersion2(nsAString& aAdapterDriverVersion) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDriverVersion = mDriverVersion[1 - mActiveGPUIndex];
|
2011-08-12 17:46:41 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterDriverDate2(nsAString& aAdapterDriverDate) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDriverDate = mDriverDate[1 - mActiveGPUIndex];
|
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::GetAdapterVendorID(nsAString& aAdapterVendorID) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterVendorID = mAdapterVendorID[mActiveGPUIndex];
|
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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterVendorID = mAdapterVendorID[1 - mActiveGPUIndex];
|
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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDeviceID = mAdapterDeviceID[mActiveGPUIndex];
|
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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterDeviceID = mAdapterDeviceID[1 - mActiveGPUIndex];
|
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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterSubsysID = mAdapterSubsysID[mActiveGPUIndex];
|
2014-07-09 22:21:49 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetAdapterSubsysID2(nsAString& aAdapterSubsysID) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2016-12-16 19:56:59 +03:00
|
|
|
aAdapterSubsysID = mAdapterSubsysID[1 - mActiveGPUIndex];
|
2014-07-09 22:21:49 +04:00
|
|
|
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) {
|
2016-12-16 19:56:59 +03:00
|
|
|
// This is never the case, as the active GPU ends up being
|
|
|
|
// the first one. It should probably be removed.
|
|
|
|
*aIsGPU2Active = false;
|
2011-08-12 17:46:41 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetDisplayInfo(nsTArray<nsString>& aDisplayInfo) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
for (auto displayInfo : mDisplayInfo) {
|
|
|
|
nsString value;
|
2021-02-01 23:06:33 +03:00
|
|
|
value.AppendPrintf("%dx%d@%dHz %s %s", displayInfo.mScreenWidth,
|
2019-10-04 02:43:35 +03:00
|
|
|
displayInfo.mScreenHeight, displayInfo.mRefreshRate,
|
2021-02-01 23:06:33 +03:00
|
|
|
displayInfo.mIsPseudoDisplay ? "Pseudo Display :" : ":",
|
|
|
|
NS_ConvertUTF16toUTF8(displayInfo.mDeviceString).get());
|
2019-10-04 02:43:35 +03:00
|
|
|
|
|
|
|
aDisplayInfo.AppendElement(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetDisplayWidth(nsTArray<uint32_t>& aDisplayWidth) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
for (auto displayInfo : mDisplayInfo) {
|
|
|
|
aDisplayWidth.AppendElement((uint32_t)displayInfo.mScreenWidth);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetDisplayHeight(nsTArray<uint32_t>& aDisplayHeight) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2019-11-26 22:42:06 +03:00
|
|
|
for (auto displayInfo : mDisplayInfo) {
|
|
|
|
aDisplayHeight.AppendElement((uint32_t)displayInfo.mScreenHeight);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2021-01-18 12:26:21 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
GfxInfo::GetDrmRenderDevice(nsACString& aDrmRenderDevice) {
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
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("Cisco VPN\n"_ns);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-31 01:45:29 +04:00
|
|
|
void GfxInfo::AddCrashReportAnnotations() {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2011-02-01 19:30:25 +03:00
|
|
|
CheckForCiscoVPN();
|
|
|
|
|
2014-03-18 20:02:51 +04:00
|
|
|
if (mHasDriverVersionMismatch) {
|
|
|
|
CrashReporter::AppendAppNotesToCrashReport("DriverVersionMismatch\n"_ns);
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
CrashReporter::AnnotateCrashReport(CrashReporter::Annotation::AdapterVendorID,
|
2011-12-15 09:03:01 +04:00
|
|
|
narrowVendorID);
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
CrashReporter::AnnotateCrashReport(CrashReporter::Annotation::AdapterDeviceID,
|
2011-12-15 09:03:01 +04:00
|
|
|
narrowDeviceID);
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
CrashReporter::AnnotateCrashReport(
|
|
|
|
CrashReporter::Annotation::AdapterDriverVersion, narrowDriverVersion);
|
|
|
|
CrashReporter::AnnotateCrashReport(CrashReporter::Annotation::AdapterSubsysID,
|
2014-07-09 22:21:49 +04:00
|
|
|
narrowSubsysID);
|
|
|
|
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
/* Add an App Note, this contains extra information. */
|
2012-09-02 06:35:17 +04:00
|
|
|
nsAutoCString note;
|
2010-11-25 23:44:37 +03:00
|
|
|
|
Bug 1348273 - Convert crash annotations into a machine-readable list of constants; r=ted.mielczarek,njn,dholbert,mak,cpearce,mcmanus,froydnj,Dexter,jrmuizel,jchen,jimm,bz,surkov
This introduces the machinery needed to generate crash annotations from a YAML
file. The relevant C++ functions are updated to take a typed enum. JavaScript
calls are unaffected but they will throw if the string argument does not
correspond to one of the known entries in the C++ enum. The existing whitelists
and blacklists of annotations are also generated from the YAML file and all
duplicate code related to them has been consolidated. Once written out to the
.extra file the annotations are converted in string form and are no different
than the existing ones.
All existing annotations have been included in the list (and some obsolete ones
have been removed) and all call sites have been updated including tests where
appropriate.
--HG--
extra : source : 4f6c43f2830701ec5552e08e3f1b06fe6d045860
2018-07-05 16:42:11 +03:00
|
|
|
// TODO: We should probably convert this into a proper annotation
|
2020-02-14 01:39:10 +03:00
|
|
|
if (vendorID == GfxDriverInfo::GetDeviceVendor(DeviceVendor::All)) {
|
2011-12-15 09:03:01 +04:00
|
|
|
/* if we didn't find a valid vendorID lets append the mDeviceID string to
|
|
|
|
* try to find out why */
|
2016-12-16 19:56:59 +03:00
|
|
|
LossyAppendUTF16toASCII(mDeviceID[mActiveGPUIndex], note);
|
2014-05-22 07:48:51 +04:00
|
|
|
note.AppendLiteral(", ");
|
2012-07-06 13:43:28 +04:00
|
|
|
LossyAppendUTF16toASCII(mDeviceKeyDebug, note);
|
2010-11-25 23:44:37 +03:00
|
|
|
}
|
2017-09-04 08:14:11 +03:00
|
|
|
note.AppendLiteral("\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
|
|
|
|
2016-12-16 19:57:51 +03:00
|
|
|
// Make a slight difference between the two cases so that we
|
|
|
|
// can see it in the crash reports. It may come in handy.
|
|
|
|
if (mActiveGPUIndex == 1) {
|
|
|
|
note.AppendLiteral("Has dual GPUs. GPU-#2: ");
|
|
|
|
} else {
|
|
|
|
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
|
|
|
}
|
2010-08-31 01:45:29 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
static OperatingSystem WindowsVersionToOperatingSystem(
|
|
|
|
int32_t aWindowsVersion) {
|
2011-01-20 04:21:07 +03:00
|
|
|
switch (aWindowsVersion) {
|
2013-11-22 07:35:40 +04:00
|
|
|
case kWindows7:
|
2016-06-03 23:13:08 +03:00
|
|
|
return OperatingSystem::Windows7;
|
2013-11-22 07:35:40 +04:00
|
|
|
case kWindows8:
|
2016-06-03 23:13:08 +03:00
|
|
|
return OperatingSystem::Windows8;
|
2013-11-22 07:35:40 +04:00
|
|
|
case kWindows8_1:
|
2016-06-03 23:13:08 +03:00
|
|
|
return OperatingSystem::Windows8_1;
|
2015-03-12 00:44:52 +03:00
|
|
|
case kWindows10:
|
2016-06-03 23:13:08 +03:00
|
|
|
return OperatingSystem::Windows10;
|
2013-11-22 07:35:40 +04:00
|
|
|
case kWindowsUnknown:
|
2011-01-20 04:21:07 +03:00
|
|
|
default:
|
2016-06-03 23:13:08 +03:00
|
|
|
return OperatingSystem::Unknown;
|
2016-01-22 18:58:49 +03:00
|
|
|
}
|
2010-08-31 01:45:29 +04:00
|
|
|
}
|
|
|
|
|
2018-10-23 07:43:28 +03:00
|
|
|
static bool OnlyAllowFeatureOnWhitelistedVendor(int32_t aFeature) {
|
|
|
|
switch (aFeature) {
|
|
|
|
// The GPU process doesn't need hardware acceleration and can run on
|
|
|
|
// devices that we normally block from not being on our whitelist.
|
|
|
|
case nsIGfxInfo::FEATURE_GPU_PROCESS:
|
2019-08-14 02:19:46 +03:00
|
|
|
// We can mostly assume that ANGLE will work
|
|
|
|
case nsIGfxInfo::FEATURE_DIRECT3D_11_ANGLE:
|
2020-12-17 00:32:28 +03:00
|
|
|
// Software WebRender is our Basic compositor replacement. It needs to
|
|
|
|
// always work.
|
|
|
|
case nsIGfxInfo::FEATURE_WEBRENDER_SOFTWARE:
|
2018-10-23 07:43:28 +03:00
|
|
|
return false;
|
|
|
|
default:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 20:51:59 +03:00
|
|
|
// Return true if the CPU supports AVX, but the operating system does not.
|
|
|
|
#if defined(_M_X64)
|
|
|
|
static inline bool DetectBrokenAVX() {
|
|
|
|
int regs[4];
|
|
|
|
__cpuid(regs, 0);
|
|
|
|
if (regs[0] == 0) {
|
|
|
|
// Level not supported.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
__cpuid(regs, 1);
|
|
|
|
|
|
|
|
const unsigned AVX = 1u << 28;
|
|
|
|
const unsigned XSAVE = 1u << 26;
|
|
|
|
if ((regs[2] & (AVX | XSAVE)) != (AVX | XSAVE)) {
|
|
|
|
// AVX is not supported on this CPU.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
const unsigned OSXSAVE = 1u << 27;
|
|
|
|
if ((regs[2] & OSXSAVE) != OSXSAVE) {
|
|
|
|
// AVX is supported, but the OS didn't enable it.
|
|
|
|
// This can be forced via bcdedit /set xsavedisable 1.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
const unsigned AVX_CTRL_BITS = (1 << 1) | (1 << 2);
|
2019-12-12 09:38:39 +03:00
|
|
|
return (xgetbv(0) & AVX_CTRL_BITS) != AVX_CTRL_BITS;
|
2017-09-28 20:51:59 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2011-12-15 09:02:59 +04:00
|
|
|
const nsTArray<GfxDriverInfo>& GfxInfo::GetGfxDriverInfo() {
|
2018-05-14 18:16:50 +03:00
|
|
|
if (!sDriverInfo->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
|
2020-06-23 18:21:36 +03:00
|
|
|
* blocklisting call.
|
2012-09-22 02:12:28 +04:00
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
|
2011-12-15 09:03:01 +04:00
|
|
|
/*
|
2011-12-15 09:02:59 +04:00
|
|
|
* NVIDIA entries
|
|
|
|
*/
|
2016-07-10 04:14:31 +03:00
|
|
|
/*
|
|
|
|
* The last 5 digit of the NVIDIA driver version maps to the version that
|
|
|
|
* NVIDIA uses. The minor version (15, 16, 17) corresponds roughtly to the
|
|
|
|
* OS (Vista, Win7, Win7) but they show up in smaller numbers across all
|
|
|
|
* OS versions (perhaps due to OS upgrades). So we want to support
|
2016-10-13 12:54:16 +03:00
|
|
|
* October 2009+ drivers across all these minor versions.
|
2016-07-10 04:14:31 +03:00
|
|
|
*
|
2016-10-13 12:54:16 +03:00
|
|
|
* 187.45 (late October 2009) and earlier contain a bug which can cause us
|
|
|
|
* to crash on shutdown.
|
2016-07-10 04:14:31 +03:00
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::NvidiaAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_LESS_THAN_OR_EQUAL, V(8, 15, 11, 8745),
|
|
|
|
"FEATURE_FAILURE_NV_W7_15", "nVidia driver > 187.45");
|
2016-07-10 04:14:31 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::NvidiaAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-10-13 12:54:16 +03:00
|
|
|
DRIVER_BETWEEN_INCLUSIVE_START, V(8, 16, 10, 0000), V(8, 16, 11, 8745),
|
|
|
|
"FEATURE_FAILURE_NV_W7_16", "nVidia driver > 187.45");
|
2016-07-10 04:14:31 +03:00
|
|
|
// Telemetry doesn't show any driver in this range so it might not even be
|
|
|
|
// required.
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::NvidiaAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-10-13 12:54:16 +03:00
|
|
|
DRIVER_BETWEEN_INCLUSIVE_START, V(8, 17, 10, 0000), V(8, 17, 11, 8745),
|
|
|
|
"FEATURE_FAILURE_NV_W7_17", "nVidia driver > 187.45");
|
2011-12-15 09:02:59 +04:00
|
|
|
|
|
|
|
/*
|
2016-05-18 04:22:06 +03:00
|
|
|
* AMD/ATI entries. 8.56.1.15 is the driver that shipped with Windows 7 RTM
|
2011-12-15 09:02:59 +04:00
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_LESS_THAN, V(8, 56, 1, 15), "FEATURE_FAILURE_AMD1", "8.56.1.15");
|
2011-12-15 09:02:59 +04:00
|
|
|
|
2014-12-02 03:21:37 +03:00
|
|
|
// Bug 1099252
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::AtiAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_EQUAL, V(8, 832, 0, 0), "FEATURE_FAILURE_BUG_1099252");
|
2014-12-02 03:21:37 +03:00
|
|
|
|
2015-02-04 01:27:07 +03:00
|
|
|
// Bug 1118695
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::AtiAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_EQUAL, V(8, 783, 2, 2000), "FEATURE_FAILURE_BUG_1118695");
|
2015-02-04 01:27:07 +03:00
|
|
|
|
2019-10-11 02:10:28 +03:00
|
|
|
// Bug 1587155
|
|
|
|
//
|
|
|
|
// There are a several reports of strange rendering corruptions with this
|
|
|
|
// driver version, with and without webrender. We weren't able to
|
|
|
|
// reproduce these problems, but the users were able to update their
|
2020-06-23 18:21:36 +03:00
|
|
|
// drivers and it went away. So just to be safe, let's blocklist all
|
2019-10-11 02:10:28 +03:00
|
|
|
// gpu use with this particular (very old) driver, restricted
|
|
|
|
// to Win10 since we only have reports from that platform.
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-27 18:39:12 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::AtiAll,
|
2020-02-14 01:39:10 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_EQUAL, V(22, 19, 162, 4), "FEATURE_FAILURE_BUG_1587155");
|
2019-10-11 02:10:28 +03:00
|
|
|
|
2016-09-09 10:01:00 +03:00
|
|
|
// Bug 1198815
|
2016-08-02 04:12:34 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2016-08-23 03:06:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_BETWEEN_INCLUSIVE,
|
2016-09-09 10:01:00 +03:00
|
|
|
V(15, 200, 0, 0), V(15, 200, 1062, 1004), "FEATURE_FAILURE_BUG_1198815",
|
|
|
|
"15.200.0.0-15.200.1062.1004");
|
2016-09-01 00:35:59 +03:00
|
|
|
|
|
|
|
// Bug 1267970
|
2016-09-09 10:01:00 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2016-09-09 10:01:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_BETWEEN_INCLUSIVE,
|
|
|
|
V(15, 200, 0, 0), V(15, 301, 2301, 1002), "FEATURE_FAILURE_BUG_1267970",
|
|
|
|
"15.200.0.0-15.301.2301.1002");
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2016-09-01 00:35:59 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_BETWEEN_INCLUSIVE,
|
|
|
|
V(16, 100, 0, 0), V(16, 300, 2311, 0), "FEATURE_FAILURE_BUG_1267970",
|
|
|
|
"16.100.0.0-16.300.2311.0");
|
2016-08-02 04:12:34 +03:00
|
|
|
|
2012-09-14 02:39:37 +04:00
|
|
|
/*
|
|
|
|
* Bug 783517 - crashes in AMD driver on Windows 8
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows8, DeviceFamily::AtiAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_BETWEEN_INCLUSIVE_START, V(8, 982, 0, 0), V(8, 983, 0, 0),
|
|
|
|
"FEATURE_FAILURE_BUG_783517_AMD", "!= 8.982.*.*");
|
2012-09-14 02:39:37 +04:00
|
|
|
|
2020-01-05 22:25:36 +03:00
|
|
|
/*
|
|
|
|
* Bug 1599981 - crashes in AMD driver on Windows 10
|
|
|
|
*/
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-27 18:39:12 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::RadeonCaicos,
|
2020-01-05 22:25:36 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_11_LAYERS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN,
|
|
|
|
V(15, 301, 1901, 0), "FEATURE_FAILURE_BUG_1599981");
|
|
|
|
|
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
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_OPENGL_LAYERS, nsIGfxInfo::FEATURE_DISCOURAGED,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_OGL_ATI_DIS");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2011-12-15 09:02:59 +04:00
|
|
|
/*
|
|
|
|
* Intel entries
|
|
|
|
*/
|
2018-11-30 13:46:48 +03:00
|
|
|
|
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
|
|
|
*/
|
2016-04-14 00:12:47 +03:00
|
|
|
#define IMPLEMENT_INTEL_DRIVER_BLOCKLIST(winVer, devFamily, driverVer, ruleId) \
|
2020-02-14 01:39:10 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(winVer, devFamily, GfxDriverInfo::allFeatures, \
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, \
|
|
|
|
DRIVER_LESS_THAN, driverVer, ruleId)
|
|
|
|
|
|
|
|
#define IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(winVer, devFamily, driverVer, \
|
|
|
|
ruleId) \
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(winVer, devFamily, nsIGfxInfo::FEATURE_DIRECT2D, \
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, \
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN, driverVer, ruleId)
|
|
|
|
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7,
|
|
|
|
DeviceFamily::IntelGMA500, 2026,
|
|
|
|
"FEATURE_FAILURE_594877_7");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMA900,
|
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_594877_8");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7,
|
|
|
|
DeviceFamily::IntelGMA950, 1930,
|
|
|
|
"FEATURE_FAILURE_594877_9");
|
2016-09-05 02:03:00 +03:00
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7,
|
2020-02-14 01:39:10 +03:00
|
|
|
DeviceFamily::IntelGMA3150, 2117,
|
2016-09-05 02:03:00 +03:00
|
|
|
"FEATURE_FAILURE_594877_10");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7,
|
2020-02-14 01:39:10 +03:00
|
|
|
DeviceFamily::IntelGMAX3000, 1930,
|
2016-09-05 02:03:00 +03:00
|
|
|
"FEATURE_FAILURE_594877_11");
|
2020-02-14 01:39:10 +03:00
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
|
|
|
2202, "FEATURE_FAILURE_594877_12");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-07-22 01:04:48 +03:00
|
|
|
/* 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
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelGMAX4500HD,
|
2015-07-22 01:04:48 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_1180379");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2016-06-03 23:13:08 +03:00
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMA500, V(5, 0, 0, 2026),
|
|
|
|
"FEATURE_FAILURE_INTEL_16");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMA900,
|
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_INTEL_17");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMA950,
|
|
|
|
V(8, 15, 10, 1930), "FEATURE_FAILURE_INTEL_18");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMA3150,
|
|
|
|
V(8, 14, 10, 1972), "FEATURE_FAILURE_INTEL_19");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMAX3000,
|
|
|
|
V(7, 15, 10, 1666), "FEATURE_FAILURE_INTEL_20");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMAX4500HD,
|
|
|
|
V(7, 15, 10, 1666), "FEATURE_FAILURE_INTEL_21");
|
|
|
|
IMPLEMENT_INTEL_DRIVER_BLOCKLIST(
|
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2016-06-03 23:13:08 +03:00
|
|
|
V(7, 15, 10, 1666), "FEATURE_FAILURE_INTEL_22");
|
2011-12-15 09:03:01 +04:00
|
|
|
|
2014-11-19 13:25:21 +03:00
|
|
|
// Bug 1074378
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelGMAX4500HD,
|
2014-11-19 13:25:21 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-05-25 00:40:27 +03:00
|
|
|
DRIVER_EQUAL, V(8, 15, 10, 1749), "FEATURE_FAILURE_BUG_1074378_1",
|
|
|
|
"8.15.10.2342");
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2015-07-22 01:04:48 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-05-25 00:40:27 +03:00
|
|
|
DRIVER_EQUAL, V(8, 15, 10, 1749), "FEATURE_FAILURE_BUG_1074378_2",
|
|
|
|
"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 */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelAll,
|
|
|
|
nsIGfxInfo::FEATURE_OPENGL_LAYERS, nsIGfxInfo::FEATURE_DISCOURAGED,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_INTEL_OGL_DIS");
|
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
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-11-19 22:30:46 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelSandyBridge,
|
2014-09-29 19:57:54 +04:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-08-31 21:24:00 +03:00
|
|
|
DRIVER_BUILD_ID_LESS_THAN_OR_EQUAL, 2321, "FEATURE_FAILURE_BUG_1018278",
|
|
|
|
"X.X.X.2342");
|
2014-08-01 09:59:36 +04:00
|
|
|
|
2018-03-22 09:33:52 +03:00
|
|
|
/**
|
|
|
|
* Disable D2D on Win7 on Intel Haswell for graphics drivers build id <=
|
|
|
|
* 4578. See bug 1432610
|
|
|
|
*/
|
2020-02-14 01:39:10 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(OperatingSystem::Windows7,
|
2020-06-25 23:49:50 +03:00
|
|
|
DeviceFamily::IntelHaswell,
|
2020-02-14 01:39:10 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN_OR_EQUAL, 4578,
|
|
|
|
"FEATURE_FAILURE_BUG_1432610");
|
2018-03-22 09:33:52 +03:00
|
|
|
|
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
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelMobileHDGraphics,
|
2013-03-12 23:40:29 +04:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN_OR_EQUAL,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(8, 15, 10, 2302), "FEATURE_FAILURE_BUG_806786");
|
2013-03-12 23:40:29 +04:00
|
|
|
|
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
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows8, DeviceFamily::IntelMobileHDGraphics,
|
2013-05-03 01:39:56 +04:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN_OR_EQUAL,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(8, 15, 10, 2302), "FEATURE_FAILURE_BUG_804144");
|
2013-05-03 01:39:56 +04:00
|
|
|
|
2018-02-01 21:02:11 +03:00
|
|
|
/* Disable D2D on Win7 on Intel HD Graphics on driver == 8.15.10.2418
|
|
|
|
* See bug 1433790
|
|
|
|
*/
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2018-02-01 21:02:11 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_EQUAL,
|
|
|
|
V(8, 15, 10, 2418), "FEATURE_FAILURE_BUG_1433790");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
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.
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::Bug1116812,
|
2015-03-26 02:58:48 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_11_LAYERS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_LESS_THAN,
|
2016-04-14 00:12:47 +03:00
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_BUG_1116812");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-09-28 02:44:00 +03:00
|
|
|
/* Disable D3D11 layers on Intel GMA 3150 for failing to allocate a shared
|
|
|
|
* handle for textures. See bug 1207665. Additionally block D2D so we don't
|
|
|
|
* accidentally use WARP.
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::Bug1207665,
|
2015-09-28 02:44:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_11_LAYERS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_LESS_THAN,
|
2016-04-14 00:12:47 +03:00
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_BUG_1207665_1");
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::Bug1207665,
|
2015-09-28 02:44:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_BUG_1207665_2");
|
2015-09-28 02:44:00 +03:00
|
|
|
|
2019-02-21 21:27:04 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::QualcommAll,
|
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
2019-02-21 21:27:04 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN,
|
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_QUALCOMM");
|
|
|
|
|
2019-05-02 05:42:31 +03:00
|
|
|
// Bug 1548410. Disable hardware accelerated video decoding on
|
|
|
|
// Qualcomm drivers used on Windows on ARM64 which are known to
|
|
|
|
// cause BSOD's and output suprious green frames while decoding video.
|
2020-06-23 18:21:36 +03:00
|
|
|
// Bug 1592826 expands the blocklist.
|
2019-05-02 05:42:31 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::QualcommAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2019-05-02 05:42:31 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN_OR_EQUAL,
|
2019-11-05 11:31:42 +03:00
|
|
|
V(25, 18, 10440, 0), "FEATURE_FAILURE_BUG_1592826");
|
2019-05-02 05:42:31 +03:00
|
|
|
|
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
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D,
|
2014-05-19 02:37:17 +04:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_BETWEEN_INCLUSIVE_START, V(14, 1, 0, 0), V(14, 2, 0, 0),
|
|
|
|
"FEATURE_FAILURE_BUG_984488_1", "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.
|
|
|
|
*/
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::NvidiaBlockD3D9Layers,
|
2011-12-15 09:03:01 +04:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_9_LAYERS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_LESS_THAN,
|
2016-04-14 00:12:47 +03:00
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_BUG_612007");
|
2013-06-14 23:34:41 +04:00
|
|
|
|
|
|
|
/* Microsoft RemoteFX; blocked less than 6.2.0.0 */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::MicrosoftAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_LESS_THAN, V(6, 2, 0, 0), "< 6.2.0.0",
|
|
|
|
"FEATURE_FAILURE_REMOTE_FX");
|
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. */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::Nvidia310M,
|
2014-09-11 00:16:55 +04:00
|
|
|
nsIGfxInfo::FEATURE_DIRECT2D, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_BUG_1008759");
|
2015-01-26 03:34:28 +03:00
|
|
|
|
2015-03-12 00:44:52 +03:00
|
|
|
/* Bug 1139503: DXVA crashes with ATI cards on windows 10. */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows10, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2015-04-01 06:06:56 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_EQUAL,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(15, 200, 1006, 0), "FEATURE_FAILURE_BUG_1139503");
|
2015-03-21 22:37:00 +03:00
|
|
|
|
2015-10-14 02:45:40 +03:00
|
|
|
/* Bug 1213107: D3D9 crashes with ATI cards on Windows 7. */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
2015-10-14 02:45:40 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_BETWEEN_INCLUSIVE,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(8, 861, 0, 0), V(8, 862, 6, 5000), "FEATURE_FAILURE_BUG_1213107_1",
|
|
|
|
"Radeon driver > 8.862.6.5000");
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBGL_ANGLE,
|
2015-10-14 02:45:40 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_BETWEEN_INCLUSIVE,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(8, 861, 0, 0), V(8, 862, 6, 5000), "FEATURE_FAILURE_BUG_1213107_2",
|
|
|
|
"Radeon driver > 8.862.6.5000");
|
2015-10-14 02:45:40 +03:00
|
|
|
|
2016-02-03 06:58:22 +03:00
|
|
|
/* This may not be needed at all */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::Bug1155608,
|
2015-04-30 00:49:49 +03:00
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(8, 15, 10, 2869), "FEATURE_FAILURE_INTEL_W7_HW_DECODING");
|
2015-04-30 00:49:49 +03:00
|
|
|
|
2015-10-22 02:35:52 +03:00
|
|
|
/* Bug 1203199/1092166: DXVA startup crashes on some intel drivers. */
|
2020-02-14 01:39:10 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST(OperatingSystem::Windows, DeviceFamily::IntelAll,
|
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN_OR_EQUAL, 2849,
|
|
|
|
"FEATURE_FAILURE_BUG_1203199_1",
|
|
|
|
"Intel driver > X.X.X.2849");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::Nvidia8800GTS,
|
2015-04-17 03:41:37 +03:00
|
|
|
nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_EQUAL,
|
2016-04-14 00:12:47 +03:00
|
|
|
V(9, 18, 13, 4052), "FEATURE_FAILURE_BUG_1203199_2");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
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 */
|
2016-06-03 23:13:08 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST_RANGE_GPU2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::Bug1137716,
|
2015-03-21 22:37:00 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
2016-04-14 00:12:47 +03:00
|
|
|
DRIVER_BETWEEN_INCLUSIVE, V(8, 17, 12, 5730), V(8, 17, 12, 6901),
|
|
|
|
"FEATURE_FAILURE_BUG_1137716", "Nvidia driver > 8.17.12.6901");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2017-02-08 00:38:00 +03:00
|
|
|
/* Bug 1336710: Crash in rx::Blit9::initialize. */
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::WindowsXP, DeviceFamily::IntelGMAX4500HD,
|
2017-02-08 00:38:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_WEBGL_ANGLE, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_BUG_1336710");
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2017-02-08 00:38:00 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::WindowsXP, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2017-02-08 00:38:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_WEBGL_ANGLE, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_FAILURE_BUG_1336710");
|
|
|
|
|
2016-09-27 23:10:02 +03:00
|
|
|
/* Bug 1304360: Graphical artifacts with D3D9 on Windows 7. */
|
2020-02-14 01:39:10 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(OperatingSystem::Windows7,
|
|
|
|
DeviceFamily::IntelGMAX3000,
|
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_9_LAYERS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN_OR_EQUAL, 1749,
|
|
|
|
"FEATURE_FAILURE_INTEL_W7_D3D9_LAYERS");
|
2016-09-27 23:10:02 +03:00
|
|
|
|
2017-09-28 20:51:59 +03:00
|
|
|
#if defined(_M_X64)
|
|
|
|
if (DetectBrokenAVX()) {
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::IntelAll,
|
|
|
|
nsIGfxInfo::FEATURE_DIRECT3D_11_LAYERS,
|
2017-09-28 20:51:59 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN,
|
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_BUG_1403353");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-06-21 06:32:01 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// WebGL
|
|
|
|
|
|
|
|
// Older than 5-15-2016
|
2016-06-22 04:02:07 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-27 18:39:12 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
2020-02-14 01:39:10 +03:00
|
|
|
nsIGfxInfo::FEATURE_WEBGL_OPENGL, nsIGfxInfo::FEATURE_DISCOURAGED,
|
|
|
|
DRIVER_LESS_THAN, V(16, 200, 1010, 1002), "WEBGL_NATIVE_GL_OLD_AMD");
|
2016-06-21 06:32:01 +03:00
|
|
|
|
|
|
|
// Older than 11-18-2015
|
2016-06-22 04:02:07 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBGL_OPENGL, nsIGfxInfo::FEATURE_DISCOURAGED,
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN, 4331, "WEBGL_NATIVE_GL_OLD_INTEL");
|
2016-06-21 06:32:01 +03:00
|
|
|
|
|
|
|
// Older than 2-23-2016
|
2016-06-22 04:02:07 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::NvidiaAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBGL_OPENGL, nsIGfxInfo::FEATURE_DISCOURAGED,
|
|
|
|
DRIVER_LESS_THAN, V(10, 18, 13, 6200), "WEBGL_NATIVE_GL_OLD_NVIDIA");
|
2016-06-21 06:32:01 +03:00
|
|
|
|
2016-07-29 05:42:05 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_DX_INTEROP2
|
|
|
|
|
|
|
|
// All AMD.
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-27 18:39:12 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::AtiAll,
|
2020-02-14 01:39:10 +03:00
|
|
|
nsIGfxInfo::FEATURE_DX_INTEROP2,
|
2016-07-29 05:42:05 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION, DRIVER_LESS_THAN,
|
|
|
|
GfxDriverInfo::allDriverVersions, "DX_INTEROP2_AMD_CRASH");
|
2017-07-25 21:02:36 +03:00
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_D3D11_KEYED_MUTEX
|
|
|
|
|
|
|
|
// bug 1359416
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2017-07-25 21:02:36 +03:00
|
|
|
nsIGfxInfo::FEATURE_D3D11_KEYED_MUTEX,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_LESS_THAN,
|
|
|
|
GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_BUG_1359416");
|
|
|
|
|
2018-04-13 15:06:52 +03:00
|
|
|
// Bug 1447141, for causing device creation crashes.
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::Bug1447141,
|
2018-04-13 15:06:52 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_EQUAL, V(15, 201, 2201, 0), "FEATURE_FAILURE_BUG_1447141_1");
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows7, DeviceFamily::Bug1447141,
|
2018-04-13 15:06:52 +03:00
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_EQUAL, V(15, 201, 1701, 0), "FEATURE_FAILURE_BUG_1447141_1");
|
|
|
|
|
2018-05-17 17:46:52 +03:00
|
|
|
// bug 1457758
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::NvidiaAll,
|
|
|
|
GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_EQUAL, V(24, 21, 13, 9731), "FEATURE_FAILURE_BUG_1457758");
|
2018-05-17 17:46:52 +03:00
|
|
|
|
2018-05-17 06:07:20 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_DX_NV12
|
|
|
|
|
|
|
|
// Bug 1437334
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelHDGraphicsToSandyBridge,
|
2018-05-17 06:07:20 +03:00
|
|
|
nsIGfxInfo::FEATURE_DX_NV12, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_BUILD_ID_LESS_THAN_OR_EQUAL, 4459,
|
|
|
|
"FEATURE_BLOCKED_DRIVER_VERSION");
|
2018-05-03 13:02:00 +03:00
|
|
|
|
2018-10-11 10:32:35 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_DX_P010
|
|
|
|
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-02-14 01:39:10 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::NvidiaAll,
|
|
|
|
nsIGfxInfo::FEATURE_DX_P010, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_UNQUALIFIED_P010_NVIDIA");
|
2018-10-11 10:32:35 +03:00
|
|
|
|
2018-05-03 13:02:00 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_WEBRENDER
|
2021-01-27 19:08:22 +03:00
|
|
|
#ifndef EARLY_BETA_OR_EARLIER
|
2020-02-18 16:56:10 +03:00
|
|
|
// Block some specific Nvidia cards for being too low-powered.
|
2018-10-24 21:58:00 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-12-02 04:16:46 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::NvidiaBlockWebRender,
|
2018-10-24 21:58:00 +03:00
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
|
|
|
DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions,
|
|
|
|
"FEATURE_UNQUALIFIED_WEBRENDER_NVIDIA_BLOCKED");
|
2021-01-27 19:08:22 +03:00
|
|
|
#endif
|
2018-05-03 13:02:00 +03:00
|
|
|
|
2020-11-27 06:31:09 +03:00
|
|
|
// Block 8.56.1.15/16
|
2020-12-07 13:17:57 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
|
|
|
|
DRIVER_LESS_THAN_OR_EQUAL, V(8, 56, 1, 16),
|
|
|
|
"CRASHY_DRIVERS_BUG_1678808");
|
2020-11-27 06:31:09 +03:00
|
|
|
|
2020-02-18 16:56:10 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_WEBRENDER - ALLOWLIST
|
2020-11-11 03:45:40 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2_EXT(
|
|
|
|
OperatingSystem::Windows, ScreenSizeStatus::All, BatteryStatus::All,
|
|
|
|
DesktopEnvironment::All, WindowProtocol::All, DriverVendor::All,
|
2021-04-06 01:34:13 +03:00
|
|
|
DeviceFamily::AtiAll, nsIGfxInfo::FEATURE_WEBRENDER,
|
2020-11-11 03:45:40 +03:00
|
|
|
nsIGfxInfo::FEATURE_ALLOW_ALWAYS, DRIVER_COMPARISON_IGNORED,
|
2021-04-06 01:34:13 +03:00
|
|
|
V(0, 0, 0, 0), "FEATURE_ROLLOUT_AMD");
|
2020-02-18 16:56:10 +03:00
|
|
|
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2_EXT(
|
2020-10-21 22:17:42 +03:00
|
|
|
OperatingSystem::Windows, ScreenSizeStatus::All, BatteryStatus::All,
|
2020-02-18 16:56:10 +03:00
|
|
|
DesktopEnvironment::All, WindowProtocol::All, DriverVendor::All,
|
|
|
|
DeviceFamily::NvidiaRolloutWebRender, nsIGfxInfo::FEATURE_WEBRENDER,
|
|
|
|
nsIGfxInfo::FEATURE_ALLOW_ALWAYS, DRIVER_COMPARISON_IGNORED,
|
2020-10-21 22:17:42 +03:00
|
|
|
V(0, 0, 0, 0), "FEATURE_ROLLOUT_NV");
|
2020-02-18 16:56:10 +03:00
|
|
|
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2_EXT(
|
2020-06-09 00:05:03 +03:00
|
|
|
OperatingSystem::Windows, ScreenSizeStatus::All, BatteryStatus::All,
|
|
|
|
DesktopEnvironment::All, WindowProtocol::All, DriverVendor::All,
|
|
|
|
DeviceFamily::IntelRolloutWebRender, nsIGfxInfo::FEATURE_WEBRENDER,
|
|
|
|
nsIGfxInfo::FEATURE_ALLOW_ALWAYS, DRIVER_COMPARISON_IGNORED,
|
2020-09-29 20:51:52 +03:00
|
|
|
V(0, 0, 0, 0), "FEATURE_ROLLOUT_INTEL");
|
2020-02-18 16:56:10 +03:00
|
|
|
|
2021-03-31 22:51:32 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2_EXT(
|
|
|
|
OperatingSystem::Windows, ScreenSizeStatus::All, BatteryStatus::All,
|
|
|
|
DesktopEnvironment::All, WindowProtocol::All, DriverVendor::All,
|
|
|
|
DeviceFamily::QualcommAll, nsIGfxInfo::FEATURE_WEBRENDER,
|
|
|
|
nsIGfxInfo::FEATURE_ALLOW_ALWAYS, DRIVER_COMPARISON_IGNORED,
|
|
|
|
V(0, 0, 0, 0), "FEATURE_ROLLOUT_QUALCOMM");
|
|
|
|
|
2019-12-10 22:16:13 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_WEBRENDER_COMPOSITOR
|
|
|
|
|
2020-03-13 18:43:46 +03:00
|
|
|
#ifndef EARLY_BETA_OR_EARLIER
|
2021-03-03 21:59:03 +03:00
|
|
|
// See also bug 1616874
|
2019-12-10 22:16:13 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
2020-03-13 18:43:46 +03:00
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelAll,
|
2019-12-13 03:46:18 +03:00
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER_COMPOSITOR,
|
2020-06-09 00:05:03 +03:00
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_EQUAL, V(24, 20, 100, 6293),
|
|
|
|
"FEATURE_FAILURE_BUG_1602511");
|
2020-03-13 18:43:46 +03:00
|
|
|
|
2020-04-02 22:57:04 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(OperatingSystem::Windows, DeviceFamily::AtiAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER_COMPOSITOR,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
|
2020-04-22 22:02:27 +03:00
|
|
|
DRIVER_LESS_THAN_OR_EQUAL, V(8, 17, 10, 1129),
|
2020-04-02 22:57:04 +03:00
|
|
|
"FEATURE_FAILURE_CHROME_BUG_800950");
|
2020-03-13 18:43:46 +03:00
|
|
|
#endif
|
2020-06-09 00:05:03 +03:00
|
|
|
|
|
|
|
// WebRender is unable to use scissored clears in some cases
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
|
|
|
OperatingSystem::Windows, DeviceFamily::IntelAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER_SCISSORED_CACHE_CLEARS,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_COMPARISON_IGNORED,
|
|
|
|
V(0, 0, 0, 0), "FEATURE_FAILURE_BUG_1603515");
|
2020-12-11 16:34:45 +03:00
|
|
|
|
2021-02-10 21:11:58 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_WEBRENDER_SOFTWARE
|
|
|
|
|
|
|
|
// TODO(aosmond): Bug 1678044 - wdspec tests ignore enable/disable-webrender
|
|
|
|
// Once the test infrastructure is fixed, we can remove this blocklist rule
|
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(
|
|
|
|
OperatingSystem::Windows, DeviceFamily::AmazonAll,
|
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER_SOFTWARE,
|
|
|
|
nsIGfxInfo::FEATURE_BLOCKED_DEVICE, DRIVER_COMPARISON_IGNORED,
|
|
|
|
V(0, 0, 0, 0), "FEATURE_FAILURE_BUG_1678044");
|
|
|
|
|
2020-12-11 16:34:45 +03:00
|
|
|
////////////////////////////////////
|
|
|
|
// FEATURE_WEBRENDER_SOFTWARE - ALLOWLIST
|
2021-01-27 23:54:57 +03:00
|
|
|
APPEND_TO_DRIVER_BLOCKLIST2(OperatingSystem::Windows, DeviceFamily::All,
|
|
|
|
nsIGfxInfo::FEATURE_WEBRENDER_SOFTWARE,
|
|
|
|
nsIGfxInfo::FEATURE_ALLOW_ALWAYS,
|
|
|
|
DRIVER_COMPARISON_IGNORED, V(0, 0, 0, 0),
|
2021-05-14 16:01:21 +03:00
|
|
|
"FEATURE_ROLLOUT_SOFTWARE_WR");
|
2011-12-15 09:02:59 +04:00
|
|
|
}
|
2018-05-14 18:16:50 +03:00
|
|
|
return *sDriverInfo;
|
2011-11-03 18:50:40 +04:00
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
nsresult GfxInfo::GetFeatureStatusImpl(
|
2016-04-14 00:12:47 +03:00
|
|
|
int32_t aFeature, int32_t* aStatus, nsAString& aSuggestedDriverVersion,
|
2011-12-15 09:02:59 +04:00
|
|
|
const nsTArray<GfxDriverInfo>& aDriverInfo, nsACString& aFailureId,
|
2012-07-30 18:20:58 +04:00
|
|
|
OperatingSystem* aOS /* = nullptr */) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03: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
|
|
|
|
2018-05-14 18:48:01 +03:00
|
|
|
if (sShutdownOccurred) {
|
2018-05-09 00:37:25 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
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))) {
|
2016-04-14 00:12:47 +03:00
|
|
|
aFailureId = "FEATURE_FAILURE_GET_ADAPTER";
|
2016-05-12 00:08:49 +03:00
|
|
|
*aStatus = FEATURE_BLOCKED_DEVICE;
|
|
|
|
return NS_OK;
|
2011-12-15 09:03:08 +04:00
|
|
|
}
|
2011-12-15 09:02:59 +04:00
|
|
|
|
2018-10-23 07:43:28 +03:00
|
|
|
if (OnlyAllowFeatureOnWhitelistedVendor(aFeature) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::Intel),
|
2020-05-27 21:11:12 +03:00
|
|
|
nsCaseInsensitiveStringComparator) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::NVIDIA),
|
2020-05-27 21:11:12 +03:00
|
|
|
nsCaseInsensitiveStringComparator) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::ATI),
|
2020-05-27 21:11:12 +03:00
|
|
|
nsCaseInsensitiveStringComparator) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::Microsoft),
|
2020-05-27 21:11:12 +03:00
|
|
|
nsCaseInsensitiveStringComparator) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::Parallels),
|
2020-05-27 21:11:12 +03:00
|
|
|
nsCaseInsensitiveStringComparator) &&
|
2020-02-14 01:39:10 +03:00
|
|
|
!adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::Qualcomm),
|
2020-05-27 21:11:12 +03:00
|
|
|
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")) {
|
2020-07-11 01:09:56 +03:00
|
|
|
if (adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::MicrosoftHyperV),
|
|
|
|
nsCaseInsensitiveStringComparator) ||
|
|
|
|
adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::VMWare),
|
|
|
|
nsCaseInsensitiveStringComparator) ||
|
|
|
|
adapterVendorID.Equals(
|
|
|
|
GfxDriverInfo::GetDeviceVendor(DeviceVendor::VirtualBox),
|
|
|
|
nsCaseInsensitiveStringComparator)) {
|
|
|
|
aFailureId = "FEATURE_FAILURE_VM_VENDOR";
|
|
|
|
} else if (adapterVendorID.Equals(GfxDriverInfo::GetDeviceVendor(
|
|
|
|
DeviceVendor::MicrosoftBasic),
|
|
|
|
nsCaseInsensitiveStringComparator)) {
|
|
|
|
aFailureId = "FEATURE_FAILURE_MICROSOFT_BASIC_VENDOR";
|
|
|
|
} else if (adapterVendorID.IsEmpty()) {
|
|
|
|
aFailureId = "FEATURE_FAILURE_EMPTY_DEVICE_VENDOR";
|
|
|
|
} else {
|
|
|
|
aFailureId = "FEATURE_FAILURE_UNKNOWN_DEVICE_VENDOR";
|
|
|
|
}
|
2016-05-12 00:08:49 +03:00
|
|
|
*aStatus = FEATURE_BLOCKED_DEVICE;
|
2011-12-15 09:03:08 +04:00
|
|
|
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)) {
|
2016-04-14 00:12:47 +03:00
|
|
|
aFailureId = "FEATURE_FAILURE_PARSE_DRIVER";
|
2016-05-12 00:08:49 +03:00
|
|
|
*aStatus = FEATURE_BLOCKED_DRIVER_VERSION;
|
|
|
|
return NS_OK;
|
2011-12-15 09:03:08 +04:00
|
|
|
}
|
2011-03-02 04:01:17 +03:00
|
|
|
|
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
|
|
|
|
2016-04-14 00:12:47 +03:00
|
|
|
return GfxInfoBase::GetFeatureStatusImpl(
|
|
|
|
aFeature, aStatus, aSuggestedDriverVersion, aDriverInfo, aFailureId, &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) {
|
2021-04-30 22:54:39 +03:00
|
|
|
AssertNotWin32kLockdown();
|
2021-04-27 22:45:14 +03:00
|
|
|
|
2015-07-13 11:12:41 +03:00
|
|
|
int deviceCount = 0;
|
2019-10-04 02:43:35 +03:00
|
|
|
for (auto displayInfo : mDisplayInfo) {
|
2015-07-13 11:12:41 +03:00
|
|
|
JS::Rooted<JSObject*> obj(aCx, JS_NewPlainObject(aCx));
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
JS::Rooted<JS::Value> screenWidth(aCx,
|
|
|
|
JS::Int32Value(displayInfo.mScreenWidth));
|
2015-07-13 11:12:41 +03:00
|
|
|
JS_SetProperty(aCx, obj, "screenWidth", screenWidth);
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
JS::Rooted<JS::Value> screenHeight(
|
|
|
|
aCx, JS::Int32Value(displayInfo.mScreenHeight));
|
2015-07-13 11:12:41 +03:00
|
|
|
JS_SetProperty(aCx, obj, "screenHeight", screenHeight);
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
JS::Rooted<JS::Value> refreshRate(aCx,
|
|
|
|
JS::Int32Value(displayInfo.mRefreshRate));
|
2015-07-13 11:12:41 +03:00
|
|
|
JS_SetProperty(aCx, obj, "refreshRate", refreshRate);
|
|
|
|
|
2019-10-04 02:43:35 +03:00
|
|
|
JS::Rooted<JS::Value> pseudoDisplay(
|
|
|
|
aCx, JS::BooleanValue(displayInfo.mIsPseudoDisplay));
|
2015-07-13 11:12:41 +03:00
|
|
|
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) {
|
2016-05-09 20:44:21 +03:00
|
|
|
// Add the platform neutral features
|
|
|
|
GfxInfoBase::DescribeFeatures(aCx, aObj);
|
|
|
|
|
2015-07-20 00:50:35 +03:00
|
|
|
JS::Rooted<JSObject*> obj(aCx);
|
|
|
|
|
2020-04-16 01:11:19 +03:00
|
|
|
gfx::FeatureState& d3d11 = gfxConfig::GetFeature(Feature::D3D11_COMPOSITING);
|
2018-07-19 21:11:34 +03:00
|
|
|
if (!InitFeatureObject(aCx, aObj, "d3d11", d3d11, &obj)) {
|
2015-07-20 00:50:35 +03:00
|
|
|
return;
|
|
|
|
}
|
2020-04-16 01:11:19 +03:00
|
|
|
if (d3d11.GetValue() == gfx::FeatureStatus::Available) {
|
2016-08-24 01:18:55 +03:00
|
|
|
DeviceManagerDx* dm = DeviceManagerDx::Get();
|
2016-08-21 06:59:11 +03:00
|
|
|
JS::Rooted<JS::Value> val(aCx,
|
|
|
|
JS::Int32Value(dm->GetCompositorFeatureLevel()));
|
2015-07-20 00:50:35 +03:00
|
|
|
JS_SetProperty(aCx, obj, "version", val);
|
|
|
|
|
2016-07-26 22:50:30 +03:00
|
|
|
val = JS::BooleanValue(dm->IsWARP());
|
2015-07-20 00:50:35 +03:00
|
|
|
JS_SetProperty(aCx, obj, "warp", val);
|
|
|
|
|
2016-07-26 22:50:30 +03:00
|
|
|
val = JS::BooleanValue(dm->TextureSharingWorks());
|
2015-07-20 00:50:35 +03:00
|
|
|
JS_SetProperty(aCx, obj, "textureSharing", val);
|
2015-07-28 10:54:33 +03:00
|
|
|
|
2020-06-23 18:20:33 +03:00
|
|
|
bool blocklisted = false;
|
2021-02-18 16:26:29 +03:00
|
|
|
if (nsCOMPtr<nsIGfxInfo> gfxInfo = components::GfxInfo::Service()) {
|
2016-04-29 07:52:55 +03:00
|
|
|
int32_t status;
|
|
|
|
nsCString discardFailureId;
|
|
|
|
if (SUCCEEDED(
|
|
|
|
gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_DIRECT3D_11_LAYERS,
|
|
|
|
discardFailureId, &status))) {
|
2020-06-23 18:20:33 +03:00
|
|
|
blocklisted = (status != nsIGfxInfo::FEATURE_STATUS_OK);
|
2016-04-29 07:52:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-23 18:20:33 +03:00
|
|
|
val = JS::BooleanValue(blocklisted);
|
2020-06-23 18:14:24 +03:00
|
|
|
JS_SetProperty(aCx, obj, "blocklisted", val);
|
2015-07-20 00:50:35 +03:00
|
|
|
}
|
|
|
|
|
2020-04-16 01:11:19 +03:00
|
|
|
gfx::FeatureState& d2d = gfxConfig::GetFeature(Feature::DIRECT2D);
|
2018-07-19 21:11:34 +03:00
|
|
|
if (!InitFeatureObject(aCx, aObj, "d2d", d2d, &obj)) {
|
2015-07-20 00:50:35 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
{
|
2016-02-13 16:33:27 +03:00
|
|
|
const char* version = "1.1";
|
2015-07-20 00:50:35 +03:00
|
|
|
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) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mAdapterVendorID[mActiveGPUIndex] = 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) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mAdapterDeviceID[mActiveGPUIndex] = aDeviceID;
|
2011-01-20 04:39:33 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP GfxInfo::SpoofDriverVersion(const nsAString& aDriverVersion) {
|
2016-12-16 19:56:59 +03:00
|
|
|
mDriverVersion[mActiveGPUIndex] = aDriverVersion;
|
2011-01-20 04:39:33 +03:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2019-02-08 22:36:08 +03:00
|
|
|
NS_IMETHODIMP GfxInfo::FireTestProcess() { return NS_OK; }
|
|
|
|
|
2011-01-20 04:39:33 +03:00
|
|
|
#endif
|