Lines Matching +full:conf +full:- +full:ds
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
5 #include "qemu/error-report.h"
9 #include "hw/virtio/virtio-gpu.h"
10 #include "hw/virtio/virtio-gpu-pixman.h"
11 #include "hw/virtio/virtio-iommu.h"
21 (cmd)->error = VIRTIO_GPU_RESP_ERR_UNSPEC; \
46 if (res->width != s->current_cursor->width || in virtio_gpu_rutabaga_update_cursor()
47 res->height != s->current_cursor->height) { in virtio_gpu_rutabaga_update_cursor()
54 transfer.w = res->width; in virtio_gpu_rutabaga_update_cursor()
55 transfer.h = res->height; in virtio_gpu_rutabaga_update_cursor()
58 transfer_iovec.iov_base = s->current_cursor->data; in virtio_gpu_rutabaga_update_cursor()
59 transfer_iovec.iov_len = res->width * res->height * 4; in virtio_gpu_rutabaga_update_cursor()
61 rutabaga_resource_transfer_read(vr->rutabaga, 0, in virtio_gpu_rutabaga_update_cursor()
99 result = rutabaga_resource_create_3d(vr->rutabaga, c2d.resource_id, &rc_3d); in rutabaga_cmd_create_resource_2d()
103 res->width = c2d.width; in rutabaga_cmd_create_resource_2d()
104 res->height = c2d.height; in rutabaga_cmd_create_resource_2d()
105 res->format = c2d.format; in rutabaga_cmd_create_resource_2d()
106 res->resource_id = c2d.resource_id; in rutabaga_cmd_create_resource_2d()
108 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in rutabaga_cmd_create_resource_2d()
138 result = rutabaga_resource_create_3d(vr->rutabaga, c3d.resource_id, &rc_3d); in rutabaga_cmd_create_resource_3d()
142 res->width = c3d.width; in rutabaga_cmd_create_resource_3d()
143 res->height = c3d.height; in rutabaga_cmd_create_resource_3d()
144 res->format = c3d.format; in rutabaga_cmd_create_resource_3d()
145 res->resource_id = c3d.resource_id; in rutabaga_cmd_create_resource_3d()
147 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in rutabaga_cmd_create_resource_3d()
158 result = rutabaga_resource_unref(vr->rutabaga, res->resource_id); in virtio_gpu_rutabaga_resource_unref()
164 res->resource_id); in virtio_gpu_rutabaga_resource_unref()
167 if (res->image) { in virtio_gpu_rutabaga_resource_unref()
168 pixman_image_unref(res->image); in virtio_gpu_rutabaga_resource_unref()
171 QTAILQ_REMOVE(&g->reslist, res, next); in virtio_gpu_rutabaga_resource_unref()
214 result = rutabaga_context_create(vr->rutabaga, cc.hdr.ctx_id, in rutabaga_cmd_context_create()
231 result = rutabaga_context_destroy(vr->rutabaga, cd.hdr.ctx_id); in rutabaga_cmd_context_destroy()
248 if (vr->headless) { in rutabaga_cmd_resource_flush()
259 for (i = 0; i < vb->conf.max_outputs; i++) { in rutabaga_cmd_resource_flush()
260 scanout = &vb->scanout[i]; in rutabaga_cmd_resource_flush()
261 if (i == res->scanout_bitmask) { in rutabaga_cmd_resource_flush()
274 transfer.w = res->width; in rutabaga_cmd_resource_flush()
275 transfer.h = res->height; in rutabaga_cmd_resource_flush()
278 transfer_iovec.iov_base = pixman_image_get_data(res->image); in rutabaga_cmd_resource_flush()
279 transfer_iovec.iov_len = res->width * res->height * 4; in rutabaga_cmd_resource_flush()
281 result = rutabaga_resource_transfer_read(vr->rutabaga, 0, in rutabaga_cmd_resource_flush()
285 dpy_gfx_update_full(scanout->con); in rutabaga_cmd_resource_flush()
297 if (vr->headless) { in rutabaga_cmd_set_scanout()
306 scanout = &vb->scanout[ss.scanout_id]; in rutabaga_cmd_set_scanout()
309 dpy_gfx_replace_surface(scanout->con, NULL); in rutabaga_cmd_set_scanout()
310 dpy_gl_scanout_disable(scanout->con); in rutabaga_cmd_set_scanout()
317 if (!res->image) { in rutabaga_cmd_set_scanout()
319 pformat = virtio_gpu_get_pixman_format(res->format); in rutabaga_cmd_set_scanout()
322 res->image = pixman_image_create_bits(pformat, in rutabaga_cmd_set_scanout()
323 res->width, in rutabaga_cmd_set_scanout()
324 res->height, in rutabaga_cmd_set_scanout()
326 CHECK(res->image, cmd); in rutabaga_cmd_set_scanout()
327 pixman_image_ref(res->image); in rutabaga_cmd_set_scanout()
330 vb->enable = 1; in rutabaga_cmd_set_scanout()
333 scanout->ds = qemu_create_displaysurface_pixman(res->image); in rutabaga_cmd_set_scanout()
334 dpy_gfx_replace_surface(scanout->con, NULL); in rutabaga_cmd_set_scanout()
335 dpy_gfx_replace_surface(scanout->con, scanout->ds); in rutabaga_cmd_set_scanout()
336 res->scanout_bitmask = ss.scanout_id; in rutabaga_cmd_set_scanout()
355 s = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num, in rutabaga_cmd_submit_3d()
363 result = rutabaga_submit_command(vr->rutabaga, &rutabaga_cmd); in rutabaga_cmd_submit_3d()
387 result = rutabaga_resource_transfer_write(vr->rutabaga, 0, t2d.resource_id, in rutabaga_cmd_transfer_to_host_2d()
416 result = rutabaga_resource_transfer_write(vr->rutabaga, t3d.hdr.ctx_id, in rutabaga_cmd_transfer_to_host_3d()
445 result = rutabaga_resource_transfer_read(vr->rutabaga, t3d.hdr.ctx_id, in rutabaga_cmd_transfer_from_host_3d()
465 CHECK(!res->iov, cmd); in rutabaga_cmd_attach_backing()
468 cmd, NULL, &res->iov, &res->iov_cnt); in rutabaga_cmd_attach_backing()
471 vecs.iovecs = res->iov; in rutabaga_cmd_attach_backing()
472 vecs.num_iovecs = res->iov_cnt; in rutabaga_cmd_attach_backing()
474 ret = rutabaga_resource_attach_backing(vr->rutabaga, att_rb.resource_id, in rutabaga_cmd_attach_backing()
497 rutabaga_resource_detach_backing(vr->rutabaga, in rutabaga_cmd_detach_backing()
516 result = rutabaga_context_attach_resource(vr->rutabaga, att_res.hdr.ctx_id, in rutabaga_cmd_ctx_attach_resource()
534 result = rutabaga_context_detach_resource(vr->rutabaga, det_res.hdr.ctx_id, in rutabaga_cmd_ctx_detach_resource()
550 result = rutabaga_get_capset_info(vr->rutabaga, info.capset_index, in rutabaga_cmd_get_capset_info()
571 for (i = 0; i < vr->num_capsets; i++) { in rutabaga_cmd_get_capset()
572 result = rutabaga_get_capset_info(vr->rutabaga, i, in rutabaga_cmd_get_capset()
582 CHECK(i < vr->num_capsets, cmd); in rutabaga_cmd_get_capset()
585 resp->hdr.type = VIRTIO_GPU_RESP_OK_CAPSET; in rutabaga_cmd_get_capset()
586 rutabaga_get_capset(vr->rutabaga, gc.capset_id, gc.capset_version, in rutabaga_cmd_get_capset()
587 resp->capset_data, capset_size); in rutabaga_cmd_get_capset()
589 virtio_gpu_ctrl_response(g, cmd, &resp->hdr, sizeof(*resp) + capset_size); in rutabaga_cmd_get_capset()
612 res->resource_id = cblob.resource_id; in rutabaga_cmd_resource_create_blob()
613 res->blob_size = cblob.size; in rutabaga_cmd_resource_create_blob()
617 sizeof(cblob), cmd, &res->addrs, in rutabaga_cmd_resource_create_blob()
618 &res->iov, &res->iov_cnt); in rutabaga_cmd_resource_create_blob()
627 vecs.iovecs = res->iov; in rutabaga_cmd_resource_create_blob()
628 vecs.num_iovecs = res->iov_cnt; in rutabaga_cmd_resource_create_blob()
630 result = rutabaga_resource_create_blob(vr->rutabaga, cblob.hdr.ctx_id, in rutabaga_cmd_resource_create_blob()
640 QTAILQ_INSERT_HEAD(&g->reslist, res, next); in rutabaga_cmd_resource_create_blob()
666 result = rutabaga_resource_map_info(vr->rutabaga, mblob.resource_id, in rutabaga_cmd_resource_map_blob()
671 * RUTABAGA_MAP_ACCESS_* flags are not part of the virtio-gpu spec, but do in rutabaga_cmd_resource_map_blob()
677 result = rutabaga_resource_map(vr->rutabaga, mblob.resource_id, &mapping); in rutabaga_cmd_resource_map_blob()
684 * https://lists.gnu.org/archive/html/qemu-devel/2023-09/msg05141.html in rutabaga_cmd_resource_map_blob()
690 if (vr->memory_regions[slot].used) { in rutabaga_cmd_resource_map_blob()
694 MemoryRegion *mr = &(vr->memory_regions[slot].mr); in rutabaga_cmd_resource_map_blob()
697 memory_region_add_subregion(&vb->hostmem, mblob.offset, mr); in rutabaga_cmd_resource_map_blob()
698 vr->memory_regions[slot].resource_id = mblob.resource_id; in rutabaga_cmd_resource_map_blob()
699 vr->memory_regions[slot].used = 1; in rutabaga_cmd_resource_map_blob()
704 result = rutabaga_resource_unmap(vr->rutabaga, mblob.resource_id); in rutabaga_cmd_resource_map_blob()
734 if (vr->memory_regions[slot].resource_id != ublob.resource_id) { in rutabaga_cmd_resource_unmap_blob()
738 MemoryRegion *mr = &(vr->memory_regions[slot].mr); in rutabaga_cmd_resource_unmap_blob()
739 memory_region_del_subregion(&vb->hostmem, mr); in rutabaga_cmd_resource_unmap_blob()
741 vr->memory_regions[slot].resource_id = 0; in rutabaga_cmd_resource_unmap_blob()
742 vr->memory_regions[slot].used = 0; in rutabaga_cmd_resource_unmap_blob()
747 result = rutabaga_resource_unmap(vr->rutabaga, res->resource_id); in rutabaga_cmd_resource_unmap_blob()
760 VIRTIO_GPU_FILL_CMD(cmd->cmd_hdr); in virtio_gpu_rutabaga_process_cmd()
762 switch (cmd->cmd_hdr.type) { in virtio_gpu_rutabaga_process_cmd()
830 cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC; in virtio_gpu_rutabaga_process_cmd()
834 if (cmd->finished) { in virtio_gpu_rutabaga_process_cmd()
837 if (cmd->error) { in virtio_gpu_rutabaga_process_cmd()
839 cmd->cmd_hdr.type, cmd->error); in virtio_gpu_rutabaga_process_cmd()
840 virtio_gpu_ctrl_response_nodata(g, cmd, cmd->error); in virtio_gpu_rutabaga_process_cmd()
843 if (!(cmd->cmd_hdr.flags & VIRTIO_GPU_FLAG_FENCE)) { in virtio_gpu_rutabaga_process_cmd()
848 fence.flags = cmd->cmd_hdr.flags; in virtio_gpu_rutabaga_process_cmd()
849 fence.ctx_id = cmd->cmd_hdr.ctx_id; in virtio_gpu_rutabaga_process_cmd()
850 fence.fence_id = cmd->cmd_hdr.fence_id; in virtio_gpu_rutabaga_process_cmd()
851 fence.ring_idx = cmd->cmd_hdr.ring_idx; in virtio_gpu_rutabaga_process_cmd()
853 trace_virtio_gpu_fence_ctrl(cmd->cmd_hdr.fence_id, cmd->cmd_hdr.type); in virtio_gpu_rutabaga_process_cmd()
855 result = rutabaga_create_fence(vr->rutabaga, &fence); in virtio_gpu_rutabaga_process_cmd()
863 VirtIOGPU *g = VIRTIO_GPU(data->vr); in virtio_gpu_rutabaga_aio_cb()
864 struct rutabaga_fence fence_data = data->fence; in virtio_gpu_rutabaga_aio_cb()
870 QTAILQ_FOREACH_SAFE(cmd, &g->fenceq, next, tmp) { in virtio_gpu_rutabaga_aio_cb()
874 uint32_t target_ctx_specific = cmd->cmd_hdr.flags & in virtio_gpu_rutabaga_aio_cb()
882 (cmd->cmd_hdr.ring_idx != fence_data.ring_idx)) { in virtio_gpu_rutabaga_aio_cb()
886 if (cmd->cmd_hdr.fence_id > fence_data.fence_id) { in virtio_gpu_rutabaga_aio_cb()
890 trace_virtio_gpu_fence_resp(cmd->cmd_hdr.fence_id); in virtio_gpu_rutabaga_aio_cb()
892 QTAILQ_REMOVE(&g->fenceq, cmd, next); in virtio_gpu_rutabaga_aio_cb()
908 * gfxstream and both cross-domain (and even newer versions virglrenderer: in virtio_gpu_rutabaga_fence_cb()
913 * crosvm and other virtio-gpu 1.1 implementations enable callback threads in virtio_gpu_rutabaga_fence_cb()
925 data->vr = vr; in virtio_gpu_rutabaga_fence_cb()
926 data->fence = *fence; in virtio_gpu_rutabaga_fence_cb()
936 switch (debug->debug_type) { in virtio_gpu_rutabaga_debug_cb()
938 error_report("%s", debug->message); in virtio_gpu_rutabaga_debug_cb()
941 warn_report("%s", debug->message); in virtio_gpu_rutabaga_debug_cb()
944 info_report("%s", debug->message); in virtio_gpu_rutabaga_debug_cb()
947 error_report("unknown debug type: %u", debug->debug_type); in virtio_gpu_rutabaga_debug_cb()
959 vr->rutabaga = NULL; in virtio_gpu_rutabaga_init()
965 * does copy from the render target to the Pixman buffer if a virtio-gpu in virtio_gpu_rutabaga_init()
972 * In the future, more performant virtio-gpu 2D UI integration may be added. in virtio_gpu_rutabaga_init()
974 if (vr->wsi) { in virtio_gpu_rutabaga_init()
975 if (g_str_equal(vr->wsi, "surfaceless")) { in virtio_gpu_rutabaga_init()
976 vr->headless = false; in virtio_gpu_rutabaga_init()
977 } else if (g_str_equal(vr->wsi, "headless")) { in virtio_gpu_rutabaga_init()
978 vr->headless = true; in virtio_gpu_rutabaga_init()
987 builder.capset_mask = vr->capset_mask; in virtio_gpu_rutabaga_init()
997 * 2) Otherwise, attempt to connect to $XDG_RUNTIME_DIR/wayland-0 in virtio_gpu_rutabaga_init()
1003 if (!vr->wayland_socket_path) { in virtio_gpu_rutabaga_init()
1007 display = "wayland-0"; in virtio_gpu_rutabaga_init()
1015 channel.channel_name = vr->wayland_socket_path; in virtio_gpu_rutabaga_init()
1026 result = rutabaga_init(&builder, &vr->rutabaga); in virtio_gpu_rutabaga_init()
1028 error_setg_errno(errp, -result, "Failed to init rutabaga"); in virtio_gpu_rutabaga_init()
1041 result = rutabaga_get_num_capsets(vr->rutabaga, &num_capsets); in virtio_gpu_rutabaga_get_num_capsets()
1046 vr->num_capsets = num_capsets; in virtio_gpu_rutabaga_get_num_capsets()
1061 cmd->vq = vq; in virtio_gpu_rutabaga_handle_ctrl()
1062 cmd->error = 0; in virtio_gpu_rutabaga_handle_ctrl()
1063 cmd->finished = false; in virtio_gpu_rutabaga_handle_ctrl()
1064 QTAILQ_INSERT_TAIL(&g->cmdq, cmd, next); in virtio_gpu_rutabaga_handle_ctrl()
1091 bdev->conf.flags |= (1 << VIRTIO_GPU_FLAG_RUTABAGA_ENABLED); in virtio_gpu_rutabaga_realize()
1092 bdev->conf.flags |= (1 << VIRTIO_GPU_FLAG_BLOB_ENABLED); in virtio_gpu_rutabaga_realize()
1093 bdev->conf.flags |= (1 << VIRTIO_GPU_FLAG_CONTEXT_INIT_ENABLED); in virtio_gpu_rutabaga_realize()
1095 bdev->virtio_config.num_capsets = num_capsets; in virtio_gpu_rutabaga_realize()
1100 DEFINE_PROP_BIT64("gfxstream-vulkan", VirtIOGPURutabaga, capset_mask,
1102 DEFINE_PROP_BIT64("cross-domain", VirtIOGPURutabaga, capset_mask,
1104 DEFINE_PROP_BIT64("x-gfxstream-gles", VirtIOGPURutabaga, capset_mask,
1106 DEFINE_PROP_BIT64("x-gfxstream-composer", VirtIOGPURutabaga, capset_mask,
1108 DEFINE_PROP_STRING("wayland-socket-path", VirtIOGPURutabaga,
1121 vbc->gl_flushed = virtio_gpu_rutabaga_gl_flushed; in virtio_gpu_rutabaga_class_init()
1122 vgc->handle_ctrl = virtio_gpu_rutabaga_handle_ctrl; in virtio_gpu_rutabaga_class_init()
1123 vgc->process_cmd = virtio_gpu_rutabaga_process_cmd; in virtio_gpu_rutabaga_class_init()
1124 vgc->update_cursor_data = virtio_gpu_rutabaga_update_cursor; in virtio_gpu_rutabaga_class_init()
1125 vgc->resource_destroy = virtio_gpu_rutabaga_resource_unref; in virtio_gpu_rutabaga_class_init()
1126 vdc->realize = virtio_gpu_rutabaga_realize; in virtio_gpu_rutabaga_class_init()
1143 module_dep("hw-display-virtio-gpu");