HLSL: allow scalar type keywords as identifiers, and add half type support.
HLSL allows type keywords to also be identifiers, so a sequence such as "float half = 3" is
valid, or more bizzarely, something like "float.float = int.uint + bool;"
There are places this is not supported. E.g, it's permitted for struct members, but not struct
names or functions. Also, vector or matrix types such as "float3" are not permitted as
identifiers.
This PR adds that support, as well as support for the "half" type. In production shaders,
this was seen with variables named "half". The PR attempts to support this without breaking
useful grammar errors such as "; expected" at the end of unterminated statements, so it errs
on that side at the possible expense of failing to accept valid constructs containing a type
keyword identifier. If others are discovered, they can be added.
Also, half is now accepted as a valid type, alongside the min*float types.
2016-12-27 01:45:52 +00:00
|
|
|
|
|
|
|
struct foo_t {
|
|
|
|
float float;
|
|
|
|
};
|
|
|
|
|
|
|
|
float fn(float float) { return float; }
|
|
|
|
|
|
|
|
float4 main() : SV_Target0
|
|
|
|
{
|
|
|
|
float float = 7;
|
|
|
|
bool bool[2] = { float, float };
|
|
|
|
int int = bool[1];
|
|
|
|
uint uint = float + int;
|
|
|
|
min16float min16float = uint;
|
|
|
|
min10float min10float = min16float;
|
|
|
|
half half = 0.5;
|
|
|
|
|
|
|
|
{
|
|
|
|
foo_t float;
|
|
|
|
float.float = 42;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool[0] = bool[1];
|
|
|
|
|
|
|
|
float = float + int + uint + min16float + min10float + (bool[0] ? int : float) + fn(float);
|
|
|
|
|
2017-06-07 05:35:25 +00:00
|
|
|
half2x3 half2x3;
|
2017-06-14 04:22:52 +00:00
|
|
|
half2x3._11 = (float) * float;
|
2017-06-07 05:35:25 +00:00
|
|
|
|
|
|
|
return float + half2x3._11;
|
HLSL: allow scalar type keywords as identifiers, and add half type support.
HLSL allows type keywords to also be identifiers, so a sequence such as "float half = 3" is
valid, or more bizzarely, something like "float.float = int.uint + bool;"
There are places this is not supported. E.g, it's permitted for struct members, but not struct
names or functions. Also, vector or matrix types such as "float3" are not permitted as
identifiers.
This PR adds that support, as well as support for the "half" type. In production shaders,
this was seen with variables named "half". The PR attempts to support this without breaking
useful grammar errors such as "; expected" at the end of unterminated statements, so it errs
on that side at the possible expense of failing to accept valid constructs containing a type
keyword identifier. If others are discovered, they can be added.
Also, half is now accepted as a valid type, alongside the min*float types.
2016-12-27 01:45:52 +00:00
|
|
|
}
|