renderer_vulkan: Catch device losses in more places
This commit is contained in:
		| @@ -113,8 +113,19 @@ u64 HostCounter::BlockingQuery() const { | ||||
|     if (ticks >= cache.Scheduler().Ticks()) { | ||||
|         cache.Scheduler().Flush(); | ||||
|     } | ||||
|     return cache.Device().GetLogical().GetQueryResult<u64>( | ||||
|         query.first, query.second, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); | ||||
|     u64 data; | ||||
|     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 | ||||
|   | ||||
| @@ -166,7 +166,15 @@ void VKScheduler::SubmitExecution(VkSemaphore semaphore) { | ||||
|     submit_info.pCommandBuffers = current_cmdbuf.address(); | ||||
|     submit_info.signalSemaphoreCount = semaphore ? 1 : 0; | ||||
|     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() { | ||||
|   | ||||
| @@ -567,12 +567,8 @@ public: | ||||
|     /// Construct a queue handle. | ||||
|     constexpr Queue(VkQueue queue, const DeviceDispatch& dld) noexcept : queue{queue}, dld{&dld} {} | ||||
|  | ||||
|     /// Returns the checkpoint data. | ||||
|     /// @note Returns an empty vector when the function pointer is not present. | ||||
|     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 Submit(Span<VkSubmitInfo> submit_infos, VkFence fence) const noexcept { | ||||
|         return dld->vkQueueSubmit(queue, submit_infos.size(), submit_infos.data(), fence); | ||||
|     } | ||||
|  | ||||
|     VkResult Present(const VkPresentInfoKHR& present_info) const noexcept { | ||||
| @@ -734,18 +730,11 @@ public: | ||||
|         dld->vkResetQueryPoolEXT(handle, query_pool, first, count); | ||||
|     } | ||||
|  | ||||
|     void GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size, | ||||
|                          void* data, VkDeviceSize stride, VkQueryResultFlags flags) const { | ||||
|         Check(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; | ||||
|     VkResult GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size, | ||||
|                              void* data, VkDeviceSize stride, VkQueryResultFlags flags) const | ||||
|         noexcept { | ||||
|         return dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride, | ||||
|                                           flags); | ||||
|     } | ||||
| }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp