Browse Source

doc: more Android and platform-specific docs.

Mostly placeholders for the other platforms, will get filled
progressively.
pull/205/head
Vladimír Vondruš 8 years ago
parent
commit
cf20a4c5bb
  1. 4
      Doxyfile-mcss
  2. 106
      doc/best-practices.dox
  3. 21
      doc/building.dox
  4. 4
      doc/changelog.dox
  5. 241
      doc/platforms-android.dox
  6. 87
      doc/platforms-gl.dox
  7. 117
      doc/platforms-html5.dox
  8. 61
      doc/platforms-ios.dox
  9. 39
      doc/platforms-linux.dox
  10. 59
      doc/platforms-macos.dox
  11. 44
      doc/platforms-windows.dox
  12. 8
      doc/platforms.dox
  13. 10
      doc/snippets/Magnum.cpp
  14. 1
      doc/tips.dox
  15. 14
      src/Magnum/Buffer.h

4
Doxyfile-mcss

@ -97,8 +97,8 @@ M_PAGE_FINE_PRINT = "<p>Magnum docs. Part of the <a href="http://magnum.graphics
M_SEARCH_HELP = "Search for symbols, directories, files, pages, OpenGL/GLSL and OpenAL APIs. You can omit any prefix from the symbol or file path; adding a <code>:</code> or <code>/</code> suffix lists all members of given symbol or directory. Navigate through the list using <span class="m-label m-dim">&darr;</span> and <span class="m-label m-dim">&uarr;</span>, press <span class="m-label m-dim">Enter</span> to go."
M_LINKS_NAVBAR1 = \
"getting-started" \
"pages features example-index tips utilities"
"getting-started building cmake" \
"pages features platforms example-index tips utilities"
M_LINKS_NAVBAR2 = \
"namespaces" \
"annotated" \

106
doc/best-practices.dox

@ -1,106 +0,0 @@
/*
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 best-practices Best practices, pitfalls and platform-specific information
@brief Performance advices and solutions for platform-specific issues.
@tableofcontents
@m_footernavigation
Here is collection of carefully selected notes, links to official guidelines
and other articles with valuable information to help developers create better
applications. Feel free to add one, if it contains new unique information.
@section best-practices-gles GLES-specific
- Rendering to RGB textures doesn't work on many platforms, either due to
alignment issues or other factors. For example it is not possible to render
to @ref TextureFormat::RGB8 on iOS (but it works elsewhere); rendering to
@ref TextureFormat::RGB32F is not possible even on NVidia. Use RGBA formats
instead.
- [Writing Portable OpenGL ES 2.0](https://www.khronos.org/assets/uploads/developers/library/2011-siggraph-mobile/Writing-Portable-OpenGL-ES-2.0_Aug-11.pdf)
@section best-practices-platform Platform-specific
Some platforms need special care, see their respective sections for more
information.
@subsection best-practices-mac macOS
- @ref AbstractShaderProgram::validate() expects that the shader has a
properly configured framebuffer bound along with proper @ref Renderer
setup. That is often hard to achieve, so the function cannot be portably
used for shader validity testing.
- `GL_TIMESTAMP` used by @ref TimeQuery::timestamp() is not implemented on
macOS and gives zero results.
- [Best Practices for Working with Vertex Data](https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_vertexdata/opengl_vertexdata.html)
- [Best Practices for Working with Texture Data](https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html)
@subsection best-practices-ios iOS
- GLSL @glsl texelFetch() @ce returns zero results if you have a texture with
integer type and the filtering is not @ref Sampler::Filter::Nearest. Yes,
it shouldn't matter, but it does.
- OpenGL ES 3.0 contexts don't support rendering to 32-bit float textures.
However, it is possible to work around that issue by creating 32-bit
unsigned integer texture
- [Best Practices for Working with Vertex Data](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html)
- [Best Practices for Working with Texture Data](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesForWorkingWithTextureData/TechniquesForWorkingWithTextureData.html)
- [Best Practices for Shaders](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html#//apple_ref/doc/uid/TP40008793-CH7-SW3)
@subsection best-practices-angle ANGLE (WebGL)
- [WebGL Insights --- ANGLE](https://books.google.cz/books?id=6crECQAAQBAJ&lpg=PP1&pg=PA3&redir_esc=y#v=onepage&q&f=true)
@subsection best-practices-webgl WebGL (Emscripten)
WebGL is subset of OpenGL ES with some [specific restrictions and features](http://www.khronos.org/registry/webgl/specs/latest/1.0/#6),
namely requirement for unique buffer target binding, aligned buffer offset and
stride and some other restrictions and also support for combined depth/stencil
buffer attachments. See @ref Buffer, @ref Framebuffer,
@ref Texture::setSubImage() "*Texture::setSubImage()", @ref Mesh::addVertexBuffer(),
@ref Renderer::setStencilFunction(), @ref Renderer::setStencilMask() and
@ref Renderer::setBlendFunction() documentation for more information.
@section best-practices-hw Hardware-specific
@subsection best-practices-intel Intel hardware
- [Performance tuning applications for Intel Graphics for Linux and Chrome OS](http://software.intel.com/sites/default/files/Performance-tuning-applications-for-Intel-GEN-Graphics-for-Linux-and-Google-Chrome-OS.pdf) [PDF]
@subsection best-practices-powervr PowerVR hardware
- [PowerVR Performance Recommendations](https://github.com/burningsun/pecker_framework/blob/master/参考资料/PowerVR.Performance%20Recommendations.pdf?raw=true) [PDF]
@subsection best-practices-amd AMD hardware
- [ATI Radeon HD 2000 programming guide](http://developer.amd.com/wordpress/media/2012/10/ATI_Radeon_HD_2000_programming_guide.pdf)
@subsection best-practices-tegra NVidia Tegra hardware
- [Optimize OpenGL ES 2.0 Performance for Tegra](http://docs.nvidia.com/tegra/index.html#GLES2_Perf_Main.html)
*/
}

