reactos/sdk/tools/winesync/d3dx9_staging/0012-d3dx9_36__Filter_out_D3DCompile_warning_messages_that_are_not_present_with_D3DCompileShader._(try_4).diff

47 lines
1.7 KiB
Diff
Raw Normal View History

diff --git a/dll/directx/wine/d3dx9_36/shader.c b/dll/directx/wine/d3dx9_36/shader.c
index 1c6acc8..3e0d922 100644
--- a/dll/directx/wine/d3dx9_36/shader.c
+++ b/dll/directx/wine/d3dx9_36/shader.c
@@ -441,6 +441,41 @@ HRESULT WINAPI D3DXCompileShader(const char *data, UINT length, const D3DXMACRO
}
}
+ /* Filter out D3DCompile warning messages that are not present with D3DCompileShader */
+ if (SUCCEEDED(hr) && error_msgs && *error_msgs)
+ {
+ char *messages = ID3DXBuffer_GetBufferPointer(*error_msgs);
+ DWORD size = ID3DXBuffer_GetBufferSize(*error_msgs);
+
+ /* Ensure messages are null terminated for safe processing */
+ if (size) messages[size - 1] = 0;
+
+ while (size > 1)
+ {
+ char *prev, *next;
+
+ /* Warning has the form "warning X3206: ... implicit truncation of vector type"
+ but we only search for "X3206:" in case d3dcompiler_43 has localization */
+ prev = next = strstr(messages, "X3206:");
+ if (!prev) break;
+
+ /* get pointer to beginning and end of current line */
+ while (prev > messages && *(prev - 1) != '\n') prev--;
+ while (next < messages + size - 1 && *next != '\n') next++;
+ if (next < messages + size - 1 && *next == '\n') next++;
+
+ memmove(prev, next, messages + size - next);
+ size -= (next - prev);
+ }
+
+ /* Only return a buffer if the resulting string is not empty as some apps depend on that */
+ if (size <= 1)
+ {
+ ID3DXBuffer_Release(*error_msgs);
+ *error_msgs = NULL;
+ }
+ }
+
return hr;
}