[PATCH vkd3d 08/10] vkd3d-shader/d3d-asm: Always use '.' as decimal separator when printing doubles.
Henri Verbeet
hverbeet at codeweavers.com
Tue Mar 1 06:21:34 CST 2022
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
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 57e360f0..fde704a2 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 c5ab9a6a..bc3402a0 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 f0228c15..01e090cc 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) \
--
2.20.1
More information about the wine-devel
mailing list