diff options
| author | 2020-03-30 05:14:35 -0300 | |
|---|---|---|
| committer | 2020-04-13 17:33:59 -0300 | |
| commit | 16105c6a6689886b9fb7a1220c1882a1de5a5191 (patch) | |
| tree | 8529fcbea997f1511f789537cc76f0e916308ed4 /src | |
| parent | Merge pull request #3636 from ReinUsesLisp/drop-vk-hpp (diff) | |
| download | yuzu-16105c6a6689886b9fb7a1220c1882a1de5a5191.tar.gz yuzu-16105c6a6689886b9fb7a1220c1882a1de5a5191.tar.xz yuzu-16105c6a6689886b9fb7a1220c1882a1de5a5191.zip | |
renderer_vulkan: Catch device losses in more places
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_query_cache.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_scheduler.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 25 |
3 files changed, 29 insertions, 21 deletions
diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 0966c7ff7..813f7c162 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp | |||
| @@ -113,8 +113,19 @@ u64 HostCounter::BlockingQuery() const { | |||
| 113 | if (ticks >= cache.Scheduler().Ticks()) { | 113 | if (ticks >= cache.Scheduler().Ticks()) { |
| 114 | cache.Scheduler().Flush(); | 114 | cache.Scheduler().Flush(); |
| 115 | } | 115 | } |
| 116 | return cache.Device().GetLogical().GetQueryResult<u64>( | 116 | u64 data; |
| 117 | query.first, query.second, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); | 117 | const VkResult result = cache.Device().GetLogical().GetQueryResults( |
| 118 | query.first, query.second, 1, sizeof(data), &data, sizeof(data), | ||
| 119 | VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT); | ||
| 120 | switch (result) { | ||
| 121 | case VK_SUCCESS: | ||
| 122 | return data; | ||
| 123 | case VK_ERROR_DEVICE_LOST: | ||
| 124 | cache.Device().ReportLoss(); | ||
| 125 | [[fallthrough]]; | ||
| 126 | default: | ||
| 127 | throw vk::Exception(result); | ||
| 128 | } | ||
| 118 | } | 129 | } |
| 119 | 130 | ||
| 120 | } // namespace Vulkan | 131 | } // namespace Vulkan |
diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 900f551b3..ae7ba3eb5 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp | |||
| @@ -166,7 +166,15 @@ void VKScheduler::SubmitExecution(VkSemaphore semaphore) { | |||
| 166 | submit_info.pCommandBuffers = current_cmdbuf.address(); | 166 | submit_info.pCommandBuffers = current_cmdbuf.address(); |
| 167 | submit_info.signalSemaphoreCount = semaphore ? 1 : 0; | 167 | submit_info.signalSemaphoreCount = semaphore ? 1 : 0; |
| 168 | submit_info.pSignalSemaphores = &semaphore; | 168 | submit_info.pSignalSemaphores = &semaphore; |
| 169 | device.GetGraphicsQueue().Submit(submit_info, *current_fence); | 169 | switch (const VkResult result = device.GetGraphicsQueue().Submit(submit_info, *current_fence)) { |
| 170 | case VK_SUCCESS: | ||
| 171 | break; | ||
| 172 | case VK_ERROR_DEVICE_LOST: | ||
| 173 | device.ReportLoss(); | ||
| 174 | [[fallthrough]]; | ||
| 175 | default: | ||
| 176 | vk::Check(result); | ||
| 177 | } | ||
| 170 | } | 178 | } |
| 171 | 179 | ||
| 172 | void VKScheduler::AllocateNewContext() { | 180 | void VKScheduler::AllocateNewContext() { |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index fb3657819..e32312a26 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -567,12 +567,8 @@ public: | |||
| 567 | /// Construct a queue handle. | 567 | /// Construct a queue handle. |
| 568 | constexpr Queue(VkQueue queue, const DeviceDispatch& dld) noexcept : queue{queue}, dld{&dld} {} | 568 | constexpr Queue(VkQueue queue, const DeviceDispatch& dld) noexcept : queue{queue}, dld{&dld} {} |
| 569 | 569 | ||
| 570 | /// Returns the checkpoint data. | 570 | VkResult Submit(Span<VkSubmitInfo> submit_infos, VkFence fence) const noexcept { |
| 571 | /// @note Returns an empty vector when the function pointer is not present. | 571 | return dld->vkQueueSubmit(queue, submit_infos.size(), submit_infos.data(), fence); |
| 572 | std::vector<VkCheckpointDataNV> GetCheckpointDataNV(const DeviceDispatch& dld) const; | ||
| 573 | |||
| 574 | void Submit(Span<VkSubmitInfo> submit_infos, VkFence fence) const { | ||
| 575 | Check(dld->vkQueueSubmit(queue, submit_infos.size(), submit_infos.data(), fence)); | ||
| 576 | } | 572 | } |
| 577 | 573 | ||
| 578 | VkResult Present(const VkPresentInfoKHR& present_info) const noexcept { | 574 | VkResult Present(const VkPresentInfoKHR& present_info) const noexcept { |
| @@ -734,18 +730,11 @@ public: | |||
| 734 | dld->vkResetQueryPoolEXT(handle, query_pool, first, count); | 730 | dld->vkResetQueryPoolEXT(handle, query_pool, first, count); |
| 735 | } | 731 | } |
| 736 | 732 | ||
| 737 | void GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size, | 733 | VkResult GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size, |
| 738 | void* data, VkDeviceSize stride, VkQueryResultFlags flags) const { | 734 | void* data, VkDeviceSize stride, VkQueryResultFlags flags) const |
| 739 | Check(dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride, | 735 | noexcept { |
| 740 | flags)); | 736 | return dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride, |
| 741 | } | 737 | flags); |
| 742 | |||
| 743 | template <typename T> | ||
| 744 | T GetQueryResult(VkQueryPool query_pool, u32 first, VkQueryResultFlags flags) const { | ||
| 745 | static_assert(std::is_trivially_copyable_v<T>); | ||
| 746 | T value; | ||
| 747 | GetQueryResults(query_pool, first, 1, sizeof(T), &value, sizeof(T), flags); | ||
| 748 | return value; | ||
| 749 | } | 738 | } |
| 750 | }; | 739 | }; |
| 751 | 740 | ||