Matteo Bruni : d3dx9: Implement D3DXCompileShaderFromFile.
Alexandre Julliard
julliard at winehq.org
Thu Sep 2 12:01:26 CDT 2010
Module: wine
Branch: master
Commit: de8f35bba87d0dc53e57f197f0ea28b90b5a3ef3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=de8f35bba87d0dc53e57f197f0ea28b90b5a3ef3
Author: Matteo Bruni <matteo.mystral at gmail.com>
Date: Wed Sep 1 22:53:13 2010 +0200
d3dx9: Implement D3DXCompileShaderFromFile.
---
dlls/d3dx9_36/shader.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 35665d6..d6e3ecc 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 {
More information about the wine-cvs
mailing list