summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-03-30 05:14:35 -0300
committerGravatar ReinUsesLisp2020-04-13 17:33:59 -0300
commit16105c6a6689886b9fb7a1220c1882a1de5a5191 (patch)
tree8529fcbea997f1511f789537cc76f0e916308ed4 /src
parentMerge pull request #3636 from ReinUsesLisp/drop-vk-hpp (diff)
downloadyuzu-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.cpp15
-rw-r--r--src/video_core/renderer_vulkan/vk_scheduler.cpp10
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h25
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
172void VKScheduler::AllocateNewContext() { 180void 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