Mesa (main): venus: prepare and feed renderer protocol info into cs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Apr 9 00:24:58 UTC 2022
Module: Mesa
Branch: main
Commit: a263da69eccfdea8f9c4909e4bf8032b16943cab
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a263da69eccfdea8f9c4909e4bf8032b16943cab
Author: Yiwei Zhang <zzyiwei at chromium.org>
Date: Tue Mar 22 20:39:06 2022 +0000
venus: prepare and feed renderer protocol info into cs
Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15495>
---
src/virtio/vulkan/vn_common.h | 1 +
src/virtio/vulkan/vn_cs.c | 40 ++++++++++++++++++++++++++++++++++++++++
src/virtio/vulkan/vn_cs.h | 23 +++++++++++++++++++----
src/virtio/vulkan/vn_instance.c | 2 ++
4 files changed, 62 insertions(+), 4 deletions(-)
diff --git a/src/virtio/vulkan/vn_common.h b/src/virtio/vulkan/vn_common.h
index fbe4bced465..a12ecf64692 100644
--- a/src/virtio/vulkan/vn_common.h
+++ b/src/virtio/vulkan/vn_common.h
@@ -24,6 +24,7 @@
#include "c11/threads.h"
#include "util/bitscan.h"
+#include "util/bitset.h"
#include "util/compiler.h"
#include "util/list.h"
#include "util/macros.h"
diff --git a/src/virtio/vulkan/vn_cs.c b/src/virtio/vulkan/vn_cs.c
index d56bfe22c49..8c242d4cc95 100644
--- a/src/virtio/vulkan/vn_cs.c
+++ b/src/virtio/vulkan/vn_cs.c
@@ -8,6 +8,46 @@
#include "vn_instance.h"
#include "vn_renderer.h"
+struct vn_cs_renderer_protocol_info _vn_cs_renderer_protocol_info = {
+ .mutex = _SIMPLE_MTX_INITIALIZER_NP,
+};
+
+static void
+vn_cs_renderer_protocol_info_init_once(struct vn_instance *instance)
+{
+ const struct vn_renderer_info *renderer_info = &instance->renderer->info;
+ /* assume renderer protocol supports all extensions if bit 0 is not set */
+ const bool support_all_exts =
+ !vn_info_extension_mask_test(renderer_info->vk_extension_mask, 0);
+
+ _vn_cs_renderer_protocol_info.api_version = renderer_info->vk_xml_version;
+
+ STATIC_ASSERT(sizeof(renderer_info->vk_extension_mask) >=
+ sizeof(_vn_cs_renderer_protocol_info.extension_bitset));
+
+ for (uint32_t i = 1; i <= VN_INFO_EXTENSION_MAX_NUMBER; i++) {
+ /* use protocl helper to ensure mask decoding matches encoding */
+ if (support_all_exts ||
+ vn_info_extension_mask_test(renderer_info->vk_extension_mask, i))
+ BITSET_SET(_vn_cs_renderer_protocol_info.extension_bitset, i);
+ }
+}
+
+void
+vn_cs_renderer_protocol_info_init(struct vn_instance *instance)
+{
+ simple_mtx_lock(&_vn_cs_renderer_protocol_info.mutex);
+ if (_vn_cs_renderer_protocol_info.init_once) {
+ simple_mtx_unlock(&_vn_cs_renderer_protocol_info.mutex);
+ return;
+ }
+
+ vn_cs_renderer_protocol_info_init_once(instance);
+
+ _vn_cs_renderer_protocol_info.init_once = true;
+ simple_mtx_unlock(&_vn_cs_renderer_protocol_info.mutex);
+}
+
static void
vn_cs_encoder_sanity_check(struct vn_cs_encoder *enc)
{
diff --git a/src/virtio/vulkan/vn_cs.h b/src/virtio/vulkan/vn_cs.h
index 70d75e40b6c..a467a6dbf84 100644
--- a/src/virtio/vulkan/vn_cs.h
+++ b/src/virtio/vulkan/vn_cs.h
@@ -8,6 +8,8 @@
#include "vn_common.h"
+#include "venus-protocol/vn_protocol_driver_info.h"
+
#define VN_CS_ENCODER_BUFFER_INITIALIZER(storage) \
(struct vn_cs_encoder_buffer) { .base = storage, }
@@ -81,18 +83,31 @@ struct vn_cs_decoder {
const void *end;
};
+struct vn_cs_renderer_protocol_info {
+ simple_mtx_t mutex;
+ bool init_once;
+ uint32_t api_version;
+ BITSET_DECLARE(extension_bitset, VN_INFO_EXTENSION_MAX_NUMBER + 1);
+};
+
+extern struct vn_cs_renderer_protocol_info _vn_cs_renderer_protocol_info;
+
static inline bool
-vn_cs_renderer_protocol_has_api_version(UNUSED uint32_t api_version)
+vn_cs_renderer_protocol_has_api_version(uint32_t api_version)
{
- return true;
+ return _vn_cs_renderer_protocol_info.api_version >= api_version;
}
static inline bool
-vn_cs_renderer_protocol_has_extension(UNUSED uint32_t ext_number)
+vn_cs_renderer_protocol_has_extension(uint32_t ext_number)
{
- return true;
+ return BITSET_TEST(_vn_cs_renderer_protocol_info.extension_bitset,
+ ext_number);
}
+void
+vn_cs_renderer_protocol_info_init(struct vn_instance *instance);
+
void
vn_cs_encoder_init(struct vn_cs_encoder *enc,
struct vn_instance *instance,
diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c
index 42f7831f6aa..844df289080 100644
--- a/src/virtio/vulkan/vn_instance.c
+++ b/src/virtio/vulkan/vn_instance.c
@@ -731,6 +731,8 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
if (result != VK_SUCCESS)
goto fail;
+ vn_cs_renderer_protocol_info_init(instance);
+
vn_renderer_shmem_pool_init(instance->renderer,
&instance->reply_shmem_pool, 1u << 20);
More information about the mesa-commit
mailing list