<div dir="ltr">Hi<br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 26, 2016 at 5:51 PM, Anderson, Jason <span dir="ltr"><<a href="mailto:jander10@jaguarlandrover.com" target="_blank">jander10@jaguarlandrover.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi List,<div><br></div><div>I asked this in the IRC channel, sorry if I am asking someone to repeat themselves.</div><div><br></div><div>I am looking to setup a system using QEmu that we can use for testing and development.  The requirement is that the virtualized system must support 3d hardware acceleration, which has been provided by virgl renderer, as well as support up to 7 display outputs from a single GPU. </div></div></blockquote><div><br></div><div>The multimonitor support is so far quite incomplete or untested afaik.<br> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>I've dug through the QEmu side, and I see that the "max_outputs" property is set to 1 by default in virtio-gpu.c.  I have tried changing this to 3, which seems to expose 3 connectors/encoders/crtc to the driver when running the system; however, they do not seem to get attached to any fb.  </div></div></blockquote><div><br></div><div>Here I disable virgl, just to check if the basics/2d work:<br></div><div><br></div><div>You can enable extra monitors. For example, with the gtk display, switch the monitor with the "View" menu, you should have several "virtio-vga" outputs (as many as max_outputs). This will trigger a reconfiguration, that you can verify with xrandr output. However, qemu gets wrong scanout informations from the virtio drm driver. The +x+y offset is always +0+0, and the resultion is the same (a single window) so the display is the same.<br><br> Furthermore, I think qemu code is not complete once the offset will be corrected:<br><br>diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c<br>index f3b0f14..619d1ec 100644<br>--- a/hw/display/virtio-gpu.c<br>+++ b/hw/display/virtio-gpu.c<br>@@ -504,6 +504,7 @@ static void virtio_gpu_set_scanout(VirtIOGPU *g,<br>     uint32_t offset;<br>     int bpp;<br>     struct virtio_gpu_set_scanout ss;<br>+    uint8_t *data;<br> <br>     VIRTIO_GPU_FILL_CMD(ss);<br>     trace_virtio_gpu_cmd_set_scanout(ss.scanout_id, ss.resource_id,<br>@@ -567,12 +568,17 @@ static void virtio_gpu_set_scanout(VirtIOGPU *g,<br>     format = pixman_image_get_format(res->image);<br>     bpp = (PIXMAN_FORMAT_BPP(format) + 7) / 8;<br>     offset = (ss.r.x * bpp) + ss.r.y * pixman_image_get_stride(res->image);<br>-    if (!scanout->ds || surface_data(scanout->ds)<br>-        != ((uint8_t *)pixman_image_get_data(res->image) + offset) ||<br>-        scanout->width != ss.r.width ||<br>-        scanout->height != ss.r.height) {<br>+    data = (uint8_t *)pixman_image_get_data(res->image) + offset;<br>+    g_debug("id:%d %d+%d offset %d", ss.scanout_id, ss.r.x, ss.r.y, offset);<br>+    if (!scanout->ds || surface_data(scanout->ds) != data ||<br>+        surface_width(scanout->ds) != ss.r.width ||<br>+        surface_height(scanout->ds) != ss.r.height) {<br>         /* realloc the surface ptr */<br>-        scanout->ds = qemu_create_displaysurface_pixman(res->image);<br>+        scanout->ds =<br>+            qemu_create_displaysurface_from(ss.r.width, ss.r.height,<br>+                                            format,<br>+                                            pixman_image_get_stride(res->image),<br>+                                            data);<br>         if (!scanout->ds) {<br>             cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;<br>             return;<br><br></div><div>I just started looking at kernel code to understand the wrong offset bug, but I am quite confident Dave will be much faster at fixing it. <br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>In an ideal world, if I run QEmu with -dispaly sdl,gl=on,   I would like to see one window opened up for each virtual output.  If this is not possible, is it possible to have one very large frame buffer, and map different regions of it to different named outputs for use by Weston?  Are there any other options I am not considering, or am I crazy?</div></div></blockquote><div><br></div><div>I would say it's still an ideal world, there is work to do to support multiple monitors, especially with virgl, help appreciated!<br><br></div><div>regards<br><br></div></div>-- <br><div class="gmail_signature">Marc-André Lureau<br></div>
</div></div>