crocus: Support virtio-gpu native context
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Add virtio-gpu native context support to Crocus 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-04 17:20:50 +03:00 committed by Marge Bot
parent 335d142dad
commit 2bcd7e0fcd
7 changed files with 70 additions and 6 deletions

View file

@ -114,7 +114,8 @@ pipe_crocus_create_screen(int fd, const struct pipe_screen_config *config)
const driOptionDescription crocus_driconf[] = {
#include "crocus/driinfo_crocus.h"
};
DRM_DRIVER_DESCRIPTOR(crocus, crocus_driconf, ARRAY_SIZE(crocus_driconf))
DRM_DRIVER_DESCRIPTOR(crocus, crocus_driconf, ARRAY_SIZE(crocus_driconf),
.probe_nctx = crocus_drm_probe_nctx)
#else
DRM_DRIVER_DESCRIPTOR_STUB(crocus)
#endif

View file

@ -164,6 +164,7 @@ struct crocus_bufmgr {
bool has_mmap_offset:1;
bool has_tiling_uapi:1;
bool bo_reuse:1;
bool is_virtio:1;
};
static simple_mtx_t global_bufmgr_list_mutex = SIMPLE_MTX_INITIALIZER;
@ -820,9 +821,14 @@ crocus_bo_gem_mmap_offset(struct util_debug_callback *dbg, struct crocus_bo *bo,
return NULL;
}
void *map;
/* And map it */
void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
bufmgr->fd, mmap_arg.offset);
if (bufmgr->is_virtio)
map = intel_virtio_bo_mmap(bufmgr->fd, bo->gem_handle, bo->size, NULL);
else
map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
bufmgr->fd, 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));
@ -1169,6 +1175,8 @@ crocus_bufmgr_destroy(struct crocus_bufmgr *bufmgr)
_mesa_hash_table_destroy(bufmgr->name_table, NULL);
_mesa_hash_table_destroy(bufmgr->handle_table, NULL);
intel_virtio_unref_fd(bufmgr->fd);
close(bufmgr->fd);
free(bufmgr);
@ -1223,10 +1231,10 @@ crocus_bo_prime_fd_to_handle(int fd, int prime_fd, uint32_t *handle)
.fd = prime_fd,
};
*handle = 0;
if (intel_ioctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &prime_arg))
if (intel_ioctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &prime_arg)) {
*handle = 0;
return -errno;
}
*handle = prime_arg.handle;
@ -1640,6 +1648,8 @@ crocus_bufmgr_create(struct intel_device_info *devinfo, int fd, bool bo_reuse)
*/
bufmgr->fd = os_dupfd_cloexec(fd);
intel_virtio_ref_fd(bufmgr->fd);
p_atomic_set(&bufmgr->refcount, 1);
simple_mtx_init(&bufmgr->lock, mtx_plain);
@ -1650,6 +1660,7 @@ crocus_bufmgr_create(struct intel_device_info *devinfo, int fd, bool bo_reuse)
bufmgr->has_tiling_uapi = devinfo->has_tiling_uapi;
bufmgr->bo_reuse = bo_reuse;
bufmgr->has_mmap_offset = devinfo->has_mmap_offset;
bufmgr->is_virtio = devinfo->is_virtio;
init_cache_buckets(bufmgr);

View file

@ -466,6 +466,7 @@ crocus_screen_destroy(struct crocus_screen *screen)
u_transfer_helper_destroy(screen->base.transfer_helper);
crocus_bufmgr_unref(screen->bufmgr);
disk_cache_destroy(screen->disk_cache);
intel_virtio_unref_fd(screen->winsys_fd);
close(screen->winsys_fd);
ralloc_free(screen);
}
@ -550,6 +551,9 @@ crocus_screen_create(int fd, const struct pipe_screen_config *config)
if (!screen)
return NULL;
if (intel_virtio_init_fd(fd) < 0)
return NULL;
if (!intel_get_device_info_from_fd(fd, &screen->devinfo, 4, 8))
return NULL;
screen->pci_id = screen->devinfo.pci_device_id;

View file

@ -30,6 +30,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 "crocus_bufmgr.h"
#include "compiler/shader_enums.h"

View file

@ -24,10 +24,16 @@
#ifndef CROCUS_DRM_PUBLIC_H
#define CROCUS_DRM_PUBLIC_H
#include <stdbool.h>
struct pipe_screen;
struct pipe_screen_config;
struct virgl_renderer_capset_drm;
struct pipe_screen *
crocus_drm_screen_create(int drm_fd, const struct pipe_screen_config *config);
bool
crocus_drm_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps);
#endif /* CROCUS_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 "crocus_drm_public.h"
#include "crocus/crocus_screen.h"
@ -37,3 +42,38 @@ crocus_drm_screen_create(int fd, const struct pipe_screen_config *config)
return NULL;
return crocus_screen_create(newfd, config);
}
/**
* Check if the native-context type exposed by virtgpu is one we
* support, and that we support the underlying device.
*/
bool
crocus_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)
return false;
if (devinfo.ver == 8) {
if (devinfo.platform != INTEL_PLATFORM_CHV &&
!getenv("CROCUS_GEN8"))
return false;
}
return true;
#else
return false;
#endif
}

View file

@ -10,4 +10,5 @@ libcrocuswinsys = static_library(
],
gnu_symbol_visibility : 'hidden',
dependencies : [dep_valgrind, idep_intel_dev, idep_mesautil],
link_with : [libintel_dev],
)