Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Data Members
- typedef std::array<pixel_buffer_object, 5> array_t;
- typedef std::vector<vu8> work_t;
- const int m_w;
- const int m_h;
- const int m_bytes;
- array_t m_pbos;
- array_t::iterator m_pbo_iter = m_pbos.begin();
- boost::thread m_thread;
- boost::atomic<u32> m_atomic_remaining{0};
- boost::mutex m_shared_mutex;
- work_t m_shared_work;
- boost::condition_variable m_shared_cv;
- //Producer
- template <typename... Args> void send_work(Args&&... args) {
- boost::unique_lock<boost::mutex> ul(m_shared_mutex);
- const bool must_notify = m_shared_work.empty();
- m_shared_work.emplace_back(std::forward<Args>(args)...);
- ul.unlock();
- if (must_notify) {
- m_shared_cv.notify_one();
- }
- }
- //Consumer
- void worker_thread() {
- u32 highest_num = highest_numbered_screenshot();
- for (work_t local_work; ; local_work.clear()) {
- boost::unique_lock<boost::mutex> ul(m_shared_mutex);
- while (m_shared_work.empty()) {
- m_shared_cv.wait(ul);
- }
- m_shared_work.swap(local_work);
- ul.unlock();
- for (auto& v : local_work) {
- if (v.empty()) {
- return;
- }
- erase_alpha(v);
- write_screenshot(m_w, m_h, v, ++highest_num);
- --m_atomic_remaining;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement