xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/TextureVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // TextureVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for TextureVk, implementing TextureImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_TEXTUREVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_TEXTUREVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/TextureImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/RenderTargetVk.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/SamplerVk.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_resource.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace rx
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker enum class TextureUpdateResult
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker     ImageUnaffected,
25*8975f5c5SAndroid Build Coastguard Worker     ImageRespecified,
26*8975f5c5SAndroid Build Coastguard Worker };
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker class TextureVk : public TextureImpl, public angle::ObserverInterface
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker   public:
31*8975f5c5SAndroid Build Coastguard Worker     TextureVk(const gl::TextureState &state, vk::Renderer *renderer);
32*8975f5c5SAndroid Build Coastguard Worker     ~TextureVk() override;
33*8975f5c5SAndroid Build Coastguard Worker     void onDestroy(const gl::Context *context) override;
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImage(const gl::Context *context,
36*8975f5c5SAndroid Build Coastguard Worker                            const gl::ImageIndex &index,
37*8975f5c5SAndroid Build Coastguard Worker                            GLenum internalFormat,
38*8975f5c5SAndroid Build Coastguard Worker                            const gl::Extents &size,
39*8975f5c5SAndroid Build Coastguard Worker                            GLenum format,
40*8975f5c5SAndroid Build Coastguard Worker                            GLenum type,
41*8975f5c5SAndroid Build Coastguard Worker                            const gl::PixelUnpackState &unpack,
42*8975f5c5SAndroid Build Coastguard Worker                            gl::Buffer *unpackBuffer,
43*8975f5c5SAndroid Build Coastguard Worker                            const uint8_t *pixels) override;
44*8975f5c5SAndroid Build Coastguard Worker     angle::Result setSubImage(const gl::Context *context,
45*8975f5c5SAndroid Build Coastguard Worker                               const gl::ImageIndex &index,
46*8975f5c5SAndroid Build Coastguard Worker                               const gl::Box &area,
47*8975f5c5SAndroid Build Coastguard Worker                               GLenum format,
48*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
49*8975f5c5SAndroid Build Coastguard Worker                               const gl::PixelUnpackState &unpack,
50*8975f5c5SAndroid Build Coastguard Worker                               gl::Buffer *unpackBuffer,
51*8975f5c5SAndroid Build Coastguard Worker                               const uint8_t *pixels) override;
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     angle::Result setCompressedImage(const gl::Context *context,
54*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &index,
55*8975f5c5SAndroid Build Coastguard Worker                                      GLenum internalFormat,
56*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Extents &size,
57*8975f5c5SAndroid Build Coastguard Worker                                      const gl::PixelUnpackState &unpack,
58*8975f5c5SAndroid Build Coastguard Worker                                      size_t imageSize,
59*8975f5c5SAndroid Build Coastguard Worker                                      const uint8_t *pixels) override;
60*8975f5c5SAndroid Build Coastguard Worker     angle::Result setCompressedSubImage(const gl::Context *context,
61*8975f5c5SAndroid Build Coastguard Worker                                         const gl::ImageIndex &index,
62*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Box &area,
63*8975f5c5SAndroid Build Coastguard Worker                                         GLenum format,
64*8975f5c5SAndroid Build Coastguard Worker                                         const gl::PixelUnpackState &unpack,
65*8975f5c5SAndroid Build Coastguard Worker                                         size_t imageSize,
66*8975f5c5SAndroid Build Coastguard Worker                                         const uint8_t *pixels) override;
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImage(const gl::Context *context,
69*8975f5c5SAndroid Build Coastguard Worker                             const gl::ImageIndex &index,
70*8975f5c5SAndroid Build Coastguard Worker                             const gl::Rectangle &sourceArea,
71*8975f5c5SAndroid Build Coastguard Worker                             GLenum internalFormat,
72*8975f5c5SAndroid Build Coastguard Worker                             gl::Framebuffer *source) override;
73*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubImage(const gl::Context *context,
74*8975f5c5SAndroid Build Coastguard Worker                                const gl::ImageIndex &index,
75*8975f5c5SAndroid Build Coastguard Worker                                const gl::Offset &destOffset,
76*8975f5c5SAndroid Build Coastguard Worker                                const gl::Rectangle &sourceArea,
77*8975f5c5SAndroid Build Coastguard Worker                                gl::Framebuffer *source) override;
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyTexture(const gl::Context *context,
80*8975f5c5SAndroid Build Coastguard Worker                               const gl::ImageIndex &index,
81*8975f5c5SAndroid Build Coastguard Worker                               GLenum internalFormat,
82*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
83*8975f5c5SAndroid Build Coastguard Worker                               GLint sourceLevelGL,
84*8975f5c5SAndroid Build Coastguard Worker                               bool unpackFlipY,
85*8975f5c5SAndroid Build Coastguard Worker                               bool unpackPremultiplyAlpha,
86*8975f5c5SAndroid Build Coastguard Worker                               bool unpackUnmultiplyAlpha,
87*8975f5c5SAndroid Build Coastguard Worker                               const gl::Texture *source) override;
88*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubTexture(const gl::Context *context,
89*8975f5c5SAndroid Build Coastguard Worker                                  const gl::ImageIndex &index,
90*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Offset &destOffset,
91*8975f5c5SAndroid Build Coastguard Worker                                  GLint sourceLevelGL,
92*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Box &sourceBox,
93*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackFlipY,
94*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackPremultiplyAlpha,
95*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackUnmultiplyAlpha,
96*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Texture *source) override;
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyRenderbufferSubData(const gl::Context *context,
99*8975f5c5SAndroid Build Coastguard Worker                                           const gl::Renderbuffer *srcBuffer,
100*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcLevel,
101*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcX,
102*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcY,
103*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcZ,
104*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstLevel,
105*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstX,
106*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstY,
107*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstZ,
108*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcWidth,
109*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcHeight,
110*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcDepth) override;
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyTextureSubData(const gl::Context *context,
113*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Texture *srcTexture,
114*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcLevel,
115*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcX,
116*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcY,
117*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcZ,
118*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstLevel,
119*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstX,
120*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstY,
121*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstZ,
122*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcWidth,
123*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcHeight,
124*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcDepth) override;
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyCompressedTexture(const gl::Context *context,
127*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Texture *source) override;
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearImage(const gl::Context *context,
130*8975f5c5SAndroid Build Coastguard Worker                              GLint level,
131*8975f5c5SAndroid Build Coastguard Worker                              GLenum format,
132*8975f5c5SAndroid Build Coastguard Worker                              GLenum type,
133*8975f5c5SAndroid Build Coastguard Worker                              const uint8_t *data) override;
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearSubImage(const gl::Context *context,
136*8975f5c5SAndroid Build Coastguard Worker                                 GLint level,
137*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Box &area,
138*8975f5c5SAndroid Build Coastguard Worker                                 GLenum format,
139*8975f5c5SAndroid Build Coastguard Worker                                 GLenum type,
140*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *data) override;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorage(const gl::Context *context,
143*8975f5c5SAndroid Build Coastguard Worker                              gl::TextureType type,
144*8975f5c5SAndroid Build Coastguard Worker                              size_t levels,
145*8975f5c5SAndroid Build Coastguard Worker                              GLenum internalFormat,
146*8975f5c5SAndroid Build Coastguard Worker                              const gl::Extents &size) override;
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageExternalMemory(const gl::Context *context,
149*8975f5c5SAndroid Build Coastguard Worker                                            gl::TextureType type,
150*8975f5c5SAndroid Build Coastguard Worker                                            size_t levels,
151*8975f5c5SAndroid Build Coastguard Worker                                            GLenum internalFormat,
152*8975f5c5SAndroid Build Coastguard Worker                                            const gl::Extents &size,
153*8975f5c5SAndroid Build Coastguard Worker                                            gl::MemoryObject *memoryObject,
154*8975f5c5SAndroid Build Coastguard Worker                                            GLuint64 offset,
155*8975f5c5SAndroid Build Coastguard Worker                                            GLbitfield createFlags,
156*8975f5c5SAndroid Build Coastguard Worker                                            GLbitfield usageFlags,
157*8975f5c5SAndroid Build Coastguard Worker                                            const void *imageCreateInfoPNext) override;
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     angle::Result setEGLImageTarget(const gl::Context *context,
160*8975f5c5SAndroid Build Coastguard Worker                                     gl::TextureType type,
161*8975f5c5SAndroid Build Coastguard Worker                                     egl::Image *image) override;
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImageExternal(const gl::Context *context,
164*8975f5c5SAndroid Build Coastguard Worker                                    gl::TextureType type,
165*8975f5c5SAndroid Build Coastguard Worker                                    egl::Stream *stream,
166*8975f5c5SAndroid Build Coastguard Worker                                    const egl::Stream::GLTextureDescription &desc) override;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker     angle::Result setBuffer(const gl::Context *context, GLenum internalFormat) override;
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmap(const gl::Context *context) override;
171*8975f5c5SAndroid Build Coastguard Worker 
172*8975f5c5SAndroid Build Coastguard Worker     angle::Result setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker     angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override;
175*8975f5c5SAndroid Build Coastguard Worker     angle::Result releaseTexImage(const gl::Context *context) override;
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     angle::Result getAttachmentRenderTarget(const gl::Context *context,
178*8975f5c5SAndroid Build Coastguard Worker                                             GLenum binding,
179*8975f5c5SAndroid Build Coastguard Worker                                             const gl::ImageIndex &imageIndex,
180*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei samples,
181*8975f5c5SAndroid Build Coastguard Worker                                             FramebufferAttachmentRenderTarget **rtOut) override;
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
184*8975f5c5SAndroid Build Coastguard Worker                             const gl::Texture::DirtyBits &dirtyBits,
185*8975f5c5SAndroid Build Coastguard Worker                             gl::Command source) override;
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageMultisample(const gl::Context *context,
188*8975f5c5SAndroid Build Coastguard Worker                                         gl::TextureType type,
189*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei samples,
190*8975f5c5SAndroid Build Coastguard Worker                                         GLint internalformat,
191*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Extents &size,
192*8975f5c5SAndroid Build Coastguard Worker                                         bool fixedSampleLocations) override;
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageAttribs(const gl::Context *context,
195*8975f5c5SAndroid Build Coastguard Worker                                     gl::TextureType type,
196*8975f5c5SAndroid Build Coastguard Worker                                     size_t levels,
197*8975f5c5SAndroid Build Coastguard Worker                                     GLint internalFormat,
198*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Extents &size,
199*8975f5c5SAndroid Build Coastguard Worker                                     const GLint *attribList) override;
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeContents(const gl::Context *context,
202*8975f5c5SAndroid Build Coastguard Worker                                      GLenum binding,
203*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &imageIndex) override;
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeContentsWithBlack(const gl::Context *context,
206*8975f5c5SAndroid Build Coastguard Worker                                               GLenum binding,
207*8975f5c5SAndroid Build Coastguard Worker                                               const gl::ImageIndex &imageIndex);
208*8975f5c5SAndroid Build Coastguard Worker 
getRequiredExternalTextureImageUnits(const gl::Context * context)209*8975f5c5SAndroid Build Coastguard Worker     GLint getRequiredExternalTextureImageUnits([[maybe_unused]] const gl::Context *context) override
210*8975f5c5SAndroid Build Coastguard Worker     {
211*8975f5c5SAndroid Build Coastguard Worker         // For now, we assume that only one image unit is needed to support
212*8975f5c5SAndroid Build Coastguard Worker         // external GL textures in the Vulkan backend.
213*8975f5c5SAndroid Build Coastguard Worker         return 1;
214*8975f5c5SAndroid Build Coastguard Worker     }
215*8975f5c5SAndroid Build Coastguard Worker 
getImage()216*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageHelper &getImage() const
217*8975f5c5SAndroid Build Coastguard Worker     {
218*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid());
219*8975f5c5SAndroid Build Coastguard Worker         return *mImage;
220*8975f5c5SAndroid Build Coastguard Worker     }
221*8975f5c5SAndroid Build Coastguard Worker 
getImage()222*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper &getImage()
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid());
225*8975f5c5SAndroid Build Coastguard Worker         return *mImage;
226*8975f5c5SAndroid Build Coastguard Worker     }
227*8975f5c5SAndroid Build Coastguard Worker 
retainBufferViews(vk::CommandBufferHelperCommon * commandBufferHelper)228*8975f5c5SAndroid Build Coastguard Worker     void retainBufferViews(vk::CommandBufferHelperCommon *commandBufferHelper)
229*8975f5c5SAndroid Build Coastguard Worker     {
230*8975f5c5SAndroid Build Coastguard Worker         commandBufferHelper->retainResource(&mBufferViews);
231*8975f5c5SAndroid Build Coastguard Worker     }
232*8975f5c5SAndroid Build Coastguard Worker 
isImmutable()233*8975f5c5SAndroid Build Coastguard Worker     bool isImmutable() { return mState.getImmutableFormat(); }
imageValid()234*8975f5c5SAndroid Build Coastguard Worker     bool imageValid() const { return (mImage && mImage->valid()); }
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker     void releaseOwnershipOfImage(const gl::Context *context);
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageView &getReadImageView(GLenum srgbDecode,
239*8975f5c5SAndroid Build Coastguard Worker                                           bool texelFetchStaticUse,
240*8975f5c5SAndroid Build Coastguard Worker                                           bool samplerExternal2DY2YEXT) const;
241*8975f5c5SAndroid Build Coastguard Worker 
242*8975f5c5SAndroid Build Coastguard Worker     angle::Result getBufferView(vk::Context *context,
243*8975f5c5SAndroid Build Coastguard Worker                                 const vk::Format *imageUniformFormat,
244*8975f5c5SAndroid Build Coastguard Worker                                 const gl::SamplerBinding *samplerBinding,
245*8975f5c5SAndroid Build Coastguard Worker                                 bool isImage,
246*8975f5c5SAndroid Build Coastguard Worker                                 const vk::BufferView **viewOut);
247*8975f5c5SAndroid Build Coastguard Worker 
248*8975f5c5SAndroid Build Coastguard Worker     // A special view used for texture copies that shouldn't perform swizzle.
249*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageView &getCopyImageView() const;
250*8975f5c5SAndroid Build Coastguard Worker     angle::Result getStorageImageView(vk::Context *context,
251*8975f5c5SAndroid Build Coastguard Worker                                       const gl::ImageUnit &binding,
252*8975f5c5SAndroid Build Coastguard Worker                                       const vk::ImageView **imageViewOut);
253*8975f5c5SAndroid Build Coastguard Worker 
getSampler(bool isSamplerExternalY2Y)254*8975f5c5SAndroid Build Coastguard Worker     const vk::SamplerHelper &getSampler(bool isSamplerExternalY2Y) const
255*8975f5c5SAndroid Build Coastguard Worker     {
256*8975f5c5SAndroid Build Coastguard Worker         if (isSamplerExternalY2Y)
257*8975f5c5SAndroid Build Coastguard Worker         {
258*8975f5c5SAndroid Build Coastguard Worker             ASSERT(mY2YSampler->valid());
259*8975f5c5SAndroid Build Coastguard Worker             return *mY2YSampler.get();
260*8975f5c5SAndroid Build Coastguard Worker         }
261*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mSampler->valid());
262*8975f5c5SAndroid Build Coastguard Worker         return *mSampler.get();
263*8975f5c5SAndroid Build Coastguard Worker     }
264*8975f5c5SAndroid Build Coastguard Worker 
resetSampler()265*8975f5c5SAndroid Build Coastguard Worker     void resetSampler()
266*8975f5c5SAndroid Build Coastguard Worker     {
267*8975f5c5SAndroid Build Coastguard Worker         mSampler.reset();
268*8975f5c5SAndroid Build Coastguard Worker         mY2YSampler.reset();
269*8975f5c5SAndroid Build Coastguard Worker     }
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker     // Normally, initialize the image with enabled mipmap level counts.
272*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageInitialized(ContextVk *contextVk, ImageMipLevels mipLevels);
273*8975f5c5SAndroid Build Coastguard Worker 
getImageViewSubresourceSerial(const gl::SamplerState & samplerState,bool staticTexelFetchAccess)274*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getImageViewSubresourceSerial(
275*8975f5c5SAndroid Build Coastguard Worker         const gl::SamplerState &samplerState,
276*8975f5c5SAndroid Build Coastguard Worker         bool staticTexelFetchAccess) const
277*8975f5c5SAndroid Build Coastguard Worker     {
278*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage != nullptr);
279*8975f5c5SAndroid Build Coastguard Worker         gl::SrgbDecode srgbDecode = (samplerState.getSRGBDecode() == GL_SKIP_DECODE_EXT)
280*8975f5c5SAndroid Build Coastguard Worker                                         ? gl::SrgbDecode::Skip
281*8975f5c5SAndroid Build Coastguard Worker                                         : gl::SrgbDecode::Default;
282*8975f5c5SAndroid Build Coastguard Worker         mImageView.updateSrgbDecode(*mImage, srgbDecode);
283*8975f5c5SAndroid Build Coastguard Worker         mImageView.updateStaticTexelFetch(*mImage, staticTexelFetchAccess);
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker         if (mImageView.getColorspaceForRead() == vk::ImageViewColorspace::SRGB)
286*8975f5c5SAndroid Build Coastguard Worker         {
287*8975f5c5SAndroid Build Coastguard Worker             ASSERT(getImageViewSubresourceSerialImpl(vk::ImageViewColorspace::SRGB) ==
288*8975f5c5SAndroid Build Coastguard Worker                    mCachedImageViewSubresourceSerialSRGBDecode);
289*8975f5c5SAndroid Build Coastguard Worker             return mCachedImageViewSubresourceSerialSRGBDecode;
290*8975f5c5SAndroid Build Coastguard Worker         }
291*8975f5c5SAndroid Build Coastguard Worker         else
292*8975f5c5SAndroid Build Coastguard Worker         {
293*8975f5c5SAndroid Build Coastguard Worker             ASSERT(getImageViewSubresourceSerialImpl(vk::ImageViewColorspace::Linear) ==
294*8975f5c5SAndroid Build Coastguard Worker                    mCachedImageViewSubresourceSerialSkipDecode);
295*8975f5c5SAndroid Build Coastguard Worker             return mCachedImageViewSubresourceSerialSkipDecode;
296*8975f5c5SAndroid Build Coastguard Worker         }
297*8975f5c5SAndroid Build Coastguard Worker     }
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getBufferViewSerial() const;
300*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getStorageImageViewSerial(
301*8975f5c5SAndroid Build Coastguard Worker         const gl::ImageUnit &binding) const;
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     GLenum getColorReadFormat(const gl::Context *context) override;
304*8975f5c5SAndroid Build Coastguard Worker     GLenum getColorReadType(const gl::Context *context) override;
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     angle::Result getTexImage(const gl::Context *context,
307*8975f5c5SAndroid Build Coastguard Worker                               const gl::PixelPackState &packState,
308*8975f5c5SAndroid Build Coastguard Worker                               gl::Buffer *packBuffer,
309*8975f5c5SAndroid Build Coastguard Worker                               gl::TextureTarget target,
310*8975f5c5SAndroid Build Coastguard Worker                               GLint level,
311*8975f5c5SAndroid Build Coastguard Worker                               GLenum format,
312*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
313*8975f5c5SAndroid Build Coastguard Worker                               void *pixels) override;
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     angle::Result getCompressedTexImage(const gl::Context *context,
316*8975f5c5SAndroid Build Coastguard Worker                                         const gl::PixelPackState &packState,
317*8975f5c5SAndroid Build Coastguard Worker                                         gl::Buffer *packBuffer,
318*8975f5c5SAndroid Build Coastguard Worker                                         gl::TextureTarget target,
319*8975f5c5SAndroid Build Coastguard Worker                                         GLint level,
320*8975f5c5SAndroid Build Coastguard Worker                                         void *pixels) override;
321*8975f5c5SAndroid Build Coastguard Worker 
hasBeenBoundAsImage()322*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool hasBeenBoundAsImage() const { return mState.hasBeenBoundAsImage(); }
getBuffer()323*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE const gl::OffsetBindingPointer<gl::Buffer> &getBuffer() const
324*8975f5c5SAndroid Build Coastguard Worker     {
325*8975f5c5SAndroid Build Coastguard Worker         return mState.getBuffer();
326*8975f5c5SAndroid Build Coastguard Worker     }
327*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *getPossiblyEmulatedTextureBuffer(vk::Context *context) const;
328*8975f5c5SAndroid Build Coastguard Worker 
isSRGBOverrideEnabled()329*8975f5c5SAndroid Build Coastguard Worker     bool isSRGBOverrideEnabled() const
330*8975f5c5SAndroid Build Coastguard Worker     {
331*8975f5c5SAndroid Build Coastguard Worker         return mState.getSRGBOverride() != gl::SrgbOverride::Default;
332*8975f5c5SAndroid Build Coastguard Worker     }
333*8975f5c5SAndroid Build Coastguard Worker 
updateSrgbDecodeState(ContextVk * contextVk,const gl::SamplerState & samplerState)334*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateSrgbDecodeState(ContextVk *contextVk, const gl::SamplerState &samplerState)
335*8975f5c5SAndroid Build Coastguard Worker     {
336*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage != nullptr && mImage->valid());
337*8975f5c5SAndroid Build Coastguard Worker         gl::SrgbDecode srgbDecode = (samplerState.getSRGBDecode() == GL_SKIP_DECODE_EXT)
338*8975f5c5SAndroid Build Coastguard Worker                                         ? gl::SrgbDecode::Skip
339*8975f5c5SAndroid Build Coastguard Worker                                         : gl::SrgbDecode::Default;
340*8975f5c5SAndroid Build Coastguard Worker         mImageView.updateSrgbDecode(*mImage, srgbDecode);
341*8975f5c5SAndroid Build Coastguard Worker         if (mImageView.hasColorspaceOverrideForRead(*mImage))
342*8975f5c5SAndroid Build Coastguard Worker         {
343*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(ensureMutable(contextVk));
344*8975f5c5SAndroid Build Coastguard Worker         }
345*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
346*8975f5c5SAndroid Build Coastguard Worker     }
347*8975f5c5SAndroid Build Coastguard Worker 
348*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureRenderable(ContextVk *contextVk, TextureUpdateResult *updateResultOut);
349*8975f5c5SAndroid Build Coastguard Worker 
getAndResetImmutableSamplerDirtyState()350*8975f5c5SAndroid Build Coastguard Worker     bool getAndResetImmutableSamplerDirtyState()
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         bool isDirty           = mImmutableSamplerDirty;
353*8975f5c5SAndroid Build Coastguard Worker         mImmutableSamplerDirty = false;
354*8975f5c5SAndroid Build Coastguard Worker         return isDirty;
355*8975f5c5SAndroid Build Coastguard Worker     }
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker     angle::Result onLabelUpdate(const gl::Context *context) override;
358*8975f5c5SAndroid Build Coastguard Worker 
onNewDescriptorSet(const vk::SharedDescriptorSetCacheKey & sharedCacheKey)359*8975f5c5SAndroid Build Coastguard Worker     void onNewDescriptorSet(const vk::SharedDescriptorSetCacheKey &sharedCacheKey)
360*8975f5c5SAndroid Build Coastguard Worker     {
361*8975f5c5SAndroid Build Coastguard Worker         mDescriptorSetCacheManager.addKey(sharedCacheKey);
362*8975f5c5SAndroid Build Coastguard Worker     }
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker     // Check if the texture is consistently specified. Used for flushing mutable textures.
365*8975f5c5SAndroid Build Coastguard Worker     bool isMutableTextureConsistentlySpecifiedForFlush();
366*8975f5c5SAndroid Build Coastguard Worker     bool isMipImageDescDefined(gl::TextureTarget textureTarget, size_t level);
367*8975f5c5SAndroid Build Coastguard Worker 
368*8975f5c5SAndroid Build Coastguard Worker     GLint getImageCompressionRate(const gl::Context *context) override;
369*8975f5c5SAndroid Build Coastguard Worker     GLint getFormatSupportedCompressionRates(const gl::Context *context,
370*8975f5c5SAndroid Build Coastguard Worker                                              GLenum internalformat,
371*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei bufSize,
372*8975f5c5SAndroid Build Coastguard Worker                                              GLint *rates) override;
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker   private:
375*8975f5c5SAndroid Build Coastguard Worker     // Transform an image index from the frontend into one that can be used on the backing
376*8975f5c5SAndroid Build Coastguard Worker     // ImageHelper, taking into account mipmap or cube face offsets
377*8975f5c5SAndroid Build Coastguard Worker     gl::ImageIndex getNativeImageIndex(const gl::ImageIndex &inputImageIndex) const;
378*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex getNativeImageLevel(gl::LevelIndex frontendLevel) const;
379*8975f5c5SAndroid Build Coastguard Worker     uint32_t getNativeImageLayer(uint32_t frontendLayer) const;
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     // Get the layer count for views.
382*8975f5c5SAndroid Build Coastguard Worker     uint32_t getImageViewLayerCount() const;
383*8975f5c5SAndroid Build Coastguard Worker     // Get the level count for views.
384*8975f5c5SAndroid Build Coastguard Worker     uint32_t getImageViewLevelCount() const;
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     void releaseAndDeleteImageAndViews(ContextVk *contextVk);
387*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageAllocated(ContextVk *contextVk, const vk::Format &format);
388*8975f5c5SAndroid Build Coastguard Worker     void setImageHelper(ContextVk *contextVk,
389*8975f5c5SAndroid Build Coastguard Worker                         vk::ImageHelper *imageHelper,
390*8975f5c5SAndroid Build Coastguard Worker                         gl::TextureType imageType,
391*8975f5c5SAndroid Build Coastguard Worker                         uint32_t imageLevelOffset,
392*8975f5c5SAndroid Build Coastguard Worker                         uint32_t imageLayerOffset,
393*8975f5c5SAndroid Build Coastguard Worker                         bool selfOwned,
394*8975f5c5SAndroid Build Coastguard Worker                         UniqueSerial siblingSerial);
395*8975f5c5SAndroid Build Coastguard Worker 
getImageViews()396*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper &getImageViews() { return mImageView; }
getImageViews()397*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageViewHelper &getImageViews() const { return mImageView; }
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureRenderableWithFormat(ContextVk *contextVk,
400*8975f5c5SAndroid Build Coastguard Worker                                              const vk::Format &format,
401*8975f5c5SAndroid Build Coastguard Worker                                              TextureUpdateResult *updateResultOut);
402*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureRenderableIfCopyTextureCannotTransfer(ContextVk *contextVk,
403*8975f5c5SAndroid Build Coastguard Worker                                                               const gl::InternalFormat &dstFormat,
404*8975f5c5SAndroid Build Coastguard Worker                                                               bool unpackFlipY,
405*8975f5c5SAndroid Build Coastguard Worker                                                               bool unpackPremultiplyAlpha,
406*8975f5c5SAndroid Build Coastguard Worker                                                               bool unpackUnmultiplyAlpha,
407*8975f5c5SAndroid Build Coastguard Worker                                                               TextureVk *source);
408*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureRenderableIfCopyTexImageCannotTransfer(
409*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
410*8975f5c5SAndroid Build Coastguard Worker         const gl::InternalFormat &internalFormat,
411*8975f5c5SAndroid Build Coastguard Worker         gl::Framebuffer *source);
412*8975f5c5SAndroid Build Coastguard Worker 
413*8975f5c5SAndroid Build Coastguard Worker     // Redefine a mip level of the texture.  If the new size and format don't match the allocated
414*8975f5c5SAndroid Build Coastguard Worker     // image, the image may be released.  When redefining a mip of a multi-level image, updates are
415*8975f5c5SAndroid Build Coastguard Worker     // forced to be staged, as another mip of the image may be bound to a framebuffer.  For example,
416*8975f5c5SAndroid Build Coastguard Worker     // assume texture has two mips, and framebuffer is bound to mip 0.  Redefining mip 1 to an
417*8975f5c5SAndroid Build Coastguard Worker     // incompatible size shouldn't affect the framebuffer, especially if the redefinition comes from
418*8975f5c5SAndroid Build Coastguard Worker     // something like glCopyTexSubImage2D() (which simultaneously is reading from said framebuffer,
419*8975f5c5SAndroid Build Coastguard Worker     // i.e. mip 0 of the texture).
420*8975f5c5SAndroid Build Coastguard Worker     angle::Result redefineLevel(const gl::Context *context,
421*8975f5c5SAndroid Build Coastguard Worker                                 const gl::ImageIndex &index,
422*8975f5c5SAndroid Build Coastguard Worker                                 const vk::Format &format,
423*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Extents &size);
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImageImpl(const gl::Context *context,
426*8975f5c5SAndroid Build Coastguard Worker                                const gl::ImageIndex &index,
427*8975f5c5SAndroid Build Coastguard Worker                                const gl::InternalFormat &formatInfo,
428*8975f5c5SAndroid Build Coastguard Worker                                const gl::Extents &size,
429*8975f5c5SAndroid Build Coastguard Worker                                GLenum type,
430*8975f5c5SAndroid Build Coastguard Worker                                const gl::PixelUnpackState &unpack,
431*8975f5c5SAndroid Build Coastguard Worker                                gl::Buffer *unpackBuffer,
432*8975f5c5SAndroid Build Coastguard Worker                                const uint8_t *pixels);
433*8975f5c5SAndroid Build Coastguard Worker     angle::Result setSubImageImpl(const gl::Context *context,
434*8975f5c5SAndroid Build Coastguard Worker                                   const gl::ImageIndex &index,
435*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Box &area,
436*8975f5c5SAndroid Build Coastguard Worker                                   const gl::InternalFormat &formatInfo,
437*8975f5c5SAndroid Build Coastguard Worker                                   GLenum type,
438*8975f5c5SAndroid Build Coastguard Worker                                   const gl::PixelUnpackState &unpack,
439*8975f5c5SAndroid Build Coastguard Worker                                   gl::Buffer *unpackBuffer,
440*8975f5c5SAndroid Build Coastguard Worker                                   const uint8_t *pixels,
441*8975f5c5SAndroid Build Coastguard Worker                                   const vk::Format &vkFormat);
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker     // Used to clear a texture to a given value in part or whole.
444*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearSubImageImpl(const gl::Context *context,
445*8975f5c5SAndroid Build Coastguard Worker                                     GLint level,
446*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Box &clearArea,
447*8975f5c5SAndroid Build Coastguard Worker                                     vk::ClearTextureMode clearMode,
448*8975f5c5SAndroid Build Coastguard Worker                                     GLenum format,
449*8975f5c5SAndroid Build Coastguard Worker                                     GLenum type,
450*8975f5c5SAndroid Build Coastguard Worker                                     const uint8_t *data);
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageInitializedIfUpdatesNeedStageOrFlush(ContextVk *contextVk,
453*8975f5c5SAndroid Build Coastguard Worker                                                                   gl::LevelIndex level,
454*8975f5c5SAndroid Build Coastguard Worker                                                                   const vk::Format &vkFormat,
455*8975f5c5SAndroid Build Coastguard Worker                                                                   vk::ApplyImageUpdate applyUpdate,
456*8975f5c5SAndroid Build Coastguard Worker                                                                   bool usesBufferForUpdate);
457*8975f5c5SAndroid Build Coastguard Worker 
458*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImageDataToBufferAndGetData(ContextVk *contextVk,
459*8975f5c5SAndroid Build Coastguard Worker                                                   gl::LevelIndex sourceLevelGL,
460*8975f5c5SAndroid Build Coastguard Worker                                                   uint32_t layerCount,
461*8975f5c5SAndroid Build Coastguard Worker                                                   const gl::Box &sourceArea,
462*8975f5c5SAndroid Build Coastguard Worker                                                   RenderPassClosureReason reason,
463*8975f5c5SAndroid Build Coastguard Worker                                                   vk::BufferHelper *copyBuffer,
464*8975f5c5SAndroid Build Coastguard Worker                                                   uint8_t **outDataPtr);
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyBufferDataToImage(ContextVk *contextVk,
467*8975f5c5SAndroid Build Coastguard Worker                                         vk::BufferHelper *srcBuffer,
468*8975f5c5SAndroid Build Coastguard Worker                                         const gl::ImageIndex index,
469*8975f5c5SAndroid Build Coastguard Worker                                         uint32_t rowLength,
470*8975f5c5SAndroid Build Coastguard Worker                                         uint32_t imageHeight,
471*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Box &sourceArea,
472*8975f5c5SAndroid Build Coastguard Worker                                         size_t offset,
473*8975f5c5SAndroid Build Coastguard Worker                                         VkImageAspectFlags aspectFlags);
474*8975f5c5SAndroid Build Coastguard Worker 
475*8975f5c5SAndroid Build Coastguard Worker     // Called from syncState to prepare the image for mipmap generation.
476*8975f5c5SAndroid Build Coastguard Worker     void prepareForGenerateMipmap(ContextVk *contextVk);
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps from level 0 into the rest of the mips.  This requires the image to have
479*8975f5c5SAndroid Build Coastguard Worker     // STORAGE usage.
480*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmapsWithCompute(ContextVk *contextVk);
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmapsWithCPU(const gl::Context *context);
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmapLevelsWithCPU(ContextVk *contextVk,
485*8975f5c5SAndroid Build Coastguard Worker                                               const angle::Format &sourceFormat,
486*8975f5c5SAndroid Build Coastguard Worker                                               GLuint layer,
487*8975f5c5SAndroid Build Coastguard Worker                                               gl::LevelIndex firstMipLevel,
488*8975f5c5SAndroid Build Coastguard Worker                                               gl::LevelIndex maxMipLevel,
489*8975f5c5SAndroid Build Coastguard Worker                                               const size_t sourceWidth,
490*8975f5c5SAndroid Build Coastguard Worker                                               const size_t sourceHeight,
491*8975f5c5SAndroid Build Coastguard Worker                                               const size_t sourceDepth,
492*8975f5c5SAndroid Build Coastguard Worker                                               const size_t sourceRowPitch,
493*8975f5c5SAndroid Build Coastguard Worker                                               const size_t sourceDepthPitch,
494*8975f5c5SAndroid Build Coastguard Worker                                               uint8_t *sourceData);
495*8975f5c5SAndroid Build Coastguard Worker 
496*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubImageImpl(const gl::Context *context,
497*8975f5c5SAndroid Build Coastguard Worker                                    const gl::ImageIndex &index,
498*8975f5c5SAndroid Build Coastguard Worker                                    const gl::Offset &destOffset,
499*8975f5c5SAndroid Build Coastguard Worker                                    const gl::Rectangle &sourceArea,
500*8975f5c5SAndroid Build Coastguard Worker                                    const gl::InternalFormat &internalFormat,
501*8975f5c5SAndroid Build Coastguard Worker                                    gl::Framebuffer *source);
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubTextureImpl(ContextVk *contextVk,
504*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &index,
505*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Offset &dstOffset,
506*8975f5c5SAndroid Build Coastguard Worker                                      const gl::InternalFormat &dstFormat,
507*8975f5c5SAndroid Build Coastguard Worker                                      gl::LevelIndex sourceLevelGL,
508*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Box &sourceBox,
509*8975f5c5SAndroid Build Coastguard Worker                                      bool unpackFlipY,
510*8975f5c5SAndroid Build Coastguard Worker                                      bool unpackPremultiplyAlpha,
511*8975f5c5SAndroid Build Coastguard Worker                                      bool unpackUnmultiplyAlpha,
512*8975f5c5SAndroid Build Coastguard Worker                                      TextureVk *source);
513*8975f5c5SAndroid Build Coastguard Worker 
514*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubImageImplWithTransfer(ContextVk *contextVk,
515*8975f5c5SAndroid Build Coastguard Worker                                                const gl::ImageIndex &index,
516*8975f5c5SAndroid Build Coastguard Worker                                                const gl::Offset &dstOffset,
517*8975f5c5SAndroid Build Coastguard Worker                                                const vk::Format &dstFormat,
518*8975f5c5SAndroid Build Coastguard Worker                                                gl::LevelIndex sourceLevelGL,
519*8975f5c5SAndroid Build Coastguard Worker                                                size_t sourceLayer,
520*8975f5c5SAndroid Build Coastguard Worker                                                const gl::Box &sourceBox,
521*8975f5c5SAndroid Build Coastguard Worker                                                vk::ImageHelper *srcImage);
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubImageImplWithDraw(ContextVk *contextVk,
524*8975f5c5SAndroid Build Coastguard Worker                                            const gl::ImageIndex &index,
525*8975f5c5SAndroid Build Coastguard Worker                                            const gl::Offset &dstOffset,
526*8975f5c5SAndroid Build Coastguard Worker                                            const vk::Format &dstFormat,
527*8975f5c5SAndroid Build Coastguard Worker                                            gl::LevelIndex sourceLevelGL,
528*8975f5c5SAndroid Build Coastguard Worker                                            const gl::Box &sourceBox,
529*8975f5c5SAndroid Build Coastguard Worker                                            bool isSrcFlipY,
530*8975f5c5SAndroid Build Coastguard Worker                                            bool unpackFlipY,
531*8975f5c5SAndroid Build Coastguard Worker                                            bool unpackPremultiplyAlpha,
532*8975f5c5SAndroid Build Coastguard Worker                                            bool unpackUnmultiplyAlpha,
533*8975f5c5SAndroid Build Coastguard Worker                                            vk::ImageHelper *srcImage,
534*8975f5c5SAndroid Build Coastguard Worker                                            const vk::ImageView *srcView,
535*8975f5c5SAndroid Build Coastguard Worker                                            SurfaceRotation srcFramebufferRotation);
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     angle::Result initImage(ContextVk *contextVk,
538*8975f5c5SAndroid Build Coastguard Worker                             angle::FormatID intendedImageFormatID,
539*8975f5c5SAndroid Build Coastguard Worker                             angle::FormatID actualImageFormatID,
540*8975f5c5SAndroid Build Coastguard Worker                             ImageMipLevels mipLevels);
541*8975f5c5SAndroid Build Coastguard Worker     void releaseImage(ContextVk *contextVk);
542*8975f5c5SAndroid Build Coastguard Worker     void releaseImageViews(ContextVk *contextVk);
543*8975f5c5SAndroid Build Coastguard Worker     void releaseStagedUpdates(ContextVk *contextVk);
544*8975f5c5SAndroid Build Coastguard Worker     uint32_t getMipLevelCount(ImageMipLevels mipLevels) const;
545*8975f5c5SAndroid Build Coastguard Worker     uint32_t getMaxLevelCount() const;
546*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyAndStageImageData(ContextVk *contextVk,
547*8975f5c5SAndroid Build Coastguard Worker                                         gl::LevelIndex previousFirstAllocateLevel,
548*8975f5c5SAndroid Build Coastguard Worker                                         vk::ImageHelper *srcImage,
549*8975f5c5SAndroid Build Coastguard Worker                                         vk::ImageHelper *dstImage);
550*8975f5c5SAndroid Build Coastguard Worker     angle::Result reinitImageAsRenderable(ContextVk *contextVk, const vk::Format &format);
551*8975f5c5SAndroid Build Coastguard Worker     angle::Result initImageViews(ContextVk *contextVk, uint32_t levelCount);
552*8975f5c5SAndroid Build Coastguard Worker     void initSingleLayerRenderTargets(ContextVk *contextVk,
553*8975f5c5SAndroid Build Coastguard Worker                                       GLuint layerCount,
554*8975f5c5SAndroid Build Coastguard Worker                                       gl::LevelIndex levelIndexGL,
555*8975f5c5SAndroid Build Coastguard Worker                                       gl::RenderToTextureImageIndex renderToTextureIndex);
556*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk *getMultiLayerRenderTarget(ContextVk *contextVk,
557*8975f5c5SAndroid Build Coastguard Worker                                               gl::LevelIndex level,
558*8975f5c5SAndroid Build Coastguard Worker                                               GLuint layerIndex,
559*8975f5c5SAndroid Build Coastguard Worker                                               GLuint layerCount);
560*8975f5c5SAndroid Build Coastguard Worker     angle::Result getLevelLayerImageView(vk::Context *context,
561*8975f5c5SAndroid Build Coastguard Worker                                          gl::LevelIndex levelGL,
562*8975f5c5SAndroid Build Coastguard Worker                                          size_t layer,
563*8975f5c5SAndroid Build Coastguard Worker                                          const vk::ImageView **imageViewOut);
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     // Flush image's staged updates for all levels and layers.
566*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushImageStagedUpdates(ContextVk *contextVk);
567*8975f5c5SAndroid Build Coastguard Worker 
568*8975f5c5SAndroid Build Coastguard Worker     angle::Result performImageQueueTransferIfNecessary(ContextVk *contextVk);
569*8975f5c5SAndroid Build Coastguard Worker 
570*8975f5c5SAndroid Build Coastguard Worker     // For various reasons, the underlying image may need to be respecified.  For example because
571*8975f5c5SAndroid Build Coastguard Worker     // base/max level changed, usage/create flags have changed, the format needs modification to
572*8975f5c5SAndroid Build Coastguard Worker     // become renderable, generate mipmap is adding levels, etc.  This function is called by
573*8975f5c5SAndroid Build Coastguard Worker     // syncState and getAttachmentRenderTarget.  The latter calls this function to be able to sync
574*8975f5c5SAndroid Build Coastguard Worker     // the texture's image while an attached framebuffer is being synced.  Note that we currently
575*8975f5c5SAndroid Build Coastguard Worker     // sync framebuffers before textures so that the deferred clear optimization works.
576*8975f5c5SAndroid Build Coastguard Worker     angle::Result respecifyImageStorageIfNecessary(ContextVk *contextVk, gl::Command source);
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &getImplementationSizedFormat(const gl::Context *context) const;
579*8975f5c5SAndroid Build Coastguard Worker     const vk::Format &getBaseLevelFormat(vk::Renderer *renderer) const;
580*8975f5c5SAndroid Build Coastguard Worker     // Queues a flush of any modified image attributes. The image will be reallocated with its new
581*8975f5c5SAndroid Build Coastguard Worker     // attributes at the next opportunity.
582*8975f5c5SAndroid Build Coastguard Worker     angle::Result respecifyImageStorage(ContextVk *contextVk);
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker     // Update base and max levels, and re-create image if needed.
585*8975f5c5SAndroid Build Coastguard Worker     angle::Result maybeUpdateBaseMaxLevels(ContextVk *contextVk,
586*8975f5c5SAndroid Build Coastguard Worker                                            TextureUpdateResult *changeResultOut);
587*8975f5c5SAndroid Build Coastguard Worker 
588*8975f5c5SAndroid Build Coastguard Worker     bool isFastUnpackPossible(const vk::Format &vkFormat,
589*8975f5c5SAndroid Build Coastguard Worker                               size_t offset,
590*8975f5c5SAndroid Build Coastguard Worker                               const vk::Format &bufferVkFormat) const;
591*8975f5c5SAndroid Build Coastguard Worker 
592*8975f5c5SAndroid Build Coastguard Worker     bool updateMustBeStaged(gl::LevelIndex textureLevelIndexGL, angle::FormatID dstFormatID) const;
593*8975f5c5SAndroid Build Coastguard Worker     bool updateMustBeFlushed(gl::LevelIndex textureLevelIndexGL, angle::FormatID dstFormatID) const;
shouldUpdateBeFlushed(gl::LevelIndex textureLevelIndexGL,angle::FormatID dstFormatID)594*8975f5c5SAndroid Build Coastguard Worker     bool shouldUpdateBeFlushed(gl::LevelIndex textureLevelIndexGL,
595*8975f5c5SAndroid Build Coastguard Worker                                angle::FormatID dstFormatID) const
596*8975f5c5SAndroid Build Coastguard Worker     {
597*8975f5c5SAndroid Build Coastguard Worker         return updateMustBeFlushed(textureLevelIndexGL, dstFormatID) ||
598*8975f5c5SAndroid Build Coastguard Worker                !updateMustBeStaged(textureLevelIndexGL, dstFormatID);
599*8975f5c5SAndroid Build Coastguard Worker     }
600*8975f5c5SAndroid Build Coastguard Worker 
601*8975f5c5SAndroid Build Coastguard Worker     // We monitor the staging buffer and set dirty bits if the staging buffer changes. Note that we
602*8975f5c5SAndroid Build Coastguard Worker     // support changes in the staging buffer even outside the TextureVk class.
603*8975f5c5SAndroid Build Coastguard Worker     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
604*8975f5c5SAndroid Build Coastguard Worker 
getTilingMode()605*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE VkImageTiling getTilingMode()
606*8975f5c5SAndroid Build Coastguard Worker     {
607*8975f5c5SAndroid Build Coastguard Worker         return mImage != nullptr && mImage->valid() ? mImage->getTilingMode()
608*8975f5c5SAndroid Build Coastguard Worker                                                     : VK_IMAGE_TILING_OPTIMAL;
609*8975f5c5SAndroid Build Coastguard Worker     }
610*8975f5c5SAndroid Build Coastguard Worker 
611*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureMutable(ContextVk *contextVk);
612*8975f5c5SAndroid Build Coastguard Worker     angle::Result refreshImageViews(ContextVk *contextVk);
613*8975f5c5SAndroid Build Coastguard Worker     void initImageUsageFlags(ContextVk *contextVk, angle::FormatID actualFormatID);
614*8975f5c5SAndroid Build Coastguard Worker     void handleImmutableSamplerTransition(const vk::ImageHelper *previousImage,
615*8975f5c5SAndroid Build Coastguard Worker                                           const vk::ImageHelper *nextImage);
616*8975f5c5SAndroid Build Coastguard Worker 
getRequiredImageAccess()617*8975f5c5SAndroid Build Coastguard Worker     vk::ImageAccess getRequiredImageAccess() const { return mRequiredImageAccess; }
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker     void stageSelfAsSubresourceUpdates(ContextVk *contextVk);
620*8975f5c5SAndroid Build Coastguard Worker 
621*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getImageViewSubresourceSerialImpl(
622*8975f5c5SAndroid Build Coastguard Worker         vk::ImageViewColorspace colorspace) const;
623*8975f5c5SAndroid Build Coastguard Worker 
624*8975f5c5SAndroid Build Coastguard Worker     void updateCachedImageViewSerials();
625*8975f5c5SAndroid Build Coastguard Worker 
626*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateTextureLabel(ContextVk *contextVk);
627*8975f5c5SAndroid Build Coastguard Worker 
628*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *getRGBAConversionBufferHelper(vk::Renderer *renderer,
629*8975f5c5SAndroid Build Coastguard Worker                                                     angle::FormatID formatID) const;
630*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertBufferToRGBA(ContextVk *contextVk, size_t &conversionBufferSize);
631*8975f5c5SAndroid Build Coastguard Worker     bool isCompressedFormatEmulated(const gl::Context *context,
632*8975f5c5SAndroid Build Coastguard Worker                                     const gl::TextureTarget target,
633*8975f5c5SAndroid Build Coastguard Worker                                     GLint level);
634*8975f5c5SAndroid Build Coastguard Worker 
635*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageImpl(ContextVk *contextVk,
636*8975f5c5SAndroid Build Coastguard Worker                                  gl::TextureType type,
637*8975f5c5SAndroid Build Coastguard Worker                                  const vk::Format &format);
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker     GLint getFormatSupportedCompressionRatesImpl(vk::Renderer *renderer,
640*8975f5c5SAndroid Build Coastguard Worker                                                  const vk::Format &format,
641*8975f5c5SAndroid Build Coastguard Worker                                                  GLsizei bufSize,
642*8975f5c5SAndroid Build Coastguard Worker                                                  GLint *rates);
643*8975f5c5SAndroid Build Coastguard Worker 
644*8975f5c5SAndroid Build Coastguard Worker     bool mOwnsImage;
645*8975f5c5SAndroid Build Coastguard Worker     // Generated from ImageVk if EGLImage target, or from throw-away generator if Surface target.
646*8975f5c5SAndroid Build Coastguard Worker     UniqueSerial mImageSiblingSerial;
647*8975f5c5SAndroid Build Coastguard Worker 
648*8975f5c5SAndroid Build Coastguard Worker     bool mRequiresMutableStorage;
649*8975f5c5SAndroid Build Coastguard Worker     vk::ImageAccess mRequiredImageAccess;
650*8975f5c5SAndroid Build Coastguard Worker     bool mImmutableSamplerDirty;
651*8975f5c5SAndroid Build Coastguard Worker 
652*8975f5c5SAndroid Build Coastguard Worker     // Only valid if this texture is an "EGLImage target" and the associated EGL Image was
653*8975f5c5SAndroid Build Coastguard Worker     // originally sourced from an OpenGL texture. Such EGL Images can be a slice of the underlying
654*8975f5c5SAndroid Build Coastguard Worker     // resource. The layer and level offsets are used to track the location of the slice.
655*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType mEGLImageNativeType;
656*8975f5c5SAndroid Build Coastguard Worker     uint32_t mEGLImageLayerOffset;
657*8975f5c5SAndroid Build Coastguard Worker     uint32_t mEGLImageLevelOffset;
658*8975f5c5SAndroid Build Coastguard Worker 
659*8975f5c5SAndroid Build Coastguard Worker     // If multisampled rendering to texture, an intermediate multisampled image is created for use
660*8975f5c5SAndroid Build Coastguard Worker     // as renderpass color attachment. A map of an array of images and image views are used where -
661*8975f5c5SAndroid Build Coastguard Worker     //
662*8975f5c5SAndroid Build Coastguard Worker     // The map is keyed based on the number of samples used with multisampled rendering to texture.
663*8975f5c5SAndroid Build Coastguard Worker     // Index 0 corresponds to the non-multisampled-render-to-texture usage of the texture.
664*8975f5c5SAndroid Build Coastguard Worker     // - index 0: Unused.  See description of |mImage|.
665*8975f5c5SAndroid Build Coastguard Worker     // - index N: intermediate multisampled image used for multisampled rendering to texture with
666*8975f5c5SAndroid Build Coastguard Worker     //            1 << N samples
667*8975f5c5SAndroid Build Coastguard Worker     //
668*8975f5c5SAndroid Build Coastguard Worker     // Each element in the array corresponds to a mip-level
669*8975f5c5SAndroid Build Coastguard Worker     //
670*8975f5c5SAndroid Build Coastguard Worker     // - mMultisampledImages[N][M]: intermediate multisampled image with 1 << N samples
671*8975f5c5SAndroid Build Coastguard Worker     //                              for level index M
672*8975f5c5SAndroid Build Coastguard Worker     using MultiSampleImages = gl::RenderToTextureImageMap<gl::TexLevelArray<vk::ImageHelper>>;
673*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<MultiSampleImages> mMultisampledImages;
674*8975f5c5SAndroid Build Coastguard Worker 
675*8975f5c5SAndroid Build Coastguard Worker     // If multisampled rendering to texture, contains views for mMultisampledImages.
676*8975f5c5SAndroid Build Coastguard Worker     //
677*8975f5c5SAndroid Build Coastguard Worker     // - index 0: Unused.  See description of |mImageView|.
678*8975f5c5SAndroid Build Coastguard Worker     // - mMultisampledImageViews[N][M]: views for mMultisampledImages[N][M]
679*8975f5c5SAndroid Build Coastguard Worker     using MultiSampleImageViews =
680*8975f5c5SAndroid Build Coastguard Worker         gl::RenderToTextureImageMap<gl::TexLevelArray<vk::ImageViewHelper>>;
681*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<MultiSampleImageViews> mMultisampledImageViews;
682*8975f5c5SAndroid Build Coastguard Worker 
683*8975f5c5SAndroid Build Coastguard Worker     // Texture buffers create texel buffer views instead.  |BufferViewHelper| contains the views
684*8975f5c5SAndroid Build Coastguard Worker     // corresponding to the attached buffer range.
685*8975f5c5SAndroid Build Coastguard Worker     vk::BufferViewHelper mBufferViews;
686*8975f5c5SAndroid Build Coastguard Worker 
687*8975f5c5SAndroid Build Coastguard Worker     // Render targets stored as array of vector of vectors
688*8975f5c5SAndroid Build Coastguard Worker     //
689*8975f5c5SAndroid Build Coastguard Worker     // - First dimension: index N contains render targets with views from mMultisampledImageViews[N]
690*8975f5c5SAndroid Build Coastguard Worker     // - Second dimension: level M contains render targets with views from
691*8975f5c5SAndroid Build Coastguard Worker     // mMultisampledImageViews[N][M]
692*8975f5c5SAndroid Build Coastguard Worker     // - Third dimension: layer
693*8975f5c5SAndroid Build Coastguard Worker     gl::RenderToTextureImageMap<std::vector<RenderTargetVector>> mSingleLayerRenderTargets;
694*8975f5c5SAndroid Build Coastguard Worker     // Multi-layer render targets stored as a hash map.  This is used for layered attachments
695*8975f5c5SAndroid Build Coastguard Worker     // which covers the entire layer (glFramebufferTextureLayer) or multiview attachments which
696*8975f5c5SAndroid Build Coastguard Worker     // cover a range of layers (glFramebufferTextureMultiviewOVR).
697*8975f5c5SAndroid Build Coastguard Worker     angle::HashMap<vk::ImageSubresourceRange, std::unique_ptr<RenderTargetVk>>
698*8975f5c5SAndroid Build Coastguard Worker         mMultiLayerRenderTargets;
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker     // |mImage| wraps a VkImage and VkDeviceMemory that represents the gl::Texture. |mOwnsImage|
701*8975f5c5SAndroid Build Coastguard Worker     // indicates that |TextureVk| owns the image. Otherwise it is a weak pointer shared with another
702*8975f5c5SAndroid Build Coastguard Worker     // class. Due to this sharing, for example through EGL images, the image must always be
703*8975f5c5SAndroid Build Coastguard Worker     // dynamically allocated as the texture can release ownership for example and it can be
704*8975f5c5SAndroid Build Coastguard Worker     // transferred to another |TextureVk|.
705*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *mImage;
706*8975f5c5SAndroid Build Coastguard Worker     // The view is always owned by the Texture and is not shared like |mImage|. It also has
707*8975f5c5SAndroid Build Coastguard Worker     // different lifetimes and can be reallocated independently of |mImage| on state changes.
708*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper mImageView;
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     // |mSampler| contains the relevant Vulkan sampler states representing the OpenGL Texture
711*8975f5c5SAndroid Build Coastguard Worker     // sampling states for the Texture.
712*8975f5c5SAndroid Build Coastguard Worker     vk::SharedSamplerPtr mSampler;
713*8975f5c5SAndroid Build Coastguard Worker     // |mY2YSampler| contains a version of mSampler that is meant for use with
714*8975f5c5SAndroid Build Coastguard Worker     // __samplerExternal2DY2YEXT (i.e., skipping conversion of YUV to RGB).
715*8975f5c5SAndroid Build Coastguard Worker     vk::SharedSamplerPtr mY2YSampler;
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker     // The created vkImage usage flag.
718*8975f5c5SAndroid Build Coastguard Worker     VkImageUsageFlags mImageUsageFlags;
719*8975f5c5SAndroid Build Coastguard Worker 
720*8975f5c5SAndroid Build Coastguard Worker     // Additional image create flags
721*8975f5c5SAndroid Build Coastguard Worker     VkImageCreateFlags mImageCreateFlags;
722*8975f5c5SAndroid Build Coastguard Worker 
723*8975f5c5SAndroid Build Coastguard Worker     // If an image level is incompatibly redefined, the image lives through the call that did this
724*8975f5c5SAndroid Build Coastguard Worker     // (i.e. set and copy levels), because the image may be used by the framebuffer in the very same
725*8975f5c5SAndroid Build Coastguard Worker     // call.  As a result, updates to this redefined level are staged (in both the call that
726*8975f5c5SAndroid Build Coastguard Worker     // redefines it, and any future calls such as subimage updates).  This array flags redefined
727*8975f5c5SAndroid Build Coastguard Worker     // levels so that their updates will be force-staged until image is recreated.  Each member of
728*8975f5c5SAndroid Build Coastguard Worker     // the array is a bitmask per level, and it's an array of cube faces because GL allows
729*8975f5c5SAndroid Build Coastguard Worker     // redefining each cube map face separately.  For other texture types, only index 0 is
730*8975f5c5SAndroid Build Coastguard Worker     // meaningful as all array levels are redefined simultaneously.
731*8975f5c5SAndroid Build Coastguard Worker     //
732*8975f5c5SAndroid Build Coastguard Worker     // In common cases with mipmapped textures, the base/max level would need adjusting as the
733*8975f5c5SAndroid Build Coastguard Worker     // texture is no longer mip-complete.  However, if every level is redefined such that at the end
734*8975f5c5SAndroid Build Coastguard Worker     // the image becomes mip-complete again, no reinitialization of the image is done.  This array
735*8975f5c5SAndroid Build Coastguard Worker     // is additionally used to ensure the image is recreated in the next syncState, if not already.
736*8975f5c5SAndroid Build Coastguard Worker     //
737*8975f5c5SAndroid Build Coastguard Worker     // Note: the elements of this array are bitmasks indexed by gl::LevelIndex, not vk::LevelIndex
738*8975f5c5SAndroid Build Coastguard Worker     gl::CubeFaceArray<gl::TexLevelMask> mRedefinedLevels;
739*8975f5c5SAndroid Build Coastguard Worker 
740*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mImageObserverBinding;
741*8975f5c5SAndroid Build Coastguard Worker 
742*8975f5c5SAndroid Build Coastguard Worker     // Saved between updates.
743*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex mCurrentBaseLevel;
744*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex mCurrentMaxLevel;
745*8975f5c5SAndroid Build Coastguard Worker 
746*8975f5c5SAndroid Build Coastguard Worker     // Cached subresource indexes.
747*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial mCachedImageViewSubresourceSerialSRGBDecode;
748*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial mCachedImageViewSubresourceSerialSkipDecode;
749*8975f5c5SAndroid Build Coastguard Worker 
750*8975f5c5SAndroid Build Coastguard Worker     // Manages the texture descriptor set cache that created with this texture
751*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetCacheManager mDescriptorSetCacheManager;
752*8975f5c5SAndroid Build Coastguard Worker };
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
755*8975f5c5SAndroid Build Coastguard Worker 
756*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_TEXTUREVK_H_
757