From 6c2ea21d3125729c7315ba6a0f895678fe961d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 13 Apr 2023 11:57:31 +0200 Subject: [PATCH] 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. --- doc/changelog.dox | 4 +++- package/archlinux/PKGBUILD-es2 | 1 + package/archlinux/PKGBUILD-es2desktop | 1 + package/archlinux/PKGBUILD-es3 | 1 + package/archlinux/PKGBUILD-es3desktop | 1 + package/ci/appveyor-desktop-gles.bat | 2 +- package/ci/appveyor.yml | 2 ++ package/ci/circleci.yml | 2 ++ package/ci/unix-desktop-gles.sh | 2 +- .../TextureTools/distancefieldconverter.cpp | 16 ++++++++++++++-- 10 files changed, 27 insertions(+), 5 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 5676f2c1f..f68e3ced6 100644 --- a/doc/changelog.dox +++ b/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 diff --git a/package/archlinux/PKGBUILD-es2 b/package/archlinux/PKGBUILD-es2 index 6e18971bf..f36b42e4b 100644 --- a/package/archlinux/PKGBUILD-es2 +++ b/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 \ diff --git a/package/archlinux/PKGBUILD-es2desktop b/package/archlinux/PKGBUILD-es2desktop index a8712d86f..6b5ceec4c 100644 --- a/package/archlinux/PKGBUILD-es2desktop +++ b/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 \ diff --git a/package/archlinux/PKGBUILD-es3 b/package/archlinux/PKGBUILD-es3 index fcda3ad21..fae5de4f0 100644 --- a/package/archlinux/PKGBUILD-es3 +++ b/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 \ diff --git a/package/archlinux/PKGBUILD-es3desktop b/package/archlinux/PKGBUILD-es3desktop index 907ee65a3..7ed90e150 100644 --- a/package/archlinux/PKGBUILD-es3desktop +++ b/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 \ diff --git a/package/ci/appveyor-desktop-gles.bat b/package/ci/appveyor-desktop-gles.bat index 4f7e577a8..5d58d8c90 100644 --- a/package/ci/appveyor-desktop-gles.bat +++ b/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 ^ diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index 0cc4cc06d..9ff3c3e4b 100644 --- a/package/ci/appveyor.yml +++ b/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 diff --git a/package/ci/circleci.yml b/package/ci/circleci.yml index b3057ffa6..e3e4ee7f5 100644 --- a/package/ci/circleci.yml +++ b/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: diff --git a/package/ci/unix-desktop-gles.sh b/package/ci/unix-desktop-gles.sh index 36a577725..b0a0a901b 100755 --- a/package/ci/unix-desktop-gles.sh +++ b/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 \ diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index 222c0fc4f..db59a0b43 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/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("output-size")); + /* Rectangle to process */ + const Range2Di rectangle{{}, args.value("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("radius")}(input, output, {{}, args.value("output-size")}, image->size()); + TextureTools::DistanceField{args.value("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;