2 * Copyright 2021 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "wine/debug.h"
26 #include "d3dcompiler.h"
27 #include "dxhelpers.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
31 #define D3DERR_INVALIDCALL 0x8876086c
33 static HRESULT
create_effect(const void *data
, SIZE_T datasize
, const char *filename
,
34 const D3D10_SHADER_MACRO
*defines
, ID3D10Include
*include
, const char *profile
,
35 UINT shader_flags
, UINT effect_flags
, ID3D10Device
*device
, ID3D10EffectPool
*effect_pool
,
36 ID3D10Effect
**effect
, ID3D10Blob
**errors
)
38 const char dxbc
[] = {'D','X','B','C'};
39 ID3D10Blob
*code
= NULL
;
50 buffer
= (void *)data
;
53 /* Effect is not compiled. */
54 if (datasize
< sizeof(dxbc
) || memcmp(dxbc
, data
, sizeof(dxbc
)))
57 return D3DERR_INVALIDCALL
;
58 if (FAILED(hr
= D3DCompile(data
, datasize
, filename
, defines
, include
, "main", profile
,
59 shader_flags
, effect_flags
, &code
, errors
)))
61 WARN("Effect compilation failed, hr %#lx.\n", hr
);
64 buffer
= ID3D10Blob_GetBufferPointer(code
);
65 size
= ID3D10Blob_GetBufferSize(code
);
68 hr
= D3D10CreateEffectFromMemory(buffer
, size
, effect_flags
, device
, effect_pool
, effect
);
71 ID3D10Blob_Release(code
);
75 HRESULT WINAPI
D3DX10CreateEffectFromMemory(const void *data
, SIZE_T datasize
, const char *filename
,
76 const D3D10_SHADER_MACRO
*defines
, ID3D10Include
*include
, const char *profile
,
77 UINT shader_flags
, UINT effect_flags
, ID3D10Device
*device
, ID3D10EffectPool
*effect_pool
,
78 ID3DX10ThreadPump
*pump
, ID3D10Effect
**effect
, ID3D10Blob
**errors
, HRESULT
*hresult
)
80 TRACE("data %p, datasize %Iu, filename %s, defines %p, include %p, profile %s, shader_flags %#x,"
81 "effect_flags %#x, device %p, effect_pool %p, pump %p, effect %p, errors %p, hresult %p.\n",
82 data
, datasize
, debugstr_a(filename
), defines
, include
, debugstr_a(profile
),
83 shader_flags
, effect_flags
, device
, effect_pool
, pump
, effect
, errors
, hresult
);
86 FIXME("Asynchronous mode is not supported.\n");
89 include
= D3D_COMPILE_STANDARD_FILE_INCLUDE
;
91 return create_effect(data
, datasize
, filename
, defines
, include
, profile
,
92 shader_flags
, effect_flags
, device
, effect_pool
, effect
, errors
);
95 HRESULT WINAPI
D3DX10CreateEffectFromFileW(const WCHAR
*filename
, const D3D10_SHADER_MACRO
*defines
,
96 ID3D10Include
*include
, const char *profile
, UINT shader_flags
, UINT effect_flags
,
97 ID3D10Device
*device
, ID3D10EffectPool
*effect_pool
, ID3DX10ThreadPump
*pump
,
98 ID3D10Effect
**effect
, ID3D10Blob
**errors
, HRESULT
*hresult
)
100 char filename_a
[MAX_PATH
];
105 TRACE("filename %s, defines %p, include %p, profile %s, shader_flags %#x, effect_flags %#x, "
106 "device %p, effect_pool %p, pump %p, effect %p, errors %p, hresult %p.\n",
107 debugstr_w(filename
), defines
, include
, debugstr_a(profile
), shader_flags
, effect_flags
,
108 device
, effect_pool
, pump
, effect
, errors
, hresult
);
114 FIXME("Asynchronous mode is not supported.\n");
117 include
= D3D_COMPILE_STANDARD_FILE_INCLUDE
;
119 if (SUCCEEDED((hr
= load_file(filename
, &buffer
, &size
))))
121 WideCharToMultiByte(CP_ACP
, 0, filename
, -1, filename_a
, sizeof(filename_a
), NULL
, NULL
);
122 hr
= create_effect(buffer
, size
, filename_a
, defines
, include
, profile
,
123 shader_flags
, effect_flags
, device
, effect_pool
, effect
, errors
);
130 HRESULT WINAPI
D3DX10CreateEffectFromFileA(const char *filename
, const D3D10_SHADER_MACRO
*defines
,
131 ID3D10Include
*include
, const char *profile
, UINT shader_flags
, UINT effect_flags
,
132 ID3D10Device
*device
, ID3D10EffectPool
*effect_pool
, ID3DX10ThreadPump
*pump
,
133 ID3D10Effect
**effect
, ID3D10Blob
**errors
, HRESULT
*hresult
)
139 TRACE("filename %s, defines %p, include %p, profile %s, shader_flags %#x, effect_flags %#x, "
140 "device %p, effect_pool %p, pump %p, effect %p, errors %p, hresult %p.\n",
141 debugstr_a(filename
), defines
, include
, debugstr_a(profile
), shader_flags
, effect_flags
,
142 device
, effect_pool
, pump
, effect
, errors
, hresult
);
147 len
= MultiByteToWideChar(CP_ACP
, 0, filename
, -1, NULL
, 0);
148 if (!(filenameW
= malloc(len
* sizeof(*filenameW
))))
149 return E_OUTOFMEMORY
;
150 MultiByteToWideChar(CP_ACP
, 0, filename
, -1, filenameW
, len
);
152 hr
= D3DX10CreateEffectFromFileW(filenameW
, defines
, include
, profile
, shader_flags
,
153 effect_flags
, device
, effect_pool
, pump
, effect
, errors
, hresult
);
159 HRESULT WINAPI
D3DX10CreateEffectFromResourceA(HMODULE module
, const char *resource_name
,
160 const char *filename
, const D3D10_SHADER_MACRO
*defines
, ID3D10Include
*include
,
161 const char *profile
, UINT shader_flags
, UINT effect_flags
, ID3D10Device
*device
,
162 ID3D10EffectPool
*effect_pool
, ID3DX10ThreadPump
*pump
, ID3D10Effect
**effect
,
163 ID3D10Blob
**errors
, HRESULT
*hresult
)
169 TRACE("module %p, resource_name %s, filename %s, defines %p, include %p, profile %s, "
170 "shader_flags %#x, effect_flags %#x, device %p, effect_pool %p, pump %p, effect %p, "
171 "errors %p, hresult %p.\n", module
, debugstr_a(resource_name
), debugstr_a(filename
),
172 defines
, include
, debugstr_a(profile
), shader_flags
, effect_flags
,
173 device
, effect_pool
, pump
, effect
, errors
, hresult
);
175 hr
= load_resourceA(module
, resource_name
, &data
, &size
);
179 return create_effect(data
, size
, filename
, defines
, include
, profile
,
180 shader_flags
, effect_flags
, device
, effect_pool
, effect
, errors
);
183 HRESULT WINAPI
D3DX10CreateEffectFromResourceW(HMODULE module
, const WCHAR
*resource_name
,
184 const WCHAR
*filenameW
, const D3D10_SHADER_MACRO
*defines
, ID3D10Include
*include
,
185 const char *profile
, UINT shader_flags
, UINT effect_flags
, ID3D10Device
*device
,
186 ID3D10EffectPool
*effect_pool
, ID3DX10ThreadPump
*pump
, ID3D10Effect
**effect
,
187 ID3D10Blob
**errors
, HRESULT
*hresult
)
189 char *filename
= NULL
;
195 TRACE("module %p, resource_name %s, filename %s, defines %p, include %p, profile %s, "
196 "shader_flags %#x, effect_flags %#x, device %p, effect_pool %p, pump %p, effect %p, "
197 "errors %p, hresult %p.\n", module
, debugstr_w(resource_name
), debugstr_w(filenameW
),
198 defines
, include
, debugstr_a(profile
), shader_flags
, effect_flags
,
199 device
, effect_pool
, pump
, effect
, errors
, hresult
);
201 hr
= load_resourceW(module
, resource_name
, &data
, &size
);
207 len
= WideCharToMultiByte(CP_ACP
, 0, filenameW
, -1, NULL
, 0, NULL
, NULL
);
208 if (!(filename
= malloc(len
)))
209 return E_OUTOFMEMORY
;
210 WideCharToMultiByte(CP_ACP
, 0, filenameW
, -1, filename
, len
, NULL
, NULL
);
213 hr
= create_effect(data
, size
, filename
, defines
, include
, profile
,
214 shader_flags
, effect_flags
, device
, effect_pool
, effect
, errors
);
219 HRESULT WINAPI
D3DX10PreprocessShaderFromMemory(const char *data
, SIZE_T data_size
, const char *filename
,
220 const D3D10_SHADER_MACRO
*defines
, ID3DInclude
*include
, ID3DX10ThreadPump
*pump
, ID3D10Blob
**shader_text
,
221 ID3D10Blob
**errors
, HRESULT
*hresult
)
225 TRACE("data %s, data_size %Iu, filename %s, defines %p, include %p, pump %p, shader_text %p, "
226 "errors %p, hresult %p.\n",
227 debugstr_an(data
, data_size
), data_size
, debugstr_a(filename
), defines
, include
, pump
,
228 shader_text
, errors
, hresult
);
234 FIXME("Unimplemented ID3DX10ThreadPump handling.\n");
236 hr
= D3DPreprocess(data
, data_size
, filename
, defines
, include
, shader_text
, errors
);