1 //
2 // Copyright 2002 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 // TextureStorage.h: Defines the abstract rx::TextureStorage class.
8
9 #ifndef LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
10 #define LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
11
12 #include "common/debug.h"
13 #include "libANGLE/angletypes.h"
14
15 #include <GLES2/gl2.h>
16 #include <stdint.h>
17
18 namespace gl
19 {
20 class Context;
21 class ImageIndex;
22 struct Box;
23 struct PixelUnpackState;
24 } // namespace gl
25
26 namespace angle
27 {
28 class Subject;
29 } // namespace angle
30
31 namespace rx
32 {
33 class SwapChainD3D;
34 class RenderTargetD3D;
35 class ImageD3D;
36
37 // Dirty bit messages from TextureStorage
38 constexpr size_t kTextureStorageObserverMessageIndex = 0;
39
40 class TextureStorage : public angle::Subject
41 {
42 public:
TextureStorage(const std::string & label)43 TextureStorage(const std::string &label) : mKHRDebugLabel(label) {}
~TextureStorage()44 ~TextureStorage() override {}
45
46 virtual angle::Result onDestroy(const gl::Context *context);
47
48 virtual int getTopLevel() const = 0;
49 virtual bool isRenderTarget() const = 0;
50 virtual bool isUnorderedAccess() const = 0;
51 virtual bool isManaged() const = 0;
52 virtual bool supportsNativeMipmapFunction() const = 0;
53 virtual int getLevelCount() const = 0;
54
55 virtual angle::Result findRenderTarget(const gl::Context *context,
56 const gl::ImageIndex &index,
57 GLsizei samples,
58 RenderTargetD3D **outRT) const = 0;
59 virtual angle::Result getRenderTarget(const gl::Context *context,
60 const gl::ImageIndex &index,
61 GLsizei samples,
62 RenderTargetD3D **outRT) = 0;
63 virtual angle::Result generateMipmap(const gl::Context *context,
64 const gl::ImageIndex &sourceIndex,
65 const gl::ImageIndex &destIndex) = 0;
66
67 virtual angle::Result copyToStorage(const gl::Context *context,
68 TextureStorage *destStorage) = 0;
69 virtual angle::Result setData(const gl::Context *context,
70 const gl::ImageIndex &index,
71 ImageD3D *image,
72 const gl::Box *destBox,
73 GLenum type,
74 const gl::PixelUnpackState &unpack,
75 const uint8_t *pixelData) = 0;
76
77 // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D)
78 // might override it.
79 virtual angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
80 bool useLevelZeroTexture);
81
invalidateTextures()82 virtual void invalidateTextures() {}
83
84 // RenderToTexture methods
85 virtual angle::Result releaseMultisampledTexStorageForLevel(size_t level);
86 virtual angle::Result resolveTexture(const gl::Context *context);
87 virtual GLsizei getRenderToTextureSamples() const;
88
89 // Called by outer object when label has changed via KHR_debug extension
90 void setLabel(const std::string &newLabel);
91
92 protected:
onLabelUpdate()93 virtual void onLabelUpdate() {}
94
95 const angle::Subject *mSubject;
96 std::string mKHRDebugLabel;
97 };
98
onDestroy(const gl::Context * context)99 inline angle::Result TextureStorage::onDestroy(const gl::Context *context)
100 {
101 return angle::Result::Continue;
102 }
103
useLevelZeroWorkaroundTexture(const gl::Context * context,bool useLevelZeroTexture)104 inline angle::Result TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context,
105 bool useLevelZeroTexture)
106 {
107 return angle::Result::Continue;
108 }
109
releaseMultisampledTexStorageForLevel(size_t level)110 inline angle::Result TextureStorage::releaseMultisampledTexStorageForLevel(size_t level)
111 {
112 return angle::Result::Continue;
113 }
114
resolveTexture(const gl::Context * context)115 inline angle::Result TextureStorage::resolveTexture(const gl::Context *context)
116 {
117 return angle::Result::Continue;
118 }
119
getRenderToTextureSamples()120 inline GLsizei TextureStorage::getRenderToTextureSamples() const
121 {
122 return 0;
123 }
124
setLabel(const std::string & newLabel)125 inline void TextureStorage::setLabel(const std::string &newLabel)
126 {
127 mKHRDebugLabel = newLabel;
128 onLabelUpdate();
129 }
130
131 using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
132
133 } // namespace rx
134
135 #endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
136