9#include <emscripten/bind.h>
10#include <emscripten/val.h>
13void qtDoNothing(emscripten::val) { }
18 function(
"qtDoNothing", &qtDoNothing);
41 destroyWebGLContext(m_ownedWebGLContext.handle);
50 return ((
format.majorVersion() == 2 &&
format.minorVersion() == 0) ||
51 (
format.majorVersion() == 3 &&
format.minorVersion() == 0));
54EMSCRIPTEN_WEBGL_CONTEXT_HANDLE
57 if (m_ownedWebGLContext.surface == surface)
58 return m_ownedWebGLContext.handle;
61 if (
const auto *shareContext = m_qGlContext->
shareContext()) {
66 ->m_ownedWebGLContext.handle;
71 if (m_ownedWebGLContext.handle)
72 return m_ownedWebGLContext.handle;
78 .handle = createEmscriptenContext(
81 return m_ownedWebGLContext.handle;
84 destroyWebGLContext(m_ownedWebGLContext.handle);
89 .handle = createEmscriptenContext(
static_cast<QWasmWindow *
>(surface)->canvasSelector(),
93 return m_ownedWebGLContext.handle;
97void QWasmOpenGLContext::destroyWebGLContext(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE contextHandle)
101 emscripten::val jsEvents = emscripten::val::module_property(
"JSEvents");
102 emscripten::val savedRemoveAllHandlersOnTargetFunction = jsEvents[
"removeAllHandlersOnTarget"];
103 jsEvents.set(
"removeAllHandlersOnTarget", emscripten::val::module_property(
"qtDoNothing"));
104 emscripten_webgl_destroy_context(contextHandle);
105 jsEvents.set(
"removeAllHandlersOnTarget", savedRemoveAllHandlersOnTargetFunction);
108EMSCRIPTEN_WEBGL_CONTEXT_HANDLE
109QWasmOpenGLContext::createEmscriptenContext(
const std::string &canvasSelector,
112 EmscriptenWebGLContextAttributes attributes;
113 emscripten_webgl_init_context_attributes(&attributes);
115 attributes.powerPreference = EM_WEBGL_POWER_PREFERENCE_HIGH_PERFORMANCE;
116 attributes.failIfMajorPerformanceCaveat =
false;
117 attributes.antialias =
true;
118 attributes.enableExtensionsByDefault =
true;
119 attributes.majorVersion =
format.majorVersion() - 1;
120 attributes.minorVersion =
format.minorVersion();
124 const bool useDepthStencil = (
format.depthBufferSize() > 0 ||
format.stencilBufferSize() > 0);
127 attributes.alpha =
format.alphaBufferSize() > 0;
128 attributes.depth = useDepthStencil;
129 attributes.stencil = useDepthStencil;
131 return emscripten_webgl_create_context(canvasSelector.c_str(), &attributes);
136 return m_requestedFormat;
146 const auto context = obtainEmscriptenContext(surface);
150 m_usedWebGLContextHandle =
context;
152 return emscripten_webgl_make_context_current(
context) == EMSCRIPTEN_RESULT_SUCCESS;
173 if (!isOpenGLVersionSupported(m_requestedFormat))
178 return !m_usedWebGLContextHandle || !emscripten_is_webgl_context_lost(m_usedWebGLContextHandle);
183 return reinterpret_cast<QFunctionPointer
>(eglGetProcAddress(procName));
QOpenGLContext * shareContext() const
Returns the share context this context was created with.
QOpenGLContext * context() const
virtual GLuint defaultFramebufferObject(QPlatformSurface *surface) const
Reimplement in subclass if your platform uses framebuffer objects for surfaces.
SurfaceClass surfaceClass() const
Returns the surface class of this surface.
bool isSharing() const override
bool isValid() const override
void doneCurrent() override
void swapBuffers(QPlatformSurface *surface) override
Reimplement in subclass to native swap buffers calls.
bool makeCurrent(QPlatformSurface *surface) override
QSurfaceFormat format() const override
QFunctionPointer getProcAddress(const char *procName) override
Reimplement in subclass to allow dynamic querying of OpenGL symbols.
QWasmOpenGLContext(QOpenGLContext *context)
GLuint defaultFramebufferObject(QPlatformSurface *surface) const override
Reimplement in subclass if your platform uses framebuffer objects for surfaces.
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
GLint GLsizei GLsizei GLenum format
EMSCRIPTEN_BINDINGS(qwasmopenglcontext)