Browse Source

Final attempt to fix shaders w/o version directive.

Took me insane amount of time. I blame those 12-hour working days.
pull/187/head^2
Vladimír Vondruš 10 years ago
parent
commit
94a3ae8174
  1. 10
      src/Magnum/Shader.cpp
  2. 4
      src/Magnum/Shader.h
  3. 2
      src/Magnum/Test/ShaderGLTest.cpp

10
src/Magnum/Shader.cpp

@ -786,13 +786,15 @@ Shader& Shader::addSource(std::string source) {
/* Fix line numbers, so line 41 of third added file is marked as 3(41) /* Fix line numbers, so line 41 of third added file is marked as 3(41)
in case shader version was not Version::None, because then source 0 in case shader version was not Version::None, because then source 0
is the #version directive added in constructur. is the #version directive added in constructor.
If version was Version::None, line 41 of third added file is marked If version was Version::None, line 41 of third added file is marked
as 2(41). We apparently can't add even the #line directive before as 2(41). We apparently can't add even the #line directive before
the potential `#version` directive -- in that case the first source the potential `#version` directive -- in that case the first source
file is not marked with any file number, but that's equivalent to file is not marked with any file number, thus having number 0. In
the default where first file is marked as 0. */ order to avoid complex logic in compile() where we assert for at
least some user-provided source, an empty string is added here
instead. */
if(!_sources.empty()) _sources.push_back("#line 1 " + if(!_sources.empty()) _sources.push_back("#line 1 " +
#if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID)
std::to_string((_sources.size()+1)/2) + std::to_string((_sources.size()+1)/2) +
@ -800,6 +802,8 @@ Shader& Shader::addSource(std::string source) {
converter.str() + converter.str() +
#endif #endif
'\n'); '\n');
else _sources.emplace_back();
_sources.push_back(std::move(source)); _sources.push_back(std::move(source));
} }

4
src/Magnum/Shader.h

@ -595,7 +595,9 @@ class MAGNUM_EXPORT Shader: public AbstractObject {
* *
* Adds given source to source list, preceeded with @c \#line directive * Adds given source to source list, preceeded with @c \#line directive
* marking first line of the source as `n(1)` where n is number of * marking first line of the source as `n(1)` where n is number of
* added source. If passed string is empty, the function does nothing. * added source. The source number `0` is @c \#version directive added
* in constructor, if any. If passed string is empty, the function does
* nothing.
* @see @ref addFile() * @see @ref addFile()
*/ */
Shader& addSource(std::string source); Shader& addSource(std::string source);

2
src/Magnum/Test/ShaderGLTest.cpp

@ -200,6 +200,7 @@ void ShaderGLTest::addSourceNoVersion() {
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
CORRADE_COMPARE(shader.sources(), (std::vector<std::string>{ CORRADE_COMPARE(shader.sources(), (std::vector<std::string>{
"",
"#version 120\n", "#version 120\n",
"#line 1 1\n", "#line 1 1\n",
"#define FOO BAR\n", "#define FOO BAR\n",
@ -208,6 +209,7 @@ void ShaderGLTest::addSourceNoVersion() {
})); }));
#else #else
CORRADE_COMPARE(shader.sources(), (std::vector<std::string>{ CORRADE_COMPARE(shader.sources(), (std::vector<std::string>{
"",
"#version 100\n", "#version 100\n",
"#line 1 1\n", "#line 1 1\n",
"#define FOO BAR\n", "#define FOO BAR\n",

Loading…
Cancel
Save