ui/gtk-egl: add cursor_dmabuf support
Add support for cursor dmabufs to gtk-egl. Just blend in the cursor (if we have one) when rendering the dmabuf. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20180306090951.22932-7-kraxel@redhat.com
This commit is contained in:
		
							parent
							
								
									70763fea4f
								
							
						
					
					
						commit
						f1bd313264
					
				| @ -54,6 +54,9 @@ typedef struct VirtualGfxConsole { | |||||||
|     int x, y, w, h; |     int x, y, w, h; | ||||||
|     egl_fb guest_fb; |     egl_fb guest_fb; | ||||||
|     egl_fb win_fb; |     egl_fb win_fb; | ||||||
|  |     egl_fb cursor_fb; | ||||||
|  |     int cursor_x; | ||||||
|  |     int cursor_y; | ||||||
|     bool y0_top; |     bool y0_top; | ||||||
|     bool scanout_mode; |     bool scanout_mode; | ||||||
| #endif | #endif | ||||||
| @ -115,6 +118,11 @@ void gd_egl_scanout_texture(DisplayChangeListener *dcl, | |||||||
|                             uint32_t w, uint32_t h); |                             uint32_t w, uint32_t h); | ||||||
| void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, | void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, | ||||||
|                            QemuDmaBuf *dmabuf); |                            QemuDmaBuf *dmabuf); | ||||||
|  | void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl, | ||||||
|  |                           QemuDmaBuf *dmabuf, bool have_hot, | ||||||
|  |                           uint32_t hot_x, uint32_t hot_y); | ||||||
|  | void gd_egl_cursor_position(DisplayChangeListener *dcl, | ||||||
|  |                             uint32_t pos_x, uint32_t pos_y); | ||||||
| void gd_egl_release_dmabuf(DisplayChangeListener *dcl, | void gd_egl_release_dmabuf(DisplayChangeListener *dcl, | ||||||
|                            QemuDmaBuf *dmabuf); |                            QemuDmaBuf *dmabuf); | ||||||
| void gd_egl_scanout_flush(DisplayChangeListener *dcl, | void gd_egl_scanout_flush(DisplayChangeListener *dcl, | ||||||
|  | |||||||
							
								
								
									
										40
									
								
								ui/gtk-egl.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								ui/gtk-egl.c
									
									
									
									
									
								
							| @ -19,6 +19,7 @@ | |||||||
| #include "ui/console.h" | #include "ui/console.h" | ||||||
| #include "ui/gtk.h" | #include "ui/gtk.h" | ||||||
| #include "ui/egl-helpers.h" | #include "ui/egl-helpers.h" | ||||||
|  | #include "ui/shader.h" | ||||||
| 
 | 
 | ||||||
| #include "sysemu/sysemu.h" | #include "sysemu/sysemu.h" | ||||||
| 
 | 
 | ||||||
| @ -209,6 +210,35 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl, | ||||||
|  |                           QemuDmaBuf *dmabuf, bool have_hot, | ||||||
|  |                           uint32_t hot_x, uint32_t hot_y) | ||||||
|  | { | ||||||
|  | #ifdef CONFIG_OPENGL_DMABUF | ||||||
|  |     VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); | ||||||
|  | 
 | ||||||
|  |     if (dmabuf) { | ||||||
|  |         egl_dmabuf_import_texture(dmabuf); | ||||||
|  |         if (!dmabuf->texture) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         egl_fb_setup_for_tex(&vc->gfx.cursor_fb, dmabuf->width, dmabuf->height, | ||||||
|  |                              dmabuf->texture, false); | ||||||
|  |     } else { | ||||||
|  |         egl_fb_destroy(&vc->gfx.cursor_fb); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void gd_egl_cursor_position(DisplayChangeListener *dcl, | ||||||
|  |                             uint32_t pos_x, uint32_t pos_y) | ||||||
|  | { | ||||||
|  |     VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); | ||||||
|  | 
 | ||||||
|  |     vc->gfx.cursor_x = pos_x; | ||||||
|  |     vc->gfx.cursor_y = pos_y; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void gd_egl_release_dmabuf(DisplayChangeListener *dcl, | void gd_egl_release_dmabuf(DisplayChangeListener *dcl, | ||||||
|                            QemuDmaBuf *dmabuf) |                            QemuDmaBuf *dmabuf) | ||||||
| { | { | ||||||
| @ -237,7 +267,15 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl, | |||||||
|     window = gtk_widget_get_window(vc->gfx.drawing_area); |     window = gtk_widget_get_window(vc->gfx.drawing_area); | ||||||
|     gdk_drawable_get_size(window, &ww, &wh); |     gdk_drawable_get_size(window, &ww, &wh); | ||||||
|     egl_fb_setup_default(&vc->gfx.win_fb, ww, wh); |     egl_fb_setup_default(&vc->gfx.win_fb, ww, wh); | ||||||
|     egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top); |     if (vc->gfx.cursor_fb.texture) { | ||||||
|  |         egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb, | ||||||
|  |                          vc->gfx.y0_top); | ||||||
|  |         egl_texture_blend(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.cursor_fb, | ||||||
|  |                           vc->gfx.y0_top, | ||||||
|  |                           vc->gfx.cursor_x, vc->gfx.cursor_y); | ||||||
|  |     } else { | ||||||
|  |         egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     eglSwapBuffers(qemu_egl_display, vc->gfx.esurface); |     eglSwapBuffers(qemu_egl_display, vc->gfx.esurface); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								ui/gtk.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								ui/gtk.c
									
									
									
									
									
								
							| @ -745,6 +745,8 @@ static const DisplayChangeListenerOps dcl_egl_ops = { | |||||||
|     .dpy_gl_scanout_disable  = gd_egl_scanout_disable, |     .dpy_gl_scanout_disable  = gd_egl_scanout_disable, | ||||||
|     .dpy_gl_scanout_texture  = gd_egl_scanout_texture, |     .dpy_gl_scanout_texture  = gd_egl_scanout_texture, | ||||||
|     .dpy_gl_scanout_dmabuf   = gd_egl_scanout_dmabuf, |     .dpy_gl_scanout_dmabuf   = gd_egl_scanout_dmabuf, | ||||||
|  |     .dpy_gl_cursor_dmabuf    = gd_egl_cursor_dmabuf, | ||||||
|  |     .dpy_gl_cursor_position  = gd_egl_cursor_position, | ||||||
|     .dpy_gl_release_dmabuf   = gd_egl_release_dmabuf, |     .dpy_gl_release_dmabuf   = gd_egl_release_dmabuf, | ||||||
|     .dpy_gl_update           = gd_egl_scanout_flush, |     .dpy_gl_update           = gd_egl_scanout_flush, | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Gerd Hoffmann
						Gerd Hoffmann