[PATCH v2 0/3] MR701: vkd3d-shader: Remove a token for 'precise' modifier.
-- v2: vkd3d-shader/fx: Handle 'single' modifier for buffers. vkd3d-shader: Parse a 'single' modifier. vkd3d-shader: Remove a token for 'precise' modifier. https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- Makefile.am | 1 + libs/vkd3d-shader/hlsl.l | 1 - libs/vkd3d-shader/hlsl.y | 14 ++++---- libs/vkd3d-shader/vkd3d_shader_private.h | 1 + tests/hlsl/precise-modifier.shader_test | 41 ++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 tests/hlsl/precise-modifier.shader_test diff --git a/Makefile.am b/Makefile.am index 06fd43ab0..bd1905ba8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -155,6 +155,7 @@ vkd3d_shader_tests = \ tests/hlsl/object-parameters.shader_test \ tests/hlsl/object-references.shader_test \ tests/hlsl/pow.shader_test \ + tests/hlsl/precise-modifier.shader_test \ tests/hlsl/rasteriser-ordered-views.shader_test \ tests/hlsl/reflect.shader_test \ tests/hlsl/register-reservations-numeric.shader_test \ diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 8dcceb94c..600e2cf2c 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -109,7 +109,6 @@ packoffset {return KW_PACKOFFSET; } pass {return KW_PASS; } PixelShader {return KW_PIXELSHADER; } pixelshader {return KW_PIXELSHADER; } -precise {return KW_PRECISE; } RasterizerOrderedBuffer {return KW_RASTERIZERORDEREDBUFFER; } RasterizerOrderedStructuredBuffer {return KW_RASTERIZERORDEREDSTRUCTUREDBUFFER; } RasterizerOrderedTexture1D {return KW_RASTERIZERORDEREDTEXTURE1D; } diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index b484a9524..957cf56e8 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -5363,7 +5363,6 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, %token KW_PACKOFFSET %token KW_PASS %token KW_PIXELSHADER -%token KW_PRECISE %token KW_RASTERIZERORDEREDBUFFER %token KW_RASTERIZERORDEREDSTRUCTUREDBUFFER %token KW_RASTERIZERORDEREDTEXTURE1D @@ -6815,10 +6814,6 @@ var_modifiers: { $$ = add_modifiers(ctx, $2, HLSL_STORAGE_NOPERSPECTIVE, &@1); } - | KW_PRECISE var_modifiers - { - $$ = add_modifiers(ctx, $2, HLSL_MODIFIER_PRECISE, &@1); - } | KW_SHARED var_modifiers { $$ = add_modifiers(ctx, $2, HLSL_STORAGE_SHARED, &@1); @@ -6867,7 +6862,14 @@ var_modifiers: { $$ = add_modifiers(ctx, $2, HLSL_MODIFIER_INLINE, &@1); } - + | var_identifier var_modifiers + { + if (!strcmp($1, "precise")) + $$ = add_modifiers(ctx, $2, HLSL_MODIFIER_PRECISE, &@1); + else + hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_UNKNOWN_MODIFIER, + "Unknown modifier %s.", debugstr_a($1)); + } complex_initializer: initializer_expr diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 831fb9bc4..653f01d50 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -149,6 +149,7 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_HLSL_NON_FINITE_RESULT = 5027, VKD3D_SHADER_ERROR_HLSL_DUPLICATE_SWITCH_CASE = 5028, VKD3D_SHADER_ERROR_HLSL_MISSING_TECHNIQUE = 5029, + VKD3D_SHADER_ERROR_HLSL_UNKNOWN_MODIFIER = 5030, VKD3D_SHADER_WARNING_HLSL_IMPLICIT_TRUNCATION = 5300, VKD3D_SHADER_WARNING_HLSL_DIVISION_BY_ZERO = 5301, diff --git a/tests/hlsl/precise-modifier.shader_test b/tests/hlsl/precise-modifier.shader_test new file mode 100644 index 000000000..7ad8f39e2 --- /dev/null +++ b/tests/hlsl/precise-modifier.shader_test @@ -0,0 +1,41 @@ +[pixel shader] +// 'precise' is not a keyword +float4 precise; + +float4 main() : sv_target +{ + return precise; +} + +[test] +uniform 0 float4 0.1 0.2 0.3 0.4 +draw quad +probe all rgba (0.1, 0.2, 0.3, 0.4) + +[pixel shader fail(sm>=6)] +precise float4 var; +typedef float4 precise; + +precise main() : sv_target +{ + return var; +} + +[test] +uniform 0 float4 0.1 0.2 0.3 0.4 +draw quad +probe all rgba (0.1, 0.2, 0.3, 0.4) + +[pixel shader] +float4 precise; +precise float4 var; + +float4 main() : sv_target +{ + return precise; +} + +[test] +uniform 0 float4 0.1 0.2 0.3 0.4 +draw quad +probe all rgba (0.1, 0.2, 0.3, 0.4) -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- libs/vkd3d-shader/hlsl.h | 1 + libs/vkd3d-shader/hlsl.y | 2 ++ tests/hlsl/cbuffer.shader_test | 60 ++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index da4bb1e78..36e144962 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -374,6 +374,7 @@ struct hlsl_attribute #define HLSL_STORAGE_CENTROID 0x00004000 #define HLSL_STORAGE_NOPERSPECTIVE 0x00008000 #define HLSL_STORAGE_LINEAR 0x00010000 +#define HLSL_MODIFIER_SINGLE 0x00020000 #define HLSL_TYPE_MODIFIERS_MASK (HLSL_MODIFIER_PRECISE | HLSL_MODIFIER_VOLATILE | \ HLSL_MODIFIER_CONST | HLSL_MODIFIER_ROW_MAJOR | \ diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 957cf56e8..02ec2c9e9 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -6866,6 +6866,8 @@ var_modifiers: { if (!strcmp($1, "precise")) $$ = add_modifiers(ctx, $2, HLSL_MODIFIER_PRECISE, &@1); + else if (!strcmp($1, "single")) + $$ = add_modifiers(ctx, $2, HLSL_MODIFIER_SINGLE, &@1); else hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_UNKNOWN_MODIFIER, "Unknown modifier %s.", debugstr_a($1)); diff --git a/tests/hlsl/cbuffer.shader_test b/tests/hlsl/cbuffer.shader_test index bb0937ed0..517fe6367 100644 --- a/tests/hlsl/cbuffer.shader_test +++ b/tests/hlsl/cbuffer.shader_test @@ -29,11 +29,71 @@ float4 main() : sv_target return foo; } +[pixel shader fail(sm>=6)] +// The 'single' modifier is not a keyword. It's meaningful only for fx_5_0. +single cbuffer cb +{ + float4 single; +}; + +float4 main() : sv_target +{ + return single; +} + [test] uniform 0 float4 1.0 2.0 3.0 4.0 draw quad probe all rgba (1.0, 2.0, 3.0, 4.0) +[pixel shader fail(sm>=6)] +// 'single' modifier is usable when there is a variable with the same name +cbuffer cb +{ + float4 single; +}; + +single cbuffer cb2 +{ + float4 var; +}; + +float4 main() : sv_target +{ + return single; +} + +[test] +uniform 0 float4 1.0 2.0 3.0 4.0 +draw quad +probe all rgba (1.0, 2.0, 3.0, 4.0) + +[pixel shader] +typedef float4 single; +single var; + +float4 main() : sv_target +{ + return var; +} + +[test] +uniform 0 float4 1.0 2.0 3.0 4.0 +draw quad +probe all rgba (1.0, 2.0, 3.0, 4.0) + +[pixel shader fail] +typedef float4 single; +single cbuffer cb +{ + float4 var; +}; + +float4 main() : sv_target +{ + return var; +} + % SM1 buffer offset allocation follows different rules than SM4. % Those would have to be tested separately. [require] -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- libs/vkd3d-shader/fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d-shader/fx.c b/libs/vkd3d-shader/fx.c index fd5c84432..c26958b90 100644 --- a/libs/vkd3d-shader/fx.c +++ b/libs/vkd3d-shader/fx.c @@ -734,7 +734,8 @@ static void write_fx_4_buffer(struct hlsl_buffer *b, struct fx_write_context *fx bind_point = b->reservation.reg_index; if (b->type == HLSL_BUFFER_TEXTURE) flags |= IS_TBUFFER; - /* FIXME: set 'single' flag for fx_5_0 */ + if (ctx->profile->major_version == 5 && b->modifiers & HLSL_MODIFIER_SINGLE) + flags |= IS_SINGLE; name_offset = write_string(b->name, fx); -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
This merge request was approved by Zebediah Figura. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
This merge request was approved by Matteo Bruni. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
This merge request was approved by Giovanni Mascellani. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
This merge request was approved by Henri Verbeet. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/701
participants (6)
-
Giovanni Mascellani (@giomasce) -
Henri Verbeet (@hverbeet) -
Matteo Bruni (@Mystral) -
Nikolay Sivov -
Nikolay Sivov (@nsivov) -
Zebediah Figura (@zfigura)