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