mirror of https://github.com/mosra/magnum.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
6.2 KiB
147 lines
6.2 KiB
/* |
|
This file is part of Magnum. |
|
|
|
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 |
|
Vladimír Vondruš <mosra@centrum.cz> |
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a |
|
copy of this software and associated documentation files (the "Software"), |
|
to deal in the Software without restriction, including without limitation |
|
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
|
and/or sell copies of the Software, and to permit persons to whom the |
|
Software is furnished to do so, subject to the following conditions: |
|
|
|
The above copyright notice and this permission notice shall be included |
|
in all copies or substantial portions of the Software. |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
DEALINGS IN THE SOFTWARE. |
|
*/ |
|
|
|
namespace Magnum { |
|
|
|
/** @page platforms-html5 HTML5 and WebGL |
|
@brief Building, testing and deploying HTML5 and WebGL projects |
|
|
|
@tableofcontents |
|
@m_footernavigation |
|
|
|
@todoc move stuff from Sdl2App and WindowlessEglApp |
|
@todoc explain the css and js file, command-line args |
|
@todoc testing, gl tests, coverage, travis setup |
|
@todoc static plugins |
|
|
|
The following guide explains basic workflow of using |
|
[Emscripten](http://kripken.github.io/emscripten-site/) for deploying HTML5 |
|
apps using WebGL. |
|
|
|
See also @ref Platform::Sdl2Application for more information. |
|
|
|
@section platforms-html5-webgl Differences between WebGL and OpenGL ES |
|
|
|
WebGL is subset of OpenGL ES with some specific restrictions, namely |
|
requirement for unique buffer target binding, aligned buffer offset and |
|
stride and some other restrictions. The most prominent difference is that while |
|
the following was enough on desktop: |
|
|
|
@snippet MagnumGL.cpp Buffer-webgl-nope |
|
|
|
On WebGL (even 2.0) you always have to initialize the buffers like this (and |
|
other target hints for UBOs etc.): |
|
|
|
@snippet MagnumGL.cpp Buffer-webgl |
|
|
|
See @ref GL-Buffer-webgl-restrictions "GL::Buffer", |
|
@ref GL-Mesh-webgl-restrictions "GL::Mesh", |
|
@ref GL::Texture::setSubImage() "GL::*Texture::setSubImage()", |
|
@ref GL::Mesh::addVertexBuffer(), @ref GL::Renderer::setStencilFunction(), |
|
@ref GL::Renderer::setStencilMask() and @ref GL::Renderer::setBlendFunction() |
|
documentation for more information. The corresponding sections in official |
|
WebGL specification provide even more detail: |
|
|
|
- [Differences Between WebGL and OpenGL ES 2.0](http://www.khronos.org/registry/webgl/specs/latest/1.0/#6) |
|
- [Differences Between WebGL and OpenGL ES 3.0](https://www.khronos.org/registry/webgl/specs/latest/2.0/#5) |
|
|
|
@section platforms-html5-troubleshooting Troubleshooting |
|
|
|
@subsection platforms-html5-troubleshooting-bootstrap First Emscripten run takes long or fails |
|
|
|
Emscripten downloads and builds a lot of things on first startup or after |
|
upgrade. That's expected and might take quite some time. If you are calling |
|
Emscripten through the CMake toolchain, it might be attempting to bootstrap |
|
itself multiple times, taking extreme amounts of time, or even fail during the |
|
initial CMake compiler checks for various reasons such as |
|
|
|
@code{.shell-session} |
|
File "/usr/lib/python2.7/subprocess.py", line 1025, in _execute_child |
|
raise child_exception |
|
OSError: [Errno 13] Permission denied |
|
@endcode |
|
|
|
The CMake toolchain might interfere with the bootstrap operation, causing it to |
|
fail. Solution is to wipe all Emscripten caches and trigger a rebuild of all |
|
needed libraries by compiling a minimal project, as shown in the shell snippet |
|
below --- enter it into the console prior to building anything else. It will |
|
take a while to download and build various system libraries and random tools. |
|
The @cb{.sh} -s WASM=1 @ce flag is needed in order to enable a rebuild of the |
|
`binaryen` tool as well: |
|
|
|
@code{.sh} |
|
cd /tmp |
|
emcc --clear-cache |
|
emcc --clear-ports |
|
echo "int main() {}" > main.cpp |
|
em++ -s WASM=1 main.cpp |
|
@endcode |
|
|
|
@subsection platforms-html5-troubleshooting-corrade-not-found CMake can't find _CORRADE_MODULE_DIR |
|
|
|
If initial CMake configuration fails with |
|
|
|
@code{.shell-session} |
|
Could NOT find Corrade (missing: _CORRADE_MODULE_DIR) |
|
@endcode |
|
|
|
The solution is to explicitly pass `CMAKE_PREFIX_PATH` pointing to directory |
|
where Corrade is installed, for example: |
|
|
|
@code{.sh} |
|
mkdir build-emscripten && cd build-emscripte |
|
cmake .. \ |
|
-DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/Emscripten-wasm.cmake \ |
|
-DCMAKE_PREFIX_PATH=/usr/lib/emscripten/system/ \ |
|
-G Ninja |
|
@endcode |
|
|
|
@subsection platforms-html5-troubleshooting-loading-failed Application fails to load |
|
|
|
Depending on what's the exact error printed in the browser console, the |
|
following scenarios are possible: |
|
|
|
- By default, the size of Emscripten heap is restricted to 16 MB. That might |
|
not be enough if you have large compiled-in resources or allocate large |
|
amount of memory. This can be solved either with: |
|
- Adding `-s TOTAL_MEMORY=<bytes>` to compiler/linker flags, where |
|
<bytes> is the new heap size |
|
- Adding `-s ALLOW_MEMORY_GROWTH=1` to compiler/linker flags. This is |
|
useful in case you don't know how much memory you need in advance and |
|
[might disable some optimizations](https://kripken.github.io/emscripten-site/docs/optimizing/Optimizing-Code.html#memory-growth). |
|
- Setting `Module { TOTAL_MEMORY: <bytes>; }` in the JavaScript |
|
driver file |
|
- Sometimes Chromium-based browsers refuse to create WebGL context on a |
|
particular page, while on other sites it works and the same page works in |
|
other browsers such as Firefox. This can be caused by Chromium running for |
|
too long, restart it and try again. |
|
- If you compile your application with a different set of compiler / linker |
|
flags or a different Emscripten version than your dependencies, it can fail |
|
to load for a variety of random reasons. Try to rebuild everything with the |
|
same set of flags. |
|
|
|
*/ |
|
|
|
}
|
|
|