Open wadetb opened 6 years ago
I had the very same thing happen to me, under (probably) different circumstances. Switching to the capture tab initializes OpenGL for the 1st time.
I'm running Orbit on a Windows Laptop (Dell XPS 13, with an Intel HD 520 graphics card) over a kind of "docking station" (Displaylink D3100), which allows me to extend the desktop, or clones the display, over to a larger screen. If I launch Orbit when using this device, I would get a failure, where a call to glGetString(GL_VERSION)
was returning "1.1" (I think), an ancient version with no capabilities.
The failure occurs here:
> glew32d.dll!glewContextInit(...) Line 16177 C Symbols loaded.
glew32d.dll!glewInit() Line 20866 C Symbols loaded.
OrbitQt.exe!GlCanvas::Initialize() Line 109 C++ Symbols loaded.
OrbitQt.exe!OrbitGLWidget::initializeGL() Line 81 C++ Symbols loaded.
Qt5Widgetsd.dll!QOpenGLWidgetPrivate::initialize() Line 804 C++ Symbols loaded.
Qt5Widgetsd.dll!QOpenGLWidget::resizeEvent(QResizeEvent * e) Line 1178 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::event(QEvent * event) Line 8942 C++ Symbols loaded.
Qt5Widgetsd.dll!QOpenGLWidget::event(QEvent * e) Line 1351 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 3745 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 3708 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 988 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::sendEvent(QObject * receiver, QEvent * event) Line 231 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetPrivate::sendPendingMoveAndResizeEvents(bool recursive, bool disableUpdates) Line 7809 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetPrivate::show_helper() Line 7862 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::setVisible(bool visible) Line 8216 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::show() Line 7767 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetPrivate::showChildren(bool spontaneous) Line 8299 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetPrivate::show_helper() Line 7869 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::setVisible(bool visible) Line 8216 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::show() Line 7767 C++ Symbols loaded.
Qt5Widgetsd.dll!QStackedLayout::setCurrentIndex(int index) Line 326 C++ Symbols loaded.
Qt5Widgetsd.dll!QStackedWidget::setCurrentIndex(int index) Line 217 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabWidgetPrivate::_q_showTab(int index) Line 745 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabWidget::qt_static_metacall(QObject * _o, QMetaObject::Call _c, int _id, void * * _a) Line 176 C++ Symbols loaded.
Qt5Cored.dll!QMetaObject::activate(QObject * sender, int signalOffset, int local_signal_index, void * * argv) Line 3742 C++ Symbols loaded.
Qt5Cored.dll!QMetaObject::activate(QObject * sender, const QMetaObject * m, int local_signal_index, void * * argv) Line 3603 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabBar::currentChanged(int _t1) Line 335 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabBar::setCurrentIndex(int index) Line 1348 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabBar::mousePressEvent(QMouseEvent * event) Line 1939 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidget::event(QEvent * event) Line 8777 C++ Symbols loaded.
Qt5Widgetsd.dll!QTabBar::event(QEvent * event) Line 1664 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 3745 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 3219 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 988 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver, QEvent * event) Line 234 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplicationPrivate::sendMouseEvent(QWidget * receiver, QMouseEvent * event, QWidget * alienWidget, QWidget * nativeWidget, QWidget * * buttonDown, QPointer<QWidget> & lastMouseReceiver, bool spontaneous) Line 2713 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetWindow::handleMouseEvent(QMouseEvent * event) Line 618 C++ Symbols loaded.
Qt5Widgetsd.dll!QWidgetWindow::event(QEvent * event) Line 240 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 3745 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 3105 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 988 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver, QEvent * event) Line 234 C++ Symbols loaded.
Qt5Guid.dll!QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent * e) Line 1928 C++ Symbols loaded.
Qt5Guid.dll!QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent * e) Line 1712 C++ Symbols loaded.
Qt5Guid.dll!QWindowSystemInterface::sendWindowSystemEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 716 C++ Symbols loaded.
qwindowsd.dll!QWindowsGuiEventDispatcher::sendPostedEvents() Line 83 C++ Symbols loaded.
Qt5Cored.dll!qt_internal_proc(HWND__ * hwnd, unsigned int message, unsigned __int64 wp, __int64 lp) Line 223 C++ Symbols loaded.
[External Code] Annotated Frame
Qt5Cored.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 613 C++ Symbols loaded.
qwindowsd.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 74 C++ Symbols loaded.
Qt5Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 135 C++ Symbols loaded.
Qt5Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 212 C++ Symbols loaded.
Qt5Cored.dll!QCoreApplication::exec() Line 1261 C++ Symbols loaded.
Qt5Guid.dll!QGuiApplication::exec() Line 1658 C++ Symbols loaded.
Qt5Widgetsd.dll!QApplication::exec() Line 2922 C++ Symbols loaded.
OrbitQt.exe!main(int argc, char * * argv) Line 49 C++ Symbols loaded.
[External Code] Annotated Frame
So it turns out that the Dell version of Intel drivers lag behind the Intel versions, and upgrading them yielded better results. The call to getString now returns "4.5.0 - Build 22.20.16.4815", but unfortunately, this doesn't entirely resolve my problem (but that is another matter).
Check your display drivers, and try to run the glew utilities (glewinfo and visualinfo).
I can confirm that the VM's OpenGL capabilities are limited to OpenGL 1.1. Does Qt provide a software renderer that can be used in these circumstances?
From the docs:
The Qt OpenGL module is implemented as a platform-independent Qt/C++ wrapper around the platform-dependent GLX (version 1.3 or later), WGL, or AGL C APIs. Although the basic functionality provided is very similar to Mark Kilgard's GLUT library, applications using the Qt OpenGL module can take advantage of the whole Qt API for non-OpenGL-specific GUI functionality.
So it's just a wrapper. Glew will not initialize (within your virtualized environment) without greater capabilities.
It looks like RemoteFX vGPU would be required, and that might require a Windows Server (not just Professional)... though I'm going out on a limb here...
As a workaround, you could consider the following: Orbit can be used to profile a process running on another machine. (I have never tried it in a VM but it should work). The matching .pdb files need to be accessible from the Host machine for Orbit to run properly. Make sure you add the proper directories in OrbitProfiler\config\Symbols.txt so that Orbit knows where to find symbols. Orbit will make sure that the symbols on the host match the modules on the target machine.
On the target side, inject Orbit.dll in the target application from a temporary instance of Orbit.exe running on the target machine (Orbit needs to be installed on both machines). The host machine will run the UI version of Orbit while the target machine will use the command line version of Orbit to inject the dll into the target process. Orbit.exe will then terminate on the target machine.
On the target machine’s command line, run:
"Orbit.exe inject:MyProcess host:192.168.0.1" (with the ip of the host machine...)
Orbit will find the first process matching the name “MyProcess” and inject Orbit.dll.
Another option is to control the loading of Orbit.dll from your code. Include "Orbit.h" in your project and call OrbitAPI::Connect with the IP of the machine running the Orbit UI (a_Host) and the port to connect to (a_Port). Note that the Orbit API is header-only, simply add Orbit.h to your project, no lib required.
From Orbit.h: //----------------------------------------------------------------------------- struct OrbitAPI { static inline bool Connect( const char* a_Host, int a_Port = 1789 ); static inline bool IsConnected(); … };
Sampling profiling is disabled when remote debugging, it has not yet been implemented. It's on my todo list.
In my HyperV VM, running Windows 10 Professional as the guest OS, running Orbit and selecting the capture tab (and doing nothing else) causes Orbit to immediately exit.
The host OS is also Windows 10 professional, and running Orbit there works fine.
If you don't have access to HyperV, it might be easy to test this using a free Azure account.