Skip to content

Commit a0dc144

Browse files
author
Hugo Amiard
committed
GL: Cleanup std::string usage in Shader/AbstractShaderProgram
1 parent a496029 commit a0dc144

15 files changed

+140
-132
lines changed

Diff for: src/Magnum/GL/AbstractShaderProgram.cpp

+20-17
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929

3030
#include <Corrade/Containers/Array.h>
3131
#include <Corrade/Containers/Iterable.h>
32+
#include <Corrade/Containers/Pair.h>
3233
#include <Corrade/Containers/StridedArrayView.h>
3334
#ifndef MAGNUM_TARGET_WEBGL
3435
#include <Corrade/Containers/String.h>
3536
#endif
3637
#include <Corrade/Containers/StringStl.h> /** @todo remove once <string>-free */
3738
#include <Corrade/Containers/Reference.h>
39+
#include <Corrade/Utility/Algorithms.h>
3840
#include <Corrade/Utility/DebugStl.h>
3941

4042
#include "Magnum/GL/Context.h"
@@ -340,7 +342,7 @@ AbstractShaderProgram& AbstractShaderProgram::setLabel(const Containers::StringV
340342
}
341343
#endif
342344

343-
std::pair<bool, std::string> AbstractShaderProgram::validate() {
345+
Containers::Pair<bool, Containers::String> AbstractShaderProgram::validate() {
344346
glValidateProgram(_id);
345347

346348
/* Check validation status */
@@ -350,12 +352,11 @@ std::pair<bool, std::string> AbstractShaderProgram::validate() {
350352

351353
/* Error or warning message. The string is returned null-terminated, scrap
352354
the \0 at the end afterwards */
353-
std::string message(logLength, '\n');
355+
Containers::String message(ValueInit, Math::max(logLength, 1)-1);
354356
if(message.size() > 1)
355357
glGetProgramInfoLog(_id, message.size(), nullptr, &message[0]);
356-
message.resize(Math::max(logLength, 1)-1);
357358

358-
return {success, std::move(message)};
359+
return {bool(success), std::move(message)};
359360
}
360361

361362
AbstractShaderProgram& AbstractShaderProgram::draw(Mesh& mesh) {
@@ -554,32 +555,35 @@ void AbstractShaderProgram::bindFragmentDataLocationIndexedInternal(const Unsign
554555
#endif
555556

556557
#ifndef MAGNUM_TARGET_GLES2
557-
void AbstractShaderProgram::setTransformFeedbackOutputs(const Containers::ArrayView<const std::string> outputs, const TransformFeedbackBufferMode bufferMode) {
558+
void AbstractShaderProgram::setTransformFeedbackOutputs(const Containers::ArrayView<const Containers::String> outputs, const TransformFeedbackBufferMode bufferMode) {
558559
(this->*Context::current().state().shaderProgram.transformFeedbackVaryingsImplementation)(outputs, bufferMode);
559560
}
560561

561-
void AbstractShaderProgram::setTransformFeedbackOutputs(const std::initializer_list<std::string> outputs, const TransformFeedbackBufferMode bufferMode) {
562+
void AbstractShaderProgram::setTransformFeedbackOutputs(const std::initializer_list<Containers::String> outputs, const TransformFeedbackBufferMode bufferMode) {
562563
setTransformFeedbackOutputs(Containers::arrayView(outputs), bufferMode);
563564
}
564565

565-
void AbstractShaderProgram::transformFeedbackVaryingsImplementationDefault(const Containers::ArrayView<const std::string> outputs, const TransformFeedbackBufferMode bufferMode) {
566+
void AbstractShaderProgram::transformFeedbackVaryingsImplementationDefault(const Containers::ArrayView<const Containers::String> outputs, const TransformFeedbackBufferMode bufferMode) {
566567
/** @todo VLAs */
567568
Containers::Array<const char*> names{outputs.size()};
568569

569570
Int i = 0;
570-
for(const std::string& output: outputs) names[i++] = output.data();
571+
for(const Containers::String& output: outputs) names[i++] = output.data();
571572

572573
glTransformFeedbackVaryings(_id, outputs.size(), names, GLenum(bufferMode));
573574
}
574575

575576
#ifdef CORRADE_TARGET_WINDOWS
576-
void AbstractShaderProgram::transformFeedbackVaryingsImplementationDanglingWorkaround(const Containers::ArrayView<const std::string> outputs, const TransformFeedbackBufferMode bufferMode) {
577+
void AbstractShaderProgram::transformFeedbackVaryingsImplementationDanglingWorkaround(const Containers::ArrayView<const Containers::String> outputs, const TransformFeedbackBufferMode bufferMode) {
577578
/* NVidia on Windows doesn't copy the names when calling
578579
glTransformFeedbackVaryings() so it then fails at link time because the
579580
char* are dangling. We have to do the copy on the engine side and keep
580581
the values until link time (which can happen any time and multiple
581582
times, so basically for the remaining lifetime of the shader program) */
582-
_transformFeedbackVaryingNames.assign(outputs.begin(), outputs.end());
583+
_transformFeedbackVaryingNames =
584+
Containers::Array<Containers::String>{ValueInit, outputs.size()};
585+
for(size_t i = 0; i < outputs.size(); ++i)
586+
_transformFeedbackVaryingNames[i] = outputs[i];
583587

584588
transformFeedbackVaryingsImplementationDefault({_transformFeedbackVaryingNames.data(), _transformFeedbackVaryingNames.size()}, bufferMode);
585589
}
@@ -608,10 +612,9 @@ bool AbstractShaderProgram::checkLink(const Containers::Iterable<Shader>& shader
608612

609613
/* Error or warning message. The string is returned null-terminated,
610614
strip the \0 at the end afterwards. */
611-
std::string message(logLength, '\n');
615+
Containers::String message(ValueInit, Math::max(logLength, 1)-1);
612616
if(message.size() > 1)
613617
glGetProgramInfoLog(_id, message.size(), nullptr, &message[0]);
614-
message.resize(Math::max(logLength, 1)-1);
615618

616619
/* Some drivers are chatty and can't keep shut when there's nothing to
617620
be said, handle that as well. */
@@ -655,16 +658,16 @@ bool AbstractShaderProgram::isLinkFinished() {
655658
return success == GL_TRUE;
656659
}
657660

658-
void AbstractShaderProgram::cleanLogImplementationNoOp(std::string&) {}
661+
void AbstractShaderProgram::cleanLogImplementationNoOp(Containers::String&) {}
659662

660663
#if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES)
661-
void AbstractShaderProgram::cleanLogImplementationIntelWindows(std::string& message) {
664+
void AbstractShaderProgram::cleanLogImplementationIntelWindows(Containers::String& message) {
662665
if(message == "No errors.\n") message = {};
663666
}
664667
#endif
665668

666669
#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_WEBGL)
667-
void AbstractShaderProgram::cleanLogImplementationAngle(std::string& message) {
670+
void AbstractShaderProgram::cleanLogImplementationAngle(Containers::String& message) {
668671
if(message == "\n") message = {};
669672
}
670673
#endif
@@ -676,15 +679,15 @@ void AbstractShaderProgram::completionStatusImplementationFallback(GLuint, GLenu
676679
Int AbstractShaderProgram::uniformLocationInternal(const Containers::ArrayView<const char> name) {
677680
const GLint location = glGetUniformLocation(_id, name);
678681
if(location == -1)
679-
Warning{} << "GL::AbstractShaderProgram: location of uniform \'" << Debug::nospace << std::string{name, name.size()} << Debug::nospace << "\' cannot be retrieved";
682+
Warning{} << "GL::AbstractShaderProgram: location of uniform \'" << Debug::nospace << Containers::String{name, name.size()} << Debug::nospace << "\' cannot be retrieved";
680683
return location;
681684
}
682685

683686
#ifndef MAGNUM_TARGET_GLES2
684687
UnsignedInt AbstractShaderProgram::uniformBlockIndexInternal(const Containers::ArrayView<const char> name) {
685688
const GLuint index = glGetUniformBlockIndex(_id, name);
686689
if(index == GL_INVALID_INDEX)
687-
Warning{} << "GL::AbstractShaderProgram: index of uniform block \'" << Debug::nospace << std::string{name, name.size()} << Debug::nospace << "\' cannot be retrieved";
690+
Warning{} << "GL::AbstractShaderProgram: index of uniform block \'" << Debug::nospace << Containers::String{name, name.size()} << Debug::nospace << "\' cannot be retrieved";
688691
return index;
689692
}
690693
#endif

Diff for: src/Magnum/GL/AbstractShaderProgram.h

+17-16
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,17 @@
3131
* @brief Class @ref Magnum::GL::AbstractShaderProgram, macro @ref MAGNUM_GL_ABSTRACTSHADERPROGRAM_SUBCLASS_DRAW_IMPLEMENTATION(), @ref MAGNUM_GL_ABSTRACTSHADERPROGRAM_SUBCLASS_DISPATCH_IMPLEMENTATION()
3232
*/
3333

34-
#include <string>
3534
#include <Corrade/Containers/ArrayView.h>
35+
#include <Corrade/Containers/String.h>
36+
#include <Corrade/Containers/StringView.h>
3637

3738
#include "Magnum/Tags.h"
3839
#include "Magnum/GL/AbstractObject.h"
3940
#include "Magnum/GL/Attribute.h"
4041
#include "Magnum/GL/GL.h"
4142

4243
#if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES2)
43-
#include <vector>
44+
#include <Corrade/Containers/Array.h>
4445
#endif
4546

4647
#ifdef MAGNUM_BUILD_DEPRECATED
@@ -832,7 +833,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
832833
* @def_gl{VALIDATE_STATUS}, @def_gl{INFO_LOG_LENGTH},
833834
* @fn_gl_keyword{GetProgramInfoLog}
834835
*/
835-
std::pair<bool, std::string> validate();
836+
Containers::Pair<bool, Containers::String> validate();
836837

837838
/**
838839
* @brief Draw a mesh
@@ -1433,7 +1434,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
14331434
* @ref GL-AbstractShaderProgram-attribute-location "class documentation"
14341435
* for more information.
14351436
*/
1436-
void bindAttributeLocation(UnsignedInt location, const std::string& name) {
1437+
void bindAttributeLocation(UnsignedInt location, Containers::StringView name) {
14371438
bindAttributeLocationInternal(location, {name.data(), name.size()});
14381439
}
14391440

@@ -1462,7 +1463,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
14621463
* @requires_gl Multiple blend function inputs are not available in
14631464
* OpenGL ES or WebGL.
14641465
*/
1465-
void bindFragmentDataLocationIndexed(UnsignedInt location, UnsignedInt index, const std::string& name) {
1466+
void bindFragmentDataLocationIndexed(UnsignedInt location, UnsignedInt index, Containers::StringView name) {
14661467
bindFragmentDataLocationIndexedInternal(location, index, {name.data(), name.size()});
14671468
}
14681469

@@ -1489,7 +1490,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
14891490
* in OpenGL ES 2.0 and @webgl_extension{WEBGL,draw_buffers} in
14901491
* WebGL 1.0.
14911492
*/
1492-
void bindFragmentDataLocation(UnsignedInt location, const std::string& name) {
1493+
void bindFragmentDataLocation(UnsignedInt location, Containers::StringView name) {
14931494
bindFragmentDataLocationInternal(location, {name.data(), name.size()});
14941495
}
14951496

@@ -1532,8 +1533,8 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
15321533
* @requires_gl Special output names `gl_NextBuffer` and
15331534
* `gl_SkipComponents#` are not available in OpenGL ES or WebGL.
15341535
*/
1535-
void setTransformFeedbackOutputs(Containers::ArrayView<const std::string> outputs, TransformFeedbackBufferMode bufferMode);
1536-
void setTransformFeedbackOutputs(std::initializer_list<std::string> outputs, TransformFeedbackBufferMode bufferMode); /**< @overload */
1536+
void setTransformFeedbackOutputs(Containers::ArrayView<const Containers::String> outputs, TransformFeedbackBufferMode bufferMode);
1537+
void setTransformFeedbackOutputs(std::initializer_list<Containers::String> outputs, TransformFeedbackBufferMode bufferMode); /**< @overload */
15371538
#endif
15381539

15391540
/**
@@ -1601,7 +1602,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
16011602
* @ref GL-AbstractShaderProgram-uniform-location "class documentation"
16021603
* for more information.
16031604
*/
1604-
Int uniformLocation(const std::string& name) {
1605+
Int uniformLocation(Containers::StringView name) {
16051606
return uniformLocationInternal({name.data(), name.size()});
16061607
}
16071608

@@ -1627,7 +1628,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
16271628
* @ref GL-AbstractShaderProgram-uniform-block-binding "class documentation"
16281629
* for more information.
16291630
*/
1630-
UnsignedInt uniformBlockIndex(const std::string& name) {
1631+
UnsignedInt uniformBlockIndex(Containers::StringView name) {
16311632
return uniformBlockIndexInternal({name.data(), name.size()});
16321633
}
16331634

@@ -1920,18 +1921,18 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
19201921
UnsignedInt uniformBlockIndexInternal(Containers::ArrayView<const char> name);
19211922

19221923
#ifndef MAGNUM_TARGET_GLES2
1923-
void MAGNUM_GL_LOCAL transformFeedbackVaryingsImplementationDefault(Containers::ArrayView<const std::string> outputs, TransformFeedbackBufferMode bufferMode);
1924+
void MAGNUM_GL_LOCAL transformFeedbackVaryingsImplementationDefault(Containers::ArrayView<const Containers::String> outputs, TransformFeedbackBufferMode bufferMode);
19241925
#ifdef CORRADE_TARGET_WINDOWS
1925-
void MAGNUM_GL_LOCAL transformFeedbackVaryingsImplementationDanglingWorkaround(Containers::ArrayView<const std::string> outputs, TransformFeedbackBufferMode bufferMode);
1926+
void MAGNUM_GL_LOCAL transformFeedbackVaryingsImplementationDanglingWorkaround(Containers::ArrayView<const Containers::String> outputs, TransformFeedbackBufferMode bufferMode);
19261927
#endif
19271928
#endif
19281929

1929-
static MAGNUM_GL_LOCAL void cleanLogImplementationNoOp(std::string& message);
1930+
static MAGNUM_GL_LOCAL void cleanLogImplementationNoOp(Containers::String& message);
19301931
#if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES)
1931-
static MAGNUM_GL_LOCAL void cleanLogImplementationIntelWindows(std::string& message);
1932+
static MAGNUM_GL_LOCAL void cleanLogImplementationIntelWindows(Containers::String& message);
19321933
#endif
19331934
#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_WEBGL)
1934-
static MAGNUM_GL_LOCAL void cleanLogImplementationAngle(std::string& message);
1935+
static MAGNUM_GL_LOCAL void cleanLogImplementationAngle(Containers::String& message);
19351936
#endif
19361937

19371938
MAGNUM_GL_LOCAL static void APIENTRY completionStatusImplementationFallback(GLuint, GLenum, GLint*);
@@ -2009,7 +2010,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
20092010
#if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES2)
20102011
/* Needed for the nv-windows-dangling-transform-feedback-varying-names
20112012
workaround */
2012-
std::vector<std::string> _transformFeedbackVaryingNames;
2013+
Containers::Array<Containers::String> _transformFeedbackVaryingNames;
20132014
#endif
20142015
};
20152016

Diff for: src/Magnum/GL/Implementation/ShaderProgramState.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ struct ShaderProgramState {
4646
void reset();
4747

4848
#ifndef MAGNUM_TARGET_GLES2
49-
void(AbstractShaderProgram::*transformFeedbackVaryingsImplementation)(Containers::ArrayView<const std::string>, AbstractShaderProgram::TransformFeedbackBufferMode);
49+
void(AbstractShaderProgram::*transformFeedbackVaryingsImplementation)(Containers::ArrayView<const Containers::String>, AbstractShaderProgram::TransformFeedbackBufferMode);
5050
#endif
51-
void(*cleanLogImplementation)(std::string&);
51+
void(*cleanLogImplementation)(Containers::String&);
5252
/* This is a direct pointer to a GL function, so needs a __stdcall on
5353
Windows to compile properly on 32 bits */
5454
void(APIENTRY *completionStatusImplementation)(GLuint, GLenum, GLint* value);

Diff for: src/Magnum/GL/Implementation/ShaderState.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ struct ShaderState {
5252
#endif
5353
};
5454

55-
void(Shader::*addSourceImplementation)(std::string);
56-
void(*cleanLogImplementation)(std::string&);
55+
void(Shader::*addSourceImplementation)(Containers::StringView);
56+
void(*cleanLogImplementation)(Containers::String&);
5757
/* This is a direct pointer to a GL function, so needs a __stdcall on
5858
Windows to compile properly on 32 bits */
5959
void(APIENTRY *completionStatusImplementation)(GLuint, GLenum, GLint* value);

0 commit comments

Comments
 (0)