Bug 620665 - Part 5: Do not use mManager pointer for D3D10 layers. r=roc a=blocking-beta9

This commit is contained in:
Bas Schouten 2010-12-29 01:07:12 +00:00
parent a218a71e7c
commit 76fed664bf
3 changed files with 16 additions and 14 deletions

View File

@ -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<ID3D10ShaderResourceView> srView;
if (GetContainer()->Manager() != Manager() ||
GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10)
if (GetContainer()->GetBackendType() != LayerManager::LAYERS_D3D10)
{
nsRefPtr<gfxASurface> surf = GetContainer()->GetCurrentAsSurface(&size);
@ -230,6 +223,12 @@ ImageLayerD3D10::RenderLayer()
device()->CreateShaderResourceView(texture, NULL, getter_AddRefs(srView));
} else {
ImageContainerD3D10 *container =
static_cast<ImageContainerD3D10*>(GetContainer());
if (container->device() != device()) {
container->SetDevice(device());
}
// image->GetFormat() == Image::CAIRO_SURFACE
CairoImageD3D10 *cairoImage =
static_cast<CairoImageD3D10*>(image.get());

View File

@ -49,7 +49,7 @@ namespace layers {
class THEBES_API ImageContainerD3D10 : public ImageContainer
{
public:
ImageContainerD3D10(LayerManagerD3D10 *aManager);
ImageContainerD3D10(ID3D10Device1 *aDevice);
virtual ~ImageContainerD3D10() {}
virtual already_AddRefed<Image> 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;

View File

@ -289,7 +289,7 @@ LayerManagerD3D10::CreateCanvasLayer()
already_AddRefed<ImageContainer>
LayerManagerD3D10::CreateImageContainer()
{
nsRefPtr<ImageContainer> layer = new ImageContainerD3D10(this);
nsRefPtr<ImageContainer> layer = new ImageContainerD3D10(device());
return layer.forget();
}