Skip to content

Commit eb3d848

Browse files
committed
glslang_parse_meta: reduced memory allocation
config_get_size: no more sscanf dependency
1 parent ae08ed2 commit eb3d848

2 files changed

Lines changed: 47 additions & 12 deletions

File tree

gfx/drivers_shader/slang_process.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,20 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
516516
id[0] = '\0';
517517
desc[0] = '\0';
518518

519+
/* Pre-count parameters to avoid vector reallocation */
520+
{
521+
size_t param_count = 0;
522+
for (i = 0; i < lines->num_lines; i++)
523+
{
524+
const char *line = shader_line_buf_get(lines, i);
525+
if (line && !memcmp(line, "#pragma parameter ",
526+
sizeof("#pragma parameter ") - 1))
527+
param_count++;
528+
}
529+
if (param_count > 0)
530+
meta->parameters.reserve(param_count);
531+
}
532+
519533
for (i = 0; i < lines->num_lines; i++)
520534
{
521535
const char *line = shader_line_buf_get(lines, i);
@@ -547,6 +561,7 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
547561
int fields = 0;
548562
const char *s = line + (sizeof("#pragma parameter ") - 1);
549563
size_t len = 0;
564+
size_t id_len, desc_len;
550565
char *end = NULL;
551566

552567
/* Parse id */
@@ -562,6 +577,7 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
562577
}
563578
memcpy(id, s, len);
564579
id[len] = '\0';
580+
id_len = len;
565581
s += len;
566582

567583
/* Parse quoted description */
@@ -583,6 +599,7 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
583599
}
584600
memcpy(desc, s, len);
585601
desc[len] = '\0';
602+
desc_len = len;
586603
s += len + 1;
587604

588605
/* Parse initial */
@@ -642,7 +659,9 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
642659

643660
for (j = 0; j < meta->parameters.size(); j++)
644661
{
645-
if (meta->parameters[j].id == id)
662+
const std::string &pid = meta->parameters[j].id;
663+
if (pid.size() == id_len
664+
&& !memcmp(pid.data(), id, id_len))
646665
{
647666
parameter_found = true;
648667
parameter_index = j;
@@ -656,7 +675,8 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
656675
{
657676
const glslang_parameter *parameter =
658677
&meta->parameters[parameter_index];
659-
if ( (parameter->desc != desc)
678+
if ( parameter->desc.size() != desc_len
679+
|| memcmp(parameter->desc.data(), desc, desc_len)
660680
|| (parameter->initial != initial)
661681
|| (parameter->minimum != minimum)
662682
|| (parameter->maximum != maximum)
@@ -670,8 +690,16 @@ static bool glslang_parse_meta(const struct shader_line_buf *lines,
670690
}
671691
}
672692
else
673-
meta->parameters.push_back({
674-
id, desc, initial, minimum, maximum, step });
693+
{
694+
glslang_parameter p;
695+
p.id.assign(id, id_len);
696+
p.desc.assign(desc, desc_len);
697+
p.initial = initial;
698+
p.minimum = minimum;
699+
p.maximum = maximum;
700+
p.step = step;
701+
meta->parameters.push_back(p);
702+
}
675703
}
676704
}
677705
/* Check for framebuffer format */

libretro-common/file/config_file.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -981,16 +981,23 @@ bool config_get_int(config_file_t *conf, const char *key, int *in)
981981
bool config_get_size_t(config_file_t *conf, const char *key, size_t *in)
982982
{
983983
const struct config_entry_list *entry = config_get_entry(conf, key);
984-
errno = 0;
985984

986985
if (entry)
987986
{
988-
size_t val = 0;
989-
if (sscanf(entry->value, "%" PRI_SIZET, &val) == 1)
990-
{
991-
*in = val;
992-
return true;
993-
}
987+
char *end = NULL;
988+
errno = 0;
989+
unsigned long val = (unsigned long)strtoul(entry->value, &end, 0);
990+
991+
if (errno != 0 || end == entry->value || *end != '\0')
992+
return false;
993+
994+
#if (SIZE_MAX < ULONG_MAX)
995+
if (val > SIZE_MAX)
996+
return false;
997+
#endif
998+
999+
*in = (size_t)val;
1000+
return true;
9941001
}
9951002

9961003
return false;
@@ -1004,7 +1011,7 @@ bool config_get_uint64(config_file_t *conf, const char *key, uint64_t *in)
10041011

10051012
if (entry)
10061013
{
1007-
uint64_t val = strtoull(entry->value, NULL, 0);
1014+
uint64_t val = (uint64_t)strtoull(entry->value, NULL, 0);
10081015

10091016
if (errno == 0)
10101017
{

0 commit comments

Comments
 (0)