Edit

kc3-lang/angle/src/libANGLE/Surface.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/Surface.h
  • //
    // Copyright (c) 2002-2014 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.
    //
    
    // Surface.h: Defines the egl::Surface class, representing a drawing surface
    // such as the client area of a window, including any back buffers.
    // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
    
    #ifndef LIBANGLE_SURFACE_H_
    #define LIBANGLE_SURFACE_H_
    
    #include <EGL/egl.h>
    
    #include "common/angleutils.h"
    #include "libANGLE/Error.h"
    #include "libANGLE/FramebufferAttachment.h"
    #include "libANGLE/RefCountObject.h"
    #include "libANGLE/formatutils.h"
    #include "libANGLE/renderer/SurfaceImpl.h"
    
    namespace gl
    {
    class Framebuffer;
    class Texture;
    }
    
    namespace rx
    {
    class EGLImplFactory;
    }
    
    namespace egl
    {
    class AttributeMap;
    class Display;
    struct Config;
    
    struct SurfaceState final : private angle::NonCopyable
    {
        SurfaceState(const egl::Config *configIn);
    
        gl::Framebuffer *defaultFramebuffer;
        const egl::Config *config;
    };
    
    class Surface : public gl::FramebufferAttachmentObject
    {
      public:
        virtual ~Surface();
    
        rx::SurfaceImpl *getImplementation() const { return mImplementation; }
    
        EGLint getType() const;
    
        Error initialize(const Display &display);
        Error swap(const Display &display);
        Error swapWithDamage(EGLint *rects, EGLint n_rects);
        Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
        Error querySurfacePointerANGLE(EGLint attribute, void **value);
        Error bindTexImage(gl::Texture *texture, EGLint buffer);
        Error releaseTexImage(EGLint buffer);
    
        Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc);
    
        EGLint isPostSubBufferSupported() const;
    
        void setSwapInterval(EGLint interval);
        void setIsCurrent(Display *display, bool isCurrent);
        void onDestroy(Display *display);
    
        const Config *getConfig() const;
    
        // width and height can change with client window resizing
        EGLint getWidth() const;
        EGLint getHeight() const;
        EGLint getPixelAspectRatio() const;
        EGLenum getRenderBuffer() const;
        EGLenum getSwapBehavior() const;
        EGLenum getTextureFormat() const;
        EGLenum getTextureTarget() const;
    
        gl::Texture *getBoundTexture() const { return mTexture.get(); }
        gl::Framebuffer *getDefaultFramebuffer() { return mState.defaultFramebuffer; }
    
        EGLint isFixedSize() const;
    
        // FramebufferAttachmentObject implementation
        gl::Extents getAttachmentSize(const gl::ImageIndex &imageIndex) const override;
        const gl::Format &getAttachmentFormat(GLenum binding,
                                              const gl::ImageIndex &imageIndex) const override;
        GLsizei getAttachmentSamples(const gl::ImageIndex &imageIndex) const override;
    
        void onAttach() override {}
        void onDetach() override {}
        GLuint getId() const override;
    
        bool flexibleSurfaceCompatibilityRequested() const
        {
            return mFlexibleSurfaceCompatibilityRequested;
        }
        EGLint getOrientation() const { return mOrientation; }
    
        bool directComposition() const { return mDirectComposition; }
    
      protected:
        Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes);
        rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override { return mImplementation; }
    
        gl::Framebuffer *createDefaultFramebuffer();
    
        // ANGLE-only method, used internally
        friend class gl::Texture;
        void releaseTexImageFromTexture();
    
        SurfaceState mState;
        rx::SurfaceImpl *mImplementation;
        int mCurrentCount;
        bool mDestroyed;
    
        EGLint mType;
    
        bool mPostSubBufferRequested;
        bool mFlexibleSurfaceCompatibilityRequested;
    
        bool mFixedSize;
        size_t mFixedWidth;
        size_t mFixedHeight;
    
        bool mDirectComposition;
    
        EGLenum mTextureFormat;
        EGLenum mTextureTarget;
    
        EGLint mPixelAspectRatio;      // Display aspect ratio
        EGLenum mRenderBuffer;         // Render buffer
        EGLenum mSwapBehavior;         // Buffer swap behavior
    
        EGLint mOrientation;
    
        BindingPointer<gl::Texture> mTexture;
    
        gl::Format mBackFormat;
        gl::Format mDSFormat;
    
      private:
        void destroy(const egl::Display *display);
    };
    
    class WindowSurface final : public Surface
    {
      public:
        WindowSurface(rx::EGLImplFactory *implFactory,
                      const Config *config,
                      EGLNativeWindowType window,
                      const AttributeMap &attribs);
        ~WindowSurface() override;
    };
    
    class PbufferSurface final : public Surface
    {
      public:
        PbufferSurface(rx::EGLImplFactory *implFactory,
                       const Config *config,
                       const AttributeMap &attribs);
        PbufferSurface(rx::EGLImplFactory *implFactory,
                       const Config *config,
                       EGLenum buftype,
                       EGLClientBuffer clientBuffer,
                       const AttributeMap &attribs);
        ~PbufferSurface() override;
    };
    
    class PixmapSurface final : public Surface
    {
      public:
        PixmapSurface(rx::EGLImplFactory *implFactory,
                      const Config *config,
                      NativePixmapType nativePixmap,
                      const AttributeMap &attribs);
        ~PixmapSurface() override;
    };
    
    }  // namespace egl
    
    #endif   // LIBANGLE_SURFACE_H_