gobj: slightly more efficient string handling in Shader::make()

This commit is contained in:
rdb 2018-01-15 23:27:46 +01:00
parent 1cada85e6b
commit fe3dab192f
3 changed files with 33 additions and 39 deletions

View File

@ -694,9 +694,9 @@ read_datagram(DatagramIterator &scan) {
*
*/
INLINE Shader::ShaderFile::
ShaderFile(const string &shared) :
ShaderFile(string shared) :
_separate(false),
_shared(shared)
_shared(move(shared))
{
}
@ -704,17 +704,14 @@ ShaderFile(const string &shared) :
*
*/
INLINE Shader::ShaderFile::
ShaderFile(const string &vertex,
const string &fragment,
const string &geometry,
const string &tess_control,
const string &tess_evaluation) :
ShaderFile(string vertex, string fragment, string geometry,
string tess_control, string tess_evaluation) :
_separate(true),
_vertex(vertex),
_fragment(fragment),
_geometry(geometry),
_tess_control(tess_control),
_tess_evaluation(tess_evaluation)
_vertex(move(vertex)),
_fragment(move(fragment)),
_geometry(move(geometry)),
_tess_control(move(tess_control)),
_tess_evaluation(move(tess_evaluation))
{
}

View File

@ -3179,7 +3179,7 @@ load_compute(ShaderLanguage lang, const Filename &fn) {
* Loads the shader, using the string as shader body.
*/
PT(Shader) Shader::
make(const string &body, ShaderLanguage lang) {
make(string body, ShaderLanguage lang) {
if (lang == SL_GLSL) {
shader_cat.error()
<< "GLSL shaders must have separate shader bodies!\n";
@ -3197,7 +3197,7 @@ make(const string &body, ShaderLanguage lang) {
}
#endif
ShaderFile sbody(body);
ShaderFile sbody(move(body));
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
@ -3208,7 +3208,7 @@ make(const string &body, ShaderLanguage lang) {
PT(Shader) shader = new Shader(lang);
shader->_filename = ShaderFile("created-shader");
shader->_text = sbody;
shader->_text = move(sbody);
#ifdef HAVE_CG
if (lang == SL_Cg) {
@ -3223,7 +3223,7 @@ make(const string &body, ShaderLanguage lang) {
#endif
if (cache_generated_shaders) {
_make_table[sbody] = shader;
_make_table[shader->_text] = shader;
}
if (dump_generated_shaders) {
@ -3235,7 +3235,7 @@ make(const string &body, ShaderLanguage lang) {
pofstream s;
s.open(fn.c_str(), ios::out | ios::trunc);
s << body;
s << shader->get_text();
s.close();
}
return shader;
@ -3245,9 +3245,8 @@ make(const string &body, ShaderLanguage lang) {
* Loads the shader, using the strings as shader bodies.
*/
PT(Shader) Shader::
make(ShaderLanguage lang, const string &vertex, const string &fragment,
const string &geometry, const string &tess_control,
const string &tess_evaluation) {
make(ShaderLanguage lang, string vertex, string fragment, string geometry,
string tess_control, string tess_evaluation) {
#ifndef HAVE_CG
if (lang == SL_Cg) {
shader_cat.error() << "Support for Cg shaders is not enabled.\n";
@ -3260,7 +3259,8 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
return NULL;
}
ShaderFile sbody(vertex, fragment, geometry, tess_control, tess_evaluation);
ShaderFile sbody(move(vertex), move(fragment), move(geometry),
move(tess_control), move(tess_evaluation));
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
@ -3271,7 +3271,7 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
PT(Shader) shader = new Shader(lang);
shader->_filename = ShaderFile("created-shader");
shader->_text = sbody;
shader->_text = move(sbody);
#ifdef HAVE_CG
if (lang == SL_Cg) {
@ -3284,7 +3284,7 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
#endif
if (cache_generated_shaders) {
_make_table[sbody] = shader;
_make_table[shader->_text] = shader;
}
return shader;
@ -3294,7 +3294,7 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
* Loads the compute shader from the given string.
*/
PT(Shader) Shader::
make_compute(ShaderLanguage lang, const string &body) {
make_compute(ShaderLanguage lang, string body) {
if (lang != SL_GLSL) {
shader_cat.error()
<< "Only GLSL compute shaders are currently supported.\n";
@ -3303,7 +3303,7 @@ make_compute(ShaderLanguage lang, const string &body) {
ShaderFile sbody;
sbody._separate = true;
sbody._compute = body;
sbody._compute = move(body);
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
@ -3314,10 +3314,10 @@ make_compute(ShaderLanguage lang, const string &body) {
PT(Shader) shader = new Shader(lang);
shader->_filename = ShaderFile("created-shader");
shader->_text = sbody;
shader->_text = move(sbody);
if (cache_generated_shaders) {
_make_table[sbody] = shader;
_make_table[shader->_text] = shader;
}
return shader;

View File

@ -84,7 +84,7 @@ PUBLISHED:
};
static PT(Shader) load(const Filename &file, ShaderLanguage lang = SL_none);
static PT(Shader) make(const string &body, ShaderLanguage lang = SL_none);
static PT(Shader) make(string body, ShaderLanguage lang = SL_none);
static PT(Shader) load(ShaderLanguage lang,
const Filename &vertex, const Filename &fragment,
const Filename &geometry = "",
@ -92,11 +92,11 @@ PUBLISHED:
const Filename &tess_evaluation = "");
static PT(Shader) load_compute(ShaderLanguage lang, const Filename &fn);
static PT(Shader) make(ShaderLanguage lang,
const string &vertex, const string &fragment,
const string &geometry = "",
const string &tess_control = "",
const string &tess_evaluation = "");
static PT(Shader) make_compute(ShaderLanguage lang, const string &body);
string vertex, string fragment,
string geometry = "",
string tess_control = "",
string tess_evaluation = "");
static PT(Shader) make_compute(ShaderLanguage lang, string body);
INLINE Filename get_filename(ShaderType type = ST_none) const;
INLINE void set_filename(ShaderType type, const Filename &filename);
@ -464,12 +464,9 @@ public:
class ShaderFile : public ReferenceCount {
public:
INLINE ShaderFile() {};
INLINE ShaderFile(const string &shared);
INLINE ShaderFile(const string &vertex,
const string &fragment,
const string &geometry,
const string &tess_control,
const string &tess_evaluation);
INLINE ShaderFile(string shared);
INLINE ShaderFile(string vertex, string fragment, string geometry,
string tess_control, string tess_evaluation);
INLINE void write_datagram(Datagram &dg) const;
INLINE void read_datagram(DatagramIterator &source);