From patchwork Fri Jun 15 06:47:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 138653 Delivered-To: patch@linaro.org Received: by 2002:a2e:970d:0:0:0:0:0 with SMTP id r13-v6csp462091lji; Thu, 14 Jun 2018 23:47:58 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI+qhOYCRIDLTaKeAZu/Ii2CgK9/VQ511pORFEhHta8iU1ByWkXe6m4SqmE245H7StZ69rD X-Received: by 2002:ac8:5053:: with SMTP id h19-v6mr366461qtm.71.1529045278802; Thu, 14 Jun 2018 23:47:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529045278; cv=none; d=google.com; s=arc-20160816; b=t+NxRRNd/5YhjSQP/BpnaL7VFRdffE6zXtjNAUp86dH1b5Sgpjn7DzwVCaCp6XGFy5 seqCYAdMi3p+/Nc79awdEnEknNTRmuDYSUqzjDvLDaHIlfJE69IqOcJHKmKRQIn7ErZd C725dqKy9Hz15Fsvi4dCiIIFkiC3k1ubSjXka3u7Kl8lkpS7zmQKU2W9lI0kaRrayiVZ OZ1GLrIYbFp6ZKXjgVaUBssN4/g6DA5oz57vVhm988I19kdUAjkrr3RcV18tULta8qkq n/FUYyHsv0UBYriN358e2Jhqm0j20d9/Vu+wD+UsNWZhrVAgGDHtSlPPKjPSLS6imKxx rIGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:message-id:date:to:from :dkim-signature:arc-authentication-results; bh=9backLBPxUjbFjsO1oI7pYU0OuwtO9+6+nLSc/fnvyg=; b=nLf/at8m2CnEUsqERqgasLqYFPmGWEuVDOxaaoSStHJCx077MaLJND5BGpb8wXMSB0 aRdCiXGdZSZATvXyDlsA7QnpAQ1a+Ywi5WjQ2167MzPF9ZMR+gfpgq8ZpjO/VDwFR1Wj lenuHz38JnBNDoKQcpcsY9x6mhRxNJMaBUymWrMZwefbaO1FxaK4x1YKftsvRB7QLalp vFT8I9j0sV2chhuH7yXabuhkZMZJkEp6ghIojKQIz3EHW8JjP+tr9ugarnHwLG1uAfxf vlv9WKVE80+1RVEHM+n6I/uRR82WvDBVZOH6wGcDTxGHnCBBfCWbGLytZR0FNQs5UhVs aGYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=sgGYMsRZ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id a130-v6si2970797qkg.283.2018.06.14.23.47.58 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 14 Jun 2018 23:47:58 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=sgGYMsRZ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: from localhost ([::1]:44628 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fTiWa-0007Cd-Te for patch@linaro.org; Fri, 15 Jun 2018 02:47:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41204) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fTiWM-0007CL-IK for qemu-devel@nongnu.org; Fri, 15 Jun 2018 02:47:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fTiWJ-000770-ED for qemu-devel@nongnu.org; Fri, 15 Jun 2018 02:47:42 -0400 Received: from mail-wm0-x232.google.com ([2a00:1450:400c:c09::232]:52460) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fTiWJ-000756-4t for qemu-devel@nongnu.org; Fri, 15 Jun 2018 02:47:39 -0400 Received: by mail-wm0-x232.google.com with SMTP id p126-v6so1755347wmb.2 for ; Thu, 14 Jun 2018 23:47:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=9backLBPxUjbFjsO1oI7pYU0OuwtO9+6+nLSc/fnvyg=; b=sgGYMsRZLfUfFGEAz0rtf8yl0jUpBVTyq0lQhrrFOTl/o4/LpuuaVcgdlvlsqiNf1T /FsSIVuoAwUBPU06bWwBhlppyXgBQcF0QHj8AV+njpU7z+ymXciWgovSN5lo4Yhs+1S/ pMUvOnUHsdKoOFQ+ahSKGIUojmJpvWb13wjOZ1uOYppehmp6186sKJdrzpLWxpanmc2D Rmk8JTWsPpCZvX1PqFnE36T0aGXx0JvtJt+dVJovcOeNtZ5S6ojOV0Ug1uWtU9hYF60k mir6CKH1OIUNl/+ET//bP6h7rFCVYNLxmXIzUZasAnUjuL1x5oRVFw4j87aq/qd5OEAP RWng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=9backLBPxUjbFjsO1oI7pYU0OuwtO9+6+nLSc/fnvyg=; b=ESKNiOseZeiPx9gTFFcCT4A1WTIBDwQFBD3BCU+r5tpC+hwwaCsIG3btAHjoFu9npH hK2/+HRaJetG6qYdifKOxR9wOwC1i09CUDdGYq2rryIazlh/l4765cJybedX2niIujvx 400Ahz1HaLwEl2mP3oam0KZTRNqq9EwAeqt1N4PFst93Hvlpj3XLURsRzTwwBiABqhEp G1YNdFU1/k8las4BOI0bX8/d+A7JfkoQv4TU23+elWt34S8mrZc2GCu5nL2DVPhMzfQZ QFx+pgtxzQk62d0CTn0QfTNIsYFHULf9etAGqbZIBKsXlOtFphp7yJnA/3FxmXEwaAR1 Xx5w== X-Gm-Message-State: APt69E2R9yhn0ycpIBNClIyDaub+3DCmpzzcr0WHLPAPP9YThm2d4V3K Uh0zjIdlm6O3BftDxRHM3sVWHpSD X-Received: by 2002:a1c:14cc:: with SMTP id 195-v6mr191816wmu.48.1529045257436; Thu, 14 Jun 2018 23:47:37 -0700 (PDT) Received: from cizrna.lan ([109.72.12.206]) by smtp.gmail.com with ESMTPSA id c10-v6sm6968957wrs.6.2018.06.14.23.47.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Jun 2018 23:47:36 -0700 (PDT) From: Tomeu Vizoso To: qemu-devel@nongnu.org Date: Fri, 15 Jun 2018 08:47:01 +0200 Message-Id: <20180615064701.40928-1-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.17.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::232 Subject: [Qemu-devel] [PATCH] egl-headless: Allow OpenGL ES context creation 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: kernel@collabora.com, Gerd Hoffmann , Tomeu Vizoso Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" This will be mainly useful for automated testing of virglrenderer on ES. Signed-off-by: Tomeu Vizoso --- include/ui/egl-helpers.h | 6 ++--- qemu-options.hx | 1 + ui/egl-headless.c | 2 +- ui/egl-helpers.c | 56 +++++++++++++++++++++++++++++----------- ui/gtk-egl.c | 2 +- ui/spice-core.c | 2 +- 6 files changed, 48 insertions(+), 21 deletions(-) -- 2.17.0 diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 747233ce5846..9c76a04a2492 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -34,7 +34,7 @@ extern int qemu_egl_rn_fd; extern struct gbm_device *qemu_egl_rn_gbm_dev; extern EGLContext qemu_egl_rn_ctx; -int egl_rendernode_init(const char *rendernode); +int egl_rendernode_init(const char *rendernode, bool gles); int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc); void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf); @@ -45,7 +45,7 @@ void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf); EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win); int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy); -int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy); -EGLContext qemu_egl_init_ctx(void); +int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, bool gles); +EGLContext qemu_egl_init_ctx(bool gles); #endif /* EGL_HELPERS_H */ diff --git a/qemu-options.hx b/qemu-options.hx index c0d3951e9ffd..baa320ce615d 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1242,6 +1242,7 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, "-display sdl[,frame=on|off][,alt_grab=on|off][,ctrl_grab=on|off]\n" " [,window_close=on|off][,gl=on|core|es|off]\n" "-display gtk[,grab_on_hover=on|off][,gl=on|off]|\n" + "-display egl-headless[,gl=core|es]|\n" "-display vnc=[,]\n" "-display curses\n" "-display none" diff --git a/ui/egl-headless.c b/ui/egl-headless.c index 7c877122d385..796bce0bfa67 100644 --- a/ui/egl-headless.c +++ b/ui/egl-headless.c @@ -175,7 +175,7 @@ static void egl_headless_init(DisplayState *ds, DisplayOptions *opts) egl_dpy *edpy; int idx; - if (egl_rendernode_init(NULL) < 0) { + if (egl_rendernode_init(NULL, opts->gl == DISPLAYGL_MODE_ES) < 0) { error_report("egl: render node init failed"); exit(1); } diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 16dc3ded3630..a775f4ffb725 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -191,7 +191,7 @@ static int qemu_egl_rendernode_open(const char *rendernode) return fd; } -int egl_rendernode_init(const char *rendernode) +int egl_rendernode_init(const char *rendernode, bool gles) { qemu_egl_rn_fd = -1; int rc; @@ -208,7 +208,8 @@ int egl_rendernode_init(const char *rendernode) goto err; } - rc = qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev); + rc = qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev, + gles); if (rc != 0) { /* qemu_egl_init_dpy_mesa reports error */ goto err; @@ -225,7 +226,7 @@ int egl_rendernode_init(const char *rendernode) goto err; } - qemu_egl_rn_ctx = qemu_egl_init_ctx(); + qemu_egl_rn_ctx = qemu_egl_init_ctx(gles); if (!qemu_egl_rn_ctx) { error_report("egl: egl_init_ctx failed"); goto err; @@ -392,7 +393,8 @@ static EGLDisplay qemu_egl_get_display(EGLNativeDisplayType native, } static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, - EGLenum platform) + EGLenum platform, + bool gles) { static const EGLint conf_att_gl[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, @@ -403,6 +405,15 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, EGL_ALPHA_SIZE, 0, EGL_NONE, }; + static const EGLint conf_att_gles[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 5, + EGL_BLUE_SIZE, 5, + EGL_ALPHA_SIZE, 0, + EGL_NONE, + }; EGLint major, minor; EGLBoolean b; EGLint n; @@ -419,14 +430,21 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, return -1; } - b = eglBindAPI(EGL_OPENGL_API); + if (gles) + b = eglBindAPI(EGL_OPENGL_ES_API); + else + b = eglBindAPI(EGL_OPENGL_API); if (b == EGL_FALSE) { error_report("egl: eglBindAPI failed"); return -1; } - b = eglChooseConfig(qemu_egl_display, conf_att_gl, - &qemu_egl_config, 1, &n); + if (gles) + b = eglChooseConfig(qemu_egl_display, conf_att_gles, + &qemu_egl_config, 1, &n); + else + b = eglChooseConfig(qemu_egl_display, conf_att_gl, + &qemu_egl_config, 1, &n); if (b == EGL_FALSE || n != 1) { error_report("egl: eglChooseConfig failed"); return -1; @@ -437,32 +455,40 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy) { #ifdef EGL_KHR_platform_x11 - return qemu_egl_init_dpy(dpy, EGL_PLATFORM_X11_KHR); + return qemu_egl_init_dpy(dpy, EGL_PLATFORM_X11_KHR, false); #else - return qemu_egl_init_dpy(dpy, 0); + return qemu_egl_init_dpy(dpy, 0, false); #endif } -int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy) +int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, bool gles) { #ifdef EGL_MESA_platform_gbm - return qemu_egl_init_dpy(dpy, EGL_PLATFORM_GBM_MESA); + return qemu_egl_init_dpy(dpy, EGL_PLATFORM_GBM_MESA, gles); #else - return qemu_egl_init_dpy(dpy, 0); + return qemu_egl_init_dpy(dpy, 0, gles); #endif } -EGLContext qemu_egl_init_ctx(void) +EGLContext qemu_egl_init_ctx(bool gles) { static const EGLint ctx_att_gl[] = { EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT, EGL_NONE }; + static const EGLint ctx_att_gles[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; EGLContext ectx; EGLBoolean b; - ectx = eglCreateContext(qemu_egl_display, qemu_egl_config, EGL_NO_CONTEXT, - ctx_att_gl); + if (gles) + ectx = eglCreateContext(qemu_egl_display, qemu_egl_config, + EGL_NO_CONTEXT, ctx_att_gles); + else + ectx = eglCreateContext(qemu_egl_display, qemu_egl_config, + EGL_NO_CONTEXT, ctx_att_gl); if (ectx == EGL_NO_CONTEXT) { error_report("egl: eglCreateContext failed"); return NULL; diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index 9390c6762e87..9ab50a17c029 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -57,7 +57,7 @@ void gd_egl_init(VirtualConsole *vc) return; } - vc->gfx.ectx = qemu_egl_init_ctx(); + vc->gfx.ectx = qemu_egl_init_ctx(false); vc->gfx.esurface = qemu_egl_init_surface_x11(vc->gfx.ectx, x11_window); assert(vc->gfx.esurface); diff --git a/ui/spice-core.c b/ui/spice-core.c index ae8921a201ca..6d659b64b4ce 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -829,7 +829,7 @@ void qemu_spice_init(void) "incompatible with -spice port/tls-port"); exit(1); } - if (egl_rendernode_init(qemu_opt_get(opts, "rendernode")) != 0) { + if (egl_rendernode_init(qemu_opt_get(opts, "rendernode"), false) != 0) { error_report("Failed to initialize EGL render node for SPICE GL"); exit(1); }