21
doc/building.dox

@ -624,6 +624,8 @@ cmake .. ^
cmake --build .
@endcode
See @ref platforms-gl-es-angle for more information about using ANGLE.
@section building-cross Cross-compiling
For cross-compiling you need to have *both* target and native version of
@ -681,8 +683,8 @@ instead. When done, you can install the package using
@cb{.bat} cmake --build . --target install @ce to make it available to
depending projects.
See @ref Platform::Sdl2Application documentation for more information about
building your projects for WinRT.
See @ref platforms-windows for more information about building your projects
for WinRT.
@subsection building-cross-win Cross-compiling for Windows using MinGW-w64
@ -720,6 +722,9 @@ cmake --build .
Then you can install the package using @cb{.sh} cmake --build . --target install @ce
to make it available to depending projects.
See @ref platforms-windows for more information about building your projects
for Windows.
@subsection building-cross-emscripten Cross-compiling for Emscripten
You will need [Emscripten](http://kripken.github.io/emscripten-site/) installed
@ -782,8 +787,8 @@ named `PKGBUILD-emscripten`, `PKGBUILD-emscripten-webgl2`,
WebGL 1 / WebGL 2 optimized asm.js build (*slow* to compile), the second for
unoptimized build (faster to compile) and the third for WebAssembly build.
See @ref Platform::Sdl2Application documentation for more information about
building your projects for Emscripten.
See @ref platforms-html5 for more information about building your projects for
Emscripten.
@subsection building-cross-ios Cross-compiling for iOS
@ -822,8 +827,8 @@ cmake --build .
Then you can install the library using @cb{.sh} cmake --build . --target install @ce
to make it available to depending projects.
See @ref Platform::Sdl2Application documentation for more information about
building your projects for iOS.
See @ref platforms-ios documentation for more information about building your
projects for iOS.
@subsection building-cross-android Crosscompiling for Android
@ -888,8 +893,8 @@ more information.
build arbitrary Android projects. To fix it, use a different generator (for
example Ninja, by passing `-G Ninja` to CMake).
See @ref Platform::AndroidApplication documentation for more information about
building your projects for Android.
See @ref platforms-android for more information about building your projects
for Android.
@section building-ci Continuous Integration

4
doc/changelog.dox

@ -73,7 +73,7 @@ See also:
@subsection changelog-latest-bugfixes Bug fixes
- Engine startup info was not properly printed to Android log since
introducing the `--magnum-log` option in 2018.02
introducing the `--magnum-log` option in version 2018.02
@subsection changelog-latest-deprecated Deprecated APIs
@ -223,7 +223,7 @@ See also:
maintainers and core developers
- A new set of @ref platforms "platform-specific guides" containing extended
information that was previously scattered across @ref Platform application
class docs
class docs and elsewhere
- Completely reworked @ref platforms-android "Android building"
documentation, now using Gradle CMake integration instead of the outdated
and no longer supported Apache Ant workflow.

241
doc/platforms-android.dox

@ -31,6 +31,9 @@ namespace Magnum {
@tableofcontents
@m_footernavigation
@todoc testing, gl tests, code coverage, travis setup
@todoc static plugins
The following guide explains how to build Android projects using minimal
command-line tools, without Android Studio involved.
@ -39,14 +42,16 @@ Running console utilities and tests on the device don't need much more, in case
you want to develop actual applications, you need also Gradle and SDK platform +
SDK platform build tools for version of your choice. Gradle is able to download
all the dependencies on its own, however it's also possible to install system
packages for a cleaner setup. On ArchLinux it's the `gradle` package and the
following AUR packages, adapt the version numbers as necessary:
packages for a cleaner setup.
- [android-sdk](https://aur.archlinux.org/packages/android-sdk/)
- [android-ndk](https://aur.archlinux.org/packages/android-ndk/)
- [android-sdk-build-tools-26.0.2](https://aur.archlinux.org/packages/android-sdk-build-tools-26.0.2/)
- [android-platform-25](https://aur.archlinux.org/packages/android-platform-25/)
- [android-sdk-cmake](https://aur.archlinux.org/packages/android-sdk-cmake/)
@note On ArchLinux it's the `gradle` package and the following AUR packages,
adapt the version numbers as necessary:
@note
- [android-sdk](https://aur.archlinux.org/packages/android-sdk/)
- [android-ndk](https://aur.archlinux.org/packages/android-ndk/)
- [android-sdk-build-tools-26.0.2](https://aur.archlinux.org/packages/android-sdk-build-tools-26.0.2/)
- [android-platform-25](https://aur.archlinux.org/packages/android-platform-25/)
- [android-sdk-cmake](https://aur.archlinux.org/packages/android-sdk-cmake/)
Gradle requires Android SDK version of CMake, which is currently at version
3.6. See below for an experimental way to @ref platforms-android-system-cmake "use the system CMake"
@ -54,9 +59,9 @@ instead.
@section platforms-android-command-line Building and running console applications
Android allows to run arbitrary console utilities and tests. Assuming you have
Magnum installed in the NDK path as described in @ref building-cross-android,
build your project simply as this (adapt as needed):
Android allows to run arbitrary console utilities and tests via ADB. Assuming
you have Magnum installed in the NDK path as described in @ref building-cross-android,
build your project simply as this (adapt version numbers and ABIs as needed):
@code{.sh}
mkdir build-android-arm64 && cd build-android-arm64
@ -74,10 +79,10 @@ After that you can use ADB to upload your executable to the device and run it
there. The global temporary directory is `/data/local/tmp` and while the parent
directories often don't have permissions, it's possible to @cb{.sh} cd @ce into
it and create arbitrary files there. Assuming you built an executable in
`src/my-application`, the workflow would be like this:
`build-android-arm64/src/my-application`, the workflow would be like this:
@code{.sh}
adb push src/my-application /data/local/tmp
adb push build-android-arm64/src/my-application /data/local/tmp
adb shell /data/local/tmp/my-application
@endcode
@ -86,19 +91,30 @@ continue from there. Besides plain command-line apps it's also possible to
create an EGL context without any extra setup using
@ref Platform::WindowlessEglApplication.
@section platforms-android-apps Building and installing graphics applications
@section platforms-android-apps Building and installing graphics apps
Building of graphics applications is managed fully using Gradle, which also
builds your CMake project internally. In case you don't have OpenGL ES build
set up yet, you need to copy `FindEGL.cmake` and `FindOpenGLES2.cmake` (or
`FindOpenGLES3.cmake`) from the `modules/` directory in Magnum source to the
`modules/` dir in your project so it is able to find EGL and OpenGL ES
libraries.
builds your CMake project internally. It's possible to use other means such as
`ndk-build`, but CMake is the officially preferred way. The following guide
assumes you have Gradle installed in a system-wide location available in
@cb{.sh} $PATH @ce. See the [Gradle installation docs](https://docs.gradle.org/current/userguide/installation.html)
for more information, @ref platforms-android-gradlew "see below" if you want to
use the `gradlew` wrappers instead.
In case you don't have an OpenGL ES build set up yet, you need to copy
`FindEGL.cmake` and `FindOpenGLES2.cmake` (or `FindOpenGLES3.cmake`) from the
[modules/](https://github.com/mosra/magnum/tree/master/modules) directory in
Magnum source to the `modules/` dir in your project so it is able to find EGL
and OpenGL ES libraries.
Magnum provides Android application wrapper in @ref Platform::AndroidApplication.
See its documentation for more information about general usage. You can also
use the Android Native Activity directly or any other way.
@note The @ref Platform::AndroidApplication also contains a fully configured
bootstrap project that's ready to build and deploy. Check its documentation
for details.
The first thing you need compared to building an app for other platforms is
creating a shared library instead of an executable:
@ -139,7 +155,7 @@ android {
}
}
ndk {
abiFilters "arm64-v8a"
abiFilters 'arm64-v8a'
}
}
@ -217,14 +233,120 @@ gradle installDebug
after which you can launch the app from your home screen. See the
@ref platforms-android-troubleshooting section below if you ran into problems.
@section platforms-android-multiple-abis Building for multiple ABIs and system versions
The above guide simplifies things a bit and builds for just a single ARM64 ABI.
In order to support multiple platforms, you need to separately build and
install the dependencies for all ABIs of choice --- create separate build
directories and run CMake with different `CMAKE_ANDROID_ARCH_ABI` and
corresponding `CMAKE_INSTALL_PREFIX`. Similarly with SDK versions, adapt
`CMAKE_SYSTEM_VERSION` and `CMAKE_INSTALL_PREFIX` to a desired version. The
headers are shared and should be always installed into `&lt;ndk&gt;/sysroot/usr`
regardless of ABI or SDK version. The supported ABI values are:
ABI | Corresponding install prefix
----------- | ----------------------------
armeabi-v7a | &lt;nk&gt;/platforms/android-&lt;version&gt;/arch-arm/usr
arm64-v8a | &lt;nk&gt;/platforms/android-&lt;version&gt;/arch-arm64/usr
x86 | &lt;nk&gt;/platforms/android-&lt;version&gt;/arch-x86/usr
x86_64 | &lt;nk&gt;/platforms/android-&lt;version&gt;/arch-x86_64/usr
After that, you can add the additional ABIs to the `abiFilters` list in your
`build.gradle`.
For example, building Magnum for 32-bit and 64-bit ARM with SDK version 24
could look like this:
@code{.sh}
mkdir build-android-arm && cd build-android-arm
cmake .. \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=24 \
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \
-DCMAKE_ANDROID_STL_TYPE=c++_static \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=<ndk>/platforms/android-24/arch-arm/usr \
-DMAGNUM_INCLUDE_INSTALL_PREFIX=<ndk>/sysroot/usr
cmake --build . --target install
cd ..
mkdir build-android-arm64 && cd build-android-arm64
cmake .. \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=24 \
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \
-DCMAKE_ANDROID_STL_TYPE=c++_static \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=<ndk>/platforms/android-24/arch-arm64/usr \
-DMAGNUM_INCLUDE_INSTALL_PREFIX=<ndk>/sysroot/usr
cmake --build . --target install
@endcode
And the `build.gradle` for your app then looks like this:
@code{.gradle}
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
defaultConfig {
minSdkVersion 24
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_static'
}
}
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}
}
@endcode
See [the official documentation about ABIs](https://developer.android.com/ndk/guides/abis.html)
for more information.
@section platforms-android-output-redirection Redirecting output to Android log buffer
While printing to standard output and standard error output "just works" with
command-line apps, you might want to redirect your @ref Corrade::Utility::Debug "Debug",
@ref Corrade::Utility::Warning "Warning" and @ref Corrade::Utility::Error "Error"
output to Android log buffer. so it can be accessed through the @cb{.sh} adb logcat @ce
utility. See @ref Corrade::Utility::AndroidLogStreamBuffer for more information
--- the @ref Platform::AndroidApplication sets this up implicitly.
utility. See @ref Corrade::Utility::AndroidLogStreamBuffer for more
information.
The @ref Platform::AndroidApplication sets this up implicitly with a `magnum`
tag, you can then filter it out like this, for example:
@code{.shell-session}
$ adb logcat *:S magnum
...
03-16 17:35:26.703 17726 17745 I magnum : Renderer: Mali-G71 by ARM
03-16 17:35:26.703 17726 17745 I magnum : OpenGL version: OpenGL ES 3.2 v1.r2p0
03-16 17:35:26.703 17726 17745 I magnum : Using optional features:
03-16 17:35:26.703 17726 17745 I magnum : GL_EXT_robustness
@endcode
@section platforms-android-system-cmake Using system-wide CMake installation
@ -250,9 +372,58 @@ android {
However, be aware that this is an experimental feature and may be broken.
<em>(It didn't work for me with 3.10.)</em>
@section platforms-android-gradlew Using gradlew wrappers instead of a system installation
It's possible to bundle Gradle in the project itself as opposed to requiring a
pre-existing system installation. It has the downside of having a bit more
boilerplate files in your project, though.
First, add the following to your `build.gradle` file:
@code{.gradle}
task wrapper(type: Wrapper) {
gradleVersion = '4.0'
}
@endcode
Then run this on a system that has Gradle installed:
@code{.sh}
gradle wrapper
@endcode
This will generate the following files that you can then add to version
control:
- `gradlew` shell script for Unix-like systems
- `gradle.bat` batch script for Windows
- `gradle/` directory with wrapper binaries
With this in place, you can just use @cb{.sh} gradlew @ce instead of
@cb{.sh} gradle @ce.
@section platforms-android-troubleshooting Troubleshooting
@subsection platforms-android-troubleshooting-anativeactivity App can't launch
@subsection platforms-android-troubleshooting-cant-find Gradle CMake can't find dependencies
Gradle by default searches only in the NDK install path. If you have your
dependencies installed somewhere else (this goes especially for the *native*
`corrade-rc` executable), you might want to point the `CMAKE_PREFIX_PATH`
environment variable to your install location:
@code{.sh}
export CMAKE_PREFIX_PATH=<path-where-your-dependencies-are-installed>
gradle build
@endcode
If you have the dependencies installed in the NDK path, but it still fails,
check that you installed for the same SDK version as in `minSdkVersion` and all
ABIs mentioned in `abiFilters` inside your `build.gradle` file --- Gradle runs
CMake once for each entry in the list so it might happen that it finds them for
all but one ABI. See @ref platforms-android-multiple-abis above for more
information.
@subsection platforms-android-troubleshooting-cant-launch App can't launch
If your application can't launch (or it just blinks and then disappears), you
can inspect @cb{.sh} adb logcat @ce output to see what went wrong, but be
@ -260,8 +431,14 @@ quick, the log is spitting out a lot of info all the time. Possible causes:
- Mismatch between actual library name and library referenced from
`AndroidManifest.xml`, causing Java to fail loading it
- The device having an ABI for which the app was not compiled (check the
@cb{.gradle} abiFilters @ce option in `build.gradle`)
- The device has an ABI for which the app was not compiled (check the
@cb{.gradle} abiFilters @ce option in `build.gradle`) or the app was
compiled with SDK version that's not supported by the device yet. See the
[official API level documentation](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels)
for more information.
- The device doesn't support OpenGL ES 3.0 yet. Rebuild Magnum and its
dependencies with the `TARGET_GLES2` option enabled. See @ref building-features
for more information.
- Loading fails with `ANativeActivity_onCreate` symbol not being found. If
you are using @ref Platform::AndroidApplication, this issue should be
prevented, otherwise you need to add `-u ANativeActivity_onCreate` to your
@ -276,8 +453,19 @@ quick, the log is spitting out a lot of info all the time. Possible causes:
@subsection platforms-android-troubleshooting-term Gradle aborting due to termcap
Gradle is crashing in case @cb{.sh} $TERM @ce is set to `xterm-256color` or
`xterm-24`. Solution is to set @cb{.sh} TERM=xterm @ce. See
If you see the following output, Gradle is crashing because @cb{.sh} $TERM @ce
is set to `xterm-256color` or `xterm-24`:
@code{.shell-session}
$ gradle build
FAILURE: Build failed with an exception.
* What went wrong:
Could not open terminal for stdout: could not get termcap entry
@endcode
Solution is to set @cb{.sh} TERM=xterm @ce. See
[gradle/gradle#4440](https://github.com/gradle/gradle/issues/4440) for more
information.
@ -315,4 +503,5 @@ directory permissions such as
it's often enough to just install such packages. In case of ArchLinux, all
relevant packages are available in AUR.
*/
}

87
doc/platforms-gl.dox

@ -0,0 +1,87 @@
/*
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-gl OpenGL and OpenGL ES platforms
@brief Information common for all platforms that support OpenGL and OpenGL ES
@tableofcontents
@m_footernavigation
@todoc desktop gles
@section platforms-gl-best-practices OpenGL best practices
Various links gathered around the web:
- [Performance tuning applications for Intel Graphics for Linux and Chrome OS](http://software.intel.com/sites/default/files/Performance-tuning-applications-for-Intel-GEN-Graphics-for-Linux-and-Google-Chrome-OS.pdf) [PDF]
- [PowerVR Performance Recommendations](https://github.com/burningsun/pecker_framework/blob/master/参考资料/PowerVR.Performance%20Recommendations.pdf?raw=true) [PDF]
- [ATI Radeon HD 2000 programming guide](http://developer.amd.com/wordpress/media/2012/10/ATI_Radeon_HD_2000_programming_guide.pdf) [PDF]
@section platforms-gl-es OpenGL ES
@subsection platforms-gl-es-best-practices OpenGL ES best practices
Various links gathered around the web:
- [Writing Portable OpenGL ES 2.0](https://www.khronos.org/assets/uploads/developers/library/2011-siggraph-mobile/Writing-Portable-OpenGL-ES-2.0_Aug-11.pdf) [PDF]
- [Optimize OpenGL ES 2.0 Performance for Tegra](http://docs.nvidia.com/tegra/index.html#GLES2_Perf_Main.html)
@subsection platforms-gl-es-differences Differences to desktop GL
- Rendering to RGB textures doesn't work on many platforms, either due to
alignment issues or other factors. For example it is not possible to render
to @ref TextureFormat::RGB8 on iOS (but it works elsewhere); rendering to
@ref TextureFormat::RGB32F is not possible even on NVidia. Use RGBA formats
instead.
- While on desktop GL it's often permitted to upload a RGB image to a texture
with RGBA internal format, on mobile devices usually nothing happens. Be
sure to match the component count.
- Rendering to 16- and 32-bit float textures is only possible with OpenGL ES
3.2 or with the @extension{EXT,color_buffer_half_float} and
@extension{EXT,color_buffer_float} extensions. You can work around that
issue by rendering to 32-bit unsigned integer textures and using the
@glsl floatBitsToUInt() @ce GLSL function instead.
- Linear filtering on 32-bit float textures is only possible with
@extension{OES,texture_float_linear} (it's not even on ES 3.2 yet). You can
work around that issue by using half-float texture formats or doing the
interpolation manually in a shader.
@subsection platforms-gl-es-angle ANGLE
[ANGLE](https://github.com/google/angle) is a layer that translates OpenGL ES
code to D3D, desktop GL or Vulkan, originally created for web browsers to
provide better WebGL experience without relying on buggy OpenGL drivers on
Windows.
Related links:
- [WebGL Insights --- ANGLE](https://books.google.cz/books?id=6crECQAAQBAJ&lpg=PP1&pg=PA3&redir_esc=y#v=onepage&q&f=true)
*/
}

117
doc/platforms-html5.dox

@ -0,0 +1,117 @@
/*
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 Magnum.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 Magnum.cpp Buffer-webgl
See @ref Buffer-webgl-restrictions "Buffer", @ref Mesh-webgl-restrictions "Mesh",
@ref Texture::setSubImage() "*Texture::setSubImage()",
@ref Mesh::addVertexBuffer(), @ref Renderer::setStencilFunction(),
@ref Renderer::setStencilMask() and @ref 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. The @cb{.sh} -s WASM=1 @ce
flag is needed in order to enable a rebuild of the `binaryen` tool as well:
@code{.sh}
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
*/
}

61
doc/platforms-ios.dox

@ -0,0 +1,61 @@
/*
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-ios iOS
@brief Building, testing and deploying apps for Apple iOS platforms
@tableofcontents
@m_footernavigation
With Apple decision to focus on Metal, iOS OpenGL ES support is stuck on
version 3.0 (i.e., a version before compute shaders are available).
See also @ref Platform::Sdl2Application for more information.
@section platforms-ios-best-practices Best practices
Official Apple documentation:
- [Best Practices for Working with Vertex Data](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html)
- [Best Practices for Working with Texture Data](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesForWorkingWithTextureData/TechniquesForWorkingWithTextureData.html)
- [Best Practices for Shaders](http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html#//apple_ref/doc/uid/TP40008793-CH7-SW3)
@section platforms-ios-troubleshooting Troubleshooting
- GLSL @glsl texelFetch() @ce returns zero results if you have a texture with
integer type and the filtering is not @ref Sampler::Filter::Nearest. Yes,
it shouldn't matter, but it does.
@todoc CMake -G Xcode, testsuite integration, bundling, controlling xcode properties from cmake
@todoc CORRADE_TESTSUITE_BUNDLE_IDENTIFIER_PREFIX
@todoc alternatives - including *.a files manually in your xcode project
@todoc move stuff from Sdl2App
@todoc static plugins
@todoc travis setup
*/
}

39
doc/platforms-linux.dox

@ -0,0 +1,39 @@
/*
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-linux Linux
@brief Tips and tricks for Linux platforms
@tableofcontents
@m_footernavigation
@todoc packages
@todoc desktop ES
@todoc tests, mesa softpipe
*/
}

59
doc/platforms-macos.dox

@ -0,0 +1,59 @@
/*
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-macos macOS
@brief Tips and tricks for macOS
@tableofcontents
@m_footernavigation
@todoc homebrew
@todoc travis setup
@todoc bundling, dmg cpack
With Apple decision to focus on Metal, macOS OpenGL support is stuck on version
4.2 (i.e., a version before compute shaders are available).
@section platforms-macos-opengl-best-practices Best practices
Official Apple documentation:
- [Best Practices for Working with Vertex Data](https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_vertexdata/opengl_vertexdata.html)
- [Best Practices for Working with Texture Data](https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html)
@section platforms-macos-troubleshooting Troubleshooting
- @ref AbstractShaderProgram::validate() expects that the shader has a
properly configured framebuffer bound along with proper @ref Renderer
setup. That is often hard to achieve, so the function cannot be portably
used for shader validity testing.
- `GL_TIMESTAMP` used by @ref TimeQuery::timestamp() is not implemented on
macOS and gives zero results.
*/
}

44
doc/platforms-windows.dox

@ -0,0 +1,44 @@
/*
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-windows Windows
@brief Tips and tricks for Windows platforms
@tableofcontents
@m_footernavigation
See @ref Platform::Sdl2Application for more information about WinRT.
@todoc DLL paths
@todoc vcpkg
@todoc desktop ES
@todoc mingw, clang, clang/c2...
@todoc "unicode"
@todoc colored console output
*/
}

8
doc/platforms.dox

@ -28,7 +28,13 @@ namespace Magnum {
/** @page platforms Platform-specific guides
@brief General information, tips and troubleshooting for particular platforms
- @subpage platforms-android --- @copybrief android
- @subpage platforms-gl --- @copybrief platforms-gl
- @subpage platforms-linux --- @copybrief platforms-linux
- @subpage platforms-windows --- @copybrief platforms-windows
- @subpage platforms-macos --- @copybrief platforms-macos
- @subpage platforms-ios --- @copybrief platforms-ios
- @subpage platforms-android --- @copybrief platforms-android
- @subpage platforms-html5 --- @copybrief platforms-html5
*/

10
doc/snippets/Magnum.cpp

@ -376,10 +376,16 @@ CORRADE_INTERNAL_ASSERT_OUTPUT(buffer.unmap());
}
#endif
{
/* [Buffer-webgl-nope] */
Buffer vertices, indices;
/* [Buffer-webgl-nope] */
}
{
/* [Buffer-webgl] */
Buffer vertices{Buffer::TargetHint::Array};
Buffer indices{Buffer::TargetHint::ElementArray};
Buffer vertices{Buffer::TargetHint::Array},
indices{Buffer::TargetHint::ElementArray};
/* [Buffer-webgl] */
}

1
doc/tips.dox

@ -29,7 +29,6 @@ namespace Magnum {
- @subpage method-chaining --- @copybrief method-chaining
- @subpage portability --- @copybrief portability
- @subpage best-practices --- @copybrief best-practices
- @subpage compilation-speedup --- @copybrief compilation-speedup
- @subpage troubleshooting --- @copybrief troubleshooting

14
src/Magnum/Buffer.h

@ -180,13 +180,19 @@ Buffers in @ref MAGNUM_TARGET_WEBGL "WebGL" need to be bound only to one unique
target, i.e., @ref Buffer bound to @ref Buffer::TargetHint::Array cannot be
later rebound to @ref Buffer::TargetHint::ElementArray. However, Magnum by
default uses any sufficient target when binding the buffer internally (e.g. for
setting data). To avoid GL errors, set target hint to desired target, either in
constructor or using @ref Buffer::setTargetHint():
setting data). To avoid GL errors, the following, while completely fine on
desktop, is not sufficient on WebGL:
@snippet Magnum.cpp Buffer-webgl-nope
You have to set target hint to desired target, either in constructor or using
@ref Buffer::setTargetHint() like this (and similarly for other bufffer types
such as UBOs):
@snippet Magnum.cpp Buffer-webgl
To ease up the development, @ref Mesh checks proper target hint when adding
vertex and index buffers in WebGL.
To simplify debugging, @ref Mesh checks proper target hint when adding vertex
and index buffers in WebGL.
@section Buffer-performance-optimizations Performance optimizations

Loading…
Cancel
Save