vkd3d-shader/hlsl: Do not immediately fail parsing for malformed 'b' register reservations.

This is a fxc quirk. In most cases, this throws an error, but for global
variables it's completely ignored.
This commit is contained in:
Victor Chiletto
2024-07-03 14:05:58 -03:00
parent b5b3c8b9ff
commit 27414ef928
Notes: Henri Verbeet 2024-07-08 18:04:49 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/792
2 changed files with 17 additions and 5 deletions

View File

@@ -1235,8 +1235,20 @@ static bool parse_reservation_index(struct hlsl_ctx *ctx, const char *string, un
reservation->reg_index = strtoul(string + 1, &endptr, 10) + bracket_offset;
if (endptr == string + 1)
return false;
if (*endptr)
{
/* fxc for SM >= 4 treats all parse failures for 'b' types as successes,
* setting index to -1. It will later fail while validating slot limits. */
if (reservation->reg_type == 'b' && hlsl_version_ge(ctx, 4, 0))
{
reservation->reg_index = -1;
return true;
}
/* All other types tolerate leftover characters. */
if (endptr == string + 1)
return false;
}
return true;
}