Commit cf367ef0 authored by Jean-Yves Avenard's avatar Jean-Yves Avenard
Browse files

Bug 1352016 - P2. Check if NV12 rendering is usable when allocating D3D11 surface. r=mattwoodrow

MozReview-Commit-ID: EgA6lEeIyBj

--HG--
extra : rebase_source : 7b8a8f1669d268a5e1512320b891b35722fe4c14
parent 0d3f9045
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ struct D3D11DeviceStatus
  uint32_t featureLevel;
  DxgiAdapterDesc adapter;
  int32_t sequenceNumber;
  bool useNV12;
};

struct DevicePrefs
+2 −1
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ bool
D3D11ShareHandleImage::AllocateTexture(D3D11RecycleAllocator* aAllocator, ID3D11Device* aDevice)
{
  if (aAllocator) {
    if (gfxPrefs::PDMWMFUseNV12Format()) {
    if (gfxPrefs::PDMWMFUseNV12Format() &&
        gfx::DeviceManagerDx::Get()->CanUseNV12()) {
      mTextureClient = aAllocator->CreateOrRecycleClient(gfx::SurfaceFormat::NV12, mSize);
    } else {
      mTextureClient = aAllocator->CreateOrRecycleClient(gfx::SurfaceFormat::B8G8R8A8, mSize);
+17 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "D3D11Checks.h"
#include "DXVA2Manager.h"
#include "gfxConfig.h"
#include "GfxDriverInfo.h"
#include "gfxPrefs.h"
@@ -409,5 +410,21 @@ D3D11Checks::DoesRemotePresentWork(IDXGIAdapter* adapter)
  return SUCCEEDED(hr) && check;
}

/* static */ bool
D3D11Checks::DoesNV12Work(ID3D11Device* device)
{
  DXGI_ADAPTER_DESC desc;
  PodZero(&desc);
  if (!GetDxgiDesc(device, &desc)) {
    // Failed to retrieve device information, assume it works
    return true;
  }

  nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
  nsString version;
  gfxInfo->GetAdapterDriverVersion(version);
  return DXVA2Manager::IsNV12Supported(desc.VendorId, desc.DeviceId, version);
}

} // namespace gfx
} // namespace mozilla
+3 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ struct D3D11Checks
  static void WarnOnAdapterMismatch(ID3D11Device* device);
  static bool GetDxgiDesc(ID3D11Device* device, DXGI_ADAPTER_DESC* out);
  static bool DoesRemotePresentWork(IDXGIAdapter* adapter);
  static bool DoesNV12Work(ID3D11Device* device);
};

} // namespace gfx
+17 −2
Original line number Diff line number Diff line
@@ -395,6 +395,7 @@ DeviceManagerDx::CreateCompositorDevice(FeatureState& d3d11)
  }

  uint32_t featureLevel = device->GetFeatureLevel();
  bool useNV12 = D3D11Checks::DoesNV12Work(device);
  {
    MutexAutoLock lock(mDeviceLock);
    mCompositorDevice = device;
@@ -405,7 +406,8 @@ DeviceManagerDx::CreateCompositorDevice(FeatureState& d3d11)
      textureSharingWorks,
      featureLevel,
      DxgiAdapterDesc::From(desc),
      sequenceNumber));
      sequenceNumber,
      useNV12));
  }
  mCompositorDevice->SetExceptionMode(0);
}
@@ -501,6 +503,8 @@ DeviceManagerDx::CreateWARPCompositorDevice()
  PodZero(&nullAdapter);

  int featureLevel = device->GetFeatureLevel();

  bool useNV12 = D3D11Checks::DoesNV12Work(device);
  {
    MutexAutoLock lock(mDeviceLock);
    mCompositorDevice = device;
@@ -511,7 +515,8 @@ DeviceManagerDx::CreateWARPCompositorDevice()
      textureSharingWorks,
      featureLevel,
      nullAdapter,
      sequenceNumber));
      sequenceNumber,
      useNV12));
  }
  mCompositorDevice->SetExceptionMode(0);

@@ -1001,6 +1006,16 @@ DeviceManagerDx::IsWARP()
  return mDeviceStatus->isWARP();
}

bool
DeviceManagerDx::CanUseNV12()
{
  MutexAutoLock lock(mDeviceLock);
  if (!mDeviceStatus) {
    return true;
  }
  return mDeviceStatus->useNV12();
}

void
DeviceManagerDx::InitializeDirectDraw()
{
Loading