From 2223f13b264b59e7a76c46b06bbd211882e817f8 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Fri, 18 Mar 2022 07:08:10 +0000 Subject: [PATCH] venus: store extension mask in renderer info Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/virtio-gpu/venus_hw.h | 10 ++++++++++ src/virtio/vulkan/vn_renderer.h | 2 ++ src/virtio/vulkan/vn_renderer_virtgpu.c | 6 ++++++ src/virtio/vulkan/vn_renderer_vtest.c | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/src/virtio/virtio-gpu/venus_hw.h b/src/virtio/virtio-gpu/venus_hw.h index 4597a2055f6..3b08cdf9d5d 100644 --- a/src/virtio/virtio-gpu/venus_hw.h +++ b/src/virtio/virtio-gpu/venus_hw.h @@ -35,6 +35,16 @@ struct virgl_renderer_capset_venus { /* TODO revisit this when we bump up wire_format_version to 1 */ uint32_t supports_blob_id_0; + + /* Extension number N, where N is defined by the Vulkan spec, corresponds + * to bit [N / 32] & (1 << N % 32). The below mask1 covers the first 1023 + * Vulkan extensions (numbered from 1 to 1023). + * + * Bit (mask1[0] & 0x1) is used for backward compatibility purpose. When + * that bit is set, the extension mask(s) are valid. Otherwise, all the + * extensions are assumed to be supported by the renderer side protocol. + */ + uint32_t vk_extension_mask1[32]; }; #endif diff --git a/src/virtio/vulkan/vn_renderer.h b/src/virtio/vulkan/vn_renderer.h index 5bf4d1217a8..97325e008ae 100644 --- a/src/virtio/vulkan/vn_renderer.h +++ b/src/virtio/vulkan/vn_renderer.h @@ -66,6 +66,8 @@ struct vn_renderer_info { uint32_t vk_ext_command_serialization_spec_version; uint32_t vk_mesa_venus_protocol_spec_version; uint32_t supports_blob_id_0; + /* combined mask for vk_extension_mask1, 2,..., N */ + uint32_t vk_extension_mask[32]; }; struct vn_renderer_submit_batch { diff --git a/src/virtio/vulkan/vn_renderer_virtgpu.c b/src/virtio/vulkan/vn_renderer_virtgpu.c index 25ccec4b8af..edbbc6d3487 100644 --- a/src/virtio/vulkan/vn_renderer_virtgpu.c +++ b/src/virtio/vulkan/vn_renderer_virtgpu.c @@ -1409,6 +1409,12 @@ virtgpu_init_renderer_info(struct virtgpu *gpu) capset->vk_mesa_venus_protocol_spec_version; info->supports_blob_id_0 = capset->supports_blob_id_0; + /* ensure vk_extension_mask is large enough to hold all capset masks */ + STATIC_ASSERT(sizeof(info->vk_extension_mask) >= + sizeof(capset->vk_extension_mask1)); + memcpy(info->vk_extension_mask, capset->vk_extension_mask1, + sizeof(capset->vk_extension_mask1)); + if (gpu->bo_blob_mem == VIRTGPU_BLOB_MEM_GUEST_VRAM) info->has_guest_vram = true; } diff --git a/src/virtio/vulkan/vn_renderer_vtest.c b/src/virtio/vulkan/vn_renderer_vtest.c index c51d784c57a..026b00b662f 100644 --- a/src/virtio/vulkan/vn_renderer_vtest.c +++ b/src/virtio/vulkan/vn_renderer_vtest.c @@ -945,6 +945,12 @@ vtest_init_renderer_info(struct vtest *vtest) info->vk_mesa_venus_protocol_spec_version = capset->vk_mesa_venus_protocol_spec_version; info->supports_blob_id_0 = capset->supports_blob_id_0; + + /* ensure vk_extension_mask is large enough to hold all capset masks */ + STATIC_ASSERT(sizeof(info->vk_extension_mask) >= + sizeof(capset->vk_extension_mask1)); + memcpy(info->vk_extension_mask, capset->vk_extension_mask1, + sizeof(capset->vk_extension_mask1)); } static void