diff mbox

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

Message ID 1455873289-349-12-git-send-email-kraxel@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

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

Comments

Marc-André Lureau Feb. 19, 2016, 12:32 p.m. UTC | #1
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
>
Marc-André Lureau April 28, 2016, 5:21 p.m. UTC | #2
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
diff mbox

Patch

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,