[PATCH vkd3d v2 2/4] vkd3d-shader: Add shader_dump_to_buffer helper function.
Isabella Bosia
ibosia at codeweavers.com
Thu Sep 24 20:26:36 CDT 2020
Signed-off-by: Isabella Bosia <ibosia at codeweavers.com>
---
V2:
- shader_dump_to_buffer renamed to vkd3d_dxbc_binary_to_text
- Now it returns a vkd3d_result and takes a vkd3d_shader_code * out
parameter
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 f0797b0..e01e162 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -1558,17 +1558,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);
@@ -1584,13 +1585,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);
@@ -1599,5 +1624,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;
--
2.25.1
More information about the wine-devel
mailing list