Bug 711656: special case the entire Intel GMAX4500HD series r=bjacob,joe

Until we fix this properly, this patch special cases this set of devices so that
they get handled in almost the same way as they used to be.
This commit is contained in:
Doug Sherk 2012-02-28 00:19:24 -05:00
Родитель 1caa5d5eb4
Коммит cd3c925787
1 изменённых файлов: 70 добавлений и 0 удалений

Просмотреть файл

@ -66,6 +66,15 @@ NS_IMPL_ISUPPORTS_INHERITED1(GfxInfo, GfxInfoBase, nsIGfxInfoDebug)
static const PRUint32 allWindowsVersions = 0xffffffff;
/** Bug 711656
* HACK HACK HACK, one specific configuration seems broken, even with the
* blocklist: Intel 4500/HD
* Rather than backing this out, add a special case for this set.
* This should get backed out eventually.
*/
static PRUint32 gDeviceID;
static PRUint32 gVendorID;
#define V(a,b,c,d) GFX_DRIVER_VERSION(a,b,c,d)
@ -383,6 +392,10 @@ GfxInfo::Init()
SetupDiDestroyDeviceInfoList(devinfo);
}
/** Bug 711656: HACK HACK HACK */
gVendorID = ParseIDFromDeviceID(mDeviceID, "VEN_", 4);
gDeviceID = ParseIDFromDeviceID(mDeviceID, "&DEV_", 4);
mAdapterVendorID.AppendPrintf("0x%04x", ParseIDFromDeviceID(mDeviceID, "VEN_", 4));
mAdapterDeviceID.AppendPrintf("0x%04x", ParseIDFromDeviceID(mDeviceID, "&DEV_", 4));
mAdapterSubsysID = ParseIDFromDeviceID(mDeviceID, "&SUBSYS_", 8);
@ -901,6 +914,63 @@ GfxInfo::GetFeatureStatusImpl(PRInt32 aFeature,
if (aOS)
*aOS = os;
/** Bug 711656: HACK HACK HACK
* Special case this, even though it's already in the blocklist.
* Note that we're getting the driver version twice because the first one
* happens within the 'if (!aDriverInfo->Length())' check, but we don't want to
* modify that. Scope this within an anonymous block so that it's easier to
* remove later and clearer what is part of the hack.
*/
{
nsAutoString adapterDriverVersionString;
GetAdapterDriverVersion(adapterDriverVersionString);
PRUint64 driverVersion;
if (!ParseDriverVersion(adapterDriverVersionString, &driverVersion)) {
return NS_ERROR_FAILURE;
}
static PRUint32 IntelGMAX4500HD[] = {
0x2a42, /* IntelGMA4500MHD_1 */
0x2a43, /* IntelGMA4500MHD_2 */
0x2e42, /* IntelB43_1 */
0x2e43, /* IntelB43_2 */
0x2e92, /* IntelB43_3 */
0x2e93, /* IntelB43_4 */
0x2e32, /* IntelG41_1 */
0x2e33, /* IntelG41_2 */
0x2e22, /* IntelG45_1 */
0x2e23, /* IntelG45_2 */
0x2e12, /* IntelQ45_1 */
0x2e13, /* IntelQ45_2 */
0x0042, /* IntelHDGraphics */
0x0046, /* IntelMobileHDGraphics */
0x0102, /* IntelSandyBridge_1 */
0x0106, /* IntelSandyBridge_2 */
0x0112, /* IntelSandyBridge_3 */
0x0116, /* IntelSandyBridge_4 */
0x0122, /* IntelSandyBridge_5 */
0x0126, /* IntelSandyBridge_6 */
0x010a, /* IntelSandyBridge_7 */
0x0080 /* IntelIvyBridge */
};
if (((mWindowsVersion == gfxWindowsPlatform::kWindowsXP &&
driverVersion < V(6,14,10,5284)) ||
(mWindowsVersion == gfxWindowsPlatform::kWindowsVista &&
driverVersion < V(8,15,10,2202)) ||
(mWindowsVersion == gfxWindowsPlatform::kWindows7 &&
driverVersion < V(8,15,10,2202))) &&
gVendorID == 0x8086 /* Intel */) {
for (PRUint32 i = 0; i < ArrayLength(IntelGMAX4500HD); i++) {
if (IntelGMAX4500HD[i] == gDeviceID) {
*aStatus = nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION;
return NS_OK;
}
}
}
}
// Don't evaluate special cases if we're checking the downloaded blocklist.
if (!aDriverInfo.Length()) {
nsAutoString adapterVendorID;