From da03d86e3efd35123912bfd233e4917caa0389c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 17 Nov 2013 19:42:00 +0100 Subject: [PATCH] Explicitly pass also shader source sizes in Shader::compile(). Should avoid potentially costly `strlen` in glShaderSource() internals. --- src/Shader.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Shader.cpp b/src/Shader.cpp index 1767ce98b..3bd02eac6 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -25,6 +25,7 @@ #include "Shader.h" #include +#include #include #include "Extensions.h" @@ -625,17 +626,21 @@ Shader& Shader::addFile(const std::string& filename) { bool Shader::compile() { CORRADE_ASSERT(sources.size() > 1, "Shader::compile(): no files added", false); - /* Array of sources */ - const GLchar** _sources = new const GLchar*[sources.size()]; - for(std::size_t i = 0; i != sources.size(); ++i) - _sources[i] = static_cast(sources[i].c_str()); + /* Array of source string pointers and their lengths */ + /** @todo Use `Containers::::ArrayTuple` to avoid one allocation if it ever + gets to be implemented (we need properly aligned memory too) */ + Containers::Array pointers(sources.size()); + Containers::Array sizes(sources.size()); + for(std::size_t i = 0; i != sources.size(); ++i) { + pointers[i] = static_cast(sources[i].data()); + sizes[i] = sources[i].size(); + } /* Create shader and set its source */ - glShaderSource(_id, sources.size(), _sources, nullptr); + glShaderSource(_id, sources.size(), pointers, sizes); /* Compile shader */ glCompileShader(_id); - delete _sources; /* Check compilation status */ GLint success, logLength;