Isabella Bosia : vkd3d-shader: Add vkd3d_dxbc_binary_to_text() helper function.
Alexandre Julliard
julliard at winehq.org
Fri Sep 25 14:50:22 CDT 2020
Module: vkd3d
Branch: master
Commit: a0d469b20e319cdffcc57adf64f4c00da9d5f2b0
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=a0d469b20e319cdffcc57adf64f4c00da9d5f2b0
Author: Isabella Bosia <ibosia at codeweavers.com>
Date: Fri Sep 25 02:26:36 2020 +0100
vkd3d-shader: Add vkd3d_dxbc_binary_to_text() helper function.
Signed-off-by: Isabella Bosia <ibosia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
libs/vkd3d-shader/trace.c | 37 ++++++++++++++++++++++++++------
libs/vkd3d-shader/vkd3d_shader_private.h | 1 +
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index d7495ee..2d758b6 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -1557,17 +1557,18 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "\n");
}
-void vkd3d_shader_trace(void *data)
+enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code *out)
{
struct vkd3d_shader_version shader_version;
- struct vkd3d_string_buffer buffer;
- const char *p, *q;
const DWORD *ptr;
+ struct vkd3d_string_buffer buffer;
+ enum vkd3d_result result = VKD3D_OK;
+ void *code;
if (!vkd3d_string_buffer_init(&buffer))
{
ERR("Failed to initialize string buffer.\n");
- return;
+ return VKD3D_ERROR;
}
shader_sm4_read_header(data, &ptr, &shader_version);
@@ -1583,13 +1584,37 @@ void vkd3d_shader_trace(void *data)
{
WARN("Skipping unrecognized instruction.\n");
shader_addline(&buffer, "<unrecognized instruction>\n");
+ result = VKD3D_ERROR;
continue;
}
shader_dump_instruction(&buffer, &ins, &shader_version);
}
- for (p = buffer.buffer; *p; p = q)
+ code = vkd3d_malloc(buffer.content_size);
+ if (code)
+ {
+ memcpy(code, buffer.buffer, buffer.content_size);
+ out->size = buffer.content_size;
+ out->code = code;
+ }
+ else
+ result = VKD3D_ERROR_OUT_OF_MEMORY;
+
+ vkd3d_string_buffer_cleanup(&buffer);
+
+ return result;
+}
+
+void vkd3d_shader_trace(void *data)
+{
+ const char *p, *q;
+ struct vkd3d_shader_code code;
+
+ if (vkd3d_dxbc_binary_to_text(data, &code) != VKD3D_OK)
+ return;
+
+ for (p = code.code; *p; p = q)
{
if (!(q = strstr(p, "\n")))
q = p + strlen(p);
@@ -1598,5 +1623,5 @@ void vkd3d_shader_trace(void *data)
TRACE(" %.*s", (int)(q - p), p);
}
- vkd3d_string_buffer_cleanup(&buffer);
+ vkd3d_shader_free_shader_code(&code);
}
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 00b2441..ec0014e 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -830,6 +830,7 @@ struct vkd3d_string_buffer
unsigned int content_size;
};
+enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code *out) DECLSPEC_HIDDEN;
void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN;
bool vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN;
int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list