microsoft / hlsl-specs

HLSL Specifications
MIT License
116 stars 29 forks source link

Simplify conversion sequences and overload scoring #261

Closed llvm-beanz closed 2 months ago

llvm-beanz commented 2 months ago

This change is a shift in how conversion sequences and overload scoring is handled to disambiguate a few cases that DXC handles today through simpler rules.

The main cases relate to scoring conversion sequences with dimension adjustment conversions. With this change an implicit conversion sequence is now defined as:

Conversion sequences are still assigned the rank of their "highest" conversion following the same chart as before where the ranks are:

Given these rules:

ICS(float -> double) > ICS(float -> double3) ICS(float -> double3) > ICS(float -> half) ICS(float -> double2) == ICS(float -> dobule3) ICS(float -> half) > ICS(float -> half3) ICS(float4 -> double3) > ICS(float4 -> half3) ICS(float4 -> double4) > ICS(float4 -> float2) ICS(float4 -> half4) > ICS(float4 -> float2)

ICS(float -> double) > ICS(float -> float3) ICS(float -> float3) > ICS(float -> double3) ICS(float -> double4) > ICS(float -> half4) ICS(float -> double4) != ICS(float -> double3) ICS(double -> float4) != ICS(double -> float3) ICS(double -> float4) != ICS(double -> half3)

ICS(float4 -> float3) > ICS(float4 -> double3) ICS(float4 -> float3) > ICS(float4 -> half3) ICS(float4 -> double3) > ICS(float4 -> half3) ICS(double4 -> float3) != ICS(double4 ->half3) ICS(half4 -> float3) != ICS(half4 ->double3)