renderer_vulkan: Catch device losses in more places

This commit is contained in:
ReinUsesLisp 2020-03-30 05:14:35 -03:00
parent 7e4a132a77
commit 16105c6a66
3 changed files with 29 additions and 21 deletions

View file

@ -113,8 +113,19 @@ u64 HostCounter::BlockingQuery() const {
if (ticks >= cache.Scheduler().Ticks()) { if (ticks >= cache.Scheduler().Ticks()) {
cache.Scheduler().Flush(); cache.Scheduler().Flush();
} }
return cache.Device().GetLogical().GetQueryResult<u64>( u64 data;
query.first, query.second, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); const VkResult result = cache.Device().GetLogical().GetQueryResults(
query.first, query.second, 1, sizeof(data), &data, sizeof(data),
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
switch (result) {
case VK_SUCCESS:
return data;
case VK_ERROR_DEVICE_LOST:
cache.Device().ReportLoss();
[[fallthrough]];
default:
throw vk::Exception(result);
}
} }
} // namespace Vulkan } // namespace Vulkan

View file

@ -166,7 +166,15 @@ void VKScheduler::SubmitExecution(VkSemaphore semaphore) {
submit_info.pCommandBuffers = current_cmdbuf.address(); submit_info.pCommandBuffers = current_cmdbuf.address();
submit_info.signalSemaphoreCount = semaphore ? 1 : 0; submit_info.signalSemaphoreCount = semaphore ? 1 : 0;
submit_info.pSignalSemaphores = &semaphore; submit_info.pSignalSemaphores = &semaphore;
device.GetGraphicsQueue().Submit(submit_info, *current_fence); switch (const VkResult result = device.GetGraphicsQueue().Submit(submit_info, *current_fence)) {
case VK_SUCCESS:
break;
case VK_ERROR_DEVICE_LOST:
device.ReportLoss();
[[fallthrough]];
default:
vk::Check(result);
}
} }
void VKScheduler::AllocateNewContext() { void VKScheduler::AllocateNewContext() {

View file

@ -567,12 +567,8 @@ public:
/// Construct a queue handle. /// Construct a queue handle.
constexpr Queue(VkQueue queue, const DeviceDispatch& dld) noexcept : queue{queue}, dld{&dld} {} constexpr Queue(VkQueue queue, const DeviceDispatch& dld) noexcept : queue{queue}, dld{&dld} {}
/// Returns the checkpoint data. VkResult Submit(Span<VkSubmitInfo> submit_infos, VkFence fence) const noexcept {
/// @note Returns an empty vector when the function pointer is not present. return dld->vkQueueSubmit(queue, submit_infos.size(), submit_infos.data(), fence);
std::vector<VkCheckpointDataNV> GetCheckpointDataNV(const DeviceDispatch& dld) const;
void Submit(Span<VkSubmitInfo> submit_infos, VkFence fence) const {
Check(dld->vkQueueSubmit(queue, submit_infos.size(), submit_infos.data(), fence));
} }
VkResult Present(const VkPresentInfoKHR& present_info) const noexcept { VkResult Present(const VkPresentInfoKHR& present_info) const noexcept {
@ -734,18 +730,11 @@ public:
dld->vkResetQueryPoolEXT(handle, query_pool, first, count); dld->vkResetQueryPoolEXT(handle, query_pool, first, count);
} }
void GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size, VkResult GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size,
void* data, VkDeviceSize stride, VkQueryResultFlags flags) const { void* data, VkDeviceSize stride, VkQueryResultFlags flags) const
Check(dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride, noexcept {
flags)); return dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride,
} flags);
template <typename T>
T GetQueryResult(VkQueryPool query_pool, u32 first, VkQueryResultFlags flags) const {
static_assert(std::is_trivially_copyable_v<T>);
T value;
GetQueryResults(query_pool, first, 1, sizeof(T), &value, sizeof(T), flags);
return value;
} }
}; };