1 // 2 // Copyright (c) 2002-2014 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 7 // Surface.h: Defines the egl::Surface class, representing a drawing surface 8 // such as the client area of a window, including any back buffers. 9 // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3. 10 11 #ifndef LIBANGLE_SURFACE_H_ 12 #define LIBANGLE_SURFACE_H_ 13 14 #include <EGL/egl.h> 15 16 #include "common/angleutils.h" 17 #include "libANGLE/AttributeMap.h" 18 #include "libANGLE/Error.h" 19 #include "libANGLE/FramebufferAttachment.h" 20 #include "libANGLE/RefCountObject.h" 21 #include "libANGLE/formatutils.h" 22 #include "libANGLE/renderer/SurfaceImpl.h" 23 24 namespace gl 25 { 26 class Framebuffer; 27 class Texture; 28 } 29 30 namespace rx 31 { 32 class EGLImplFactory; 33 } 34 35 namespace egl 36 { 37 class Display; 38 struct Config; 39 40 struct SurfaceState final : private angle::NonCopyable 41 { 42 SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn); 43 44 gl::Framebuffer *defaultFramebuffer; 45 const egl::Config *config; 46 AttributeMap attributes; 47 }; 48 49 class Surface : public gl::FramebufferAttachmentObject 50 { 51 public: getImplementation()52 rx::SurfaceImpl *getImplementation() const { return mImplementation; } 53 54 EGLint getType() const; 55 56 Error initialize(const Display *display); 57 Error swap(const gl::Context *context); 58 Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects); 59 Error postSubBuffer(const gl::Context *context, 60 EGLint x, 61 EGLint y, 62 EGLint width, 63 EGLint height); 64 Error querySurfacePointerANGLE(EGLint attribute, void **value); 65 Error bindTexImage(const gl::Context *context, gl::Texture *texture, EGLint buffer); 66 Error releaseTexImage(const gl::Context *context, EGLint buffer); 67 68 Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc); 69 70 EGLint isPostSubBufferSupported() const; 71 72 void setSwapInterval(EGLint interval); 73 Error setIsCurrent(const gl::Context *context, bool isCurrent); 74 Error onDestroy(const Display *display); 75 76 void setMipmapLevel(EGLint level); 77 void setMultisampleResolve(EGLenum resolve); 78 void setSwapBehavior(EGLenum behavior); 79 80 const Config *getConfig() const; 81 82 // width and height can change with client window resizing 83 EGLint getWidth() const; 84 EGLint getHeight() const; 85 EGLint getPixelAspectRatio() const; 86 EGLenum getRenderBuffer() const; 87 EGLenum getSwapBehavior() const; 88 EGLenum getTextureFormat() const; 89 EGLenum getTextureTarget() const; 90 bool getLargestPbuffer() const; 91 EGLenum getGLColorspace() const; 92 EGLenum getVGAlphaFormat() const; 93 EGLenum getVGColorspace() const; 94 bool getMipmapTexture() const; 95 EGLint getMipmapLevel() const; 96 EGLint getHorizontalResolution() const; 97 EGLint getVerticalResolution() const; 98 EGLenum getMultisampleResolve() const; 99 getBoundTexture()100 gl::Texture *getBoundTexture() const { return mTexture.get(); } getDefaultFramebuffer()101 gl::Framebuffer *getDefaultFramebuffer() { return mState.defaultFramebuffer; } 102 103 EGLint isFixedSize() const; 104 105 // FramebufferAttachmentObject implementation 106 gl::Extents getAttachmentSize(const gl::ImageIndex &imageIndex) const override; 107 const gl::Format &getAttachmentFormat(GLenum binding, 108 const gl::ImageIndex &imageIndex) const override; 109 GLsizei getAttachmentSamples(const gl::ImageIndex &imageIndex) const override; 110 onAttach(const gl::Context * context)111 void onAttach(const gl::Context *context) override {} onDetach(const gl::Context * context)112 void onDetach(const gl::Context *context) override {} 113 GLuint getId() const override; 114 flexibleSurfaceCompatibilityRequested()115 bool flexibleSurfaceCompatibilityRequested() const 116 { 117 return mFlexibleSurfaceCompatibilityRequested; 118 } getOrientation()119 EGLint getOrientation() const { return mOrientation; } 120 directComposition()121 bool directComposition() const { return mDirectComposition; } 122 123 gl::InitState initState(const gl::ImageIndex &imageIndex) const override; 124 void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override; 125 isRobustResourceInitEnabled()126 bool isRobustResourceInitEnabled() const { return mRobustResourceInitialization; } 127 128 protected: 129 Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes); 130 ~Surface() override; 131 rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; 132 133 gl::Framebuffer *createDefaultFramebuffer(const Display *display); 134 135 // ANGLE-only method, used internally 136 friend class gl::Texture; 137 void releaseTexImageFromTexture(const gl::Context *context); 138 139 SurfaceState mState; 140 rx::SurfaceImpl *mImplementation; 141 int mCurrentCount; 142 bool mDestroyed; 143 144 EGLint mType; 145 146 bool mPostSubBufferRequested; 147 bool mFlexibleSurfaceCompatibilityRequested; 148 149 bool mLargestPbuffer; 150 EGLenum mGLColorspace; 151 EGLenum mVGAlphaFormat; 152 EGLenum mVGColorspace; 153 bool mMipmapTexture; 154 EGLint mMipmapLevel; 155 EGLint mHorizontalResolution; 156 EGLint mVerticalResolution; 157 EGLenum mMultisampleResolve; 158 159 bool mFixedSize; 160 size_t mFixedWidth; 161 size_t mFixedHeight; 162 163 bool mDirectComposition; 164 165 bool mRobustResourceInitialization; 166 167 EGLenum mTextureFormat; 168 EGLenum mTextureTarget; 169 170 EGLint mPixelAspectRatio; // Display aspect ratio 171 EGLenum mRenderBuffer; // Render buffer 172 EGLenum mSwapBehavior; // Buffer swap behavior 173 174 EGLint mOrientation; 175 176 gl::BindingPointer<gl::Texture> mTexture; 177 178 gl::Format mBackFormat; 179 gl::Format mDSFormat; 180 181 private: 182 Error destroyImpl(const Display *display); 183 }; 184 185 class WindowSurface final : public Surface 186 { 187 public: 188 WindowSurface(rx::EGLImplFactory *implFactory, 189 const Config *config, 190 EGLNativeWindowType window, 191 const AttributeMap &attribs); 192 ~WindowSurface() override; 193 }; 194 195 class PbufferSurface final : public Surface 196 { 197 public: 198 PbufferSurface(rx::EGLImplFactory *implFactory, 199 const Config *config, 200 const AttributeMap &attribs); 201 PbufferSurface(rx::EGLImplFactory *implFactory, 202 const Config *config, 203 EGLenum buftype, 204 EGLClientBuffer clientBuffer, 205 const AttributeMap &attribs); 206 207 protected: 208 ~PbufferSurface() override; 209 }; 210 211 class PixmapSurface final : public Surface 212 { 213 public: 214 PixmapSurface(rx::EGLImplFactory *implFactory, 215 const Config *config, 216 NativePixmapType nativePixmap, 217 const AttributeMap &attribs); 218 219 protected: 220 ~PixmapSurface() override; 221 }; 222 223 class SurfaceDeleter final 224 { 225 public: 226 SurfaceDeleter(const Display *display); 227 ~SurfaceDeleter(); 228 void operator()(Surface *surface); 229 230 private: 231 const Display *mDisplay; 232 }; 233 234 using SurfacePointer = angle::UniqueObjectPointerBase<Surface, SurfaceDeleter>; 235 236 } // namespace egl 237 238 #endif // LIBANGLE_SURFACE_H_ 239