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