<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-06-30 20:11 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">2016-06-30 15:05 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div>2016-06-30 14:31 GMT+02:00  <span dir="ltr"><<a href="mailto:clinton@elemtech.com" target="_blank">clinton@elemtech.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr"><br>
On Jun 30, 2016 1:19 AM, Elvis Stansvik <<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>> wrote:<br>
><br>
> 2016-06-29 22:52 GMT+02:00 <<a href="mailto:clinton@elemtech.com" target="_blank">clinton@elemtech.com</a>>:<br>
>><br>
>><br>
>><br>
>> ----- On Jun 29, 2016, at 10:45 AM, Elvis Stansvik <<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>> wrote:<br>
>>><br>
>>><br>
>>> Den 29 juni 2016 6:07 em skrev "Shawn Waldon" <<a href="mailto:shawn.waldon@kitware.com" target="_blank">shawn.waldon@kitware.com</a>>:<br>
>>> >><br>
>>> >><br>
>>> >> I see, I may have misunderstood the role of QVTKWidget2 is vs QVTKWidget. I thought QVTKWidget2 was essentially a newer replacement for QVTKWidget, and to be preferred in new code.<br>
>>> >><br>
>>> >> I've also misunderstood a little how the two widgets work. I knew QVTKWidget2 makes use of the deprecated QGLWidget (and was in fact trying to make a similar Python class just recently, which uses QOpenGLWidget, but ran into some problems). But I also wrongly thought that QVTKWidget used QGLWidget, looking at the code I see now that it doesn't.<br>
>>> >><br>
>>> >> So in short: I have no great need for QVTKWidget2, functionality-wise. So if using it precludes using the OpenGL2 backend, I'll use QVTKWidget instead.<br>
>>> >><br>
>>> >> One thing I did like was that the code in QVTKWidget2 looked a little simpler/cleaner than the one QVTKWidget. It's always nice to be able to quickly check how something work.<br>
>>> >><br>
>>> >> An officially supported widget, based on QOpenGLWidget and supporting the OpenGL2 backend, would be the absolutely best of course. In fact, there's an answer on StackOverflow where a user posted his QVTKWidget2 hacked to work with QOpenGLWidget [1], perhaps it could be used as a starting point?<br>
>>> ><br>
>>> ><br>
>>> > So just to throw this out there, here is the situation as I understand it.  Ben (cc'd) can correct what I get wrong since he was one of the last to touch QVTKWidget2.<br>
>>> ><br>
>>> > QVTKWidget works fine with OpenGL2 if you are building against Qt4.  But when you build for Qt5 there are issues with creating the OpenGL context and letting Qt know the context is there and so some features of the OpenGL2 backend don't work right.<br>
>>><br>
>>> Do you know which features and if this is being worked out?<br>
>><br>
>><br>
>> I'm aware of some issues, and have looked briefly at Linux specific issues.<br>
>> For instance, QVTKWidget::x11_setup_window is disabled for Qt5 and there has not been a replacement for that yet.<br>
><br>
><br>
> Alright, good to know, thanks.<br>
>  <br>
>><br>
>><br>
>> One possible workaround is to do something like the following in your main() before the QApplication is constructed.<br>
>><br></p></span></blockquote></div></div></div></div></div></blockquote><div><br></div></span><div>Here's my experience with these flags after testing a little with QVTKWidget + Qt5 + OpenGL2 backend: <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>>     QSurfaceFormat fmt;<br>
>><br>
>>     fmt.setDepthBufferSize(8);<br></p></span></blockquote></div></div></div></div></div></blockquote><div>I haven't found a need for this one yet. <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>><br>
>>     fmt.setSamples(1);<br></p></span></blockquote></div></div></div></div></div></blockquote><div>This one I changed to 8, to get anti-aliased output. But it's nice to know that I now have a place to control it.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>><br>
>>     fmt.setAlphaBufferSize(8);<br></p></span></blockquote></div></div></div></div></div></blockquote><div>Haven't found a need for this one yet either.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>><br>
>>     fmt.setStereo(1);<br></p></span></blockquote></div></div></div></div></div></blockquote><div>I don't have a need for stereo rendering I think, and on my old Sandybridge (HD 3000 graphics) laptop at work I got a segfault when winId was called by QVTKWidget to configure the render window:<br></div></div></div></div></blockquote><div><br></div><div>Sorry I should have been clearer: I got the below segfault when I ran with setStereo(1).<br><br></div><div>Elvis<br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br> (gdb) bt<br>#0  0x00007fffb9436119 in ?? () from /usr/lib/qt/plugins/xcbglintegrations/libqxcb-glx-integration.so<br>#1  0x00007fffbba09726 in QXcbWindow::create() () from /usr/lib/libQt5XcbQpa.so.5<br>#2  0x00007fffbb9f5da0 in QXcbIntegration::createPlatformWindow(QWindow*) const () from /usr/lib/libQt5XcbQpa.so.5<br>#3  0x00007fffe53c6d39 in QWindowPrivate::create(bool) () from /usr/lib/libQt5Gui.so.5<br>#4  0x00007fffe5b89ba3 in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#5  0x00007fffe5b893ad in QWidget::create(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#6  0x00007fffe5b897ac in QWidgetPrivate::createWinId() () from /usr/lib/libQt5Widgets.so.5<br>#7  0x00007fffe5b89819 in QWidget::winId() const () from /usr/lib/libQt5Widgets.so.5<br>#8  0x00007fffe5b899a8 in ?? () from /usr/lib/libQt5Widgets.so.5<br>#9  0x00007fffe5b89bf8 in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#10 0x00007fffe5b893ad in QWidget::create(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#11 0x00007fffe5b897ac in QWidgetPrivate::createWinId() () from /usr/lib/libQt5Widgets.so.5<br>#12 0x00007fffe5b89819 in QWidget::winId() const () from /usr/lib/libQt5Widgets.so.5<br>#13 0x00007fffe5b899a8 in ?? () from /usr/lib/libQt5Widgets.so.5<br>#14 0x00007fffe5b89bf8 in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#15 0x00007fffe5b893ad in QWidget::create(unsigned long long, bool, bool) () from /usr/lib/libQt5Widgets.so.5<br>#16 0x00007fffe5b896c8 in QWidgetPrivate::createWinId() () from /usr/lib/libQt5Widgets.so.5<br>#17 0x00007fffe5b896c8 in QWidgetPrivate::createWinId() () from /usr/lib/libQt5Widgets.so.5<br>#18 0x00007fffe5b89819 in QWidget::winId() const () from /usr/lib/libQt5Widgets.so.5<br>#19 0x00007fffe64b958b in QVTKWidget::SetRenderWindow(vtkRenderWindow*) () from /usr/lib/libvtkGUISupportQt.so.1<br>#20 0x00007fffe64b87e0 in QVTKWidget::GetRenderWindow() () from /usr/lib/libvtkGUISupportQt.so.1<br>#21 0x00000000004069f9 in SampleWidget::SampleWidget(QWidget*, QFlags<Qt::WindowType>) ()<br>#22 0x0000000000406040 in Ui_MainWindow::setupUi(QMainWindow*) ()<br>#23 0x00000000004058f9 in MainWindow::MainWindow(QWidget*) ()<br>#24 0x000000000040569f in main ()<br>(gdb)<br><br></div><div>On my newer Haswell (HD 4400) laptop at work it worked without problems. I don't know if this is a Qt bug, or just a limitation of the weak graphics in my home laptop, or something else.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>><br>
>>     fmt.setStencilBufferSize(8);<br></p></span></blockquote></div></div></div></div></div></blockquote><div>This one indeed made a difference, because without it I got weird rendering with the poly cylinder I was testing with: It was as if you could see "into" the cylinder.<br><br></div><div>I also noticed I could do<br><br>    auto window = windowHandle();<br><br>    if (window) {<br>        QSurfaceFormat surfaceFormat = window->format();<br>        surfaceFormat.setDepthBufferSize(8);<br>        surfaceFormat.setSamples(8);<br>        surfaceFormat.setAlphaBufferSize(8);<br>        surfaceFormat.setStencilBufferSize(8);<br>        surfaceFormat.setStereo(1);<br>        window->setFormat(surfaceFormat);<br>    } else {<br>        qWarning("Can't set surface format: No associated QWindow");<br>    }<br><br></div><div>in the constructor of my QVTKWidget base class, instead of setting the default surface format before the QApplication is constructed.<span class="HOEnZb"><font color="#888888"><br><br></font></span></div><span class="HOEnZb"><font color="#888888"><div>Elvis<br><br></div></font></span><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><p dir="ltr">
>>     QSurfaceFormat::setDefaultFormat(fmt);<br>
>><br>
>><br>
><br>
> Hm, but isn't QSurfaceFormat only about the context set up by the new (or well, somewhat new) QOpenGLWidget? If you mean you are using a context from QGLWidget (through QVTKWidget2), then shouldn't QGLFormat be used instead?</p>
</span><p dir="ltr">QSurfaceFormat is about creating a QWindow (this corresponds to an x11 window created by xcb_create_window) that supports the requested features.  Setting the default surface format fixes what looked like a broken depth buffer under some combinations of xserver settings and opengl drivers.  Getting a good QWindow is needed for QVTKWidget.</p>
<p dir="ltr">That setup is in addition to setting a format for an opengl context.</p></blockquote></div></div><div>Aha, thanks for clarifying. I had missed that QSurfaceFormat has this broader purpose. <br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span>
<p dir="ltr">><br>
>><br>
>> It does fix some issues I'm able to replicate with the OpenGL backend.<br>
>> For OpenGL2 backend, and possibly applicable to any platform, perhaps you could try adding a<br>
>><br>
>>     fmt.setMajorVersion(3);<br>
>><br>
>>     fmt.setMajorVersion(2);<br>
><br>
><br>
> Yes, this is what I did (and also fmt.setProfile(QSurfaceFormat.CompatibilityProfile) when experimenting with trying to get a QOpenGLWidget-backed widget working from Python (á la <a href="http://stackoverflow.com/questions/26944831/using-qvtkwidget-and-qopenglwidget-in-the-same-ui/26946040#26946040" target="_blank">http://stackoverflow.com/questions/26944831/using-qvtkwidget-and-qopenglwidget-in-the-same-ui/26946040#26946040</a>), in order for VTK to accept the context.<br>
>  <br>
>><br>
>> However, that may not be necessary because in the case of QVTKWidget, VTK is creating OpenGL contexts, not Qt.<br>
><br>
><br>
> Right, that's what I also found out when looking at the code.<br>
>  <br>
>><br>
>><br>
>> I do not yet see a way for that information to be passed from vtkRenderWindow to QVTKWidget and down to Qt after the QApplication has been constructed.<br>
><br>
><br>
> With "that information", do you mean information about what OpenGL version the render needs? No I guess not, I guess you just have to target a certain VTK version and use fixed numbers in the calls to .setMajor/MinorVersion.<br>
><br>
> But, like you say, with QVTKWidget, VTK is creating the OpenGL context, so there's nothing to .setMajorMinor/Version on, or am I missing something?<br>
>  <br>
>><br>
>> Anyway, perhaps these workarounds will help.<br>
><br>
><br>
> I'm not sure, if QSurfaceFormat is only for QOpenGLWidget, I would have to have a working QOpenGLWidget-based VTK widget first. But it was interesting that you set the depth/alpha/stencil buffers as well, since I only used it to set the number of samples when I experimented with QOpenGLWidget. Perhaps I should give it a try again.<br>
></p>
</span><p dir="ltr">In the implementation for QOpenGLWidget, they may extract a QSurfaceFormat from the QGLFormat you give.  So, it's possible It may not change anything.<br></p></blockquote></span><div>Yea, I guess it might. <br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><p dir="ltr"></p><span>
<p dir="ltr">> In the end, I would still be very interested to hear if anyone knows what would be the best backend + VTK widget to use given the hardware I need to support.<br>
></p>
</span><p dir="ltr">I don't have enough experience with some of those combinations to give a suggestion.</p></blockquote></span><div>Alright, I guess the best thing is to just try. <br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<p dir="ltr">My hope with the QSurfaceFormat suggestion is to give you a better working Qt5 + QVTKWidget + OpenGL/OpenGL2 combination due to a bit of un-ported code.</p></blockquote></span><div>Yep, thanks a lot, I'll have to do some tests.<br><br></div><div>Elvis<br> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<p dir="ltr">Clint</p>
</blockquote></div><br></div></div>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>