Browse Source

distancefieldconverter: make it work on GLES 3+.

It compiles on GLES2 as well, but there it hits the massive PITA of
being unable to render to LUMINANXCE formats and GL_RED formats not
really being available everywhere.

I don't have the patience to fix that, and almost nobody needs to use
ES2 platforms nowadays, so this isn't really a priority.
pull/617/head
Vladimír Vondruš 3 years ago
parent
commit
6c2ea21d31
  1. 4
      doc/changelog.dox
  2. 1
      package/archlinux/PKGBUILD-es2
  3. 1
      package/archlinux/PKGBUILD-es2desktop
  4. 1
      package/archlinux/PKGBUILD-es3
  5. 1
      package/archlinux/PKGBUILD-es3desktop
  6. 2
      package/ci/appveyor-desktop-gles.bat
  7. 2
      package/ci/appveyor.yml
  8. 2
      package/ci/circleci.yml
  9. 2
      package/ci/unix-desktop-gles.sh
  10. 16
      src/Magnum/TextureTools/distancefieldconverter.cpp

4
doc/changelog.dox

@ -331,7 +331,9 @@ See also:
of power-of-two textures into a texture atlas array
- Added a @ref TextureTools::DistanceField::operator()() overload taking a
@ref GL::Framebuffer instead of a @ref GL::Texture as an output for an
easier ability to download the resulting image on OpenGL ES platforms
easier ability to download the resulting image on OpenGL ES platforms;
the @ref magnum-distancefieldconverter "magnum-distancefieldconverter"
utility thus now compiles works and on OpenGL ES 3+ as well
@subsubsection changelog-latest-new-trade Trade library

1
package/archlinux/PKGBUILD-es2

@ -39,6 +39,7 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \

1
package/archlinux/PKGBUILD-es2desktop

@ -43,6 +43,7 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \

1
package/archlinux/PKGBUILD-es3

@ -39,6 +39,7 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=ON \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \

1
package/archlinux/PKGBUILD-es3desktop

@ -43,6 +43,7 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=ON \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \

2
package/ci/appveyor-desktop-gles.bat

@ -49,7 +49,7 @@ cmake .. ^
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON ^
-DMAGNUM_WITH_TGAIMPORTER=ON ^
-DMAGNUM_WITH_WAVAUDIOIMPORTER=OFF ^
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF ^
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=%TARGET_GLES3% ^
-DMAGNUM_WITH_FONTCONVERTER=OFF ^
-DMAGNUM_WITH_IMAGECONVERTER=OFF ^
-DMAGNUM_WITH_SCENECONVERTER=OFF ^

2
package/ci/appveyor.yml

@ -122,6 +122,8 @@ install:
- set PATH=C:/tools/ninja;%PATH%
- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" pip install codecov
- IF "%TARGET_GLES2%" == "ON" set TARGET_GLES3=OFF
- IF "%TARGET_GLES2%" == "OFF" set TARGET_GLES3=ON
- IF NOT "%BUILD_STATIC%" == "ON" set BUILD_STATIC=OFF
# For ES builds, otherwise the "%COMPILER:~0,4%" below doesn't work, sigh
- IF "%COMPILER%" == "" set COMPILER=msvc

2
package/ci/circleci.yml

@ -246,6 +246,8 @@ commands:
if [ "$BUILD_STATIC" != "ON" ]; then export BUILD_STATIC=OFF; fi
if [ "$BUILD_DEPRECATED" != "OFF" ]; then export BUILD_DEPRECATED=ON; fi
if [ "$BUILD_APPLICATIONS" != "OFF" ]; then export BUILD_APPLICATIONS=ON; fi
if [ "$TARGET_GLES2" == "ON" ]; then export TARGET_GLES3=OFF; fi
if [ "$TARGET_GLES2" == "OFF" ]; then export TARGET_GLES3=ON; fi
./package/ci/<< parameters.script >>
lcov:

2
package/ci/unix-desktop-gles.sh

@ -48,7 +48,7 @@ cmake .. \
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=OFF \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=$TARGET_GLES3 \
-DMAGNUM_WITH_FONTCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=OFF \
-DMAGNUM_WITH_SCENECONVERTER=OFF \

16
src/Magnum/TextureTools/distancefieldconverter.cpp

@ -35,6 +35,7 @@
#include "Magnum/PixelFormat.h"
#include "Magnum/Math/ConfigurationValue.h"
#include "Magnum/Math/Range.h"
#include "Magnum/GL/Framebuffer.h"
#include "Magnum/GL/Renderer.h"
#include "Magnum/GL/Texture.h"
#include "Magnum/GL/TextureFormat.h"
@ -176,6 +177,10 @@ int DistanceFieldConverter::exec() {
}
/* Decide about internal format */
/** @todo this doesn't work on ES2, the image pixel format is converted to
a LUMINANCE which doesn't match GL_RED / GL_R8; it also doesn't check
that EXT_texture_rg exists, and LUMINANCE isn't really renderable, etc
etc */
GL::TextureFormat internalFormat;
if(image->format() == PixelFormat::R8Unorm)
internalFormat = GL::TextureFormat::R8;
@ -200,15 +205,22 @@ int DistanceFieldConverter::exec() {
GL::Texture2D output;
output.setStorage(1, GL::TextureFormat::R8, args.value<Vector2i>("output-size"));
/* Rectangle to process */
const Range2Di rectangle{{}, args.value<Vector2i>("output-size")};
/* Output framebuffer */
GL::Framebuffer framebuffer{rectangle};
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment(0), output, 0);
CORRADE_INTERNAL_ASSERT(GL::Renderer::error() == GL::Renderer::Error::NoError);
/* Do it */
Debug() << "Converting image of size" << image->size() << "to distance field...";
TextureTools::DistanceField{args.value<UnsignedInt>("radius")}(input, output, {{}, args.value<Vector2i>("output-size")}, image->size());
TextureTools::DistanceField{args.value<UnsignedInt>("radius")}(input, output, rectangle, image->size());
/* Save image */
Image2D result{PixelFormat::R8Unorm};
output.image(0, result);
framebuffer.read(rectangle, result);
if(!converter->convertToFile(result, args.value("output"))) {
Error() << "Cannot save file" << args.value("output");
return 5;

Loading…
Cancel
Save