Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/dxbc.c | 4 ++-- libs/vkd3d-shader/vkd3d_shader_main.c | 20 +++++++++++++------- libs/vkd3d-shader/vkd3d_shader_private.h | 3 ++- 3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 93e7eaf5..3ddca1e9 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -2786,7 +2786,7 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, rts0_handler, root_signature); vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context); @@ -3390,7 +3390,7 @@ int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_ro
done: vkd3d_shader_message_context_trace_messages(&context.message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&context.message_context))) + if (!vkd3d_shader_message_context_copy_messages(&context.message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&context.message_context); return ret; diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index c2fe2c8e..d3d86ed7 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -140,14 +140,20 @@ void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_mess vkd3d_string_buffer_trace_(&context->messages, function); }
-char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) +bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out) { char *messages;
- if ((messages = vkd3d_malloc(context->messages.content_size + 1))) - memcpy(messages, context->messages.buffer, context->messages.content_size + 1); + if (!out) + return true;
- return messages; + *out = NULL; + + if (!(messages = vkd3d_malloc(context->messages.content_size + 1))) + return false; + memcpy(messages, context->messages.buffer, context->messages.content_size + 1); + *out = messages; + return true; }
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, @@ -842,7 +848,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char ret = scan_dxbc(compile_info, &message_context);
vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&message_context); return ret; @@ -956,7 +962,7 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, }
vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&message_context); return ret; @@ -1046,7 +1052,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
ret = shader_parse_input_signature(dxbc->code, dxbc->size, &message_context, signature); vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index f88ea69a..98b5fbc4 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -848,7 +848,8 @@ struct vkd3d_shader_message_context };
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN; -char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN; +bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, + char **out) DECLSPEC_HIDDEN; bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN; void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context,
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/vkd3d_shader_main.c | 3 +++ tests/shader_runner_d3d12.c | 2 ++ 2 files changed, 5 insertions(+)
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index d3d86ed7..8d33859c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -149,6 +149,9 @@ bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_cont
*out = NULL;
+ if (!context->messages.content_size) + return true; + if (!(messages = vkd3d_malloc(context->messages.content_size + 1))) return false; memcpy(messages, context->messages.buffer, context->messages.content_size + 1); diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 16bcbf1f..39cd59a8 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -337,6 +337,8 @@ START_TEST(shader_runner_d3d12) ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr); ok(!blob, "Expected no compiled shader blob.\n"); ok(!!errors, "Expected non-NULL error blob.\n"); + if (!errors) + return;
if (vkd3d_test_state.debug_level) trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- v2: Improve patch subject.
libs/vkd3d-shader/dxbc.c | 6 ++-- libs/vkd3d-shader/trace.c | 6 +--- libs/vkd3d-shader/vkd3d_shader_main.c | 35 ++++++++---------------- libs/vkd3d-shader/vkd3d_shader_private.h | 4 +-- 4 files changed, 16 insertions(+), 35 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 3ddca1e9..9977d1a3 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -2781,8 +2781,7 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc, memset(root_signature, 0, sizeof(*root_signature)); if (messages) *messages = NULL; - if (!vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL)) - return VKD3D_ERROR; + vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL);
ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, rts0_handler, root_signature); vkd3d_shader_message_context_trace_messages(&message_context); @@ -3346,8 +3345,7 @@ int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_ro *messages = NULL;
memset(&context, 0, sizeof(context)); - if (!vkd3d_shader_message_context_init(&context.message_context, VKD3D_SHADER_LOG_INFO, NULL)) - return VKD3D_ERROR; + vkd3d_shader_message_context_init(&context.message_context, VKD3D_SHADER_LOG_INFO, NULL);
if (root_signature->version != VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0 && root_signature->version != VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1) diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c index a510f3a2..9b49ca1d 100644 --- a/libs/vkd3d-shader/trace.c +++ b/libs/vkd3d-shader/trace.c @@ -1579,11 +1579,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code enum vkd3d_result result = VKD3D_OK; void *code;
- if (!vkd3d_string_buffer_init(&buffer)) - { - ERR("Failed to initialize string buffer.\n"); - return VKD3D_ERROR; - } + vkd3d_string_buffer_init(&buffer);
shader_sm4_read_header(data, &ptr, &shader_version); shader_addline(&buffer, "%s_%u_%u\n", diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 8d33859c..7c3885e9 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -23,23 +23,9 @@
VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
-static void vkd3d_string_buffer_clear(struct vkd3d_string_buffer *buffer) +void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) { - buffer->buffer[0] = '\0'; - buffer->content_size = 0; -} - -bool vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) -{ - buffer->buffer_size = 32; - if (!(buffer->buffer = vkd3d_malloc(buffer->buffer_size))) - { - ERR("Failed to allocate shader buffer memory.\n"); - return false; - } - - vkd3d_string_buffer_clear(buffer); - return true; + memset(buffer, 0, sizeof(*buffer)); }
void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer) @@ -52,6 +38,7 @@ static bool vkd3d_string_buffer_resize(struct vkd3d_string_buffer *buffer, int r unsigned int new_buffer_size = buffer->buffer_size * 2; char *new_buffer;
+ new_buffer_size = max(new_buffer_size, 32); while (rc > 0 && (unsigned int)rc >= new_buffer_size - buffer->content_size) new_buffer_size *= 2; if (!(new_buffer = vkd3d_realloc(buffer->buffer, new_buffer_size))) @@ -71,6 +58,9 @@ int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char * va_list a; int rc;
+ if (!buffer->content_size && !vkd3d_string_buffer_resize(buffer, 32)) + return -1; + for (;;) { rem = buffer->buffer_size - buffer->content_size; @@ -118,7 +108,7 @@ static void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, } }
-bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, +void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level, const char *source_name) { context->log_level = log_level; @@ -126,7 +116,7 @@ bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *cont context->line = 0; context->column = 0;
- return vkd3d_string_buffer_init(&context->messages); + vkd3d_string_buffer_init(&context->messages); }
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) @@ -845,8 +835,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char if ((ret = vkd3d_shader_validate_compile_info(compile_info)) < 0) return ret;
- if (!vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name)) - return VKD3D_ERROR_OUT_OF_MEMORY; + vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name);
ret = scan_dxbc(compile_info, &message_context);
@@ -947,8 +936,7 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, if ((ret = vkd3d_shader_validate_compile_info(compile_info)) < 0) return ret;
- if (!vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name)) - return VKD3D_ERROR; + vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name);
switch (compile_info->source_type) { @@ -1050,8 +1038,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
if (messages) *messages = NULL; - if (!vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL)) - return VKD3D_ERROR; + vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL);
ret = shader_parse_input_signature(dxbc->code, dxbc->size, &message_context, signature); vkd3d_shader_message_context_trace_messages(&message_context); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 98b5fbc4..5ae5724a 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -836,7 +836,7 @@ struct vkd3d_string_buffer
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; +void 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;
struct vkd3d_shader_message_context @@ -850,7 +850,7 @@ struct vkd3d_shader_message_context void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN; bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out) DECLSPEC_HIDDEN; -bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, +void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN; void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context, const char *function) DECLSPEC_HIDDEN;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com