mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 05:01:24 +00:00
[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:
parent
e0e168620f
commit
8e5fd85c0f
3 changed files with 35 additions and 11 deletions
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue