coroutines truly are cursed

This commit is contained in:
2021-11-11 20:12:50 +01:00
parent 1848bb5139
commit 01049019fd
25 changed files with 202 additions and 92 deletions
+17 -12
View File
@@ -18,8 +18,10 @@ void Window::addView(PView view)
{
WindowView* windowView = new WindowView();
windowView->view = view;
windowView->updateFinished = Event("test");
//windowView->worker = std::thread(&Window::viewWorker, this, windowView);
views.add(windowView);
views.add(windowView);
viewWorker(views.size() - 1);
}
MainJob Window::render()
@@ -27,8 +29,8 @@ MainJob Window::render()
gfxHandle->beginFrame();
for(auto& windowView : views)
{
viewWorker(windowView);
co_await windowView->updateFinished;
std::cout << "view update finished" << std::endl;
{
std::unique_lock lock(windowView->workerMutex);
windowView->view->prepareRender();
@@ -36,6 +38,8 @@ MainJob Window::render()
windowView->view->render();
}
gfxHandle->endFrame();
//Enqueue a new render main job
render();
}
Gfx::PWindow Window::getGfxHandle()
@@ -60,17 +64,18 @@ void Window::setFocused(PView view)
});
}
Job Window::viewWorker(WindowView* windowView)
Job Window::viewWorker(size_t viewIndex)
{
while(true)
WindowView* windowView = views[viewIndex];
windowView->view->beginUpdate();
windowView->view->update();
{
windowView->view->beginUpdate();
windowView->view->update();
{
std::unique_lock lock(windowView->workerMutex);
windowView->view->commitUpdate();
}
windowView->updateFinished.raise();
std::unique_lock lock(windowView->workerMutex);
windowView->view->commitUpdate();
}
std::cout << "Update completed" << std::endl;
windowView->updateFinished.raise();
// enqueue next frame update
viewWorker(viewIndex);
co_return;
}
+1 -1
View File
@@ -29,7 +29,7 @@ protected:
Array<WindowView*> views;
Gfx::PWindow gfxHandle;
Job viewWorker(WindowView* view);
Job viewWorker(size_t viewIndex);
};
DEFINE_REF(Window)
} // namespace Seele
+5
View File
@@ -39,4 +39,9 @@ PWindow WindowManager::addWindow(const WindowCreateInfo &createInfo)
void WindowManager::notifyWindowClosed(PWindow window)
{
windows.remove(windows.find(window));
if(windows.empty())
{
std::unique_lock lock(windowsLock);
windowsCV.notify_all();
}
}
+8
View File
@@ -11,6 +11,7 @@ class WindowManager
public:
WindowManager();
~WindowManager();
Job init();
PWindow addWindow(const WindowCreateInfo &createInfo);
void notifyWindowClosed(PWindow window);
static Gfx::PGraphics getGraphics()
@@ -21,9 +22,16 @@ public:
{
return windows.size();
}
void waitForCompletion()
{
std::unique_lock lock(windowsLock);
windowsCV.wait(lock);
}
private:
Array<PWindow> windows;
std::mutex windowsLock;
std::condition_variable windowsCV;
static Gfx::PGraphics graphics;
};
DEFINE_REF(WindowManager)