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