[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:34:11 CDT 2021


On 10/7/21 11:19, Zebediah Figura (she/her) wrote:
> 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.
> 

Anyway, what I was going to say is that we probably don't want that 
function (and if we do really need differences we may want to implement 
them with flags instead; cf. expr_compatible_data_types().) But it 
deserves some actual unit tests.



More information about the wine-devel mailing list