[Interest] Qt/ANGLE .NET integration stopped working between Qt 5.3 and 5.4

Eirik Ulvik eirik.ulvik at gmail.com
Tue Sep 8 13:52:02 CEST 2015


Thanks for the reply Andrew.
Seems that the problem was quite a dumb one. In 5.3 we did not need to link
against libEGL with our current project setup in Qt Creator. This changed
in 5.4 for some reason we do not quite understand. The problem was that we
were linking against a different libEGL than Qt loads thus the calls
failed. I would have expected the calls to fail in a more spectacular way,
eg. segfault, but this did not happen and it tricked us.

Regards,
Eirik Ulvik

tir. 8. sep. 2015 kl. 09.01 skrev Andrew Knight <andrew.knight at intopalo.com
>:

> Hi Eirik,
>
> On 09/07/2015 11:06 PM, Eirik Ulvik wrote:
>  > We have an integration between Qt/OpenGL using QML and .NET/WPF that
> worked fine in Qt 5.3.
>  > The integration is based on a question asked on this mailing list
> before:
> http://lists.qt-project.org/pipermail/interest/2014-January/010827.html
> and depends the fact that Qt uses ANGLE as the backend renderer.
>  >
>  > In order to show a OpenGL based rendering from Qt/C++ code in a .NET
> based WPF application we need to get the DirectX buffer pointer. It is a
> requirement that the backend rendering system is DirectX 9. I have
> managed to force Qt to use ANGLE with a DirectX 9 backend. The output
> from the QML scene graph and qt.qpa.gl <http://qt.qpa.gl/> logger:
>  >
> *snip*
>  >
>  > System info:
>  > Windows 10
>  > Installed Qt 5.4 using Visual Studio 2013 compiler.
>  >
>  > The code that used to work before is this, but now always fails:
>  >
>  > #include <d3d9.h>
>  > #include <dxgi.h>
>  > #include <libEGL/Surface.h>
>  > #if QT_VERSION >= 0x050400
>  >     #include <libGLESv2/renderer/d3d/d3d9/SwapChain9.h>
>  > #elif QT_VERSION >= 0x050300
>  >     #include <libGLESv2/renderer/d3d9/SwapChain9.h>
>  > #else
>  >     #include <libGLESv2/renderer/SwapChain9.h>
>  > #endif
>  > #include <EGL/egl.h>
>  > #include <EGL/eglext.h>
>  >
>  > IDirect3DSurface9* AngleQmlRenderSurface::getD3DSurfaceHandle()
>  > {
>  >     //Works in Qt 5.3, always NULL in Qt 5.4
>  >     EGLDisplay display = eglGetCurrentDisplay();
>  >     EGLBoolean result = eglSwapInterval(display, 0);
>  >
>  >     //Works in Qt 5.3, always NULL in Qt 5.4
>  >     EGLSurface sfc = eglGetCurrentSurface(EGL_DRAW);
>  >     egl::Surface* surface = static_cast<egl::Surface*>(sfc);
>  >     rx::SwapChain *swapChain = surface->getSwapChain();
>  >     rx::SwapChain9* swapChainD3D9 =
> dynamic_cast<rx::SwapChain9*>(swapChain);
>  >
>  >     return swapChainD3D9->getRenderTarget();
>  > }
>  >
>  > Any suggestion to what might be the problem is much appreciated.
>
> You are using private API from ANGLE to get the pointer, so there are no
> guarantees that this behavior is stable. Have you debugged into this to
> see what's going on there? What is NULL anyway - the render target, swap
> chain, or surface?
>
> Have you considered changing your rendering strategy? There are other
> ways to do D3D/OpenGL interop. ANGLE provides
> eglCreatePbufferFromClientBuffer with
> EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE
> (
> https://www.khronos.org/registry/egl/extensions/ANGLE/EGL_ANGLE_surface_d3d_texture_2d_share_handle.txt
> ),
> which allows you to pass a D3D texture to ANGLE for use as a texture
> e.g. within the Scene Graph. There are examples of its usage inside
> QtMultimedia.
>
>  >
>  > Best regards,
>  > Eirik Ulvik
>  >
>
> HTH,
> Andrew
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150908/08ec8037/attachment.html>


More information about the Interest mailing list