<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Hi,</p>
<p style="margin-top:0;margin-bottom:0">Thanks for the tips, <span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">yeah
 This is what I tried first, but I don't see any effect whatsoever. If I read back the QSturfaceFormat, it only display the given samples but not on visual effect seen.</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><b>My log trace:</b> <span>Surface
 Format:  "Version: 3.0 Profile: No Profile Samples: 8 Depth: 24 Alpha: 8 Red: 8 Green: 8 Blue: 8"</span></span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span><br>
</span></span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span>What I see:</span></span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span><img size="1853" contenttype="image/png" id="img282194" tabindex="0" style="max-width: 99.9%; user-select: none;" data-outlook-trace="F:1|T:1" src="cid:1d4223bd-1ece-45ce-8476-7a7ce36bea4d"><br>
</span></span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span>There is no difference
 between 0, 2, 4, 8 except the print QSurfaceFormat reported value. Is there anything else I should check? Is OpenGL used at all?</span></span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"> </span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"></p>
<div>#include <QGuiApplication></div>
<div>#include <QQmlApplicationEngine></div>
<div>#include <QSurfaceFormat></div>
<div>#include <QWindow></div>
<div>#include <QQuickWindow></div>
<div>#include <QOpenGLContext></div>
<div>#include <QDebug></div>
<div>#include <QStringList></div>
<div>#include <algorithm></div>
<div><br>
</div>
<div>#define NB_AA_SAMPLE 8</div>
<div><br>
</div>
<div>void PrintSurfaceFormat(QSurfaceFormat& format)</div>
<div>{</div>
<div>    QStringList info;</div>
<div>    info</div>
<div>        << QString("Version: %1.%2").arg(format.version().first).arg(format.version().second)</div>
<div>        << QString("Profile: %1").arg(format.profile() == QSurfaceFormat::CoreProfile</div>
<div>                                        ? "Core"</div>
<div>                                        : format.profile() == QSurfaceFormat::CompatibilityProfile</div>
<div>                                            ? "Compatibility"</div>
<div>                                            : "No Profile")</div>
<div>        << QString("Samples: %1").arg(format.samples())</div>
<div>        << QString("Depth: %1").arg(format.depthBufferSize())</div>
<div>        << QString("Alpha: %1").arg(format.alphaBufferSize())</div>
<div>        << QString("Red: %1").arg(format.redBufferSize())</div>
<div>        << QString("Green: %1").arg(format.greenBufferSize())</div>
<div>        << QString("Blue: %1").arg(format.blueBufferSize())</div>
<div>    ;</div>
<div>    qDebug() << "Surface Format: " << info.join(" ");</div>
<div>}</div>
<div><br>
</div>
<div>void CheckOpenGLContext(QOpenGLContext* ogl_contex)</div>
<div>{</div>
<div>    QSurfaceFormat surface_format = ogl_contex->format();</div>
<div>    PrintSurfaceFormat(surface_format);</div>
<div>    if(surface_format.samples() != NB_AA_SAMPLE)</div>
<div>    {</div>
<div>        qWarning("AA sample rate not supported on this machine.");</div>
<div>    }</div>
<div>}</div>
<div><br>
</div>
<div>void CheckOGL(QGuiApplication& app)</div>
<div>{</div>
<div>    QList<QWindow*> windows = app.topLevelWindows();</div>
<div>    std::any_of(windows.begin(), windows.end(), [&](QWindow* w)</div>
<div>    {</div>
<div>        QQuickWindow* window = qobject_cast<QQuickWindow*>(w);</div>
<div>        if(window != nullptr)</div>
<div>        {</div>
<div>            QObject::connect(window, &QQuickWindow::openglContextCreated, [&](QOpenGLContext* ogl_ctx){ CheckOpenGLContext(ogl_ctx); });</div>
<div>            QOpenGLContext* ogl_context = window->openglContext();</div>
<div>            if(ogl_context != nullptr)</div>
<div>            {</div>
<div>                CheckOpenGLContext(ogl_context);</div>
<div>            }</div>
<div>            return true;</div>
<div>        }</div>
<div>        return false;</div>
<div>    });</div>
<div>}</div>
<div><br>
</div>
<div>void EnableDefaultAA()</div>
<div>{</div>
<div>    QSurfaceFormat surface_format = QSurfaceFormat::defaultFormat();</div>
<div>    surface_format.setSamples(NB_AA_SAMPLE);</div>
<div>    QSurfaceFormat::setDefaultFormat(surface_format);</div>
<div>}</div>
<div><br>
</div>
<div>int main(int argc, char *argv[])</div>
<div>{</div>
<div>    EnableDefaultAA();</div>
<div><br>
</div>
<div>    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);</div>
<div>    QGuiApplication app(argc, argv);</div>
<div><br>
</div>
<div>    QQmlApplicationEngine engine;</div>
<div>    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));</div>
<div>    if (engine.rootObjects().isEmpty())</div>
<div>        return -1;</div>
<div><br>
</div>
<div>    CheckOGL(app);</div>
<div><br>
</div>
<div>    return app.exec();</div>
<div>}</div>
<div><br>
</div>
<br>
</span>
<p></p>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Interest <interest-bounces@qt-project.org> on behalf of Giuseppe D'Angelo via Interest <interest@qt-project.org><br>
<b>Sent:</b> Monday, January 14, 2019 6:37 PM<br>
<b>To:</b> interest@qt-project.org<br>
<b>Subject:</b> Re: [Interest] QQmlApplicationEngine and antialiasing</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">On 14/01/2019 22:10, Jérôme Godbout wrote:<br>
> Hi,<br>
> <br>
> I'm trying to enable the antialiasing inside my project that use <br>
> QQmlApplicationEngine (currently under Linux). I have some QMl Shape  <br>
> that look ugly and the antialiasing doesn't seem to work at all. What is <br>
> the proper way to enable the AA that is cross platform and will work on <br>
> both QtCreator debug and release mode?<br>
<br>
Note that debug/release mode has nothing to do with this...<br>
<br>
Assuming that you're using the OpenGL backend:<br>
<br>
> I have try to enable the default surface at the very beginning of the <br>
> main, after the application is created or even on the QWindow surface, <br>
> but nothing seem to work:<br>
> <br>
> #include <QGuiApplication><br>
> #include <QQmlApplicationEngine><br>
> #include <QSurfaceFormat><br>
> #include <QQuickWindow><br>
> #include <QOpenGLContext><br>
> <br>
> #define NB_AA_SAMPLE 8<br>
> <br>
> void EnableAntialiasingOnEngine(QGuiApplication& app)<br>
> {<br>
>      QWindow* window = app.topLevelWindows().first();<br>
>      QSurfaceFormat surface_format; // = window->format();<br>
>      surface_format.setSamples(NB_AA_SAMPLE); // AA sampling<br>
>      window->setFormat(surface_format);<br>
> }<br>
<br>
This is meaningless; you need to set the format on the window AND the <br>
context and you need to do so before they're created (in the sense of <br>
calling create() on them). In other words, this is incomplete and too late.<br>
<br>
> void EnableAA()<br>
> {<br>
>      QOpenGLContext ogl_context;<br>
>      QSurfaceFormat surface_format;<br>
>      surface_format.setSamples(NB_AA_SAMPLE);<br>
>      ogl_context.setFormat(surface_format);<br>
>      if(!ogl_context.create())<br>
>      {<br>
>          qWarning("Cannot create OpenGL context for AA.");<br>
>      }<br>
> }<br>
<br>
This might be useful as a check that you CAN create an OpenGL context <br>
that supports MSAA. But note that the mere creation isn't enough, you <br>
need to get the format back from the created context (context.format()) <br>
and check *that*.<br>
<br>
<br>
> void EnableDefaultAA()<br>
> {<br>
>      QSurfaceFormat surface_format = QSurfaceFormat::defaultFormat();<br>
>      surface_format.setSamples(NB_AA_SAMPLE); // AA sampling<br>
>      QSurfaceFormat::setDefaultFormat(surface_format);<br>
> }<br>
<br>
This is the correct way and should work, given you call this before <br>
creating QGuiApplication. If the result is still aliased, grab the root <br>
object, downcast it (it's going to be some QQuickWindow subclass), get <br>
its OpenGL context after it has been created (openglContext(), or <br>
connect to openglContextCreated()), and dump its format. Thus double <br>
checking that your implementation DOES support multisampling...<br>
<br>
My 2 c,<br>
-- <br>
Giuseppe D'Angelo | giuseppe.dangelo@kdab.com | Senior Software Engineer<br>
KDAB (France) S.A.S., a KDAB Group company<br>
Tel. France +33 (0)4 90 84 08 53, <a href="http://www.kdab.com" id="LPlnk968717" class="OWAAutoLink" previewremoved="true">
http://www.kdab.com</a><br>
KDAB - The Qt, C++ and OpenGL Experts<br>
<br>
</div>
</span></font></div>
</div>
</div>
</body>
</html>