Browse Source

AnyShaderConverter: propagate optimization level as well.

Finally a complete API... except for linking, which no plugin exposes
yet so I can't test it.
pull/481/head
Vladimír Vondruš 6 years ago
parent
commit
38a2a1f6c4
  1. 17
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp
  2. 1
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.h
  3. 53
      src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp

17
src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp

@ -44,7 +44,7 @@ struct AnyConverter::State {
Containers::Array<std::pair<Containers::String, Containers::String>> definitions; Containers::Array<std::pair<Containers::String, Containers::String>> definitions;
Containers::Array<std::pair<Containers::StringView, Containers::StringView>> definitionViews; Containers::Array<std::pair<Containers::StringView, Containers::StringView>> definitionViews;
Containers::String debugInfoLevel; Containers::String debugInfoLevel, optimizationLevel;
}; };
AnyConverter::AnyConverter(PluginManager::Manager<AbstractConverter>& manager): AbstractConverter{manager} {} AnyConverter::AnyConverter(PluginManager::Manager<AbstractConverter>& manager): AbstractConverter{manager} {}
@ -54,8 +54,7 @@ AnyConverter::AnyConverter(PluginManager::AbstractManager& manager, const std::s
AnyConverter::~AnyConverter() = default; AnyConverter::~AnyConverter() = default;
ConverterFeatures AnyConverter::doFeatures() const { ConverterFeatures AnyConverter::doFeatures() const {
/** @todo Optimize, also need checks that the plugin actually supports it */ return ConverterFeature::ValidateFile|ConverterFeature::ConvertFile|ConverterFeature::Preprocess|ConverterFeature::DebugInfo|ConverterFeature::Optimize;
return ConverterFeature::ValidateFile|ConverterFeature::ConvertFile|ConverterFeature::Preprocess|ConverterFeature::DebugInfo;
} }
void AnyConverter::doSetInputFormat(const Format format, const Containers::StringView version) { void AnyConverter::doSetInputFormat(const Format format, const Containers::StringView version) {
@ -94,6 +93,10 @@ void AnyConverter::doSetDebugInfoLevel(const Containers::StringView level) {
_state->debugInfoLevel = Containers::String::nullTerminatedGlobalView(level); _state->debugInfoLevel = Containers::String::nullTerminatedGlobalView(level);
} }
void AnyConverter::doSetOptimizationLevel(const Containers::StringView level) {
_state->optimizationLevel = Containers::String::nullTerminatedGlobalView(level);
}
namespace { namespace {
using namespace Containers::Literals; using namespace Containers::Literals;
@ -249,6 +252,12 @@ bool AnyConverter::doConvertFileToFile(const Stage stage, const Containers::Stri
return {}; return {};
} }
/* Check that it can optimize, in case we were asked to */
if(!_state->optimizationLevel.isEmpty() && !(converter->features() & ConverterFeature::Optimize)) {
Error{} << "ShaderTools::AnyConverter::convertFileToFile():" << metadata->name() << "does not support optimization";
return {};
}
/* Propagate input/output version and flags */ /* Propagate input/output version and flags */
converter->setFlags(flags()); converter->setFlags(flags());
converter->setInputFormat(_state->inputFormat, _state->inputVersion); converter->setInputFormat(_state->inputFormat, _state->inputVersion);
@ -259,6 +268,8 @@ bool AnyConverter::doConvertFileToFile(const Stage stage, const Containers::Stri
converter->setDefinitions(_state->definitionViews); converter->setDefinitions(_state->definitionViews);
if(!_state->debugInfoLevel.isEmpty()) if(!_state->debugInfoLevel.isEmpty())
converter->setDebugInfoLevel(_state->debugInfoLevel); converter->setDebugInfoLevel(_state->debugInfoLevel);
if(!_state->optimizationLevel.isEmpty())
converter->setOptimizationLevel(_state->optimizationLevel);
/* Try to convert the file (error output should be printed by the plugin /* Try to convert the file (error output should be printed by the plugin
itself) */ itself) */

1
src/MagnumPlugins/AnyShaderConverter/AnyConverter.h

@ -135,6 +135,7 @@ class MAGNUM_ANYSHADERCONVERTER_EXPORT AnyConverter: public AbstractConverter {
MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetOutputFormat(Format, Containers::StringView version) override; MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetOutputFormat(Format, Containers::StringView version) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetDefinitions(Containers::ArrayView<const std::pair<Containers::StringView, Containers::StringView>> definitions) override; MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetDefinitions(Containers::ArrayView<const std::pair<Containers::StringView, Containers::StringView>> definitions) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetDebugInfoLevel(Containers::StringView level) override; MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetDebugInfoLevel(Containers::StringView level) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetOptimizationLevel(Containers::StringView level) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateFile(Stage stage, Containers::StringView filename) override; MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateFile(Stage stage, Containers::StringView filename) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL bool doConvertFileToFile(Stage stage, Containers::StringView from, Containers::StringView to) override; MAGNUM_ANYSHADERCONVERTER_LOCAL bool doConvertFileToFile(Stage stage, Containers::StringView from, Containers::StringView to) override;

53
src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp

@ -54,11 +54,13 @@ struct AnyConverterTest: TestSuite::Tester {
void convertNotSupported(); void convertNotSupported();
void convertPreprocessNotSupported(); void convertPreprocessNotSupported();
void convertDebugInfoNotSupported(); void convertDebugInfoNotSupported();
void convertOptimizationNotSupported();
void convertPropagateFlags(); void convertPropagateFlags();
void convertPropagateInputVersion(); void convertPropagateInputVersion();
void convertPropagateOutputVersion(); void convertPropagateOutputVersion();
void convertPropagatePreprocess(); void convertPropagatePreprocess();
void convertPropagateDebugInfo(); void convertPropagateDebugInfo();
void convertPropagateOptimization();
void detectValidate(); void detectValidate();
void detectConvert(); void detectConvert();
@ -106,11 +108,13 @@ AnyConverterTest::AnyConverterTest() {
&AnyConverterTest::convertNotSupported, &AnyConverterTest::convertNotSupported,
&AnyConverterTest::convertPreprocessNotSupported, &AnyConverterTest::convertPreprocessNotSupported,
&AnyConverterTest::convertDebugInfoNotSupported, &AnyConverterTest::convertDebugInfoNotSupported,
&AnyConverterTest::convertOptimizationNotSupported,
&AnyConverterTest::convertPropagateFlags, &AnyConverterTest::convertPropagateFlags,
&AnyConverterTest::convertPropagateInputVersion, &AnyConverterTest::convertPropagateInputVersion,
&AnyConverterTest::convertPropagateOutputVersion, &AnyConverterTest::convertPropagateOutputVersion,
&AnyConverterTest::convertPropagatePreprocess, &AnyConverterTest::convertPropagatePreprocess,
&AnyConverterTest::convertPropagateDebugInfo}); &AnyConverterTest::convertPropagateDebugInfo,
&AnyConverterTest::convertPropagateOptimization});
addInstancedTests({&AnyConverterTest::detectValidate}, addInstancedTests({&AnyConverterTest::detectValidate},
Containers::arraySize(DetectValidateData)); Containers::arraySize(DetectValidateData));
@ -358,6 +362,29 @@ void AnyConverterTest::convertDebugInfoNotSupported() {
"ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support controlling debug info output\n"); "ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support controlling debug info output\n");
} }
void AnyConverterTest::convertOptimizationNotSupported() {
PluginManager::Manager<AbstractConverter> manager{MAGNUM_PLUGINS_SHADERCONVERTER_INSTALL_DIR};
#ifdef ANYSHADERCONVERTER_PLUGIN_FILENAME
CORRADE_VERIFY(manager.load(ANYSHADERCONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif
if(manager.load("GlslangShaderConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("GlslangShaderConverter plugin can't be loaded.");
Containers::Pointer<AbstractConverter> converter = manager.instantiate("AnyShaderConverter");
converter->setOptimizationLevel("1");
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.glsl"),
Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv")));
/** @todo it once may support that, in which case we need to find another
victim */
CORRADE_COMPARE(out.str(),
"ShaderTools::AnyConverter::convertFileToFile(): GlslangShaderConverter does not support optimization\n");
}
void AnyConverterTest::convertPropagateFlags() { void AnyConverterTest::convertPropagateFlags() {
PluginManager::Manager<AbstractConverter> manager{MAGNUM_PLUGINS_SHADERCONVERTER_INSTALL_DIR}; PluginManager::Manager<AbstractConverter> manager{MAGNUM_PLUGINS_SHADERCONVERTER_INSTALL_DIR};
#ifdef ANYSHADERCONVERTER_PLUGIN_FILENAME #ifdef ANYSHADERCONVERTER_PLUGIN_FILENAME
@ -494,6 +521,30 @@ void AnyConverterTest::convertPropagateDebugInfo() {
"ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 or empty but got 2\n"); "ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 or empty but got 2\n");
} }
void AnyConverterTest::convertPropagateOptimization() {
PluginManager::Manager<AbstractConverter> manager{MAGNUM_PLUGINS_SHADERCONVERTER_INSTALL_DIR};
#ifdef ANYSHADERCONVERTER_PLUGIN_FILENAME
CORRADE_VERIFY(manager.load(ANYSHADERCONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif
if(manager.load("SpirvToolsShaderConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("SpirvToolsShaderConverter plugin can't be loaded.");
Containers::Pointer<AbstractConverter> converter = manager.instantiate("AnyShaderConverter");
/* This is an invalid level */
converter->setOptimizationLevel("2");
/* We have to supply a valid file path because the version gets checked in
doConvertDataToData(), called from AbstractConverter::doConvertFileToFile()
with the file contents. */
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter->convertFileToFile(Stage::Fragment, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv")));
CORRADE_COMPARE(out.str(),
"ShaderTools::SpirvToolsConverter::convertDataToData(): optimization level should be 0, 1, s, legalizeHlsl, vulkanToWebGpu, webGpuToVulkan or empty but got 2\n");
}
void AnyConverterTest::detectValidate() { void AnyConverterTest::detectValidate() {
auto&& data = DetectValidateData[testCaseInstanceId()]; auto&& data = DetectValidateData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);

Loading…
Cancel
Save