Skip to content

Commit b04701c

Browse files
committed
Change Vulkan immediate command list flush on queue submit to modify wait semaphores
1 parent 2bc7093 commit b04701c

File tree

4 files changed

+35
-39
lines changed

4 files changed

+35
-39
lines changed

source/dll_main_test_app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow
791791
{
792792
VkSubmitInfo submit_info { VK_STRUCTURE_TYPE_SUBMIT_INFO };
793793
submit_info.waitSemaphoreCount = 1;
794-
VkPipelineStageFlags wait_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;
795-
submit_info.pWaitDstStageMask = &wait_mask;
794+
VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TRANSFER_BIT;
795+
submit_info.pWaitDstStageMask = &wait_stage;
796796
submit_info.pWaitSemaphores = &sem_acquire;
797797
submit_info.commandBufferCount = 1;
798798
submit_info.pCommandBuffers = &cmd_list[swapchain_image_index];

source/vulkan/vulkan_hooks_device.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,28 +1253,27 @@ VkResult VKAPI_CALL vkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextI
12531253

12541254
VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence)
12551255
{
1256+
assert(pSubmits != nullptr || submitCount == 0);
1257+
12561258
reshade::vulkan::device_impl *const device_impl = g_vulkan_devices.at(dispatch_key_from_handle(queue));
12571259

12581260
#if RESHADE_ADDON
1259-
if (submitCount != 0)
1260-
{
1261-
assert(pSubmits != nullptr);
1261+
reshade::vulkan::command_queue_impl *const queue_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_QUEUE>(queue);
12621262

1263-
reshade::vulkan::command_queue_impl *const queue_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_QUEUE>(queue);
1263+
for (uint32_t i = 0; i < submitCount; ++i)
1264+
{
1265+
const VkSubmitInfo &submit_info = pSubmits[i];
12641266

1265-
for (uint32_t i = 0; i < submitCount; ++i)
1267+
for (uint32_t k = 0; k < submit_info.commandBufferCount; ++k)
12661268
{
1267-
for (uint32_t k = 0; k < pSubmits[i].commandBufferCount; ++k)
1268-
{
1269-
assert(pSubmits[i].pCommandBuffers[k] != VK_NULL_HANDLE);
1269+
assert(submit_info.pCommandBuffers[k] != VK_NULL_HANDLE);
12701270

1271-
reshade::vulkan::command_list_impl *const cmd_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_COMMAND_BUFFER>(pSubmits[i].pCommandBuffers[k]);
1271+
reshade::vulkan::command_list_impl *const cmd_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_COMMAND_BUFFER>(submit_info.pCommandBuffers[k]);
12721272

1273-
reshade::invoke_addon_event<reshade::addon_event::execute_command_list>(queue_impl, cmd_impl);
1274-
}
1273+
reshade::invoke_addon_event<reshade::addon_event::execute_command_list>(queue_impl, cmd_impl);
12751274
}
12761275

1277-
queue_impl->flush_immediate_command_list();
1276+
queue_impl->flush_immediate_command_list(const_cast<VkSubmitInfo &>(submit_info));
12781277
}
12791278
#endif
12801279

@@ -1283,25 +1282,24 @@ VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkS
12831282
}
12841283
VkResult VKAPI_CALL vkQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 *pSubmits, VkFence fence)
12851284
{
1285+
assert(pSubmits != nullptr || submitCount == 0);
1286+
12861287
reshade::vulkan::device_impl *const device_impl = g_vulkan_devices.at(dispatch_key_from_handle(queue));
12871288

12881289
#if RESHADE_ADDON
1289-
if (submitCount != 0)
1290-
{
1291-
assert(pSubmits != nullptr);
1290+
reshade::vulkan::command_queue_impl *const queue_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_QUEUE>(queue);
12921291

1293-
reshade::vulkan::command_queue_impl *const queue_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_QUEUE>(queue);
1292+
for (uint32_t i = 0; i < submitCount; ++i)
1293+
{
1294+
const VkSubmitInfo2 &submit_info = pSubmits[i];
12941295

1295-
for (uint32_t i = 0; i < submitCount; ++i)
1296+
for (uint32_t k = 0; k < submit_info.commandBufferInfoCount; ++k)
12961297
{
1297-
for (uint32_t k = 0; k < pSubmits[i].commandBufferInfoCount; ++k)
1298-
{
1299-
assert(pSubmits[i].pCommandBufferInfos[k].commandBuffer != VK_NULL_HANDLE);
1298+
assert(submit_info.pCommandBufferInfos[k].commandBuffer != VK_NULL_HANDLE);
13001299

1301-
reshade::vulkan::command_list_impl *const cmd_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_COMMAND_BUFFER>(pSubmits[i].pCommandBufferInfos[k].commandBuffer);
1300+
reshade::vulkan::command_list_impl *const cmd_impl = device_impl->get_private_data_for_object<VK_OBJECT_TYPE_COMMAND_BUFFER>(submit_info.pCommandBufferInfos[k].commandBuffer);
13021301

1303-
reshade::invoke_addon_event<reshade::addon_event::execute_command_list>(queue_impl, cmd_impl);
1304-
}
1302+
reshade::invoke_addon_event<reshade::addon_event::execute_command_list>(queue_impl, cmd_impl);
13051303
}
13061304

13071305
queue_impl->flush_immediate_command_list();

source/vulkan/vulkan_impl_command_list_immediate.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ reshade::vulkan::command_list_immediate_impl::~command_list_immediate_impl()
9191
_orig = VK_NULL_HANDLE;
9292
}
9393

94-
bool reshade::vulkan::command_list_immediate_impl::flush(VkSubmitInfo &submit_info)
94+
bool reshade::vulkan::command_list_immediate_impl::flush(VkSubmitInfo &semaphore_info)
9595
{
9696
s_last_immediate_command_list = this;
9797

@@ -114,11 +114,15 @@ bool reshade::vulkan::command_list_immediate_impl::flush(VkSubmitInfo &submit_in
114114
return false;
115115
}
116116

117-
assert(submit_info.sType == VK_STRUCTURE_TYPE_SUBMIT_INFO && submit_info.commandBufferCount == 0);
117+
VkSubmitInfo submit_info { VK_STRUCTURE_TYPE_SUBMIT_INFO };
118+
submit_info.waitSemaphoreCount = semaphore_info.waitSemaphoreCount;
119+
submit_info.pWaitSemaphores = semaphore_info.pWaitSemaphores;
120+
submit_info.pWaitDstStageMask = semaphore_info.pWaitDstStageMask;
118121
submit_info.commandBufferCount = 1;
119122
submit_info.pCommandBuffers = &_orig;
120123

121-
if (submit_info.waitSemaphoreCount != 0 && submit_info.signalSemaphoreCount == 0)
124+
if (semaphore_info.waitSemaphoreCount != 0 ||
125+
semaphore_info.signalSemaphoreCount != 0)
122126
{
123127
submit_info.signalSemaphoreCount = 1;
124128
submit_info.pSignalSemaphores = &_cmd_semaphores[_cmd_index];
@@ -138,13 +142,10 @@ bool reshade::vulkan::command_list_immediate_impl::flush(VkSubmitInfo &submit_in
138142

139143
// This queue submit now waits on the requested wait semaphores
140144
// The next queue submit should therefore wait on the semaphore that was signaled by this submit
141-
submit_info.waitSemaphoreCount = submit_info.signalSemaphoreCount;
142-
submit_info.pWaitSemaphores = submit_info.pSignalSemaphores;
143-
submit_info.pWaitDstStageMask = nullptr;
144-
submit_info.commandBufferCount = 0;
145-
submit_info.pCommandBuffers = nullptr;
146-
submit_info.signalSemaphoreCount = 0;
147-
submit_info.pSignalSemaphores = nullptr;
145+
semaphore_info.waitSemaphoreCount = submit_info.signalSemaphoreCount;
146+
semaphore_info.pWaitSemaphores = submit_info.pSignalSemaphores;
147+
static const VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
148+
semaphore_info.pWaitDstStageMask = &wait_stage;
148149

149150
// Continue with next command buffer now that the current one was submitted
150151
_cmd_index = (_cmd_index + 1) % NUM_COMMAND_FRAMES;

source/vulkan/vulkan_impl_command_queue.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,14 @@ bool reshade::vulkan::command_queue_impl::wait(api::fence fence, uint64_t value)
127127
{
128128
const VkSemaphore wait_semaphore = (VkSemaphore)fence.handle;
129129

130-
const VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
131-
132130
VkTimelineSemaphoreSubmitInfo wait_semaphore_info { VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO };
133131
wait_semaphore_info.waitSemaphoreValueCount = 1;
134132
wait_semaphore_info.pWaitSemaphoreValues = &value;
135133

136134
VkSubmitInfo submit_info { VK_STRUCTURE_TYPE_SUBMIT_INFO, &wait_semaphore_info };
137135
submit_info.waitSemaphoreCount = 1;
138136
submit_info.pWaitSemaphores = &wait_semaphore;
137+
static const VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
139138
submit_info.pWaitDstStageMask = &wait_stage;
140139

141140
return vk.QueueSubmit(_orig, 1, &submit_info, VK_NULL_HANDLE) == VK_SUCCESS;
@@ -153,8 +152,6 @@ bool reshade::vulkan::command_queue_impl::signal(api::fence fence, uint64_t valu
153152
submit_info.pSignalSemaphores = &signal_semaphore;
154153

155154
flush_immediate_command_list(submit_info);
156-
if (submit_info.signalSemaphoreCount == 0)
157-
return true; // Already submitted by the flush
158155

159156
return vk.QueueSubmit(_orig, 1, &submit_info, VK_NULL_HANDLE) == VK_SUCCESS;
160157
}

0 commit comments

Comments
 (0)