From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507644053309979.8734355373873; Tue, 10 Oct 2017 07:00:53 -0700 (PDT) Received: from localhost ([::1]:35213 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v5L-0008AP-Fr for importer@patchew.org; Tue, 10 Oct 2017 10:00:39 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37993) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1uzx-00045U-Sb for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzr-0007Vl-Qz for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:05 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38630) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzr-0007UT-Hg for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:54:59 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2A836C04B936; Tue, 10 Oct 2017 13:54:58 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id BFC46779D6; Tue, 10 Oct 2017 13:54:54 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id F22DC16A887; Tue, 10 Oct 2017 15:54:53 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2A836C04B936 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:48 +0200 Message-Id: <20171010135453.6704-2-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 10 Oct 2017 13:54:58 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/6] console: add support for dmabufs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- include/qemu/typedefs.h | 1 + include/ui/console.h | 25 +++++++++++++++++++++++++ ui/console.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index 980d2b330e..3dbc69b1e9 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -83,6 +83,7 @@ typedef struct PropertyInfo PropertyInfo; typedef struct PS2State PS2State; typedef struct QEMUBH QEMUBH; typedef struct QemuConsole QemuConsole; +typedef struct QemuDmaBuf QemuDmaBuf; typedef struct QEMUFile QEMUFile; typedef struct QemuOpt QemuOpt; typedef struct QemuOpts QemuOpts; diff --git a/include/ui/console.h b/include/ui/console.h index 6966e4bd9d..158969f978 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; }; =20 +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; =20 @@ -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); =20 @@ -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_heigh= t, 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); =20 @@ -298,6 +322,7 @@ int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLCon= text ctx); QEMUGLContext dpy_gl_ctx_get_current(QemuConsole *con); =20 bool console_has_gl(QemuConsole *con); +bool console_has_gl_dmabuf(QemuConsole *con); =20 static inline int surface_stride(DisplaySurface *s) { diff --git a/ui/console.c b/ui/console.c index b82c27960a..eca854cbd5 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1404,6 +1404,11 @@ bool console_has_gl(QemuConsole *con) return con->gl !=3D NULL; } =20 +bool console_has_gl_dmabuf(QemuConsole *con) +{ + return con->gl !=3D NULL && con->gl->ops->dpy_gl_scanout_dmabuf !=3D N= ULL; +} + void register_displaychangelistener(DisplayChangeListener *dcl) { static const char nodev[] =3D @@ -1745,6 +1750,34 @@ void dpy_gl_scanout_texture(QemuConsole *con, x, y, width, height); } =20 +void dpy_gl_scanout_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf) +{ + assert(con->gl); + con->gl->ops->dpy_gl_scanout_dmabuf(con->gl, dmabuf); +} + +void dpy_gl_cursor_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf, + uint32_t pos_x, uint32_t pos_y) +{ + assert(con->gl); + + if (con->gl->ops->dpy_gl_cursor_dmabuf) { + con->gl->ops->dpy_gl_cursor_dmabuf(con->gl, dmabuf, pos_x, pos_y); + } +} + +void dpy_gl_release_dmabuf(QemuConsole *con, + QemuDmaBuf *dmabuf) +{ + assert(con->gl); + + if (con->gl->ops->dpy_gl_release_dmabuf) { + con->gl->ops->dpy_gl_release_dmabuf(con->gl, dmabuf); + } +} + void dpy_gl_update(QemuConsole *con, uint32_t x, uint32_t y, uint32_t w, uint32_t h) { --=20 2.9.3 From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507643820085788.9139683657673; Tue, 10 Oct 2017 06:57:00 -0700 (PDT) Received: from localhost ([::1]:35192 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v1a-00052n-CS for importer@patchew.org; Tue, 10 Oct 2017 09:56:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37952) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1uzu-00045Q-RN for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzr-0007Vv-Tw for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46647) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzr-0007UX-LO for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:54:59 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4395881E1B; Tue, 10 Oct 2017 13:54:58 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id C6C636248D; Tue, 10 Oct 2017 13:54:54 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 0F5C216A88F; Tue, 10 Oct 2017 15:54:54 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4395881E1B Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:49 +0200 Message-Id: <20171010135453.6704-3-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 10 Oct 2017 13:54:58 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/6] opengl: move shader init from console-gl.c to shader.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- Makefile | 2 +- include/ui/console.h | 14 ++++++------- include/ui/gtk.h | 2 +- include/ui/sdl2.h | 2 +- include/ui/shader.h | 12 +++++------ include/ui/spice-display.h | 2 +- ui/console-gl.c | 45 ++++++---------------------------------- ui/gtk-egl.c | 2 +- ui/gtk-gl-area.c | 2 +- ui/sdl2-gl.c | 4 ++-- ui/shader.c | 51 ++++++++++++++++++++++++++++++++++++++----= ---- ui/spice-display.c | 2 +- 12 files changed, 68 insertions(+), 72 deletions(-) diff --git a/Makefile b/Makefile index cee6e28659..e4275691fb 100644 --- a/Makefile +++ b/Makefile @@ -671,7 +671,7 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_= PATH)/scripts/shaderinclu perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\ "FRAG","$@") =20 -ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \ +ui/shader.o: $(SRC_PATH)/ui/shader.c \ ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h =20 # documentation diff --git a/include/ui/console.h b/include/ui/console.h index 158969f978..580dfc57ee 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -12,6 +12,7 @@ =20 #ifdef CONFIG_OPENGL # include +# include "ui/shader.h" #endif =20 /* keyboard/mouse support */ @@ -415,22 +416,19 @@ void qemu_console_resize(QemuConsole *con, int width,= int height); DisplaySurface *qemu_console_surface(QemuConsole *con); =20 /* 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 2f7b720358..849c896eef 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 454367ac84..b29cf803c9 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 f7d86188bf..369e49865f 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -3,13 +3,11 @@ =20 #include =20 -GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog); -void qemu_gl_run_texture_blit(GLint texture_blit_prog, - GLint texture_blit_vao); +typedef struct QemuGLShader QemuGLShader; =20 -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); +void qemu_gl_run_texture_blit(QemuGLShader *gls); + +QemuGLShader *qemu_gl_init_shader(void); +void qemu_gl_fini_shader(QemuGLShader *gls); =20 #endif /* QEMU_SHADER_H */ diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h index 4ba9444dba..aaf2019889 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; diff --git a/ui/console-gl.c b/ui/console-gl.c index 5165e21646..9b50daedbd 100644 --- a/ui/console-gl.c +++ b/ui/console-gl.c @@ -29,40 +29,8 @@ #include "ui/console.h" #include "ui/shader.h" =20 -#include "shader/texture-blit-vert.h" -#include "shader/texture-blit-frag.h" - -struct ConsoleGLState { - GLint texture_blit_prog; - GLint texture_blit_vao; -}; - /* ---------------------------------------------------------------------- = */ =20 -ConsoleGLState *console_gl_init_context(void) -{ - ConsoleGLState *gls =3D g_new0(ConsoleGLState, 1); - - gls->texture_blit_prog =3D qemu_gl_create_compile_link_program - (texture_blit_vert_src, texture_blit_frag_src); - if (!gls->texture_blit_prog) { - exit(1); - } - - gls->texture_blit_vao =3D - qemu_gl_init_texture_blit(gls->texture_blit_prog); - - return gls; -} - -void console_gl_fini_context(ConsoleGLState *gls) -{ - if (!gls) { - return; - } - g_free(gls); -} - bool console_gl_check_format(DisplayChangeListener *dcl, pixman_format_code_t format) { @@ -76,7 +44,7 @@ bool console_gl_check_format(DisplayChangeListener *dcl, } } =20 -void surface_gl_create_texture(ConsoleGLState *gls, +void surface_gl_create_texture(QemuGLShader *gls, DisplaySurface *surface) { assert(gls); @@ -116,7 +84,7 @@ void surface_gl_create_texture(ConsoleGLState *gls, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } =20 -void surface_gl_update_texture(ConsoleGLState *gls, +void surface_gl_update_texture(QemuGLShader *gls, DisplaySurface *surface, int x, int y, int w, int h) { @@ -133,7 +101,7 @@ void surface_gl_update_texture(ConsoleGLState *gls, + surface_bytes_per_pixel(surface) * x); } =20 -void surface_gl_render_texture(ConsoleGLState *gls, +void surface_gl_render_texture(QemuGLShader *gls, DisplaySurface *surface) { assert(gls); @@ -141,11 +109,10 @@ void surface_gl_render_texture(ConsoleGLState *gls, glClearColor(0.1f, 0.1f, 0.1f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); =20 - qemu_gl_run_texture_blit(gls->texture_blit_prog, - gls->texture_blit_vao); + qemu_gl_run_texture_blit(gls); } =20 -void surface_gl_destroy_texture(ConsoleGLState *gls, +void surface_gl_destroy_texture(QemuGLShader *gls, DisplaySurface *surface) { if (!surface || !surface->texture) { @@ -155,7 +122,7 @@ void surface_gl_destroy_texture(ConsoleGLState *gls, surface->texture =3D 0; } =20 -void surface_gl_setup_viewport(ConsoleGLState *gls, +void surface_gl_setup_viewport(QemuGLShader *gls, DisplaySurface *surface, int ww, int wh) { diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index 0f0d35e041..eb86c26a1d 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -113,7 +113,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl) if (!vc->gfx.esurface) { return; } - vc->gfx.gls =3D console_gl_init_context(); + vc->gfx.gls =3D qemu_gl_init_shader(); if (vc->gfx.ds) { surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); } diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c index 01ebf2c7de..55ba2b57d7 100644 --- a/ui/gtk-gl-area.c +++ b/ui/gtk-gl-area.c @@ -96,7 +96,7 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl) return; } gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area)); - vc->gfx.gls =3D console_gl_init_context(); + vc->gfx.gls =3D qemu_gl_init_shader(); if (vc->gfx.ds) { surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); } diff --git a/ui/sdl2-gl.c b/ui/sdl2-gl.c index 9110491ee5..5e1073a084 100644 --- a/ui/sdl2-gl.c +++ b/ui/sdl2-gl.c @@ -90,7 +90,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl, scon->surface =3D new_surface; =20 if (!new_surface) { - console_gl_fini_context(scon->gls); + qemu_gl_fini_shader(scon->gls); scon->gls =3D NULL; sdl2_window_destroy(scon); return; @@ -98,7 +98,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl, =20 if (!scon->real_window) { sdl2_window_create(scon); - scon->gls =3D console_gl_init_context(); + scon->gls =3D qemu_gl_init_shader(); } else if (old_surface && ((surface_width(old_surface) !=3D surface_width(new_surfac= e)) || (surface_height(old_surface) !=3D surface_height(new_surfa= ce)))) { diff --git a/ui/shader.c b/ui/shader.c index 1ffddbef3b..d36e7af232 100644 --- a/ui/shader.c +++ b/ui/shader.c @@ -28,9 +28,17 @@ #include "qemu-common.h" #include "ui/shader.h" =20 +#include "shader/texture-blit-vert.h" +#include "shader/texture-blit-frag.h" + +struct QemuGLShader { + GLint texture_blit_prog; + GLint texture_blit_vao; +}; + /* ---------------------------------------------------------------------- = */ =20 -GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog) +static GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog) { static const GLfloat in_position[] =3D { -1, -1, @@ -60,17 +68,16 @@ GLuint qemu_gl_init_texture_blit(GLint texture_blit_pro= g) return vao; } =20 -void qemu_gl_run_texture_blit(GLint texture_blit_prog, - GLint texture_blit_vao) +void qemu_gl_run_texture_blit(QemuGLShader *gls) { - glUseProgram(texture_blit_prog); - glBindVertexArray(texture_blit_vao); + glUseProgram(gls->texture_blit_prog); + glBindVertexArray(gls->texture_blit_vao); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } =20 /* ---------------------------------------------------------------------- = */ =20 -GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src) +static GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src) { GLuint shader; GLint status, length; @@ -94,7 +101,7 @@ GLuint qemu_gl_create_compile_shader(GLenum type, const = GLchar *src) return shader; } =20 -GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag) +static GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag) { GLuint program; GLint status, length; @@ -117,8 +124,8 @@ GLuint qemu_gl_create_link_program(GLuint vert, GLuint = frag) return program; } =20 -GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, - const GLchar *frag_src) +static GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, + const GLchar *frag_src) { GLuint vert_shader, frag_shader, program; =20 @@ -134,3 +141,29 @@ GLuint qemu_gl_create_compile_link_program(const GLcha= r *vert_src, =20 return program; } + +/* ---------------------------------------------------------------------- = */ + +QemuGLShader *qemu_gl_init_shader(void) +{ + QemuGLShader *gls =3D g_new0(QemuGLShader, 1); + + gls->texture_blit_prog =3D qemu_gl_create_compile_link_program + (texture_blit_vert_src, texture_blit_frag_src); + if (!gls->texture_blit_prog) { + exit(1); + } + + gls->texture_blit_vao =3D + qemu_gl_init_texture_blit(gls->texture_blit_prog); + + return gls; +} + +void qemu_gl_fini_shader(QemuGLShader *gls) +{ + if (!gls) { + return; + } + g_free(gls); +} diff --git a/ui/spice-display.c b/ui/spice-display.c index 0963c7825f..ad1ceafb3f 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -1019,7 +1019,7 @@ static void qemu_spice_display_init_one(QemuConsole *= con) ssd->gl_unblock_bh =3D qemu_bh_new(qemu_spice_gl_unblock_bh, ssd); ssd->gl_unblock_timer =3D timer_new_ms(QEMU_CLOCK_REALTIME, qemu_spice_gl_block_timer, ss= d); - ssd->gls =3D console_gl_init_context(); + ssd->gls =3D qemu_gl_init_shader(); ssd->have_surface =3D false; ssd->have_scanout =3D false; } --=20 2.9.3 From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150764398060457.051752638500716; Tue, 10 Oct 2017 06:59:40 -0700 (PDT) Received: from localhost ([::1]:35201 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v4K-0007Lv-UG for importer@patchew.org; Tue, 10 Oct 2017 09:59:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1uzu-00045R-Re for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzr-0007VU-Nh for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38558) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzr-0007UI-D2 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:54:59 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DDF65C04AC7E; Tue, 10 Oct 2017 13:54:57 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id C3B8962478; Tue, 10 Oct 2017 13:54:54 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 1A12A16A89E; Tue, 10 Oct 2017 15:54:54 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DDF65C04AC7E Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:50 +0200 Message-Id: <20171010135453.6704-4-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 10 Oct 2017 13:54:58 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/6] opengl: add flipping vertex shader X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- Makefile | 4 +++- include/ui/shader.h | 2 +- ui/console-gl.c | 2 +- ui/shader.c | 12 +++++++++--- ui/shader/texture-blit-flip.vert | 10 ++++++++++ 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 ui/shader/texture-blit-flip.vert diff --git a/Makefile b/Makefile index e4275691fb..cb6a974a6f 100644 --- a/Makefile +++ b/Makefile @@ -672,7 +672,9 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_= PATH)/scripts/shaderinclu "FRAG","$@") =20 ui/shader.o: $(SRC_PATH)/ui/shader.c \ - ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h + ui/shader/texture-blit-vert.h \ + ui/shader/texture-blit-flip-vert.h \ + ui/shader/texture-blit-frag.h =20 # documentation MAKEINFO=3Dmakeinfo diff --git a/include/ui/shader.h b/include/ui/shader.h index 369e49865f..4c5acb2ce8 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -5,7 +5,7 @@ =20 typedef struct QemuGLShader QemuGLShader; =20 -void qemu_gl_run_texture_blit(QemuGLShader *gls); +void qemu_gl_run_texture_blit(QemuGLShader *gls, bool flip); =20 QemuGLShader *qemu_gl_init_shader(void); void qemu_gl_fini_shader(QemuGLShader *gls); diff --git a/ui/console-gl.c b/ui/console-gl.c index 9b50daedbd..5b77e7aa88 100644 --- a/ui/console-gl.c +++ b/ui/console-gl.c @@ -109,7 +109,7 @@ void surface_gl_render_texture(QemuGLShader *gls, glClearColor(0.1f, 0.1f, 0.1f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); =20 - qemu_gl_run_texture_blit(gls); + qemu_gl_run_texture_blit(gls, false); } =20 void surface_gl_destroy_texture(QemuGLShader *gls, diff --git a/ui/shader.c b/ui/shader.c index d36e7af232..008458bf94 100644 --- a/ui/shader.c +++ b/ui/shader.c @@ -29,10 +29,12 @@ #include "ui/shader.h" =20 #include "shader/texture-blit-vert.h" +#include "shader/texture-blit-flip-vert.h" #include "shader/texture-blit-frag.h" =20 struct QemuGLShader { GLint texture_blit_prog; + GLint texture_blit_flip_prog; GLint texture_blit_vao; }; =20 @@ -68,9 +70,11 @@ static GLuint qemu_gl_init_texture_blit(GLint texture_bl= it_prog) return vao; } =20 -void qemu_gl_run_texture_blit(QemuGLShader *gls) +void qemu_gl_run_texture_blit(QemuGLShader *gls, bool flip) { - glUseProgram(gls->texture_blit_prog); + glUseProgram(flip + ? gls->texture_blit_flip_prog + : gls->texture_blit_prog); glBindVertexArray(gls->texture_blit_vao); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -150,7 +154,9 @@ QemuGLShader *qemu_gl_init_shader(void) =20 gls->texture_blit_prog =3D qemu_gl_create_compile_link_program (texture_blit_vert_src, texture_blit_frag_src); - if (!gls->texture_blit_prog) { + gls->texture_blit_flip_prog =3D qemu_gl_create_compile_link_program + (texture_blit_flip_vert_src, texture_blit_frag_src); + if (!gls->texture_blit_prog || !gls->texture_blit_flip_prog) { exit(1); } =20 diff --git a/ui/shader/texture-blit-flip.vert b/ui/shader/texture-blit-flip= .vert new file mode 100644 index 0000000000..ba081fa5a6 --- /dev/null +++ b/ui/shader/texture-blit-flip.vert @@ -0,0 +1,10 @@ + +#version 300 es + +in vec2 in_position; +out vec2 ex_tex_coord; + +void main(void) { + gl_Position =3D vec4(in_position, 0.0, 1.0); + ex_tex_coord =3D vec2(1.0 + in_position.x, 1.0 + in_position.y) * 0.5; +} --=20 2.9.3 From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507643935817834.3405871078768; Tue, 10 Oct 2017 06:58:55 -0700 (PDT) Received: from localhost ([::1]:35200 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v3d-0006lT-3k for importer@patchew.org; Tue, 10 Oct 2017 09:58:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38028) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v01-000470-G4 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzr-0007Va-PM for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35180) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzr-0007UD-EG for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:54:59 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A22D381E15; Tue, 10 Oct 2017 13:54:57 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id D0C466248F; Tue, 10 Oct 2017 13:54:54 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 222214FD40; Tue, 10 Oct 2017 15:54:54 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A22D381E15 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:51 +0200 Message-Id: <20171010135453.6704-5-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 10 Oct 2017 13:54:57 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/6] egl-helpers: add dmabuf import support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- include/ui/egl-helpers.h | 3 +++ ui/egl-helpers.c | 46 ++++++++++++++++++++++++++++++++++++++++++++= ++ 2 files changed, 49 insertions(+) diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 81cb255de0..4924fe560d 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= ); =20 +void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf); +void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf); + #endif =20 EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win); diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index cde9965dea..e7ee337d7e 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -19,6 +19,7 @@ #include =20 #include "qemu/error-report.h" +#include "ui/console.h" #include "ui/egl-helpers.h" =20 EGLDisplay *qemu_egl_display; @@ -241,6 +242,51 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *st= ride, EGLint *fourcc) return fd; } =20 +void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf) +{ + EGLImageKHR image =3D EGL_NO_IMAGE_KHR; + EGLint attrs[] =3D { + EGL_DMA_BUF_PLANE0_FD_EXT, dmabuf->fd, + EGL_DMA_BUF_PLANE0_PITCH_EXT, dmabuf->stride, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, + EGL_WIDTH, dmabuf->width, + EGL_HEIGHT, dmabuf->height, + EGL_LINUX_DRM_FOURCC_EXT, dmabuf->fourcc, + EGL_NONE, /* end of list */ + }; + + if (dmabuf->texture !=3D 0) { + return; + } + + image =3D eglCreateImageKHR(qemu_egl_display, + EGL_NO_CONTEXT, + EGL_LINUX_DMA_BUF_EXT, + NULL, attrs); + if (image =3D=3D EGL_NO_IMAGE_KHR) { + error_report("eglCreateImageKHR failed"); + return; + } + + glGenTextures(1, &dmabuf->texture); + glBindTexture(GL_TEXTURE_2D, dmabuf->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image); + eglDestroyImageKHR(qemu_egl_display, image); +} + +void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf) +{ + if (dmabuf->texture =3D=3D 0) { + return; + } + + glDeleteTextures(1, &dmabuf->texture); + dmabuf->texture =3D 0; +} + #endif /* CONFIG_OPENGL_DMABUF */ =20 /* ---------------------------------------------------------------------- = */ --=20 2.9.3 From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507643824325713.5728211860219; Tue, 10 Oct 2017 06:57:04 -0700 (PDT) Received: from localhost ([::1]:35193 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v1b-00053f-Dn for importer@patchew.org; Tue, 10 Oct 2017 09:56:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37950) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1uzu-00045O-R4 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzs-0007WM-Ai for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38704) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzs-0007V8-52 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:00 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 039ABC04AC71; Tue, 10 Oct 2017 13:54:59 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id AEB2277715; Tue, 10 Oct 2017 13:54:58 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 2A1F74FD41; Tue, 10 Oct 2017 15:54:54 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 039ABC04AC71 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:52 +0200 Message-Id: <20171010135453.6704-6-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 10 Oct 2017 13:54:59 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 5/6] egl-helpers: add egl_texture_blit and egl_texture_blend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- include/ui/egl-helpers.h | 4 ++++ ui/egl-helpers.c | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 4924fe560d..747233ce58 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 hei= ght); void egl_fb_blit(egl_fb *dst, egl_fb *src, bool flip); void egl_fb_read(void *dst, egl_fb *src); =20 +void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool fl= ip); +void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool f= lip, + int x, int y); + #ifdef CONFIG_OPENGL_DMABUF =20 extern int qemu_egl_rn_fd; diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index e7ee337d7e..5fa60ef4e8 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -111,6 +111,33 @@ void egl_fb_read(void *dst, egl_fb *src) GL_BGRA, GL_UNSIGNED_BYTE, dst); } =20 +void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool fl= ip) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + glViewport(0, 0, dst->width, dst->height); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + qemu_gl_run_texture_blit(gls, flip); +} + +void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool f= lip, + int x, int y) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + if (flip) { + glViewport(x, y, src->width, src->height); + } else { + glViewport(x, dst->height - src->height - y, + src->width, src->height); + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + qemu_gl_run_texture_blit(gls, flip); + glDisable(GL_BLEND); +} + /* ---------------------------------------------------------------------- = */ =20 #ifdef CONFIG_OPENGL_DMABUF --=20 2.9.3 From nobody Sat Apr 27 09:31:21 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507643820039823.1828158645355; Tue, 10 Oct 2017 06:57:00 -0700 (PDT) Received: from localhost ([::1]:35191 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1v1U-0004zy-MN for importer@patchew.org; Tue, 10 Oct 2017 09:56:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37951) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1uzu-00045P-RF for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1uzs-0007WZ-HB for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:21080) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1uzs-0007VR-A1 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 09:55:00 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4D6E17EA8F; Tue, 10 Oct 2017 13:54:59 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-239.ams2.redhat.com [10.36.116.239]) by smtp.corp.redhat.com (Postfix) with ESMTP id B0F1862478; Tue, 10 Oct 2017 13:54:58 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 3132F4FD42; Tue, 10 Oct 2017 15:54:54 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4D6E17EA8F Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 15:54:53 +0200 Message-Id: <20171010135453.6704-7-kraxel@redhat.com> In-Reply-To: <20171010135453.6704-1-kraxel@redhat.com> References: <20171010135453.6704-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 10 Oct 2017 13:54:59 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 6/6] egl-headless: add dmabuf support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann , Tina Zhang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add support for the new dmabuf interface. Signed-off-by: Gerd Hoffmann --- ui/egl-headless.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/ui/egl-headless.c b/ui/egl-headless.c index 12ad64e995..5d50226869 100644 --- a/ui/egl-headless.c +++ b/ui/egl-headless.c @@ -4,13 +4,18 @@ #include "ui/console.h" #include "ui/egl-helpers.h" #include "ui/egl-context.h" +#include "ui/shader.h" =20 typedef struct egl_dpy { DisplayChangeListener dcl; DisplaySurface *ds; + QemuGLShader *gls; egl_fb guest_fb; + egl_fb cursor_fb; egl_fb blit_fb; bool y_0_top; + uint32_t pos_x; + uint32_t pos_y; } egl_dpy; =20 /* ------------------------------------------------------------------ */ @@ -65,6 +70,43 @@ static void egl_scanout_texture(DisplayChangeListener *d= cl, } } =20 +static void egl_scanout_dmabuf(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf) +{ + egl_dmabuf_import_texture(dmabuf); + if (!dmabuf->texture) { + return; + } + + egl_scanout_texture(dcl, dmabuf->texture, + false, dmabuf->width, dmabuf->height, + 0, 0, dmabuf->width, dmabuf->height); +} + +static void egl_cursor_dmabuf(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf, + uint32_t pos_x, uint32_t pos_y) +{ + egl_dpy *edpy =3D container_of(dcl, egl_dpy, dcl); + + edpy->pos_x =3D pos_x; + edpy->pos_y =3D pos_y; + + egl_dmabuf_import_texture(dmabuf); + if (!dmabuf->texture) { + return; + } + + egl_fb_setup_for_tex(&edpy->cursor_fb, dmabuf->width, dmabuf->height, + dmabuf->texture, false); +} + +static void egl_release_dmabuf(DisplayChangeListener *dcl, + QemuDmaBuf *dmabuf) +{ + egl_dmabuf_release_texture(dmabuf); +} + static void egl_scanout_flush(DisplayChangeListener *dcl, uint32_t x, uint32_t y, uint32_t w, uint32_t h) @@ -78,9 +120,18 @@ static void egl_scanout_flush(DisplayChangeListener *dc= l, assert(surface_height(edpy->ds) =3D=3D edpy->guest_fb.height); assert(surface_format(edpy->ds) =3D=3D PIXMAN_x8r8g8b8); =20 - egl_fb_blit(&edpy->blit_fb, &edpy->guest_fb, edpy->y_0_top); + if (edpy->cursor_fb.texture) { + /* have cursor -> render using textures */ + egl_texture_blit(edpy->gls, &edpy->blit_fb, &edpy->guest_fb, + !edpy->y_0_top); + egl_texture_blend(edpy->gls, &edpy->blit_fb, &edpy->cursor_fb, + !edpy->y_0_top, edpy->pos_x, edpy->pos_y); + } else { + /* no cursor -> use simple framebuffer blit */ + egl_fb_blit(&edpy->blit_fb, &edpy->guest_fb, edpy->y_0_top); + } + egl_fb_read(surface_data(edpy->ds), &edpy->blit_fb); - dpy_gfx_update(edpy->dcl.con, x, y, w, h); } =20 @@ -97,6 +148,9 @@ static const DisplayChangeListenerOps egl_ops =3D { =20 .dpy_gl_scanout_disable =3D egl_scanout_disable, .dpy_gl_scanout_texture =3D egl_scanout_texture, + .dpy_gl_scanout_dmabuf =3D egl_scanout_dmabuf, + .dpy_gl_cursor_dmabuf =3D egl_cursor_dmabuf, + .dpy_gl_release_dmabuf =3D egl_release_dmabuf, .dpy_gl_update =3D egl_scanout_flush, }; =20 @@ -120,6 +174,7 @@ void egl_headless_init(void) edpy =3D g_new0(egl_dpy, 1); edpy->dcl.con =3D con; edpy->dcl.ops =3D &egl_ops; + edpy->gls =3D qemu_gl_init_shader(); register_displaychangelistener(&edpy->dcl); } } --=20 2.9.3