[PATCH vkd3d 3/5] vkd3d-shader: Implement #pragma.
Zebediah Figura
zfigura at codeweavers.com
Thu Jan 14 14:47:49 CST 2021
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
libs/vkd3d-shader/preproc.l | 13 +++++++++++++
libs/vkd3d-shader/preproc.y | 1 +
tests/hlsl_d3d12.c | 3 +--
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index 80ac7d03..f7aee198 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -129,6 +129,8 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
return T_IFDEF;
if (!strcmp(p, "ifndef"))
return T_IFNDEF;
+ if (!strcmp(p, "pragma"))
+ return T_PRAGMA;
if (!strcmp(p, "undef"))
return T_UNDEF;
@@ -352,6 +354,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
case T_IFDEF:
case T_IFNDEF:
case T_INCLUDE:
+ case T_PRAGMA:
case T_UNDEF:
ctx->current_directive = token;
break;
@@ -387,6 +390,16 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
continue;
}
+ if (ctx->current_directive == T_PRAGMA)
+ {
+ /* Print all tokens verbatim. */
+ if (token == T_PRAGMA)
+ vkd3d_string_buffer_printf(&ctx->buffer, "#pragma ");
+ else
+ vkd3d_string_buffer_printf(&ctx->buffer, "%s", text);
+ continue;
+ }
+
switch (func_state->state)
{
case STATE_NONE:
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
index 72d6486e..4b276a95 100644
--- a/libs/vkd3d-shader/preproc.y
+++ b/libs/vkd3d-shader/preproc.y
@@ -326,6 +326,7 @@ static void free_parse_arg_names(struct parse_arg_names *args)
%token T_IFDEF "#ifdef"
%token T_IFNDEF "#ifndef"
%token T_INCLUDE "#include"
+%token T_PRAGMA "#pragma"
%token T_UNDEF "#undef"
%token T_CONCAT "##"
diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c
index 03169716..837476d1 100644
--- a/tests/hlsl_d3d12.c
+++ b/tests/hlsl_d3d12.c
@@ -350,8 +350,7 @@ static void test_preprocess(void)
for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
vkd3d_test_set_context("Source \"%s\"", tests[i].source);
- todo_if (i == 9)
- check_preprocess(tests[i].source, NULL, NULL, tests[i].present, tests[i].absent);
+ check_preprocess(tests[i].source, NULL, NULL, tests[i].present, tests[i].absent);
}
vkd3d_test_set_context(NULL);
--
2.30.0
More information about the wine-devel
mailing list