Bug 1390452 - Check texture compatibility when ensuring the texture source; r?bas
MozReview-Commit-ID: LjFvMezb1TV
--- a/gfx/layers/d3d11/TextureD3D11.cpp
+++ b/gfx/layers/d3d11/TextureD3D11.cpp
@@ -743,25 +743,38 @@ DXGITextureHostD3D11::DXGITextureHostD3D
, mSize(aDescriptor.size())
, mHandle(aDescriptor.handle())
, mFormat(aDescriptor.format())
, mIsLocked(false)
{
}
bool
-DXGITextureHostD3D11::OpenSharedHandle()
+DXGITextureHostD3D11::EnsureTexture()
{
- if (!GetDevice()) {
+ RefPtr<ID3D11Device> device;
+ if (mTexture) {
+ mTexture->GetDevice(getter_AddRefs(device));
+ if (device == DeviceManagerDx::Get()->GetCompositorDevice()) {
+ NS_WARNING("Incompatible texture.");
+ return true;
+ }
+ mTexture = nullptr;
+ }
+
+ device = GetDevice();
+ if (!device || device != DeviceManagerDx::Get()->GetCompositorDevice()) {
+ NS_WARNING("No device or incompatible device.");
return false;
}
- HRESULT hr = GetDevice()->OpenSharedResource((HANDLE)mHandle,
- __uuidof(ID3D11Texture2D),
- (void**)(ID3D11Texture2D**)getter_AddRefs(mTexture));
+ HRESULT hr = device->OpenSharedResource(
+ (HANDLE)mHandle,
+ __uuidof(ID3D11Texture2D),
+ (void**)(ID3D11Texture2D**)getter_AddRefs(mTexture));
if (FAILED(hr)) {
NS_WARNING("Failed to open shared texture");
return false;
}
D3D11_TEXTURE2D_DESC desc;
mTexture->GetDesc(&desc);
mSize = IntSize(desc.Width, desc.Height);
@@ -926,17 +939,17 @@ DXGITextureHostD3D11::GetAsSurface()
bool
DXGITextureHostD3D11::EnsureTextureSource()
{
if (mTextureSource) {
return true;
}
- if (!mTexture && !OpenSharedHandle()) {
+ if (!EnsureTexture()) {
DeviceManagerDx::Get()->ForceDeviceReset(ForcedDeviceResetReason::OPENSHAREDHANDLE);
return false;
}
if (mProvider) {
if (!mProvider->IsValid()) {
return false;
}
@@ -1094,23 +1107,37 @@ DXGIYCbCrTextureHostD3D11::DXGIYCbCrText
, mIsLocked(false)
{
mHandles[0] = aDescriptor.handleY();
mHandles[1] = aDescriptor.handleCb();
mHandles[2] = aDescriptor.handleCr();
}
bool
-DXGIYCbCrTextureHostD3D11::OpenSharedHandle()
+DXGIYCbCrTextureHostD3D11::EnsureTexture()
{
- RefPtr<ID3D11Device> device = GetDevice();
- if (!device) {
+ RefPtr<ID3D11Device> device;
+ if (mTextures[0]) {
+ mTextures[0]->GetDevice(getter_AddRefs(device));
+ if (device == DeviceManagerDx::Get()->GetCompositorDevice()) {
+ NS_WARNING("Incompatible texture.");
+ return true;
+ }
+ mTextures[0] = nullptr;
+ mTextures[1] = nullptr;
+ mTextures[2] = nullptr;
+ }
+
+ if (!GetDevice() ||
+ GetDevice() != DeviceManagerDx::Get()->GetCompositorDevice()) {
+ NS_WARNING("No device or incompatible device.");
return false;
}
+ device = GetDevice();
RefPtr<ID3D11Texture2D> textures[3];
HRESULT hr = device->OpenSharedResource((HANDLE)mHandles[0],
__uuidof(ID3D11Texture2D),
(void**)(ID3D11Texture2D**)getter_AddRefs(textures[0]));
if (FAILED(hr)) {
NS_WARNING("Failed to open shared texture for Y Plane");
return false;
@@ -1189,17 +1216,17 @@ DXGIYCbCrTextureHostD3D11::EnsureTexture
return false;
}
if (!GetDevice()) {
NS_WARNING("trying to lock a TextureHost without a D3D device");
return false;
}
if (!mTextureSources[0]) {
- if (!mTextures[0] && !OpenSharedHandle()) {
+ if (!EnsureTexture()) {
return false;
}
MOZ_ASSERT(mTextures[1] && mTextures[2]);
mTextureSources[0] = new DataTextureSourceD3D11(SurfaceFormat::A8, mProvider, mTextures[0]);
mTextureSources[1] = new DataTextureSourceD3D11(SurfaceFormat::A8, mProvider, mTextures[1]);
mTextureSources[2] = new DataTextureSourceD3D11(SurfaceFormat::A8, mProvider, mTextures[2]);
--- a/gfx/layers/d3d11/TextureD3D11.h
+++ b/gfx/layers/d3d11/TextureD3D11.h
@@ -342,17 +342,17 @@ public:
protected:
bool LockInternal();
void UnlockInternal();
bool EnsureTextureSource();
RefPtr<ID3D11Device> GetDevice();
- bool OpenSharedHandle();
+ bool EnsureTexture();
RefPtr<ID3D11Device> mDevice;
RefPtr<ID3D11Texture2D> mTexture;
RefPtr<DataTextureSourceD3D11> mTextureSource;
gfx::IntSize mSize;
WindowsHandle mHandle;
gfx::SurfaceFormat mFormat;
bool mIsLocked;
@@ -403,17 +403,17 @@ public:
Range<const wr::ImageKey>& aImageKeys) override;
private:
bool EnsureTextureSource();
protected:
RefPtr<ID3D11Device> GetDevice();
- bool OpenSharedHandle();
+ bool EnsureTexture();
RefPtr<ID3D11Texture2D> mTextures[3];
RefPtr<DataTextureSourceD3D11> mTextureSources[3];
gfx::IntSize mSize;
WindowsHandle mHandles[3];
bool mIsLocked;
};