1//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
8// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
9
10#ifndef LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
11#define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
12
13#include "libGLESv2/Texture.h"
14#include "libGLESv2/renderer/TextureStorage.h"
15
16namespace rx
17{
18class RenderTarget;
19class RenderTarget11;
20class Renderer;
21class Renderer11;
22class SwapChain11;
23
24class TextureStorage11 : public TextureStorage
25{
26  public:
27    TextureStorage11(Renderer *renderer, UINT bindFlags);
28    virtual ~TextureStorage11();
29
30    static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
31
32    static DWORD GetTextureBindFlags(DXGI_FORMAT d3dfmt, GLenum glusage, bool forceRenderable);
33    static bool IsTextureFormatRenderable(DXGI_FORMAT format);
34
35    UINT getBindFlags() const;
36
37    virtual ID3D11Texture2D *getBaseTexture() const;
38    virtual ID3D11ShaderResourceView *getSRV() = 0;
39    virtual RenderTarget *getRenderTarget() { return getRenderTarget(0); }
40    virtual RenderTarget *getRenderTarget(int level) { return NULL; }
41    virtual RenderTarget *getRenderTarget(GLenum faceTarget) { return getRenderTarget(faceTarget, 0); }
42    virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level) { return NULL; }
43
44    virtual void generateMipmap(int level) {};
45    virtual void generateMipmap(int face, int level) {};
46
47    virtual int getLodOffset() const;
48    virtual bool isRenderTarget() const;
49    virtual bool isManaged() const;
50    virtual int levelCount();
51    UINT getSubresourceIndex(int level, int faceTarget);
52
53    bool updateSubresourceLevel(ID3D11Texture2D *texture, unsigned int sourceSubresource, int level,
54                                int faceTarget, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
55
56  protected:
57    void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
58
59    Renderer11 *mRenderer;
60    int mLodOffset;
61    unsigned int mMipLevels;
62
63    ID3D11Texture2D *mTexture;
64    DXGI_FORMAT mTextureFormat;
65    DXGI_FORMAT mShaderResourceFormat;
66    DXGI_FORMAT mRenderTargetFormat;
67    DXGI_FORMAT mDepthStencilFormat;
68    unsigned int mTextureWidth;
69    unsigned int mTextureHeight;
70
71    ID3D11ShaderResourceView *mSRV;
72
73  private:
74    DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
75
76    const UINT mBindFlags;
77};
78
79class TextureStorage11_2D : public TextureStorage11
80{
81  public:
82    TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain);
83    TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height);
84    virtual ~TextureStorage11_2D();
85
86    static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
87
88    virtual ID3D11ShaderResourceView *getSRV();
89    virtual RenderTarget *getRenderTarget(int level);
90
91    virtual void generateMipmap(int level);
92
93  private:
94    DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
95
96    RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
97};
98
99class TextureStorage11_Cube : public TextureStorage11
100{
101  public:
102    TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size);
103    virtual ~TextureStorage11_Cube();
104
105    static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
106
107    virtual ID3D11ShaderResourceView *getSRV();
108    virtual RenderTarget *getRenderTarget(GLenum faceTarget, int level);
109
110    virtual void generateMipmap(int face, int level);
111
112  private:
113    DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
114
115    RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
116};
117
118}
119
120#endif // LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
121