Edit

kc3-lang/angle/src/libANGLE/Image.h

Branch :

  • Show log

    Commit

  • Author : Frank Henigman
    Date : 2017-05-03 23:32:29
    Hash : aa7203ef
    Message : Inherit privately from angle::NonCopyable. Make all inheritance from angle::NonCopyable private so the compiler complains about this (admittedly unlikely) code: class Foo: angle::NonCopyable { virtual ~Foo() { ... } }; angle::NonCopyable *p = new Foo; delete p; In the above code ~Foo() is not called, only ~NonCopyable(), because the latter is not virtual. Making it virtual would add overhead to all derived classes which don't already have a virtual method. Also tighten access in NonCopyable, because we can. BUG=angleproject:2026 Change-Id: Id0dc4d959cfb7bb82cf49382118129abb1d3a4f0 Reviewed-on: https://chromium-review.googlesource.com/495352 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Frank Henigman <fjhenigman@chromium.org>

  • src/libANGLE/Image.h
  • //
    // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // Image.h: Defines the egl::Image class representing the EGLimage object.
    
    #ifndef LIBANGLE_IMAGE_H_
    #define LIBANGLE_IMAGE_H_
    
    #include "common/angleutils.h"
    #include "libANGLE/AttributeMap.h"
    #include "libANGLE/Error.h"
    #include "libANGLE/FramebufferAttachment.h"
    #include "libANGLE/RefCountObject.h"
    #include "libANGLE/formatutils.h"
    
    #include <set>
    
    namespace rx
    {
    class EGLImplFactory;
    class ImageImpl;
    }
    
    namespace egl
    {
    class Image;
    
    // Only currently Renderbuffers and Textures can be bound with images. This makes the relationship
    // explicit, and also ensures that an image sibling can determine if it's been initialized or not,
    // which is important for the robust resource init extension with Textures and EGLImages.
    class ImageSibling : public RefCountObject, public gl::FramebufferAttachmentObject
    {
      public:
        ImageSibling(GLuint id);
        virtual ~ImageSibling();
    
      protected:
        // Set the image target of this sibling
        void setTargetImage(egl::Image *imageTarget);
    
        // Orphan all EGL image sources and targets
        gl::Error orphanImages();
    
      private:
        friend class Image;
    
        // Called from Image only to add a new source image
        void addImageSource(egl::Image *imageSource);
    
        // Called from Image only to remove a source image when the Image is being deleted
        void removeImageSource(egl::Image *imageSource);
    
        std::set<Image *> mSourcesOf;
        BindingPointer<Image> mTargetOf;
    };
    
    struct ImageState : private angle::NonCopyable
    {
        ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap &attribs);
    
        gl::ImageIndex imageIndex;
        BindingPointer<ImageSibling> source;
        std::set<ImageSibling *> targets;
    };
    
    class Image final : public RefCountObject
    {
      public:
        Image(rx::EGLImplFactory *factory,
              EGLenum target,
              ImageSibling *buffer,
              const AttributeMap &attribs);
        ~Image();
    
        const gl::Format &getFormat() const;
        size_t getWidth() const;
        size_t getHeight() const;
        size_t getSamples() const;
    
        Error initialize();
    
        rx::ImageImpl *getImplementation() const;
    
      private:
        friend class ImageSibling;
    
        // Called from ImageSibling only notify the image that a new target sibling exists for state
        // tracking.
        void addTargetSibling(ImageSibling *sibling);
    
        // Called from ImageSibling only to notify the image that a sibling (source or target) has
        // been respecified and state tracking should be updated.
        gl::Error orphanSibling(ImageSibling *sibling);
    
        ImageState mState;
        rx::ImageImpl *mImplementation;
    };
    }  // namespace egl
    
    #endif  // LIBANGLE_IMAGE_H_