[PATCH vkd3d] vkd3d-shader: Allow a NULL buffer in vkd3d_string_buffer.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Tue Oct 5 11:21:30 CDT 2021
On 10/5/21 06:57, Giovanni Mascellani wrote:
> Hi,
>
> Il 04/10/21 19:03, Zebediah Figura ha scritto:
>> On 10/4/21 3:32 AM, Giovanni Mascellani wrote:
>>> Semantically, a NULL buffer is considered equivalent to the empty
>>> string.
>>> The accessor vkd3d_string_buffer_data implements this equivalence.
>>>
>>> The reason for this change is to avoid asserting the result of a memory
>>> allocation in vkd3d_string_buffer_init, while at the same time keeping
>>> it always successful.
>>
>> Well, I guess this is one alternative to 216057. I don't dislike it.
>
> Mmmh, I'm not really sure why you see it as such, but it was not meant
> to. It's true that it conflicts with it (sorry for that, when I wrote
> and submitted it I hadn't yet seen your patch set), but the intention is
> another, namely remove the assert(buffer->buffer) in Matteo's patch.
> This has nothing to do with how to store type names, which you address
> in your patch.
>
Well, in the sense that 216057 (well, 216055 really) is mainly just
there to get rid of the boilerplate around calling
hlsl_type_to_string(). This patch does lesson that boilerplate a bit.
>>> @@ -855,7 +856,7 @@ struct vkd3d_string_buffer
>>> *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
>>> if ((inner_string = hlsl_type_to_string(ctx, t)))
>>> {
>>> - vkd3d_string_buffer_printf(string, "%s",
>>> inner_string->buffer);
>>> + vkd3d_string_buffer_printf(string, "%s",
>>> vkd3d_string_buffer_data(inner_string));
>>> hlsl_release_string_buffer(ctx, inner_string);
>>> }
>>
>> This means that here, and everywhere else, you can get rid of the NULL
>> check.
>
> I'm pretty sure that in many cases vkd3d_string_buffer_data could be
> avoided, when it can be shown that the buffer cannot be NULL. Though
> ideally I'd like to encapsulate as much as possible the fact that the
> buffer can be NULL inside the accessor vkd3d_string_buffer_data, so I am
> using the accessor nearly everywhere (a couple of places were actually
> using knowledge of the internals of vkd3d_string_buffer, and I didn't
> change that, because after all we're writing C and nobody really expects
> full encapsulation).
I guess you're looking at this with the perspective that it's just there
to avoid asserting the result of an allocation. That's fine, but I think
that it's useful to avoid checking the result of one as well. Sort of
like put_u32() and friends.
>
>>> diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c
>>> b/libs/vkd3d-shader/vkd3d_shader_main.c
>>> index ef9eaef5..8a2dd0e3 100644
>>> --- a/libs/vkd3d-shader/vkd3d_shader_main.c
>>> +++ b/libs/vkd3d-shader/vkd3d_shader_main.c
>>> @@ -25,11 +25,9 @@ VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
>>> void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer)
>>> {
>>> - buffer->buffer_size = 16;
>>> + buffer->buffer_size = 0;
>>> buffer->content_size = 0;
>>> - buffer->buffer = vkd3d_malloc(buffer->buffer_size);
>>> - assert(buffer->buffer);
>>> - memset(buffer->buffer, 0, buffer->buffer_size);
>>> + buffer->buffer = NULL;
>>> }
>>
>> I'm assuming this was accidental.
>
> That was actually the point of the whole patch.
Oh, I see now. Right, I that the whole point of preallocating the
buffer was so that it was never NULL.
>
>>> void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer)
>>> @@ -37,20 +35,29 @@ void vkd3d_string_buffer_cleanup(struct
>>> vkd3d_string_buffer *buffer)
>>> vkd3d_free(buffer->buffer);
>>> }
>>> +const char *vkd3d_string_buffer_data(const struct
>>> vkd3d_string_buffer *buffer)
>>> +{
>>> + return buffer->buffer ? buffer->buffer : "";
>>> +}
>>> +
>>
>> Should this be defined in vkd3d_shader_private.h as an inline function?
>
> Good point about that.
>
> Thanks, Giovanni.
>
More information about the wine-devel
mailing list