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