Huang Rui <ray.hu...@amd.com> writes: > From: Robert Beckett <bob.beck...@collabora.com> > > This relies on a virglrenderer change to include the dmabuf fd when > returning resource info. > <snip> > +static void virgl_cmd_set_scanout_blob(VirtIOGPU *g, > + struct virtio_gpu_ctrl_command *cmd) > +{ > + struct virgl_gpu_resource *vres; > + struct virtio_gpu_framebuffer fb = { 0 }; > + struct virtio_gpu_set_scanout_blob ss; > + struct virgl_renderer_resource_info info; > + uint64_t fbend; > + > + VIRTIO_GPU_FILL_CMD(ss); > + virtio_gpu_scanout_blob_bswap(&ss); > + trace_virtio_gpu_cmd_set_scanout_blob(ss.scanout_id, ss.resource_id, > + ss.r.width, ss.r.height, ss.r.x, > + ss.r.y); > + > + if (ss.scanout_id >= g->parent_obj.conf.max_outputs) { > + qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal scanout id specified %d", > + __func__, ss.scanout_id); > + cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID; > + return; > + } > + > + if (ss.resource_id == 0) { > + virtio_gpu_disable_scanout(g, ss.scanout_id); > + return; > + } > + > + if (ss.width < 16 || > + ss.height < 16 || > + ss.r.x + ss.r.width > ss.width || > + ss.r.y + ss.r.height > ss.height) { > + qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal scanout %d bounds for" > + " resource %d, rect (%d,%d)+%d,%d, fb %d %d\n", > + __func__, ss.scanout_id, ss.resource_id, > + ss.r.x, ss.r.y, ss.r.width, ss.r.height, > + ss.width, ss.height); > + cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER; > + return; > + } > + > + if (!console_has_gl(g->parent_obj.scanout[ss.scanout_id].con)) { > + qemu_log_mask(LOG_GUEST_ERROR, "%s: unable to scanout blot without > GL!\n", __func__); > + return; > + } > + > + vres = virgl_gpu_find_resource(g, ss.resource_id); > + if (!vres) { > + qemu_log_mask(LOG_GUEST_ERROR, > + "%s: illegal resource specified %d\n", > + __func__, ss.resource_id); > + cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID; > + return; > + } > + if (virgl_renderer_resource_get_info(ss.resource_id, &info)) { > + qemu_log_mask(LOG_GUEST_ERROR, > + "%s: illegal virgl resource specified %d\n", > + __func__, ss.resource_id); > + cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID; > + return; > + }
Minor nit, the format of the following needs to include braces. > + if (!vres->res.dmabuf_fd && info.fd) > + vres->res.dmabuf_fd = info.fd; However I'm seeing: cc -m64 -mcx16 -Ilibcommon.fa.p -I../../common-user/host/x86_64 -I../../linux-user/include/host/x86_64 -I../../linux-user/include -Iui -I../../ui -I/usr/include/capstone -I/usr/include/p11-kit-1 -I/usr/include/pixman-1 -I/usr/include/libpng16 -I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/libusb-1.0 -I/usr/include/SDL2 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/gio-unix-2.0 -I/usr/include/slirp -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/vte-2.91 -I/usr/include/virgl -I/home/alex/lsrc/qemu.git/builds/extra.libs/install/include -I/usr/include/cacard -I/usr/include/nss -I/usr/include/nspr -I/usr/include/PCSC -I/usr/include/pipewire-0.3 -I/usr/include/spa-0.2 -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11 -O2 -g -fstack-protector-strong -Wundef -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wmissing-format-attribute -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -Wshadow=local -isystem /home/alex/lsrc/qemu.git/linux-headers -isystem linux-headers -iquote . -iquote /home/alex/lsrc/qemu.git -iquote /home/alex/lsrc/qemu.git/include -iquote /home/alex/lsrc/qemu.git/host/include/x86_64 -iquote /home/alex/lsrc/qemu.git/host/include/generic -iquote /home/alex/lsrc/qemu.git/tcg/i386 -pthread -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fno-common -fwrapv -fPIE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNCURSES_WIDECHAR=1 -D_REENTRANT -DSTRUCT_IOVEC_DEFINED -MD -MQ libcommon.fa.p/hw_display_virtio-gpu-virgl.c.o -MF libcommon.fa.p/hw_display_virtio-gpu-virgl.c.o.d -o libcommon.fa.p/hw_display_virtio-gpu-virgl.c.o -c ../../hw/display/virtio-gpu-virgl.c ../../hw/display/virtio-gpu-virgl.c: In function ‘virgl_cmd_set_scanout_blob’: ../../hw/display/virtio-gpu-virgl.c:790:37: error: ‘struct virgl_renderer_resource_info’ has no member named ‘fd’ 790 | if (!vres->res.dmabuf_fd && info.fd) | ^ ../../hw/display/virtio-gpu-virgl.c:791:35: error: ‘struct virgl_renderer_resource_info’ has no member named ‘fd’ 791 | vres->res.dmabuf_fd = info.fd; | ^ But searching my extra libs (for aemu/gfstream/rutabaga_ffi) I can see the bindings.rs but nothing generated a header: $ ag -r "virgl_renderer_resource_info" crosvm.git/rutabaga_gfx/src/generated/virgl_renderer_bindings.rs 33:pub const VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION: u32 = 0; 337:pub struct virgl_renderer_resource_info { 351:pub struct virgl_renderer_resource_info_ext { 353: pub base: virgl_renderer_resource_info, 359:impl Default for virgl_renderer_resource_info_ext { 373: info: *mut virgl_renderer_resource_info, 379: info: *mut virgl_renderer_resource_info_ext, Which makes me think a) its picked up the older virgl headers and b) the crosvm/rutabaf_gfx install needs a fix. -- Alex Bennée Virtualisation Tech Lead @ Linaro