coroutines truly are cursed
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user