Present: Check for window/fence destroyed when idling pixmaps
A client destroying objects in the middle of an unflip can end up having the screen flip window or fence set to NULL in the unflip notify path. Check for these and don't try to use those objects. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
		
							parent
							
								
									41da295eb5
								
							
						
					
					
						commit
						20bb49ae9b
					
				|  | @ -184,7 +184,9 @@ present_vblank_notify(present_vblank_ptr vblank, CARD8 kind, CARD8 mode, uint64_ | ||||||
| static void | static void | ||||||
| present_pixmap_idle(PixmapPtr pixmap, WindowPtr window, CARD32 serial, struct present_fence *present_fence) | present_pixmap_idle(PixmapPtr pixmap, WindowPtr window, CARD32 serial, struct present_fence *present_fence) | ||||||
| { | { | ||||||
|  |     if (present_fence) | ||||||
|         present_fence_set_triggered(present_fence); |         present_fence_set_triggered(present_fence); | ||||||
|  |     if (window) | ||||||
|         present_send_idle_notify(window, serial, pixmap, present_fence); |         present_send_idle_notify(window, serial, pixmap, present_fence); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -297,6 +299,7 @@ present_flip_idle(ScreenPtr screen) | ||||||
|     if (screen_priv->flip_pixmap) { |     if (screen_priv->flip_pixmap) { | ||||||
|         present_pixmap_idle(screen_priv->flip_pixmap, screen_priv->flip_window, |         present_pixmap_idle(screen_priv->flip_pixmap, screen_priv->flip_window, | ||||||
|                             screen_priv->flip_serial, screen_priv->flip_idle_fence); |                             screen_priv->flip_serial, screen_priv->flip_idle_fence); | ||||||
|  |         if (screen_priv->flip_idle_fence) | ||||||
|             present_fence_destroy(screen_priv->flip_idle_fence); |             present_fence_destroy(screen_priv->flip_idle_fence); | ||||||
|         dixDestroyPixmap(screen_priv->flip_pixmap, screen_priv->flip_pixmap->drawable.id); |         dixDestroyPixmap(screen_priv->flip_pixmap, screen_priv->flip_pixmap->drawable.id); | ||||||
|         screen_priv->flip_crtc = NULL; |         screen_priv->flip_crtc = NULL; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue