[PATCH vkd3d 2/6] vkd3d-shader/hlsl: Move the common shape computation to expr_common_shape.
Zebediah Figura
zfigura at codeweavers.com
Thu Oct 14 21:39:04 CDT 2021
On 10/14/21 12:37 PM, Giovanni Mascellani wrote:
> Hi,
>
> Il 14/10/21 18:09, Zebediah Figura ha scritto:
>> Would it make more sense to instead pass the result of
>> expr_common_base_type() to expr_common_shape()? I.e. something like
>>
>> struct hlsl_type *expr_common_shape(ctx, t1, t2,
>> expr_common_base_type(t1, t2));
>>
>> or
>>
>> struct hlsl_type *expr_common_shape(ctx, t1, t2, HLSL_TYPE_BOOL);
>>
>> One of those things I think of when I see a function with a lot of
>> output parameters :-)
>
> I can do that, if you really want, but I like it less. First because
> IMHO it uselessly subverts the dependencies between different pieces of
> data: the process of computing the result type consists of two parts,
> determining the base type and determining the shape. In principle they
> are nicely independent (well, I think HLSL has some very awful corner
> cases in which this does not happen, but for the moment we're pretending
> only the nice part exists), while reading the code you're proposing I
> would be led to think that determining the shape depends on which base
> type you worked out. I find this confusing.
In a sense, yeah, although I probably wouldn't call it
expr_common_shape() either, which is probably part of the confusion.
>
> Also, this means that, for example in the case of the comparison
> operations of patch 6/6, you have to call expr_common_shape twice, with
> two different base types. Ok, not a big deal, but why make the code more
> confusing for computing twice the same thing?
Hmm, I suppose so...
Granted, you don't *have* to call expr_common_shape() twice; you can
take the prior type and change it to BOOL.
>
> I don't like either passing three pointers to have three outputs from a
> function, but that's what you get when your language doesn't have decent
> support for anonymous product types (tuples). In Python the same thing
> would have been very straightforward and idiomatic. And defining a
> struct just to pass three values seems a bit excessive.
Well, that or proper out parameters, I guess, like HLSL ;-)
Not that HLSL is a pinnacle of good language design, but I'm sure if
this weren't C I'd find it more idiomatic.
As it is I still have a mild preference for avoiding the output
parameters, just for the sake of what I see as idiomatic code, but I
won't object if you keep it the way it is.
More information about the wine-devel
mailing list