зеркало из https://github.com/mozilla/gecko-dev.git
Backout of 925db0605e39 due to bustage. r=me
This commit is contained in:
Родитель
91d3daee38
Коммит
efbc670344
|
@ -49,6 +49,7 @@ using namespace mozilla::gfx;
|
|||
#include "gfxD2DSurface.h"
|
||||
|
||||
#include <d3d10_1.h>
|
||||
#include <dxgi.h>
|
||||
|
||||
#include "mozilla/gfx/2D.h"
|
||||
|
||||
|
@ -88,12 +89,6 @@ using namespace mozilla;
|
|||
|
||||
#ifdef CAIRO_HAS_D2D_SURFACE
|
||||
|
||||
static const char *kFeatureLevelPref =
|
||||
"gfx.direct3d.last_used_feature_level_idx";
|
||||
static const int kSupportedFeatureLevels[] =
|
||||
{ D3D10_FEATURE_LEVEL_10_1, D3D10_FEATURE_LEVEL_10_0,
|
||||
D3D10_FEATURE_LEVEL_9_3 };
|
||||
|
||||
NS_MEMORY_REPORTER_IMPLEMENT(
|
||||
D2DCache,
|
||||
"gfx-d2d-surfacecache",
|
||||
|
@ -509,42 +504,6 @@ gfxWindowsPlatform::UpdateRenderMode()
|
|||
InitBackendPrefs(canvasMask, contentMask);
|
||||
}
|
||||
|
||||
#ifdef CAIRO_HAS_D2D_SURFACE
|
||||
HRESULT
|
||||
gfxWindowsPlatform::CreateDevice(nsRefPtr<IDXGIAdapter1> &adapter1,
|
||||
int featureLevelIndex)
|
||||
{
|
||||
nsModuleHandle d3d10module(LoadLibrarySystem32(L"d3d10_1.dll"));
|
||||
if (!d3d10module)
|
||||
return E_FAIL;
|
||||
D3D10CreateDevice1Func createD3DDevice =
|
||||
(D3D10CreateDevice1Func)GetProcAddress(d3d10module, "D3D10CreateDevice1");
|
||||
if (!createD3DDevice)
|
||||
return E_FAIL;
|
||||
|
||||
nsRefPtr<ID3D10Device1> device;
|
||||
HRESULT hr =
|
||||
createD3DDevice(adapter1, D3D10_DRIVER_TYPE_HARDWARE, NULL,
|
||||
D3D10_CREATE_DEVICE_BGRA_SUPPORT |
|
||||
D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS,
|
||||
static_cast<D3D10_FEATURE_LEVEL1>(kSupportedFeatureLevels[featureLevelIndex]),
|
||||
D3D10_1_SDK_VERSION, getter_AddRefs(device));
|
||||
|
||||
// If we fail here, the DirectX version or video card probably
|
||||
// changed. We previously could use 10.1 but now we can't
|
||||
// anymore. Revert back to doing a 10.0 check first before
|
||||
// the 10.1 check.
|
||||
if (device) {
|
||||
mD2DDevice = cairo_d2d_create_device_from_d3d10device(device);
|
||||
|
||||
// Setup a pref for future launch optimizaitons
|
||||
Preferences::SetInt(kFeatureLevelPref, featureLevelIndex);
|
||||
}
|
||||
|
||||
return device ? S_OK : hr;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
gfxWindowsPlatform::VerifyD2DDevice(bool aAttemptForce)
|
||||
{
|
||||
|
@ -560,69 +519,154 @@ gfxWindowsPlatform::VerifyD2DDevice(bool aAttemptForce)
|
|||
|
||||
mozilla::ScopedGfxFeatureReporter reporter("D2D", aAttemptForce);
|
||||
|
||||
HMODULE d3d10module = LoadLibraryA("d3d10_1.dll");
|
||||
D3D10CreateDevice1Func createD3DDevice = (D3D10CreateDevice1Func)
|
||||
GetProcAddress(d3d10module, "D3D10CreateDevice1");
|
||||
nsRefPtr<ID3D10Device1> device;
|
||||
|
||||
nsModuleHandle dxgiModule(LoadLibrarySystem32(L"dxgi.dll"));
|
||||
CreateDXGIFactory1Func createDXGIFactory1 = (CreateDXGIFactory1Func)
|
||||
GetProcAddress(dxgiModule, "CreateDXGIFactory1");
|
||||
if (createD3DDevice) {
|
||||
HMODULE dxgiModule = LoadLibraryA("dxgi.dll");
|
||||
CreateDXGIFactory1Func createDXGIFactory1 = (CreateDXGIFactory1Func)
|
||||
GetProcAddress(dxgiModule, "CreateDXGIFactory1");
|
||||
|
||||
int supportedFeatureLevelsCount = ArrayLength(kSupportedFeatureLevels);
|
||||
// If we're not running in Metro don't allow DX9.3
|
||||
if (!IsRunningInWindowsMetro()) {
|
||||
supportedFeatureLevelsCount--;
|
||||
}
|
||||
// Try to use a DXGI 1.1 adapter in order to share resources
|
||||
// across processes.
|
||||
nsRefPtr<IDXGIAdapter1> adapter1;
|
||||
if (createDXGIFactory1) {
|
||||
nsRefPtr<IDXGIFactory1> factory1;
|
||||
HRESULT hr = createDXGIFactory1(__uuidof(IDXGIFactory1),
|
||||
getter_AddRefs(factory1));
|
||||
|
||||
// It takes a lot of time (5-10% of startup time or ~100ms) to do both
|
||||
// a createD3DDevice on D3D10_FEATURE_LEVEL_10_0. We therefore store
|
||||
// the last used feature level to go direct to that.
|
||||
int featureLevelIndex = Preferences::GetInt(kFeatureLevelPref, 0);
|
||||
if (featureLevelIndex >= supportedFeatureLevelsCount || featureLevelIndex < 0) {
|
||||
featureLevelIndex = 0;
|
||||
}
|
||||
if (FAILED(hr) || !factory1) {
|
||||
// This seems to happen with some people running the iZ3D driver.
|
||||
// They won't get acceleration.
|
||||
return;
|
||||
}
|
||||
|
||||
// Try to use a DXGI 1.1 adapter in order to share resources
|
||||
// across processes.
|
||||
nsRefPtr<IDXGIAdapter1> adapter1;
|
||||
if (createDXGIFactory1) {
|
||||
nsRefPtr<IDXGIFactory1> factory1;
|
||||
HRESULT hr = createDXGIFactory1(__uuidof(IDXGIFactory1),
|
||||
getter_AddRefs(factory1));
|
||||
bool checkDX10 =
|
||||
Preferences::GetBool("gfx.direct3d.checkDX10", true);
|
||||
hr = factory1->EnumAdapters1(0, getter_AddRefs(adapter1));
|
||||
if (SUCCEEDED(hr) && adapter1) {
|
||||
// We have an adapter, check if we've ever found that
|
||||
// createD3DDevice fails for both DX10 and DX10.1.
|
||||
if (!checkDX10) {
|
||||
// Even if the CheckInterfaceSupport call fails, the
|
||||
// createD3DDevice call may still succeed.
|
||||
// We only check it here to reset the pref which is used to skip
|
||||
// the createD3DDevice calls. This is done in case hardware
|
||||
// changes.
|
||||
hr = adapter1->CheckInterfaceSupport(__uuidof(ID3D10Device),
|
||||
nullptr);
|
||||
if (SUCCEEDED(hr)) {
|
||||
checkDX10 = true;
|
||||
Preferences::SetBool("gfx.direct3d.checkDX10", true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// We should return and not accelerate if we can't obtain
|
||||
// an adapter.
|
||||
return;
|
||||
}
|
||||
|
||||
if (FAILED(hr) || !factory1) {
|
||||
// This seems to happen with some people running the iZ3D driver.
|
||||
// They won't get acceleration.
|
||||
return;
|
||||
// If we know that the DX10 calls have failed in the past, just
|
||||
// bail out early. This value will be reset if the adapter's
|
||||
// CheckInterfaceSupport call ever succeeds with ID3D10Device
|
||||
if (!checkDX10) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
hr = factory1->EnumAdapters1(0, getter_AddRefs(adapter1));
|
||||
if (FAILED(hr) || !adapter1) {
|
||||
// We should return and not accelerate if we can't obtain
|
||||
// an adapter.
|
||||
return;
|
||||
}
|
||||
}
|
||||
// It takes a lot of time (5-10% of startup time or ~100ms) to do both
|
||||
// a createD3DDevice on D3D10_FEATURE_LEVEL_10_0 and
|
||||
// D3D10_FEATURE_LEVEL_10_1. Therefore we set a pref if we ever get
|
||||
// 10.1 to work and we use that first if the pref is set.
|
||||
// Going direct to a 10.1 check only takes 20-30ms.
|
||||
// The initialization of hr doesn't matter here because it will get
|
||||
// overwritten whether or not the preference is set.
|
||||
// - If the preferD3D10_1 pref is set it gets overwritten immediately.
|
||||
// - If the preferD3D10_1 pref is not set, the if condition after
|
||||
// the one that follows us immediately will short circuit before
|
||||
// checking FAILED(hr) and will again get overwritten immediately.
|
||||
// We initialize it here just so it does not appear to be an
|
||||
// uninitialized value.
|
||||
HRESULT hr = E_FAIL;
|
||||
bool preferD3D10_1 =
|
||||
Preferences::GetBool("gfx.direct3d.prefer_10_1", false);
|
||||
if (preferD3D10_1) {
|
||||
hr = createD3DDevice(
|
||||
adapter1,
|
||||
D3D10_DRIVER_TYPE_HARDWARE,
|
||||
NULL,
|
||||
D3D10_CREATE_DEVICE_BGRA_SUPPORT |
|
||||
D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS,
|
||||
D3D10_FEATURE_LEVEL_10_1,
|
||||
D3D10_1_SDK_VERSION,
|
||||
getter_AddRefs(device));
|
||||
|
||||
// Start with the last used feature level, and move to lower DX versions
|
||||
// until we find one that works.
|
||||
HRESULT hr = E_FAIL;
|
||||
for (int i = featureLevelIndex; i < supportedFeatureLevelsCount; i++) {
|
||||
hr = CreateDevice(adapter1, i);
|
||||
// If it succeeded we found the first available feature level
|
||||
if (SUCCEEDED(hr)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If we succeeded in creating a device, try for a newer device
|
||||
// that we haven't tried yet.
|
||||
if (SUCCEEDED(hr)) {
|
||||
for (int i = featureLevelIndex - 1; i >= 0; i--) {
|
||||
hr = CreateDevice(adapter1, i);
|
||||
// If it failed then we don't have new hardware
|
||||
if (FAILED(hr)) {
|
||||
break;
|
||||
// If we fail here, the DirectX version or video card probably
|
||||
// changed. We previously could use 10.1 but now we can't
|
||||
// anymore. Revert back to doing a 10.0 check first before
|
||||
// the 10.1 check.
|
||||
if (FAILED(hr)) {
|
||||
Preferences::SetBool("gfx.direct3d.prefer_10_1", false);
|
||||
} else {
|
||||
mD2DDevice = cairo_d2d_create_device_from_d3d10device(device);
|
||||
}
|
||||
}
|
||||
|
||||
if (!preferD3D10_1 || FAILED(hr)) {
|
||||
// If preferD3D10_1 is set and 10.1 failed, fall back to 10.0.
|
||||
// if preferD3D10_1 is not yet set, then first try to create
|
||||
// a 10.0 D3D device, then try to see if 10.1 works.
|
||||
nsRefPtr<ID3D10Device1> device1;
|
||||
hr = createD3DDevice(
|
||||
adapter1,
|
||||
D3D10_DRIVER_TYPE_HARDWARE,
|
||||
NULL,
|
||||
D3D10_CREATE_DEVICE_BGRA_SUPPORT |
|
||||
D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS,
|
||||
D3D10_FEATURE_LEVEL_10_0,
|
||||
D3D10_1_SDK_VERSION,
|
||||
getter_AddRefs(device1));
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
device = device1;
|
||||
if (preferD3D10_1) {
|
||||
mD2DDevice =
|
||||
cairo_d2d_create_device_from_d3d10device(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If preferD3D10_1 is not yet set and 10.0 succeeded
|
||||
if (!preferD3D10_1 && SUCCEEDED(hr)) {
|
||||
// We have 10.0, let's try 10.1. This second check will only
|
||||
// ever be done once if it succeeds. After that an option
|
||||
// will be set to prefer using 10.1 before trying 10.0.
|
||||
// In the case that 10.1 fails, it won't be a long operation
|
||||
// like it is when 10.1 succeeds, so we don't need to optimize
|
||||
// the case where 10.1 is not supported, but 10.0 is supported.
|
||||
nsRefPtr<ID3D10Device1> device1;
|
||||
hr = createD3DDevice(
|
||||
adapter1,
|
||||
D3D10_DRIVER_TYPE_HARDWARE,
|
||||
NULL,
|
||||
D3D10_CREATE_DEVICE_BGRA_SUPPORT |
|
||||
D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS,
|
||||
D3D10_FEATURE_LEVEL_10_1,
|
||||
D3D10_1_SDK_VERSION,
|
||||
getter_AddRefs(device1));
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
device = device1;
|
||||
Preferences::SetBool("gfx.direct3d.prefer_10_1", true);
|
||||
}
|
||||
mD2DDevice = cairo_d2d_create_device_from_d3d10device(device);
|
||||
}
|
||||
|
||||
if (FAILED(hr) || !device) {
|
||||
Preferences::SetBool("gfx.direct3d.checkDX10", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!mD2DDevice && aAttemptForce) {
|
||||
|
|
|
@ -28,10 +28,6 @@
|
|||
#include <windows.h>
|
||||
#include <objbase.h>
|
||||
|
||||
#ifdef CAIRO_HAS_D2D_SURFACE
|
||||
#include <dxgi.h>
|
||||
#endif
|
||||
|
||||
class nsIMemoryMultiReporter;
|
||||
|
||||
// Utility to get a Windows HDC from a thebes context,
|
||||
|
@ -151,10 +147,6 @@ public:
|
|||
*/
|
||||
void VerifyD2DDevice(bool aAttemptForce);
|
||||
|
||||
#ifdef CAIRO_HAS_D2D_SURFACE
|
||||
HRESULT CreateDevice(nsRefPtr<IDXGIAdapter1> &adapter1, int featureLevelIndex);
|
||||
#endif
|
||||
|
||||
HDC GetScreenDC() { return mScreenDC; }
|
||||
|
||||
nsresult GetFontList(nsIAtom *aLangGroup,
|
||||
|
|
Загрузка…
Ссылка в новой задаче