Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- v2: quote some autoconf macros, use AS_IF, try to fix out-of-tree builds
.gitignore | 3 + Makefile.am | 25 +++++- configure.ac | 6 ++ libs/vkd3d-shader/preproc.h | 33 ++++++++ libs/vkd3d-shader/preproc.l | 99 ++++++++++++++++++++++++ libs/vkd3d-shader/preproc.y | 60 ++++++++++++++ libs/vkd3d-shader/vkd3d_shader_main.c | 16 +++- libs/vkd3d-shader/vkd3d_shader_private.h | 8 ++ tests/hlsl_d3d12.c | 31 ++++---- 9 files changed, 260 insertions(+), 21 deletions(-) create mode 100644 libs/vkd3d-shader/preproc.h create mode 100644 libs/vkd3d-shader/preproc.l create mode 100644 libs/vkd3d-shader/preproc.y
diff --git a/.gitignore b/.gitignore index 63a9ffc6..b6d29d19 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,10 @@ vkd3d-*.tar.xz *.log *.o *.pc +*.tab.c +*.tab.h *.trs +*.yy.c *~
.deps diff --git a/Makefile.am b/Makefile.am index 5a6e4dc9..46eacbd9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -108,6 +108,29 @@ libvkd3d_common_la_SOURCES = \
lib_LTLIBRARIES = libvkd3d-shader.la libvkd3d.la libvkd3d-utils.la
+VKD3D_V_FLEX = $(vkd3d_v_flex_@AM_V@) +vkd3d_v_flex_ = $(vkd3d_v_flex_@AM_DEFAULT_V@) +vkd3d_v_flex_0 = @echo " FLEX " $@; +vkd3d_v_flex_1 = + +VKD3D_V_BISON = $(vkd3d_v_bison_@AM_V@) +vkd3d_v_bison_ = $(vkd3d_v_bison_@AM_DEFAULT_V@) +vkd3d_v_bison_0 = @echo " BISON " $@; +vkd3d_v_bison_1 = + +libs/vkd3d-shader/preproc.yy.c: libs/vkd3d-shader/preproc.l + $(VKD3D_V_FLEX)$(FLEX) $(LFLAGS) -o $@ $< + +libs/vkd3d-shader/preproc.tab.c libs/vkd3d-shader/preproc.tab.h &: libs/vkd3d-shader/preproc.y + $(VKD3D_V_BISON)$(BISON) $(YFLAGS) -d -o $@ $< + +BUILT_SOURCES += libs/vkd3d-shader/preproc.tab.h + +nodist_libvkd3d_shader_la_SOURCES = \ + libs/vkd3d-shader/preproc.tab.c \ + libs/vkd3d-shader/preproc.tab.h \ + libs/vkd3d-shader/preproc.yy.c + libvkd3d_shader_la_SOURCES = \ include/private/list.h \ include/private/rbtree.h \ @@ -122,7 +145,7 @@ libvkd3d_shader_la_SOURCES = \ libs/vkd3d-shader/vkd3d_shader.map \ libs/vkd3d-shader/vkd3d_shader_main.c \ libs/vkd3d-shader/vkd3d_shader_private.h -libvkd3d_shader_la_CFLAGS = $(AM_CFLAGS) @SPIRV_TOOLS_CFLAGS@ +libvkd3d_shader_la_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/libs/vkd3d-shader @SPIRV_TOOLS_CFLAGS@ libvkd3d_shader_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libvkd3d_shader_la_LIBADD = libvkd3d-common.la @SPIRV_TOOLS_LIBS@ if HAVE_LD_VERSION_SCRIPT diff --git a/configure.ac b/configure.ac index 2f22b05f..b7902b63 100644 --- a/configure.ac +++ b/configure.ac @@ -30,6 +30,12 @@ AC_PROG_MKDIR_P VKD3D_PROG_WIDL(3, 20) AS_IF([test "x$WIDL" = "xno"], [AC_MSG_WARN([widl is required to build header files.])])
+AC_CHECK_PROGS([FLEX], [flex], [none]) +AS_IF([test "$FLEX" = "none"], [AC_MSG_ERROR([no suitable flex found. Please install the 'flex' package.])]) + +AC_CHECK_PROGS([BISON], [bison], [none]) +AS_IF([test "$BISON" = "none"], [AC_MSG_ERROR([no suitable bison found. Please install the 'bison' package.])]) + DX_PS_FEATURE([OFF]) DX_INIT_DOXYGEN([vkd3d], [Doxyfile], [doc]) AC_CONFIG_FILES([Doxyfile]) diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h new file mode 100644 index 00000000..cbd93229 --- /dev/null +++ b/libs/vkd3d-shader/preproc.h @@ -0,0 +1,33 @@ +/* + * HLSL preprocessor + * + * Copyright 2020 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __VKD3D_SHADER_PREPROC_H +#define __VKD3D_SHADER_PREPROC_H + +#include "vkd3d_shader_private.h" + +struct preproc_ctx +{ + void *scanner; + + struct vkd3d_string_buffer buffer; +}; + +#endif diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l new file mode 100644 index 00000000..1ae43a8d --- /dev/null +++ b/libs/vkd3d-shader/preproc.l @@ -0,0 +1,99 @@ +/* + * HLSL preprocessor + * + * Copyright 2020 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +%{ + +#include "preproc.tab.h" + +#define YYSTYPE PREPROC_YYSTYPE +#define YYLTYPE PREPROC_YYLTYPE + +#define YY_DECL static int preproc_lexer_lex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner) + +%} + +%option 8bit +%option bison-bridge +%option bison-locations +%option extra-type="struct preproc_ctx *" +%option never-interactive +%option noinput +%option nounput +%option noyywrap +%option prefix="preproc_yy" +%option reentrant + +WS [ \t] + +%% + +{WS}+ {} +. {return T_TEXT;} + +%% + +int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) +{ + struct preproc_ctx *ctx = yyget_extra(scanner); + + for (;;) + { + const char *text; + int token; + + if (!(token = preproc_lexer_lex(lval, lloc, scanner))) + return PREPROC_YYEOF; + text = yyget_text(scanner); + + TRACE("Parsing token %d, string %s.\n", token, debugstr_a(text)); + + vkd3d_string_buffer_printf(&ctx->buffer, "%s ", text); + } +} + +int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info, + struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) +{ + struct preproc_ctx ctx = {0}; + YY_BUFFER_STATE top_buffer; + void *output_code; + + vkd3d_string_buffer_init(&ctx.buffer); + + yylex_init_extra(&ctx, &ctx.scanner); + top_buffer = yy_scan_bytes(compile_info->source.code, compile_info->source.size, ctx.scanner); + + preproc_yyparse(ctx.scanner, &ctx); + + yy_delete_buffer(top_buffer, ctx.scanner); + yylex_destroy(ctx.scanner); + + if (!(output_code = vkd3d_malloc(ctx.buffer.content_size))) + { + vkd3d_string_buffer_cleanup(&ctx.buffer); + return VKD3D_ERROR_OUT_OF_MEMORY; + } + memcpy(output_code, ctx.buffer.buffer, ctx.buffer.content_size); + out->size = ctx.buffer.content_size; + out->code = output_code; + vkd3d_string_buffer_trace(&ctx.buffer); + vkd3d_string_buffer_cleanup(&ctx.buffer); + return VKD3D_OK; +} diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y new file mode 100644 index 00000000..92448f24 --- /dev/null +++ b/libs/vkd3d-shader/preproc.y @@ -0,0 +1,60 @@ +/* + * HLSL preprocessor + * + * Copyright 2020 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +%code requires +{ + +#include "vkd3d_shader_private.h" +#include "preproc.h" + +} + +%code provides +{ + +int preproc_yylex(PREPROC_YYSTYPE *yylval_param, PREPROC_YYLTYPE *yylloc_param, void *scanner); + +} + +%code +{ + +static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, const char *string) +{ + FIXME("Error reporting is not implemented.\n"); +} + +} + +%define api.prefix {preproc_yy} +%define api.pure full +%define parse.error verbose +%expect 0 +%locations +%lex-param {yyscan_t scanner} +%parse-param {void *scanner} +%parse-param {struct preproc_ctx *ctx} + +%token T_TEXT + +%% + +shader_text + : %empty diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 1a029246..eed0316c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -78,8 +78,7 @@ int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char * } }
-static int VKD3D_PRINTF_FUNC(2, 3) vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, - const char *format, ...) +int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format, ...) { va_list args; int ret; @@ -91,7 +90,7 @@ static int VKD3D_PRINTF_FUNC(2, 3) vkd3d_string_buffer_printf(struct vkd3d_strin return ret; }
-static void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function) +void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function) { const char *p, *q, *end = buffer->buffer + buffer->content_size;
@@ -1154,6 +1153,7 @@ const enum vkd3d_shader_target_type *vkd3d_shader_get_supported_target_types( int vkd3d_shader_preprocess(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages) { + struct vkd3d_shader_message_context message_context; int ret;
TRACE("compile_info %p, out %p, messages %p.\n", compile_info, out, messages); @@ -1164,5 +1164,13 @@ int vkd3d_shader_preprocess(const struct vkd3d_shader_compile_info *compile_info if ((ret = vkd3d_shader_validate_compile_info(compile_info, false)) < 0) return ret;
- return VKD3D_ERROR_NOT_IMPLEMENTED; + vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name); + + ret = preproc_lexer_parse(compile_info, out, &message_context); + + vkd3d_shader_message_context_trace_messages(&message_context); + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) + ret = VKD3D_ERROR_OUT_OF_MEMORY; + vkd3d_shader_message_context_cleanup(&message_context); + return ret; } diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 5ae5724a..83038384 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -837,6 +837,11 @@ struct vkd3d_string_buffer enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code *out) DECLSPEC_HIDDEN; void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN; void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN; +int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, + const char *format, ...) VKD3D_PRINTF_FUNC(2, 3) DECLSPEC_HIDDEN; +#define vkd3d_string_buffer_trace(buffer) \ + vkd3d_string_buffer_trace_(buffer, __FUNCTION__) +void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function) DECLSPEC_HIDDEN; int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args) DECLSPEC_HIDDEN;
struct vkd3d_shader_message_context @@ -882,6 +887,9 @@ void vkd3d_dxbc_compiler_destroy(struct vkd3d_dxbc_compiler *compiler) DECLSPEC_
void vkd3d_compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4]) DECLSPEC_HIDDEN;
+int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info, + struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) DECLSPEC_HIDDEN; + static inline enum vkd3d_shader_component_type vkd3d_component_type_from_data_type( enum vkd3d_data_type data_type) { diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c index 4f4cc37f..787355ba 100644 --- a/tests/hlsl_d3d12.c +++ b/tests/hlsl_d3d12.c @@ -30,22 +30,20 @@ static void check_preprocess_(int line, const char *source, const D3D_SHADER_MAC HRESULT hr;
hr = D3DPreprocess(source, strlen(source), NULL, macros, include, &blob, &errors); - todo ok_(line)(hr == S_OK, "Failed to preprocess shader, hr %#x.\n", hr); + assert_that_(line)(hr == S_OK, "Failed to preprocess shader, hr %#x.\n", hr); if (errors) { if (vkd3d_test_state.debug_level) trace_(line)("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors)); ID3D10Blob_Release(errors); } - if (hr != S_OK) - return; code = ID3D10Blob_GetBufferPointer(blob); size = ID3D10Blob_GetBufferSize(blob); if (present) ok_(line)(vkd3d_memmem(code, size, present, strlen(present)), ""%s" not found in preprocessed shader.\n", present); if (absent) - ok_(line)(!vkd3d_memmem(code, size, absent, strlen(absent)), + assert_that_(line)(!vkd3d_memmem(code, size, absent, strlen(absent)), ""%s" found in preprocessed shader.\n", absent); ID3D10Blob_Release(blob); } @@ -352,7 +350,8 @@ static void test_preprocess(void) for (i = 0; i < ARRAY_SIZE(tests); ++i) { vkd3d_test_set_context("Source "%s"", tests[i].source); - check_preprocess(tests[i].source, NULL, NULL, tests[i].present, tests[i].absent); + todo_if (i != 5 && i != 8 && i != 42) + check_preprocess(tests[i].source, NULL, NULL, tests[i].present, tests[i].absent); } vkd3d_test_set_context(NULL);
@@ -360,16 +359,16 @@ static void test_preprocess(void) macros[0].Definition = "value"; macros[1].Name = NULL; macros[1].Definition = NULL; - check_preprocess("KEY", macros, NULL, "value", "KEY"); + todo check_preprocess("KEY", macros, NULL, "value", "KEY");
- check_preprocess("#undef KEY\nKEY", macros, NULL, "KEY", "value"); + todo check_preprocess("#undef KEY\nKEY", macros, NULL, "KEY", "value");
macros[0].Name = NULL; - check_preprocess("KEY", macros, NULL, "KEY", "value"); + todo check_preprocess("KEY", macros, NULL, "KEY", "value");
macros[0].Name = "KEY"; macros[0].Definition = NULL; - check_preprocess("KEY", macros, NULL, NULL, "KEY"); + todo check_preprocess("KEY", macros, NULL, NULL, "KEY");
macros[0].Name = "0"; macros[0].Definition = "value"; @@ -377,7 +376,7 @@ static void test_preprocess(void)
macros[0].Name = "KEY(a)"; macros[0].Definition = "value"; - check_preprocess("KEY(a)", macros, NULL, "KEY", "value"); + todo check_preprocess("KEY(a)", macros, NULL, "KEY", "value");
macros[0].Name = "KEY"; macros[0].Definition = "value1"; @@ -385,33 +384,33 @@ static void test_preprocess(void) macros[1].Definition = "value2"; macros[2].Name = NULL; macros[2].Definition = NULL; - check_preprocess("KEY", macros, NULL, "value2", NULL); + todo check_preprocess("KEY", macros, NULL, "value2", NULL);
macros[0].Name = "KEY"; macros[0].Definition = "KEY2"; macros[1].Name = "KEY2"; macros[1].Definition = "value"; - check_preprocess("KEY", macros, NULL, "value", NULL); + todo check_preprocess("KEY", macros, NULL, "value", NULL);
macros[0].Name = "KEY2"; macros[0].Definition = "value"; macros[1].Name = "KEY"; macros[1].Definition = "KEY2"; - check_preprocess("KEY", macros, NULL, "value", NULL); + todo check_preprocess("KEY", macros, NULL, "value", NULL);
- check_preprocess(test_include_top, NULL, &test_include, "pass", "fail"); + todo check_preprocess(test_include_top, NULL, &test_include, "pass", "fail"); ok(!refcount_file1, "Got %d references to file1.\n", refcount_file1); ok(!refcount_file2, "Got %d references to file1.\n", refcount_file2); ok(!refcount_file3, "Got %d references to file1.\n", refcount_file3); todo ok(include_count_file2 == 2, "file2 was included %u times.\n", include_count_file2);
/* Macro invocation spread across multiple files. */ - check_preprocess(test_include2_top, NULL, &test_include, "pass", NULL); + todo check_preprocess(test_include2_top, NULL, &test_include, "pass", NULL);
blob = errors = (ID3D10Blob *)0xdeadbeef; hr = D3DPreprocess(test_include_top, strlen(test_include_top), NULL, NULL, &test_include_fail, &blob, &errors); todo ok(hr == E_FAIL, "Got hr %#x.\n", hr); - ok(blob == (ID3D10Blob *)0xdeadbeef, "Expected no compiled shader blob.\n"); + todo ok(blob == (ID3D10Blob *)0xdeadbeef, "Expected no compiled shader blob.\n"); todo ok(!!errors, "Expected non-NULL error blob.\n"); if (errors) {
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/preproc.l | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index 1ae43a8d..966c11b0 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -36,16 +36,33 @@ %option never-interactive %option noinput %option nounput +%option noyy_top_state %option noyywrap %option prefix="preproc_yy" %option reentrant +%option stack + + /* Because these can both be terminated by EOF, we need states for them. */ +%s C_COMMENT +%s CXX_COMMENT
WS [ \t]
%%
-{WS}+ {} -. {return T_TEXT;} +<INITIAL>"//" {yy_push_state(CXX_COMMENT, yyscanner);} +<INITIAL>"/*" {yy_push_state(C_COMMENT, yyscanner);} +<CXX_COMMENT>\\r?\n {} +<CXX_COMMENT>\n { + yy_pop_state(yyscanner); + return T_TEXT; + } +<C_COMMENT>"*/" {yy_pop_state(yyscanner);} +<C_COMMENT,CXX_COMMENT><<EOF>> {yy_pop_state(yyscanner);} +<C_COMMENT,CXX_COMMENT>. {} + +<INITIAL>{WS}+ {} +<INITIAL>. {return T_TEXT;}
%%
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83093
Your paranoid android.
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/preproc.l | 22 ++++++++++++++++++++++ tests/hlsl_d3d12.c | 15 +++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index 966c11b0..f931292b 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -47,6 +47,7 @@ %s CXX_COMMENT
WS [ \t] +IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
%%
@@ -61,6 +62,27 @@ WS [ \t] <C_COMMENT,CXX_COMMENT><<EOF>> {yy_pop_state(yyscanner);} <C_COMMENT,CXX_COMMENT>. {}
+<INITIAL>{IDENTIFIER} {return T_TEXT;} + +<INITIAL>[0-9]*.[0-9]+([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;} +<INITIAL>[0-9]+.([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;} +<INITIAL>[0-9]+([eE][+-]?[0-9]+)?[hHfF] {return T_TEXT;} +<INITIAL>[0-9]+[eE][+-]?[0-9]+ {return T_TEXT;} +<INITIAL>0[xX][0-9a-fA-f]+[ul]{0,2} {return T_TEXT;} +<INITIAL>0[0-7]*[ul]{0,2} {return T_TEXT;} +<INITIAL>[1-9][0-9]*[ul]{0,2} {return T_TEXT;} + +<INITIAL>"&&" {return T_TEXT;} +<INITIAL>"||" {return T_TEXT;} +<INITIAL>"++" {return T_TEXT;} +<INITIAL>"--" {return T_TEXT;} +<INITIAL>"<<"=? {return T_TEXT;} +<INITIAL>">>"=? {return T_TEXT;} +<INITIAL>[-+*/%&|^=><!]= {return T_TEXT;} + + /* C strings (including escaped quotes). */ +<INITIAL>"([^"\]|\.)*" {return T_TEXT;} + <INITIAL>{WS}+ {} <INITIAL>. {return T_TEXT;}
diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c index 787355ba..61324fa9 100644 --- a/tests/hlsl_d3d12.c +++ b/tests/hlsl_d3d12.c @@ -43,7 +43,7 @@ static void check_preprocess_(int line, const char *source, const D3D_SHADER_MAC ok_(line)(vkd3d_memmem(code, size, present, strlen(present)), ""%s" not found in preprocessed shader.\n", present); if (absent) - assert_that_(line)(!vkd3d_memmem(code, size, absent, strlen(absent)), + ok_(line)(!vkd3d_memmem(code, size, absent, strlen(absent)), ""%s" found in preprocessed shader.\n", absent); ID3D10Blob_Release(blob); } @@ -349,8 +349,10 @@ static void test_preprocess(void)
for (i = 0; i < ARRAY_SIZE(tests); ++i) { + if (i == 43) + continue; vkd3d_test_set_context("Source "%s"", tests[i].source); - todo_if (i != 5 && i != 8 && i != 42) + todo_if (i <= 4 || (i >= 9 && i <= 14)) check_preprocess(tests[i].source, NULL, NULL, tests[i].present, tests[i].absent); } vkd3d_test_set_context(NULL); @@ -361,10 +363,10 @@ static void test_preprocess(void) macros[1].Definition = NULL; todo check_preprocess("KEY", macros, NULL, "value", "KEY");
- todo check_preprocess("#undef KEY\nKEY", macros, NULL, "KEY", "value"); + check_preprocess("#undef KEY\nKEY", macros, NULL, "KEY", "value");
macros[0].Name = NULL; - todo check_preprocess("KEY", macros, NULL, "KEY", "value"); + check_preprocess("KEY", macros, NULL, "KEY", "value");
macros[0].Name = "KEY"; macros[0].Definition = NULL; @@ -376,7 +378,7 @@ static void test_preprocess(void)
macros[0].Name = "KEY(a)"; macros[0].Definition = "value"; - todo check_preprocess("KEY(a)", macros, NULL, "KEY", "value"); + check_preprocess("KEY(a)", macros, NULL, "KEY", "value");
macros[0].Name = "KEY"; macros[0].Definition = "value1"; @@ -398,7 +400,8 @@ static void test_preprocess(void) macros[1].Definition = "KEY2"; todo check_preprocess("KEY", macros, NULL, "value", NULL);
- todo check_preprocess(test_include_top, NULL, &test_include, "pass", "fail"); + if (0) + todo check_preprocess(test_include_top, NULL, &test_include, "pass", "fail"); ok(!refcount_file1, "Got %d references to file1.\n", refcount_file1); ok(!refcount_file2, "Got %d references to file1.\n", refcount_file2); ok(!refcount_file3, "Got %d references to file1.\n", refcount_file3);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83094
Your paranoid android.
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/preproc.h | 11 +++++++ libs/vkd3d-shader/preproc.l | 39 +++++++++++++++++++++++- libs/vkd3d-shader/preproc.y | 39 +++++++++++++++++++++++- libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 4 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h index cbd93229..769b8c23 100644 --- a/libs/vkd3d-shader/preproc.h +++ b/libs/vkd3d-shader/preproc.h @@ -23,11 +23,22 @@
#include "vkd3d_shader_private.h"
+struct preproc_location +{ + const char *filename; + unsigned int first_line, first_column; +}; + struct preproc_ctx { void *scanner;
+ struct vkd3d_shader_message_context *message_context; struct vkd3d_string_buffer buffer; + unsigned int line, column; + const char *source_name; + + bool error; };
#endif diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index f931292b..c0c6b13a 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -27,6 +27,10 @@
#define YY_DECL static int preproc_lexer_lex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner)
+static void update_location(struct preproc_ctx *ctx); + +#define YY_USER_ACTION update_location(yyget_extra(yyscanner)); + %}
%option 8bit @@ -88,6 +92,28 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
%%
+static void update_location(struct preproc_ctx *ctx) +{ + unsigned int i, leng = yyget_leng(ctx->scanner); + const char *text = yyget_text(ctx->scanner); + + /* We want to do this here, rather than before calling yylex(), because + * some tokens are skipped by the lexer. */ + + yyget_lloc(ctx->scanner)->first_line = ctx->line; + yyget_lloc(ctx->scanner)->first_column = ctx->column; + + for (i = 0; i < leng; ++i) + { + ++ctx->column; + if (text[i] == '\n') + { + ctx->column = 1; + ++ctx->line; + } + } +} + int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) { struct preproc_ctx *ctx = yyget_extra(scanner); @@ -101,7 +127,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) return PREPROC_YYEOF; text = yyget_text(scanner);
- TRACE("Parsing token %d, string %s.\n", token, debugstr_a(text)); + TRACE("Parsing token %d, line %d, string %s.\n", token, lloc->first_line, debugstr_a(text));
vkd3d_string_buffer_printf(&ctx->buffer, "%s ", text); } @@ -115,6 +141,10 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info, void *output_code;
vkd3d_string_buffer_init(&ctx.buffer); + ctx.message_context = message_context; + ctx.source_name = compile_info->source_name ? compile_info->source_name : "<anonymous>"; + ctx.line = 1; + ctx.column = 1;
yylex_init_extra(&ctx, &ctx.scanner); top_buffer = yy_scan_bytes(compile_info->source.code, compile_info->source.size, ctx.scanner); @@ -124,6 +154,13 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info, yy_delete_buffer(top_buffer, ctx.scanner); yylex_destroy(ctx.scanner);
+ if (ctx.error) + { + WARN("Failed to preprocess.\n"); + vkd3d_string_buffer_cleanup(&ctx.buffer); + return VKD3D_ERROR_INVALID_SHADER; + } + if (!(output_code = vkd3d_malloc(ctx.buffer.content_size))) { vkd3d_string_buffer_cleanup(&ctx.buffer); diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y index 92448f24..88b855c6 100644 --- a/libs/vkd3d-shader/preproc.y +++ b/libs/vkd3d-shader/preproc.y @@ -36,13 +36,50 @@ int preproc_yylex(PREPROC_YYSTYPE *yylval_param, PREPROC_YYLTYPE *yylloc_param, %code {
+#define YYLLOC_DEFAULT(cur, rhs, n) \ + do \ + { \ + if (n) \ + { \ + (cur).filename = YYRHSLOC(rhs, 1).filename; \ + (cur).first_line = YYRHSLOC(rhs, 1).first_line; \ + (cur).first_column = YYRHSLOC(rhs, 1).first_column; \ + } \ + else \ + { \ + (cur).filename = YYRHSLOC(rhs, 0).filename; \ + (cur).first_line = YYRHSLOC(rhs, 0).first_line; \ + (cur).first_column = YYRHSLOC(rhs, 0).first_column; \ + } \ + } while (0) + +static void set_location(struct preproc_ctx *ctx, const struct preproc_location *loc) +{ + ctx->message_context->source_name = loc->filename; + ctx->message_context->line = loc->first_line; + ctx->message_context->column = loc->first_column; +} + +static void preproc_error(struct preproc_ctx *ctx, const struct preproc_location *loc, + enum vkd3d_shader_error error, const char *format, ...) +{ + va_list args; + + set_location(ctx, loc); + va_start(args, format); + vkd3d_shader_verror(ctx->message_context, error, format, args); + va_end(args); + ctx->error = true; +} + static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, const char *string) { - FIXME("Error reporting is not implemented.\n"); + preproc_error(ctx, loc, VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX, "%s", string); }
}
+%define api.location.type {struct preproc_location} %define api.prefix {preproc_yy} %define api.pure full %define parse.error verbose diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 83038384..5a022708 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -79,6 +79,8 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE = 3002, VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE = 3003, VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES = 3004, + + VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX = 4000, };
enum VKD3D_SHADER_INSTRUCTION_HANDLER
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83095
Your paranoid android.
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- include/private/vkd3d_memory.h | 11 +++ libs/vkd3d-shader/preproc.h | 16 ++++ libs/vkd3d-shader/preproc.l | 94 ++++++++++++++++++-- libs/vkd3d-shader/preproc.y | 106 ++++++++++++++++++++++- libs/vkd3d-shader/vkd3d_shader_main.c | 15 ++++ libs/vkd3d-shader/vkd3d_shader_private.h | 6 ++ tests/hlsl_d3d12.c | 2 +- 7 files changed, 242 insertions(+), 8 deletions(-)
diff --git a/include/private/vkd3d_memory.h b/include/private/vkd3d_memory.h index df93abf5..bd56d30a 100644 --- a/include/private/vkd3d_memory.h +++ b/include/private/vkd3d_memory.h @@ -22,6 +22,7 @@ #include <assert.h> #include <stdbool.h> #include <stdlib.h> +#include <string.h>
#include "vkd3d_debug.h"
@@ -54,6 +55,16 @@ static inline void vkd3d_free(void *ptr) free(ptr); }
+static inline char *vkd3d_strdup(const char *string) +{ + size_t len = strlen(string) + 1; + char *ptr; + + if ((ptr = vkd3d_malloc(len))) + memcpy(ptr, string, len); + return ptr; +} + bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size) DECLSPEC_HIDDEN;
diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h index 769b8c23..29fbbd02 100644 --- a/libs/vkd3d-shader/preproc.h +++ b/libs/vkd3d-shader/preproc.h @@ -29,6 +29,12 @@ struct preproc_location unsigned int first_line, first_column; };
+struct preproc_if_state +{ + /* Are we currently in a "true" block? */ + bool current_true; +}; + struct preproc_ctx { void *scanner; @@ -38,7 +44,17 @@ struct preproc_ctx unsigned int line, column; const char *source_name;
+ struct preproc_if_state *if_stack; + size_t if_count, if_stack_size; + + int current_directive; + + bool last_was_newline; + bool error; };
+void preproc_warning(struct preproc_ctx *ctx, const struct preproc_location *loc, + enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(4, 5) DECLSPEC_HIDDEN; + #endif diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index c0c6b13a..e9a5b14a 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -50,6 +50,7 @@ static void update_location(struct preproc_ctx *ctx); %s C_COMMENT %s CXX_COMMENT
+NEWLINE \r?\n WS [ \t] IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
@@ -57,10 +58,10 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
<INITIAL>"//" {yy_push_state(CXX_COMMENT, yyscanner);} <INITIAL>"/*" {yy_push_state(C_COMMENT, yyscanner);} -<CXX_COMMENT>\\r?\n {} +<CXX_COMMENT>\{NEWLINE} {} <CXX_COMMENT>\n { yy_pop_state(yyscanner); - return T_TEXT; + return T_NEWLINE; } <C_COMMENT>"*/" {yy_pop_state(yyscanner);} <C_COMMENT,CXX_COMMENT><<EOF>> {yy_pop_state(yyscanner);} @@ -68,13 +69,15 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
<INITIAL>{IDENTIFIER} {return T_TEXT;}
+ /* We have no use for floats, but shouldn't parse them as integers. */ + <INITIAL>[0-9]*.[0-9]+([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;} <INITIAL>[0-9]+.([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;} <INITIAL>[0-9]+([eE][+-]?[0-9]+)?[hHfF] {return T_TEXT;} <INITIAL>[0-9]+[eE][+-]?[0-9]+ {return T_TEXT;} -<INITIAL>0[xX][0-9a-fA-f]+[ul]{0,2} {return T_TEXT;} -<INITIAL>0[0-7]*[ul]{0,2} {return T_TEXT;} -<INITIAL>[1-9][0-9]*[ul]{0,2} {return T_TEXT;} +<INITIAL>0[xX][0-9a-fA-f]+[ul]{0,2} {return T_INTEGER;} +<INITIAL>0[0-7]*[ul]{0,2} {return T_INTEGER;} +<INITIAL>[1-9][0-9]*[ul]{0,2} {return T_INTEGER;}
<INITIAL>"&&" {return T_TEXT;} <INITIAL>"||" {return T_TEXT;} @@ -87,6 +90,29 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]* /* C strings (including escaped quotes). */ <INITIAL>"([^"\]|\.)*" {return T_TEXT;}
+<INITIAL>#{WS}*{IDENTIFIER} { + struct preproc_ctx *ctx = yyget_extra(yyscanner); + const char *p; + + if (!ctx->last_was_newline) + return T_TEXT; + + for (p = yytext + 1; strchr(" \t", *p); ++p) + ; + + if (!strcmp(p, "endif")) + return T_ENDIF; + if (!strcmp(p, "if")) + return T_IF; + + preproc_warning(ctx, yyget_lloc(yyscanner), VKD3D_SHADER_WARNING_PP_UNKNOWN_DIRECTIVE, + "Ignoring unknown directive "%s".", yytext); + return T_TEXT; + } + +<INITIAL>\{NEWLINE} {} +<INITIAL>{NEWLINE} {return T_NEWLINE;} + <INITIAL>{WS}+ {} <INITIAL>. {return T_TEXT;}
@@ -114,6 +140,27 @@ static void update_location(struct preproc_ctx *ctx) } }
+static bool preproc_is_writing(struct preproc_ctx *ctx) +{ + if (!ctx->if_count) + return true; + return ctx->if_stack[ctx->if_count - 1].current_true; +} + +static int return_token(int token, YYSTYPE *lval, const char *text) +{ + switch (token) + { + case T_INTEGER: + case T_TEXT: + if (!(lval->string = vkd3d_strdup(text))) + return PREPROC_YYerror; + break; + } + + return token; +} + int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) { struct preproc_ctx *ctx = yyget_extra(scanner); @@ -127,7 +174,32 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) return PREPROC_YYEOF; text = yyget_text(scanner);
- TRACE("Parsing token %d, line %d, string %s.\n", token, lloc->first_line, debugstr_a(text)); + lloc->filename = ctx->source_name; + + if (ctx->last_was_newline) + { + switch (token) + { + case T_ENDIF: + case T_IF: + ctx->current_directive = token; + break; + + default: + ctx->current_directive = 0; + } + } + + ctx->last_was_newline = (token == T_NEWLINE); + + TRACE("Parsing token %d, line %d, in directive %d, string %s.\n", token, + lloc->first_line, ctx->current_directive, debugstr_a(text)); + + if (!ctx->current_directive && !preproc_is_writing(ctx)) + continue; + + if (ctx->current_directive) + return return_token(token, lval, text);
vkd3d_string_buffer_printf(&ctx->buffer, "%s ", text); } @@ -148,12 +220,22 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info,
yylex_init_extra(&ctx, &ctx.scanner); top_buffer = yy_scan_bytes(compile_info->source.code, compile_info->source.size, ctx.scanner); + ctx.last_was_newline = true;
preproc_yyparse(ctx.scanner, &ctx);
yy_delete_buffer(top_buffer, ctx.scanner); yylex_destroy(ctx.scanner);
+ if (ctx.if_count) + { + const struct preproc_location loc = {.filename = ctx.source_name}; + + preproc_warning(&ctx, &loc, VKD3D_SHADER_WARNING_PP_UNTERMINATED_IF, "Unterminated #if block."); + } + + vkd3d_free(ctx.if_stack); + if (ctx.error) { WARN("Failed to preprocess.\n"); diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y index 88b855c6..4353d10c 100644 --- a/libs/vkd3d-shader/preproc.y +++ b/libs/vkd3d-shader/preproc.y @@ -72,11 +72,71 @@ static void preproc_error(struct preproc_ctx *ctx, const struct preproc_location ctx->error = true; }
+void preproc_warning(struct preproc_ctx *ctx, const struct preproc_location *loc, + enum vkd3d_shader_error error, const char *format, ...) +{ + va_list args; + + set_location(ctx, loc); + va_start(args, format); + vkd3d_shader_vwarning(ctx->message_context, error, format, args); + va_end(args); +} + static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, const char *string) { preproc_error(ctx, loc, VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX, "%s", string); }
+static bool preproc_was_writing(struct preproc_ctx *ctx) +{ + if (ctx->if_count < 2) + return true; + return ctx->if_stack[ctx->if_count - 2].current_true; +} + +static bool preproc_push_if(struct preproc_ctx *ctx, bool condition) +{ + struct preproc_if_state *state; + + if (!vkd3d_array_reserve((void **)&ctx->if_stack, &ctx->if_stack_size, ctx->if_count + 1, sizeof(*ctx->if_stack))) + return false; + state = &ctx->if_stack[ctx->if_count++]; + state->current_true = condition && preproc_was_writing(ctx); + return true; +} + +static int char_to_int(char c) +{ + if ('0' <= c && c <= '9') + return c - '0'; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + if ('a' <= c && c <= 'f') + return c - 'a' + 10; + return -1; +} + +static uint32_t preproc_parse_integer(const char *s) +{ + uint32_t base = 10, ret = 0; + int digit; + + if (s[0] == '0') + { + base = 8; + if (s[1] == 'x' || s[1] == 'X') + { + base = 16; + s += 2; + } + } + + while ((digit = char_to_int(*s++)) >= 0) + ret = ret * base + (uint32_t)digit; + return ret; +} + }
%define api.location.type {struct preproc_location} @@ -89,9 +149,53 @@ static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, %parse-param {void *scanner} %parse-param {struct preproc_ctx *ctx}
-%token T_TEXT +%union +{ + char *string; + uint32_t integer; +} + +%token <string> T_INTEGER +%token <string> T_TEXT + +%token T_NEWLINE + +%token T_ENDIF "#endif" +%token T_IF "#if" + +%type <integer> expr
%%
shader_text : %empty + | shader_text directive + { + vkd3d_string_buffer_printf(&ctx->buffer, "\n"); + } + +directive + : T_IF expr newline + { + if (!preproc_push_if(ctx, !!$2)) + YYABORT; + } + | T_ENDIF newline + { + if (ctx->if_count) + --ctx->if_count; + else + preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE, + "Ignoring #endif without prior #if."); + } + +newline + : T_NEWLINE + | YYEOF + +expr + : T_INTEGER + { + $$ = preproc_parse_integer($1); + vkd3d_free($1); + } diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index eed0316c..ad456133 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -148,6 +148,21 @@ bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_cont return true; }
+void vkd3d_shader_vwarning(struct vkd3d_shader_message_context *context, + enum vkd3d_shader_error error, const char *format, va_list args) +{ + if (context->log_level < VKD3D_SHADER_LOG_WARNING) + return; + + if (context->line) + vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: W%04u: ", + context->source_name, context->line, context->column, error); + else + vkd3d_string_buffer_printf(&context->messages, "%s: W%04u: ", context->source_name, error); + vkd3d_string_buffer_vprintf(&context->messages, format, args); + vkd3d_string_buffer_printf(&context->messages, "\n"); +} + void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, enum vkd3d_shader_error error, const char *format, va_list args) { diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 5a022708..01a74ede 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -81,6 +81,10 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES = 3004,
VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX = 4000, + + VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE = 5001, + VKD3D_SHADER_WARNING_PP_UNKNOWN_DIRECTIVE = 5003, + VKD3D_SHADER_WARNING_PP_UNTERMINATED_IF = 5005, };
enum VKD3D_SHADER_INSTRUCTION_HANDLER @@ -867,6 +871,8 @@ void vkd3d_shader_error(struct vkd3d_shader_message_context *context, enum vkd3d const char *format, ...) VKD3D_PRINTF_FUNC(3, 4) DECLSPEC_HIDDEN; void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN; +void vkd3d_shader_vwarning(struct vkd3d_shader_message_context *context, + enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN;
int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length, struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN; diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c index 61324fa9..77a7ea1a 100644 --- a/tests/hlsl_d3d12.c +++ b/tests/hlsl_d3d12.c @@ -414,7 +414,7 @@ static void test_preprocess(void) hr = D3DPreprocess(test_include_top, strlen(test_include_top), NULL, NULL, &test_include_fail, &blob, &errors); todo ok(hr == E_FAIL, "Got hr %#x.\n", hr); todo ok(blob == (ID3D10Blob *)0xdeadbeef, "Expected no compiled shader blob.\n"); - todo ok(!!errors, "Expected non-NULL error blob.\n"); + ok(!!errors, "Expected non-NULL error blob.\n"); if (errors) { if (vkd3d_test_state.debug_level)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83096
Your paranoid android.
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=83092
Your paranoid android.
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: configure.ac:30 Task: Patch failed to apply