• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 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 // SurfaceImpl.h: Implementation methods of egl::Surface
8 
9 #ifndef LIBANGLE_RENDERER_SURFACEIMPL_H_
10 #define LIBANGLE_RENDERER_SURFACEIMPL_H_
11 
12 #include <EGL/egl.h>
13 #include <EGL/eglext.h>
14 
15 #include "common/angleutils.h"
16 #include "libANGLE/Error.h"
17 #include "libANGLE/FramebufferAttachment.h"
18 #include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
19 
20 namespace angle
21 {
22 struct Format;
23 }
24 
25 namespace gl
26 {
27 class Context;
28 class FramebufferState;
29 }  // namespace gl
30 
31 namespace egl
32 {
33 class Display;
34 struct Config;
35 struct SurfaceState;
36 class Thread;
37 
38 using SupportedTimestamps        = angle::PackedEnumBitSet<Timestamp>;
39 using SupportedCompositorTimings = angle::PackedEnumBitSet<CompositorTiming>;
40 }  // namespace egl
41 
42 namespace rx
43 {
44 struct SurfaceSwapFeedback
45 {
46     bool swapChainImageChanged = false;
47 };
48 
49 class SurfaceImpl : public FramebufferAttachmentObjectImpl
50 {
51   public:
52     SurfaceImpl(const egl::SurfaceState &surfaceState);
53     ~SurfaceImpl() override;
destroy(const egl::Display * display)54     virtual void destroy(const egl::Display *display) {}
55 
56     virtual egl::Error initialize(const egl::Display *display) = 0;
57     virtual egl::Error makeCurrent(const gl::Context *context);
58     virtual egl::Error unMakeCurrent(const gl::Context *context);
59     virtual egl::Error prepareSwap(const gl::Context *);
60     virtual egl::Error swap(const gl::Context *context, SurfaceSwapFeedback *feedback) = 0;
61     virtual egl::Error swapWithDamage(const gl::Context *context,
62                                       const EGLint *rects,
63                                       EGLint n_rects,
64                                       SurfaceSwapFeedback *feedback);
65     virtual egl::Error postSubBuffer(const gl::Context *context,
66                                      EGLint x,
67                                      EGLint y,
68                                      EGLint width,
69                                      EGLint height);
70     virtual egl::Error setPresentationTime(EGLnsecsANDROID time);
71     virtual egl::Error querySurfacePointerANGLE(EGLint attribute, void **value);
72     virtual egl::Error bindTexImage(const gl::Context *context,
73                                     gl::Texture *texture,
74                                     EGLint buffer)                                = 0;
75     virtual egl::Error releaseTexImage(const gl::Context *context, EGLint buffer) = 0;
76     virtual egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc);
77     virtual egl::Error getMscRate(EGLint *numerator, EGLint *denominator);
78     virtual void setSwapInterval(const egl::Display *display, EGLint interval) = 0;
79     virtual void setFixedWidth(EGLint width);
80     virtual void setFixedHeight(EGLint height);
81 
82     // width and height can change with client window resizing
83     virtual EGLint getWidth() const  = 0;
84     virtual EGLint getHeight() const = 0;
85     // Note: windows cannot be resized on Android.  The approach requires
86     // calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR.  However, that is
87     // expensive; and there are troublesome timing issues for other parts of
88     // ANGLE (which cause test failures and crashes).  Therefore, a
89     // special-Android-only path is created just for the querying of EGL_WIDTH
90     // and EGL_HEIGHT.
91     // https://issuetracker.google.com/issues/153329980
92     virtual egl::Error getUserWidth(const egl::Display *display, EGLint *value) const;
93     virtual egl::Error getUserHeight(const egl::Display *display, EGLint *value) const;
94 
95     virtual EGLint isPostSubBufferSupported() const;
96     virtual EGLint getSwapBehavior() const = 0;
97 
98     virtual egl::Error attachToFramebuffer(const gl::Context *context,
99                                            gl::Framebuffer *framebuffer)   = 0;
100     virtual egl::Error detachFromFramebuffer(const gl::Context *context,
101                                              gl::Framebuffer *framebuffer) = 0;
102 
103     // Used to query color format from pbuffers created from D3D textures.
104     virtual const angle::Format *getD3DTextureColorFormat() const;
105 
106     // EGL_ANDROID_get_frame_timestamps
107     virtual void setTimestampsEnabled(bool enabled);
108     virtual egl::SupportedCompositorTimings getSupportedCompositorTimings() const;
109     virtual egl::Error getCompositorTiming(EGLint numTimestamps,
110                                            const EGLint *names,
111                                            EGLnsecsANDROID *values) const;
112     virtual egl::Error getNextFrameId(EGLuint64KHR *frameId) const;
113     virtual egl::SupportedTimestamps getSupportedTimestamps() const;
114     virtual egl::Error getFrameTimestamps(EGLuint64KHR frameId,
115                                           EGLint numTimestamps,
116                                           const EGLint *timestamps,
117                                           EGLnsecsANDROID *values) const;
118     virtual egl::Error getBufferAge(const gl::Context *context, EGLint *age);
119 
120     // EGL_ANDROID_front_buffer_auto_refresh
121     virtual egl::Error setAutoRefreshEnabled(bool enabled);
122 
123     // EGL_KHR_lock_surface3
124     virtual egl::Error lockSurface(const egl::Display *display,
125                                    EGLint usageHint,
126                                    bool preservePixels,
127                                    uint8_t **bufferPtrOut,
128                                    EGLint *bufferPitchOut);
129     virtual egl::Error unlockSurface(const egl::Display *display, bool preservePixels);
130     virtual EGLint origin() const;
131 
132     virtual egl::Error setRenderBuffer(EGLint renderBuffer);
133 
134     virtual EGLint getCompressionRate(const egl::Display *display) const;
135 
136   protected:
137     const egl::SurfaceState &mState;
138 };
139 
140 }  // namespace rx
141 
142 #endif  // LIBANGLE_RENDERER_SURFACEIMPL_H_
143