virtio-gpu: Add helpers to create and destroy dmabuf objects
These helpers can be useful for creating dmabuf objects from blobs and submitting them to the UI. Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Message-Id: <20210526231429.1045476-12-vivek.kasireddy@intel.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									8069b73bee
								
							
						
					
					
						commit
						5752519e93
					
				@ -156,3 +156,68 @@ void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource *res)
 | 
				
			|||||||
        virtio_gpu_destroy_udmabuf(res);
 | 
					        virtio_gpu_destroy_udmabuf(res);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void virtio_gpu_free_dmabuf(VirtIOGPU *g, VGPUDMABuf *dmabuf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct virtio_gpu_scanout *scanout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scanout = &g->parent_obj.scanout[dmabuf->scanout_id];
 | 
				
			||||||
 | 
					    dpy_gl_release_dmabuf(scanout->con, &dmabuf->buf);
 | 
				
			||||||
 | 
					    QTAILQ_REMOVE(&g->dmabuf.bufs, dmabuf, next);
 | 
				
			||||||
 | 
					    g_free(dmabuf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static VGPUDMABuf
 | 
				
			||||||
 | 
					*virtio_gpu_create_dmabuf(VirtIOGPU *g,
 | 
				
			||||||
 | 
					                          uint32_t scanout_id,
 | 
				
			||||||
 | 
					                          struct virtio_gpu_simple_resource *res,
 | 
				
			||||||
 | 
					                          struct virtio_gpu_framebuffer *fb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    VGPUDMABuf *dmabuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (res->dmabuf_fd < 0) {
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dmabuf = g_new0(VGPUDMABuf, 1);
 | 
				
			||||||
 | 
					    dmabuf->buf.width = fb->width;
 | 
				
			||||||
 | 
					    dmabuf->buf.height = fb->height;
 | 
				
			||||||
 | 
					    dmabuf->buf.stride = fb->stride;
 | 
				
			||||||
 | 
					    dmabuf->buf.fourcc = qemu_pixman_to_drm_format(fb->format);
 | 
				
			||||||
 | 
					    dmabuf->buf.fd = res->dmabuf_fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dmabuf->scanout_id = scanout_id;
 | 
				
			||||||
 | 
					    QTAILQ_INSERT_HEAD(&g->dmabuf.bufs, dmabuf, next);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return dmabuf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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_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);
 | 
				
			||||||
 | 
					    if (!new_primary) {
 | 
				
			||||||
 | 
					        return -EINVAL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (g->dmabuf.primary) {
 | 
				
			||||||
 | 
					        old_primary = g->dmabuf.primary;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g->dmabuf.primary = new_primary;
 | 
				
			||||||
 | 
					    qemu_console_resize(scanout->con,
 | 
				
			||||||
 | 
					                        new_primary->buf.width,
 | 
				
			||||||
 | 
					                        new_primary->buf.height);
 | 
				
			||||||
 | 
					    dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (old_primary) {
 | 
				
			||||||
 | 
					        virtio_gpu_free_dmabuf(g, old_primary);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -150,6 +150,12 @@ struct VirtIOGPUBaseClass {
 | 
				
			|||||||
    DEFINE_PROP_UINT32("xres", _state, _conf.xres, 1024), \
 | 
					    DEFINE_PROP_UINT32("xres", _state, _conf.xres, 1024), \
 | 
				
			||||||
    DEFINE_PROP_UINT32("yres", _state, _conf.yres, 768)
 | 
					    DEFINE_PROP_UINT32("yres", _state, _conf.yres, 768)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VGPUDMABuf {
 | 
				
			||||||
 | 
					    QemuDmaBuf buf;
 | 
				
			||||||
 | 
					    uint32_t scanout_id;
 | 
				
			||||||
 | 
					    QTAILQ_ENTRY(VGPUDMABuf) next;
 | 
				
			||||||
 | 
					} VGPUDMABuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct VirtIOGPU {
 | 
					struct VirtIOGPU {
 | 
				
			||||||
    VirtIOGPUBase parent_obj;
 | 
					    VirtIOGPUBase parent_obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -178,6 +184,11 @@ struct VirtIOGPU {
 | 
				
			|||||||
        uint32_t req_3d;
 | 
					        uint32_t req_3d;
 | 
				
			||||||
        uint32_t bytes_3d;
 | 
					        uint32_t bytes_3d;
 | 
				
			||||||
    } stats;
 | 
					    } stats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        QTAILQ_HEAD(, VGPUDMABuf) bufs;
 | 
				
			||||||
 | 
					        VGPUDMABuf *primary;
 | 
				
			||||||
 | 
					    } dmabuf;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct VirtIOGPUClass {
 | 
					struct VirtIOGPUClass {
 | 
				
			||||||
@ -259,6 +270,10 @@ void virtio_gpu_update_cursor_data(VirtIOGPU *g,
 | 
				
			|||||||
bool virtio_gpu_have_udmabuf(void);
 | 
					bool virtio_gpu_have_udmabuf(void);
 | 
				
			||||||
void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res);
 | 
					void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res);
 | 
				
			||||||
void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource *res);
 | 
					void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource *res);
 | 
				
			||||||
 | 
					int virtio_gpu_update_dmabuf(VirtIOGPU *g,
 | 
				
			||||||
 | 
					                             uint32_t scanout_id,
 | 
				
			||||||
 | 
					                             struct virtio_gpu_simple_resource *res,
 | 
				
			||||||
 | 
					                             struct virtio_gpu_framebuffer *fb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* virtio-gpu-3d.c */
 | 
					/* virtio-gpu-3d.c */
 | 
				
			||||||
void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
 | 
					void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
 | 
				
			||||||
 | 
				
			|||||||
@ -16,3 +16,12 @@ void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource *res)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    /* nothing (stub) */
 | 
					    /* nothing (stub) */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int virtio_gpu_update_dmabuf(VirtIOGPU *g,
 | 
				
			||||||
 | 
					                             uint32_t scanout_id,
 | 
				
			||||||
 | 
					                             struct virtio_gpu_simple_resource *res,
 | 
				
			||||||
 | 
					                             struct virtio_gpu_framebuffer *fb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* nothing (stub) */
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user