vkd3d-shader/hlsl: Accept multiple colon-separated attributes.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov 2024-10-27 14:31:20 +01:00 committed by Henri Verbeet
parent 794f4c30f4
commit 5ea946aa90
Notes: Henri Verbeet 2024-11-05 20:05:24 +01:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1230
5 changed files with 75 additions and 23 deletions

View File

@ -53,7 +53,7 @@ struct parse_parameter
struct parse_initializer initializer; struct parse_initializer initializer;
}; };
struct parse_colon_attribute struct parse_colon_attributes
{ {
struct hlsl_semantic semantic; struct hlsl_semantic semantic;
struct hlsl_reg_reservation reg_reservation; struct hlsl_reg_reservation reg_reservation;
@ -6490,7 +6490,7 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim,
struct parse_if_body if_body; struct parse_if_body if_body;
enum parse_assign_op assign_op; enum parse_assign_op assign_op;
struct hlsl_reg_reservation reg_reservation; struct hlsl_reg_reservation reg_reservation;
struct parse_colon_attribute colon_attribute; struct parse_colon_attributes colon_attributes;
struct hlsl_semantic semantic; struct hlsl_semantic semantic;
enum hlsl_buffer_type buffer_type; enum hlsl_buffer_type buffer_type;
enum hlsl_sampler_dim sampler_dim; enum hlsl_sampler_dim sampler_dim;
@ -6687,7 +6687,7 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim,
%type <buffer_type> buffer_type %type <buffer_type> buffer_type
%type <colon_attribute> colon_attribute %type <colon_attributes> colon_attributes
%type <fields> field %type <fields> field
%type <fields> fields_list %type <fields> fields_list
@ -6875,7 +6875,7 @@ effect_group:
} }
buffer_declaration: buffer_declaration:
var_modifiers buffer_type any_identifier colon_attribute annotations_opt var_modifiers buffer_type any_identifier colon_attributes annotations_opt
{ {
if ($4.semantic.name) if ($4.semantic.name)
hlsl_error(ctx, &@4, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC, "Semantics are not allowed on buffers."); hlsl_error(ctx, &@4, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC, "Semantics are not allowed on buffers.");
@ -7200,7 +7200,7 @@ func_declaration:
func_prototype_no_attrs: func_prototype_no_attrs:
/* var_modifiers is necessary to avoid shift/reduce conflicts. */ /* var_modifiers is necessary to avoid shift/reduce conflicts. */
var_modifiers type var_identifier '(' parameters ')' colon_attribute var_modifiers type var_identifier '(' parameters ')' colon_attributes
{ {
uint32_t modifiers = $1; uint32_t modifiers = $1;
struct hlsl_ir_var *var; struct hlsl_ir_var *var;
@ -7377,28 +7377,39 @@ var_identifier:
VAR_IDENTIFIER VAR_IDENTIFIER
| NEW_IDENTIFIER | NEW_IDENTIFIER
colon_attribute: colon_attributes:
%empty %empty
{ {
$$.semantic = (struct hlsl_semantic){0}; $$.semantic = (struct hlsl_semantic){0};
$$.reg_reservation.reg_type = 0; $$.reg_reservation.reg_type = 0;
$$.reg_reservation.offset_type = 0; $$.reg_reservation.offset_type = 0;
} }
| semantic | colon_attributes semantic
{ {
$$.semantic = $1; hlsl_cleanup_semantic(&$$.semantic);
$$.reg_reservation.reg_type = 0; $$.semantic = $2;
$$.reg_reservation.offset_type = 0;
} }
| register_reservation | colon_attributes register_reservation
{ {
$$.semantic = (struct hlsl_semantic){0}; if ($$.reg_reservation.reg_type)
$$.reg_reservation = $1; hlsl_fixme(ctx, &@2, "Multiple register() reservations.");
$$.reg_reservation.reg_type = $2.reg_type;
$$.reg_reservation.reg_index = $2.reg_index;
$$.reg_reservation.reg_space = $2.reg_space;
} }
| packoffset_reservation | colon_attributes packoffset_reservation
{ {
$$.semantic = (struct hlsl_semantic){0}; if (ctx->cur_buffer == ctx->globals_buffer)
$$.reg_reservation = $1; {
hlsl_error(ctx, &@2, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
"The packoffset() reservation is only allowed within 'cbuffer' blocks.");
}
else
{
$$.reg_reservation.offset_type = $2.offset_type;
$$.reg_reservation.offset_index = $2.offset_index;
}
} }
semantic: semantic:
@ -7594,7 +7605,7 @@ parameter:
} }
parameter_decl: parameter_decl:
var_modifiers type_no_void any_identifier arrays colon_attribute var_modifiers type_no_void any_identifier arrays colon_attributes
{ {
uint32_t modifiers = $1; uint32_t modifiers = $1;
struct hlsl_type *type; struct hlsl_type *type;
@ -8095,7 +8106,7 @@ variables_def_typed:
} }
variable_decl: variable_decl:
any_identifier arrays colon_attribute annotations_opt any_identifier arrays colon_attributes annotations_opt
{ {
$$ = hlsl_alloc(ctx, sizeof(*$$)); $$ = hlsl_alloc(ctx, sizeof(*$$));
$$->loc = @1; $$->loc = @1;

View File

@ -639,7 +639,7 @@ float4 main() : sv_target
return tex.Sample(sam, float2(0, 0)); return tex.Sample(sam, float2(0, 0));
} }
[pixel shader todo] [pixel shader]
Texture2D tex; Texture2D tex;
cbuffer buffer cbuffer buffer

View File

@ -39,6 +39,16 @@ float4 main(float tex : texcoord) : sv_target
todo(msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
[pixel shader fail(sm>=6)]
float4 main(float tex : texcoord) : semantic : sv_target
{
return tex;
}
[test]
todo(msl) draw quad
probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
[pixel shader] [pixel shader]
float4 main(float tex : texcoord) : sv_target float4 main(float tex : texcoord) : sv_target
@ -76,7 +86,7 @@ float4 main(in float2 arr[2]) : sv_target
[pixel shader] [pixel shader]
struct apple struct apple
{ {
float3 tp[4] : TEXCOORD0; float3 tp[4] : BOGUS : TEXCOORD0;
}; };
float4 main(in apple a) : sv_target float4 main(in apple a) : sv_target

View File

@ -224,7 +224,7 @@ uniform 4 float 101
todo(msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (100, 100, 100, 100) probe (0, 0) rgba (100, 100, 100, 100)
[pixel shader todo] [pixel shader]
cbuffer c cbuffer c
{ {
float a : packoffset(c1); float a : packoffset(c1);
@ -241,9 +241,26 @@ float4 main() : sv_target
uniform 0 float 200 uniform 0 float 200
uniform 4 float 201 uniform 4 float 201
uniform 8 float 202 uniform 8 float 202
todo(sm<6) draw quad draw quad
todo(sm<6) probe (0,0) rgba (201.0, 202.0, 0.0, 0.0) probe (0,0) rgba (201.0, 202.0, 0.0, 0.0)
[pixel shader]
cbuffer c
{
float a : packoffset(c1) : packoffset(c2);
}
float4 main() : sv_target
{
return float4(a, 0, 0, 0);
}
[test]
uniform 0 float 201
uniform 4 float 202
uniform 8 float 203
draw quad
probe (0,0) rgba (203.0, 0.0, 0.0, 0.0)
[pixel shader fail(sm<4)] [pixel shader fail(sm<4)]
int k : register(i0); // register(cX) is also required. int k : register(i0); // register(cX) is also required.

View File

@ -26,3 +26,17 @@ float4 main() : sv_target
uniform 0 float4 4.0 5.0 6.0 7.0 uniform 0 float4 4.0 5.0 6.0 7.0
todo(msl) draw quad todo(msl) draw quad
probe (0, 0) rgba (4.0, 5.0, 4.0, 5.0) probe (0, 0) rgba (4.0, 5.0, 4.0, 5.0)
[pixel shader]
float a : SEMANTIC : ANOTHER_SEMANTIC;
float4 main() : sv_target
{
return a;
}
[test]
uniform 0 float 3.5
todo(msl) draw quad
probe (0, 0) rgba (3.5, 3.5, 3.5, 3.5)