Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
尘离序散
obs-studio
提交
088a7212
O
obs-studio
项目概览
尘离序散
/
obs-studio
与 Fork 源项目一致
从无法访问的项目Fork
通知
30
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
obs-studio
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
088a7212
编写于
6月 21, 2020
作者:
J
Jim
提交者:
GitHub
6月 21, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3061 from jpark37/vulkan-best-practices
win-capture: Reset command pool rather than buffer
上级
b1d03ae3
cdd912b1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
92 addition
and
78 deletion
+92
-78
plugins/win-capture/graphics-hook/vulkan-capture.c
plugins/win-capture/graphics-hook/vulkan-capture.c
+91
-78
plugins/win-capture/graphics-hook/vulkan-capture.h
plugins/win-capture/graphics-hook/vulkan-capture.h
+1
-0
未找到文件。
plugins/win-capture/graphics-hook/vulkan-capture.c
浏览文件 @
088a7212
...
...
@@ -63,11 +63,15 @@ struct vk_queue_data {
uint32_t
fam_idx
;
};
struct
vk_
cmd_pool
_data
{
struct
vk_
frame
_data
{
VkCommandPool
cmd_pool
;
VkCommandBuffer
cmd_buffers
[
OBJ_MAX
];
VkFence
fences
[
OBJ_MAX
];
bool
cmd_buffer_busy
[
OBJ_MAX
];
VkCommandBuffer
cmd_buffer
;
VkFence
fence
;
bool
cmd_buffer_busy
;
};
struct
vk_family_data
{
struct
vk_frame_data
frames
[
OBJ_MAX
];
uint32_t
image_count
;
};
...
...
@@ -84,7 +88,7 @@ struct vk_data {
struct
vk_queue_data
queues
[
OBJ_MAX
];
uint32_t
queue_count
;
struct
vk_
cmd_pool_data
cmd_pool
s
[
OBJ_MAX
];
struct
vk_
family_data
familie
s
[
OBJ_MAX
];
VkExternalMemoryProperties
external_mem_props
;
struct
vk_inst_data
*
inst_data
;
...
...
@@ -173,36 +177,37 @@ static inline struct vk_data *get_device_data(void *dev)
return
&
device_data
[
idx
];
}
static
void
vk_shtex_clear_fence
(
struct
vk_data
*
data
,
struct
vk_cmd_pool_data
*
pool_data
,
uint32_t
image_idx
)
static
void
vk_shtex_clear_fence
(
const
struct
vk_data
*
data
,
struct
vk_frame_data
*
frame_data
)
{
VkFence
fence
=
pool_data
->
fences
[
image_idx
]
;
if
(
pool_data
->
cmd_buffer_busy
[
image_idx
]
)
{
const
VkFence
fence
=
frame_data
->
fence
;
if
(
frame_data
->
cmd_buffer_busy
)
{
VkDevice
device
=
data
->
device
;
struct
vk_device_funcs
*
funcs
=
&
data
->
funcs
;
const
struct
vk_device_funcs
*
funcs
=
&
data
->
funcs
;
funcs
->
WaitForFences
(
device
,
1
,
&
fence
,
VK_TRUE
,
~
0ull
);
funcs
->
ResetFences
(
device
,
1
,
&
fence
);
pool_data
->
cmd_buffer_busy
[
image_idx
]
=
false
;
frame_data
->
cmd_buffer_busy
=
false
;
}
}
static
void
vk_shtex_wait_until_pool_idle
(
struct
vk_data
*
data
,
struct
vk_
cmd_pool_data
*
pool
_data
)
struct
vk_
family_data
*
family
_data
)
{
for
(
uint32_t
image_idx
=
0
;
image_idx
<
pool
_data
->
image_count
;
for
(
uint32_t
image_idx
=
0
;
image_idx
<
family
_data
->
image_count
;
image_idx
++
)
{
vk_shtex_clear_fence
(
data
,
pool_data
,
image_idx
);
struct
vk_frame_data
*
frame_data
=
&
family_data
->
frames
[
image_idx
];
if
(
frame_data
->
cmd_pool
!=
VK_NULL_HANDLE
)
vk_shtex_clear_fence
(
data
,
frame_data
);
}
}
static
void
vk_shtex_wait_until_idle
(
struct
vk_data
*
data
)
{
for
(
uint32_t
fam_idx
=
0
;
fam_idx
<
_countof
(
data
->
cmd_pool
s
);
for
(
uint32_t
fam_idx
=
0
;
fam_idx
<
_countof
(
data
->
familie
s
);
fam_idx
++
)
{
struct
vk_cmd_pool_data
*
pool_data
=
&
data
->
cmd_pools
[
fam_idx
];
if
(
pool_data
->
cmd_pool
!=
VK_NULL_HANDLE
)
vk_shtex_wait_until_pool_idle
(
data
,
pool_data
);
struct
vk_family_data
*
family_data
=
&
data
->
families
[
fam_idx
];
vk_shtex_wait_until_pool_idle
(
data
,
family_data
);
}
}
...
...
@@ -719,50 +724,49 @@ static bool vk_shtex_init(struct vk_data *data, HWND window,
return
false
;
}
static
void
vk_shtex_create_
cmd_pool
_objects
(
struct
vk_data
*
data
,
uint32_t
fam_idx
,
uint32_t
image_count
)
static
void
vk_shtex_create_
family
_objects
(
struct
vk_data
*
data
,
uint32_t
fam_idx
,
uint32_t
image_count
)
{
struct
vk_cmd_pool_data
*
pool_data
=
&
data
->
cmd_pools
[
fam_idx
];
VkCommandPoolCreateInfo
cpci
;
cpci
.
sType
=
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
;
cpci
.
pNext
=
NULL
;
cpci
.
flags
=
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
;
cpci
.
queueFamilyIndex
=
fam_idx
;
VkResult
res
=
data
->
funcs
.
CreateCommandPool
(
data
->
device
,
&
cpci
,
data
->
ac
,
&
pool_data
->
cmd_pool
);
debug_res
(
"CreateCommandPool"
,
res
);
VkCommandBufferAllocateInfo
cbai
;
cbai
.
sType
=
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
;
cbai
.
pNext
=
NULL
;
cbai
.
commandPool
=
pool_data
->
cmd_pool
;
cbai
.
level
=
VK_COMMAND_BUFFER_LEVEL_PRIMARY
;
cbai
.
commandBufferCount
=
image_count
;
res
=
data
->
funcs
.
AllocateCommandBuffers
(
data
->
device
,
&
cbai
,
pool_data
->
cmd_buffers
);
debug_res
(
"AllocateCommandBuffers"
,
res
);
struct
vk_family_data
*
family_data
=
&
data
->
families
[
fam_idx
];
for
(
uint32_t
image_index
=
0
;
image_index
<
image_count
;
image_index
++
)
{
/* Dispatch table something or other. Well-designed API. */
VkCommandBuffer
cmd_buffer
=
pool_data
->
cmd_buffers
[
image_index
];
*
(
void
**
)
cmd_buffer
=
*
(
void
**
)(
data
->
device
);
struct
vk_frame_data
*
frame_data
=
&
family_data
->
frames
[
image_index
];
VkCommandPoolCreateInfo
cpci
;
cpci
.
sType
=
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
;
cpci
.
pNext
=
NULL
;
cpci
.
flags
=
0
;
cpci
.
queueFamilyIndex
=
fam_idx
;
VkResult
res
=
data
->
funcs
.
CreateCommandPool
(
data
->
device
,
&
cpci
,
data
->
ac
,
&
frame_data
->
cmd_pool
);
debug_res
(
"CreateCommandPool"
,
res
);
VkCommandBufferAllocateInfo
cbai
;
cbai
.
sType
=
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
;
cbai
.
pNext
=
NULL
;
cbai
.
commandPool
=
frame_data
->
cmd_pool
;
cbai
.
level
=
VK_COMMAND_BUFFER_LEVEL_PRIMARY
;
cbai
.
commandBufferCount
=
1
;
res
=
data
->
funcs
.
AllocateCommandBuffers
(
data
->
device
,
&
cbai
,
&
frame_data
->
cmd_buffer
);
debug_res
(
"AllocateCommandBuffers"
,
res
);
*
(
void
**
)
frame_data
->
cmd_buffer
=
*
(
void
**
)(
data
->
device
);
VkFence
*
fence
=
&
pool_data
->
fences
[
image_index
];
VkFenceCreateInfo
fci
=
{
0
};
fci
.
sType
=
VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
;
fci
.
pNext
=
NULL
;
fci
.
flags
=
0
;
res
=
data
->
funcs
.
CreateFence
(
data
->
device
,
&
fci
,
data
->
ac
,
fence
);
&
frame_data
->
fence
);
debug_res
(
"CreateFence"
,
res
);
}
pool
_data
->
image_count
=
image_count
;
family
_data
->
image_count
=
image_count
;
}
static
void
vk_shtex_destroy_fence
(
struct
vk_data
*
data
,
bool
*
cmd_buffer_busy
,
...
...
@@ -779,21 +783,23 @@ static void vk_shtex_destroy_fence(struct vk_data *data, bool *cmd_buffer_busy,
*
fence
=
VK_NULL_HANDLE
;
}
static
void
vk_shtex_destroy_cmd_pool_objects
(
struct
vk_data
*
data
,
struct
vk_cmd_pool_data
*
pool_data
)
static
void
vk_shtex_destroy_family_objects
(
struct
vk_data
*
data
,
struct
vk_family_data
*
family_data
)
{
for
(
uint32_t
image_idx
=
0
;
image_idx
<
pool
_data
->
image_count
;
for
(
uint32_t
image_idx
=
0
;
image_idx
<
family
_data
->
image_count
;
image_idx
++
)
{
bool
*
cmd_buffer_busy
=
&
pool_data
->
cmd_buffer_busy
[
image_idx
];
VkFence
*
fence
=
&
pool_data
->
fences
[
image_idx
];
struct
vk_frame_data
*
frame_data
=
&
family_data
->
frames
[
image_idx
];
bool
*
cmd_buffer_busy
=
&
frame_data
->
cmd_buffer_busy
;
VkFence
*
fence
=
&
frame_data
->
fence
;
vk_shtex_destroy_fence
(
data
,
cmd_buffer_busy
,
fence
);
data
->
funcs
.
DestroyCommandPool
(
data
->
device
,
frame_data
->
cmd_pool
,
data
->
ac
);
frame_data
->
cmd_pool
=
VK_NULL_HANDLE
;
}
data
->
funcs
.
DestroyCommandPool
(
data
->
device
,
pool_data
->
cmd_pool
,
data
->
ac
);
pool_data
->
cmd_pool
=
VK_NULL_HANDLE
;
pool_data
->
image_count
=
0
;
family_data
->
image_count
=
0
;
}
static
void
vk_shtex_capture
(
struct
vk_data
*
data
,
...
...
@@ -825,21 +831,27 @@ static void vk_shtex_capture(struct vk_data *data,
fam_idx
=
data
->
queues
[
i
].
fam_idx
;
}
if
(
fam_idx
>=
_countof
(
data
->
cmd_pool
s
))
if
(
fam_idx
>=
_countof
(
data
->
familie
s
))
return
;
struct
vk_cmd_pool_data
*
pool_data
=
&
data
->
cmd_pools
[
fam_idx
];
VkCommandPool
*
pool
=
&
pool_data
->
cmd_pool
;
struct
vk_family_data
*
family_data
=
&
data
->
families
[
fam_idx
];
const
uint32_t
image_count
=
swap
->
image_count
;
if
(
pool
_data
->
image_count
<
image_count
)
{
if
(
*
pool
!=
VK_NULL_HANDLE
)
vk_shtex_destroy_
cmd_pool_objects
(
data
,
pool
_data
);
vk_shtex_create_
cmd_pool
_objects
(
data
,
fam_idx
,
image_count
);
if
(
family
_data
->
image_count
<
image_count
)
{
if
(
family_data
->
image_count
>
0
)
vk_shtex_destroy_
family_objects
(
data
,
family
_data
);
vk_shtex_create_
family
_objects
(
data
,
fam_idx
,
image_count
);
}
vk_shtex_clear_fence
(
data
,
pool_data
,
image_index
);
struct
vk_frame_data
*
frame_data
=
&
family_data
->
frames
[
image_index
];
vk_shtex_clear_fence
(
data
,
frame_data
);
res
=
funcs
->
ResetCommandPool
(
data
->
device
,
frame_data
->
cmd_pool
,
0
);
#ifdef MORE_DEBUGGING
debug_res
(
"ResetCommandPool"
,
res
);
#endif
VkCommandBuffer
cmd_buffer
=
pool_data
->
cmd_buffers
[
image_index
]
;
const
VkCommandBuffer
cmd_buffer
=
frame_data
->
cmd_buffer
;
res
=
funcs
->
BeginCommandBuffer
(
cmd_buffer
,
&
begin_info
);
#ifdef MORE_DEBUGGING
...
...
@@ -979,7 +991,7 @@ static void vk_shtex_capture(struct vk_data *data,
submit_info
.
signalSemaphoreCount
=
0
;
submit_info
.
pSignalSemaphores
=
NULL
;
VkFence
fence
=
pool_data
->
fences
[
image_index
]
;
const
VkFence
fence
=
frame_data
->
fence
;
res
=
funcs
->
QueueSubmit
(
queue
,
1
,
&
submit_info
,
fence
);
#ifdef MORE_DEBUGGING
...
...
@@ -987,7 +999,7 @@ static void vk_shtex_capture(struct vk_data *data,
#endif
if
(
res
==
VK_SUCCESS
)
pool_data
->
cmd_buffer_busy
[
image_index
]
=
true
;
frame_data
->
cmd_buffer_busy
=
true
;
}
static
inline
bool
valid_rect
(
struct
vk_swap_data
*
swap
)
...
...
@@ -1299,6 +1311,7 @@ static VkResult VKAPI OBS_CreateDevice(VkPhysicalDevice phy_device,
GETADDR
(
DestroyImage
);
GETADDR
(
GetImageMemoryRequirements
);
GETADDR
(
GetImageMemoryRequirements2
);
GETADDR
(
ResetCommandPool
);
GETADDR
(
BeginCommandBuffer
);
GETADDR
(
EndCommandBuffer
);
GETADDR
(
CmdCopyImage
);
...
...
@@ -1396,13 +1409,13 @@ static void VKAPI OBS_DestroyDevice(VkDevice device,
return
;
if
(
data
->
valid
)
{
for
(
uint32_t
fam_idx
=
0
;
fam_idx
<
_countof
(
data
->
cmd_pool
s
);
for
(
uint32_t
fam_idx
=
0
;
fam_idx
<
_countof
(
data
->
familie
s
);
fam_idx
++
)
{
struct
vk_
cmd_pool_data
*
pool
_data
=
&
data
->
cmd_pool
s
[
fam_idx
];
if
(
pool_data
->
cmd_pool
!=
VK_NULL_HANDLE
)
{
vk_shtex_destroy_
cmd_pool
_objects
(
data
,
pool
_data
);
struct
vk_
family_data
*
family
_data
=
&
data
->
familie
s
[
fam_idx
];
if
(
family_data
->
image_count
>
0
)
{
vk_shtex_destroy_
family
_objects
(
data
,
family
_data
);
}
}
}
...
...
plugins/win-capture/graphics-hook/vulkan-capture.h
浏览文件 @
088a7212
...
...
@@ -27,6 +27,7 @@ struct vk_device_funcs {
DEF_FUNC
(
DestroyImage
);
DEF_FUNC
(
GetImageMemoryRequirements
);
DEF_FUNC
(
GetImageMemoryRequirements2
);
DEF_FUNC
(
ResetCommandPool
);
DEF_FUNC
(
BeginCommandBuffer
);
DEF_FUNC
(
EndCommandBuffer
);
DEF_FUNC
(
CmdCopyImage
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录