Skip to content

Commit a607bdd

Browse files
committed
private data
1 parent 734d5db commit a607bdd

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
2+
---
3+
title: "Mesa | VK_EXT_PRIVATE_DATA的实现"
4+
date: 2024-09-02T20:54:33+08:00
5+
draft: false
6+
categories: [ "Mesa"]
7+
isCJKLanguage: true
8+
slug: "7cf58aab"
9+
toc: true
10+
mermaid: false
11+
fancybox: false
12+
blueprint: false
13+
# latex support
14+
# katex: true
15+
# markup: mmark
16+
# mmarktoc: false
17+
# UEVersion: 5.3.2
18+
---
19+
20+
21+
这个扩展允许在任意的VK_OBJECT上绑定若干个8字节的数据。
22+
主要用法是:
23+
24+
- 通过vkCreatePrivateDataSlotEXT创建一个slot,这个slot内部结构是不透明的,但是实际上里面就是一个`index`(应用层不可见)
25+
- 这个slot可以被作为索引访问修改一个VK_OBJECT上的PRIVATE_DATA
26+
27+
# 问题1: 为什么Index要做成不透明的
28+
29+
这个Index实际上是存放在vkDevice上的一个成员变量(驱动层), 每次创建一个slot,这个index就会自增1。
30+
这样可以避免不同的Layer申请到同一个Index。
31+
每个Layer和应用每次调用`vkCreatePrivateDataSlotEXT`都会创建一个自增的index的slot。
32+
33+
# 问题2: 数据存放在哪, 数据结构是什么
34+
35+
数据实际存放在所有vulkan object的基类 `vk_object`上,数据结构是sparse array。
36+
通过index可以稀疏的创建和删除数据。
37+
38+
# 问题3:为什么API需要传入ObjectType
39+
40+
既然PrivateData在所有的VK_OBJECT上,理论上是可以在任何的VK_OBJECT上绑定数据,为什么API需要传入ObjectType
41+
42+
```cpp
43+
// Provided by VK_VERSION_1_3
44+
VkResult vkSetPrivateData(
45+
VkDevice device,
46+
VkObjectType objectType, // ???Why
47+
uint64_t objectHandle,
48+
VkPrivateDataSlot privateDataSlot,
49+
uint64_t data);
50+
```
51+
52+
因为Swapchain似乎比较特殊,具体哪里特殊暂时还不理解,至少对swapchain有额外的处理。
53+
54+
```cpp
55+
if (objectType == VK_OBJECT_TYPE_SURFACE_KHR) {
56+
...
57+
mtx_lock(&device->swapchain_private_mtx);
58+
VkResult result = get_swapchain_private_data_locked(device, objectHandle,
59+
slot, private_data);
60+
mtx_unlock(&device->swapchain_private_mtx);
61+
return result;
62+
}
63+
64+
struct vk_object_base *obj =
65+
vk_object_base_from_u64_handle(objectHandle, objectType);
66+
```
67+
68+
# 核心接口
69+
70+
核心的几个内部实现就在这里了。
71+
72+
## VkPrivateDataSlot的数据结构
73+
```c
74+
struct vk_private_data_slot {
75+
struct vk_object_base base;
76+
uint32_t index; // 一个Slot实际上只是一个VkObject + uint32_Index
77+
};
78+
79+
VK_DEFINE_NONDISP_HANDLE_CASTS(vk_private_data_slot, base,
80+
VkPrivateDataSlot,
81+
VK_OBJECT_TYPE_PRIVATE_DATA_SLOT);
82+
```
83+
## Slot的创建
84+
85+
```cpp
86+
VkResult
87+
vk_private_data_slot_create(struct vk_device *device,
88+
const VkPrivateDataSlotCreateInfo* pCreateInfo,
89+
const VkAllocationCallbacks* pAllocator,
90+
VkPrivateDataSlot* pPrivateDataSlot)
91+
{
92+
vk_object_base_init(device, &slot->base,
93+
VK_OBJECT_TYPE_PRIVATE_DATA_SLOT);
94+
// 可以看到index = device->private_data_next_index++
95+
slot->index = p_atomic_inc_return(&device->private_data_next_index);
96+
}
97+
98+
```
99+

0 commit comments

Comments
 (0)