Browse Source

AnyShaderConverter: propagate debug info level.

pull/481/head
Vladimír Vondruš 6 years ago
parent
commit
b18aba5868
  1. 21
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp
  2. 3
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.h
  3. 53
      src/MagnumPlugins/AnyShaderConverter/Test/AnyConverterTest.cpp

21
src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp

@ -43,6 +43,8 @@ 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;
}; };
AnyConverter::AnyConverter(PluginManager::Manager<AbstractConverter>& manager): AbstractConverter{manager} {} AnyConverter::AnyConverter(PluginManager::Manager<AbstractConverter>& manager): AbstractConverter{manager} {}
@ -52,9 +54,8 @@ AnyConverter::AnyConverter(PluginManager::AbstractManager& manager, const std::s
AnyConverter::~AnyConverter() = default; AnyConverter::~AnyConverter() = default;
ConverterFeatures AnyConverter::doFeatures() const { ConverterFeatures AnyConverter::doFeatures() const {
/** @todo Optimize, DebugInfo, those also need checks that the plugin /** @todo Optimize, also need checks that the plugin actually supports it */
actually supports them */ return ConverterFeature::ValidateFile|ConverterFeature::ConvertFile|ConverterFeature::Preprocess|ConverterFeature::DebugInfo;
return ConverterFeature::ValidateFile|ConverterFeature::ConvertFile|ConverterFeature::Preprocess;
} }
void AnyConverter::doSetInputFormat(const Format format, const Containers::StringView version) { void AnyConverter::doSetInputFormat(const Format format, const Containers::StringView version) {
@ -89,6 +90,10 @@ void AnyConverter::doSetDefinitions(const Containers::ArrayView<const std::pair<
} }
} }
void AnyConverter::doSetDebugInfoLevel(const Containers::StringView level) {
_state->debugInfoLevel = Containers::String::nullTerminatedGlobalView(level);
}
namespace { namespace {
using namespace Containers::Literals; using namespace Containers::Literals;
@ -238,14 +243,22 @@ bool AnyConverter::doConvertFileToFile(const Stage stage, const Containers::Stri
return {}; return {};
} }
/* Check that it can output debug info, in case we were asked to */
if(!_state->debugInfoLevel.isEmpty() && !(converter->features() & ConverterFeature::DebugInfo)) {
Error{} << "ShaderTools::AnyConverter::convertFileToFile():" << metadata->name() << "does not support controlling debug info output";
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);
converter->setOutputFormat(_state->outputFormat, _state->outputVersion); converter->setOutputFormat(_state->outputFormat, _state->outputVersion);
/* Propagate definitions, if any */ /* Propagate definitions and debug info, if any */
if(!_state->definitionViews.empty()) if(!_state->definitionViews.empty())
converter->setDefinitions(_state->definitionViews); converter->setDefinitions(_state->definitionViews);
if(!_state->debugInfoLevel.isEmpty())
converter->setDebugInfoLevel(_state->debugInfoLevel);
/* 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) */

3
src/MagnumPlugins/AnyShaderConverter/AnyConverter.h

@ -130,9 +130,12 @@ class MAGNUM_ANYSHADERCONVERTER_EXPORT AnyConverter: public AbstractConverter {
private: private:
MAGNUM_ANYSHADERCONVERTER_LOCAL ConverterFeatures doFeatures() const override; MAGNUM_ANYSHADERCONVERTER_LOCAL ConverterFeatures doFeatures() const override;
MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetInputFormat(Format, Containers::StringView version) override; MAGNUM_ANYSHADERCONVERTER_LOCAL void doSetInputFormat(Format, Containers::StringView version) override;
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 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

@ -53,10 +53,12 @@ struct AnyConverterTest: TestSuite::Tester {
void convert(); void convert();
void convertNotSupported(); void convertNotSupported();
void convertPreprocessNotSupported(); void convertPreprocessNotSupported();
void convertDebugInfoNotSupported();
void convertPropagateFlags(); void convertPropagateFlags();
void convertPropagateInputVersion(); void convertPropagateInputVersion();
void convertPropagateOutputVersion(); void convertPropagateOutputVersion();
void convertPropagatePreprocess(); void convertPropagatePreprocess();
void convertPropagateDebugInfo();
void detectValidate(); void detectValidate();
void detectConvert(); void detectConvert();
@ -103,10 +105,12 @@ AnyConverterTest::AnyConverterTest() {
&AnyConverterTest::convert, &AnyConverterTest::convert,
&AnyConverterTest::convertNotSupported, &AnyConverterTest::convertNotSupported,
&AnyConverterTest::convertPreprocessNotSupported, &AnyConverterTest::convertPreprocessNotSupported,
&AnyConverterTest::convertDebugInfoNotSupported,
&AnyConverterTest::convertPropagateFlags, &AnyConverterTest::convertPropagateFlags,
&AnyConverterTest::convertPropagateInputVersion, &AnyConverterTest::convertPropagateInputVersion,
&AnyConverterTest::convertPropagateOutputVersion, &AnyConverterTest::convertPropagateOutputVersion,
&AnyConverterTest::convertPropagatePreprocess}); &AnyConverterTest::convertPropagatePreprocess,
&AnyConverterTest::convertPropagateDebugInfo});
addInstancedTests({&AnyConverterTest::detectValidate}, addInstancedTests({&AnyConverterTest::detectValidate},
Containers::arraySize(DetectValidateData)); Containers::arraySize(DetectValidateData));
@ -331,6 +335,29 @@ void AnyConverterTest::convertPreprocessNotSupported() {
"ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support preprocessing\n"); "ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support preprocessing\n");
} }
void AnyConverterTest::convertDebugInfoNotSupported() {
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");
converter->setDebugInfoLevel("1");
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter->convertFileToFile({}, Utility::Directory::join(ANYSHADERCONVERTER_TEST_DIR, "file.spv"),
Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spvasm")));
/** @todo it one may support that, in which case we need to find another
victim */
CORRADE_COMPARE(out.str(),
"ShaderTools::AnyConverter::convertFileToFile(): SpirvToolsShaderConverter does not support controlling debug info output\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
@ -443,6 +470,30 @@ void AnyConverterTest::convertPropagatePreprocess() {
"WARNING: {}:10: 'different__but_also_wrong' : identifiers containing consecutive underscores (\"__\") are reserved\n", inputFilename)); "WARNING: {}:10: 'different__but_also_wrong' : identifiers containing consecutive underscores (\"__\") are reserved\n", inputFilename));
} }
void AnyConverterTest::convertPropagateDebugInfo() {
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");
/* This is an invalid level */
converter->setDebugInfoLevel("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.glsl"), Utility::Directory::join(ANYSHADERCONVERTER_TEST_OUTPUT_DIR, "file.spv")));
CORRADE_COMPARE(out.str(),
"ShaderTools::GlslangConverter::convertDataToData(): debug info level should be 0, 1 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