From de8f35bba87d0dc53e57f197f0ea28b90b5a3ef3 Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Wed, 1 Sep 2010 22:53:13 +0200 Subject: [PATCH] d3dx9: Implement D3DXCompileShaderFromFile. --- dlls/d3dx9_36/shader.c | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index 35665d6296..d6e3ecc8da 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -383,6 +383,81 @@ HRESULT WINAPI D3DXCompileShader(LPCSTR pSrcData, return hr; } +HRESULT WINAPI D3DXCompileShaderFromFileA(LPCSTR filename, + CONST D3DXMACRO* defines, + LPD3DXINCLUDE include, + LPCSTR entrypoint, + LPCSTR profile, + DWORD flags, + LPD3DXBUFFER* shader, + LPD3DXBUFFER* error_messages, + LPD3DXCONSTANTTABLE* constant_table) +{ + LPWSTR filename_w = NULL; + DWORD len; + HRESULT ret; + + if (!filename) return D3DXERR_INVALIDDATA; + + len = MultiByteToWideChar(CP_ACP, 0, filename, -1, NULL, 0); + filename_w = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (!filename_w) return E_OUTOFMEMORY; + MultiByteToWideChar(CP_ACP, 0, filename, -1, filename_w, len); + + ret = D3DXCompileShaderFromFileW(filename_w, defines, include, + entrypoint, profile, flags, + shader, error_messages, constant_table); + + HeapFree(GetProcessHeap(), 0, filename_w); + return ret; +} + +HRESULT WINAPI D3DXCompileShaderFromFileW(LPCWSTR filename, + CONST D3DXMACRO* defines, + LPD3DXINCLUDE include, + LPCSTR entrypoint, + LPCSTR profile, + DWORD flags, + LPD3DXBUFFER* shader, + LPD3DXBUFFER* error_messages, + LPD3DXCONSTANTTABLE* constant_table) +{ + void *buffer; + DWORD len; + HRESULT hr; + struct D3DXIncludeImpl includefromfile; + char *filename_a; + + if (FAILED(map_view_of_file(filename, &buffer, &len))) + return D3DXERR_INVALIDDATA; + + if (!include) + { + includefromfile.lpVtbl = &D3DXInclude_Vtbl; + include = (LPD3DXINCLUDE)&includefromfile; + } + + filename_a = HeapAlloc(GetProcessHeap(), 0, len * sizeof(char)); + if (!filename_a) + { + UnmapViewOfFile(buffer); + return E_OUTOFMEMORY; + } + WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL); + + hr = D3DCompile(buffer, len, filename_a, (D3D_SHADER_MACRO *)defines, + (ID3DInclude *)include, entrypoint, profile, flags, 0, + (ID3DBlob **)shader, (ID3DBlob **)error_messages); + + if (SUCCEEDED(hr) && constant_table) + hr = D3DXGetShaderConstantTable(ID3DXBuffer_GetBufferPointer(*shader), + constant_table); + + HeapFree(GetProcessHeap(), 0, filename_a); + UnmapViewOfFile(buffer); + return hr; +} + static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl; typedef struct ID3DXConstantTableImpl {