2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-07-06 04:35:51 +00:00

blocking resize to keep OS in sync with boo buffers

This commit is contained in:
Jack Andersen 2015-12-20 14:42:18 -10:00
parent 49ff010a20
commit e630a6be55
2 changed files with 4 additions and 3 deletions

View File

@ -11,6 +11,7 @@ struct DeferredWindowEvents : public boo::IWindowCallback
{ {
Receiver& m_rec; Receiver& m_rec;
std::mutex m_mt; std::mutex m_mt;
std::condition_variable m_resizeCv;
DeferredWindowEvents(Receiver& rec) : m_rec(rec) {} DeferredWindowEvents(Receiver& rec) : m_rec(rec) {}
bool m_destroyed = false; bool m_destroyed = false;
@ -26,6 +27,7 @@ struct DeferredWindowEvents : public boo::IWindowCallback
std::unique_lock<std::mutex> lk(m_mt); std::unique_lock<std::mutex> lk(m_mt);
m_latestResize = rect; m_latestResize = rect;
m_hasResize = true; m_hasResize = true;
m_resizeCv.wait_for(lk, std::chrono::milliseconds(500));
} }
struct Command struct Command

View File

@ -23,7 +23,6 @@ void RootView::destroyed()
void RootView::resized(const boo::SWindowRect& root, const boo::SWindowRect&) void RootView::resized(const boo::SWindowRect& root, const boo::SWindowRect&)
{ {
boo::SWindowRect old = m_rootRect;
m_rootRect = root; m_rootRect = root;
m_rootRect.location[0] = 0; m_rootRect.location[0] = 0;
m_rootRect.location[1] = 0; m_rootRect.location[1] = 0;
@ -32,8 +31,7 @@ void RootView::resized(const boo::SWindowRect& root, const boo::SWindowRect&)
m_view->resized(m_rootRect, m_rootRect); m_view->resized(m_rootRect, m_rootRect);
if (m_tooltip) if (m_tooltip)
m_tooltip->resized(m_rootRect, m_rootRect); m_tooltip->resized(m_rootRect, m_rootRect);
if (old != m_rootRect) m_resizeRTDirty = true;
m_resizeRTDirty = true;
} }
void RootView::mouseDown(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mods) void RootView::mouseDown(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mods)
@ -182,6 +180,7 @@ void RootView::draw(boo::IGraphicsCommandQueue* gfxQ)
{ {
gfxQ->resizeRenderTexture(m_renderTex, m_rootRect.size[0], m_rootRect.size[1]); gfxQ->resizeRenderTexture(m_renderTex, m_rootRect.size[0], m_rootRect.size[1]);
m_resizeRTDirty = false; m_resizeRTDirty = false;
gfxQ->schedulePostFrameHandler([&](){m_events.m_resizeCv.notify_one();});
} }
gfxQ->setRenderTarget(m_renderTex); gfxQ->setRenderTarget(m_renderTex);
gfxQ->setViewport(m_rootRect); gfxQ->setViewport(m_rootRect);