@@ -117,104 +117,6 @@ WaylandSurface::~WaylandSurface() {
117117 "We can't release WaylandSurface with numap callback!" );
118118}
119119
120- void WaylandSurface ::ReadyToDrawFrameCallbackHandler (
121- struct wl_callback * callback ) {
122- LOGWAYLAND (
123- "WaylandSurface::ReadyToDrawFrameCallbackHandler() "
124- "mReadyToDrawFrameCallback %p mIsReadyToDraw %d initial_draw callback "
125- "%zd\n" ,
126- (void * )mReadyToDrawFrameCallback , (bool )mIsReadyToDraw ,
127- mReadyToDrawCallbacks .size ());
128-
129- // We're supposed to run on main thread only.
130- AssertIsOnMainThread ();
131-
132- // mReadyToDrawFrameCallback/callback can be nullptr when redering directly
133- // to GtkWidget and ReadyToDrawFrameCallbackHandler is called by us from main
134- // thread by WaylandSurface::Map().
135- MOZ_RELEASE_ASSERT (mReadyToDrawFrameCallback == callback );
136-
137- std ::vector < std ::function < void (void )>> cbs ;
138- {
139- WaylandSurfaceLock lock (this );
140- MozClearPointer (mReadyToDrawFrameCallback , wl_callback_destroy );
141- // It's possible that we're already unmapped so quit in such case.
142- if (!mIsMapped ) {
143- LOGWAYLAND (" WaylandSurface is unmapped, quit." );
144- if (!mReadyToDrawCallbacks .empty ()) {
145- NS_WARNING ("Unmapping WaylandSurface with active draw callback!" );
146- mReadyToDrawCallbacks .clear ();
147- }
148- return ;
149- }
150- if (mIsReadyToDraw ) {
151- return ;
152- }
153- mIsReadyToDraw = true;
154- cbs = std ::move (mReadyToDrawCallbacks );
155-
156- RequestFrameCallbackLocked (lock );
157- }
158-
159- // We can't call the callbacks under lock
160- #ifdef MOZ_LOGGING
161- int callbackNum = 0 ;
162- #endif
163- for (auto const & cb : cbs ) {
164- LOGWAYLAND (" initial callback fire [%d]" , callbackNum ++ );
165- cb ();
166- }
167- }
168-
169- static void ReadyToDrawFrameCallbackHandler (void * aWaylandSurface ,
170- struct wl_callback * callback ,
171- uint32_t time ) {
172- auto* waylandSurface = static_cast < WaylandSurface * > (aWaylandSurface );
173- waylandSurface -> ReadyToDrawFrameCallbackHandler (callback );
174- }
175-
176- static const struct wl_callback_listener
177- sWaylandSurfaceReadyToDrawFrameListener = {
178- ::ReadyToDrawFrameCallbackHandler };
179-
180- void WaylandSurface ::AddReadyToDrawCallbackLocked (
181- const WaylandSurfaceLock & aProofOfLock ,
182- const std ::function < void (void )> & aDrawCB ) {
183- LOGVERBOSE ("WaylandSurface::AddReadyToDrawCallbackLocked()" );
184- MOZ_DIAGNOSTIC_ASSERT (& aProofOfLock == mSurfaceLock );
185- mReadyToDrawCallbacks .push_back (aDrawCB );
186- }
187-
188- void WaylandSurface ::AddOrFireReadyToDrawCallback (
189- const std ::function < void (void )> & aDrawCB ) {
190- {
191- WaylandSurfaceLock lock (this );
192- if (!mIsReadyToDraw ) {
193- LOGVERBOSE (
194- "WaylandSurface::AddOrFireReadyToDrawCallback() callback stored" );
195- mReadyToDrawCallbacks .push_back (aDrawCB );
196- return ;
197- }
198- }
199-
200- LOGWAYLAND ("WaylandSurface::AddOrFireReadyToDrawCallback() callback fire" );
201-
202- // We're ready to draw and we have a surface to draw into.
203- aDrawCB ();
204- }
205-
206- void WaylandSurface ::ClearReadyToDrawCallbacksLocked (
207- const WaylandSurfaceLock & aProofOfLock ) {
208- MOZ_DIAGNOSTIC_ASSERT (& aProofOfLock == mSurfaceLock );
209- MozClearPointer (mReadyToDrawFrameCallback , wl_callback_destroy );
210- mReadyToDrawCallbacks .clear ();
211- }
212-
213- void WaylandSurface ::ClearReadyToDrawCallbacks () {
214- WaylandSurfaceLock lock (this );
215- ClearReadyToDrawCallbacksLocked (lock );
216- }
217-
218120bool WaylandSurface ::HasEmulatedFrameCallbackLocked (
219121 const WaylandSurfaceLock & aProofOfLock ) const {
220122 return mFrameCallbackHandler .IsSet () && mFrameCallbackHandler .mEmulated ;
@@ -233,7 +135,7 @@ void WaylandSurface::FrameCallbackHandler(struct wl_callback* aCallback,
233135 WaylandSurfaceLock lock (this );
234136
235137 // Don't run emulated callbacks on hidden surfaces
236- if ((emulatedCallback || aRoutedFromChildSurface ) && !mIsReadyToDraw ) {
138+ if ((emulatedCallback || aRoutedFromChildSurface ) && !mIsVisible ) {
237139 return ;
238140 }
239141
@@ -259,6 +161,7 @@ void WaylandSurface::FrameCallbackHandler(struct wl_callback* aCallback,
259161 // We're getting regular frame callback from this surface so we must
260162 // have buffer attached.
261163 if (!emulatedCallback && !aRoutedFromChildSurface ) {
164+ mIsVisible = true;
262165 mBufferAttached = true;
263166 }
264167
@@ -478,8 +381,7 @@ bool WaylandSurface::MapLocked(const WaylandSurfaceLock& aProofOfLock,
478381 wl_surface * aParentWLSurface ,
479382 WaylandSurfaceLock * aParentWaylandSurfaceLock ,
480383 gfx ::IntPoint aSubsurfacePosition ,
481- bool aSubsurfaceDesync ,
482- bool aUseReadyToDrawCallback ) {
384+ bool aSubsurfaceDesync ) {
483385 LOGWAYLAND ("WaylandSurface::MapLocked()" );
484386 MOZ_DIAGNOSTIC_ASSERT (& aProofOfLock == mSurfaceLock );
485387 MOZ_DIAGNOSTIC_ASSERT (!mIsMapped , "Already mapped?" );
@@ -519,14 +421,6 @@ bool WaylandSurface::MapLocked(const WaylandSurfaceLock& aProofOfLock,
519421 LOGWAYLAND (" subsurface position [%d,%d]" , (int )mSubsurfacePosition .x ,
520422 (int )mSubsurfacePosition .y );
521423
522- if (aUseReadyToDrawCallback ) {
523- mReadyToDrawFrameCallback = wl_surface_frame (mParentSurface );
524- wl_callback_add_listener (mReadyToDrawFrameCallback ,
525- & sWaylandSurfaceReadyToDrawFrameListener , this );
526- LOGWAYLAND (" created ready to draw frame callback ID %d\n" ,
527- wl_proxy_get_id ((struct wl_proxy * )mReadyToDrawFrameCallback ));
528- }
529-
530424 LOGWAYLAND (" register frame callback" );
531425 RequestFrameCallbackLocked (aProofOfLock );
532426
@@ -556,8 +450,7 @@ bool WaylandSurface::MapLocked(const WaylandSurfaceLock& aProofOfLock,
556450 gfx ::IntPoint aSubsurfacePosition ) {
557451 return MapLocked (aProofOfLock , nullptr , aParentWaylandSurfaceLock ,
558452 aSubsurfacePosition ,
559- /* aSubsurfaceDesync */ false,
560- /* aUseReadyToDrawCallback */ false);
453+ /* aSubsurfaceDesync */ false);
561454}
562455
563456void WaylandSurface ::SetUnmapCallbackLocked (
@@ -609,11 +502,11 @@ void WaylandSurface::UnmapLocked(WaylandSurfaceLock& aSurfaceLock) {
609502 return ;
610503 }
611504 mIsMapped = false;
505+ mIsVisible = false;
612506
613507 LOGWAYLAND ("WaylandSurface::UnmapLocked()" );
614508
615509 RemoveAttachedBufferLocked (aSurfaceLock );
616- ClearReadyToDrawCallbacksLocked (aSurfaceLock );
617510 ClearFrameCallbackLocked (aSurfaceLock );
618511 ClearScaleLocked (aSurfaceLock );
619512
@@ -633,9 +526,6 @@ void WaylandSurface::UnmapLocked(WaylandSurfaceLock& aSurfaceLock) {
633526 MozClearPointer (mPendingOpaqueRegion , wl_region_destroy );
634527 MozClearPointer (mOpaqueRegionFrameCallback , wl_callback_destroy );
635528
636- mIsReadyToDraw = false;
637- mBufferAttached = false;
638-
639529 // Remove references to WaylandBuffers attached to mSurface,
640530 // we don't want to get any buffer release callback when we're unmapped.
641531 ReleaseAllWaylandTransactionsLocked (aSurfaceLock );
0 commit comments