mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-14 09:18:20 +02:00
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:
parent
652e33b829
commit
d6f36224eb
8 changed files with 62 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue