michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef MOZILLA_GFX_TEXTURED3D11_H michael@0: #define MOZILLA_GFX_TEXTURED3D11_H michael@0: michael@0: #include "mozilla/layers/Compositor.h" michael@0: #include "mozilla/layers/TextureClient.h" michael@0: #include "mozilla/layers/TextureHost.h" michael@0: #include "gfxWindowsPlatform.h" michael@0: #include "mozilla/GfxMessageUtils.h" michael@0: #include michael@0: #include michael@0: michael@0: class gfxD2DSurface; michael@0: michael@0: namespace mozilla { michael@0: namespace layers { michael@0: michael@0: class CompositorD3D11; michael@0: michael@0: /** michael@0: * A TextureClient to share a D3D10 texture with the compositor thread. michael@0: * The corresponding TextureHost is DXGITextureHostD3D11 michael@0: */ michael@0: class TextureClientD3D11 : public TextureClient michael@0: { michael@0: public: michael@0: TextureClientD3D11(gfx::SurfaceFormat aFormat, TextureFlags aFlags); michael@0: michael@0: virtual ~TextureClientD3D11(); michael@0: michael@0: // TextureClient michael@0: michael@0: virtual bool IsAllocated() const MOZ_OVERRIDE { return !!mTexture; } michael@0: michael@0: virtual bool Lock(OpenMode aOpenMode) MOZ_OVERRIDE; michael@0: michael@0: virtual void Unlock() MOZ_OVERRIDE; michael@0: michael@0: virtual bool IsLocked() const MOZ_OVERRIDE { return mIsLocked; } michael@0: michael@0: virtual bool ImplementsLocking() const MOZ_OVERRIDE { return true; } michael@0: michael@0: virtual bool HasInternalBuffer() const MOZ_OVERRIDE { return false; } michael@0: michael@0: virtual bool ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) MOZ_OVERRIDE; michael@0: michael@0: virtual gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; } michael@0: michael@0: virtual TextureClientData* DropTextureData() MOZ_OVERRIDE { return nullptr; } michael@0: michael@0: virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; } michael@0: michael@0: virtual bool CanExposeDrawTarget() const MOZ_OVERRIDE { return true; } michael@0: michael@0: virtual TemporaryRef GetAsDrawTarget() MOZ_OVERRIDE; michael@0: michael@0: virtual bool AllocateForSurface(gfx::IntSize aSize, michael@0: TextureAllocationFlags aFlags = ALLOC_DEFAULT) MOZ_OVERRIDE; michael@0: michael@0: protected: michael@0: gfx::IntSize mSize; michael@0: RefPtr mTexture; michael@0: RefPtr mDrawTarget; michael@0: gfx::SurfaceFormat mFormat; michael@0: bool mIsLocked; michael@0: bool mNeedsClear; michael@0: }; michael@0: michael@0: /** michael@0: * TextureSource that provides with the necessary APIs to be composited by a michael@0: * CompositorD3D11. michael@0: */ michael@0: class TextureSourceD3D11 michael@0: { michael@0: public: michael@0: TextureSourceD3D11() {} michael@0: virtual ~TextureSourceD3D11() {} michael@0: michael@0: virtual ID3D11Texture2D* GetD3D11Texture() const { return mTexture; } michael@0: michael@0: protected: michael@0: virtual gfx::IntSize GetSize() const { return mSize; } michael@0: michael@0: gfx::IntSize mSize; michael@0: RefPtr mTexture; michael@0: }; michael@0: michael@0: /** michael@0: * A TextureSource that implements the DataTextureSource interface. michael@0: * it can be used without a TextureHost and is able to upload texture data michael@0: * from a gfx::DataSourceSurface. michael@0: */ michael@0: class DataTextureSourceD3D11 : public DataTextureSource michael@0: , public TextureSourceD3D11 michael@0: , public TileIterator michael@0: { michael@0: public: michael@0: DataTextureSourceD3D11(gfx::SurfaceFormat aFormat, CompositorD3D11* aCompositor, michael@0: TextureFlags aFlags); michael@0: michael@0: DataTextureSourceD3D11(gfx::SurfaceFormat aFormat, CompositorD3D11* aCompositor, michael@0: ID3D11Texture2D* aTexture); michael@0: michael@0: virtual ~DataTextureSourceD3D11(); michael@0: michael@0: michael@0: // DataTextureSource michael@0: michael@0: virtual bool Update(gfx::DataSourceSurface* aSurface, michael@0: nsIntRegion* aDestRegion = nullptr, michael@0: gfx::IntPoint* aSrcOffset = nullptr) MOZ_OVERRIDE; michael@0: michael@0: // TextureSource michael@0: michael@0: virtual TextureSourceD3D11* AsSourceD3D11() MOZ_OVERRIDE { return this; } michael@0: michael@0: virtual ID3D11Texture2D* GetD3D11Texture() const MOZ_OVERRIDE; michael@0: michael@0: virtual DataTextureSource* AsDataTextureSource() MOZ_OVERRIDE { return this; } michael@0: michael@0: virtual void DeallocateDeviceData() MOZ_OVERRIDE { mTexture = nullptr; } michael@0: michael@0: virtual gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; } michael@0: michael@0: virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; } michael@0: michael@0: virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE; michael@0: michael@0: // TileIterator michael@0: michael@0: virtual TileIterator* AsTileIterator() MOZ_OVERRIDE { return mIsTiled ? this : nullptr; } michael@0: michael@0: virtual size_t GetTileCount() MOZ_OVERRIDE { return mTileTextures.size(); } michael@0: michael@0: virtual bool NextTile() MOZ_OVERRIDE { return (++mCurrentTile < mTileTextures.size()); } michael@0: michael@0: virtual nsIntRect GetTileRect() MOZ_OVERRIDE; michael@0: michael@0: virtual void EndTileIteration() MOZ_OVERRIDE { mIterating = false; } michael@0: michael@0: virtual void BeginTileIteration() MOZ_OVERRIDE michael@0: { michael@0: mIterating = true; michael@0: mCurrentTile = 0; michael@0: } michael@0: michael@0: protected: michael@0: gfx::IntRect GetTileRect(uint32_t aIndex) const; michael@0: michael@0: void Reset(); michael@0: michael@0: std::vector< RefPtr > mTileTextures; michael@0: RefPtr mCompositor; michael@0: gfx::SurfaceFormat mFormat; michael@0: TextureFlags mFlags; michael@0: uint32_t mCurrentTile; michael@0: bool mIsTiled; michael@0: bool mIterating; michael@0: michael@0: }; michael@0: michael@0: /** michael@0: * A TextureHost for shared D3D11 textures. michael@0: */ michael@0: class DXGITextureHostD3D11 : public TextureHost michael@0: { michael@0: public: michael@0: DXGITextureHostD3D11(TextureFlags aFlags, michael@0: const SurfaceDescriptorD3D10& aDescriptor); michael@0: michael@0: virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE; michael@0: michael@0: virtual void DeallocateDeviceData() MOZ_OVERRIDE {} michael@0: michael@0: virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE; michael@0: michael@0: virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; } michael@0: michael@0: virtual bool Lock() MOZ_OVERRIDE; michael@0: michael@0: virtual void Unlock() MOZ_OVERRIDE; michael@0: michael@0: virtual gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; } michael@0: michael@0: virtual TemporaryRef GetAsSurface() MOZ_OVERRIDE michael@0: { michael@0: return nullptr; michael@0: } michael@0: michael@0: protected: michael@0: ID3D11Device* GetDevice(); michael@0: michael@0: RefPtr mTextureSource; michael@0: RefPtr mCompositor; michael@0: gfx::IntSize mSize; michael@0: WindowsHandle mHandle; michael@0: gfx::SurfaceFormat mFormat; michael@0: bool mIsLocked; michael@0: }; michael@0: michael@0: class CompositingRenderTargetD3D11 : public CompositingRenderTarget, michael@0: public TextureSourceD3D11 michael@0: { michael@0: public: michael@0: CompositingRenderTargetD3D11(ID3D11Texture2D* aTexture, michael@0: const gfx::IntPoint& aOrigin); michael@0: michael@0: virtual TextureSourceD3D11* AsSourceD3D11() MOZ_OVERRIDE { return this; } michael@0: michael@0: virtual gfx::IntSize GetSize() const MOZ_OVERRIDE; michael@0: michael@0: void SetSize(const gfx::IntSize& aSize) { mSize = aSize; } michael@0: michael@0: private: michael@0: friend class CompositorD3D11; michael@0: michael@0: RefPtr mRTView; michael@0: }; michael@0: michael@0: inline uint32_t GetMaxTextureSizeForFeatureLevel(D3D_FEATURE_LEVEL aFeatureLevel) michael@0: { michael@0: int32_t maxTextureSize; michael@0: switch (aFeatureLevel) { michael@0: case D3D_FEATURE_LEVEL_11_1: michael@0: case D3D_FEATURE_LEVEL_11_0: michael@0: maxTextureSize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; michael@0: break; michael@0: case D3D_FEATURE_LEVEL_10_1: michael@0: case D3D_FEATURE_LEVEL_10_0: michael@0: maxTextureSize = D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; michael@0: break; michael@0: case D3D_FEATURE_LEVEL_9_3: michael@0: maxTextureSize = D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION; michael@0: break; michael@0: default: michael@0: maxTextureSize = D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION; michael@0: } michael@0: return maxTextureSize; michael@0: } michael@0: michael@0: } michael@0: } michael@0: michael@0: #endif /* MOZILLA_GFX_TEXTURED3D11_H */