☠☠ backed out by 36dbc4e296bf ☠ ☠ | |
author | Matt Woodrow <mwoodrow@mozilla.com> |
Wed, 28 Sep 2016 13:28:47 +1300 | |
changeset 315924 | e1300d4c0a52c8b9697cb50b96f62b89e0507544 |
parent 315923 | 916c47f534c20427eecbb988453fe2e32004d4c4 |
child 315925 | d98c1bfa1caf05ce2edc741b34b38e818434353c |
push id | 30757 |
push user | cbook@mozilla.com |
push date | Fri, 30 Sep 2016 10:02:43 +0000 |
treeherder | mozilla-central@5ffed033557e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | dvander |
bugs | 1292923 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/IMFYCbCrImage.cpp +++ b/gfx/layers/IMFYCbCrImage.cpp @@ -232,16 +232,20 @@ IMFYCbCrImage::GetTextureClient(KnowsCom if (!device || backend != LayersBackend::LAYERS_D3D11) { if (backend == LayersBackend::LAYERS_D3D9 || backend == LayersBackend::LAYERS_D3D11) { return GetD3D9TextureClient(aForwarder); } return nullptr; } + if (!gfx::DeviceManagerDx::Get()->CanInitializeKeyedMutexTextures()) { + return nullptr; + } + if (mData.mYStride < 0 || mData.mCbCrStride < 0) { // D3D11 only supports unsigned stride values. return nullptr; } CD3D11_TEXTURE2D_DESC newDesc(DXGI_FORMAT_R8_UNORM, mData.mYSize.width, mData.mYSize.height, 1, 1);
--- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -378,16 +378,21 @@ D3D11TextureData::Create(IntSize aSize, newDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; if (!NS_IsMainThread() || !!(aFlags & ALLOC_FOR_OUT_OF_BAND_CONTENT)) { // On the main thread we use the syncobject to handle synchronization. if (!(aFlags & ALLOC_MANUAL_SYNCHRONIZATION)) { newDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; } } + if (aSurface && newDesc.MiscFlags == D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX && + DeviceManagerDx::Get()->CanInitializeKeyedMutexTextures()) { + return nullptr; + } + D3D11_SUBRESOURCE_DATA uploadData; D3D11_SUBRESOURCE_DATA* uploadDataPtr = nullptr; RefPtr<DataSourceSurface> srcSurf; if (aSurface) { srcSurf = aSurface->GetDataSurface(); if (!srcSurf) { gfxCriticalError() << "Failed to GetDataSurface in D3D11TextureData::Create";
--- a/gfx/thebes/DeviceManagerDx.cpp +++ b/gfx/thebes/DeviceManagerDx.cpp @@ -666,16 +666,28 @@ DeviceManagerDx::TextureSharingWorks() MutexAutoLock lock(mDeviceLock); if (!mDeviceStatus) { return false; } return mDeviceStatus->textureSharingWorks(); } bool +DeviceManagerDx::CanInitializeKeyedMutexTextures() +{ + MutexAutoLock lock(mDeviceLock); + if (!mDeviceStatus) { + return false; + } + // Disable this on all Intel devices because of crashes. + // See bug 1292923. + return mDeviceStatus->adapter().VendorId != 0x8086; +} + +bool DeviceManagerDx::IsWARP() { MutexAutoLock lock(mDeviceLock); if (!mDeviceStatus) { return false; } return mDeviceStatus->isWARP(); }
--- a/gfx/thebes/DeviceManagerDx.h +++ b/gfx/thebes/DeviceManagerDx.h @@ -55,16 +55,23 @@ public: RefPtr<ID3D11Device> GetContentDevice(); RefPtr<ID3D11Device> CreateDecoderDevice(); IDirectDraw7* GetDirectDraw(); unsigned GetCompositorFeatureLevel() const; bool TextureSharingWorks(); bool IsWARP(); + // Returns true if we can create a texture with + // D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX and also + // upload texture data during the CreateTexture2D + // call. This crashes on some devices, so we might + // need to avoid it. + bool CanInitializeKeyedMutexTextures(); + bool CreateCompositorDevices(); void CreateContentDevices(); void ImportDeviceInfo(const D3D11DeviceStatus& aDeviceStatus); void ExportDeviceInfo(D3D11DeviceStatus* aOut); void ResetDevices(); void InitializeDirectDraw();