Message ID | 20240418190040.1110210-11-dmitry.osipenko@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support blob memory and venus on qemu | expand |
On 2024/04/19 4:00, Dmitry Osipenko wrote: > From: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> > > virtio_gpu_virgl_get_num_capsets will return "num_capsets", but we can't > assume that capset_index 1 is always VIRGL2 once we'll support more capsets, > like Venus and DRM capsets. Register capsets dynamically to avoid that problem. > > Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> > Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> > --- > hw/display/virtio-gpu-virgl.c | 37 ++++++++++++++++++++++------------ > include/hw/virtio/virtio-gpu.h | 3 +++ > 2 files changed, 27 insertions(+), 13 deletions(-) > > diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c > index eee3816b987f..c0e1ca3ff339 100644 > --- a/hw/display/virtio-gpu-virgl.c > +++ b/hw/display/virtio-gpu-virgl.c > @@ -558,19 +558,12 @@ static void virgl_cmd_get_capset_info(VirtIOGPU *g, > VIRTIO_GPU_FILL_CMD(info); > > memset(&resp, 0, sizeof(resp)); > - if (info.capset_index == 0) { > - resp.capset_id = VIRTIO_GPU_CAPSET_VIRGL; > - virgl_renderer_get_cap_set(resp.capset_id, > - &resp.capset_max_version, > - &resp.capset_max_size); > - } else if (info.capset_index == 1) { > - resp.capset_id = VIRTIO_GPU_CAPSET_VIRGL2; > + > + if (info.capset_index < g->num_capsets) { > + resp.capset_id = g->capset_ids[info.capset_index]; > virgl_renderer_get_cap_set(resp.capset_id, > &resp.capset_max_version, > &resp.capset_max_size); > - } else { > - resp.capset_max_version = 0; > - resp.capset_max_size = 0; > } > resp.hdr.type = VIRTIO_GPU_RESP_OK_CAPSET_INFO; > virtio_gpu_ctrl_response(g, cmd, &resp.hdr, sizeof(resp)); > @@ -1120,12 +1113,30 @@ int virtio_gpu_virgl_init(VirtIOGPU *g) > return 0; > } > > +static void virtio_gpu_virgl_add_capset(VirtIOGPU *g, uint32_t capset_id) > +{ > + g->capset_ids = g_realloc_n(g->capset_ids, g->num_capsets + 1, > + sizeof(*g->capset_ids)); > + g->capset_ids[g->num_capsets++] = capset_id; > +} > + > int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g) > { > uint32_t capset2_max_ver, capset2_max_size; > + > + if (g->num_capsets) { > + return g->num_capsets; > + } > + > + /* VIRGL is always supported. */ > + virtio_gpu_virgl_add_capset(g, VIRTIO_GPU_CAPSET_VIRGL); > + > virgl_renderer_get_cap_set(VIRTIO_GPU_CAPSET_VIRGL2, > - &capset2_max_ver, > - &capset2_max_size); > + &capset2_max_ver, > + &capset2_max_size); > + if (capset2_max_ver) { > + virtio_gpu_virgl_add_capset(g, VIRTIO_GPU_CAPSET_VIRGL2); > + } > > - return capset2_max_ver ? 2 : 1; > + return g->num_capsets; > } > diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h > index d2a0d542fbb3..3d7d001a85c5 100644 > --- a/include/hw/virtio/virtio-gpu.h > +++ b/include/hw/virtio/virtio-gpu.h > @@ -218,6 +218,9 @@ struct VirtIOGPU { > QTAILQ_HEAD(, VGPUDMABuf) bufs; > VGPUDMABuf *primary[VIRTIO_GPU_MAX_SCANOUTS]; > } dmabuf; > + > + uint32_t *capset_ids; > + uint32_t num_capsets; Use GArray.
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index eee3816b987f..c0e1ca3ff339 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -558,19 +558,12 @@ static void virgl_cmd_get_capset_info(VirtIOGPU *g, VIRTIO_GPU_FILL_CMD(info); memset(&resp, 0, sizeof(resp)); - if (info.capset_index == 0) { - resp.capset_id = VIRTIO_GPU_CAPSET_VIRGL; - virgl_renderer_get_cap_set(resp.capset_id, - &resp.capset_max_version, - &resp.capset_max_size); - } else if (info.capset_index == 1) { - resp.capset_id = VIRTIO_GPU_CAPSET_VIRGL2; + + if (info.capset_index < g->num_capsets) { + resp.capset_id = g->capset_ids[info.capset_index]; virgl_renderer_get_cap_set(resp.capset_id, &resp.capset_max_version, &resp.capset_max_size); - } else { - resp.capset_max_version = 0; - resp.capset_max_size = 0; } resp.hdr.type = VIRTIO_GPU_RESP_OK_CAPSET_INFO; virtio_gpu_ctrl_response(g, cmd, &resp.hdr, sizeof(resp)); @@ -1120,12 +1113,30 @@ int virtio_gpu_virgl_init(VirtIOGPU *g) return 0; } +static void virtio_gpu_virgl_add_capset(VirtIOGPU *g, uint32_t capset_id) +{ + g->capset_ids = g_realloc_n(g->capset_ids, g->num_capsets + 1, + sizeof(*g->capset_ids)); + g->capset_ids[g->num_capsets++] = capset_id; +} + int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g) { uint32_t capset2_max_ver, capset2_max_size; + + if (g->num_capsets) { + return g->num_capsets; + } + + /* VIRGL is always supported. */ + virtio_gpu_virgl_add_capset(g, VIRTIO_GPU_CAPSET_VIRGL); + virgl_renderer_get_cap_set(VIRTIO_GPU_CAPSET_VIRGL2, - &capset2_max_ver, - &capset2_max_size); + &capset2_max_ver, + &capset2_max_size); + if (capset2_max_ver) { + virtio_gpu_virgl_add_capset(g, VIRTIO_GPU_CAPSET_VIRGL2); + } - return capset2_max_ver ? 2 : 1; + return g->num_capsets; } diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index d2a0d542fbb3..3d7d001a85c5 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -218,6 +218,9 @@ struct VirtIOGPU { QTAILQ_HEAD(, VGPUDMABuf) bufs; VGPUDMABuf *primary[VIRTIO_GPU_MAX_SCANOUTS]; } dmabuf; + + uint32_t *capset_ids; + uint32_t num_capsets; }; struct VirtIOGPUClass {