xref: /qemu/ui/dmabuf.c (revision db81dd6b)
16e6ae491SDongwon Kim /*
26e6ae491SDongwon Kim  * SPDX-License-Identifier: GPL-2.0-or-later
36e6ae491SDongwon Kim  *
46e6ae491SDongwon Kim  * QemuDmaBuf struct and helpers used for accessing its data
56e6ae491SDongwon Kim  *
66e6ae491SDongwon Kim  * This work is licensed under the terms of the GNU GPL, version 2 or later.
76e6ae491SDongwon Kim  * See the COPYING file in the top-level directory.
86e6ae491SDongwon Kim  */
96e6ae491SDongwon Kim 
106e6ae491SDongwon Kim #include "qemu/osdep.h"
116e6ae491SDongwon Kim #include "ui/dmabuf.h"
126e6ae491SDongwon Kim 
13db81dd6bSDongwon Kim struct QemuDmaBuf {
14db81dd6bSDongwon Kim     int       fd;
15db81dd6bSDongwon Kim     uint32_t  width;
16db81dd6bSDongwon Kim     uint32_t  height;
17db81dd6bSDongwon Kim     uint32_t  stride;
18db81dd6bSDongwon Kim     uint32_t  fourcc;
19db81dd6bSDongwon Kim     uint64_t  modifier;
20db81dd6bSDongwon Kim     uint32_t  texture;
21db81dd6bSDongwon Kim     uint32_t  x;
22db81dd6bSDongwon Kim     uint32_t  y;
23db81dd6bSDongwon Kim     uint32_t  backing_width;
24db81dd6bSDongwon Kim     uint32_t  backing_height;
25db81dd6bSDongwon Kim     bool      y0_top;
26db81dd6bSDongwon Kim     void      *sync;
27db81dd6bSDongwon Kim     int       fence_fd;
28db81dd6bSDongwon Kim     bool      allow_fences;
29db81dd6bSDongwon Kim     bool      draw_submitted;
30db81dd6bSDongwon Kim };
31db81dd6bSDongwon Kim 
qemu_dmabuf_new(uint32_t width,uint32_t height,uint32_t stride,uint32_t x,uint32_t y,uint32_t backing_width,uint32_t backing_height,uint32_t fourcc,uint64_t modifier,int32_t dmabuf_fd,bool allow_fences,bool y0_top)326e6ae491SDongwon Kim QemuDmaBuf *qemu_dmabuf_new(uint32_t width, uint32_t height,
336e6ae491SDongwon Kim                             uint32_t stride, uint32_t x,
346e6ae491SDongwon Kim                             uint32_t y, uint32_t backing_width,
356e6ae491SDongwon Kim                             uint32_t backing_height, uint32_t fourcc,
366e6ae491SDongwon Kim                             uint64_t modifier, int32_t dmabuf_fd,
376e6ae491SDongwon Kim                             bool allow_fences, bool y0_top) {
386e6ae491SDongwon Kim     QemuDmaBuf *dmabuf;
396e6ae491SDongwon Kim 
406e6ae491SDongwon Kim     dmabuf = g_new0(QemuDmaBuf, 1);
416e6ae491SDongwon Kim 
426e6ae491SDongwon Kim     dmabuf->width = width;
436e6ae491SDongwon Kim     dmabuf->height = height;
446e6ae491SDongwon Kim     dmabuf->stride = stride;
456e6ae491SDongwon Kim     dmabuf->x = x;
466e6ae491SDongwon Kim     dmabuf->y = y;
476e6ae491SDongwon Kim     dmabuf->backing_width = backing_width;
486e6ae491SDongwon Kim     dmabuf->backing_height = backing_height;
496e6ae491SDongwon Kim     dmabuf->fourcc = fourcc;
506e6ae491SDongwon Kim     dmabuf->modifier = modifier;
516e6ae491SDongwon Kim     dmabuf->fd = dmabuf_fd;
526e6ae491SDongwon Kim     dmabuf->allow_fences = allow_fences;
536e6ae491SDongwon Kim     dmabuf->y0_top = y0_top;
546e6ae491SDongwon Kim     dmabuf->fence_fd = -1;
556e6ae491SDongwon Kim 
566e6ae491SDongwon Kim     return dmabuf;
576e6ae491SDongwon Kim }
586e6ae491SDongwon Kim 
qemu_dmabuf_free(QemuDmaBuf * dmabuf)596e6ae491SDongwon Kim void qemu_dmabuf_free(QemuDmaBuf *dmabuf)
606e6ae491SDongwon Kim {
616e6ae491SDongwon Kim     if (dmabuf == NULL) {
626e6ae491SDongwon Kim         return;
636e6ae491SDongwon Kim     }
646e6ae491SDongwon Kim 
656e6ae491SDongwon Kim     g_free(dmabuf);
666e6ae491SDongwon Kim }
676e6ae491SDongwon Kim 
qemu_dmabuf_get_fd(QemuDmaBuf * dmabuf)686e6ae491SDongwon Kim int qemu_dmabuf_get_fd(QemuDmaBuf *dmabuf)
696e6ae491SDongwon Kim {
706e6ae491SDongwon Kim     assert(dmabuf != NULL);
716e6ae491SDongwon Kim 
726e6ae491SDongwon Kim     return dmabuf->fd;
736e6ae491SDongwon Kim }
746e6ae491SDongwon Kim 
qemu_dmabuf_dup_fd(QemuDmaBuf * dmabuf)756e6ae491SDongwon Kim int qemu_dmabuf_dup_fd(QemuDmaBuf *dmabuf)
766e6ae491SDongwon Kim {
776e6ae491SDongwon Kim     assert(dmabuf != NULL);
786e6ae491SDongwon Kim 
796e6ae491SDongwon Kim     if (dmabuf->fd >= 0) {
806e6ae491SDongwon Kim         return dup(dmabuf->fd);
816e6ae491SDongwon Kim     } else {
826e6ae491SDongwon Kim         return -1;
836e6ae491SDongwon Kim     }
846e6ae491SDongwon Kim }
856e6ae491SDongwon Kim 
qemu_dmabuf_close(QemuDmaBuf * dmabuf)866e6ae491SDongwon Kim void qemu_dmabuf_close(QemuDmaBuf *dmabuf)
876e6ae491SDongwon Kim {
886e6ae491SDongwon Kim     assert(dmabuf != NULL);
896e6ae491SDongwon Kim 
906e6ae491SDongwon Kim     if (dmabuf->fd >= 0) {
916e6ae491SDongwon Kim         close(dmabuf->fd);
926e6ae491SDongwon Kim         dmabuf->fd = -1;
936e6ae491SDongwon Kim     }
946e6ae491SDongwon Kim }
956e6ae491SDongwon Kim 
qemu_dmabuf_get_width(QemuDmaBuf * dmabuf)966e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_width(QemuDmaBuf *dmabuf)
976e6ae491SDongwon Kim {
986e6ae491SDongwon Kim     assert(dmabuf != NULL);
996e6ae491SDongwon Kim 
1006e6ae491SDongwon Kim     return dmabuf->width;
1016e6ae491SDongwon Kim }
1026e6ae491SDongwon Kim 
qemu_dmabuf_get_height(QemuDmaBuf * dmabuf)1036e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_height(QemuDmaBuf *dmabuf)
1046e6ae491SDongwon Kim {
1056e6ae491SDongwon Kim     assert(dmabuf != NULL);
1066e6ae491SDongwon Kim 
1076e6ae491SDongwon Kim     return dmabuf->height;
1086e6ae491SDongwon Kim }
1096e6ae491SDongwon Kim 
qemu_dmabuf_get_stride(QemuDmaBuf * dmabuf)1106e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_stride(QemuDmaBuf *dmabuf)
1116e6ae491SDongwon Kim {
1126e6ae491SDongwon Kim     assert(dmabuf != NULL);
1136e6ae491SDongwon Kim 
1146e6ae491SDongwon Kim     return dmabuf->stride;
1156e6ae491SDongwon Kim }
1166e6ae491SDongwon Kim 
qemu_dmabuf_get_fourcc(QemuDmaBuf * dmabuf)1176e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_fourcc(QemuDmaBuf *dmabuf)
1186e6ae491SDongwon Kim {
1196e6ae491SDongwon Kim     assert(dmabuf != NULL);
1206e6ae491SDongwon Kim 
1216e6ae491SDongwon Kim     return dmabuf->fourcc;
1226e6ae491SDongwon Kim }
1236e6ae491SDongwon Kim 
qemu_dmabuf_get_modifier(QemuDmaBuf * dmabuf)1246e6ae491SDongwon Kim uint64_t qemu_dmabuf_get_modifier(QemuDmaBuf *dmabuf)
1256e6ae491SDongwon Kim {
1266e6ae491SDongwon Kim     assert(dmabuf != NULL);
1276e6ae491SDongwon Kim 
1286e6ae491SDongwon Kim     return dmabuf->modifier;
1296e6ae491SDongwon Kim }
1306e6ae491SDongwon Kim 
qemu_dmabuf_get_texture(QemuDmaBuf * dmabuf)1316e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_texture(QemuDmaBuf *dmabuf)
1326e6ae491SDongwon Kim {
1336e6ae491SDongwon Kim     assert(dmabuf != NULL);
1346e6ae491SDongwon Kim 
1356e6ae491SDongwon Kim     return dmabuf->texture;
1366e6ae491SDongwon Kim }
1376e6ae491SDongwon Kim 
qemu_dmabuf_get_x(QemuDmaBuf * dmabuf)1386e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_x(QemuDmaBuf *dmabuf)
1396e6ae491SDongwon Kim {
1406e6ae491SDongwon Kim     assert(dmabuf != NULL);
1416e6ae491SDongwon Kim 
1426e6ae491SDongwon Kim     return dmabuf->x;
1436e6ae491SDongwon Kim }
1446e6ae491SDongwon Kim 
qemu_dmabuf_get_y(QemuDmaBuf * dmabuf)1456e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_y(QemuDmaBuf *dmabuf)
1466e6ae491SDongwon Kim {
1476e6ae491SDongwon Kim     assert(dmabuf != NULL);
1486e6ae491SDongwon Kim 
1496e6ae491SDongwon Kim     return dmabuf->y;
1506e6ae491SDongwon Kim }
1516e6ae491SDongwon Kim 
qemu_dmabuf_get_backing_width(QemuDmaBuf * dmabuf)1526e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_backing_width(QemuDmaBuf *dmabuf)
1536e6ae491SDongwon Kim {
1546e6ae491SDongwon Kim     assert(dmabuf != NULL);
1556e6ae491SDongwon Kim 
1566e6ae491SDongwon Kim     return dmabuf->backing_width;
1576e6ae491SDongwon Kim }
1586e6ae491SDongwon Kim 
qemu_dmabuf_get_backing_height(QemuDmaBuf * dmabuf)1596e6ae491SDongwon Kim uint32_t qemu_dmabuf_get_backing_height(QemuDmaBuf *dmabuf)
1606e6ae491SDongwon Kim {
1616e6ae491SDongwon Kim     assert(dmabuf != NULL);
1626e6ae491SDongwon Kim 
1636e6ae491SDongwon Kim     return dmabuf->backing_height;
1646e6ae491SDongwon Kim }
1656e6ae491SDongwon Kim 
qemu_dmabuf_get_y0_top(QemuDmaBuf * dmabuf)1666e6ae491SDongwon Kim bool qemu_dmabuf_get_y0_top(QemuDmaBuf *dmabuf)
1676e6ae491SDongwon Kim {
1686e6ae491SDongwon Kim     assert(dmabuf != NULL);
1696e6ae491SDongwon Kim 
1706e6ae491SDongwon Kim     return dmabuf->y0_top;
1716e6ae491SDongwon Kim }
1726e6ae491SDongwon Kim 
qemu_dmabuf_get_sync(QemuDmaBuf * dmabuf)1736e6ae491SDongwon Kim void *qemu_dmabuf_get_sync(QemuDmaBuf *dmabuf)
1746e6ae491SDongwon Kim {
1756e6ae491SDongwon Kim     assert(dmabuf != NULL);
1766e6ae491SDongwon Kim 
1776e6ae491SDongwon Kim     return dmabuf->sync;
1786e6ae491SDongwon Kim }
1796e6ae491SDongwon Kim 
qemu_dmabuf_get_fence_fd(QemuDmaBuf * dmabuf)1806e6ae491SDongwon Kim int32_t qemu_dmabuf_get_fence_fd(QemuDmaBuf *dmabuf)
1816e6ae491SDongwon Kim {
1826e6ae491SDongwon Kim     assert(dmabuf != NULL);
1836e6ae491SDongwon Kim 
1846e6ae491SDongwon Kim     return dmabuf->fence_fd;
1856e6ae491SDongwon Kim }
1866e6ae491SDongwon Kim 
qemu_dmabuf_get_allow_fences(QemuDmaBuf * dmabuf)1876e6ae491SDongwon Kim bool qemu_dmabuf_get_allow_fences(QemuDmaBuf *dmabuf)
1886e6ae491SDongwon Kim {
1896e6ae491SDongwon Kim     assert(dmabuf != NULL);
1906e6ae491SDongwon Kim 
1916e6ae491SDongwon Kim     return dmabuf->allow_fences;
1926e6ae491SDongwon Kim }
1936e6ae491SDongwon Kim 
qemu_dmabuf_get_draw_submitted(QemuDmaBuf * dmabuf)1946e6ae491SDongwon Kim bool qemu_dmabuf_get_draw_submitted(QemuDmaBuf *dmabuf)
1956e6ae491SDongwon Kim {
1966e6ae491SDongwon Kim     assert(dmabuf != NULL);
1976e6ae491SDongwon Kim 
1986e6ae491SDongwon Kim     return dmabuf->draw_submitted;
1996e6ae491SDongwon Kim }
2006e6ae491SDongwon Kim 
qemu_dmabuf_set_texture(QemuDmaBuf * dmabuf,uint32_t texture)2016e6ae491SDongwon Kim void qemu_dmabuf_set_texture(QemuDmaBuf *dmabuf, uint32_t texture)
2026e6ae491SDongwon Kim {
2036e6ae491SDongwon Kim     assert(dmabuf != NULL);
2046e6ae491SDongwon Kim     dmabuf->texture = texture;
2056e6ae491SDongwon Kim }
2066e6ae491SDongwon Kim 
qemu_dmabuf_set_fence_fd(QemuDmaBuf * dmabuf,int32_t fence_fd)2076e6ae491SDongwon Kim void qemu_dmabuf_set_fence_fd(QemuDmaBuf *dmabuf, int32_t fence_fd)
2086e6ae491SDongwon Kim {
2096e6ae491SDongwon Kim     assert(dmabuf != NULL);
2106e6ae491SDongwon Kim     dmabuf->fence_fd = fence_fd;
2116e6ae491SDongwon Kim }
2126e6ae491SDongwon Kim 
qemu_dmabuf_set_sync(QemuDmaBuf * dmabuf,void * sync)2136e6ae491SDongwon Kim void qemu_dmabuf_set_sync(QemuDmaBuf *dmabuf, void *sync)
2146e6ae491SDongwon Kim {
2156e6ae491SDongwon Kim     assert(dmabuf != NULL);
2166e6ae491SDongwon Kim     dmabuf->sync = sync;
2176e6ae491SDongwon Kim }
2186e6ae491SDongwon Kim 
qemu_dmabuf_set_draw_submitted(QemuDmaBuf * dmabuf,bool draw_submitted)2196e6ae491SDongwon Kim void qemu_dmabuf_set_draw_submitted(QemuDmaBuf *dmabuf, bool draw_submitted)
2206e6ae491SDongwon Kim {
2216e6ae491SDongwon Kim     assert(dmabuf != NULL);
2226e6ae491SDongwon Kim     dmabuf->draw_submitted = draw_submitted;
2236e6ae491SDongwon Kim }
2246e6ae491SDongwon Kim 
qemu_dmabuf_set_fd(QemuDmaBuf * dmabuf,int32_t fd)2256e6ae491SDongwon Kim void qemu_dmabuf_set_fd(QemuDmaBuf *dmabuf, int32_t fd)
2266e6ae491SDongwon Kim {
2276e6ae491SDongwon Kim     assert(dmabuf != NULL);
2286e6ae491SDongwon Kim     dmabuf->fd = fd;
2296e6ae491SDongwon Kim }
230