From 09dcd48257b348a58a37bbdee50f156cc75976b8 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Mon, 26 Dec 2022 10:42:36 +0200 Subject: [PATCH] vk_scheduler: Enable usage of jthread on macos - Import the yuzu polyfill libraries --- .../libVkLayer_khronos_timeline_semaphore.so | Bin 0 -> 232648 bytes src/common/CMakeLists.txt | 2 + src/common/polyfill_ranges.h | 530 ++++++++++++++++++ src/common/polyfill_thread.h | 323 +++++++++++ .../renderer_vulkan/vk_rasterizer.cpp | 18 +- .../renderer_vulkan/vk_scheduler.cpp | 29 +- src/video_core/renderer_vulkan/vk_scheduler.h | 7 +- .../renderer_vulkan/vk_shader_util.h | 1 + .../renderer_vulkan/vk_swapchain.cpp | 11 +- 9 files changed, 880 insertions(+), 41 deletions(-) create mode 100644 src/android/app/src/main/jniLibs/arm64-v8a/libVkLayer_khronos_timeline_semaphore.so create mode 100644 src/common/polyfill_ranges.h create mode 100644 src/common/polyfill_thread.h diff --git a/src/android/app/src/main/jniLibs/arm64-v8a/libVkLayer_khronos_timeline_semaphore.so b/src/android/app/src/main/jniLibs/arm64-v8a/libVkLayer_khronos_timeline_semaphore.so new file mode 100644 index 0000000000000000000000000000000000000000..06545335e2c45184ab44a802906ca8f066d86037 GIT binary patch literal 232648 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

YcqI#Aoca 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 LlV`7 +#include +#include + +#ifndef __cpp_lib_ranges + +namespace std { +namespace ranges { + +template +concept range = requires(T& t) { + begin(t); + end(t); +}; + +template +concept input_range = range; + +template +concept output_range = range; + +template +using range_difference_t = ptrdiff_t; + +// +// find, find_if, find_if_not +// + +struct find_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, const T& value, + Proj proj = {}) const { + for (; first != last; ++first) { + if (std::invoke(proj, *first) == value) { + return first; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, const T& value, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), value, std::ref(proj)); + } +}; + +struct find_if_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + for (; first != last; ++first) { + if (std::invoke(pred, std::invoke(proj, *first))) { + return first; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +struct find_if_not_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + for (; first != last; ++first) { + if (!std::invoke(pred, std::invoke(proj, *first))) { + return first; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +inline constexpr find_fn find; +inline constexpr find_if_fn find_if; +inline constexpr find_if_not_fn find_if_not; + +// +// any_of, all_of, none_of +// + +struct all_of_fn { + template + constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + return ranges::find_if_not(first, last, std::ref(pred), std::ref(proj)) == last; + } + + template + constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +struct any_of_fn { + template + constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) != last; + } + + template + constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +struct none_of_fn { + template + constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) == last; + } + + template + constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +inline constexpr any_of_fn any_of; +inline constexpr all_of_fn all_of; +inline constexpr none_of_fn none_of; + +// +// count, count_if +// + +struct count_fn { + template + constexpr ptrdiff_t operator()(Iterator first, Iterator last, const T& value, + Proj proj = {}) const { + ptrdiff_t counter = 0; + for (; first != last; ++first) + if (std::invoke(proj, *first) == value) + ++counter; + return counter; + } + + template + constexpr ptrdiff_t operator()(R&& r, const T& value, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), value, std::ref(proj)); + } +}; + +struct count_if_fn { + template + constexpr ptrdiff_t operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { + ptrdiff_t counter = 0; + for (; first != last; ++first) + if (std::invoke(pred, std::invoke(proj, *first))) + ++counter; + return counter; + } + + template + constexpr ptrdiff_t operator()(R&& r, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +inline constexpr count_fn count; +inline constexpr count_if_fn count_if; + +// +// transform +// + +struct transform_fn { + template + constexpr void operator()(InputIterator first1, InputIterator last1, OutputIterator result, + F op, Proj proj = {}) const { + for (; first1 != last1; ++first1, (void)++result) { + *result = std::invoke(op, std::invoke(proj, *first1)); + } + } + + template + constexpr void operator()(R&& r, OutputIterator result, F op, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), result, std::ref(op), std::ref(proj)); + } +}; + +inline constexpr transform_fn transform; + +// +// sort +// + +struct sort_fn { + template + constexpr void operator()(Iterator first, Iterator last, Comp comp = {}, Proj proj = {}) const { + if (first == last) + return; + + Iterator last_iter = ranges::next(first, last); + std::sort(first, last_iter, + [&](auto& lhs, auto& rhs) { return comp(proj(lhs), proj(rhs)); }); + } + + template + constexpr void operator()(R&& r, Comp comp = {}, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(comp), std::move(proj)); + } +}; + +inline constexpr sort_fn sort; + +// +// fill +// + +struct fill_fn { + template + constexpr OutputIterator operator()(OutputIterator first, OutputIterator last, + const T& value) const { + while (first != last) { + *first++ = value; + } + + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, const T& value) const { + return operator()(ranges::begin(r), ranges::end(r), value); + } +}; + +inline constexpr fill_fn fill; + +// +// for_each +// + +struct for_each_fn { + template + constexpr void operator()(Iterator first, Iterator last, Fun f, Proj proj = {}) const { + for (; first != last; ++first) { + std::invoke(f, std::invoke(proj, *first)); + } + } + + template + constexpr void operator()(R&& r, Fun f, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(f), std::ref(proj)); + } +}; + +inline constexpr for_each_fn for_each; + +// +// min_element, max_element +// + +struct min_element_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Comp comp = {}, + Proj proj = {}) const { + if (first == last) { + return last; + } + + auto smallest = first; + ++first; + for (; first != last; ++first) { + if (!std::invoke(comp, std::invoke(proj, *smallest), std::invoke(proj, *first))) { + smallest = first; + } + } + return smallest; + } + + template + constexpr ranges::iterator_t operator()(R&& r, Comp comp = {}, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); + } +}; + +struct max_element_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Comp comp = {}, + Proj proj = {}) const { + if (first == last) { + return last; + } + + auto largest = first; + ++first; + for (; first != last; ++first) { + if (std::invoke(comp, std::invoke(proj, *largest), std::invoke(proj, *first))) { + largest = first; + } + } + return largest; + } + + template + constexpr ranges::iterator_t operator()(R&& r, Comp comp = {}, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); + } +}; + +inline constexpr min_element_fn min_element; +inline constexpr max_element_fn max_element; + +// +// replace, replace_if +// + +struct replace_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, const T1& old_value, + const T2& new_value, Proj proj = {}) const { + for (; first != last; ++first) { + if (old_value == std::invoke(proj, *first)) { + *first = new_value; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, const T1& old_value, const T2& new_value, + Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), old_value, new_value, std::move(proj)); + } +}; + +struct replace_if_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, const T& new_value, + Proj proj = {}) const { + for (; first != last; ++first) { + if (!!std::invoke(pred, std::invoke(proj, *first))) { + *first = new_value; + } + } + return std::move(first); + } + + template + constexpr ranges::iterator_t operator()(R&& r, Pred pred, const T& new_value, + Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(pred), new_value, + std::move(proj)); + } +}; + +inline constexpr replace_fn replace; +inline constexpr replace_if_fn replace_if; + +// +// copy, copy_if +// + +struct copy_fn { + template + constexpr void operator()(InputIterator first, InputIterator last, + OutputIterator result) const { + for (; first != last; ++first, (void)++result) { + *result = *first; + } + } + + template + constexpr void operator()(R&& r, OutputIterator result) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(result)); + } +}; + +struct copy_if_fn { + template + constexpr void operator()(InputIterator first, InputIterator last, OutputIterator result, + Pred pred, Proj proj = {}) const { + for (; first != last; ++first) { + if (std::invoke(pred, std::invoke(proj, *first))) { + *result = *first; + ++result; + } + } + } + + template + constexpr void operator()(R&& r, OutputIterator result, Pred pred, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(result), std::ref(pred), + std::ref(proj)); + } +}; + +inline constexpr copy_fn copy; +inline constexpr copy_if_fn copy_if; + +// +// generate +// + +struct generate_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, F gen) const { + for (; first != last; *first = std::invoke(gen), ++first) + ; + return first; + } + + template + requires std::invocable && ranges::output_range + constexpr ranges::iterator_t operator()(R&& r, F gen) const { + return operator()(ranges::begin(r), ranges::end(r), std::move(gen)); + } +}; + +inline constexpr generate_fn generate; + +// +// lower_bound, upper_bound +// + +struct lower_bound_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, const T& value, Comp comp = {}, + Proj proj = {}) const { + Iterator it; + std::ptrdiff_t _count, _step; + _count = std::distance(first, last); + + while (_count > 0) { + it = first; + _step = _count / 2; + ranges::advance(it, _step, last); + if (comp(std::invoke(proj, *it), value)) { + first = ++it; + _count -= _step + 1; + } else { + _count = _step; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, const T& value, Comp comp = {}, + Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), value, std::ref(comp), std::ref(proj)); + } +}; + +struct upper_bound_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, const T& value, Comp comp = {}, + Proj proj = {}) const { + Iterator it; + std::ptrdiff_t _count, _step; + _count = std::distance(first, last); + + while (_count > 0) { + it = first; + _step = _count / 2; + ranges::advance(it, _step, last); + if (!comp(value, std::invoke(proj, *it))) { + first = ++it; + _count -= _step + 1; + } else { + _count = _step; + } + } + return first; + } + + template + constexpr ranges::iterator_t operator()(R&& r, const T& value, Comp comp = {}, + Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), value, std::ref(comp), std::ref(proj)); + } +}; + +inline constexpr lower_bound_fn lower_bound; +inline constexpr upper_bound_fn upper_bound; + +// +// adjacent_find +// + +struct adjacent_find_fn { + template + constexpr Iterator operator()(Iterator first, Iterator last, Pred pred = {}, + Proj proj = {}) const { + if (first == last) + return first; + auto _next = ranges::next(first); + for (; _next != last; ++_next, ++first) + if (std::invoke(pred, std::invoke(proj, *first), std::invoke(proj, *_next))) + return first; + return _next; + } + + template + constexpr ranges::iterator_t operator()(R&& r, Pred pred = {}, Proj proj = {}) const { + return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); + } +}; + +inline constexpr adjacent_find_fn adjacent_find; + +} // namespace ranges +} // namespace std + +#endif diff --git a/src/common/polyfill_thread.h b/src/common/polyfill_thread.h new file mode 100644 index 000000000..5a8d1ce08 --- /dev/null +++ b/src/common/polyfill_thread.h @@ -0,0 +1,323 @@ +// SPDX-FileCopyrightText: 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// +// TODO: remove this file when jthread is supported by all compilation targets +// + +#pragma once + +#include + +#ifdef __cpp_lib_jthread + +#include +#include + +namespace Common { + +template +void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) { + cv.wait(lock, token, std::move(pred)); +} + +} // namespace Common + +#else + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace std { +namespace polyfill { + +using stop_state_callbacks = list>; + +class stop_state { +public: + stop_state() = default; + ~stop_state() = default; + + bool request_stop() { + stop_state_callbacks callbacks; + + { + scoped_lock lk{m_lock}; + + if (m_stop_requested.load()) { + // Already set, nothing to do + return false; + } + + // Set as requested + m_stop_requested = true; + + // Copy callback list + callbacks = m_callbacks; + } + + for (auto callback : callbacks) { + callback(); + } + + return true; + } + + bool stop_requested() const { + return m_stop_requested.load(); + } + + stop_state_callbacks::const_iterator insert_callback(function f) { + stop_state_callbacks::const_iterator ret{}; + bool should_run{}; + + { + scoped_lock lk{m_lock}; + should_run = m_stop_requested.load(); + m_callbacks.push_front(f); + ret = m_callbacks.begin(); + } + + if (should_run) { + f(); + } + + return ret; + } + + void remove_callback(stop_state_callbacks::const_iterator it) { + scoped_lock lk{m_lock}; + m_callbacks.erase(it); + } + +private: + mutex m_lock; + atomic m_stop_requested; + stop_state_callbacks m_callbacks; +}; + +} // namespace polyfill + +class stop_token; +class stop_source; +struct nostopstate_t { + explicit nostopstate_t() = default; +}; +inline constexpr nostopstate_t nostopstate{}; + +template +class stop_callback; + +class stop_token { +public: + stop_token() noexcept = default; + + stop_token(const stop_token&) noexcept = default; + stop_token(stop_token&&) noexcept = default; + stop_token& operator=(const stop_token&) noexcept = default; + stop_token& operator=(stop_token&&) noexcept = default; + ~stop_token() = default; + + void swap(stop_token& other) noexcept { + m_stop_state.swap(other.m_stop_state); + } + + [[nodiscard]] bool stop_requested() const noexcept { + return m_stop_state && m_stop_state->stop_requested(); + } + [[nodiscard]] bool stop_possible() const noexcept { + return m_stop_state != nullptr; + } + +private: + friend class stop_source; + template + friend class stop_callback; + stop_token(shared_ptr stop_state) : m_stop_state(move(stop_state)) {} + +private: + shared_ptr m_stop_state; +}; + +class stop_source { +public: + stop_source() : m_stop_state(make_shared()) {} + explicit stop_source(nostopstate_t) noexcept {} + + stop_source(const stop_source&) noexcept = default; + stop_source(stop_source&&) noexcept = default; + stop_source& operator=(const stop_source&) noexcept = default; + stop_source& operator=(stop_source&&) noexcept = default; + ~stop_source() = default; + void swap(stop_source& other) noexcept { + m_stop_state.swap(other.m_stop_state); + } + + [[nodiscard]] stop_token get_token() const noexcept { + return stop_token(m_stop_state); + } + [[nodiscard]] bool stop_possible() const noexcept { + return m_stop_state != nullptr; + } + [[nodiscard]] bool stop_requested() const noexcept { + return m_stop_state && m_stop_state->stop_requested(); + } + bool request_stop() noexcept { + return m_stop_state && m_stop_state->request_stop(); + } + +private: + friend class jthread; + explicit stop_source(shared_ptr stop_state) + : m_stop_state(move(stop_state)) {} + +private: + shared_ptr m_stop_state; +}; + +template +class stop_callback { + static_assert(is_nothrow_destructible_v); + static_assert(is_invocable_v); + +public: + using callback_type = Callback; + + template + requires constructible_from + explicit stop_callback(const stop_token& st, + C&& cb) noexcept(is_nothrow_constructible_v) + : m_stop_state(st.m_stop_state) { + if (m_stop_state) { + m_callback = m_stop_state->insert_callback(move(cb)); + } + } + template + requires constructible_from + explicit stop_callback(stop_token&& st, + C&& cb) noexcept(is_nothrow_constructible_v) + : m_stop_state(move(st.m_stop_state)) { + if (m_stop_state) { + m_callback = m_stop_state->insert_callback(move(cb)); + } + } + ~stop_callback() { + if (m_stop_state && m_callback) { + m_stop_state->remove_callback(*m_callback); + } + } + + stop_callback(const stop_callback&) = delete; + stop_callback(stop_callback&&) = delete; + stop_callback& operator=(const stop_callback&) = delete; + stop_callback& operator=(stop_callback&&) = delete; + +private: + shared_ptr m_stop_state; + optional m_callback; +}; + +template +stop_callback(stop_token, Callback) -> stop_callback; + +class jthread { +public: + using id = thread::id; + using native_handle_type = thread::native_handle_type; + + jthread() noexcept = default; + + template , jthread>>> + explicit jthread(F&& f, Args&&... args) + : m_stop_state(make_shared()), + m_thread(make_thread(move(f), move(args)...)) {} + + ~jthread() { + if (joinable()) { + request_stop(); + join(); + } + } + + jthread(const jthread&) = delete; + jthread(jthread&&) noexcept = default; + jthread& operator=(const jthread&) = delete; + + jthread& operator=(jthread&& other) noexcept { + m_thread.swap(other.m_thread); + m_stop_state.swap(other.m_stop_state); + return *this; + } + + void swap(jthread& other) noexcept { + m_thread.swap(other.m_thread); + m_stop_state.swap(other.m_stop_state); + } + [[nodiscard]] bool joinable() const noexcept { + return m_thread.joinable(); + } + void join() { + m_thread.join(); + } + void detach() { + m_thread.detach(); + m_stop_state.reset(); + } + + [[nodiscard]] id get_id() const noexcept { + return m_thread.get_id(); + } + [[nodiscard]] native_handle_type native_handle() { + return m_thread.native_handle(); + } + [[nodiscard]] stop_source get_stop_source() noexcept { + return stop_source(m_stop_state); + } + [[nodiscard]] stop_token get_stop_token() const noexcept { + return stop_source(m_stop_state).get_token(); + } + bool request_stop() noexcept { + return get_stop_source().request_stop(); + } + [[nodiscard]] static unsigned int hardware_concurrency() noexcept { + return thread::hardware_concurrency(); + } + +private: + template + thread make_thread(F&& f, Args&&... args) { + if constexpr (is_invocable_v, stop_token, decay_t...>) { + return thread(move(f), get_stop_token(), move(args)...); + } else { + return thread(move(f), move(args)...); + } + } + + shared_ptr m_stop_state; + thread m_thread; +}; + +} // namespace std + +namespace Common { + +template +void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred pred) { + if (token.stop_requested()) { + return; + } + + std::stop_callback callback(token, [&] { cv.notify_all(); }); + cv.wait(lock, [&] { return pred() || token.stop_requested(); }); +} + +} // namespace Common + +#endif diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 0a1d52b87..9cc570ea4 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -401,19 +401,19 @@ bool RasterizerVulkan::AccelerateDrawBatchInternal(bool is_indexed) { regs.pipeline.vertex_attributes.GetPhysicalBaseAddress() + regs.pipeline.index_array.offset); - // Upload index buffer data to the GPU auto [index_ptr, index_offset, _] = index_buffer.Map(index_buffer_size); std::memcpy(index_ptr, index_data, index_buffer_size); index_buffer.Commit(index_buffer_size); - scheduler.Record([this, offset = index_offset, num_vertices = regs.pipeline.num_vertices, - index_u16, vertex_offset = vs_input_index_min]( - vk::CommandBuffer render_cmdbuf, vk::CommandBuffer) { - const vk::IndexType index_type = - index_u16 ? vk::IndexType::eUint16 : vk::IndexType::eUint8EXT; - render_cmdbuf.bindIndexBuffer(index_buffer.GetHandle(), offset, index_type); - render_cmdbuf.drawIndexed(num_vertices, 1, 0, -vertex_offset, 0); - }); + scheduler.Record( + [this, offset = index_offset, index_u16, num_vertices = regs.pipeline.num_vertices, + vertex_offset = static_cast(vs_input_index_min)](vk::CommandBuffer render_cmdbuf, + vk::CommandBuffer) { + const vk::IndexType index_type = + index_u16 ? vk::IndexType::eUint16 : vk::IndexType::eUint8EXT; + render_cmdbuf.bindIndexBuffer(index_buffer.GetHandle(), offset, index_type); + render_cmdbuf.drawIndexed(num_vertices, 1, 0, -vertex_offset, 0); + }); } else { scheduler.Record([num_vertices = regs.pipeline.num_vertices]( vk::CommandBuffer render_cmdbuf, vk::CommandBuffer) { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index f1003cbb4..19ee3eb7a 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -29,31 +29,16 @@ void Scheduler::CommandChunk::ExecuteAll(vk::CommandBuffer render_cmdbuf, Scheduler::Scheduler(const Instance& instance, RenderpassCache& renderpass_cache, RendererVulkan& renderer) : instance{instance}, renderpass_cache{renderpass_cache}, renderer{renderer}, - master_semaphore{instance}, command_pool{instance, master_semaphore}, stop_requested{false}, + master_semaphore{instance}, command_pool{instance, master_semaphore}, use_worker_thread{Settings::values.async_command_recording} { AllocateWorkerCommandBuffers(); if (use_worker_thread) { AcquireNewChunk(); - worker_thread = std::thread([this]() { WorkerThread(); }); + worker_thread = std::jthread([this](std::stop_token token) { WorkerThread(token); }); } } -Scheduler::~Scheduler() { - if (!use_worker_thread) { - return; - } - - stop_requested = true; - - // Push a dummy chunk to unblock the thread - { - std::scoped_lock lock{work_mutex}; - work_queue.push(std::move(chunk)); - } - - work_cv.notify_one(); - worker_thread.join(); -} +Scheduler::~Scheduler() = default; void Scheduler::Flush(vk::Semaphore signal, vk::Semaphore wait) { SubmitExecution(signal, wait); @@ -93,7 +78,7 @@ void Scheduler::DispatchWork() { AcquireNewChunk(); } -void Scheduler::WorkerThread() { +void Scheduler::WorkerThread(std::stop_token stop_token) { do { std::unique_ptr work; bool has_submit{false}; @@ -102,8 +87,8 @@ void Scheduler::WorkerThread() { if (work_queue.empty()) { wait_cv.notify_all(); } - work_cv.wait(lock, [this] { return !work_queue.empty() || stop_requested; }); - if (stop_requested) { + Common::CondvarWait(work_cv, lock, stop_token, [&] { return !work_queue.empty(); }); + if (stop_token.stop_requested()) { continue; } work = std::move(work_queue.front()); @@ -117,7 +102,7 @@ void Scheduler::WorkerThread() { } std::scoped_lock reserve_lock{reserve_mutex}; chunk_reserve.push_back(std::move(work)); - } while (!stop_requested); + } while (!stop_token.stop_requested()); } void Scheduler::AllocateWorkerCommandBuffers() { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 13357ca34..c3b4f7ee9 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -6,12 +6,12 @@ #include #include #include -#include #include #include #include "common/alignment.h" #include "common/common_funcs.h" #include "common/common_types.h" +#include "common/polyfill_thread.h" #include "video_core/renderer_vulkan/vk_master_semaphore.h" #include "video_core/renderer_vulkan/vk_resource_pool.h" @@ -187,7 +187,7 @@ private: }; private: - void WorkerThread(); + void WorkerThread(std::stop_token stop_token); void AllocateWorkerCommandBuffers(); @@ -211,8 +211,7 @@ private: std::mutex work_mutex; std::condition_variable_any work_cv; std::condition_variable wait_cv; - std::thread worker_thread; - std::atomic_bool stop_requested; + std::jthread worker_thread; bool use_worker_thread; }; diff --git a/src/video_core/renderer_vulkan/vk_shader_util.h b/src/video_core/renderer_vulkan/vk_shader_util.h index 7a19cd1d9..1e4975b48 100644 --- a/src/video_core/renderer_vulkan/vk_shader_util.h +++ b/src/video_core/renderer_vulkan/vk_shader_util.h @@ -4,6 +4,7 @@ #pragma once +#include #include "video_core/renderer_vulkan/vk_common.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 55ce5a497..ce7c7a5aa 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -2,9 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include #include "common/logging/log.h" #include "common/microprofile.h" +#include "common/polyfill_ranges.h" #include "common/settings.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_renderpass_cache.h" @@ -134,8 +134,8 @@ void Swapchain::FindPresentFormat() { const std::vector formats = instance.GetPhysicalDevice().getSurfaceFormatsKHR(surface); - // If there is a single undefined surface format, the device doesn't care, so we'll just use - // RGBA + // If there is a single undefined surface format, the device doesn't care, so we'll just use + // RGBA if (formats[0].format == vk::Format::eUndefined) { surface_format.format = vk::Format::eR8G8B8A8Unorm; surface_format.colorSpace = vk::ColorSpaceKHR::eSrgbNonlinear; @@ -165,9 +165,8 @@ void Swapchain::SetPresentMode() { instance.GetPhysicalDevice().getSurfacePresentModesKHR(surface); const auto FindMode = [&modes](vk::PresentModeKHR requested) { - auto it = - std::find_if(modes.begin(), modes.end(), - [&requested](vk::PresentModeKHR mode) { return mode == requested; }); + auto it = std::ranges::find_if( + modes, [&requested](vk::PresentModeKHR mode) { return mode == requested; }); return it != modes.end(); };