1 // 2 // Copyright 2016 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // WorkerThread: 7 // Asychronous tasks/threads for ANGLE, similar to a TaskRunner in Chromium. 8 // Can be implemented as different targets, depending on platform. 9 // 10 11 #ifndef LIBANGLE_WORKER_THREAD_H_ 12 #define LIBANGLE_WORKER_THREAD_H_ 13 14 #include <array> 15 #include <memory> 16 #include <vector> 17 18 #include "common/debug.h" 19 #include "libANGLE/features.h" 20 21 namespace angle 22 { 23 24 class WorkerThreadPool; 25 26 // A callback function with no return value and no arguments. 27 class Closure 28 { 29 public: 30 virtual ~Closure() = default; 31 virtual void operator()() = 0; 32 }; 33 34 // An event that we can wait on, useful for joining worker threads. 35 class WaitableEvent : angle::NonCopyable 36 { 37 public: 38 WaitableEvent(); 39 virtual ~WaitableEvent(); 40 41 // Waits indefinitely for the event to be signaled. 42 virtual void wait() = 0; 43 44 // Peeks whether the event is ready. If ready, wait() will not block. 45 virtual bool isReady() = 0; setWorkerThreadPool(std::shared_ptr<WorkerThreadPool> pool)46 void setWorkerThreadPool(std::shared_ptr<WorkerThreadPool> pool) { mPool = pool; } 47 48 template <size_t Count> WaitMany(std::array<std::shared_ptr<WaitableEvent>,Count> * waitables)49 static void WaitMany(std::array<std::shared_ptr<WaitableEvent>, Count> *waitables) 50 { 51 ASSERT(Count > 0); 52 for (size_t index = 0; index < Count; ++index) 53 { 54 (*waitables)[index]->wait(); 55 } 56 } 57 58 private: 59 std::shared_ptr<WorkerThreadPool> mPool; 60 }; 61 62 // A mock waitable event. 63 class WaitableEventDone final : public WaitableEvent 64 { 65 public: 66 void wait() override; 67 bool isReady() override; 68 }; 69 70 // Request WorkerThreads from the WorkerThreadPool. Each pool can keep worker threads around so 71 // we avoid the costly spin up and spin down time. 72 class WorkerThreadPool : angle::NonCopyable 73 { 74 public: 75 WorkerThreadPool(); 76 virtual ~WorkerThreadPool(); 77 78 static std::shared_ptr<WorkerThreadPool> Create(bool multithreaded); 79 static std::shared_ptr<WaitableEvent> PostWorkerTask(std::shared_ptr<WorkerThreadPool> pool, 80 std::shared_ptr<Closure> task); 81 82 virtual void setMaxThreads(size_t maxThreads) = 0; 83 84 virtual bool isAsync() = 0; 85 86 private: 87 // Returns an event to wait on for the task to finish. 88 // If the pool fails to create the task, returns null. 89 virtual std::shared_ptr<WaitableEvent> postWorkerTask(std::shared_ptr<Closure> task) = 0; 90 }; 91 92 } // namespace angle 93 94 #endif // LIBANGLE_WORKER_THREAD_H_ 95