iris: Support virtio-gpu native context

Add virtio-gpu native context support to Iris driver.

Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29870>
This commit is contained in:
Dmitry Osipenko 2025-11-17 03:52:05 +03:00 committed by Marge Bot
parent 652e33b829
commit d6f36224eb
8 changed files with 62 additions and 4 deletions

View file

@ -92,7 +92,8 @@ pipe_iris_create_screen(int fd, const struct pipe_screen_config *config)
const driOptionDescription iris_driconf[] = {
#include "iris/driinfo_iris.h"
};
DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf))
DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf),
.probe_nctx = iris_drm_probe_nctx)
#else
DRM_DRIVER_DESCRIPTOR_STUB(iris)

View file

@ -215,9 +215,15 @@ i915_gem_mmap_offset(struct iris_bufmgr *bufmgr, struct iris_bo *bo)
return NULL;
}
void *map;
/* And map it */
void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
iris_bufmgr_get_fd(bufmgr), mmap_arg.offset);
if (iris_bufmgr_get_device_info(bufmgr)->is_virtio)
map = intel_virtio_bo_mmap(iris_bufmgr_get_fd(bufmgr),
bo->gem_handle, bo->size, NULL);
else
map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
iris_bufmgr_get_fd(bufmgr), mmap_arg.offset);
if (map == MAP_FAILED) {
DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
__FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno));

View file

@ -1928,6 +1928,8 @@ iris_bufmgr_destroy(struct iris_bufmgr *bufmgr)
iris_bufmgr_destroy_global_vm(bufmgr);
intel_virtio_unref_fd(bufmgr->fd);
close(bufmgr->fd);
simple_mtx_unlock(&bufmgr->lock);
@ -2424,6 +2426,8 @@ iris_bufmgr_create(struct intel_device_info *devinfo, int fd, bool bo_reuse)
if (bufmgr->fd == -1)
goto error_dup;
intel_virtio_ref_fd(bufmgr->fd);
p_atomic_set(&bufmgr->refcount, 1);
simple_mtx_init(&bufmgr->lock, mtx_plain);
@ -2591,6 +2595,7 @@ error_bucket_cache:
util_vma_heap_finish(&bufmgr->vma_allocator[i]);
iris_bufmgr_destroy_global_vm(bufmgr);
error_init_vm:
intel_virtio_unref_fd(bufmgr->fd);
close(bufmgr->fd);
error_dup:
free(bufmgr);

View file

@ -523,6 +523,7 @@ iris_screen_destroy(struct iris_screen *screen)
u_transfer_helper_destroy(screen->base.transfer_helper);
iris_bufmgr_unref(screen->bufmgr);
disk_cache_destroy(screen->disk_cache);
intel_virtio_unref_fd(screen->winsys_fd);
close(screen->winsys_fd);
ralloc_free(screen);
}
@ -667,6 +668,9 @@ iris_screen_create(int fd, const struct pipe_screen_config *config)
break;
}
if (intel_virtio_init_fd(fd) < 0)
return NULL;
process_intel_debug_variable();
screen->bufmgr = iris_bufmgr_get_for_fd(fd, bo_reuse);

View file

@ -11,6 +11,7 @@
#include "util/slab.h"
#include "util/u_screen.h"
#include "intel/dev/intel_device_info.h"
#include "intel/dev/virtio/intel_virtio.h"
#include "intel/isl/isl.h"
#include "iris_bufmgr.h"
#include "iris_binder.h"

View file

@ -24,10 +24,16 @@
#ifndef IRIS_DRM_PUBLIC_H
#define IRIS_DRM_PUBLIC_H
#include <stdbool.h>
struct pipe_screen;
struct pipe_screen_config;
struct virgl_renderer_capset_drm;
struct pipe_screen *
iris_drm_screen_create(int drm_fd, const struct pipe_screen_config *config);
bool
iris_drm_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps);
#endif /* IRIS_DRM_PUBLIC_H */

View file

@ -21,11 +21,16 @@
* IN THE SOFTWARE.
*/
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include "intel/dev/intel_device_info.h"
#include "util/os_file.h"
#include "virtio/virtio-gpu/drm_hw.h"
#include "iris_drm_public.h"
extern struct pipe_screen *iris_screen_create(int fd, const struct pipe_screen_config *config);
@ -34,3 +39,32 @@ iris_drm_screen_create(int fd, const struct pipe_screen_config *config)
{
return iris_screen_create(fd, config);
}
/**
* Check if the native-context type exposed by virtgpu is one we
* support, and that we support the underlying device.
*/
bool
iris_drm_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps)
{
#ifdef HAVE_INTEL_VIRTIO
if (caps->context_type != VIRTGPU_DRM_CONTEXT_I915)
return false;
if (debug_get_bool_option("INTEL_VIRTIO_DISABLE", false))
return false;
struct intel_device_info devinfo;
if (!intel_get_device_info_from_pci_id(caps->u.intel.pci_device_id,
&devinfo))
return false;
if (devinfo.ver < 8 || devinfo.platform == INTEL_PLATFORM_CHV)
return false;
return true;
#else
return false;
#endif
}

View file

@ -9,5 +9,6 @@ libiriswinsys = static_library(
inc_gallium, inc_gallium_aux, inc_gallium_drivers,
],
gnu_symbol_visibility : 'hidden',
dependencies: idep_mesautil,
dependencies: [idep_intel_dev, idep_mesautil],
link_with : [libintel_dev],
)