From f42ee91bf02386ce44af9b85a372b7d8b86d0d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 6 Nov 2020 22:49:39 +0100 Subject: [PATCH] [wip] GlslOptimizerShaderConverter: new plugin. TODO: not sure about the relevance of this nowadays -- with a quick'n'dumb test on a moderately complex shader containing a bunch of loops, those got all unrolled and the resulting SPIR-V binary was significantly larger than without this, even after passing it through SPIR-V optimizer. Or maybe there's a way to limit the unrolling? TODO: needs to expose input version (same as in glslang), otherwise too shitty to use TODO: needs to expose preprocessor definitions (~same as in glslang), otherwise too shitty to use TODO: even with the https://github.com/jamienicol/glsl-optimizer fork which is based on Mesa 20, it reports that the only supported GLSL versions are <= 1.50 and <= 300 es :( TODO: docs, move the cmake subproject setup to a doc snippet --- CMakeLists.txt | 6 + modules/FindGlslOptimizer.cmake | 54 ++++++++ package/archlinux/PKGBUILD-release | 2 + src/MagnumPlugins/CMakeLists.txt | 4 + .../CMakeLists.txt | 74 +++++++++++ .../GlslOptimizerConverter.cpp | 118 ++++++++++++++++++ .../GlslOptimizerConverter.h | 98 +++++++++++++++ .../GlslOptimizerShaderConverter.conf | 1 + .../Test/CMakeLists.txt | 56 +++++++++ .../Test/GlslOptimizerConverterTest.cpp | 51 ++++++++ .../Test/configure.h.cmake | 28 +++++ .../configure.h.cmake | 26 ++++ .../importStaticPlugin.cpp | 35 ++++++ 13 files changed, 553 insertions(+) create mode 100644 modules/FindGlslOptimizer.cmake create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/CMakeLists.txt create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.cpp create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.h create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerShaderConverter.conf create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/Test/CMakeLists.txt create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/Test/GlslOptimizerConverterTest.cpp create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/Test/configure.h.cmake create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/configure.h.cmake create mode 100644 src/MagnumPlugins/GlslOptimizerShaderConverter/importStaticPlugin.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 021c01b01..bb1d73c1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,11 @@ find_package(Magnum REQUIRED) include(CMakeDependentOption) +set(_PREV_CMAKE_PIC ${CMAKE_POSITION_INDEPENDENT_CODE}) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +add_subdirectory(glsl-optimizer) +set(CMAKE_POSITION_INDEPENDENT_CODE ${_PREV_CMAKE_PIC}) + # Plugins to build option(WITH_ASSIMPIMPORTER "Build AssimpImporter plugin" OFF) option(WITH_BASISIMAGECONVERTER "Build BasisImageConverter plugin" OFF) @@ -47,6 +52,7 @@ option(WITH_DRWAVAUDIOIMPORTER "Build DrWavAudioImporter plugin" OFF) option(WITH_FAAD2AUDIOIMPORTER "Build Faad2AudioImporter plugin" OFF) cmake_dependent_option(WITH_FREETYPEFONT "Build FreeTypeFont plugin" OFF "NOT WITH_HARFBUZZFONT" ON) option(WITH_GLSLANGSHADERCONVERTER "Build GlslangShaderConverter plugin" OFF) +option(WITH_GLSLOPTIMIZERSHADERCONVERTER "Build GlslOptimizerShaderConverter plugin" OFF) option(WITH_HARFBUZZFONT "Build HarfBuzzFont plugin" OFF) option(WITH_ICOIMPORTER "Build IcoImporter plugin" OFF) option(WITH_JPEGIMAGECONVERTER "Build JpegImageConverter plugin" OFF) diff --git a/modules/FindGlslOptimizer.cmake b/modules/FindGlslOptimizer.cmake new file mode 100644 index 000000000..c89c1f068 --- /dev/null +++ b/modules/FindGlslOptimizer.cmake @@ -0,0 +1,54 @@ +#.rst: +# Find glsl-optimizer +# ------------------- +# +# Finds the glsl-optimizer library. This module defines: +# +# GlslOptimizer_FOUND - True if the glsl-optimizer library is found +# GlslOptimizer::GlslOptimizer - glsl-optimizer imported target. +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020 Vladimír Vondruš +# +# 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. +# + +# This currently handles only the case of a CMake subproject. Sorry. +if(TARGET glsl_optimizer) + # The glsl_optimizer target doesn't define any usable + # INTERFACE_INCLUDE_DIRECTORIES, so let's extract that from the SOURCE_DIR + # property instead. + get_target_property(_GLSL_OPTIMIZER_INTERFACE_INCLUDE_DIRECTORIES glsl_optimizer SOURCE_DIR) + set(_GLSL_OPTIMIZER_INTERFACE_INCLUDE_DIRECTORIES ${_GLSL_OPTIMIZER_INTERFACE_INCLUDE_DIRECTORIES}/src) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args("GlslOptimizer" DEFAULT_MSG + _GLSL_OPTIMIZER_INTERFACE_INCLUDE_DIRECTORIES) + +if(NOT TARGET GlslOptimizer::GlslOptimizer) + add_library(GlslOptimizer::GlslOptimizer INTERFACE IMPORTED) + set_target_properties(GlslOptimizer::GlslOptimizer PROPERTIES + INTERFACE_LINK_LIBRARIES glsl_optimizer + INTERFACE_INCLUDE_DIRECTORIES ${_GLSL_OPTIMIZER_INTERFACE_INCLUDE_DIRECTORIES}) +endif() diff --git a/package/archlinux/PKGBUILD-release b/package/archlinux/PKGBUILD-release index cd6cffb2a..853dd839f 100644 --- a/package/archlinux/PKGBUILD-release +++ b/package/archlinux/PKGBUILD-release @@ -33,6 +33,7 @@ build() { -DWITH_DRWAVAUDIOIMPORTER=ON \ -DWITH_FAAD2AUDIOIMPORTER=ON \ -DWITH_FREETYPEFONT=ON \ + -DWITH_GLSLOPTIMIZERSHADERCONVERTER=ON \ -DWITH_GLSLANGSHADERCONVERTER=ON \ -DWITH_HARFBUZZFONT=ON \ -DWITH_ICOIMPORTER=ON \ @@ -74,6 +75,7 @@ build() { -DWITH_DRWAVAUDIOIMPORTER=ON \ -DWITH_FAAD2AUDIOIMPORTER=ON \ -DWITH_FREETYPEFONT=ON \ + -DWITH_GLSLOPTIMIZERSHADERCONVERTER=ON \ -DWITH_GLSLANGSHADERCONVERTER=ON \ -DWITH_HARFBUZZFONT=ON \ -DWITH_ICOIMPORTER=ON \ diff --git a/src/MagnumPlugins/CMakeLists.txt b/src/MagnumPlugins/CMakeLists.txt index d228341b8..88d11b977 100644 --- a/src/MagnumPlugins/CMakeLists.txt +++ b/src/MagnumPlugins/CMakeLists.txt @@ -79,6 +79,10 @@ if(WITH_GLSLANGSHADERCONVERTER) add_subdirectory(GlslangShaderConverter) endif() +if(WITH_GLSLOPTIMIZERSHADERCONVERTER) + add_subdirectory(GlslOptimizerShaderConverter) +endif() + if(WITH_HARFBUZZFONT) add_subdirectory(HarfBuzzFont) endif() diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/CMakeLists.txt b/src/MagnumPlugins/GlslOptimizerShaderConverter/CMakeLists.txt new file mode 100644 index 000000000..06f156440 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/CMakeLists.txt @@ -0,0 +1,74 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020 Vladimír Vondruš +# +# 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. +# + +find_package(Magnum REQUIRED ShaderTools) +find_package(GlslOptimizer REQUIRED) + +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + +# GlslOptimizerShaderConverter plugin +add_plugin(GlslOptimizerShaderConverter + "${MAGNUM_PLUGINS_SHADERCONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_SHADERCONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_SHADERCONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_SHADERCONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" + GlslOptimizerShaderConverter.conf + GlslOptimizerConverter.cpp + GlslOptimizerConverter.h) +if(MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC AND BUILD_STATIC_PIC) + set_target_properties(GlslOptimizerShaderConverter PROPERTIES POSITION_INDEPENDENT_CODE ON) +endif() +target_include_directories(GlslOptimizerShaderConverter PUBLIC + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_BINARY_DIR}/src) +target_link_libraries(GlslOptimizerShaderConverter PUBLIC + Magnum::ShaderTools + GlslOptimizer::GlslOptimizer) +# Modify output location only if all are set, otherwise it makes no sense +if(CMAKE_RUNTIME_OUTPUT_DIRECTORY AND CMAKE_LIBRARY_OUTPUT_DIRECTORY AND CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set_target_properties(GlslOptimizerShaderConverter PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/magnum$<$:-d>/shaderconverters + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/magnum$<$:-d>/shaderconverters + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/magnum$<$:-d>/shaderconverters) +endif() + +install(FILES GlslOptimizerConverter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/GlslOptimizerShaderConverter) + +# Automatic static plugin import +if(MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC) + install(FILES importStaticPlugin.cpp DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/GlslOptimizerShaderConverter) + target_sources(GlslOptimizerShaderConverter INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/importStaticPlugin.cpp) +endif() + +if(BUILD_TESTS) + add_subdirectory(Test) +endif() + +# MagnumPlugins GlslOptimizerShaderConverter target alias for superprojects +add_library(MagnumPlugins::GlslOptimizerShaderConverter ALIAS GlslOptimizerShaderConverter) diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.cpp b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.cpp new file mode 100644 index 000000000..edaeb8503 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.cpp @@ -0,0 +1,118 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +#include "GlslOptimizerConverter.h" + +#include +#include +#include +#include +#include + +#include "compiler/glsl/glsl_optimizer.h" + +namespace Magnum { namespace ShaderTools { + +struct GlslOptimizerConverter::State { + Format inputFormat, outputFormat; + Containers::String inputVersion, outputVersion; +}; + +GlslOptimizerConverter::GlslOptimizerConverter(PluginManager::AbstractManager& manager, const std::string& plugin): AbstractConverter{manager, plugin}, _state{Containers::InPlaceInit} {} + +ConverterFeatures GlslOptimizerConverter::doFeatures() const { + return ConverterFeature::ConvertData; +} + +void GlslOptimizerConverter::doSetInputFormat(const Format format, const Containers::StringView version) { + _state->inputFormat = format; + _state->inputVersion = Containers::String::nullTerminatedGlobalView(version); +} + +void GlslOptimizerConverter::doSetOutputFormat(const Format format, const Containers::StringView version) { + _state->outputFormat = format; + _state->outputVersion = Containers::String::nullTerminatedGlobalView(version); +} + +Containers::Array GlslOptimizerConverter::doConvertDataToData(const Stage stage, const Containers::ArrayView data) { + /* Check input/output format validity */ + /** @todo allow HLSL once we implement support for it */ + if(_state->inputFormat != Format::Unspecified && + _state->inputFormat != Format::Glsl) { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): input format should be Glsl or Unspecified but got" << _state->inputFormat; + return {}; + } + if(_state->outputFormat != Format::Unspecified && + _state->outputFormat != Format::Glsl) { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): output format should be Glsl or Unspecified but got" << _state->outputFormat; + return {}; + } + if(!_state->inputVersion.isEmpty()) { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): input format version should be empty but got" << _state->inputVersion; + return {}; + } + if(!_state->outputVersion.isEmpty()) { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): output format version should be empty but got" << _state->outputVersion; + return {}; + } + + glslopt_shader_type type; + if(stage == Stage::Vertex || stage == Stage::Unspecified) + type = kGlslOptShaderVertex; + else if(stage == Stage::Fragment) + type = kGlslOptShaderFragment; + else { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): stage can be either Vertex, Fragment or Unspecified but got" << stage; + return {}; + } + + // TODO: target configuration + glslopt_ctx* const ctx = glslopt_initialize(kGlslTargetOpenGL); + Containers::ScopeGuard ctxCleanup{ctx, glslopt_cleanup}; + + /* Create a (null-terminated) string out of the input data. Unfortunately + with ArrayView we have no way to know if the input was already + null-terminated so this is always a copy. */ + const Containers::String source = data; + + // TODO: expose glslopt_options + glslopt_shader* const shader = glslopt_optimize(ctx, type, source.data(), 0); + Containers::ScopeGuard{shader, glslopt_shader_delete}; + + if(!glslopt_get_status(shader)) { + Error{} << "ShaderTools::GlslOptimizerConverter::convertDataToData(): optimization failed:" << glslopt_get_log(shader); + return {}; + } + + const char* const optimized = glslopt_get_output(shader); + Containers::Array out{Containers::NoInit, std::strlen(optimized)}; + Utility::copy(Containers::ArrayView{optimized, out.size()}, out); + return out; +} + +}} + +CORRADE_PLUGIN_REGISTER(GlslOptimizerShaderConverter, Magnum::ShaderTools::GlslOptimizerConverter, + "cz.mosra.magnum.ShaderTools.AbstractConverter/0.1") diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.h b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.h new file mode 100644 index 000000000..ace3cd284 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerConverter.h @@ -0,0 +1,98 @@ +#ifndef Magnum_ShaderTools_GlslOptimizerConverter_h +#define Magnum_ShaderTools_GlslOptimizerConverter_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +/** @file + * @brief Class @ref Magnum::ShaderTools::GlslOptimizerConverter + * @m_since_latest_{plugins} + */ + +#include + +#include "MagnumPlugins/GlslOptimizerShaderConverter/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC + #ifdef GlslOptimizerShaderConverter_EXPORTS + #define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL CORRADE_VISIBILITY_LOCAL +#else +#define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_EXPORT +#define MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL +#endif + +namespace Magnum { namespace ShaderTools { + +/** +@brief GLSL-optimizer shader converter plugin +@m_since_latest_{plugins} + +@m_keywords{GlslOptimizerShaderConverter} +@m_keywords{GlslShaderConverter} + +Uses [glsl-optimizer](https://github.com/aras-p/glsl-optimizer) for GLSL +optimization (@ref Format::Glsl). + +This plugin provides the `GlslShaderConverter` plugin. + +@m_class{m-block m-danger} + +@thirdparty This plugin makes use of the + [glsl-optimizer](https://github.com/aras-p/glsl-optimizer) library, + licensed under @m_class{m-label m-success} **MIT** + ([license text](https://github.com/aras-p/glsl-optimizer), + [choosealicense.com](https://choosealicense.com/licenses/mit/)). It + requires attribution for public use. + +@section ShaderTools-GlslOptimizerConverter-usage Usage + +TODO TODO +*/ +class MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_EXPORT GlslOptimizerConverter: public AbstractConverter { + public: + /** @brief Plugin manager constructor */ + explicit GlslOptimizerConverter(PluginManager::AbstractManager& manager, const std::string& plugin); + + private: + MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL ConverterFeatures doFeatures() const override; + MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL void doSetInputFormat(Format format, Containers::StringView version) override; + MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL void doSetOutputFormat(Format format, Containers::StringView version) override; + + MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_LOCAL Containers::Array doConvertDataToData(Magnum::ShaderTools::Stage stage, Containers::ArrayView data) override; + + struct State; + Containers::Pointer _state; +}; + +}} + +#endif diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerShaderConverter.conf b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerShaderConverter.conf new file mode 100644 index 000000000..2db98aaff --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/GlslOptimizerShaderConverter.conf @@ -0,0 +1 @@ +provides=GlslShaderConverter diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/CMakeLists.txt b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/CMakeLists.txt new file mode 100644 index 000000000..592d993a9 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/CMakeLists.txt @@ -0,0 +1,56 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020 Vladimír Vondruš +# +# 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. +# + +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (xcode7.3 has CMake 3.6). +if(NOT MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC) + set(GLSLOPTIMIZERSHADERCONVERTER_PLUGIN_FILENAME $) +endif() + +# First replace ${} variables, then $<> generator expressions +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + +corrade_add_test(GlslOptimizerShaderConverterTest GlslOptimizerConverterTest.cpp + LIBRARIES Magnum::ShaderTools) +target_include_directories(GlslOptimizerShaderConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) +if(MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC) + target_link_libraries(GlslOptimizerShaderConverterTest PRIVATE GlslOptimizerShaderConverter) +else() + # So the plugins get properly built when building the test + add_dependencies(GlslOptimizerShaderConverterTest GlslOptimizerShaderConverter) +endif() +set_target_properties(GlslOptimizerShaderConverterTest PROPERTIES FOLDER "MagnumPlugins/GlslOptimizerShaderConverter/Test") +if(CORRADE_BUILD_STATIC AND NOT MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC) + # CMake < 3.4 does this implicitly, but 3.4+ not anymore (see CMP0065). + # That's generally okay, *except if* the build is static, the executable + # uses a plugin manager and needs to share globals with the plugins (such + # as output redirection and so on). + set_target_properties(GlslOptimizerShaderConverterTest PROPERTIES ENABLE_EXPORTS ON) +endif() diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/GlslOptimizerConverterTest.cpp b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/GlslOptimizerConverterTest.cpp new file mode 100644 index 000000000..e1f96083f --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/GlslOptimizerConverterTest.cpp @@ -0,0 +1,51 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +#include +#include + +#include "configure.h" + +namespace Magnum { namespace ShaderTools { namespace Test { namespace { + +struct GlslOptimizerConverterTest: TestSuite::Tester { + explicit GlslOptimizerConverterTest(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _converterManager{"nonexistent"}; +}; + +GlslOptimizerConverterTest::GlslOptimizerConverterTest() { + + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef GLSLOPTIMIZERSHADERCONVERTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT_OUTPUT(_converterManager.load(GLSLOPTIMIZERSHADERCONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif +} + +}}}} + +CORRADE_TEST_MAIN(Magnum::ShaderTools::Test::GlslOptimizerConverterTest) diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/configure.h.cmake b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/configure.h.cmake new file mode 100644 index 000000000..ea202c998 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/Test/configure.h.cmake @@ -0,0 +1,28 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +#cmakedefine GLSLOPTIMIZERSHADERCONVERTER_PLUGIN_FILENAME "${GLSLOPTIMIZERSHADERCONVERTER_PLUGIN_FILENAME}" +#define GLSLOPTIMIZERSHADERCONVERTER_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" +#define GLSLOPTIMIZERSHADERCONVERTER_TEST_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}" diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/configure.h.cmake b/src/MagnumPlugins/GlslOptimizerShaderConverter/configure.h.cmake new file mode 100644 index 000000000..a83d02cc6 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/configure.h.cmake @@ -0,0 +1,26 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +#cmakedefine MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC diff --git a/src/MagnumPlugins/GlslOptimizerShaderConverter/importStaticPlugin.cpp b/src/MagnumPlugins/GlslOptimizerShaderConverter/importStaticPlugin.cpp new file mode 100644 index 000000000..a9426b256 --- /dev/null +++ b/src/MagnumPlugins/GlslOptimizerShaderConverter/importStaticPlugin.cpp @@ -0,0 +1,35 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + 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. +*/ + +#include "MagnumPlugins/GlslOptimizerShaderConverter/configure.h" + +#ifdef MAGNUM_GLSLOPTIMIZERSHADERCONVERTER_BUILD_STATIC +#include + +static int magnumGlslOptimizerShaderConverterStaticImporter() { + CORRADE_PLUGIN_IMPORT(GlslOptimizerShaderConverter) + return 1; +} CORRADE_AUTOMATIC_INITIALIZER(magnumGlslOptimizerShaderConverterStaticImporter) +#endif