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