[Spice-devel,v2,11/12] spice: add & use qemu_spice_gl_monitor_config

Submitted by Gerd Hoffmann on Feb. 19, 2016, 9:14 a.m.

Details

Message ID 1455873289-349-12-git-send-email-kraxel@redhat.com
State New
Headers show
Series "spice: add opengl/virgl/dmabuf support" ( rev: 2 ) in Spice

Not browsing as part of any series.

Commit Message

Gerd Hoffmann Feb. 19, 2016, 9:14 a.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/spice-display.h |  1 +
 ui/spice-display.c         | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h
index dd9cf6f..f9388c2 100644
--- a/include/ui/spice-display.h
+++ b/include/ui/spice-display.h
@@ -71,6 +71,7 @@  typedef struct QXLCookie {
             QXLRect area;
             int redraw;
         } render;
+        void *data;
     } u;
 } QXLCookie;
 
diff --git a/ui/spice-display.c b/ui/spice-display.c
index 96beb02..34e6d51 100644
--- a/ui/spice-display.c
+++ b/ui/spice-display.c
@@ -660,6 +660,11 @@  static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
         qemu_bh_schedule(ssd->gl_unblock_bh);
         break;
     }
+    case QXL_COOKIE_TYPE_IO:
+        if (cookie->io == QXL_IO_MONITORS_CONFIG_ASYNC) {
+            g_free(cookie->u.data);
+        }
+        break;
 #endif
     default:
         /* should never be called, used in qxl native mode only */
@@ -795,6 +800,29 @@  static const DisplayChangeListenerOps display_listener_ops = {
 
 #ifdef HAVE_SPICE_GL
 
+static void qemu_spice_gl_monitor_config(SimpleSpiceDisplay *ssd,
+                                         int x, int y, int w, int h)
+{
+    QXLMonitorsConfig *config;
+    QXLCookie *cookie;
+
+    config = g_malloc0(sizeof(QXLMonitorsConfig) + sizeof(QXLHead));
+    config->count = 1;
+    config->max_allowed = 1;
+    config->heads[0].x = x;
+    config->heads[0].y = y;
+    config->heads[0].width = w;
+    config->heads[0].height = h;
+    cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO,
+                            QXL_IO_MONITORS_CONFIG_ASYNC);
+    cookie->u.data = config;
+
+    spice_qxl_monitors_config_async(&ssd->qxl,
+                                    (uintptr_t)config,
+                                    MEMSLOT_GROUP_HOST,
+                                    (uintptr_t)cookie);
+}
+
 static void qemu_spice_gl_block(SimpleSpiceDisplay *ssd, bool block)
 {
     uint64_t timeout;
@@ -934,6 +962,8 @@  static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
                          surface_width(ssd->ds),
                          surface_height(ssd->ds),
                          stride, fourcc, y_0_top);
