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 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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue