Zebediah Figura : vkd3d-shader/hlsl: Check that a partial register's mask is also available in is_range_available().
Module: vkd3d Branch: master Commit: c683fc9402ac1057e50f8efd0489ee43b042e0c5 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/c683fc9402ac1057e50f8efd0489ee... Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Fri Oct 27 10:27:37 2023 -0500 vkd3d-shader/hlsl: Check that a partial register's mask is also available in is_range_available(). --- 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 6eac5d49..456c393e 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; }
participants (1)
-
Alexandre Julliard