diff --git a/dll/directx/wine/d3dx9_36/shader.c b/dll/directx/wine/d3dx9_36/shader.c index c54bacc364b..ce9d8aef596 100644 --- a/dll/directx/wine/d3dx9_36/shader.c +++ b/dll/directx/wine/d3dx9_36/shader.c @@ -445,6 +445,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; } diff --git a/sdk/tools/winesync/d3dx9_staging/0012-d3dx9_36__Filter_out_D3DCompile_warning_messages_that_are_not_present_with_D3DCompileShader._(try_4).diff b/sdk/tools/winesync/d3dx9_staging/0012-d3dx9_36__Filter_out_D3DCompile_warning_messages_that_are_not_present_with_D3DCompileShader._(try_4).diff new file mode 100644 index 00000000000..9ea5f15bb64 --- /dev/null +++ b/sdk/tools/winesync/d3dx9_staging/0012-d3dx9_36__Filter_out_D3DCompile_warning_messages_that_are_not_present_with_D3DCompileShader._(try_4).diff @@ -0,0 +1,46 @@ +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; + } +