xref: /aosp_15_r20/external/angle/src/libANGLE/Surface.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 // Surface.cpp: Implements the egl::Surface class, representing a drawing surface
8*8975f5c5SAndroid Build Coastguard Worker // such as the client area of a window, including any back buffers.
9*8975f5c5SAndroid Build Coastguard Worker // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Surface.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Config.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Framebuffer.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/EGLImplFactory.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/trace.h"
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace egl
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker namespace
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker angle::SubjectIndex kSurfaceImplSubjectIndex = 0;
29*8975f5c5SAndroid Build Coastguard Worker }  // namespace
30*8975f5c5SAndroid Build Coastguard Worker 
SurfaceState(SurfaceID idIn,const egl::Config * configIn,const AttributeMap & attributesIn)31*8975f5c5SAndroid Build Coastguard Worker SurfaceState::SurfaceState(SurfaceID idIn,
32*8975f5c5SAndroid Build Coastguard Worker                            const egl::Config *configIn,
33*8975f5c5SAndroid Build Coastguard Worker                            const AttributeMap &attributesIn)
34*8975f5c5SAndroid Build Coastguard Worker     : id(idIn),
35*8975f5c5SAndroid Build Coastguard Worker       label(nullptr),
36*8975f5c5SAndroid Build Coastguard Worker       config((configIn != nullptr) ? new egl::Config(*configIn) : nullptr),
37*8975f5c5SAndroid Build Coastguard Worker       attributes(attributesIn),
38*8975f5c5SAndroid Build Coastguard Worker       timestampsEnabled(false),
39*8975f5c5SAndroid Build Coastguard Worker       autoRefreshEnabled(false),
40*8975f5c5SAndroid Build Coastguard Worker       directComposition(false),
41*8975f5c5SAndroid Build Coastguard Worker       swapBehavior(EGL_NONE)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     directComposition = attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE;
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker 
~SurfaceState()46*8975f5c5SAndroid Build Coastguard Worker SurfaceState::~SurfaceState()
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker     delete config;
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker 
isRobustResourceInitEnabled() const51*8975f5c5SAndroid Build Coastguard Worker bool SurfaceState::isRobustResourceInitEnabled() const
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker     return attributes.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE;
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker 
hasProtectedContent() const56*8975f5c5SAndroid Build Coastguard Worker bool SurfaceState::hasProtectedContent() const
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     return attributes.get(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) == EGL_TRUE;
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker 
getPreferredSwapInterval() const61*8975f5c5SAndroid Build Coastguard Worker EGLint SurfaceState::getPreferredSwapInterval() const
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker     return attributes.getAsInt(EGL_SWAP_INTERVAL_ANGLE, 1);
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker 
Surface(EGLint surfaceType,SurfaceID id,const egl::Config * config,const AttributeMap & attributes,bool forceRobustResourceInit,EGLenum buftype)66*8975f5c5SAndroid Build Coastguard Worker Surface::Surface(EGLint surfaceType,
67*8975f5c5SAndroid Build Coastguard Worker                  SurfaceID id,
68*8975f5c5SAndroid Build Coastguard Worker                  const egl::Config *config,
69*8975f5c5SAndroid Build Coastguard Worker                  const AttributeMap &attributes,
70*8975f5c5SAndroid Build Coastguard Worker                  bool forceRobustResourceInit,
71*8975f5c5SAndroid Build Coastguard Worker                  EGLenum buftype)
72*8975f5c5SAndroid Build Coastguard Worker     : FramebufferAttachmentObject(),
73*8975f5c5SAndroid Build Coastguard Worker       mState(id, config, attributes),
74*8975f5c5SAndroid Build Coastguard Worker       mImplementation(nullptr),
75*8975f5c5SAndroid Build Coastguard Worker       mRefCount(0),
76*8975f5c5SAndroid Build Coastguard Worker       mDestroyed(false),
77*8975f5c5SAndroid Build Coastguard Worker       mType(surfaceType),
78*8975f5c5SAndroid Build Coastguard Worker       mBuftype(buftype),
79*8975f5c5SAndroid Build Coastguard Worker       mPostSubBufferRequested(false),
80*8975f5c5SAndroid Build Coastguard Worker       mLargestPbuffer(false),
81*8975f5c5SAndroid Build Coastguard Worker       mGLColorspace(EGL_GL_COLORSPACE_LINEAR),
82*8975f5c5SAndroid Build Coastguard Worker       mVGAlphaFormat(EGL_VG_ALPHA_FORMAT_NONPRE),
83*8975f5c5SAndroid Build Coastguard Worker       mVGColorspace(EGL_VG_COLORSPACE_sRGB),
84*8975f5c5SAndroid Build Coastguard Worker       mMipmapTexture(false),
85*8975f5c5SAndroid Build Coastguard Worker       mMipmapLevel(0),
86*8975f5c5SAndroid Build Coastguard Worker       mHorizontalResolution(EGL_UNKNOWN),
87*8975f5c5SAndroid Build Coastguard Worker       mVerticalResolution(EGL_UNKNOWN),
88*8975f5c5SAndroid Build Coastguard Worker       mMultisampleResolve(EGL_MULTISAMPLE_RESOLVE_DEFAULT),
89*8975f5c5SAndroid Build Coastguard Worker       mFixedSize(false),
90*8975f5c5SAndroid Build Coastguard Worker       mFixedWidth(0),
91*8975f5c5SAndroid Build Coastguard Worker       mFixedHeight(0),
92*8975f5c5SAndroid Build Coastguard Worker       mTextureFormat(TextureFormat::NoTexture),
93*8975f5c5SAndroid Build Coastguard Worker       mTextureTarget(EGL_NO_TEXTURE),
94*8975f5c5SAndroid Build Coastguard Worker       // FIXME: Determine actual pixel aspect ratio
95*8975f5c5SAndroid Build Coastguard Worker       mPixelAspectRatio(static_cast<EGLint>(1.0 * EGL_DISPLAY_SCALING)),
96*8975f5c5SAndroid Build Coastguard Worker       mRenderBuffer(EGL_BACK_BUFFER),
97*8975f5c5SAndroid Build Coastguard Worker       mOrientation(0),
98*8975f5c5SAndroid Build Coastguard Worker       mTexture(nullptr),
99*8975f5c5SAndroid Build Coastguard Worker       mColorFormat(config->renderTargetFormat),
100*8975f5c5SAndroid Build Coastguard Worker       mDSFormat(config->depthStencilFormat),
101*8975f5c5SAndroid Build Coastguard Worker       mIsCurrentOnAnyContext(false),
102*8975f5c5SAndroid Build Coastguard Worker       mLockBufferPtr(nullptr),
103*8975f5c5SAndroid Build Coastguard Worker       mLockBufferPitch(0),
104*8975f5c5SAndroid Build Coastguard Worker       mBufferAgeQueriedSinceLastSwap(false),
105*8975f5c5SAndroid Build Coastguard Worker       mIsDamageRegionSet(false),
106*8975f5c5SAndroid Build Coastguard Worker       mColorInitState(gl::InitState::Initialized),
107*8975f5c5SAndroid Build Coastguard Worker       mDepthStencilInitState(gl::InitState::Initialized),
108*8975f5c5SAndroid Build Coastguard Worker       mImplObserverBinding(this, kSurfaceImplSubjectIndex)
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker     mPostSubBufferRequested =
111*8975f5c5SAndroid Build Coastguard Worker         (attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE);
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     if (mType == EGL_PBUFFER_BIT)
114*8975f5c5SAndroid Build Coastguard Worker     {
115*8975f5c5SAndroid Build Coastguard Worker         mLargestPbuffer = (attributes.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
116*8975f5c5SAndroid Build Coastguard Worker     }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     if (mType == EGL_PIXMAP_BIT)
119*8975f5c5SAndroid Build Coastguard Worker     {
120*8975f5c5SAndroid Build Coastguard Worker         mRenderBuffer = EGL_SINGLE_BUFFER;
121*8975f5c5SAndroid Build Coastguard Worker     }
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker     if (mType == EGL_WINDOW_BIT)
124*8975f5c5SAndroid Build Coastguard Worker     {
125*8975f5c5SAndroid Build Coastguard Worker         mRenderBuffer = mState.attributes.getAsInt(EGL_RENDER_BUFFER, EGL_BACK_BUFFER);
126*8975f5c5SAndroid Build Coastguard Worker     }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     mGLColorspace =
129*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLenum>(attributes.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR));
130*8975f5c5SAndroid Build Coastguard Worker     mVGAlphaFormat =
131*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLenum>(attributes.get(EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_NONPRE));
132*8975f5c5SAndroid Build Coastguard Worker     mVGColorspace = static_cast<EGLenum>(attributes.get(EGL_VG_COLORSPACE, EGL_VG_COLORSPACE_sRGB));
133*8975f5c5SAndroid Build Coastguard Worker     mMipmapTexture = (attributes.get(EGL_MIPMAP_TEXTURE, EGL_FALSE) == EGL_TRUE);
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     mRobustResourceInitialization =
136*8975f5c5SAndroid Build Coastguard Worker         forceRobustResourceInit ||
137*8975f5c5SAndroid Build Coastguard Worker         (attributes.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
138*8975f5c5SAndroid Build Coastguard Worker     if (mRobustResourceInitialization)
139*8975f5c5SAndroid Build Coastguard Worker     {
140*8975f5c5SAndroid Build Coastguard Worker         mColorInitState        = gl::InitState::MayNeedInit;
141*8975f5c5SAndroid Build Coastguard Worker         mDepthStencilInitState = gl::InitState::MayNeedInit;
142*8975f5c5SAndroid Build Coastguard Worker     }
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE);
145*8975f5c5SAndroid Build Coastguard Worker     if (mFixedSize)
146*8975f5c5SAndroid Build Coastguard Worker     {
147*8975f5c5SAndroid Build Coastguard Worker         mFixedWidth  = static_cast<size_t>(attributes.get(EGL_WIDTH, 0));
148*8975f5c5SAndroid Build Coastguard Worker         mFixedHeight = static_cast<size_t>(attributes.get(EGL_HEIGHT, 0));
149*8975f5c5SAndroid Build Coastguard Worker     }
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker     if (mType != EGL_WINDOW_BIT)
152*8975f5c5SAndroid Build Coastguard Worker     {
153*8975f5c5SAndroid Build Coastguard Worker         mTextureFormat = attributes.getAsPackedEnum(EGL_TEXTURE_FORMAT, TextureFormat::NoTexture);
154*8975f5c5SAndroid Build Coastguard Worker         mTextureTarget = static_cast<EGLenum>(attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
155*8975f5c5SAndroid Build Coastguard Worker     }
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     mOrientation = static_cast<EGLint>(attributes.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     mTextureOffset.x = static_cast<int>(mState.attributes.get(EGL_TEXTURE_OFFSET_X_ANGLE, 0));
160*8975f5c5SAndroid Build Coastguard Worker     mTextureOffset.y = static_cast<int>(mState.attributes.get(EGL_TEXTURE_OFFSET_Y_ANGLE, 0));
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
~Surface()163*8975f5c5SAndroid Build Coastguard Worker Surface::~Surface() {}
164*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentImpl() const165*8975f5c5SAndroid Build Coastguard Worker rx::FramebufferAttachmentObjectImpl *Surface::getAttachmentImpl() const
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker     return mImplementation;
168*8975f5c5SAndroid Build Coastguard Worker }
169*8975f5c5SAndroid Build Coastguard Worker 
destroyImpl(const Display * display)170*8975f5c5SAndroid Build Coastguard Worker Error Surface::destroyImpl(const Display *display)
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     if (mImplementation)
173*8975f5c5SAndroid Build Coastguard Worker     {
174*8975f5c5SAndroid Build Coastguard Worker         mImplementation->destroy(display);
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!mTexture);
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mImplementation);
180*8975f5c5SAndroid Build Coastguard Worker 
181*8975f5c5SAndroid Build Coastguard Worker     delete this;
182*8975f5c5SAndroid Build Coastguard Worker     return NoError();
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker 
postSwap(const gl::Context * context)185*8975f5c5SAndroid Build Coastguard Worker void Surface::postSwap(const gl::Context *context)
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker     if (mRobustResourceInitialization && mState.swapBehavior != EGL_BUFFER_PRESERVED)
188*8975f5c5SAndroid Build Coastguard Worker     {
189*8975f5c5SAndroid Build Coastguard Worker         mColorInitState        = gl::InitState::MayNeedInit;
190*8975f5c5SAndroid Build Coastguard Worker         mDepthStencilInitState = gl::InitState::MayNeedInit;
191*8975f5c5SAndroid Build Coastguard Worker         onStateChange(angle::SubjectMessage::SubjectChanged);
192*8975f5c5SAndroid Build Coastguard Worker     }
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker     mBufferAgeQueriedSinceLastSwap = false;
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker     mIsDamageRegionSet = false;
197*8975f5c5SAndroid Build Coastguard Worker }
198*8975f5c5SAndroid Build Coastguard Worker 
initialize(const Display * display)199*8975f5c5SAndroid Build Coastguard Worker Error Surface::initialize(const Display *display)
200*8975f5c5SAndroid Build Coastguard Worker {
201*8975f5c5SAndroid Build Coastguard Worker     GLenum overrideRenderTargetFormat = mState.config->renderTargetFormat;
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     // To account for color space differences, override the renderTargetFormat with the
204*8975f5c5SAndroid Build Coastguard Worker     // non-linear format. If no suitable non-linear format was found, return
205*8975f5c5SAndroid Build Coastguard Worker     // EGL_BAD_MATCH error
206*8975f5c5SAndroid Build Coastguard Worker     if (!gl::ColorspaceFormatOverride(mGLColorspace, &overrideRenderTargetFormat))
207*8975f5c5SAndroid Build Coastguard Worker     {
208*8975f5c5SAndroid Build Coastguard Worker         return egl::EglBadMatch();
209*8975f5c5SAndroid Build Coastguard Worker     }
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     // If an override is required update mState.config as well
212*8975f5c5SAndroid Build Coastguard Worker     if (mState.config->renderTargetFormat != overrideRenderTargetFormat)
213*8975f5c5SAndroid Build Coastguard Worker     {
214*8975f5c5SAndroid Build Coastguard Worker         egl::Config *overrideConfig        = new egl::Config(*(mState.config));
215*8975f5c5SAndroid Build Coastguard Worker         overrideConfig->renderTargetFormat = overrideRenderTargetFormat;
216*8975f5c5SAndroid Build Coastguard Worker         delete mState.config;
217*8975f5c5SAndroid Build Coastguard Worker         mState.config = overrideConfig;
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker         mColorFormat = gl::Format(mState.config->renderTargetFormat);
220*8975f5c5SAndroid Build Coastguard Worker         mDSFormat    = gl::Format(mState.config->depthStencilFormat);
221*8975f5c5SAndroid Build Coastguard Worker     }
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->initialize(display));
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker     // Initialized here since impl is nullptr in the constructor.
226*8975f5c5SAndroid Build Coastguard Worker     // Must happen after implementation initialize for Android.
227*8975f5c5SAndroid Build Coastguard Worker     mState.swapBehavior = mImplementation->getSwapBehavior();
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker     if (mBuftype == EGL_IOSURFACE_ANGLE)
230*8975f5c5SAndroid Build Coastguard Worker     {
231*8975f5c5SAndroid Build Coastguard Worker         GLenum internalFormat =
232*8975f5c5SAndroid Build Coastguard Worker             static_cast<GLenum>(mState.attributes.get(EGL_TEXTURE_INTERNAL_FORMAT_ANGLE));
233*8975f5c5SAndroid Build Coastguard Worker         GLenum type = static_cast<GLenum>(mState.attributes.get(EGL_TEXTURE_TYPE_ANGLE));
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker         // GL_RGBA + GL_HALF_FLOAT is not a valid format/type combination in GLES like it is in
236*8975f5c5SAndroid Build Coastguard Worker         // desktop GL. Adjust the frontend format to be sized RGBA16F.
237*8975f5c5SAndroid Build Coastguard Worker         if (internalFormat == GL_RGBA && type == GL_HALF_FLOAT)
238*8975f5c5SAndroid Build Coastguard Worker         {
239*8975f5c5SAndroid Build Coastguard Worker             internalFormat = GL_RGBA16F;
240*8975f5c5SAndroid Build Coastguard Worker         }
241*8975f5c5SAndroid Build Coastguard Worker         mColorFormat = gl::Format(internalFormat, type);
242*8975f5c5SAndroid Build Coastguard Worker     }
243*8975f5c5SAndroid Build Coastguard Worker     if (mBuftype == EGL_D3D_TEXTURE_ANGLE)
244*8975f5c5SAndroid Build Coastguard Worker     {
245*8975f5c5SAndroid Build Coastguard Worker         const angle::Format *colorFormat = mImplementation->getD3DTextureColorFormat();
246*8975f5c5SAndroid Build Coastguard Worker         ASSERT(colorFormat != nullptr);
247*8975f5c5SAndroid Build Coastguard Worker         GLenum internalFormat = colorFormat->fboImplementationInternalFormat;
248*8975f5c5SAndroid Build Coastguard Worker         mColorFormat          = gl::Format(internalFormat, colorFormat->componentType);
249*8975f5c5SAndroid Build Coastguard Worker         mGLColorspace         = EGL_GL_COLORSPACE_LINEAR;
250*8975f5c5SAndroid Build Coastguard Worker         if (mColorFormat.info->colorEncoding == GL_SRGB)
251*8975f5c5SAndroid Build Coastguard Worker         {
252*8975f5c5SAndroid Build Coastguard Worker             mGLColorspace = EGL_GL_COLORSPACE_SRGB;
253*8975f5c5SAndroid Build Coastguard Worker         }
254*8975f5c5SAndroid Build Coastguard Worker     }
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     if (mType == EGL_WINDOW_BIT && display->getExtensions().getFrameTimestamps)
257*8975f5c5SAndroid Build Coastguard Worker     {
258*8975f5c5SAndroid Build Coastguard Worker         mState.supportedCompositorTimings = mImplementation->getSupportedCompositorTimings();
259*8975f5c5SAndroid Build Coastguard Worker         mState.supportedTimestamps        = mImplementation->getSupportedTimestamps();
260*8975f5c5SAndroid Build Coastguard Worker     }
261*8975f5c5SAndroid Build Coastguard Worker 
262*8975f5c5SAndroid Build Coastguard Worker     mImplObserverBinding.bind(mImplementation);
263*8975f5c5SAndroid Build Coastguard Worker 
264*8975f5c5SAndroid Build Coastguard Worker     return NoError();
265*8975f5c5SAndroid Build Coastguard Worker }
266*8975f5c5SAndroid Build Coastguard Worker 
makeCurrent(const gl::Context * context)267*8975f5c5SAndroid Build Coastguard Worker Error Surface::makeCurrent(const gl::Context *context)
268*8975f5c5SAndroid Build Coastguard Worker {
269*8975f5c5SAndroid Build Coastguard Worker     if (isLocked())
270*8975f5c5SAndroid Build Coastguard Worker     {
271*8975f5c5SAndroid Build Coastguard Worker         return EglBadAccess();
272*8975f5c5SAndroid Build Coastguard Worker     }
273*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->makeCurrent(context));
274*8975f5c5SAndroid Build Coastguard Worker     mIsCurrentOnAnyContext = true;
275*8975f5c5SAndroid Build Coastguard Worker     addRef();
276*8975f5c5SAndroid Build Coastguard Worker     return NoError();
277*8975f5c5SAndroid Build Coastguard Worker }
278*8975f5c5SAndroid Build Coastguard Worker 
unMakeCurrent(const gl::Context * context)279*8975f5c5SAndroid Build Coastguard Worker Error Surface::unMakeCurrent(const gl::Context *context)
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->unMakeCurrent(context));
282*8975f5c5SAndroid Build Coastguard Worker     mIsCurrentOnAnyContext = false;
283*8975f5c5SAndroid Build Coastguard Worker     return releaseRef(context->getDisplay());
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker 
releaseRef(const Display * display)286*8975f5c5SAndroid Build Coastguard Worker Error Surface::releaseRef(const Display *display)
287*8975f5c5SAndroid Build Coastguard Worker {
288*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRefCount > 0);
289*8975f5c5SAndroid Build Coastguard Worker     mRefCount--;
290*8975f5c5SAndroid Build Coastguard Worker     if (mRefCount == 0 && mDestroyed)
291*8975f5c5SAndroid Build Coastguard Worker     {
292*8975f5c5SAndroid Build Coastguard Worker         ASSERT(display);
293*8975f5c5SAndroid Build Coastguard Worker         return destroyImpl(display);
294*8975f5c5SAndroid Build Coastguard Worker     }
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     return NoError();
297*8975f5c5SAndroid Build Coastguard Worker }
298*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const Display * display)299*8975f5c5SAndroid Build Coastguard Worker Error Surface::onDestroy(const Display *display)
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker     mDestroyed = true;
302*8975f5c5SAndroid Build Coastguard Worker     if (mRefCount == 0)
303*8975f5c5SAndroid Build Coastguard Worker     {
304*8975f5c5SAndroid Build Coastguard Worker         return destroyImpl(display);
305*8975f5c5SAndroid Build Coastguard Worker     }
306*8975f5c5SAndroid Build Coastguard Worker     return NoError();
307*8975f5c5SAndroid Build Coastguard Worker }
308*8975f5c5SAndroid Build Coastguard Worker 
setLabel(EGLLabelKHR label)309*8975f5c5SAndroid Build Coastguard Worker void Surface::setLabel(EGLLabelKHR label)
310*8975f5c5SAndroid Build Coastguard Worker {
311*8975f5c5SAndroid Build Coastguard Worker     mState.label = label;
312*8975f5c5SAndroid Build Coastguard Worker }
313*8975f5c5SAndroid Build Coastguard Worker 
getLabel() const314*8975f5c5SAndroid Build Coastguard Worker EGLLabelKHR Surface::getLabel() const
315*8975f5c5SAndroid Build Coastguard Worker {
316*8975f5c5SAndroid Build Coastguard Worker     return mState.label;
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker 
getType() const319*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getType() const
320*8975f5c5SAndroid Build Coastguard Worker {
321*8975f5c5SAndroid Build Coastguard Worker     return mType;
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker 
prepareSwap(const gl::Context * context)324*8975f5c5SAndroid Build Coastguard Worker Error Surface::prepareSwap(const gl::Context *context)
325*8975f5c5SAndroid Build Coastguard Worker {
326*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::prepareSwap");
327*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->prepareSwap(context);
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker 
swap(gl::Context * context)330*8975f5c5SAndroid Build Coastguard Worker Error Surface::swap(gl::Context *context)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swap");
333*8975f5c5SAndroid Build Coastguard Worker     context->onPreSwap();
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     context->getState().getOverlay()->onSwap();
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->swap(context));
338*8975f5c5SAndroid Build Coastguard Worker     postSwap(context);
339*8975f5c5SAndroid Build Coastguard Worker     return NoError();
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker 
swapWithDamage(gl::Context * context,const EGLint * rects,EGLint n_rects)342*8975f5c5SAndroid Build Coastguard Worker Error Surface::swapWithDamage(gl::Context *context, const EGLint *rects, EGLint n_rects)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swapWithDamage");
345*8975f5c5SAndroid Build Coastguard Worker     context->onPreSwap();
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     context->getState().getOverlay()->onSwap();
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->swapWithDamage(context, rects, n_rects));
350*8975f5c5SAndroid Build Coastguard Worker     postSwap(context);
351*8975f5c5SAndroid Build Coastguard Worker     return NoError();
352*8975f5c5SAndroid Build Coastguard Worker }
353*8975f5c5SAndroid Build Coastguard Worker 
swapWithFrameToken(gl::Context * context,EGLFrameTokenANGLE frameToken)354*8975f5c5SAndroid Build Coastguard Worker Error Surface::swapWithFrameToken(gl::Context *context, EGLFrameTokenANGLE frameToken)
355*8975f5c5SAndroid Build Coastguard Worker {
356*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swapWithFrameToken");
357*8975f5c5SAndroid Build Coastguard Worker     context->onPreSwap();
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     context->getState().getOverlay()->onSwap();
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->swapWithFrameToken(context, frameToken));
362*8975f5c5SAndroid Build Coastguard Worker     postSwap(context);
363*8975f5c5SAndroid Build Coastguard Worker     return NoError();
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker 
postSubBuffer(const gl::Context * context,EGLint x,EGLint y,EGLint width,EGLint height)366*8975f5c5SAndroid Build Coastguard Worker Error Surface::postSubBuffer(const gl::Context *context,
367*8975f5c5SAndroid Build Coastguard Worker                              EGLint x,
368*8975f5c5SAndroid Build Coastguard Worker                              EGLint y,
369*8975f5c5SAndroid Build Coastguard Worker                              EGLint width,
370*8975f5c5SAndroid Build Coastguard Worker                              EGLint height)
371*8975f5c5SAndroid Build Coastguard Worker {
372*8975f5c5SAndroid Build Coastguard Worker     if (width == 0 || height == 0)
373*8975f5c5SAndroid Build Coastguard Worker     {
374*8975f5c5SAndroid Build Coastguard Worker         return egl::NoError();
375*8975f5c5SAndroid Build Coastguard Worker     }
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker     context->getState().getOverlay()->onSwap();
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->postSubBuffer(context, x, y, width, height));
380*8975f5c5SAndroid Build Coastguard Worker     postSwap(context);
381*8975f5c5SAndroid Build Coastguard Worker     return NoError();
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker 
setPresentationTime(EGLnsecsANDROID time)384*8975f5c5SAndroid Build Coastguard Worker Error Surface::setPresentationTime(EGLnsecsANDROID time)
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->setPresentationTime(time);
387*8975f5c5SAndroid Build Coastguard Worker }
388*8975f5c5SAndroid Build Coastguard Worker 
querySurfacePointerANGLE(EGLint attribute,void ** value)389*8975f5c5SAndroid Build Coastguard Worker Error Surface::querySurfacePointerANGLE(EGLint attribute, void **value)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->querySurfacePointerANGLE(attribute, value);
392*8975f5c5SAndroid Build Coastguard Worker }
393*8975f5c5SAndroid Build Coastguard Worker 
isPostSubBufferSupported() const394*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::isPostSubBufferSupported() const
395*8975f5c5SAndroid Build Coastguard Worker {
396*8975f5c5SAndroid Build Coastguard Worker     return mPostSubBufferRequested && mImplementation->isPostSubBufferSupported();
397*8975f5c5SAndroid Build Coastguard Worker }
398*8975f5c5SAndroid Build Coastguard Worker 
setSwapInterval(const Display * display,EGLint interval)399*8975f5c5SAndroid Build Coastguard Worker void Surface::setSwapInterval(const Display *display, EGLint interval)
400*8975f5c5SAndroid Build Coastguard Worker {
401*8975f5c5SAndroid Build Coastguard Worker     mImplementation->setSwapInterval(display, interval);
402*8975f5c5SAndroid Build Coastguard Worker }
403*8975f5c5SAndroid Build Coastguard Worker 
setMipmapLevel(EGLint level)404*8975f5c5SAndroid Build Coastguard Worker void Surface::setMipmapLevel(EGLint level)
405*8975f5c5SAndroid Build Coastguard Worker {
406*8975f5c5SAndroid Build Coastguard Worker     // Level is set but ignored
407*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
408*8975f5c5SAndroid Build Coastguard Worker     mMipmapLevel = level;
409*8975f5c5SAndroid Build Coastguard Worker }
410*8975f5c5SAndroid Build Coastguard Worker 
setMultisampleResolve(EGLenum resolve)411*8975f5c5SAndroid Build Coastguard Worker void Surface::setMultisampleResolve(EGLenum resolve)
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     // Behaviour is set but ignored
414*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
415*8975f5c5SAndroid Build Coastguard Worker     mMultisampleResolve = resolve;
416*8975f5c5SAndroid Build Coastguard Worker }
417*8975f5c5SAndroid Build Coastguard Worker 
setSwapBehavior(EGLenum behavior)418*8975f5c5SAndroid Build Coastguard Worker void Surface::setSwapBehavior(EGLenum behavior)
419*8975f5c5SAndroid Build Coastguard Worker {
420*8975f5c5SAndroid Build Coastguard Worker     // Behaviour is set but ignored
421*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
422*8975f5c5SAndroid Build Coastguard Worker     mState.swapBehavior = behavior;
423*8975f5c5SAndroid Build Coastguard Worker }
424*8975f5c5SAndroid Build Coastguard Worker 
setFixedWidth(EGLint width)425*8975f5c5SAndroid Build Coastguard Worker void Surface::setFixedWidth(EGLint width)
426*8975f5c5SAndroid Build Coastguard Worker {
427*8975f5c5SAndroid Build Coastguard Worker     mFixedWidth = width;
428*8975f5c5SAndroid Build Coastguard Worker     mImplementation->setFixedWidth(width);
429*8975f5c5SAndroid Build Coastguard Worker }
430*8975f5c5SAndroid Build Coastguard Worker 
setFixedHeight(EGLint height)431*8975f5c5SAndroid Build Coastguard Worker void Surface::setFixedHeight(EGLint height)
432*8975f5c5SAndroid Build Coastguard Worker {
433*8975f5c5SAndroid Build Coastguard Worker     mFixedHeight = height;
434*8975f5c5SAndroid Build Coastguard Worker     mImplementation->setFixedHeight(height);
435*8975f5c5SAndroid Build Coastguard Worker }
436*8975f5c5SAndroid Build Coastguard Worker 
getConfig() const437*8975f5c5SAndroid Build Coastguard Worker const Config *Surface::getConfig() const
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker     return mState.config;
440*8975f5c5SAndroid Build Coastguard Worker }
441*8975f5c5SAndroid Build Coastguard Worker 
getPixelAspectRatio() const442*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getPixelAspectRatio() const
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker     return mPixelAspectRatio;
445*8975f5c5SAndroid Build Coastguard Worker }
446*8975f5c5SAndroid Build Coastguard Worker 
getRenderBuffer() const447*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getRenderBuffer() const
448*8975f5c5SAndroid Build Coastguard Worker {
449*8975f5c5SAndroid Build Coastguard Worker     return mRenderBuffer;
450*8975f5c5SAndroid Build Coastguard Worker }
451*8975f5c5SAndroid Build Coastguard Worker 
getSwapBehavior() const452*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getSwapBehavior() const
453*8975f5c5SAndroid Build Coastguard Worker {
454*8975f5c5SAndroid Build Coastguard Worker     return mState.swapBehavior;
455*8975f5c5SAndroid Build Coastguard Worker }
456*8975f5c5SAndroid Build Coastguard Worker 
getTextureFormat() const457*8975f5c5SAndroid Build Coastguard Worker TextureFormat Surface::getTextureFormat() const
458*8975f5c5SAndroid Build Coastguard Worker {
459*8975f5c5SAndroid Build Coastguard Worker     return mTextureFormat;
460*8975f5c5SAndroid Build Coastguard Worker }
461*8975f5c5SAndroid Build Coastguard Worker 
getTextureTarget() const462*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getTextureTarget() const
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker     return mTextureTarget;
465*8975f5c5SAndroid Build Coastguard Worker }
466*8975f5c5SAndroid Build Coastguard Worker 
getLargestPbuffer() const467*8975f5c5SAndroid Build Coastguard Worker bool Surface::getLargestPbuffer() const
468*8975f5c5SAndroid Build Coastguard Worker {
469*8975f5c5SAndroid Build Coastguard Worker     return mLargestPbuffer;
470*8975f5c5SAndroid Build Coastguard Worker }
471*8975f5c5SAndroid Build Coastguard Worker 
getGLColorspace() const472*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getGLColorspace() const
473*8975f5c5SAndroid Build Coastguard Worker {
474*8975f5c5SAndroid Build Coastguard Worker     return mGLColorspace;
475*8975f5c5SAndroid Build Coastguard Worker }
476*8975f5c5SAndroid Build Coastguard Worker 
getVGAlphaFormat() const477*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getVGAlphaFormat() const
478*8975f5c5SAndroid Build Coastguard Worker {
479*8975f5c5SAndroid Build Coastguard Worker     return mVGAlphaFormat;
480*8975f5c5SAndroid Build Coastguard Worker }
481*8975f5c5SAndroid Build Coastguard Worker 
getVGColorspace() const482*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getVGColorspace() const
483*8975f5c5SAndroid Build Coastguard Worker {
484*8975f5c5SAndroid Build Coastguard Worker     return mVGColorspace;
485*8975f5c5SAndroid Build Coastguard Worker }
486*8975f5c5SAndroid Build Coastguard Worker 
getMipmapTexture() const487*8975f5c5SAndroid Build Coastguard Worker bool Surface::getMipmapTexture() const
488*8975f5c5SAndroid Build Coastguard Worker {
489*8975f5c5SAndroid Build Coastguard Worker     return mMipmapTexture;
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
getMipmapLevel() const492*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getMipmapLevel() const
493*8975f5c5SAndroid Build Coastguard Worker {
494*8975f5c5SAndroid Build Coastguard Worker     return mMipmapLevel;
495*8975f5c5SAndroid Build Coastguard Worker }
496*8975f5c5SAndroid Build Coastguard Worker 
getHorizontalResolution() const497*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getHorizontalResolution() const
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker     return mHorizontalResolution;
500*8975f5c5SAndroid Build Coastguard Worker }
501*8975f5c5SAndroid Build Coastguard Worker 
getVerticalResolution() const502*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getVerticalResolution() const
503*8975f5c5SAndroid Build Coastguard Worker {
504*8975f5c5SAndroid Build Coastguard Worker     return mVerticalResolution;
505*8975f5c5SAndroid Build Coastguard Worker }
506*8975f5c5SAndroid Build Coastguard Worker 
getMultisampleResolve() const507*8975f5c5SAndroid Build Coastguard Worker EGLenum Surface::getMultisampleResolve() const
508*8975f5c5SAndroid Build Coastguard Worker {
509*8975f5c5SAndroid Build Coastguard Worker     return mMultisampleResolve;
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker 
isFixedSize() const512*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::isFixedSize() const
513*8975f5c5SAndroid Build Coastguard Worker {
514*8975f5c5SAndroid Build Coastguard Worker     return mFixedSize;
515*8975f5c5SAndroid Build Coastguard Worker }
516*8975f5c5SAndroid Build Coastguard Worker 
getWidth() const517*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getWidth() const
518*8975f5c5SAndroid Build Coastguard Worker {
519*8975f5c5SAndroid Build Coastguard Worker     return mFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth();
520*8975f5c5SAndroid Build Coastguard Worker }
521*8975f5c5SAndroid Build Coastguard Worker 
getHeight() const522*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getHeight() const
523*8975f5c5SAndroid Build Coastguard Worker {
524*8975f5c5SAndroid Build Coastguard Worker     return mFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight();
525*8975f5c5SAndroid Build Coastguard Worker }
526*8975f5c5SAndroid Build Coastguard Worker 
getUserWidth(const egl::Display * display,EGLint * value) const527*8975f5c5SAndroid Build Coastguard Worker egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) const
528*8975f5c5SAndroid Build Coastguard Worker {
529*8975f5c5SAndroid Build Coastguard Worker     if (mFixedSize)
530*8975f5c5SAndroid Build Coastguard Worker     {
531*8975f5c5SAndroid Build Coastguard Worker         *value = static_cast<EGLint>(mFixedWidth);
532*8975f5c5SAndroid Build Coastguard Worker         return NoError();
533*8975f5c5SAndroid Build Coastguard Worker     }
534*8975f5c5SAndroid Build Coastguard Worker     else
535*8975f5c5SAndroid Build Coastguard Worker     {
536*8975f5c5SAndroid Build Coastguard Worker         return mImplementation->getUserWidth(display, value);
537*8975f5c5SAndroid Build Coastguard Worker     }
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker 
getUserHeight(const egl::Display * display,EGLint * value) const540*8975f5c5SAndroid Build Coastguard Worker egl::Error Surface::getUserHeight(const egl::Display *display, EGLint *value) const
541*8975f5c5SAndroid Build Coastguard Worker {
542*8975f5c5SAndroid Build Coastguard Worker     if (mFixedSize)
543*8975f5c5SAndroid Build Coastguard Worker     {
544*8975f5c5SAndroid Build Coastguard Worker         *value = static_cast<EGLint>(mFixedHeight);
545*8975f5c5SAndroid Build Coastguard Worker         return NoError();
546*8975f5c5SAndroid Build Coastguard Worker     }
547*8975f5c5SAndroid Build Coastguard Worker     else
548*8975f5c5SAndroid Build Coastguard Worker     {
549*8975f5c5SAndroid Build Coastguard Worker         return mImplementation->getUserHeight(display, value);
550*8975f5c5SAndroid Build Coastguard Worker     }
551*8975f5c5SAndroid Build Coastguard Worker }
552*8975f5c5SAndroid Build Coastguard Worker 
bindTexImage(gl::Context * context,gl::Texture * texture,EGLint buffer)553*8975f5c5SAndroid Build Coastguard Worker Error Surface::bindTexImage(gl::Context *context, gl::Texture *texture, EGLint buffer)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!mTexture);
556*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->bindTexImage(context, texture, buffer));
557*8975f5c5SAndroid Build Coastguard Worker     Surface *previousSurface = texture->getBoundSurface();
558*8975f5c5SAndroid Build Coastguard Worker     if (previousSurface != nullptr)
559*8975f5c5SAndroid Build Coastguard Worker     {
560*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(previousSurface->releaseTexImage(context, buffer));
561*8975f5c5SAndroid Build Coastguard Worker     }
562*8975f5c5SAndroid Build Coastguard Worker     if (texture->bindTexImageFromSurface(context, this) == angle::Result::Stop)
563*8975f5c5SAndroid Build Coastguard Worker     {
564*8975f5c5SAndroid Build Coastguard Worker         return Error(EGL_BAD_SURFACE);
565*8975f5c5SAndroid Build Coastguard Worker     }
566*8975f5c5SAndroid Build Coastguard Worker     mTexture = texture;
567*8975f5c5SAndroid Build Coastguard Worker     addRef();
568*8975f5c5SAndroid Build Coastguard Worker 
569*8975f5c5SAndroid Build Coastguard Worker     return NoError();
570*8975f5c5SAndroid Build Coastguard Worker }
571*8975f5c5SAndroid Build Coastguard Worker 
releaseTexImage(const gl::Context * context,EGLint buffer)572*8975f5c5SAndroid Build Coastguard Worker Error Surface::releaseTexImage(const gl::Context *context, EGLint buffer)
573*8975f5c5SAndroid Build Coastguard Worker {
574*8975f5c5SAndroid Build Coastguard Worker     ASSERT(context);
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->releaseTexImage(context, buffer));
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mTexture);
579*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(ResultToEGL(mTexture->releaseTexImageFromSurface(context)));
580*8975f5c5SAndroid Build Coastguard Worker 
581*8975f5c5SAndroid Build Coastguard Worker     return releaseTexImageFromTexture(context);
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker 
getSyncValues(EGLuint64KHR * ust,EGLuint64KHR * msc,EGLuint64KHR * sbc)584*8975f5c5SAndroid Build Coastguard Worker Error Surface::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
585*8975f5c5SAndroid Build Coastguard Worker {
586*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getSyncValues(ust, msc, sbc);
587*8975f5c5SAndroid Build Coastguard Worker }
588*8975f5c5SAndroid Build Coastguard Worker 
getMscRate(EGLint * numerator,EGLint * denominator)589*8975f5c5SAndroid Build Coastguard Worker Error Surface::getMscRate(EGLint *numerator, EGLint *denominator)
590*8975f5c5SAndroid Build Coastguard Worker {
591*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getMscRate(numerator, denominator);
592*8975f5c5SAndroid Build Coastguard Worker }
593*8975f5c5SAndroid Build Coastguard Worker 
releaseTexImageFromTexture(const gl::Context * context)594*8975f5c5SAndroid Build Coastguard Worker Error Surface::releaseTexImageFromTexture(const gl::Context *context)
595*8975f5c5SAndroid Build Coastguard Worker {
596*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mTexture);
597*8975f5c5SAndroid Build Coastguard Worker     mTexture = nullptr;
598*8975f5c5SAndroid Build Coastguard Worker     return releaseRef(context->getDisplay());
599*8975f5c5SAndroid Build Coastguard Worker }
600*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentSize(const gl::ImageIndex &) const601*8975f5c5SAndroid Build Coastguard Worker gl::Extents Surface::getAttachmentSize(const gl::ImageIndex & /*target*/) const
602*8975f5c5SAndroid Build Coastguard Worker {
603*8975f5c5SAndroid Build Coastguard Worker     return gl::Extents(getWidth(), getHeight(), 1);
604*8975f5c5SAndroid Build Coastguard Worker }
605*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentFormat(GLenum binding,const gl::ImageIndex & target) const606*8975f5c5SAndroid Build Coastguard Worker gl::Format Surface::getAttachmentFormat(GLenum binding, const gl::ImageIndex &target) const
607*8975f5c5SAndroid Build Coastguard Worker {
608*8975f5c5SAndroid Build Coastguard Worker     return (binding == GL_BACK ? mColorFormat : mDSFormat);
609*8975f5c5SAndroid Build Coastguard Worker }
610*8975f5c5SAndroid Build Coastguard Worker 
getAttachmentSamples(const gl::ImageIndex & target) const611*8975f5c5SAndroid Build Coastguard Worker GLsizei Surface::getAttachmentSamples(const gl::ImageIndex &target) const
612*8975f5c5SAndroid Build Coastguard Worker {
613*8975f5c5SAndroid Build Coastguard Worker     return getConfig()->samples;
614*8975f5c5SAndroid Build Coastguard Worker }
615*8975f5c5SAndroid Build Coastguard Worker 
isRenderable(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex) const616*8975f5c5SAndroid Build Coastguard Worker bool Surface::isRenderable(const gl::Context *context,
617*8975f5c5SAndroid Build Coastguard Worker                            GLenum binding,
618*8975f5c5SAndroid Build Coastguard Worker                            const gl::ImageIndex &imageIndex) const
619*8975f5c5SAndroid Build Coastguard Worker {
620*8975f5c5SAndroid Build Coastguard Worker     return true;
621*8975f5c5SAndroid Build Coastguard Worker }
622*8975f5c5SAndroid Build Coastguard Worker 
isYUV() const623*8975f5c5SAndroid Build Coastguard Worker bool Surface::isYUV() const
624*8975f5c5SAndroid Build Coastguard Worker {
625*8975f5c5SAndroid Build Coastguard Worker     // EGL_EXT_yuv_surface is not implemented.
626*8975f5c5SAndroid Build Coastguard Worker     return false;
627*8975f5c5SAndroid Build Coastguard Worker }
628*8975f5c5SAndroid Build Coastguard Worker 
isExternalImageWithoutIndividualSync() const629*8975f5c5SAndroid Build Coastguard Worker bool Surface::isExternalImageWithoutIndividualSync() const
630*8975f5c5SAndroid Build Coastguard Worker {
631*8975f5c5SAndroid Build Coastguard Worker     return false;
632*8975f5c5SAndroid Build Coastguard Worker }
633*8975f5c5SAndroid Build Coastguard Worker 
hasFrontBufferUsage() const634*8975f5c5SAndroid Build Coastguard Worker bool Surface::hasFrontBufferUsage() const
635*8975f5c5SAndroid Build Coastguard Worker {
636*8975f5c5SAndroid Build Coastguard Worker     return false;
637*8975f5c5SAndroid Build Coastguard Worker }
638*8975f5c5SAndroid Build Coastguard Worker 
getId() const639*8975f5c5SAndroid Build Coastguard Worker GLuint Surface::getId() const
640*8975f5c5SAndroid Build Coastguard Worker {
641*8975f5c5SAndroid Build Coastguard Worker     return mState.id.value;
642*8975f5c5SAndroid Build Coastguard Worker }
643*8975f5c5SAndroid Build Coastguard Worker 
getBufferAgeImpl(const gl::Context * context,EGLint * age) const644*8975f5c5SAndroid Build Coastguard Worker Error Surface::getBufferAgeImpl(const gl::Context *context, EGLint *age) const
645*8975f5c5SAndroid Build Coastguard Worker {
646*8975f5c5SAndroid Build Coastguard Worker     // When EGL_BUFFER_PRESERVED, the previous frame contents are copied to
647*8975f5c5SAndroid Build Coastguard Worker     // current frame, so the buffer age is always 1.
648*8975f5c5SAndroid Build Coastguard Worker     if (mState.swapBehavior == EGL_BUFFER_PRESERVED)
649*8975f5c5SAndroid Build Coastguard Worker     {
650*8975f5c5SAndroid Build Coastguard Worker         if (age != nullptr)
651*8975f5c5SAndroid Build Coastguard Worker         {
652*8975f5c5SAndroid Build Coastguard Worker             *age = 1;
653*8975f5c5SAndroid Build Coastguard Worker         }
654*8975f5c5SAndroid Build Coastguard Worker         return egl::NoError();
655*8975f5c5SAndroid Build Coastguard Worker     }
656*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getBufferAge(context, age);
657*8975f5c5SAndroid Build Coastguard Worker }
658*8975f5c5SAndroid Build Coastguard Worker 
getBufferAge(const gl::Context * context,EGLint * age)659*8975f5c5SAndroid Build Coastguard Worker Error Surface::getBufferAge(const gl::Context *context, EGLint *age)
660*8975f5c5SAndroid Build Coastguard Worker {
661*8975f5c5SAndroid Build Coastguard Worker     Error err = getBufferAgeImpl(context, age);
662*8975f5c5SAndroid Build Coastguard Worker     if (!err.isError())
663*8975f5c5SAndroid Build Coastguard Worker     {
664*8975f5c5SAndroid Build Coastguard Worker         mBufferAgeQueriedSinceLastSwap = true;
665*8975f5c5SAndroid Build Coastguard Worker     }
666*8975f5c5SAndroid Build Coastguard Worker     return err;
667*8975f5c5SAndroid Build Coastguard Worker }
668*8975f5c5SAndroid Build Coastguard Worker 
initState(GLenum binding,const gl::ImageIndex &) const669*8975f5c5SAndroid Build Coastguard Worker gl::InitState Surface::initState(GLenum binding, const gl::ImageIndex & /*imageIndex*/) const
670*8975f5c5SAndroid Build Coastguard Worker {
671*8975f5c5SAndroid Build Coastguard Worker     switch (binding)
672*8975f5c5SAndroid Build Coastguard Worker     {
673*8975f5c5SAndroid Build Coastguard Worker         case GL_BACK:
674*8975f5c5SAndroid Build Coastguard Worker             return mColorInitState;
675*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH:
676*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL:
677*8975f5c5SAndroid Build Coastguard Worker             return mDepthStencilInitState;
678*8975f5c5SAndroid Build Coastguard Worker         default:
679*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
680*8975f5c5SAndroid Build Coastguard Worker             return gl::InitState::Initialized;
681*8975f5c5SAndroid Build Coastguard Worker     }
682*8975f5c5SAndroid Build Coastguard Worker }
683*8975f5c5SAndroid Build Coastguard Worker 
setInitState(GLenum binding,const gl::ImageIndex &,gl::InitState initState)684*8975f5c5SAndroid Build Coastguard Worker void Surface::setInitState(GLenum binding,
685*8975f5c5SAndroid Build Coastguard Worker                            const gl::ImageIndex & /*imageIndex*/,
686*8975f5c5SAndroid Build Coastguard Worker                            gl::InitState initState)
687*8975f5c5SAndroid Build Coastguard Worker {
688*8975f5c5SAndroid Build Coastguard Worker     switch (binding)
689*8975f5c5SAndroid Build Coastguard Worker     {
690*8975f5c5SAndroid Build Coastguard Worker         case GL_BACK:
691*8975f5c5SAndroid Build Coastguard Worker             mColorInitState = initState;
692*8975f5c5SAndroid Build Coastguard Worker             break;
693*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH:
694*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL:
695*8975f5c5SAndroid Build Coastguard Worker             mDepthStencilInitState = initState;
696*8975f5c5SAndroid Build Coastguard Worker             break;
697*8975f5c5SAndroid Build Coastguard Worker         default:
698*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
699*8975f5c5SAndroid Build Coastguard Worker             break;
700*8975f5c5SAndroid Build Coastguard Worker     }
701*8975f5c5SAndroid Build Coastguard Worker }
702*8975f5c5SAndroid Build Coastguard Worker 
setTimestampsEnabled(bool enabled)703*8975f5c5SAndroid Build Coastguard Worker void Surface::setTimestampsEnabled(bool enabled)
704*8975f5c5SAndroid Build Coastguard Worker {
705*8975f5c5SAndroid Build Coastguard Worker     mImplementation->setTimestampsEnabled(enabled);
706*8975f5c5SAndroid Build Coastguard Worker     mState.timestampsEnabled = enabled;
707*8975f5c5SAndroid Build Coastguard Worker }
708*8975f5c5SAndroid Build Coastguard Worker 
isTimestampsEnabled() const709*8975f5c5SAndroid Build Coastguard Worker bool Surface::isTimestampsEnabled() const
710*8975f5c5SAndroid Build Coastguard Worker {
711*8975f5c5SAndroid Build Coastguard Worker     return mState.timestampsEnabled;
712*8975f5c5SAndroid Build Coastguard Worker }
713*8975f5c5SAndroid Build Coastguard Worker 
setAutoRefreshEnabled(bool enabled)714*8975f5c5SAndroid Build Coastguard Worker Error Surface::setAutoRefreshEnabled(bool enabled)
715*8975f5c5SAndroid Build Coastguard Worker {
716*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->setAutoRefreshEnabled(enabled));
717*8975f5c5SAndroid Build Coastguard Worker     mState.autoRefreshEnabled = enabled;
718*8975f5c5SAndroid Build Coastguard Worker     return NoError();
719*8975f5c5SAndroid Build Coastguard Worker }
720*8975f5c5SAndroid Build Coastguard Worker 
hasProtectedContent() const721*8975f5c5SAndroid Build Coastguard Worker bool Surface::hasProtectedContent() const
722*8975f5c5SAndroid Build Coastguard Worker {
723*8975f5c5SAndroid Build Coastguard Worker     return mState.hasProtectedContent();
724*8975f5c5SAndroid Build Coastguard Worker }
725*8975f5c5SAndroid Build Coastguard Worker 
getSupportedCompositorTimings() const726*8975f5c5SAndroid Build Coastguard Worker const SupportedCompositorTiming &Surface::getSupportedCompositorTimings() const
727*8975f5c5SAndroid Build Coastguard Worker {
728*8975f5c5SAndroid Build Coastguard Worker     return mState.supportedCompositorTimings;
729*8975f5c5SAndroid Build Coastguard Worker }
730*8975f5c5SAndroid Build Coastguard Worker 
getCompositorTiming(EGLint numTimestamps,const EGLint * names,EGLnsecsANDROID * values) const731*8975f5c5SAndroid Build Coastguard Worker Error Surface::getCompositorTiming(EGLint numTimestamps,
732*8975f5c5SAndroid Build Coastguard Worker                                    const EGLint *names,
733*8975f5c5SAndroid Build Coastguard Worker                                    EGLnsecsANDROID *values) const
734*8975f5c5SAndroid Build Coastguard Worker {
735*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getCompositorTiming(numTimestamps, names, values);
736*8975f5c5SAndroid Build Coastguard Worker }
737*8975f5c5SAndroid Build Coastguard Worker 
getNextFrameId(EGLuint64KHR * frameId) const738*8975f5c5SAndroid Build Coastguard Worker Error Surface::getNextFrameId(EGLuint64KHR *frameId) const
739*8975f5c5SAndroid Build Coastguard Worker {
740*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getNextFrameId(frameId);
741*8975f5c5SAndroid Build Coastguard Worker }
742*8975f5c5SAndroid Build Coastguard Worker 
getSupportedTimestamps() const743*8975f5c5SAndroid Build Coastguard Worker const SupportedTimestamps &Surface::getSupportedTimestamps() const
744*8975f5c5SAndroid Build Coastguard Worker {
745*8975f5c5SAndroid Build Coastguard Worker     return mState.supportedTimestamps;
746*8975f5c5SAndroid Build Coastguard Worker }
747*8975f5c5SAndroid Build Coastguard Worker 
getFrameTimestamps(EGLuint64KHR frameId,EGLint numTimestamps,const EGLint * timestamps,EGLnsecsANDROID * values) const748*8975f5c5SAndroid Build Coastguard Worker Error Surface::getFrameTimestamps(EGLuint64KHR frameId,
749*8975f5c5SAndroid Build Coastguard Worker                                   EGLint numTimestamps,
750*8975f5c5SAndroid Build Coastguard Worker                                   const EGLint *timestamps,
751*8975f5c5SAndroid Build Coastguard Worker                                   EGLnsecsANDROID *values) const
752*8975f5c5SAndroid Build Coastguard Worker {
753*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->getFrameTimestamps(frameId, numTimestamps, timestamps, values);
754*8975f5c5SAndroid Build Coastguard Worker }
755*8975f5c5SAndroid Build Coastguard Worker 
onSubjectStateChange(angle::SubjectIndex index,angle::SubjectMessage message)756*8975f5c5SAndroid Build Coastguard Worker void Surface::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
757*8975f5c5SAndroid Build Coastguard Worker {
758*8975f5c5SAndroid Build Coastguard Worker     ASSERT(index == kSurfaceImplSubjectIndex);
759*8975f5c5SAndroid Build Coastguard Worker     switch (message)
760*8975f5c5SAndroid Build Coastguard Worker     {
761*8975f5c5SAndroid Build Coastguard Worker         case angle::SubjectMessage::SubjectChanged:
762*8975f5c5SAndroid Build Coastguard Worker             onStateChange(angle::SubjectMessage::ContentsChanged);
763*8975f5c5SAndroid Build Coastguard Worker             break;
764*8975f5c5SAndroid Build Coastguard Worker         case angle::SubjectMessage::SurfaceChanged:
765*8975f5c5SAndroid Build Coastguard Worker             onStateChange(angle::SubjectMessage::SurfaceChanged);
766*8975f5c5SAndroid Build Coastguard Worker             break;
767*8975f5c5SAndroid Build Coastguard Worker         case angle::SubjectMessage::SwapchainImageChanged:
768*8975f5c5SAndroid Build Coastguard Worker             onStateChange(angle::SubjectMessage::SwapchainImageChanged);
769*8975f5c5SAndroid Build Coastguard Worker             break;
770*8975f5c5SAndroid Build Coastguard Worker         default:
771*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
772*8975f5c5SAndroid Build Coastguard Worker             break;
773*8975f5c5SAndroid Build Coastguard Worker     }
774*8975f5c5SAndroid Build Coastguard Worker }
775*8975f5c5SAndroid Build Coastguard Worker 
setRenderBuffer(EGLint renderBuffer)776*8975f5c5SAndroid Build Coastguard Worker Error Surface::setRenderBuffer(EGLint renderBuffer)
777*8975f5c5SAndroid Build Coastguard Worker {
778*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImplementation->setRenderBuffer(renderBuffer));
779*8975f5c5SAndroid Build Coastguard Worker     mRenderBuffer = renderBuffer;
780*8975f5c5SAndroid Build Coastguard Worker     return NoError();
781*8975f5c5SAndroid Build Coastguard Worker }
782*8975f5c5SAndroid Build Coastguard Worker 
isLocked() const783*8975f5c5SAndroid Build Coastguard Worker bool Surface::isLocked() const
784*8975f5c5SAndroid Build Coastguard Worker {
785*8975f5c5SAndroid Build Coastguard Worker     return (mLockBufferPtr != nullptr);
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker 
getBitmapPitch() const788*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getBitmapPitch() const
789*8975f5c5SAndroid Build Coastguard Worker {
790*8975f5c5SAndroid Build Coastguard Worker     return mLockBufferPitch;
791*8975f5c5SAndroid Build Coastguard Worker }
792*8975f5c5SAndroid Build Coastguard Worker 
getBitmapOrigin() const793*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getBitmapOrigin() const
794*8975f5c5SAndroid Build Coastguard Worker {
795*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->origin();
796*8975f5c5SAndroid Build Coastguard Worker }
797*8975f5c5SAndroid Build Coastguard Worker 
getRedOffset() const798*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getRedOffset() const
799*8975f5c5SAndroid Build Coastguard Worker {
800*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &format = *mColorFormat.info;
801*8975f5c5SAndroid Build Coastguard Worker     if (gl::IsBGRAFormat(format.internalFormat))
802*8975f5c5SAndroid Build Coastguard Worker     {
803*8975f5c5SAndroid Build Coastguard Worker         return format.blueBits + format.greenBits;
804*8975f5c5SAndroid Build Coastguard Worker     }
805*8975f5c5SAndroid Build Coastguard Worker     else
806*8975f5c5SAndroid Build Coastguard Worker     {
807*8975f5c5SAndroid Build Coastguard Worker         return 0;
808*8975f5c5SAndroid Build Coastguard Worker     }
809*8975f5c5SAndroid Build Coastguard Worker }
810*8975f5c5SAndroid Build Coastguard Worker 
getGreenOffset() const811*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getGreenOffset() const
812*8975f5c5SAndroid Build Coastguard Worker {
813*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &format = *mColorFormat.info;
814*8975f5c5SAndroid Build Coastguard Worker     if (gl::IsBGRAFormat(format.internalFormat))
815*8975f5c5SAndroid Build Coastguard Worker     {
816*8975f5c5SAndroid Build Coastguard Worker         return format.blueBits;
817*8975f5c5SAndroid Build Coastguard Worker     }
818*8975f5c5SAndroid Build Coastguard Worker     else
819*8975f5c5SAndroid Build Coastguard Worker     {
820*8975f5c5SAndroid Build Coastguard Worker         return format.redBits;
821*8975f5c5SAndroid Build Coastguard Worker     }
822*8975f5c5SAndroid Build Coastguard Worker }
823*8975f5c5SAndroid Build Coastguard Worker 
getBlueOffset() const824*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getBlueOffset() const
825*8975f5c5SAndroid Build Coastguard Worker {
826*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &format = *mColorFormat.info;
827*8975f5c5SAndroid Build Coastguard Worker     if (gl::IsBGRAFormat(format.internalFormat))
828*8975f5c5SAndroid Build Coastguard Worker     {
829*8975f5c5SAndroid Build Coastguard Worker         return 0;
830*8975f5c5SAndroid Build Coastguard Worker     }
831*8975f5c5SAndroid Build Coastguard Worker     else
832*8975f5c5SAndroid Build Coastguard Worker     {
833*8975f5c5SAndroid Build Coastguard Worker         return format.redBits + format.greenBits;
834*8975f5c5SAndroid Build Coastguard Worker     }
835*8975f5c5SAndroid Build Coastguard Worker }
836*8975f5c5SAndroid Build Coastguard Worker 
getAlphaOffset() const837*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getAlphaOffset() const
838*8975f5c5SAndroid Build Coastguard Worker {
839*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &format = *mColorFormat.info;
840*8975f5c5SAndroid Build Coastguard Worker     if (format.isLUMA())
841*8975f5c5SAndroid Build Coastguard Worker     {
842*8975f5c5SAndroid Build Coastguard Worker         return format.luminanceBits;  // Luma always first, alpha optional
843*8975f5c5SAndroid Build Coastguard Worker     }
844*8975f5c5SAndroid Build Coastguard Worker     // For RGBA/BGRA alpha is last
845*8975f5c5SAndroid Build Coastguard Worker     return format.blueBits + format.greenBits + format.redBits;
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker 
getLuminanceOffset() const848*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getLuminanceOffset() const
849*8975f5c5SAndroid Build Coastguard Worker {
850*8975f5c5SAndroid Build Coastguard Worker     return 0;
851*8975f5c5SAndroid Build Coastguard Worker }
852*8975f5c5SAndroid Build Coastguard Worker 
getBitmapPixelSize() const853*8975f5c5SAndroid Build Coastguard Worker EGLint Surface::getBitmapPixelSize() const
854*8975f5c5SAndroid Build Coastguard Worker {
855*8975f5c5SAndroid Build Coastguard Worker     constexpr EGLint kBitsPerByte    = 8;
856*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &format = *mColorFormat.info;
857*8975f5c5SAndroid Build Coastguard Worker     return (format.pixelBytes * kBitsPerByte);
858*8975f5c5SAndroid Build Coastguard Worker }
859*8975f5c5SAndroid Build Coastguard Worker 
getBitmapPointer() const860*8975f5c5SAndroid Build Coastguard Worker EGLAttribKHR Surface::getBitmapPointer() const
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker     return static_cast<EGLAttribKHR>((intptr_t)mLockBufferPtr);
863*8975f5c5SAndroid Build Coastguard Worker }
864*8975f5c5SAndroid Build Coastguard Worker 
lockSurfaceKHR(const egl::Display * display,const AttributeMap & attributes)865*8975f5c5SAndroid Build Coastguard Worker egl::Error Surface::lockSurfaceKHR(const egl::Display *display, const AttributeMap &attributes)
866*8975f5c5SAndroid Build Coastguard Worker {
867*8975f5c5SAndroid Build Coastguard Worker     EGLint lockBufferUsageHint = attributes.getAsInt(
868*8975f5c5SAndroid Build Coastguard Worker         EGL_LOCK_USAGE_HINT_KHR, (EGL_READ_SURFACE_BIT_KHR | EGL_WRITE_SURFACE_BIT_KHR));
869*8975f5c5SAndroid Build Coastguard Worker 
870*8975f5c5SAndroid Build Coastguard Worker     bool preservePixels = ((attributes.getAsInt(EGL_MAP_PRESERVE_PIXELS_KHR, false) == EGL_TRUE) ||
871*8975f5c5SAndroid Build Coastguard Worker                            (mState.swapBehavior == EGL_BUFFER_PRESERVED));
872*8975f5c5SAndroid Build Coastguard Worker 
873*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->lockSurface(display, lockBufferUsageHint, preservePixels,
874*8975f5c5SAndroid Build Coastguard Worker                                         &mLockBufferPtr, &mLockBufferPitch);
875*8975f5c5SAndroid Build Coastguard Worker }
876*8975f5c5SAndroid Build Coastguard Worker 
unlockSurfaceKHR(const egl::Display * display)877*8975f5c5SAndroid Build Coastguard Worker egl::Error Surface::unlockSurfaceKHR(const egl::Display *display)
878*8975f5c5SAndroid Build Coastguard Worker {
879*8975f5c5SAndroid Build Coastguard Worker     mLockBufferPtr   = nullptr;
880*8975f5c5SAndroid Build Coastguard Worker     mLockBufferPitch = 0;
881*8975f5c5SAndroid Build Coastguard Worker     return mImplementation->unlockSurface(display, true);
882*8975f5c5SAndroid Build Coastguard Worker }
883*8975f5c5SAndroid Build Coastguard Worker 
WindowSurface(rx::EGLImplFactory * implFactory,SurfaceID id,const egl::Config * config,EGLNativeWindowType window,const AttributeMap & attribs,bool robustResourceInit)884*8975f5c5SAndroid Build Coastguard Worker WindowSurface::WindowSurface(rx::EGLImplFactory *implFactory,
885*8975f5c5SAndroid Build Coastguard Worker                              SurfaceID id,
886*8975f5c5SAndroid Build Coastguard Worker                              const egl::Config *config,
887*8975f5c5SAndroid Build Coastguard Worker                              EGLNativeWindowType window,
888*8975f5c5SAndroid Build Coastguard Worker                              const AttributeMap &attribs,
889*8975f5c5SAndroid Build Coastguard Worker                              bool robustResourceInit)
890*8975f5c5SAndroid Build Coastguard Worker     : Surface(EGL_WINDOW_BIT, id, config, attribs, robustResourceInit)
891*8975f5c5SAndroid Build Coastguard Worker {
892*8975f5c5SAndroid Build Coastguard Worker     mImplementation = implFactory->createWindowSurface(mState, window, attribs);
893*8975f5c5SAndroid Build Coastguard Worker }
894*8975f5c5SAndroid Build Coastguard Worker 
setDamageRegion(const EGLint * rects,EGLint n_rects)895*8975f5c5SAndroid Build Coastguard Worker void Surface::setDamageRegion(const EGLint *rects, EGLint n_rects)
896*8975f5c5SAndroid Build Coastguard Worker {
897*8975f5c5SAndroid Build Coastguard Worker     mIsDamageRegionSet = true;
898*8975f5c5SAndroid Build Coastguard Worker }
899*8975f5c5SAndroid Build Coastguard Worker 
~WindowSurface()900*8975f5c5SAndroid Build Coastguard Worker WindowSurface::~WindowSurface() {}
901*8975f5c5SAndroid Build Coastguard Worker 
PbufferSurface(rx::EGLImplFactory * implFactory,SurfaceID id,const Config * config,const AttributeMap & attribs,bool robustResourceInit)902*8975f5c5SAndroid Build Coastguard Worker PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
903*8975f5c5SAndroid Build Coastguard Worker                                SurfaceID id,
904*8975f5c5SAndroid Build Coastguard Worker                                const Config *config,
905*8975f5c5SAndroid Build Coastguard Worker                                const AttributeMap &attribs,
906*8975f5c5SAndroid Build Coastguard Worker                                bool robustResourceInit)
907*8975f5c5SAndroid Build Coastguard Worker     : Surface(EGL_PBUFFER_BIT, id, config, attribs, robustResourceInit)
908*8975f5c5SAndroid Build Coastguard Worker {
909*8975f5c5SAndroid Build Coastguard Worker     mImplementation = implFactory->createPbufferSurface(mState, attribs);
910*8975f5c5SAndroid Build Coastguard Worker }
911*8975f5c5SAndroid Build Coastguard Worker 
PbufferSurface(rx::EGLImplFactory * implFactory,SurfaceID id,const Config * config,EGLenum buftype,EGLClientBuffer clientBuffer,const AttributeMap & attribs,bool robustResourceInit)912*8975f5c5SAndroid Build Coastguard Worker PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
913*8975f5c5SAndroid Build Coastguard Worker                                SurfaceID id,
914*8975f5c5SAndroid Build Coastguard Worker                                const Config *config,
915*8975f5c5SAndroid Build Coastguard Worker                                EGLenum buftype,
916*8975f5c5SAndroid Build Coastguard Worker                                EGLClientBuffer clientBuffer,
917*8975f5c5SAndroid Build Coastguard Worker                                const AttributeMap &attribs,
918*8975f5c5SAndroid Build Coastguard Worker                                bool robustResourceInit)
919*8975f5c5SAndroid Build Coastguard Worker     : Surface(EGL_PBUFFER_BIT, id, config, attribs, robustResourceInit, buftype)
920*8975f5c5SAndroid Build Coastguard Worker {
921*8975f5c5SAndroid Build Coastguard Worker     mImplementation =
922*8975f5c5SAndroid Build Coastguard Worker         implFactory->createPbufferFromClientBuffer(mState, buftype, clientBuffer, attribs);
923*8975f5c5SAndroid Build Coastguard Worker }
924*8975f5c5SAndroid Build Coastguard Worker 
~PbufferSurface()925*8975f5c5SAndroid Build Coastguard Worker PbufferSurface::~PbufferSurface() {}
926*8975f5c5SAndroid Build Coastguard Worker 
PixmapSurface(rx::EGLImplFactory * implFactory,SurfaceID id,const Config * config,NativePixmapType nativePixmap,const AttributeMap & attribs,bool robustResourceInit)927*8975f5c5SAndroid Build Coastguard Worker PixmapSurface::PixmapSurface(rx::EGLImplFactory *implFactory,
928*8975f5c5SAndroid Build Coastguard Worker                              SurfaceID id,
929*8975f5c5SAndroid Build Coastguard Worker                              const Config *config,
930*8975f5c5SAndroid Build Coastguard Worker                              NativePixmapType nativePixmap,
931*8975f5c5SAndroid Build Coastguard Worker                              const AttributeMap &attribs,
932*8975f5c5SAndroid Build Coastguard Worker                              bool robustResourceInit)
933*8975f5c5SAndroid Build Coastguard Worker     : Surface(EGL_PIXMAP_BIT, id, config, attribs, robustResourceInit)
934*8975f5c5SAndroid Build Coastguard Worker {
935*8975f5c5SAndroid Build Coastguard Worker     mImplementation = implFactory->createPixmapSurface(mState, nativePixmap, attribs);
936*8975f5c5SAndroid Build Coastguard Worker }
937*8975f5c5SAndroid Build Coastguard Worker 
~PixmapSurface()938*8975f5c5SAndroid Build Coastguard Worker PixmapSurface::~PixmapSurface() {}
939*8975f5c5SAndroid Build Coastguard Worker 
940*8975f5c5SAndroid Build Coastguard Worker // SurfaceDeleter implementation.
941*8975f5c5SAndroid Build Coastguard Worker 
SurfaceDeleter(const Display * display)942*8975f5c5SAndroid Build Coastguard Worker SurfaceDeleter::SurfaceDeleter(const Display *display) : mDisplay(display) {}
943*8975f5c5SAndroid Build Coastguard Worker 
~SurfaceDeleter()944*8975f5c5SAndroid Build Coastguard Worker SurfaceDeleter::~SurfaceDeleter() {}
945*8975f5c5SAndroid Build Coastguard Worker 
operator ()(Surface * surface)946*8975f5c5SAndroid Build Coastguard Worker void SurfaceDeleter::operator()(Surface *surface)
947*8975f5c5SAndroid Build Coastguard Worker {
948*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SWALLOW_ERR(surface->onDestroy(mDisplay));
949*8975f5c5SAndroid Build Coastguard Worker }
950*8975f5c5SAndroid Build Coastguard Worker 
951*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
952