diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index 9700b474812..b63c60e8d64 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -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 diff --git a/src/gallium/drivers/crocus/crocus_bufmgr.c b/src/gallium/drivers/crocus/crocus_bufmgr.c index 773308d5744..04061905699 100644 --- a/src/gallium/drivers/crocus/crocus_bufmgr.c +++ b/src/gallium/drivers/crocus/crocus_bufmgr.c @@ -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); diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c index ae7bb6374ad..f07eb3225bb 100644 --- a/src/gallium/drivers/crocus/crocus_screen.c +++ b/src/gallium/drivers/crocus/crocus_screen.c @@ -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; diff --git a/src/gallium/drivers/crocus/crocus_screen.h b/src/gallium/drivers/crocus/crocus_screen.h index fbcc0aa81a4..66247c390b6 100644 --- a/src/gallium/drivers/crocus/crocus_screen.h +++ b/src/gallium/drivers/crocus/crocus_screen.h @@ -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" diff --git a/src/gallium/winsys/crocus/drm/crocus_drm_public.h b/src/gallium/winsys/crocus/drm/crocus_drm_public.h index 614543136be..c810a8bf274 100644 --- a/src/gallium/winsys/crocus/drm/crocus_drm_public.h +++ b/src/gallium/winsys/crocus/drm/crocus_drm_public.h @@ -24,10 +24,16 @@ #ifndef CROCUS_DRM_PUBLIC_H #define CROCUS_DRM_PUBLIC_H +#include + 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 */ diff --git a/src/gallium/winsys/crocus/drm/crocus_drm_winsys.c b/src/gallium/winsys/crocus/drm/crocus_drm_winsys.c index ffeeba567ac..693da226374 100644 --- a/src/gallium/winsys/crocus/drm/crocus_drm_winsys.c +++ b/src/gallium/winsys/crocus/drm/crocus_drm_winsys.c @@ -21,11 +21,16 @@ * IN THE SOFTWARE. */ +#include #include #include +#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 +} diff --git a/src/gallium/winsys/crocus/drm/meson.build b/src/gallium/winsys/crocus/drm/meson.build index 9c0325ecd5a..ee7d7f42b8d 100644 --- a/src/gallium/winsys/crocus/drm/meson.build +++ b/src/gallium/winsys/crocus/drm/meson.build @@ -10,4 +10,5 @@ libcrocuswinsys = static_library( ], gnu_symbol_visibility : 'hidden', dependencies : [dep_valgrind, idep_intel_dev, idep_mesautil], + link_with : [libintel_dev], )