From 4133fa711f37f0db303bf5aac03ea31b5be6ac1d Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Oct 2017 15:54:48 +0200 Subject: console: add support for dmabufs This patch adds support for dma-bufs to the qemu console interfaces. It adds a new "struct QemuDmaBuf" to represent a dmabuf with accociated metatdata (size, format). It adds three functions (and DisplayChangeListenerOps operations) to set a dma-buf as display scanout, as cursor and to release a dmabuf. Signed-off-by: Gerd Hoffmann Message-id: 20171010135453.6704-2-kraxel@redhat.com --- include/ui/console.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index 6966e4b..158969f 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -5,6 +5,7 @@ #include "qom/object.h" #include "qapi/qmp/qdict.h" #include "qemu/notify.h" +#include "qemu/typedefs.h" #include "qapi-types.h" #include "qemu/error-report.h" #include "qapi/error.h" @@ -180,6 +181,15 @@ struct QEMUGLParams { int minor_ver; }; +struct QemuDmaBuf { + int fd; + uint32_t width; + uint32_t height; + uint32_t stride; + uint32_t fourcc; + uint32_t texture; +}; + typedef struct DisplayChangeListenerOps { const char *dpy_name; @@ -220,6 +230,13 @@ typedef struct DisplayChangeListenerOps { uint32_t backing_height, uint32_t x, uint32_t y, uint32_t w, uint32_t h); + void (*dpy_gl_scanout_dmabuf)(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf); + void (*dpy_gl_cursor_dmabuf)(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf, + uint32_t pos_x, uint32_t pos_y); + void (*dpy_gl_release_dmabuf)(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf); void (*dpy_gl_update)(DisplayChangeListener *dcl, uint32_t x, uint32_t y, uint32_t w, uint32_t h); @@ -288,6 +305,13 @@ void dpy_gl_scanout_texture(QemuConsole *con, uint32_t backing_id, bool backing_y_0_top, uint32_t backing_width, uint32_t backing_height, uint32_t x, uint32_t y, uint32_t w, uint32_t h); +void dpy_gl_scanout_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf); +void dpy_gl_cursor_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf, + uint32_t pos_x, uint32_t pos_y); +void dpy_gl_release_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf); void dpy_gl_update(QemuConsole *con, uint32_t x, uint32_t y, uint32_t w, uint32_t h); @@ -298,6 +322,7 @@ int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLContext ctx); QEMUGLContext dpy_gl_ctx_get_current(QemuConsole *con); bool console_has_gl(QemuConsole *con); +bool console_has_gl_dmabuf(QemuConsole *con); static inline int surface_stride(DisplaySurface *s) { -- cgit v1.1 From 46e19e149f3b129a22c440caba853188df67deab Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Oct 2017 15:54:49 +0200 Subject: opengl: move shader init from console-gl.c to shader.c With the upcoming dmabuf support in qemu there will be more users of the shaders than just console-gl.c. So rename ConsoleGLState to QemuGLShader, rename some functions too, move code from console-gl.c to shaders.c. No functional change. Signed-off-by: Gerd Hoffmann Message-id: 20171010135453.6704-3-kraxel@redhat.com --- include/ui/console.h | 14 ++++++-------- include/ui/gtk.h | 2 +- include/ui/sdl2.h | 2 +- include/ui/shader.h | 14 ++++++-------- include/ui/spice-display.h | 2 +- 5 files changed, 15 insertions(+), 19 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index 158969f..580dfc5 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -12,6 +12,7 @@ #ifdef CONFIG_OPENGL # include +# include "ui/shader.h" #endif /* keyboard/mouse support */ @@ -415,22 +416,19 @@ void qemu_console_resize(QemuConsole *con, int width, int height); DisplaySurface *qemu_console_surface(QemuConsole *con); /* console-gl.c */ -typedef struct ConsoleGLState ConsoleGLState; #ifdef CONFIG_OPENGL -ConsoleGLState *console_gl_init_context(void); -void console_gl_fini_context(ConsoleGLState *gls); bool console_gl_check_format(DisplayChangeListener *dcl, pixman_format_code_t format); -void surface_gl_create_texture(ConsoleGLState *gls, +void surface_gl_create_texture(QemuGLShader *gls, DisplaySurface *surface); -void surface_gl_update_texture(ConsoleGLState *gls, +void surface_gl_update_texture(QemuGLShader *gls, DisplaySurface *surface, int x, int y, int w, int h); -void surface_gl_render_texture(ConsoleGLState *gls, +void surface_gl_render_texture(QemuGLShader *gls, DisplaySurface *surface); -void surface_gl_destroy_texture(ConsoleGLState *gls, +void surface_gl_destroy_texture(QemuGLShader *gls, DisplaySurface *surface); -void surface_gl_setup_viewport(ConsoleGLState *gls, +void surface_gl_setup_viewport(QemuGLShader *gls, DisplaySurface *surface, int ww, int wh); #endif diff --git a/include/ui/gtk.h b/include/ui/gtk.h index 2f7b720..849c896 100644 --- a/include/ui/gtk.h +++ b/include/ui/gtk.h @@ -47,7 +47,7 @@ typedef struct VirtualGfxConsole { double scale_x; double scale_y; #if defined(CONFIG_OPENGL) - ConsoleGLState *gls; + QemuGLShader *gls; EGLContext ectx; EGLSurface esurface; int glupdates; diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h index 454367a..b29cf80 100644 --- a/include/ui/sdl2.h +++ b/include/ui/sdl2.h @@ -26,7 +26,7 @@ struct sdl2_console { int idle_counter; SDL_GLContext winctx; #ifdef CONFIG_OPENGL - ConsoleGLState *gls; + QemuGLShader *gls; egl_fb guest_fb; egl_fb win_fb; bool y0_top; diff --git a/include/ui/shader.h b/include/ui/shader.h index f7d8618..369e498 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -3,13 +3,11 @@ #include -GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog); -void qemu_gl_run_texture_blit(GLint texture_blit_prog, - GLint texture_blit_vao); - -GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src); -GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag); -GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, - const GLchar *frag_src); +typedef struct QemuGLShader QemuGLShader; + +void qemu_gl_run_texture_blit(QemuGLShader *gls); + +QemuGLShader *qemu_gl_init_shader(void); +void qemu_gl_fini_shader(QemuGLShader *gls); #endif /* QEMU_SHADER_H */ diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h index 4ba9444..aaf2019 100644 --- a/include/ui/spice-display.h +++ b/include/ui/spice-display.h @@ -119,7 +119,7 @@ struct SimpleSpiceDisplay { /* opengl rendering */ QEMUBH *gl_unblock_bh; QEMUTimer *gl_unblock_timer; - ConsoleGLState *gls; + QemuGLShader *gls; int gl_updates; bool have_scanout; bool have_surface; -- cgit v1.1 From 2e1d70b9e03ca3f1c6185b54010bc9e47e0a0d0c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Oct 2017 15:54:50 +0200 Subject: opengl: add flipping vertex shader Add vertex shader which flips the texture upside down while blitting it. Add argument to qemu_gl_run_texture_blit() to enable flipping. Signed-off-by: Gerd Hoffmann Message-id: 20171010135453.6704-4-kraxel@redhat.com --- include/ui/shader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/ui') diff --git a/include/ui/shader.h b/include/ui/shader.h index 369e498..4c5acb2 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -5,7 +5,7 @@ typedef struct QemuGLShader QemuGLShader; -void qemu_gl_run_texture_blit(QemuGLShader *gls); +void qemu_gl_run_texture_blit(QemuGLShader *gls, bool flip); QemuGLShader *qemu_gl_init_shader(void); void qemu_gl_fini_shader(QemuGLShader *gls); -- cgit v1.1 From 86c0522c63e84ee9a98b9cd9cf6588faba1bac23 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Oct 2017 15:54:51 +0200 Subject: egl-helpers: add dmabuf import support Add helper function to import a dma-buf as opengl texture. Also add a helper to release the texture again. Signed-off-by: Gerd Hoffmann Message-id: 20171010135453.6704-5-kraxel@redhat.com --- include/ui/egl-helpers.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'include/ui') diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 81cb255..4924fe5 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -33,6 +33,9 @@ extern EGLContext qemu_egl_rn_ctx; int egl_rendernode_init(const char *rendernode); int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc); +void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf); +void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf); + #endif EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win); -- cgit v1.1 From 0eb50c273766be80f0a6fde635c3a2bdabd199fb Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Oct 2017 15:54:52 +0200 Subject: egl-helpers: add egl_texture_blit and egl_texture_blend egl_texture_blit() blits a texture, simliar to egl_fb_blit() but by rendering the texture to the screen instead of using a framebuffer blit. egl_texture_blend() renders a texture with alpha blending, will be used to render the cursor to the screen. Signed-off-by: Gerd Hoffmann Message-id: 20171010135453.6704-6-kraxel@redhat.com --- include/ui/egl-helpers.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'include/ui') diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 4924fe5..747233c 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -24,6 +24,10 @@ void egl_fb_setup_new_tex(egl_fb *fb, int width, int height); void egl_fb_blit(egl_fb *dst, egl_fb *src, bool flip); void egl_fb_read(void *dst, egl_fb *src); +void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); +void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y); + #ifdef CONFIG_OPENGL_DMABUF extern int qemu_egl_rn_fd; -- cgit v1.1