+
+    qemu_spice_gl_monitor_config(ssd, x, y, w, h);
 }
 
 static void qemu_spice_gl_update(DisplayChangeListener *dcl,

Comments

Hi

On Fri, Feb 19, 2016 at 10:14 AM, Gerd Hoffmann <kraxel@redhat.com> wrote:
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  include/ui/spice-display.h |  1 +
>  ui/spice-display.c         | 30 ++++++++++++++++++++++++++++++
>  2 files changed, 31 insertions(+)
>

Could eventually be squashed with "add opengl/virgl/dmabuf support" patch

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h
> index dd9cf6f..f9388c2 100644
> --- a/include/ui/spice-display.h
> +++ b/include/ui/spice-display.h
> @@ -71,6 +71,7 @@ typedef struct QXLCookie {
>              QXLRect area;
>              int redraw;
>          } render;
> +        void *data;
>      } u;
>  } QXLCookie;
>
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index 96beb02..34e6d51 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -660,6 +660,11 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
>          qemu_bh_schedule(ssd->gl_unblock_bh);
>          break;
>      }
> +    case QXL_COOKIE_TYPE_IO:
> +        if (cookie->io == QXL_IO_MONITORS_CONFIG_ASYNC) {
> +            g_free(cookie->u.data);
> +        }
> +        break;
>  #endif
>      default:
>          /* should never be called, used in qxl native mode only */
> @@ -795,6 +800,29 @@ static const DisplayChangeListenerOps display_listener_ops = {
>
>  #ifdef HAVE_SPICE_GL
>
> +static void qemu_spice_gl_monitor_config(SimpleSpiceDisplay *ssd,
> +                                         int x, int y, int w, int h)
> +{
> +    QXLMonitorsConfig *config;
> +    QXLCookie *cookie;
> +
> +    config = g_malloc0(sizeof(QXLMonitorsConfig) + sizeof(QXLHead));
> +    config->count = 1;
> +    config->max_allowed = 1;
> +    config->heads[0].x = x;
> +    config->heads[0].y = y;
> +    config->heads[0].width = w;
> +    config->heads[0].height = h;
> +    cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO,
> +                            QXL_IO_MONITORS_CONFIG_ASYNC);
> +    cookie->u.data = config;
> +
> +    spice_qxl_monitors_config_async(&ssd->qxl,
> +                                    (uintptr_t)config,
> +                                    MEMSLOT_GROUP_HOST,
> +                                    (uintptr_t)cookie);
> +}
> +
>  static void qemu_spice_gl_block(SimpleSpiceDisplay *ssd, bool block)
>  {
>      uint64_t timeout;
> @@ -934,6 +962,8 @@ static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
>                           surface_width(ssd->ds),
>                           surface_height(ssd->ds),
>                           stride, fourcc, y_0_top);
> +
> +    qemu_spice_gl_monitor_config(ssd, x, y, w, h);
>  }
>
>  static void qemu_spice_gl_update(DisplayChangeListener *dcl,
> --
> 1.8.3.1
>
Hi Gerd

On Fri, Feb 19, 2016 at 1:32 PM, Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
> Hi
>
> On Fri, Feb 19, 2016 at 10:14 AM, Gerd Hoffmann <kraxel@redhat.com> wrote:
>> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>> ---
>>  include/ui/spice-display.h |  1 +
>>  ui/spice-display.c         | 30 ++++++++++++++++++++++++++++++
>>  2 files changed, 31 insertions(+)
>>
>
> Could eventually be squashed with "add opengl/virgl/dmabuf support" patch
>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Sigh, too bad this wasn't actually picked or squashed with the series.
This is required for the spice client to know the area of the GL
surface to draw. (currently it also receives monitor config from
2d/QXL, which it associates to GL scanout when enabled, which results
in some clipping visible in virt-manager). Imho it would be worth to
include in 2.6.

>
>> diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h
>> index dd9cf6f..f9388c2 100644
>> --- a/include/ui/spice-display.h
>> +++ b/include/ui/spice-display.h
>> @@ -71,6 +71,7 @@ typedef struct QXLCookie {
>>              QXLRect area;
>>              int redraw;
>>          } render;
>> +        void *data;
>>      } u;
>>  } QXLCookie;
>>
>> diff --git a/ui/spice-display.c b/ui/spice-display.c
>> index 96beb02..34e6d51 100644
>> --- a/ui/spice-display.c
>> +++ b/ui/spice-display.c
>> @@ -660,6 +660,11 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
>>          qemu_bh_schedule(ssd->gl_unblock_bh);
>>          break;
>>      }
>> +    case QXL_COOKIE_TYPE_IO:
>> +        if (cookie->io == QXL_IO_MONITORS_CONFIG_ASYNC) {
>> +            g_free(cookie->u.data);
>> +        }
>> +        break;
>>  #endif
>>      default:
>>          /* should never be called, used in qxl native mode only */
>> @@ -795,6 +800,29 @@ static const DisplayChangeListenerOps display_listener_ops = {
>>
>>  #ifdef HAVE_SPICE_GL
>>
>> +static void qemu_spice_gl_monitor_config(SimpleSpiceDisplay *ssd,
>> +                                         int x, int y, int w, int h)
>> +{
>> +    QXLMonitorsConfig *config;
>> +    QXLCookie *cookie;
>> +
>> +    config = g_malloc0(sizeof(QXLMonitorsConfig) + sizeof(QXLHead));
>> +    config->count = 1;
>> +    config->max_allowed = 1;
>> +    config->heads[0].x = x;
>> +    config->heads[0].y = y;
>> +    config->heads[0].width = w;
>> +    config->heads[0].height = h;
>> +    cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO,
>> +                            QXL_IO_MONITORS_CONFIG_ASYNC);
>> +    cookie->u.data = config;
>> +
>> +    spice_qxl_monitors_config_async(&ssd->qxl,
>> +                                    (uintptr_t)config,
>> +                                    MEMSLOT_GROUP_HOST,
>> +                                    (uintptr_t)cookie);
>> +}
>> +
>>  static void qemu_spice_gl_block(SimpleSpiceDisplay *ssd, bool block)
>>  {
>>      uint64_t timeout;
>> @@ -934,6 +962,8 @@ static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
>>                           surface_width(ssd->ds),
>>                           surface_height(ssd->ds),
>>                           stride, fourcc, y_0_top);
>> +
>> +    qemu_spice_gl_monitor_config(ssd, x, y, w, h);
>>  }
>>
>>  static void qemu_spice_gl_update(DisplayChangeListener *dcl,
>> --
>> 1.8.3.1
>>
>
>
>
> --
> Marc-André Lureau