Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'qt/draw_widget.hpp')
-rw-r--r--qt/draw_widget.hpp46
1 files changed, 39 insertions, 7 deletions
diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp
index 1cc6ecb999..3036c7d395 100644
--- a/qt/draw_widget.hpp
+++ b/qt/draw_widget.hpp
@@ -9,18 +9,20 @@
#include "drape_frontend/drape_engine.hpp"
#include "std/unique_ptr.hpp"
+#include "std/mutex.hpp"
+#include "std/condition_variable.hpp"
-#include <QtGui/QWindow>
+#include <QtGui/QOpenGLWindow>
namespace qt
{
class QScaleSlider;
- class DrawWidget : public QWindow
+ class DrawWidget : public QOpenGLWindow
{
- typedef QWindow TBase;
+ using TBase = QOpenGLWindow;
- drape_ptr<dp::OGLContextFactory> m_contextFactory;
+ drape_ptr<QtOGLContextFactory> m_contextFactory;
unique_ptr<Framework> m_framework;
qreal m_ratio;
@@ -67,9 +69,13 @@ namespace qt
void CreateEngine();
protected:
- /// @name Overriden from QWidget.
+ /// @name Overriden from QOpenGLWindow.
//@{
- void exposeEvent(QExposeEvent * e) override;
+ void initializeGL() override;
+ void resizeGL(int width, int height) override;
+ void paintGL() override;
+
+ void exposeEvent(QExposeEvent * event);
void mousePressEvent(QMouseEvent * e) override;
void mouseDoubleClickEvent(QMouseEvent * e) override;
void mouseMoveEvent(QMouseEvent * e) override;
@@ -79,7 +85,33 @@ namespace qt
void keyReleaseEvent(QKeyEvent * e) override;
//@}
- Q_SLOT void sizeChanged(int);
+ private:
+ enum RenderingState
+ {
+ NotInitialized,
+ WaitContext,
+ WaitSwap,
+ Render,
+ };
+
+ void CallSwap();
+ void CallRegisterThread(QThread * thread);
+ Q_SIGNAL void Swap();
+ Q_SIGNAL void RegRenderingThread(QThread * thread);
+ Q_SLOT void OnSwap();
+ Q_SLOT void OnRegRenderingThread(QThread * thread);
+ Q_SLOT void frameSwappedSlot(RenderingState state = Render);
+
+ void MoveContextToRenderThread();
+ QThread * m_rendererThread;
+
+ mutex m_swapMutex;
+ condition_variable m_swapCond;
+
+ mutex m_waitContextMutex;
+ condition_variable m_waitContextCond;
+
+ RenderingState m_state;
private:
void SubmitFakeLocationPoint(m2::PointD const & pt);