[PATCH vkd3d 2/3] vkd3d-shader: Don't allocate memory for a string buffer ahead of time.

Matteo Bruni matteo.mystral at gmail.com
Mon Aug 16 11:49:35 CDT 2021


On Mon, Aug 16, 2021 at 6:05 PM Henri Verbeet <hverbeet at gmail.com> wrote:
>
> On Fri, 13 Aug 2021 at 16:15, Matteo Bruni <mbruni at codeweavers.com> wrote:
> > @@ -147,11 +143,6 @@ struct vkd3d_string_buffer *vkd3d_string_buffer_get(struct vkd3d_string_buffer_c
> >          if (!(buffer = vkd3d_malloc(sizeof(*buffer))))
> >              return NULL;
> >          vkd3d_string_buffer_init(buffer);
> > -        if (!vkd3d_string_buffer_resize(buffer, 1))
> > -        {
> > -            vkd3d_free(buffer);
> > -            return NULL;
> > -        }
> >
> I think Zebediah successfully convinced me it's useful for
> vkd3d_string_buffer_get() to return empty but initialised buffers,
> like wined3d's string_buffer_get() does. Note that a consequence of
> not doing this is that we can no longer safely do something like the
> following:
>
>     buffer = vkd3d_string_buffer_get(...);
>
>     if (flags & FLAT)
>         vkd3d_string_buffer_printf(buffer, "flat ");
>     if (flags & NOPERSPECTIVE)
>         vkd3d_string_buffer_printf(buffer, "noperspective ");
>     if (flags & CENTROID)
>         vkd3d_string_buffer_printf(buffer, "centroid ");
>     printf("%svec4 v;\n", buffer->buffer);
>
>     vkd3d_string_buffer_release(..., buffer);
>
> because now buffer->buffer is potentially NULL.

Makes sense (and I totally forgot, not surprising in the least). In
that case though, I think it would be nicer to allocate the initial
buffer in vkd3d_string_buffer_init(), like in wined3d, instead of
having to handle it in two places (with different allocation sizes,
and missing the case where you don't call vkd3d_string_buffer_get() at
all).



More information about the wine-devel mailing list