mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 15:32:51 +00:00
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…
Reference in a new issue