mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-17 10:20:33 +01:00
crocus: Support virtio-gpu native context
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:
parent
335d142dad
commit
2bcd7e0fcd
7 changed files with 70 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,4 +10,5 @@ libcrocuswinsys = static_library(
|
|||
],
|
||||
gnu_symbol_visibility : 'hidden',
|
||||
dependencies : [dep_valgrind, idep_intel_dev, idep_mesautil],
|
||||
link_with : [libintel_dev],
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue