xwayland/eglstream: Check framebuffer status
The EGLStream backend would sometime generate GL errors trying to draw to the framebuffer, which gives an invalid buffer, which in turn would generate a Wayland error from the compositor which is fatal to the client. Check the framebuffer status and bail out early if it's not complete, to avoid getting into trouble later. Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Reviewed-by: Michel Dänzer <mdaenzer@redhat.com> https://gitlab.freedesktop.org/xorg/xserver/-/issues/1156
This commit is contained in:
		
							parent
							
								
									252cbad316
								
							
						
					
					
						commit
						85244d2a20
					
				|  | @ -619,6 +619,7 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window, | ||||||
|         box->x2 - box->x1, box->y2 - box->y1 |         box->x2 - box->x1, box->y2 - box->y1 | ||||||
|     }; |     }; | ||||||
|     GLint saved_vao; |     GLint saved_vao; | ||||||
|  |     int status; | ||||||
| 
 | 
 | ||||||
|     if (xwl_pixmap->type != XWL_PIXMAP_EGLSTREAM) |     if (xwl_pixmap->type != XWL_PIXMAP_EGLSTREAM) | ||||||
|         /* This can happen if a client does X11 rendering on a
 |         /* This can happen if a client does X11 rendering on a
 | ||||||
|  | @ -652,6 +653,13 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window, | ||||||
|     glUniform1i(xwl_eglstream->blit_is_rgba_pos, |     glUniform1i(xwl_eglstream->blit_is_rgba_pos, | ||||||
|                 pixmap->drawable.depth >= 32); |                 pixmap->drawable.depth >= 32); | ||||||
| 
 | 
 | ||||||
|  |     status = glCheckFramebufferStatus(GL_FRAMEBUFFER); | ||||||
|  |     if (status != GL_FRAMEBUFFER_COMPLETE) { | ||||||
|  |         ErrorF("eglstream: Framebuffer incomplete 0x%X, not posting damage\n", status); | ||||||
|  |         status = FALSE; | ||||||
|  |         goto out; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /* Blit rendered image into EGLStream surface */ |     /* Blit rendered image into EGLStream surface */ | ||||||
|     glDrawBuffer(GL_BACK); |     glDrawBuffer(GL_BACK); | ||||||
|     glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |     glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | ||||||
|  | @ -662,14 +670,16 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window, | ||||||
|     else |     else | ||||||
|         eglSwapBuffers(xwl_screen->egl_display, xwl_pixmap->surface); |         eglSwapBuffers(xwl_screen->egl_display, xwl_pixmap->surface); | ||||||
| 
 | 
 | ||||||
|  |     /* hang onto the pixmap until the compositor has released it */ | ||||||
|  |     pixmap->refcnt++; | ||||||
|  |     status = TRUE; | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|     /* Restore previous state */ |     /* Restore previous state */ | ||||||
|     glBindVertexArray(saved_vao); |     glBindVertexArray(saved_vao); | ||||||
|     glBindTexture(GL_TEXTURE_2D, 0); |     glBindTexture(GL_TEXTURE_2D, 0); | ||||||
| 
 | 
 | ||||||
|     /* hang onto the pixmap until the compositor has released it */ |     return status; | ||||||
|     pixmap->refcnt++; |  | ||||||
| 
 |  | ||||||
|     return TRUE; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Bool | static Bool | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue