From f491b2a5d61a4acd0ac1e94af50fc5a42ff03327 Mon Sep 17 00:00:00 2001 From: GP Garcia Date: Wed, 25 Dec 2024 09:56:46 -0600 Subject: [PATCH] Oops, ThorGV fix incoming --- .github/actions/helpers/tvgLock.h | 76 +++++++++++++ .github/actions/helpers/tvgTaskScheduler.h | 112 +++++++++++++++++++ .github/workflows/build-artifact-windows.yml | 7 ++ 3 files changed, 195 insertions(+) create mode 100644 .github/actions/helpers/tvgLock.h create mode 100644 .github/actions/helpers/tvgTaskScheduler.h diff --git a/.github/actions/helpers/tvgLock.h b/.github/actions/helpers/tvgLock.h new file mode 100644 index 0000000..d3a4e41 --- /dev/null +++ b/.github/actions/helpers/tvgLock.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _TVG_LOCK_H_ +#define _TVG_LOCK_H_ + +#ifdef THORVG_THREAD_SUPPORT + +#include +#include "tvgTaskScheduler.h" + +namespace tvg { + + struct Key + { + std::mutex mtx; + }; + + struct ScopedLock + { + Key* key = nullptr; + + ScopedLock(Key& k) + { + if (TaskScheduler::threads() > 0) { + k.mtx.lock(); + key = &k; + } + } + + ~ScopedLock() + { + if (TaskScheduler::threads() > 0) { + key->mtx.unlock(); + } + } + }; + +} + +#else //THORVG_THREAD_SUPPORT + +namespace tvg { + + struct Key {}; + + struct ScopedLock + { + ScopedLock(Key& key) {} + }; + +} + +#endif //THORVG_THREAD_SUPPORT + +#endif //_TVG_LOCK_H_ + diff --git a/.github/actions/helpers/tvgTaskScheduler.h b/.github/actions/helpers/tvgTaskScheduler.h new file mode 100644 index 0000000..58918e8 --- /dev/null +++ b/.github/actions/helpers/tvgTaskScheduler.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _TVG_TASK_SCHEDULER_H_ +#define _TVG_TASK_SCHEDULER_H_ + +#include +#include + +#include "tvgCommon.h" +#include "tvgInlist.h" + +namespace tvg { + +#ifdef THORVG_THREAD_SUPPORT + +struct Task +{ +private: + mutex mtx; + condition_variable cv; + bool ready = true; + bool pending = false; + +public: + INLIST_ITEM(Task); + + virtual ~Task() = default; + + void done() + { + if (!pending) return; + + unique_lock lock(mtx); + while (!ready) cv.wait(lock); + pending = false; + } + +protected: + virtual void run(unsigned tid) = 0; + +private: + void operator()(unsigned tid) + { + run(tid); + + lock_guard lock(mtx); + ready = true; + cv.notify_one(); + } + + void prepare() + { + ready = false; + pending = true; + } + + friend struct TaskSchedulerImpl; +}; + +#else //THORVG_THREAD_SUPPORT + +struct Task +{ +public: + INLIST_ITEM(Task); + + virtual ~Task() = default; + void done() {} + +protected: + virtual void run(unsigned tid) = 0; + +private: + friend struct TaskSchedulerImpl; +}; + +#endif //THORVG_THREAD_SUPPORT + + +struct TaskScheduler +{ + static uint32_t threads(); + static void init(uint32_t threads); + static void term(); + static void request(Task* task); + static void async(bool on); +}; + +} //namespace + +#endif //_TVG_TASK_SCHEDULER_H_ + diff --git a/.github/workflows/build-artifact-windows.yml b/.github/workflows/build-artifact-windows.yml index 415ee63..5fbc5af 100644 --- a/.github/workflows/build-artifact-windows.yml +++ b/.github/workflows/build-artifact-windows.yml @@ -100,6 +100,13 @@ jobs: - name: Setup Python and SCONS uses: ./.github/actions/setup-dependencies + # Apply ThorVG patch + - name: Apply ThorVG patch + shell: bash + run: | + mv -f ./.github/actions/helpers/tvgLock.h ./thirdparty/thorvg/src/common/ + mv -f ./.github/actions/helpers/tvgTaskScheduler.h ./thirdparty/thorvg/src/renderer/ + # Compiling editor - name: ${{ matrix.bits }}-bit Editor Compilation uses: ./.github/actions/build-godot