author Anthony Jones <>
Fri, 20 Feb 2015 16:27:42 +1300
changeset 231525 78b34d0e414a24a32dcbc76996e52adcfd24d665
parent 177951 f2b29dbe2ae9246e0a21af4bab7ba6c31b9930b7
child 232490 3bd19a1cf4b419351c62670c3215be27cc9ef962
permissions -rw-r--r--
Bug 1131638 - Discard DXVA frames that don't complete YUV->RGB conversion. r=cpearce

/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at */


#include "mozilla/RefPtr.h"
#include "ImageContainer.h"
#include "nsAutoPtr.h"
#include "d3d9.h"

namespace mozilla {
namespace layers {

// Image class that wraps a IDirect3DSurface9. This class copies the image
// passed into SetData(), so that it can be accessed from other D3D devices.
// This class also manages the synchronization of the copy, to ensure the
// resource is ready to use.
class D3D9SurfaceImage : public Image
                       , public ISharedImage {

  struct Data {
    Data(IDirect3DSurface9* aSurface, const nsIntRect& aRegion)
      : mSurface(aSurface), mRegion(aRegion) {}
    RefPtr<IDirect3DSurface9> mSurface;
    nsIntRect mRegion;

  virtual ~D3D9SurfaceImage();

  virtual ISharedImage* AsSharedImage() MOZ_OVERRIDE { return this; }

  // Copies the surface into a sharable texture's surface, and initializes
  // the image.
  HRESULT SetData(const Data& aData);

  // Returns the description of the shared surface.
  const D3DSURFACE_DESC& GetDesc() const;

  gfx::IntSize GetSize() MOZ_OVERRIDE;

  virtual TemporaryRef<gfx::SourceSurface> GetAsSourceSurface() MOZ_OVERRIDE;

  virtual TextureClient* GetTextureClient(CompositableClient* aClient) MOZ_OVERRIDE;
  virtual uint8_t* GetBuffer() MOZ_OVERRIDE { return nullptr; }

  virtual bool IsValid() MOZ_OVERRIDE;


  gfx::IntSize mSize;
  RefPtr<IDirect3DTexture9> mTexture;
  RefPtr<TextureClient> mTextureClient;
  HANDLE mShareHandle;
  bool mIsValid;

} // namepace layers
} // namespace mozilla