[qfcc] Default fp constants to float for glsl

And support `lf` for double constants (always: I don't see the harm
other than minor confusion with C, but Ruamoko isn't C).
This commit is contained in:
Bill Currie 2025-01-16 18:02:44 +09:00
parent e0e168620f
commit 8e5fd85c0f
3 changed files with 35 additions and 11 deletions

View file

@ -201,6 +201,7 @@ typedef struct language_s {
bool initialized; bool initialized;
bool always_overload; bool always_overload;
bool short_circuit; bool short_circuit;
bool default_float; // 1.0 defaults to float instead of double
void (*init) (rua_ctx_t *ctx); void (*init) (rua_ctx_t *ctx);
int (*parse) (FILE *in, rua_ctx_t *ctx); int (*parse) (FILE *in, rua_ctx_t *ctx);
int (*finish) (const char *file, rua_ctx_t *ctx); int (*finish) (const char *file, rua_ctx_t *ctx);

View file

@ -1945,6 +1945,7 @@ glsl_version (int version, const char *profile, rua_ctx_t *ctx)
language_t lang_glsl_comp = { language_t lang_glsl_comp = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_comp, .init = glsl_init_comp,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,
@ -1957,6 +1958,7 @@ language_t lang_glsl_comp = {
language_t lang_glsl_vert = { language_t lang_glsl_vert = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_vert, .init = glsl_init_vert,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,
@ -1969,6 +1971,7 @@ language_t lang_glsl_vert = {
language_t lang_glsl_tesc = { language_t lang_glsl_tesc = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_tesc, .init = glsl_init_tesc,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,
@ -1981,6 +1984,7 @@ language_t lang_glsl_tesc = {
language_t lang_glsl_tese = { language_t lang_glsl_tese = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_tese, .init = glsl_init_tese,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,
@ -1993,6 +1997,7 @@ language_t lang_glsl_tese = {
language_t lang_glsl_geom = { language_t lang_glsl_geom = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_geom, .init = glsl_init_geom,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,
@ -2005,6 +2010,7 @@ language_t lang_glsl_geom = {
language_t lang_glsl_frag = { language_t lang_glsl_frag = {
.always_overload = true, .always_overload = true,
.short_circuit = false, .short_circuit = false,
.default_float = true,
.init = glsl_init_frag, .init = glsl_init_frag,
.parse = glsl_yyparse, .parse = glsl_yyparse,
.extension = glsl_extension, .extension = glsl_extension,

View file

@ -471,6 +471,11 @@ parse_suffix (const char *suffix, bool fp)
} else if (*suffix == 'l' || *suffix == 'L') { } else if (*suffix == 'l' || *suffix == 'L') {
expl = suff_long_double; expl = suff_long_double;
suffix++; suffix++;
if (*suffix == 'f' || *suffix == 'F') {
// glsl long float is double
expl = suff_double;
suffix++;
}
} }
} else { } else {
if (*suffix == 'f' || *suffix == 'F') { if (*suffix == 'f' || *suffix == 'F') {
@ -485,6 +490,11 @@ parse_suffix (const char *suffix, bool fp)
expl = suff_unsigned; expl = suff_unsigned;
suffix++; suffix++;
} }
if (!unsign && (*suffix == 'f' || *suffix == 'F')) {
// glsl long float is double
expl = suff_float;
suffix++;
}
if (*suffix == 'l' || *suffix == 'L') { if (*suffix == 'l' || *suffix == 'L') {
expl = unsign ? suff_unsigned_long : suff_long; expl = unsign ? suff_unsigned_long : suff_long;
suffix++; suffix++;
@ -493,6 +503,13 @@ parse_suffix (const char *suffix, bool fp)
} }
if (!unsign && (*suffix == 'u' || *suffix == 'U')) { if (!unsign && (*suffix == 'u' || *suffix == 'U')) {
expl = suff_unsigned_long; expl = suff_unsigned_long;
unsign = true;
suffix++;
}
if (!unsign && expl != suff_float
&& (*suffix == 'f' || *suffix == 'F')) {
// glsl long float is double
expl = suff_double;
suffix++; suffix++;
} }
} }
@ -507,7 +524,7 @@ parse_suffix (const char *suffix, bool fp)
} }
static const expr_t * static const expr_t *
parse_number (const rua_tok_t *tok) parse_number (const rua_tok_t *tok, rua_ctx_t *ctx)
{ {
bool binary = false; bool binary = false;
const char *type = "integer"; const char *type = "integer";
@ -596,7 +613,7 @@ parse_number (const rua_tok_t *tok)
if (expl == suff_float) { if (expl == suff_float) {
return new_float_expr (fvalue, false); return new_float_expr (fvalue, false);
} else { } else {
if (options.code.no_double) { if (options.code.no_double || ctx->language->default_float) {
return new_float_expr (fvalue, expl == suff_implicit); return new_float_expr (fvalue, expl == suff_implicit);
} else { } else {
return new_double_expr (fvalue, expl == suff_implicit); return new_double_expr (fvalue, expl == suff_implicit);
@ -637,7 +654,7 @@ qc_delete_buffer (buffer_raii_t *raii)
} }
static const expr_t * static const expr_t *
parse_vector (const rua_tok_t *tok, yyscan_t scanner) parse_vector (const rua_tok_t *tok, yyscan_t scanner, rua_ctx_t *ctx)
{ {
const char *end = tok->text + tok->textlen; const char *end = tok->text + tok->textlen;
while (end > tok->text && *--end != '\'') continue; while (end > tok->text && *--end != '\'') continue;
@ -666,7 +683,7 @@ parse_vector (const rua_tok_t *tok, yyscan_t scanner)
do { do {
token = yylex (&vtok, &vtok.location, scanner); token = yylex (&vtok, &vtok.location, scanner);
if (-token == rua_number) { if (-token == rua_number) {
auto expr = parse_number (&vtok); auto expr = parse_number (&vtok, ctx);
if (expr) { if (expr) {
if (width < 4) { if (width < 4) {
components[width] = expr; components[width] = expr;
@ -922,7 +939,7 @@ stringize_arg (rua_tok_t *out, rua_macro_t *arg, rua_extra_t *extra)
static int static int
preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok, preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok,
yyscan_t scanner) yyscan_t scanner, rua_ctx_t *ctx)
{ {
int token = tok->token; int token = tok->token;
if (!token) { if (!token) {
@ -946,7 +963,7 @@ preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok,
case rua_number: case rua_number:
if (!extra->recording) { if (!extra->recording) {
token = -rua_error; token = -rua_error;
if ((lval->expr = parse_number (tok))) { if ((lval->expr = parse_number (tok, ctx))) {
token = PRE_VALUE; token = PRE_VALUE;
} }
} }
@ -954,7 +971,7 @@ preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok,
case rua_vector: case rua_vector:
if (!extra->recording) { if (!extra->recording) {
token = -rua_error; token = -rua_error;
if (!(lval->expr = parse_vector (tok, scanner))) { if (!(lval->expr = parse_vector (tok, scanner, ctx))) {
token = PRE_VALUE; token = PRE_VALUE;
} }
} }
@ -1035,7 +1052,7 @@ qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
lval->expr = ctx->language->parse_number (tok, ctx); lval->expr = ctx->language->parse_number (tok, ctx);
} }
if (!lval->expr) { if (!lval->expr) {
lval->expr = parse_number (tok); lval->expr = parse_number (tok, ctx);
} }
if (lval->expr) { if (lval->expr) {
token = QC_VALUE; token = QC_VALUE;
@ -1048,7 +1065,7 @@ qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
break; break;
case rua_vector: case rua_vector:
token = -rua_error; token = -rua_error;
if ((lval->expr = parse_vector (tok, scanner))) { if ((lval->expr = parse_vector (tok, scanner, ctx))) {
token = QC_VALUE; token = QC_VALUE;
} }
break; break;
@ -1167,7 +1184,7 @@ qc_process (rua_extra_t *extra, int token, rua_tok_t *tok, yyscan_t scanner,
auto state = extra->pre_state; auto state = extra->pre_state;
PRE_YYSTYPE lval = { .t = *tok }; PRE_YYSTYPE lval = { .t = *tok };
token = preproc_token (extra, &lval, tok, scanner); token = preproc_token (extra, &lval, tok, scanner, ctx);
if (-token == rua_ignore) { if (-token == rua_ignore) {
return YYPUSH_MORE; return YYPUSH_MORE;
} }
@ -1516,7 +1533,7 @@ rescan:
PRE_YYSTYPE lval = { .t = e }; PRE_YYSTYPE lval = { .t = e };
auto pending_macro = extra->pending_macro; auto pending_macro = extra->pending_macro;
if (extra->recording) { if (extra->recording) {
token = preproc_token (extra, &lval, &e, scanner); token = preproc_token (extra, &lval, &e, scanner, ctx);
int s = pre_yypush_parse (extra->args_state, token, &lval, int s = pre_yypush_parse (extra->args_state, token, &lval,
&e.location, ctx); &e.location, ctx);
if (s == YYPUSH_MORE) { if (s == YYPUSH_MORE) {