diff --git a/tools/qfcc/include/rua-lang.h b/tools/qfcc/include/rua-lang.h index 33b9f51f9..46c4b546b 100644 --- a/tools/qfcc/include/rua-lang.h +++ b/tools/qfcc/include/rua-lang.h @@ -201,6 +201,7 @@ typedef struct language_s { bool initialized; bool always_overload; bool short_circuit; + bool default_float; // 1.0 defaults to float instead of double void (*init) (rua_ctx_t *ctx); int (*parse) (FILE *in, rua_ctx_t *ctx); int (*finish) (const char *file, rua_ctx_t *ctx); diff --git a/tools/qfcc/source/glsl-parse.y b/tools/qfcc/source/glsl-parse.y index 7608096ee..a5b91c597 100644 --- a/tools/qfcc/source/glsl-parse.y +++ b/tools/qfcc/source/glsl-parse.y @@ -1945,6 +1945,7 @@ glsl_version (int version, const char *profile, rua_ctx_t *ctx) language_t lang_glsl_comp = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_comp, .parse = glsl_yyparse, .extension = glsl_extension, @@ -1957,6 +1958,7 @@ language_t lang_glsl_comp = { language_t lang_glsl_vert = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_vert, .parse = glsl_yyparse, .extension = glsl_extension, @@ -1969,6 +1971,7 @@ language_t lang_glsl_vert = { language_t lang_glsl_tesc = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_tesc, .parse = glsl_yyparse, .extension = glsl_extension, @@ -1981,6 +1984,7 @@ language_t lang_glsl_tesc = { language_t lang_glsl_tese = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_tese, .parse = glsl_yyparse, .extension = glsl_extension, @@ -1993,6 +1997,7 @@ language_t lang_glsl_tese = { language_t lang_glsl_geom = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_geom, .parse = glsl_yyparse, .extension = glsl_extension, @@ -2005,6 +2010,7 @@ language_t lang_glsl_geom = { language_t lang_glsl_frag = { .always_overload = true, .short_circuit = false, + .default_float = true, .init = glsl_init_frag, .parse = glsl_yyparse, .extension = glsl_extension, diff --git a/tools/qfcc/source/qc-lex.l b/tools/qfcc/source/qc-lex.l index fd19870a3..16193972d 100644 --- a/tools/qfcc/source/qc-lex.l +++ b/tools/qfcc/source/qc-lex.l @@ -471,6 +471,11 @@ parse_suffix (const char *suffix, bool fp) } else if (*suffix == 'l' || *suffix == 'L') { expl = suff_long_double; suffix++; + if (*suffix == 'f' || *suffix == 'F') { + // glsl long float is double + expl = suff_double; + suffix++; + } } } else { if (*suffix == 'f' || *suffix == 'F') { @@ -485,6 +490,11 @@ parse_suffix (const char *suffix, bool fp) expl = suff_unsigned; suffix++; } + if (!unsign && (*suffix == 'f' || *suffix == 'F')) { + // glsl long float is double + expl = suff_float; + suffix++; + } if (*suffix == 'l' || *suffix == 'L') { expl = unsign ? suff_unsigned_long : suff_long; suffix++; @@ -493,6 +503,13 @@ parse_suffix (const char *suffix, bool fp) } if (!unsign && (*suffix == 'u' || *suffix == 'U')) { 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++; } } @@ -507,7 +524,7 @@ parse_suffix (const char *suffix, bool fp) } 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; const char *type = "integer"; @@ -596,7 +613,7 @@ parse_number (const rua_tok_t *tok) if (expl == suff_float) { return new_float_expr (fvalue, false); } else { - if (options.code.no_double) { + if (options.code.no_double || ctx->language->default_float) { return new_float_expr (fvalue, expl == suff_implicit); } else { return new_double_expr (fvalue, expl == suff_implicit); @@ -637,7 +654,7 @@ qc_delete_buffer (buffer_raii_t *raii) } 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; while (end > tok->text && *--end != '\'') continue; @@ -666,7 +683,7 @@ parse_vector (const rua_tok_t *tok, yyscan_t scanner) do { token = yylex (&vtok, &vtok.location, scanner); if (-token == rua_number) { - auto expr = parse_number (&vtok); + auto expr = parse_number (&vtok, ctx); if (expr) { if (width < 4) { components[width] = expr; @@ -922,7 +939,7 @@ stringize_arg (rua_tok_t *out, rua_macro_t *arg, rua_extra_t *extra) static int 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; if (!token) { @@ -946,7 +963,7 @@ preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok, case rua_number: if (!extra->recording) { token = -rua_error; - if ((lval->expr = parse_number (tok))) { + if ((lval->expr = parse_number (tok, ctx))) { token = PRE_VALUE; } } @@ -954,7 +971,7 @@ preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok, case rua_vector: if (!extra->recording) { token = -rua_error; - if (!(lval->expr = parse_vector (tok, scanner))) { + if (!(lval->expr = parse_vector (tok, scanner, ctx))) { 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); } if (!lval->expr) { - lval->expr = parse_number (tok); + lval->expr = parse_number (tok, ctx); } if (lval->expr) { token = QC_VALUE; @@ -1048,7 +1065,7 @@ qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok, break; case rua_vector: token = -rua_error; - if ((lval->expr = parse_vector (tok, scanner))) { + if ((lval->expr = parse_vector (tok, scanner, ctx))) { token = QC_VALUE; } 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; PRE_YYSTYPE lval = { .t = *tok }; - token = preproc_token (extra, &lval, tok, scanner); + token = preproc_token (extra, &lval, tok, scanner, ctx); if (-token == rua_ignore) { return YYPUSH_MORE; } @@ -1516,7 +1533,7 @@ rescan: PRE_YYSTYPE lval = { .t = e }; auto pending_macro = extra->pending_macro; 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, &e.location, ctx); if (s == YYPUSH_MORE) {