[PATCH vkd3d v2 3/5] vkd3d-shader/hlsl: Parse explicitly typed texture types.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Thu Oct 7 11:19:26 CDT 2021
On 10/7/21 06:58, Giovanni Mascellani wrote:
> Hi,
>
> Il 06/10/21 16:45, Zebediah Figura ha scritto:
>> @@ -344,9 +345,14 @@ bool hlsl_types_are_equal(const struct hlsl_type
>> *t1, const struct hlsl_type *t2
>> return false;
>> if (t1->base_type != t2->base_type)
>> return false;
>> - if ((t1->base_type == HLSL_TYPE_SAMPLER || t1->base_type ==
>> HLSL_TYPE_TEXTURE)
>> - && t1->sampler_dim != t2->sampler_dim)
>> - return false;
>> + if (t1->base_type == HLSL_TYPE_SAMPLER || t1->base_type ==
>> HLSL_TYPE_TEXTURE)
>> + {
>> + if (t1->sampler_dim != t2->sampler_dim)
>> + return false;
>> + if (t1->base_type == HLSL_TYPE_TEXTURE && t1->sampler_dim !=
>> HLSL_SAMPLER_DIM_GENERIC
>> + && !hlsl_types_are_equal(t1->e.resource_format,
>> t2->e.resource_format))
>> + return false;
>> + }
>> if ((t1->modifiers & HLSL_MODIFIER_ROW_MAJOR)
>> != (t2->modifiers & HLSL_MODIFIER_ROW_MAJOR))
>> return false;
>
> Shouldn't compare_param_hlsl_types be changed in a similar way?
Indeed; thanks for catching that.
>
> More in general, do we really need both hlsl_types_are_equal and
> compare_param_hlsl_types? Couldn't hlsl_types_are_equal just cast to
> bool the result on compare_param_hlsl_types?
They don't behave exactly the same, though. In particular,
compare_param_hlsl_types() will count "float" as equal to "float1", and
"row_major float4x4" as equal to "column_major float4x4".
Some brief testing suggests this is incorrect, though. Native will let
you do this:
void func(float a) {}
void func(float1 a) {}
It will also accept "row_major float4x4" alongside "column_major 4x4".
Even worse, though, it will accept "float4x4" alongside "column_major
4x4", "float" alongside "const float" alongside "volatile float", and
even the following:
void func(float a) {}
typedef float myfloat;
void func(myfloat a) {}
It won't accept "float" alongside "in float", though. That's too far.
But it will accept "float" alongside "inout float" alongside "out float".
Of course, attempting to actually *call* func in any of these cases
results in an "ambiguous function call" error. So it's not completely
insane.
More information about the wine-devel
mailing list