14834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com//
24834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
34834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// found in the LICENSE file.
54834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com//
64834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
74834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
84834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
94834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
104834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#ifndef LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
114834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
124834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
13858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com#include "libGLESv2/Texture.h"
144834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/TextureStorage.h"
154834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
164834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comnamespace rx
174834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
184834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass RenderTarget;
194834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass RenderTarget11;
204834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass Renderer;
214834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass Renderer11;
224834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass SwapChain11;
234834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
244834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass TextureStorage11 : public TextureStorage
254834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
264834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com  public:
274834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    TextureStorage11(Renderer *renderer, UINT bindFlags);
284834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual ~TextureStorage11();
294834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
304834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
314834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
324834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    static DWORD GetTextureBindFlags(DXGI_FORMAT d3dfmt, GLenum glusage, bool forceRenderable);
334834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    static bool IsTextureFormatRenderable(DXGI_FORMAT format);
344834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
354834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    UINT getBindFlags() const;
364834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
3753b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    virtual ID3D11Texture2D *getBaseTexture() const;
38858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual ID3D11ShaderResourceView *getSRV() = 0;
39858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget() { return getRenderTarget(0); }
40858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget(int level) { return NULL; }
41858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget(GLenum faceTarget) { return getRenderTarget(faceTarget, 0); }
42858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level) { return NULL; }
43858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
444834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual void generateMipmap(int level) {};
454834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual void generateMipmap(int face, int level) {};
464834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
474834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual int getLodOffset() const;
484834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual bool isRenderTarget() const;
494834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual bool isManaged() const;
504834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual int levelCount();
519a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    UINT getSubresourceIndex(int level, int faceTarget);
52858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
5381ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com    bool updateSubresourceLevel(ID3D11Texture2D *texture, unsigned int sourceSubresource, int level,
5481ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com                                int faceTarget, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
554834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
564834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com  protected:
5785bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
5885bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
594834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    Renderer11 *mRenderer;
604834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    int mLodOffset;
61b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com    unsigned int mMipLevels;
624834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
6353b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    ID3D11Texture2D *mTexture;
6453b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    DXGI_FORMAT mTextureFormat;
6553b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    DXGI_FORMAT mShaderResourceFormat;
6653b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    DXGI_FORMAT mRenderTargetFormat;
6753b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    DXGI_FORMAT mDepthStencilFormat;
6853b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    unsigned int mTextureWidth;
6953b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    unsigned int mTextureHeight;
7053b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com
7153b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    ID3D11ShaderResourceView *mSRV;
7253b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com
734834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com  private:
744834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
754834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
764834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    const UINT mBindFlags;
774834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com};
784834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
794834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comclass TextureStorage11_2D : public TextureStorage11
804834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
814834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com  public:
824834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain);
834834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height);
844834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual ~TextureStorage11_2D();
854834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
864834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
874834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
88858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual ID3D11ShaderResourceView *getSRV();
89858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget(int level);
90858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
914834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    virtual void generateMipmap(int level);
924834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
934834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com  private:
944834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
954834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
96858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
974834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com};
984834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
99b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.comclass TextureStorage11_Cube : public TextureStorage11
100b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com{
101b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com  public:
102b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size);
103b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    virtual ~TextureStorage11_Cube();
104b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
105b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
106b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
107858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual ID3D11ShaderResourceView *getSRV();
108858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level);
109858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
110b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    virtual void generateMipmap(int face, int level);
111b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
112b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com  private:
113b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
114b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
115858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
116b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com};
117b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
1184834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
1194834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
1204834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#endif // LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
121