* [Qemu-devel] [PULL 0/6] Opengl 20171017 patches
@ 2017-10-17 11:13 Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 1/6] console: add support for dmabufs Gerd Hoffmann
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
The following changes since commit c5bbcaa4b7c0f8a322bebe9ec563560178a68b55:
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2017-10-16 17:29:16 +0100)
are available in the git repository at:
git://git.kraxel.org/qemu tags/opengl-20171017-pull-request
for you to fetch changes up to a35179170034b60bcfb997e06bc63258caaf5049:
egl-headless: add dmabuf support (2017-10-17 10:25:42 +0200)
----------------------------------------------------------------
ui: opengl updates for dma-buf support.
----------------------------------------------------------------
Gerd Hoffmann (6):
console: add support for dmabufs
opengl: move shader init from console-gl.c to shader.c
opengl: add flipping vertex shader
egl-helpers: add dmabuf import support
egl-helpers: add egl_texture_blit and egl_texture_blend
egl-headless: add dmabuf support
Makefile | 6 ++--
include/qemu/typedefs.h | 1 +
include/ui/console.h | 39 ++++++++++++++++-----
include/ui/egl-helpers.h | 7 ++++
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/console.c | 33 ++++++++++++++++++
ui/egl-headless.c | 59 ++++++++++++++++++++++++++++++--
ui/egl-helpers.c | 73 ++++++++++++++++++++++++++++++++++++++++
ui/gtk-egl.c | 2 +-
ui/gtk-gl-area.c | 2 +-
ui/sdl2-gl.c | 4 +--
ui/shader.c | 57 ++++++++++++++++++++++++++-----
ui/spice-display.c | 2 +-
ui/shader/texture-blit-flip.vert | 10 ++++++
18 files changed, 283 insertions(+), 75 deletions(-)
create mode 100644 ui/shader/texture-blit-flip.vert
--
2.9.3
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 1/6] console: add support for dmabufs
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 2/6] opengl: move shader init from console-gl.c to shader.c Gerd Hoffmann
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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 <kraxel@redhat.com>
Message-id: 20171010135453.6704-2-kraxel@redhat.com
---
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;
};
+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)
{
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 != NULL;
}
+bool console_has_gl_dmabuf(QemuConsole *con)
+{
+ return con->gl != NULL && con->gl->ops->dpy_gl_scanout_dmabuf != NULL;
+}
+
void register_displaychangelistener(DisplayChangeListener *dcl)
{
static const char nodev[] =
@@ -1745,6 +1750,34 @@ void dpy_gl_scanout_texture(QemuConsole *con,
x, y, width, height);
}
+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)
{
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 2/6] opengl: move shader init from console-gl.c to shader.c
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 1/6] console: add support for dmabufs Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 3/6] opengl: add flipping vertex shader Gerd Hoffmann
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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 <kraxel@redhat.com>
Message-id: 20171010135453.6704-3-kraxel@redhat.com
---
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 97b4508d7d..e124f1c5a0 100644
--- a/Makefile
+++ b/Makefile
@@ -672,7 +672,7 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclu
perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
"FRAG","$@")
-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
# 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 @@
#ifdef CONFIG_OPENGL
# include <epoxy/gl.h>
+# 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 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 @@
#include <epoxy/gl.h>
-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;
-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);
#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"
-#include "shader/texture-blit-vert.h"
-#include "shader/texture-blit-frag.h"
-
-struct ConsoleGLState {
- GLint texture_blit_prog;
- GLint texture_blit_vao;
-};
-
/* ---------------------------------------------------------------------- */
-ConsoleGLState *console_gl_init_context(void)
-{
- ConsoleGLState *gls = g_new0(ConsoleGLState, 1);
-
- gls->texture_blit_prog = 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 =
- 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,
}
}
-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);
}
-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);
}
-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);
- qemu_gl_run_texture_blit(gls->texture_blit_prog,
- gls->texture_blit_vao);
+ qemu_gl_run_texture_blit(gls);
}
-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 = 0;
}
-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 = console_gl_init_context();
+ vc->gfx.gls = 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 = console_gl_init_context();
+ vc->gfx.gls = 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 = new_surface;
if (!new_surface) {
- console_gl_fini_context(scon->gls);
+ qemu_gl_fini_shader(scon->gls);
scon->gls = NULL;
sdl2_window_destroy(scon);
return;
@@ -98,7 +98,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl,
if (!scon->real_window) {
sdl2_window_create(scon);
- scon->gls = console_gl_init_context();
+ scon->gls = qemu_gl_init_shader();
} else if (old_surface &&
((surface_width(old_surface) != surface_width(new_surface)) ||
(surface_height(old_surface) != surface_height(new_surface)))) {
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"
+#include "shader/texture-blit-vert.h"
+#include "shader/texture-blit-frag.h"
+
+struct QemuGLShader {
+ GLint texture_blit_prog;
+ GLint texture_blit_vao;
+};
+
/* ---------------------------------------------------------------------- */
-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[] = {
-1, -1,
@@ -60,17 +68,16 @@ GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
return vao;
}
-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);
}
/* ---------------------------------------------------------------------- */
-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;
}
-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;
}
-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;
@@ -134,3 +141,29 @@ GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src,
return program;
}
+
+/* ---------------------------------------------------------------------- */
+
+QemuGLShader *qemu_gl_init_shader(void)
+{
+ QemuGLShader *gls = g_new0(QemuGLShader, 1);
+
+ gls->texture_blit_prog = 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 =
+ 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 = qemu_bh_new(qemu_spice_gl_unblock_bh, ssd);
ssd->gl_unblock_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
qemu_spice_gl_block_timer, ssd);
- ssd->gls = console_gl_init_context();
+ ssd->gls = qemu_gl_init_shader();
ssd->have_surface = false;
ssd->have_scanout = false;
}
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 3/6] opengl: add flipping vertex shader
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 1/6] console: add support for dmabufs Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 2/6] opengl: move shader init from console-gl.c to shader.c Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 4/6] egl-helpers: add dmabuf import support Gerd Hoffmann
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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 <kraxel@redhat.com>
Message-id: 20171010135453.6704-4-kraxel@redhat.com
---
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 e124f1c5a0..0d293ad294 100644
--- a/Makefile
+++ b/Makefile
@@ -673,7 +673,9 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclu
"FRAG","$@")
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
# documentation
MAKEINFO=makeinfo
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 @@
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);
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);
- qemu_gl_run_texture_blit(gls);
+ qemu_gl_run_texture_blit(gls, false);
}
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"
#include "shader/texture-blit-vert.h"
+#include "shader/texture-blit-flip-vert.h"
#include "shader/texture-blit-frag.h"
struct QemuGLShader {
GLint texture_blit_prog;
+ GLint texture_blit_flip_prog;
GLint texture_blit_vao;
};
@@ -68,9 +70,11 @@ static GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
return vao;
}
-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)
gls->texture_blit_prog = qemu_gl_create_compile_link_program
(texture_blit_vert_src, texture_blit_frag_src);
- if (!gls->texture_blit_prog) {
+ gls->texture_blit_flip_prog = 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);
}
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 = vec4(in_position, 0.0, 1.0);
+ ex_tex_coord = vec2(1.0 + in_position.x, 1.0 + in_position.y) * 0.5;
+}
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 4/6] egl-helpers: add dmabuf import support
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
` (2 preceding siblings ...)
2017-10-17 11:13 ` [Qemu-devel] [PULL 3/6] opengl: add flipping vertex shader Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 5/6] egl-helpers: add egl_texture_blit and egl_texture_blend Gerd Hoffmann
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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 <kraxel@redhat.com>
Message-id: 20171010135453.6704-5-kraxel@redhat.com
---
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);
+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);
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 <dirent.h>
#include "qemu/error-report.h"
+#include "ui/console.h"
#include "ui/egl-helpers.h"
EGLDisplay *qemu_egl_display;
@@ -241,6 +242,51 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc)
return fd;
}
+void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf)
+{
+ EGLImageKHR image = EGL_NO_IMAGE_KHR;
+ EGLint attrs[] = {
+ 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 != 0) {
+ return;
+ }
+
+ image = eglCreateImageKHR(qemu_egl_display,
+ EGL_NO_CONTEXT,
+ EGL_LINUX_DMA_BUF_EXT,
+ NULL, attrs);
+ if (image == 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 == 0) {
+ return;
+ }
+
+ glDeleteTextures(1, &dmabuf->texture);
+ dmabuf->texture = 0;
+}
+
#endif /* CONFIG_OPENGL_DMABUF */
/* ---------------------------------------------------------------------- */
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 5/6] egl-helpers: add egl_texture_blit and egl_texture_blend
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
` (3 preceding siblings ...)
2017-10-17 11:13 ` [Qemu-devel] [PULL 4/6] egl-helpers: add dmabuf import support Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 6/6] egl-headless: add dmabuf support Gerd Hoffmann
2017-10-19 12:28 ` [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Peter Maydell
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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 <kraxel@redhat.com>
Message-id: 20171010135453.6704-6-kraxel@redhat.com
---
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 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;
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);
}
+void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip)
+{
+ 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 flip,
+ 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);
+}
+
/* ---------------------------------------------------------------------- */
#ifdef CONFIG_OPENGL_DMABUF
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PULL 6/6] egl-headless: add dmabuf support
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
` (4 preceding siblings ...)
2017-10-17 11:13 ` [Qemu-devel] [PULL 5/6] egl-helpers: add egl_texture_blit and egl_texture_blend Gerd Hoffmann
@ 2017-10-17 11:13 ` Gerd Hoffmann
2017-10-19 12:28 ` [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Peter Maydell
6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2017-10-17 11:13 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Add support for the new dmabuf interface.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20171010135453.6704-7-kraxel@redhat.com
---
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"
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;
/* ------------------------------------------------------------------ */
@@ -65,6 +70,43 @@ static void egl_scanout_texture(DisplayChangeListener *dcl,
}
}
+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 = container_of(dcl, egl_dpy, dcl);
+
+ edpy->pos_x = pos_x;
+ edpy->pos_y = 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 *dcl,
assert(surface_height(edpy->ds) == edpy->guest_fb.height);
assert(surface_format(edpy->ds) == PIXMAN_x8r8g8b8);
- 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);
}
@@ -97,6 +148,9 @@ static const DisplayChangeListenerOps egl_ops = {
.dpy_gl_scanout_disable = egl_scanout_disable,
.dpy_gl_scanout_texture = egl_scanout_texture,
+ .dpy_gl_scanout_dmabuf = egl_scanout_dmabuf,
+ .dpy_gl_cursor_dmabuf = egl_cursor_dmabuf,
+ .dpy_gl_release_dmabuf = egl_release_dmabuf,
.dpy_gl_update = egl_scanout_flush,
};
@@ -120,6 +174,7 @@ void egl_headless_init(void)
edpy = g_new0(egl_dpy, 1);
edpy->dcl.con = con;
edpy->dcl.ops = &egl_ops;
+ edpy->gls = qemu_gl_init_shader();
register_displaychangelistener(&edpy->dcl);
}
}
--
2.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PULL 0/6] Opengl 20171017 patches
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
` (5 preceding siblings ...)
2017-10-17 11:13 ` [Qemu-devel] [PULL 6/6] egl-headless: add dmabuf support Gerd Hoffmann
@ 2017-10-19 12:28 ` Peter Maydell
6 siblings, 0 replies; 8+ messages in thread
From: Peter Maydell @ 2017-10-19 12:28 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: QEMU Developers
On 17 October 2017 at 12:13, Gerd Hoffmann <kraxel@redhat.com> wrote:
> The following changes since commit c5bbcaa4b7c0f8a322bebe9ec563560178a68b55:
>
> Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2017-10-16 17:29:16 +0100)
>
> are available in the git repository at:
>
> git://git.kraxel.org/qemu tags/opengl-20171017-pull-request
>
> for you to fetch changes up to a35179170034b60bcfb997e06bc63258caaf5049:
>
> egl-headless: add dmabuf support (2017-10-17 10:25:42 +0200)
>
> ----------------------------------------------------------------
> ui: opengl updates for dma-buf support.
>
> ----------------------------------------------------------------
Applied, thanks.
-- PMM
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-10-19 12:28 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-17 11:13 [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 1/6] console: add support for dmabufs Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 2/6] opengl: move shader init from console-gl.c to shader.c Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 3/6] opengl: add flipping vertex shader Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 4/6] egl-helpers: add dmabuf import support Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 5/6] egl-helpers: add egl_texture_blit and egl_texture_blend Gerd Hoffmann
2017-10-17 11:13 ` [Qemu-devel] [PULL 6/6] egl-headless: add dmabuf support Gerd Hoffmann
2017-10-19 12:28 ` [Qemu-devel] [PULL 0/6] Opengl 20171017 patches Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).