[PATCH 0/2] MR448: hlsl: Properly handle allocation ranges that aren't aligned to a whole register.
From: Zebediah Figura <zfigura(a)codeweavers.com> --- libs/vkd3d-shader/hlsl_codegen.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 6eac5d490..456c393e3 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -3556,13 +3556,19 @@ static struct hlsl_reg allocate_register(struct hlsl_ctx *ctx, struct register_a static bool is_range_available(const struct register_allocator *allocator, unsigned int first_write, unsigned int last_read, uint32_t reg_idx, unsigned int reg_size) { + unsigned int last_reg_mask = (1u << (reg_size % 4)) - 1; + unsigned int writemask; uint32_t i; for (i = 0; i < (reg_size / 4); ++i) { - if (get_available_writemask(allocator, first_write, last_read, reg_idx + i) != VKD3DSP_WRITEMASK_ALL) + writemask = get_available_writemask(allocator, first_write, last_read, reg_idx + i); + if (writemask != VKD3DSP_WRITEMASK_ALL) return false; } + writemask = get_available_writemask(allocator, first_write, last_read, reg_idx + (reg_size / 4)); + if ((writemask & last_reg_mask) != last_reg_mask) + return false; return true; } -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/448
From: Zebediah Figura <zfigura(a)codeweavers.com> --- libs/vkd3d-shader/hlsl_codegen.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 456c393e3..76a010fb3 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -3587,6 +3587,8 @@ static struct hlsl_reg allocate_range(struct hlsl_ctx *ctx, struct register_allo for (i = 0; i < reg_size / 4; ++i) record_allocation(ctx, allocator, reg_idx + i, VKD3DSP_WRITEMASK_ALL, first_write, last_read); + if (reg_size % 4) + record_allocation(ctx, allocator, reg_idx + (reg_size / 4), (1u << (reg_size % 4)) - 1, first_write, last_read); ret.id = reg_idx; ret.allocation_size = align(reg_size, 4) / 4; -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/448
This merge request was approved by Giovanni Mascellani. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/448
This merge request was approved by Henri Verbeet. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/448
participants (4)
-
Giovanni Mascellani (@giomasce) -
Henri Verbeet (@hverbeet) -
Zebediah Figura -
Zebediah Figura (@zfigura)