diff options
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/common/logging/backend.cpp | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.cpp | 54 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.h | 15 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 1 |
6 files changed, 32 insertions, 59 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 61adbef28..ee6f61f16 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt | |||
| @@ -67,8 +67,10 @@ else() | |||
| 67 | -Werror=implicit-fallthrough | 67 | -Werror=implicit-fallthrough |
| 68 | -Werror=missing-declarations | 68 | -Werror=missing-declarations |
| 69 | -Werror=reorder | 69 | -Werror=reorder |
| 70 | -Werror=switch | ||
| 70 | -Werror=uninitialized | 71 | -Werror=uninitialized |
| 71 | -Werror=unused-result | 72 | -Werror=unused-result |
| 73 | -Werror=unused-variable | ||
| 72 | -Wextra | 74 | -Wextra |
| 73 | -Wmissing-declarations | 75 | -Wmissing-declarations |
| 74 | -Wno-attributes | 76 | -Wno-attributes |
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 631f64d05..2d4d2e9e7 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp | |||
| @@ -145,10 +145,18 @@ void ColorConsoleBackend::Write(const Entry& entry) { | |||
| 145 | PrintColoredMessage(entry); | 145 | PrintColoredMessage(entry); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | // _SH_DENYWR allows read only access to the file for other programs. | 148 | FileBackend::FileBackend(const std::string& filename) : bytes_written(0) { |
| 149 | // It is #defined to 0 on other platforms | 149 | if (Common::FS::Exists(filename + ".old.txt")) { |
| 150 | FileBackend::FileBackend(const std::string& filename) | 150 | Common::FS::Delete(filename + ".old.txt"); |
| 151 | : file(filename, "w", _SH_DENYWR), bytes_written(0) {} | 151 | } |
| 152 | if (Common::FS::Exists(filename)) { | ||
| 153 | Common::FS::Rename(filename, filename + ".old.txt"); | ||
| 154 | } | ||
| 155 | |||
| 156 | // _SH_DENYWR allows read only access to the file for other programs. | ||
| 157 | // It is #defined to 0 on other platforms | ||
| 158 | file = Common::FS::IOFile(filename, "w", _SH_DENYWR); | ||
| 159 | } | ||
| 152 | 160 | ||
| 153 | void FileBackend::Write(const Entry& entry) { | 161 | void FileBackend::Write(const Entry& entry) { |
| 154 | // prevent logs from going over the maximum size (in case its spamming and the user doesn't | 162 | // prevent logs from going over the maximum size (in case its spamming and the user doesn't |
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.cpp b/src/video_core/renderer_vulkan/vk_fence_manager.cpp index 4c5bc0aa1..6cd00884d 100644 --- a/src/video_core/renderer_vulkan/vk_fence_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_fence_manager.cpp | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <memory> | 5 | #include <memory> |
| 6 | #include <thread> | ||
| 7 | 6 | ||
| 8 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" | 7 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" |
| 9 | #include "video_core/renderer_vulkan/vk_fence_manager.h" | 8 | #include "video_core/renderer_vulkan/vk_fence_manager.h" |
| @@ -14,13 +13,11 @@ | |||
| 14 | 13 | ||
| 15 | namespace Vulkan { | 14 | namespace Vulkan { |
| 16 | 15 | ||
| 17 | InnerFence::InnerFence(const Device& device_, VKScheduler& scheduler_, u32 payload_, | 16 | InnerFence::InnerFence(VKScheduler& scheduler_, u32 payload_, bool is_stubbed_) |
| 18 | bool is_stubbed_) | 17 | : FenceBase{payload_, is_stubbed_}, scheduler{scheduler_} {} |
| 19 | : FenceBase{payload_, is_stubbed_}, device{device_}, scheduler{scheduler_} {} | ||
| 20 | 18 | ||
| 21 | InnerFence::InnerFence(const Device& device_, VKScheduler& scheduler_, GPUVAddr address_, | 19 | InnerFence::InnerFence(VKScheduler& scheduler_, GPUVAddr address_, u32 payload_, bool is_stubbed_) |
| 22 | u32 payload_, bool is_stubbed_) | 20 | : FenceBase{address_, payload_, is_stubbed_}, scheduler{scheduler_} {} |
| 23 | : FenceBase{address_, payload_, is_stubbed_}, device{device_}, scheduler{scheduler_} {} | ||
| 24 | 21 | ||
| 25 | InnerFence::~InnerFence() = default; | 22 | InnerFence::~InnerFence() = default; |
| 26 | 23 | ||
| @@ -28,63 +25,38 @@ void InnerFence::Queue() { | |||
| 28 | if (is_stubbed) { | 25 | if (is_stubbed) { |
| 29 | return; | 26 | return; |
| 30 | } | 27 | } |
| 31 | ASSERT(!event); | 28 | // Get the current tick so we can wait for it |
| 32 | 29 | wait_tick = scheduler.CurrentTick(); | |
| 33 | event = device.GetLogical().CreateEvent(); | 30 | scheduler.Flush(); |
| 34 | ticks = scheduler.CurrentTick(); | ||
| 35 | |||
| 36 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 37 | scheduler.Record([event = *event](vk::CommandBuffer cmdbuf) { | ||
| 38 | cmdbuf.SetEvent(event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); | ||
| 39 | }); | ||
| 40 | } | 31 | } |
| 41 | 32 | ||
| 42 | bool InnerFence::IsSignaled() const { | 33 | bool InnerFence::IsSignaled() const { |
| 43 | if (is_stubbed) { | 34 | if (is_stubbed) { |
| 44 | return true; | 35 | return true; |
| 45 | } | 36 | } |
| 46 | ASSERT(event); | 37 | return scheduler.IsFree(wait_tick); |
| 47 | return IsEventSignalled(); | ||
| 48 | } | 38 | } |
| 49 | 39 | ||
| 50 | void InnerFence::Wait() { | 40 | void InnerFence::Wait() { |
| 51 | if (is_stubbed) { | 41 | if (is_stubbed) { |
| 52 | return; | 42 | return; |
| 53 | } | 43 | } |
| 54 | ASSERT(event); | 44 | scheduler.Wait(wait_tick); |
| 55 | |||
| 56 | if (ticks >= scheduler.CurrentTick()) { | ||
| 57 | scheduler.Flush(); | ||
| 58 | } | ||
| 59 | while (!IsEventSignalled()) { | ||
| 60 | std::this_thread::yield(); | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | bool InnerFence::IsEventSignalled() const { | ||
| 65 | switch (const VkResult result = event.GetStatus()) { | ||
| 66 | case VK_EVENT_SET: | ||
| 67 | return true; | ||
| 68 | case VK_EVENT_RESET: | ||
| 69 | return false; | ||
| 70 | default: | ||
| 71 | throw vk::Exception(result); | ||
| 72 | } | ||
| 73 | } | 45 | } |
| 74 | 46 | ||
| 75 | VKFenceManager::VKFenceManager(VideoCore::RasterizerInterface& rasterizer_, Tegra::GPU& gpu_, | 47 | VKFenceManager::VKFenceManager(VideoCore::RasterizerInterface& rasterizer_, Tegra::GPU& gpu_, |
| 76 | Tegra::MemoryManager& memory_manager_, TextureCache& texture_cache_, | 48 | Tegra::MemoryManager& memory_manager_, TextureCache& texture_cache_, |
| 77 | VKBufferCache& buffer_cache_, VKQueryCache& query_cache_, | 49 | VKBufferCache& buffer_cache_, VKQueryCache& query_cache_, |
| 78 | const Device& device_, VKScheduler& scheduler_) | 50 | VKScheduler& scheduler_) |
| 79 | : GenericFenceManager{rasterizer_, gpu_, texture_cache_, buffer_cache_, query_cache_}, | 51 | : GenericFenceManager{rasterizer_, gpu_, texture_cache_, buffer_cache_, query_cache_}, |
| 80 | device{device_}, scheduler{scheduler_} {} | 52 | scheduler{scheduler_} {} |
| 81 | 53 | ||
| 82 | Fence VKFenceManager::CreateFence(u32 value, bool is_stubbed) { | 54 | Fence VKFenceManager::CreateFence(u32 value, bool is_stubbed) { |
| 83 | return std::make_shared<InnerFence>(device, scheduler, value, is_stubbed); | 55 | return std::make_shared<InnerFence>(scheduler, value, is_stubbed); |
| 84 | } | 56 | } |
| 85 | 57 | ||
| 86 | Fence VKFenceManager::CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) { | 58 | Fence VKFenceManager::CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) { |
| 87 | return std::make_shared<InnerFence>(device, scheduler, addr, value, is_stubbed); | 59 | return std::make_shared<InnerFence>(scheduler, addr, value, is_stubbed); |
| 88 | } | 60 | } |
| 89 | 61 | ||
| 90 | void VKFenceManager::QueueFence(Fence& fence) { | 62 | void VKFenceManager::QueueFence(Fence& fence) { |
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.h b/src/video_core/renderer_vulkan/vk_fence_manager.h index 6b51e4587..9c5e5aa8f 100644 --- a/src/video_core/renderer_vulkan/vk_fence_manager.h +++ b/src/video_core/renderer_vulkan/vk_fence_manager.h | |||
| @@ -28,10 +28,8 @@ class VKScheduler; | |||
| 28 | 28 | ||
| 29 | class InnerFence : public VideoCommon::FenceBase { | 29 | class InnerFence : public VideoCommon::FenceBase { |
| 30 | public: | 30 | public: |
| 31 | explicit InnerFence(const Device& device_, VKScheduler& scheduler_, u32 payload_, | 31 | explicit InnerFence(VKScheduler& scheduler_, u32 payload_, bool is_stubbed_); |
| 32 | bool is_stubbed_); | 32 | explicit InnerFence(VKScheduler& scheduler_, GPUVAddr address_, u32 payload_, bool is_stubbed_); |
| 33 | explicit InnerFence(const Device& device_, VKScheduler& scheduler_, GPUVAddr address_, | ||
| 34 | u32 payload_, bool is_stubbed_); | ||
| 35 | ~InnerFence(); | 33 | ~InnerFence(); |
| 36 | 34 | ||
| 37 | void Queue(); | 35 | void Queue(); |
| @@ -41,12 +39,8 @@ public: | |||
| 41 | void Wait(); | 39 | void Wait(); |
| 42 | 40 | ||
| 43 | private: | 41 | private: |
| 44 | bool IsEventSignalled() const; | ||
| 45 | |||
| 46 | const Device& device; | ||
| 47 | VKScheduler& scheduler; | 42 | VKScheduler& scheduler; |
| 48 | vk::Event event; | 43 | u64 wait_tick = 0; |
| 49 | u64 ticks = 0; | ||
| 50 | }; | 44 | }; |
| 51 | using Fence = std::shared_ptr<InnerFence>; | 45 | using Fence = std::shared_ptr<InnerFence>; |
| 52 | 46 | ||
| @@ -58,7 +52,7 @@ public: | |||
| 58 | explicit VKFenceManager(VideoCore::RasterizerInterface& rasterizer_, Tegra::GPU& gpu_, | 52 | explicit VKFenceManager(VideoCore::RasterizerInterface& rasterizer_, Tegra::GPU& gpu_, |
| 59 | Tegra::MemoryManager& memory_manager_, TextureCache& texture_cache_, | 53 | Tegra::MemoryManager& memory_manager_, TextureCache& texture_cache_, |
| 60 | VKBufferCache& buffer_cache_, VKQueryCache& query_cache_, | 54 | VKBufferCache& buffer_cache_, VKQueryCache& query_cache_, |
| 61 | const Device& device_, VKScheduler& scheduler_); | 55 | VKScheduler& scheduler_); |
| 62 | 56 | ||
| 63 | protected: | 57 | protected: |
| 64 | Fence CreateFence(u32 value, bool is_stubbed) override; | 58 | Fence CreateFence(u32 value, bool is_stubbed) override; |
| @@ -68,7 +62,6 @@ protected: | |||
| 68 | void WaitFence(Fence& fence) override; | 62 | void WaitFence(Fence& fence) override; |
| 69 | 63 | ||
| 70 | private: | 64 | private: |
| 71 | const Device& device; | ||
| 72 | VKScheduler& scheduler; | 65 | VKScheduler& scheduler; |
| 73 | }; | 66 | }; |
| 74 | 67 | ||
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 93fbea510..ce3db49bd 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -428,8 +428,7 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra | |||
| 428 | buffer_cache(*this, gpu_memory, cpu_memory_, device, memory_manager, scheduler, stream_buffer, | 428 | buffer_cache(*this, gpu_memory, cpu_memory_, device, memory_manager, scheduler, stream_buffer, |
| 429 | staging_pool), | 429 | staging_pool), |
| 430 | query_cache{*this, maxwell3d, gpu_memory, device, scheduler}, | 430 | query_cache{*this, maxwell3d, gpu_memory, device, scheduler}, |
| 431 | fence_manager(*this, gpu, gpu_memory, texture_cache, buffer_cache, query_cache, device, | 431 | fence_manager(*this, gpu, gpu_memory, texture_cache, buffer_cache, query_cache, scheduler), |
| 432 | scheduler), | ||
| 433 | wfi_event(device.GetLogical().CreateEvent()), async_shaders(emu_window_) { | 432 | wfi_event(device.GetLogical().CreateEvent()), async_shaders(emu_window_) { |
| 434 | scheduler.SetQueryCache(query_cache); | 433 | scheduler.SetQueryCache(query_cache); |
| 435 | if (device.UseAsynchronousShaders()) { | 434 | if (device.UseAsynchronousShaders()) { |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 75173324e..d6f603b99 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -604,7 +604,6 @@ void Device::CheckSuitability() const { | |||
| 604 | std::make_pair(features.occlusionQueryPrecise, "occlusionQueryPrecise"), | 604 | std::make_pair(features.occlusionQueryPrecise, "occlusionQueryPrecise"), |
| 605 | std::make_pair(features.fragmentStoresAndAtomics, "fragmentStoresAndAtomics"), | 605 | std::make_pair(features.fragmentStoresAndAtomics, "fragmentStoresAndAtomics"), |
| 606 | std::make_pair(features.shaderImageGatherExtended, "shaderImageGatherExtended"), | 606 | std::make_pair(features.shaderImageGatherExtended, "shaderImageGatherExtended"), |
| 607 | std::make_pair(features.shaderStorageImageMultisample, "shaderStorageImageMultisample"), | ||
| 608 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, | 607 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, |
| 609 | "shaderStorageImageWriteWithoutFormat"), | 608 | "shaderStorageImageWriteWithoutFormat"), |
| 610 | }; | 609 | }; |