radeonsi: enable virtio native context support

Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21658>
This commit is contained in:
Pierre-Eric Pelloux-Prayer
2024-10-14 16:40:35 +02:00
committed by Marge Bot
parent 2269ea7e2f
commit 612774c4a6
10 changed files with 80 additions and 18 deletions
@@ -210,8 +210,8 @@ pipe_radeonsi_create_screen(int fd, const struct pipe_screen_config *config)
const driOptionDescription radeonsi_driconf[] = {
#include "radeonsi/driinfo_radeonsi.h"
};
DRM_DRIVER_DESCRIPTOR(radeonsi, radeonsi_driconf, ARRAY_SIZE(radeonsi_driconf))
DRM_DRIVER_DESCRIPTOR(radeonsi, radeonsi_driconf, ARRAY_SIZE(radeonsi_driconf),
.probe_nctx = si_virtgpu_probe_nctx)
#else
DRM_DRIVER_DESCRIPTOR_STUB(radeonsi)
#endif
+8 -2
View File
@@ -104,7 +104,7 @@ files_libradeonsi = files(
)
radeonsi_include_dirs = [inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_amd_common,
inc_amd_common_llvm, inc_gallium_drivers, inc_compiler, inc_amd, inc_amd_vpe]
inc_amd_common_llvm, inc_gallium_drivers, inc_compiler, inc_amd, inc_amd_vpe, inc_virtio_gpu]
radeonsi_deps = [dep_llvm, dep_clock, dep_libdrm, idep_nir_headers, idep_amdgfxregs_h, idep_mesautil, idep_aco, idep_u_tracepoints, idep_si_tracepoints]
if with_perfetto
@@ -141,16 +141,22 @@ foreach ver : ['6', '7', '8', '9', '10', '103', '11', '115', '12']
)
endforeach
libradeonsi_cflags = []
if with_amdgpu_virtio
libradeonsi_cflags += ['-DHAVE_AMDGPU_VIRTIO']
endif
libradeonsi = static_library(
'radeonsi',
[files_libradeonsi, sid_tables_h],
c_args : libradeonsi_cflags,
include_directories : radeonsi_include_dirs,
gnu_symbol_visibility : 'hidden',
dependencies : radeonsi_deps,
)
driver_radeonsi = declare_dependency(
compile_args : '-DGALLIUM_RADEONSI',
compile_args : ['-DGALLIUM_RADEONSI'] + libradeonsi_cflags,
link_with : radeonsi_gfx_libs + [
libradeonsi, libradeonwinsys, libamdgpuwinsys, libamd_common, libamd_common_llvm, libvpe
],
+30 -7
View File
@@ -31,6 +31,10 @@
#include "ac_llvm_util.h"
#endif
#if HAVE_AMDGPU_VIRTIO
#include "virtio/virtio-gpu/drm_hw.h"
#endif
#include <xf86drm.h>
static struct pipe_context *si_create_context(struct pipe_screen *screen, unsigned flags);
@@ -478,6 +482,18 @@ static void si_set_frontend_noop(struct pipe_context *ctx, bool enable)
sctx->is_noop = enable;
}
/* Function used by the pipe_loader to decide which driver to use when
* the KMD is virtio_gpu.
*/
bool si_virtgpu_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps)
{
#ifdef HAVE_AMDGPU_VIRTIO
return caps->context_type == VIRTGPU_DRM_CONTEXT_AMDGPU;
#else
return false;
#endif
}
static struct pipe_context *si_create_context(struct pipe_screen *screen, unsigned flags)
{
struct si_screen *sscreen = (struct si_screen *)screen;
@@ -1555,13 +1571,20 @@ struct pipe_screen *radeonsi_screen_create(int fd, const struct pipe_screen_conf
driParseConfigFiles(config->options, config->options_info, 0, "radeonsi",
NULL, NULL, NULL, 0, NULL, 0);
switch (version->version_major) {
case 2:
rw = radeon_drm_winsys_create(fd, config, radeonsi_screen_create_impl);
break;
case 3:
rw = amdgpu_winsys_create(fd, config, radeonsi_screen_create_impl);
break;
#ifdef HAVE_AMDGPU_VIRTIO
if (strcmp(version->name, "virtio_gpu") == 0) {
rw = amdgpu_winsys_create(fd, config, radeonsi_screen_create_impl, true);
} else
#endif
{
switch (version->version_major) {
case 2:
rw = radeon_drm_winsys_create(fd, config, radeonsi_screen_create_impl);
break;
case 3:
rw = amdgpu_winsys_create(fd, config, radeonsi_screen_create_impl, false);
break;
}
}
si_driver_ds_init();
+3
View File
@@ -9,7 +9,10 @@
struct pipe_screen;
struct pipe_screen_config;
struct virgl_renderer_capset_drm;
struct pipe_screen *radeonsi_screen_create(int fd, const struct pipe_screen_config *config);
bool si_virtgpu_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps);
#endif
+1 -1
View File
@@ -970,7 +970,7 @@ typedef struct pipe_screen *(*radeon_screen_create_t)(struct radeon_winsys *,
/* These functions create the radeon_winsys instance for the corresponding kernel driver. */
struct radeon_winsys *
amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
radeon_screen_create_t screen_create);
radeon_screen_create_t screen_create, bool is_virtio);
struct radeon_winsys *
radeon_drm_winsys_create(int fd, const struct pipe_screen_config *config,
radeon_screen_create_t screen_create);
+2 -1
View File
@@ -117,7 +117,8 @@ foreach d : [[with_gallium_kmsro, [
[with_gallium_r600, 'r600_dri.so'],
[with_gallium_svga, 'vmwgfx_dri.so'],
[with_gallium_virgl or
(with_gallium_freedreno and freedreno_kmds.contains('virtio')),
(with_gallium_freedreno and freedreno_kmds.contains('virtio')) or
(with_gallium_radeonsi and with_amdgpu_virtio),
'virtio_gpu_dri.so'],
[with_gallium_lima, 'lima_dri.so'],
[with_gallium_d3d12, 'd3d12_dri.so'],
+13 -1
View File
@@ -1599,6 +1599,7 @@ static struct pb_buffer_lean *amdgpu_bo_from_handle(struct radeon_winsys *rws,
switch (whandle->type) {
case WINSYS_HANDLE_TYPE_SHARED:
assert(!aws->info.is_virtio); /* Legacy-path, not handled */
type = amdgpu_bo_handle_type_gem_flink_name;
break;
case WINSYS_HANDLE_TYPE_FD:
@@ -1735,11 +1736,22 @@ static bool amdgpu_bo_get_handle(struct radeon_winsys *rws,
switch (whandle->type) {
case WINSYS_HANDLE_TYPE_SHARED:
/* This is a legacy code-path, not supported by virtio. */
assert(!aws->info.is_virtio);
type = amdgpu_bo_handle_type_gem_flink_name;
break;
case WINSYS_HANDLE_TYPE_KMS:
if (sws->fd == aws->fd) {
whandle->handle = bo->kms_handle;
/* For virtio we can't return kms_handle, because it's not a GEM handle,
* but a resource ID. Instead, repurpose the deprecated type
* amdgpu_bo_handle_type_kms_noimport to request a GEM handle.
*/
if (aws->info.is_virtio)
ac_drm_bo_export(aws->dev, bo->bo,
amdgpu_bo_handle_type_kms_noimport,
&whandle->handle);
else
whandle->handle = bo->kms_handle;
if (bo->is_shared)
return true;
@@ -212,6 +212,10 @@ bool amdgpu_fence_wait(struct pipe_fence_handle *fence, uint64_t timeout,
abs_timeout, 0, NULL))
return false;
/* Check that guest-side syncobj agrees with the user fence. */
if (user_fence_cpu && afence->aws->info.is_virtio)
assert(afence->seq_no <= *user_fence_cpu);
afence->signalled = true;
return true;
}
@@ -1171,6 +1175,10 @@ static unsigned amdgpu_cs_get_buffer_list(struct radeon_cmdbuf *rcs,
struct amdgpu_buffer_list *real_buffers = &cs->buffer_lists[AMDGPU_BO_REAL];
unsigned num_real_buffers = real_buffers->num_buffers;
#if HAVE_AMDGPU_VIRTIO
assert(!cs->ws->info.is_virtio);
#endif
if (list) {
for (unsigned i = 0; i < num_real_buffers; i++) {
list[i].bo_size = real_buffers->buffers[i].bo->base.size;
@@ -373,7 +373,7 @@ amdgpu_drm_winsys_get_fd(struct radeon_winsys *rws)
PUBLIC struct radeon_winsys *
amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
radeon_screen_create_t screen_create)
radeon_screen_create_t screen_create, bool is_virtio)
{
struct amdgpu_screen_winsys *sws;
struct amdgpu_winsys *aws;
@@ -395,9 +395,10 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
/* Initialize the amdgpu device. This should always return the same pointer
* for the same fd. */
r = ac_drm_device_initialize(fd, false, &drm_major, &drm_minor, &dev);
r = ac_drm_device_initialize(fd, is_virtio, &drm_major, &drm_minor, &dev);
if (r) {
fprintf(stderr, "amdgpu: amdgpu_device_initialize failed.\n");
fprintf(stderr, "amdgpu: amd%s_device_initialize failed.\n",
is_virtio ? "vgpu" : "gpu");
goto fail;
}
@@ -459,6 +460,8 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
goto fail_alloc;
simple_mtx_init(&aws->vm_ioctl_lock, mtx_plain);
aws->info.is_virtio = is_virtio;
/* Only aws and buffer functions are used. */
aws->dummy_sws.aws = aws;
amdgpu_bo_init_functions(&aws->dummy_sws);
+7 -1
View File
@@ -1,6 +1,11 @@
# Copyright © 2017 Dylan Baker
# SPDX-License-Identifier: MIT
c_args = []
if with_amdgpu_virtio
c_args += '-DHAVE_AMDGPU_VIRTIO'
endif
libamdgpuwinsys = static_library(
'amdgpuwinsys',
files(
@@ -10,9 +15,10 @@ libamdgpuwinsys = static_library(
),
include_directories : [
inc_amd, inc_gallium, inc_gallium_aux, inc_include, inc_src,
inc_amd_common, inc_amd_common_llvm,
inc_amd_common, inc_amd_common_llvm, inc_virtio_gpu
],
gnu_symbol_visibility : 'hidden',
link_with : libamdgpu_addrlib,
dependencies : [dep_llvm, dep_libdrm_amdgpu, idep_amdgfxregs_h, idep_mesautil],
c_args : c_args
)