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 of power-of-two textures into a texture atlas array
- Added a @ref TextureTools::DistanceField::operator()() overload taking a - Added a @ref TextureTools::DistanceField::operator()() overload taking a
@ref GL::Framebuffer instead of a @ref GL::Texture as an output for an @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 @subsubsection changelog-latest-new-trade Trade library

1
package/archlinux/PKGBUILD-es2

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

1
package/archlinux/PKGBUILD-es2desktop

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

1
package/archlinux/PKGBUILD-es3

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

1
package/archlinux/PKGBUILD-es3desktop

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

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

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

2
package/ci/appveyor.yml

@ -122,6 +122,8 @@ install:
- set PATH=C:/tools/ninja;%PATH% - set PATH=C:/tools/ninja;%PATH%
- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" pip install codecov - 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 - IF NOT "%BUILD_STATIC%" == "ON" set BUILD_STATIC=OFF
# For ES builds, otherwise the "%COMPILER:~0,4%" below doesn't work, sigh # For ES builds, otherwise the "%COMPILER:~0,4%" below doesn't work, sigh
- IF "%COMPILER%" == "" set COMPILER=msvc - 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_STATIC" != "ON" ]; then export BUILD_STATIC=OFF; fi
if [ "$BUILD_DEPRECATED" != "OFF" ]; then export BUILD_DEPRECATED=ON; fi if [ "$BUILD_DEPRECATED" != "OFF" ]; then export BUILD_DEPRECATED=ON; fi
if [ "$BUILD_APPLICATIONS" != "OFF" ]; then export BUILD_APPLICATIONS=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 >> ./package/ci/<< parameters.script >>
lcov: lcov:

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

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

16
src/Magnum/TextureTools/distancefieldconverter.cpp

@ -35,6 +35,7 @@
#include "Magnum/PixelFormat.h" #include "Magnum/PixelFormat.h"
#include "Magnum/Math/ConfigurationValue.h" #include "Magnum/Math/ConfigurationValue.h"
#include "Magnum/Math/Range.h" #include "Magnum/Math/Range.h"
#include "Magnum/GL/Framebuffer.h"
#include "Magnum/GL/Renderer.h" #include "Magnum/GL/Renderer.h"
#include "Magnum/GL/Texture.h" #include "Magnum/GL/Texture.h"
#include "Magnum/GL/TextureFormat.h" #include "Magnum/GL/TextureFormat.h"
@ -176,6 +177,10 @@ int DistanceFieldConverter::exec() {
} }
/* Decide about internal format */ /* 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; GL::TextureFormat internalFormat;
if(image->format() == PixelFormat::R8Unorm) if(image->format() == PixelFormat::R8Unorm)
internalFormat = GL::TextureFormat::R8; internalFormat = GL::TextureFormat::R8;
@ -200,15 +205,22 @@ int DistanceFieldConverter::exec() {
GL::Texture2D output; GL::Texture2D output;
output.setStorage(1, GL::TextureFormat::R8, args.value<Vector2i>("output-size")); 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); CORRADE_INTERNAL_ASSERT(GL::Renderer::error() == GL::Renderer::Error::NoError);
/* Do it */ /* Do it */
Debug() << "Converting image of size" << image->size() << "to distance field..."; 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 */ /* Save image */
Image2D result{PixelFormat::R8Unorm}; Image2D result{PixelFormat::R8Unorm};
output.image(0, result); framebuffer.read(rectangle, result);
if(!converter->convertToFile(result, args.value("output"))) { if(!converter->convertToFile(result, args.value("output"))) {
Error() << "Cannot save file" << args.value("output"); Error() << "Cannot save file" << args.value("output");
return 5; return 5;

Loading…
Cancel
Save