diff options
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Surface.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/Surface.h | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Surface.h b/gfx/angle/checkout/src/libANGLE/Surface.h new file mode 100644 index 0000000000..6551dc2494 --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/Surface.h @@ -0,0 +1,289 @@ +// +// 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/PackedEnums.h" +#include "common/angleutils.h" +#include "libANGLE/AttributeMap.h" +#include "libANGLE/Debug.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 Context; +class Framebuffer; +class Texture; +} // namespace gl + +namespace rx +{ +class EGLImplFactory; +} + +namespace egl +{ +class Display; +struct Config; + +using SupportedCompositorTiming = angle::PackedEnumBitSet<CompositorTiming>; +using SupportedTimestamps = angle::PackedEnumBitSet<Timestamp>; + +struct SurfaceState final : private angle::NonCopyable +{ + SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn); + ~SurfaceState(); + + EGLLabelKHR label; + const egl::Config *config; + AttributeMap attributes; + + bool timestampsEnabled; + SupportedCompositorTiming supportedCompositorTimings; + SupportedTimestamps supportedTimestamps; +}; + +class Surface : public LabeledObject, public gl::FramebufferAttachmentObject +{ + public: + rx::SurfaceImpl *getImplementation() const { return mImplementation; } + + void setLabel(EGLLabelKHR label) override; + EGLLabelKHR getLabel() const override; + + EGLint getType() const; + + Error initialize(const Display *display); + Error makeCurrent(const gl::Context *context); + Error unMakeCurrent(const gl::Context *context); + Error swap(const gl::Context *context); + Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects); + Error postSubBuffer(const gl::Context *context, + EGLint x, + EGLint y, + EGLint width, + EGLint height); + Error setPresentationTime(EGLnsecsANDROID time); + Error querySurfacePointerANGLE(EGLint attribute, void **value); + Error bindTexImage(gl::Context *context, gl::Texture *texture, EGLint buffer); + Error releaseTexImage(const gl::Context *context, EGLint buffer); + + Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc); + + EGLint isPostSubBufferSupported() const; + + void setSwapInterval(EGLint interval); + Error onDestroy(const Display *display); + + void setMipmapLevel(EGLint level); + void setMultisampleResolve(EGLenum resolve); + void setSwapBehavior(EGLenum behavior); + + void setFixedWidth(EGLint width); + void setFixedHeight(EGLint height); + + gl::Framebuffer *createDefaultFramebuffer(const gl::Context *context); + + 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; + TextureFormat getTextureFormat() const; + EGLenum getTextureTarget() const; + bool getLargestPbuffer() const; + EGLenum getGLColorspace() const; + EGLenum getVGAlphaFormat() const; + EGLenum getVGColorspace() const; + bool getMipmapTexture() const; + EGLint getMipmapLevel() const; + EGLint getHorizontalResolution() const; + EGLint getVerticalResolution() const; + EGLenum getMultisampleResolve() const; + + gl::Texture *getBoundTexture() const { return mTexture; } + + EGLint isFixedSize() const; + + // FramebufferAttachmentObject implementation + gl::Extents getAttachmentSize(const gl::ImageIndex &imageIndex) const override; + gl::Format getAttachmentFormat(GLenum binding, const gl::ImageIndex &imageIndex) const override; + GLsizei getAttachmentSamples(const gl::ImageIndex &imageIndex) const override; + bool isRenderable(const gl::Context *context, + GLenum binding, + const gl::ImageIndex &imageIndex) const override; + + void onAttach(const gl::Context *context) override {} + void onDetach(const gl::Context *context) override {} + GLuint getId() const override; + + bool flexibleSurfaceCompatibilityRequested() const + { + return mFlexibleSurfaceCompatibilityRequested; + } + EGLint getOrientation() const { return mOrientation; } + + bool directComposition() const { return mDirectComposition; } + + gl::InitState initState(const gl::ImageIndex &imageIndex) const override; + void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override; + + bool isRobustResourceInitEnabled() const { return mRobustResourceInitialization; } + + const gl::Format &getBindTexImageFormat() const { return mColorFormat; } + + // EGL_ANDROID_get_frame_timestamps entry points + void setTimestampsEnabled(bool enabled); + bool isTimestampsEnabled() const; + + const SupportedCompositorTiming &getSupportedCompositorTimings() const; + Error getCompositorTiming(EGLint numTimestamps, + const EGLint *names, + EGLnsecsANDROID *values) const; + + Error getNextFrameId(EGLuint64KHR *frameId) const; + const SupportedTimestamps &getSupportedTimestamps() const; + Error getFrameTimestamps(EGLuint64KHR frameId, + EGLint numTimestamps, + const EGLint *timestamps, + EGLnsecsANDROID *values) const; + + protected: + Surface(EGLint surfaceType, + const egl::Config *config, + const AttributeMap &attributes, + EGLenum buftype = EGL_NONE); + ~Surface() override; + rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; + + gl::Framebuffer *createDefaultFramebuffer(const Display *display); + + // ANGLE-only method, used internally + friend class gl::Texture; + Error releaseTexImageFromTexture(const gl::Context *context); + + SurfaceState mState; + rx::SurfaceImpl *mImplementation; + int mRefCount; + bool mDestroyed; + + EGLint mType; + EGLenum mBuftype; + + bool mPostSubBufferRequested; + bool mFlexibleSurfaceCompatibilityRequested; + + bool mLargestPbuffer; + EGLenum mGLColorspace; + EGLenum mVGAlphaFormat; + EGLenum mVGColorspace; + bool mMipmapTexture; + EGLint mMipmapLevel; + EGLint mHorizontalResolution; + EGLint mVerticalResolution; + EGLenum mMultisampleResolve; + + bool mFixedSize; + size_t mFixedWidth; + size_t mFixedHeight; + + bool mDirectComposition; + + bool mRobustResourceInitialization; + + TextureFormat mTextureFormat; + EGLenum mTextureTarget; + + EGLint mPixelAspectRatio; // Display aspect ratio + EGLenum mRenderBuffer; // Render buffer + EGLenum mSwapBehavior; // Buffer swap behavior + + EGLint mOrientation; + + // We don't use a binding pointer here. We don't ever want to own an orphaned texture. If a + // Texture is deleted the Surface is unbound in onDestroy. + gl::Texture *mTexture; + + gl::Format mColorFormat; + gl::Format mDSFormat; + + private: + Error destroyImpl(const Display *display); + + void postSwap(const Display *display); + Error releaseRef(const Display *display); + + gl::InitState mInitState; +}; + +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); + + protected: + ~PbufferSurface() override; +}; + +class PixmapSurface final : public Surface +{ + public: + PixmapSurface(rx::EGLImplFactory *implFactory, + const Config *config, + NativePixmapType nativePixmap, + const AttributeMap &attribs); + + protected: + ~PixmapSurface() override; +}; + +class SurfaceDeleter final +{ + public: + SurfaceDeleter(const Display *display); + ~SurfaceDeleter(); + void operator()(Surface *surface); + + private: + const Display *mDisplay; +}; + +using SurfacePointer = angle::UniqueObjectPointerBase<Surface, SurfaceDeleter>; + +} // namespace egl + +#endif // LIBANGLE_SURFACE_H_ |