From: Petrichor Park ppark@codeweavers.com
Strings are opaque objects in HLSL. This implements recognizing string literals and the `string` type.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50382 --- Makefile.am | 1 + libs/vkd3d-shader/hlsl.c | 9 ++++++++- libs/vkd3d-shader/hlsl.h | 5 +++-- libs/vkd3d-shader/hlsl.l | 4 +++- libs/vkd3d-shader/hlsl.y | 12 ++++++++++++ tests/hlsl/strings.shader_test | 11 +++++++++++ 6 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 tests/hlsl/strings.shader_test
diff --git a/Makefile.am b/Makefile.am index 27738f3bf..7ebcd485a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -159,6 +159,7 @@ vkd3d_shader_tests = \ tests/hlsl/static-initializer.shader_test \ tests/hlsl/step.shader_test \ tests/hlsl/storage-qualifiers.shader_test \ + tests/hlsl/strings.shader_test \ tests/hlsl/struct-array.shader_test \ tests/hlsl/struct-assignment.shader_test \ tests/hlsl/struct-semantics.shader_test \ diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 8b706e1e6..290d087f2 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -1229,6 +1229,13 @@ struct hlsl_ir_node *hlsl_new_bool_constant(struct hlsl_ctx *ctx, bool b, const return hlsl_new_constant(ctx, hlsl_get_scalar_type(ctx, HLSL_TYPE_BOOL), &value, loc); }
+/* Strings are opaque objects, so don't put anything in the constant. */ +struct hlsl_ir_node *hlsl_new_string_constant(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc) +{ + struct hlsl_constant_value value; + return hlsl_new_constant(ctx, hlsl_get_scalar_type(ctx, HLSL_TYPE_STRING), &value, loc); +} + struct hlsl_ir_node *hlsl_new_float_constant(struct hlsl_ctx *ctx, float f, const struct vkd3d_shader_location *loc) { @@ -3159,6 +3166,7 @@ static void declare_predefined_types(struct hlsl_ctx *ctx) "int", "uint", "bool", + "string", }; char name[15];
@@ -3189,7 +3197,6 @@ static void declare_predefined_types(struct hlsl_ctx *ctx) {"float", HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1}, {"vector", HLSL_CLASS_VECTOR, HLSL_TYPE_FLOAT, 4, 1}, {"matrix", HLSL_CLASS_MATRIX, HLSL_TYPE_FLOAT, 4, 4}, - {"STRING", HLSL_CLASS_OBJECT, HLSL_TYPE_STRING, 1, 1}, {"TEXTURE", HLSL_CLASS_OBJECT, HLSL_TYPE_TEXTURE, 1, 1}, {"PIXELSHADER", HLSL_CLASS_OBJECT, HLSL_TYPE_PIXELSHADER, 1, 1}, {"VERTEXSHADER", HLSL_CLASS_OBJECT, HLSL_TYPE_VERTEXSHADER, 1, 1}, diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index e78602e8d..ccfe20253 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -92,13 +92,13 @@ enum hlsl_base_type HLSL_TYPE_INT, HLSL_TYPE_UINT, HLSL_TYPE_BOOL, - HLSL_TYPE_LAST_SCALAR = HLSL_TYPE_BOOL, + HLSL_TYPE_STRING, + HLSL_TYPE_LAST_SCALAR = HLSL_TYPE_STRING, HLSL_TYPE_SAMPLER, HLSL_TYPE_TEXTURE, HLSL_TYPE_UAV, HLSL_TYPE_PIXELSHADER, HLSL_TYPE_VERTEXSHADER, - HLSL_TYPE_STRING, HLSL_TYPE_VOID, };
@@ -1158,6 +1158,7 @@ struct hlsl_ir_node *hlsl_new_store_index(struct hlsl_ctx *ctx, const struct hls struct hlsl_ir_node *idx, struct hlsl_ir_node *rhs, unsigned int writemask, const struct vkd3d_shader_location *loc); bool hlsl_new_store_component(struct hlsl_ctx *ctx, struct hlsl_block *block, const struct hlsl_deref *lhs, unsigned int comp, struct hlsl_ir_node *rhs); +struct hlsl_ir_node *hlsl_new_string_constant(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc);
bool hlsl_index_is_noncontiguous(struct hlsl_ir_index *index); bool hlsl_index_is_resource_access(struct hlsl_ir_index *index); diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index e9ae3ccf3..c8014fc68 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -121,7 +121,6 @@ shared {return KW_SHARED; } stateblock {return KW_STATEBLOCK; } stateblock_state {return KW_STATEBLOCK_STATE; } static {return KW_STATIC; } -string {return KW_STRING; } struct {return KW_STRUCT; } switch {return KW_SWITCH; } tbuffer {return KW_TBUFFER; } @@ -215,6 +214,9 @@ row_major {return KW_ROW_MAJOR; } yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } +{STRING} { + return STRING; + }
{DOUBLESLASHCOMMENT} {}
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 0d9946731..6601bbf19 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4589,6 +4589,7 @@ static void validate_texture_format_type(struct hlsl_ctx *ctx, struct hlsl_type FLOAT floatval; bool boolval; char *name; + void *string; /* Always null, as strings are opaque objects in HLSL */ DWORD modifiers; struct hlsl_ir_node *instr; struct hlsl_block *block; @@ -6225,6 +6226,17 @@ primary_expr: YYABORT; } } + | STRING + { + struct hlsl_ir_node *c; + if (!(c = hlsl_new_string_constant(ctx, &@1))) + YYABORT; + if (!($$ = make_block(ctx, c))) + { + hlsl_free_instr(c); + YYABORT; + } + } | VAR_IDENTIFIER { struct hlsl_ir_load *load; diff --git a/tests/hlsl/strings.shader_test b/tests/hlsl/strings.shader_test new file mode 100644 index 000000000..d7b778d61 --- /dev/null +++ b/tests/hlsl/strings.shader_test @@ -0,0 +1,11 @@ +[pixel shader] +float4 main(uniform float4 x) : sv_target +{ + string description = "Hello, VKD3D!"; + return float4(0.0, 0.0, 0.0, 0.0); +} + +[test] +uniform 0 float4 0.0 0.0 0.0 0.0 +draw quad +probe all rgba (0.0, 0.0, 0.0, 0.0)