return TOK_GLFRAGCOLOR;
}
-{PRECISION_QUAL} {
- struct yagl_glsl_state *state = yagl_glsl_lexer_get_extra(yyscanner);
- yagl_glsl_state_new_str_token(state, yylval, yytext);
- return TOK_PRECISION_QUAL;
-}
-
"precision" {
struct yagl_glsl_state *state = yagl_glsl_lexer_get_extra(yyscanner);
BEGIN(PRECISION);
return TOK_INTEGER;
}
-<UNIFORM>{PRECISION_QUAL} {
- struct yagl_glsl_state *state = yagl_glsl_lexer_get_extra(yyscanner);
- yagl_glsl_state_new_str_token(state, yylval, yytext);
- return TOK_PRECISION_QUAL;
-}
-
<UNIFORM>{STRING} {
struct yagl_glsl_state *state = yagl_glsl_lexer_get_extra(yyscanner);
yagl_glsl_state_new_str_token(state, yylval, yytext);
yagl_glsl_state_append_output(state, $1.value);
}
}
-| TOK_UNIFORM TOK_PRECISION_QUAL TOK_STRING TOK_STRING TOK_ARR_PAREN_OPEN TOK_INTEGER TOK_ARR_PAREN_CLOSE TOK_EOI
+| TOK_UNIFORM TOK_STRING TOK_STRING TOK_STRING TOK_ARR_PAREN_OPEN TOK_INTEGER TOK_ARR_PAREN_CLOSE TOK_EOI
{
char s[100];
yagl_glsl_state_flush_pending(state, $1.index);
yagl_glsl_state_append_output(state, $1.value);
-
- // precision qualifier should only be flushed here, GLSL non-ES does not support it
yagl_glsl_state_flush_pending(state, $2.index);
-
+ yagl_glsl_state_append_output(state, $2.value);
yagl_glsl_state_flush_pending(state, $3.index);
yagl_glsl_state_append_output(state, $3.value);
yagl_glsl_state_flush_pending(state, $4.index);
}
}
}
-| TOK_UNIFORM TOK_PRECISION_QUAL TOK_STRING TOK_STRING TOK_EOI
+| TOK_UNIFORM TOK_STRING TOK_STRING TOK_STRING TOK_EOI
{
yagl_glsl_state_flush_pending(state, $1.index);
yagl_glsl_state_append_output(state, $1.value);
-
- // precision qualifier should only be flushed here, GLSL non-ES does not support it
yagl_glsl_state_flush_pending(state, $2.index);
-
+ yagl_glsl_state_append_output(state, $2.value);
yagl_glsl_state_flush_pending(state, $3.index);
yagl_glsl_state_append_output(state, $3.value);
yagl_glsl_state_flush_pending(state, $4.index);
{
int have_version = state->have_version;
int have_extensions = state->have_extensions;
+ int have_precision = state->have_precision;
- if (have_version && have_extensions) {
+ if (have_version && have_extensions && have_precision) {
return;
}
state->have_version = 1;
state->have_extensions = 1;
+ state->have_precision = 1;
if (!have_version) {
switch (state->patch_version) {
break;
}
}
+
+ if (!have_precision) {
+ if (state->patch_precision) {
+ yagl_glsl_state_append_header(state, "#define highp\n");
+ yagl_glsl_state_append_header(state, "#define mediump\n");
+ yagl_glsl_state_append_header(state, "#define lowp\n");
+ }
+ }
}
static void yagl_glsl_state_move_pending(struct yagl_glsl_state *state)
return result;
}
+
+yagl_glsl_qualifier_type yagl_glsl_recognize_qualifier(const char *str)
+{
+ if (strcmp(str, "lowp") == 0 ||
+ strcmp(str, "mediump") == 0 ||
+ strcmp(str, "highp") == 0) {
+ return yagl_glsl_qualifier_precision;
+ }
+
+ return yagl_glsl_qualifier_other;
+}
yagl_glsl_pp_op_par_close,
} yagl_glsl_pp_expr_op;
+typedef enum
+{
+ yagl_glsl_qualifier_other = 0,
+ yagl_glsl_qualifier_precision,
+} yagl_glsl_qualifier_type;
+
struct yagl_glsl_pp_token
{
char* macro;
int have_extensions;
+ int have_precision;
+
int have_samplerexternaloes;
int frag_color_declared;
* @}
*/
+yagl_glsl_qualifier_type yagl_glsl_recognize_qualifier(const char *str);
+
int yagl_glsl_parse(struct yagl_glsl_state *state);
#endif