d3dx9: Allow D3DXAssembleShader calls with NULL parameters.
This commit is contained in:
parent
0dfedd50c3
commit
8094c5563e
|
@ -411,25 +411,28 @@ HRESULT assemble_shader(const char *preprocShader, const char *preprocMessages,
|
|||
TRACE("Shader source:\n");
|
||||
TRACE("%s\n", debugstr_a(preprocShader));
|
||||
|
||||
size = (messages ? strlen(messages) : 0) +
|
||||
(preprocMessages ? strlen(preprocMessages) : 0) + 1;
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr))
|
||||
if(ppErrorMsgs)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, messages);
|
||||
if(shader) SlDeleteShader(shader);
|
||||
return hr;
|
||||
}
|
||||
pos = ID3DXBuffer_GetBufferPointer(buffer);
|
||||
if(preprocMessages)
|
||||
{
|
||||
CopyMemory(pos, preprocMessages, strlen(preprocMessages) + 1);
|
||||
pos += strlen(preprocMessages);
|
||||
}
|
||||
if(messages)
|
||||
CopyMemory(pos, messages, strlen(messages) + 1);
|
||||
size = (messages ? strlen(messages) : 0) +
|
||||
(preprocMessages ? strlen(preprocMessages) : 0) + 1;
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, messages);
|
||||
if(shader) SlDeleteShader(shader);
|
||||
return hr;
|
||||
}
|
||||
pos = ID3DXBuffer_GetBufferPointer(buffer);
|
||||
if(preprocMessages)
|
||||
{
|
||||
CopyMemory(pos, preprocMessages, strlen(preprocMessages) + 1);
|
||||
pos += strlen(preprocMessages);
|
||||
}
|
||||
if(messages)
|
||||
CopyMemory(pos, messages, strlen(messages) + 1);
|
||||
|
||||
*ppErrorMsgs = buffer;
|
||||
*ppErrorMsgs = buffer;
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, messages);
|
||||
}
|
||||
|
@ -448,15 +451,18 @@ HRESULT assemble_shader(const char *preprocShader, const char *preprocMessages,
|
|||
return D3DXERR_INVALIDDATA;
|
||||
}
|
||||
|
||||
size = HeapSize(GetProcessHeap(), 0, res);
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr))
|
||||
if(ppShader)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, res);
|
||||
return hr;
|
||||
size = HeapSize(GetProcessHeap(), 0, res);
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, res);
|
||||
return hr;
|
||||
}
|
||||
CopyMemory(ID3DXBuffer_GetBufferPointer(buffer), res, size);
|
||||
*ppShader = buffer;
|
||||
}
|
||||
CopyMemory(ID3DXBuffer_GetBufferPointer(buffer), res, size);
|
||||
*ppShader = buffer;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, res);
|
||||
|
||||
|
@ -500,7 +506,8 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
|
|||
}
|
||||
current_include = include;
|
||||
|
||||
*shader = *error_messages = NULL;
|
||||
if(shader) *shader = NULL;
|
||||
if(error_messages) *error_messages = NULL;
|
||||
wpp_output_size = wpp_output_capacity = 0;
|
||||
wpp_output = NULL;
|
||||
|
||||
|
@ -525,11 +532,14 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
|
|||
TRACE("Preprocessor messages:\n");
|
||||
TRACE("%s", wpp_messages);
|
||||
|
||||
size = strlen(wpp_messages) + 1;
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr)) goto cleanup;
|
||||
CopyMemory(ID3DXBuffer_GetBufferPointer(buffer), wpp_messages, size);
|
||||
*error_messages = buffer;
|
||||
if(error_messages)
|
||||
{
|
||||
size = strlen(wpp_messages) + 1;
|
||||
hr = D3DXCreateBuffer(size, &buffer);
|
||||
if(FAILED(hr)) goto cleanup;
|
||||
CopyMemory(ID3DXBuffer_GetBufferPointer(buffer), wpp_messages, size);
|
||||
*error_messages = buffer;
|
||||
}
|
||||
}
|
||||
if(data)
|
||||
{
|
||||
|
|
|
@ -1435,6 +1435,25 @@ static void assembleshader_test(void) {
|
|||
}
|
||||
if(shader) ID3DXBuffer_Release(shader);
|
||||
|
||||
/* NULL messages test */
|
||||
shader = NULL;
|
||||
hr = D3DXAssembleShader(test1, strlen(test1),
|
||||
defines, NULL, D3DXSHADER_SKIPVALIDATION,
|
||||
&shader, NULL);
|
||||
ok(hr == D3D_OK, "NULL messages test failed with error 0x%x - %d\n", hr, hr & 0x0000FFFF);
|
||||
if(shader) ID3DXBuffer_Release(shader);
|
||||
|
||||
/* NULL shader test */
|
||||
messages = NULL;
|
||||
hr = D3DXAssembleShader(test1, strlen(test1),
|
||||
defines, NULL, D3DXSHADER_SKIPVALIDATION,
|
||||
NULL, &messages);
|
||||
ok(hr == D3D_OK, "NULL shader test failed with error 0x%x - %d\n", hr, hr & 0x0000FFFF);
|
||||
if(messages) {
|
||||
trace("D3DXAssembleShader messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages));
|
||||
ID3DXBuffer_Release(messages);
|
||||
}
|
||||
|
||||
/* pInclude test */
|
||||
shader = NULL;
|
||||
messages = NULL;
|
||||
|
|
Loading…
Reference in New Issue