зеркало из https://github.com/mozilla/gecko-dev.git
184 строки
6.1 KiB
C++
184 строки
6.1 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Mozilla Foundation.
|
|
* Portions created by the Initial Developer are Copyright (C) 2011
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
#include "prtypes.h"
|
|
#include "nsString.h"
|
|
|
|
#ifndef __mozilla_widget_GfxDriverInfo_h__
|
|
#define __mozilla_widget_GfxDriverInfo_h__
|
|
|
|
#define V(a,b,c,d) GFX_DRIVER_VERSION(a,b,c,d)
|
|
|
|
// Macros for adding a blocklist item to the static list.
|
|
#define APPEND_TO_DRIVER_BLOCKLIST(os, vendor, devices, feature, featureStatus, driverComparator, driverVersion, suggestedVersion) \
|
|
mDriverInfo->AppendElement(GfxDriverInfo(os, vendor, devices, feature, featureStatus, driverComparator, driverVersion, suggestedVersion))
|
|
#define APPEND_TO_DRIVER_BLOCKLIST2(os, vendor, devices, feature, featureStatus, driverComparator, driverVersion) \
|
|
mDriverInfo->AppendElement(GfxDriverInfo(os, vendor, devices, feature, featureStatus, driverComparator, driverVersion))
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
enum OperatingSystem {
|
|
DRIVER_OS_UNKNOWN = 0,
|
|
DRIVER_OS_WINDOWS_XP,
|
|
DRIVER_OS_WINDOWS_SERVER_2003,
|
|
DRIVER_OS_WINDOWS_VISTA,
|
|
DRIVER_OS_WINDOWS_7,
|
|
DRIVER_OS_LINUX,
|
|
DRIVER_OS_OS_X_10_5,
|
|
DRIVER_OS_OS_X_10_6,
|
|
DRIVER_OS_OS_X_10_7,
|
|
DRIVER_OS_ANDROID,
|
|
DRIVER_OS_ALL
|
|
};
|
|
|
|
enum VersionComparisonOp {
|
|
DRIVER_LESS_THAN, // driver < version
|
|
DRIVER_LESS_THAN_OR_EQUAL, // driver <= version
|
|
DRIVER_GREATER_THAN, // driver > version
|
|
DRIVER_GREATER_THAN_OR_EQUAL, // driver >= version
|
|
DRIVER_EQUAL, // driver == version
|
|
DRIVER_NOT_EQUAL, // driver != version
|
|
DRIVER_BETWEEN_EXCLUSIVE, // driver > version && driver < versionMax
|
|
DRIVER_BETWEEN_INCLUSIVE, // driver >= version && driver <= versionMax
|
|
DRIVER_BETWEEN_INCLUSIVE_START, // driver >= version && driver < versionMax
|
|
DRIVER_UNKNOWN_COMPARISON
|
|
};
|
|
|
|
enum DeviceFamily {
|
|
IntelGMA500,
|
|
IntelGMA900,
|
|
IntelGMA950,
|
|
IntelGMA3150,
|
|
IntelGMAX3000,
|
|
IntelGMAX4500HD,
|
|
NvidiaBlockD3D9Layers,
|
|
RadeonX1000,
|
|
Geforce7300GT,
|
|
DeviceFamilyMax
|
|
};
|
|
|
|
enum DeviceVendor {
|
|
VendorAll,
|
|
VendorIntel,
|
|
VendorNVIDIA,
|
|
VendorAMD,
|
|
VendorATI,
|
|
DeviceVendorMax
|
|
};
|
|
|
|
/* Array of devices to match, or an empty array for all devices */
|
|
typedef nsTArray<nsString> GfxDeviceFamily;
|
|
|
|
struct GfxDriverInfo
|
|
{
|
|
// If |ownDevices| is true, you are transferring ownership of the devices
|
|
// array, and it will be deleted when this GfxDriverInfo is destroyed.
|
|
GfxDriverInfo(OperatingSystem os, nsAString& vendor, GfxDeviceFamily* devices,
|
|
PRInt32 feature, PRInt32 featureStatus, VersionComparisonOp op,
|
|
PRUint64 driverVersion, const char *suggestedVersion = nsnull,
|
|
bool ownDevices = false);
|
|
|
|
GfxDriverInfo();
|
|
GfxDriverInfo(const GfxDriverInfo&);
|
|
~GfxDriverInfo();
|
|
|
|
OperatingSystem mOperatingSystem;
|
|
|
|
nsString mAdapterVendor;
|
|
|
|
static GfxDeviceFamily* const allDevices;
|
|
GfxDeviceFamily* mDevices;
|
|
|
|
// Whether the mDevices array should be deleted when this structure is
|
|
// deallocated. False by default.
|
|
bool mDeleteDevices;
|
|
|
|
/* A feature from nsIGfxInfo, or all features */
|
|
PRInt32 mFeature;
|
|
static PRInt32 allFeatures;
|
|
|
|
/* A feature status from nsIGfxInfo */
|
|
PRInt32 mFeatureStatus;
|
|
|
|
VersionComparisonOp mComparisonOp;
|
|
|
|
/* versions are assumed to be A.B.C.D packed as 0xAAAABBBBCCCCDDDD */
|
|
PRUint64 mDriverVersion;
|
|
PRUint64 mDriverVersionMax;
|
|
static PRUint64 allDriverVersions;
|
|
|
|
const char *mSuggestedVersion;
|
|
|
|
static const GfxDeviceFamily* GetDeviceFamily(DeviceFamily id);
|
|
static GfxDeviceFamily* mDeviceFamilies[DeviceFamilyMax];
|
|
|
|
static const nsAString& GetDeviceVendor(DeviceVendor id);
|
|
static nsAString* mDeviceVendors[DeviceVendorMax];
|
|
};
|
|
|
|
#define GFX_DRIVER_VERSION(a,b,c,d) \
|
|
((PRUint64(a)<<48) | (PRUint64(b)<<32) | (PRUint64(c)<<16) | PRUint64(d))
|
|
|
|
inline bool
|
|
ParseDriverVersion(nsAString& aVersion, PRUint64 *aNumericVersion)
|
|
{
|
|
#if defined(XP_WIN)
|
|
int a, b, c, d;
|
|
/* honestly, why do I even bother */
|
|
if (sscanf(NS_LossyConvertUTF16toASCII(aVersion).get(),
|
|
"%d.%d.%d.%d", &a, &b, &c, &d) != 4)
|
|
return false;
|
|
if (a < 0 || a > 0xffff) return false;
|
|
if (b < 0 || b > 0xffff) return false;
|
|
if (c < 0 || c > 0xffff) return false;
|
|
if (d < 0 || d > 0xffff) return false;
|
|
|
|
*aNumericVersion = GFX_DRIVER_VERSION(a, b, c, d);
|
|
#elif defined(ANDROID)
|
|
// Can't use aVersion.ToInteger() because that's not compiled into our code
|
|
// unless we have XPCOM_GLUE_AVOID_NSPR disabled.
|
|
*aNumericVersion = atoi(NS_LossyConvertUTF16toASCII(aVersion).get());
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#endif /*__mozilla_widget_GfxDriverInfo_h__ */
|