[2/3] d3dx9: Implement D3DXCompileShaderFromFile.
Matteo Bruni
matteo.mystral at gmail.com
Wed Sep 1 18:05:01 CDT 2010
-------------- next part --------------
From df0d66d206b8b79a965be6bcfc7c06af5bc03756 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Wed, 1 Sep 2010 22:53:13 +0200
Subject: 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 {
--
1.7.1
More information about the wine-patches
mailing list