From 76fed664bfb6f7f12a6c62829972c4811b628fa9 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Wed, 29 Dec 2010 01:07:12 +0000 Subject: [PATCH] Bug 620665 - Part 5: Do not use mManager pointer for D3D10 layers. r=roc a=blocking-beta9 --- gfx/layers/d3d10/ImageLayerD3D10.cpp | 23 +++++++++++------------ gfx/layers/d3d10/ImageLayerD3D10.h | 5 ++++- gfx/layers/d3d10/LayerManagerD3D10.cpp | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/gfx/layers/d3d10/ImageLayerD3D10.cpp b/gfx/layers/d3d10/ImageLayerD3D10.cpp index 5b8fb4e5fa8..0d4ea23fe8d 100644 --- a/gfx/layers/d3d10/ImageLayerD3D10.cpp +++ b/gfx/layers/d3d10/ImageLayerD3D10.cpp @@ -91,9 +91,9 @@ SurfaceToTexture(ID3D10Device *aDevice, return texture.forget(); } -ImageContainerD3D10::ImageContainerD3D10(LayerManagerD3D10 *aManager) - : ImageContainer(aManager) - , mDevice(aManager->device()) +ImageContainerD3D10::ImageContainerD3D10(ID3D10Device1 *aDevice) + : ImageContainer(nsnull) + , mDevice(aDevice) , mActiveImageLock("mozilla.layers.ImageContainerD3D10.mActiveImageLock") { } @@ -182,7 +182,6 @@ PRBool ImageContainerD3D10::SetLayerManager(LayerManager *aManager) { if (aManager->GetBackendType() == LayerManager::LAYERS_D3D10) { - mManager = aManager; return PR_TRUE; } return PR_FALSE; @@ -207,20 +206,14 @@ ImageLayerD3D10::RenderLayer() ID3D10EffectTechnique *technique; - if (GetContainer()->Manager() != Manager()) { - GetContainer()->SetLayerManager(Manager()); - } - - if (GetContainer()->Manager() != Manager() || - GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10 || + if (GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10 || image->GetFormat() == Image::CAIRO_SURFACE) { gfxIntSize size; bool hasAlpha; nsRefPtr srView; - if (GetContainer()->Manager() != Manager() || - GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10) + if (GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10) { nsRefPtr surf = GetContainer()->GetCurrentAsSurface(&size); @@ -230,6 +223,12 @@ ImageLayerD3D10::RenderLayer() device()->CreateShaderResourceView(texture, NULL, getter_AddRefs(srView)); } else { + ImageContainerD3D10 *container = + static_cast(GetContainer()); + if (container->device() != device()) { + container->SetDevice(device()); + } + // image->GetFormat() == Image::CAIRO_SURFACE CairoImageD3D10 *cairoImage = static_cast(image.get()); diff --git a/gfx/layers/d3d10/ImageLayerD3D10.h b/gfx/layers/d3d10/ImageLayerD3D10.h index 35ae538cf28..c54971f6238 100644 --- a/gfx/layers/d3d10/ImageLayerD3D10.h +++ b/gfx/layers/d3d10/ImageLayerD3D10.h @@ -49,7 +49,7 @@ namespace layers { class THEBES_API ImageContainerD3D10 : public ImageContainer { public: - ImageContainerD3D10(LayerManagerD3D10 *aManager); + ImageContainerD3D10(ID3D10Device1 *aDevice); virtual ~ImageContainerD3D10() {} virtual already_AddRefed CreateImage(const Image::Format* aFormats, @@ -67,6 +67,9 @@ public: virtual LayerManager::LayersBackend GetBackendType() { return LayerManager::LAYERS_D3D10; } + ID3D10Device1 *device() { return mDevice; } + void SetDevice(ID3D10Device1 *aDevice) { mDevice = aDevice; } + private: typedef mozilla::Mutex Mutex; diff --git a/gfx/layers/d3d10/LayerManagerD3D10.cpp b/gfx/layers/d3d10/LayerManagerD3D10.cpp index 0e953bc4d42..356efb7a202 100644 --- a/gfx/layers/d3d10/LayerManagerD3D10.cpp +++ b/gfx/layers/d3d10/LayerManagerD3D10.cpp @@ -289,7 +289,7 @@ LayerManagerD3D10::CreateCanvasLayer() already_AddRefed LayerManagerD3D10::CreateImageContainer() { - nsRefPtr layer = new ImageContainerD3D10(this); + nsRefPtr layer = new ImageContainerD3D10(device()); return layer.forget(); }