Module: vkd3d Branch: master Commit: cea9f19bd4b3a4f890ce56851dac2a7dc0e7a50c URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=cea9f19bd4b3a4f890ce5685...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Mar 1 13:21:34 2022 +0100
vkd3d-shader/d3d-asm: Always use '.' as decimal separator when printing doubles.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
libs/vkd3d-shader/trace.c | 15 ++++++++++----- libs/vkd3d-shader/vkd3d_shader_main.c | 15 +++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c index 57e360f..fde704a 100644 --- a/libs/vkd3d-shader/trace.c +++ b/libs/vkd3d-shader/trace.c @@ -765,12 +765,17 @@ static void shader_print_float_literal(struct vkd3d_d3d_asm_compiler *compiler, static void shader_print_double_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, double d, const char *suffix) { + const char *sign = ""; + if (isfinite(d) && signbit(d)) - vkd3d_string_buffer_printf(&compiler->buffer, "%s-%s%.15e%s%s", - prefix, compiler->colours.literal, -d, compiler->colours.reset, suffix); - else - vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%.15e%s%s", - prefix, compiler->colours.literal, d, compiler->colours.reset, suffix); + { + sign = "-"; + d = -d; + } + + vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", prefix, sign, compiler->colours.literal); + vkd3d_string_buffer_print_f64(&compiler->buffer, d); + vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", compiler->colours.reset, suffix); }
static void shader_print_int_literal(struct vkd3d_d3d_asm_compiler *compiler, diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index c5ab9a6..bc3402a 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -107,6 +107,21 @@ int vkd3d_string_buffer_print_f32(struct vkd3d_string_buffer *buffer, float f) return ret; }
+int vkd3d_string_buffer_print_f64(struct vkd3d_string_buffer *buffer, double d) +{ + unsigned int idx = buffer->content_size + 1; + int ret; + + if (!(ret = vkd3d_string_buffer_printf(buffer, "%.16e", d)) && isfinite(d)) + { + if (signbit(d)) + ++idx; + buffer->buffer[idx] = '.'; + } + + return ret; +} + void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function) { vkd3d_shader_trace_text_(buffer->buffer, buffer->content_size, function); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index f0228c1..01e090c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -994,6 +994,7 @@ void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer); void vkd3d_string_buffer_cache_cleanup(struct vkd3d_string_buffer_cache *list); void vkd3d_string_buffer_cache_init(struct vkd3d_string_buffer_cache *list); int vkd3d_string_buffer_print_f32(struct vkd3d_string_buffer *buffer, float f); +int vkd3d_string_buffer_print_f64(struct vkd3d_string_buffer *buffer, double d); int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format, ...) VKD3D_PRINTF_FUNC(2, 3); void vkd3d_string_buffer_release(struct vkd3d_string_buffer_cache *list, struct vkd3d_string_buffer *buffer); #define vkd3d_string_buffer_trace(buffer) \