1 // 2 // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // ImageMtl.h: 7 // Defines the class interface for ImageMtl, implementing ImageImpl. 8 // 9 10 #ifndef LIBANGLE_RENDERER_METAL_IMAGEMTL_H 11 #define LIBANGLE_RENDERER_METAL_IMAGEMTL_H 12 13 #include "libANGLE/renderer/ImageImpl.h" 14 #include "libANGLE/renderer/metal/mtl_resources.h" 15 16 namespace rx 17 { 18 19 class DisplayMtl; 20 21 class TextureImageSiblingMtl : public ExternalImageSiblingImpl 22 { 23 public: 24 TextureImageSiblingMtl(EGLClientBuffer buffer); 25 ~TextureImageSiblingMtl() override; 26 27 static bool ValidateClientBuffer(const DisplayMtl *display, EGLClientBuffer buffer); 28 29 egl::Error initialize(const egl::Display *display) override; 30 void onDestroy(const egl::Display *display) override; 31 32 // ExternalImageSiblingImpl interface 33 gl::Format getFormat() const override; 34 bool isRenderable(const gl::Context *context) const override; 35 bool isTexturable(const gl::Context *context) const override; 36 gl::Extents getSize() const override; 37 size_t getSamples() const override; 38 39 bool isYUV() const override; 40 bool hasProtectedContent() const override; 41 getTexture()42 const mtl::TextureRef &getTexture() const { return mNativeTexture; } getFormatMtl()43 const mtl::Format &getFormatMtl() const { return mFormat; } 44 45 private: 46 angle::Result initImpl(DisplayMtl *display); 47 48 EGLClientBuffer mBuffer; 49 gl::Format mGLFormat; 50 mtl::Format mFormat; 51 52 bool mRenderable = false; 53 bool mTextureable = false; 54 55 mtl::TextureRef mNativeTexture; 56 }; 57 58 class ImageMtl : public ImageImpl 59 { 60 public: 61 ImageMtl(const egl::ImageState &state, const gl::Context *context); 62 ~ImageMtl() override; 63 void onDestroy(const egl::Display *display) override; 64 65 egl::Error initialize(const egl::Display *display) override; 66 67 angle::Result orphan(const gl::Context *context, egl::ImageSibling *sibling) override; 68 getTexture()69 const mtl::TextureRef &getTexture() const { return mNativeTexture; } getImageTextureType()70 gl::TextureType getImageTextureType() const { return mImageTextureType; } getImageLevel()71 uint32_t getImageLevel() const { return mImageLevel; } getImageLayer()72 uint32_t getImageLayer() const { return mImageLayer; } 73 74 private: 75 gl::TextureType mImageTextureType; 76 uint32_t mImageLevel = 0; 77 uint32_t mImageLayer = 0; 78 79 mtl::TextureRef mNativeTexture; 80 }; 81 } // namespace rx 82 83 #endif /* LIBANGLE_RENDERER_METAL_IMAGEMTL_H */ 84