[PATCH vkd3d 2/5] vkd3d-shader: Track bytecode buffer size in bytes.

Matteo Bruni matteo.mystral at gmail.com
Wed Jun 30 07:44:13 CDT 2021


On Tue, Jun 29, 2021 at 8:00 PM Zebediah Figura <zfigura at codeweavers.com> wrote:
>
> And change the way we handle alignment.
>
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
>  libs/vkd3d-shader/hlsl.h         |  4 +-
>  libs/vkd3d-shader/hlsl_codegen.c | 92 +++++++++++++-------------------
>  2 files changed, 39 insertions(+), 57 deletions(-)
>

> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
> index 9afa590a..27bbd9b6 100644
> --- a/libs/vkd3d-shader/hlsl_codegen.c
> +++ b/libs/vkd3d-shader/hlsl_codegen.c

> @@ -1631,20 +1612,21 @@ static void write_sm1_uniforms(struct hlsl_ctx *ctx, struct bytecode_buffer *buf
>      {
>          if (!var->semantic.name && var->reg.allocated)
>          {
> -            set_dword(buffer, vars_start + (uniform_count * 5), (buffer->count - ctab_start) * sizeof(*buffer->data));
> +            size_t var_offset = vars_start + (uniform_count * 5 * sizeof(uint32_t));
> +
> +            set_dword(buffer, var_offset, buffer->size - ctab_start);
>              put_string(buffer, var->name);
>
>              write_sm1_type(buffer, var->data_type, ctab_start);
> -            set_dword(buffer, vars_start + (uniform_count * 5) + 3,
> -                    (var->data_type->bytecode_offset - ctab_start) * sizeof(*buffer->data));
> +            set_dword(buffer, var_offset + 3 * sizeof(uint32_t), var->data_type->bytecode_offset - ctab_start);
>              ++uniform_count;
>          }
>      }
>
>      offset = put_string(buffer, vkd3d_shader_get_version(NULL, NULL));
> -    set_dword(buffer, creator_offset, (offset - ctab_start) * sizeof(*buffer->data));
> +    set_dword(buffer, creator_offset, offset - ctab_start);
>
> -    set_dword(buffer, size_offset, D3DSIO_COMMENT | ((buffer->count - (ctab_start - 1)) << 16));
> +    set_dword(buffer, size_offset, D3DSIO_COMMENT | (((buffer->size - (ctab_start - 1)) / sizeof(uint32_t)) << 16));

I think this is broken, or at least changed from previous output, for
two different reasons: buffer->size is now not aligned (since
alignment happens on the following put_bytes()) and we want to
subtract ctab_start - 1 * sizeof(DWORD) (or, equivalently,
strlen("CTAB")) from the current offset.

I suggest to replace all the raw uses of buffer->size with a helper
call e.g. size_t get_current_offset_aligned(buffer, alignment) to make
sure we're not falling into this trap.



More information about the wine-devel mailing list