OpenGL/HelloWindow example: Fix resource leaks.
Change-Id: Icf776b5581b3a632e8cef19af1059503146c158c Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
This commit is contained in:
parent
7381328bcc
commit
57f243594e
@ -59,7 +59,7 @@ Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *scree
|
|||||||
m_context->create();
|
m_context->create();
|
||||||
}
|
}
|
||||||
|
|
||||||
HelloWindow::HelloWindow(Renderer *renderer)
|
HelloWindow::HelloWindow(const QSharedPointer<Renderer> &renderer)
|
||||||
: m_colorIndex(0)
|
: m_colorIndex(0)
|
||||||
, m_renderer(renderer)
|
, m_renderer(renderer)
|
||||||
{
|
{
|
||||||
@ -73,7 +73,7 @@ HelloWindow::HelloWindow(Renderer *renderer)
|
|||||||
create();
|
create();
|
||||||
|
|
||||||
connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),
|
connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),
|
||||||
renderer, SLOT(render(QSurface *, const QColor &, const QSize &)));
|
renderer.data(), SLOT(render(QSurface *, const QColor &, const QSize &)));
|
||||||
|
|
||||||
updateColor();
|
updateColor();
|
||||||
}
|
}
|
||||||
@ -196,7 +196,7 @@ void Renderer::initialize()
|
|||||||
"}\n";
|
"}\n";
|
||||||
fshader->compileSourceCode(fsrc);
|
fshader->compileSourceCode(fsrc);
|
||||||
|
|
||||||
m_program = new QOpenGLShaderProgram;
|
m_program = new QOpenGLShaderProgram(this);
|
||||||
m_program->addShader(vshader);
|
m_program->addShader(vshader);
|
||||||
m_program->addShader(fshader);
|
m_program->addShader(fshader);
|
||||||
m_program->link();
|
m_program->link();
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QOpenGLContext;
|
class QOpenGLContext;
|
||||||
@ -88,7 +89,7 @@ class HelloWindow : public QWindow
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
HelloWindow(Renderer *renderer);
|
explicit HelloWindow(const QSharedPointer<Renderer> &renderer);
|
||||||
|
|
||||||
void updateColor();
|
void updateColor();
|
||||||
|
|
||||||
@ -105,5 +106,5 @@ private:
|
|||||||
|
|
||||||
int m_colorIndex;
|
int m_colorIndex;
|
||||||
QColor m_color;
|
QColor m_color;
|
||||||
Renderer *m_renderer;
|
const QSharedPointer<Renderer> m_renderer;
|
||||||
};
|
};
|
||||||
|
@ -66,15 +66,18 @@ int main(int argc, char **argv)
|
|||||||
QSize windowSize(400, 320);
|
QSize windowSize(400, 320);
|
||||||
int delta = 40;
|
int delta = 40;
|
||||||
|
|
||||||
Renderer *rendererA = new Renderer(format);
|
QList<QWindow *> windows;
|
||||||
|
QSharedPointer<Renderer> rendererA(new Renderer(format));
|
||||||
|
|
||||||
HelloWindow *windowA = new HelloWindow(rendererA);
|
HelloWindow *windowA = new HelloWindow(rendererA);
|
||||||
windowA->setGeometry(QRect(center, windowSize).translated(-windowSize.width() - delta / 2, 0));
|
windowA->setGeometry(QRect(center, windowSize).translated(-windowSize.width() - delta / 2, 0));
|
||||||
windowA->setWindowTitle(QLatin1String("Thread A - Context A"));
|
windowA->setWindowTitle(QLatin1String("Thread A - Context A"));
|
||||||
windowA->setVisible(true);
|
windowA->setVisible(true);
|
||||||
|
windows.prepend(windowA);
|
||||||
|
|
||||||
QList<QThread *> renderThreads;
|
QList<QThread *> renderThreads;
|
||||||
if (multipleWindows) {
|
if (multipleWindows) {
|
||||||
Renderer *rendererB = new Renderer(format, rendererA);
|
QSharedPointer<Renderer> rendererB(new Renderer(format, rendererA.data()));
|
||||||
|
|
||||||
QThread *renderThread = new QThread;
|
QThread *renderThread = new QThread;
|
||||||
rendererB->moveToThread(renderThread);
|
rendererB->moveToThread(renderThread);
|
||||||
@ -84,19 +87,21 @@ int main(int argc, char **argv)
|
|||||||
windowB->setGeometry(QRect(center, windowSize).translated(delta / 2, 0));
|
windowB->setGeometry(QRect(center, windowSize).translated(delta / 2, 0));
|
||||||
windowB->setWindowTitle(QLatin1String("Thread A - Context A"));
|
windowB->setWindowTitle(QLatin1String("Thread A - Context A"));
|
||||||
windowB->setVisible(true);
|
windowB->setVisible(true);
|
||||||
|
windows.prepend(windowB);
|
||||||
|
|
||||||
HelloWindow *windowC = new HelloWindow(rendererB);
|
HelloWindow *windowC = new HelloWindow(rendererB);
|
||||||
windowC->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, windowSize.height() + delta));
|
windowC->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, windowSize.height() + delta));
|
||||||
windowC->setWindowTitle(QLatin1String("Thread B - Context B"));
|
windowC->setWindowTitle(QLatin1String("Thread B - Context B"));
|
||||||
windowC->setVisible(true);
|
windowC->setVisible(true);
|
||||||
|
windows.prepend(windowC);
|
||||||
|
|
||||||
for (int i = 1; i < QGuiApplication::screens().size(); ++i) {
|
for (int i = 1; i < QGuiApplication::screens().size(); ++i) {
|
||||||
QScreen *screen = QGuiApplication::screens().at(i);
|
QScreen *screen = QGuiApplication::screens().at(i);
|
||||||
Renderer *renderer = new Renderer(format, rendererA, screen);
|
QSharedPointer<Renderer> renderer(new Renderer(format, rendererA.data(), screen));
|
||||||
|
|
||||||
renderThread = new QThread;
|
renderThread = new QThread;
|
||||||
renderer->moveToThread(renderThread);
|
renderer->moveToThread(renderThread);
|
||||||
renderThreads << renderThread;
|
renderThreads.prepend(renderThread);
|
||||||
|
|
||||||
QRect screenGeometry = screen->availableGeometry();
|
QRect screenGeometry = screen->availableGeometry();
|
||||||
QPoint center = screenGeometry.center();
|
QPoint center = screenGeometry.center();
|
||||||
@ -110,6 +115,7 @@ int main(int argc, char **argv)
|
|||||||
QChar id = QChar('B' + i);
|
QChar id = QChar('B' + i);
|
||||||
window->setWindowTitle(QLatin1String("Thread ") + id + QLatin1String(" - Context ") + id);
|
window->setWindowTitle(QLatin1String("Thread ") + id + QLatin1String(" - Context ") + id);
|
||||||
window->setVisible(true);
|
window->setVisible(true);
|
||||||
|
windows.prepend(window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,8 +124,12 @@ int main(int argc, char **argv)
|
|||||||
renderThreads.at(i)->start();
|
renderThreads.at(i)->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
app.exec();
|
const int exitValue = app.exec();
|
||||||
|
|
||||||
for (int i = 0; i < renderThreads.size(); ++i)
|
for (int i = 0; i < renderThreads.size(); ++i)
|
||||||
renderThreads.at(i)->wait();
|
renderThreads.at(i)->wait();
|
||||||
|
qDeleteAll(windows);
|
||||||
|
qDeleteAll(renderThreads);
|
||||||
|
|
||||||
|
return exitValue;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user