From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3dcompiler_43/compiler.c | 54 +++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-)
diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index bb9b7ce54eb..d328e74585b 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -173,6 +173,22 @@ static void close_include(const struct vkd3d_shader_code *code, void *context) ID3DInclude_Close(iface, code->code); }
+static const char *get_line(const char **ptr) +{ + const char *p, *q; + + p = *ptr; + if (!(q = strstr(p, "\n"))) + { + if (!*p) return NULL; + *ptr += strlen(p); + return p; + } + *ptr = q + 1; + + return p; +} + static HRESULT preprocess_shader(const void *data, SIZE_T data_size, const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, ID3DBlob **shader_blob, ID3DBlob **messages_blob) @@ -486,8 +502,36 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen }
ret = vkd3d_shader_compile(&compile_info, &byte_code, &messages); + + if (!ret) + { + if (FAILED(hr = D3DCreateBlob(byte_code.size, shader_blob))) + { + vkd3d_shader_free_shader_code(&byte_code); + return hr; + } + memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size); + } + else + { + ERR("Failed to compile shader, vkd3d result %d.\n", ret); + } + if (messages) { + if (*messages && ERR_ON(d3dcompiler)) + { + const char *ptr = messages; + const char *line; + + ERR("Shader log:\n"); + while ((line = get_line(&ptr))) + { + ERR(" %.*s", (int)(ptr - line), line); + } + ERR("\n"); + } + if (messages_blob) { size_t size = strlen(messages); @@ -503,16 +547,6 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen vkd3d_shader_free_messages(messages); }
- if (!ret) - { - if (FAILED(hr = D3DCreateBlob(byte_code.size, shader_blob))) - { - vkd3d_shader_free_shader_code(&byte_code); - return hr; - } - memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size); - } - return hresult_from_vkd3d_result(ret); }