|
@@ -171,7 +171,8 @@ static VGPUDMABuf
|
|
|
*virtio_gpu_create_dmabuf(VirtIOGPU *g,
|
|
|
uint32_t scanout_id,
|
|
|
struct virtio_gpu_simple_resource *res,
|
|
|
- struct virtio_gpu_framebuffer *fb)
|
|
|
+ struct virtio_gpu_framebuffer *fb,
|
|
|
+ struct virtio_gpu_rect *r)
|
|
|
{
|
|
|
VGPUDMABuf *dmabuf;
|
|
|
|
|
@@ -183,6 +184,10 @@ static VGPUDMABuf
|
|
|
dmabuf->buf.width = fb->width;
|
|
|
dmabuf->buf.height = fb->height;
|
|
|
dmabuf->buf.stride = fb->stride;
|
|
|
+ dmabuf->buf.x = r->x;
|
|
|
+ dmabuf->buf.y = r->y;
|
|
|
+ dmabuf->buf.scanout_width = r->width;
|
|
|
+ dmabuf->buf.scanout_height = r->height;
|
|
|
dmabuf->buf.fourcc = qemu_pixman_to_drm_format(fb->format);
|
|
|
dmabuf->buf.fd = res->dmabuf_fd;
|
|
|
dmabuf->buf.allow_fences = true;
|
|
@@ -196,24 +201,25 @@ static VGPUDMABuf
|
|
|
int virtio_gpu_update_dmabuf(VirtIOGPU *g,
|
|
|
uint32_t scanout_id,
|
|
|
struct virtio_gpu_simple_resource *res,
|
|
|
- struct virtio_gpu_framebuffer *fb)
|
|
|
+ struct virtio_gpu_framebuffer *fb,
|
|
|
+ struct virtio_gpu_rect *r)
|
|
|
{
|
|
|
struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id];
|
|
|
VGPUDMABuf *new_primary, *old_primary = NULL;
|
|
|
|
|
|
- new_primary = virtio_gpu_create_dmabuf(g, scanout_id, res, fb);
|
|
|
+ new_primary = virtio_gpu_create_dmabuf(g, scanout_id, res, fb, r);
|
|
|
if (!new_primary) {
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (g->dmabuf.primary) {
|
|
|
- old_primary = g->dmabuf.primary;
|
|
|
+ if (g->dmabuf.primary[scanout_id]) {
|
|
|
+ old_primary = g->dmabuf.primary[scanout_id];
|
|
|
}
|
|
|
|
|
|
- g->dmabuf.primary = new_primary;
|
|
|
+ g->dmabuf.primary[scanout_id] = new_primary;
|
|
|
qemu_console_resize(scanout->con,
|
|
|
- new_primary->buf.width,
|
|
|
- new_primary->buf.height);
|
|
|
+ new_primary->buf.scanout_width,
|
|
|
+ new_primary->buf.scanout_height);
|
|
|
dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf);
|
|
|
|
|
|
if (old_primary) {
|