1 /*
2 * Copyright (C) 2002 Raphael Junqueira
3 * Copyright (C) 2008 David Adam
4 * Copyright (C) 2008 Tony Wasserka
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 *
20 */
21
22 #ifndef __WINE_D3DX9_PRIVATE_H
23 #define __WINE_D3DX9_PRIVATE_H
24
25 #include <stdint.h>
26 #define NONAMELESSUNION
27 #include "wine/debug.h"
28 #include "wine/heap.h"
29 #include "wine/rbtree.h"
30
31 #define COBJMACROS
32 #include "d3dx9.h"
33
34 #define ULONG64_MAX (~(ULONG64)0)
35
36 struct vec4
37 {
38 float x, y, z, w;
39 };
40
41 struct volume
42 {
43 UINT width;
44 UINT height;
45 UINT depth;
46 };
47
48 /* for internal use */
49 enum format_type {
50 FORMAT_ARGB, /* unsigned */
51 FORMAT_ARGBF16,/* float 16 */
52 FORMAT_ARGBF, /* float */
53 FORMAT_DXT,
54 FORMAT_INDEX,
55 FORMAT_UNKNOWN
56 };
57
58 struct pixel_format_desc {
59 D3DFORMAT format;
60 BYTE bits[4];
61 BYTE shift[4];
62 UINT bytes_per_pixel;
63 UINT block_width;
64 UINT block_height;
65 UINT block_byte_count;
66 enum format_type type;
67 void (*from_rgba)(const struct vec4 *src, struct vec4 *dst);
68 void (*to_rgba)(const struct vec4 *src, struct vec4 *dst, const PALETTEENTRY *palette);
69 };
70
71 struct d3dx_include_from_file
72 {
73 ID3DXInclude ID3DXInclude_iface;
74 };
75
76 extern CRITICAL_SECTION from_file_mutex DECLSPEC_HIDDEN;
77 extern const struct ID3DXIncludeVtbl d3dx_include_from_file_vtbl DECLSPEC_HIDDEN;
78
is_conversion_from_supported(const struct pixel_format_desc * format)79 static inline BOOL is_conversion_from_supported(const struct pixel_format_desc *format)
80 {
81 if (format->type == FORMAT_ARGB || format->type == FORMAT_ARGBF16
82 || format->type == FORMAT_ARGBF || format->type == FORMAT_DXT)
83 return TRUE;
84 return !!format->to_rgba;
85 }
86
is_conversion_to_supported(const struct pixel_format_desc * format)87 static inline BOOL is_conversion_to_supported(const struct pixel_format_desc *format)
88 {
89 if (format->type == FORMAT_ARGB || format->type == FORMAT_ARGBF16
90 || format->type == FORMAT_ARGBF || format->type == FORMAT_DXT)
91 return TRUE;
92 return !!format->from_rgba;
93 }
94
95 HRESULT map_view_of_file(const WCHAR *filename, void **buffer, DWORD *length) DECLSPEC_HIDDEN;
96 HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, void **buffer, DWORD *length) DECLSPEC_HIDDEN;
97
98 HRESULT write_buffer_to_file(const WCHAR *filename, ID3DXBuffer *buffer) DECLSPEC_HIDDEN;
99
100 const struct pixel_format_desc *get_format_info(D3DFORMAT format) DECLSPEC_HIDDEN;
101 const struct pixel_format_desc *get_format_info_idx(int idx) DECLSPEC_HIDDEN;
102
103 void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
104 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size,
105 const struct pixel_format_desc *format) DECLSPEC_HIDDEN;
106 void convert_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
107 const struct volume *src_size, const struct pixel_format_desc *src_format,
108 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *dst_size,
109 const struct pixel_format_desc *dst_format, D3DCOLOR color_key, const PALETTEENTRY *palette) DECLSPEC_HIDDEN;
110 void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
111 const struct volume *src_size, const struct pixel_format_desc *src_format,
112 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *dst_size,
113 const struct pixel_format_desc *dst_format, D3DCOLOR color_key, const PALETTEENTRY *palette) DECLSPEC_HIDDEN;
114
115 HRESULT load_texture_from_dds(IDirect3DTexture9 *texture, const void *src_data, const PALETTEENTRY *palette,
116 DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info, unsigned int skip_levels,
117 unsigned int *loaded_miplevels) DECLSPEC_HIDDEN;
118 HRESULT load_cube_texture_from_dds(IDirect3DCubeTexture9 *cube_texture, const void *src_data,
119 const PALETTEENTRY *palette, DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
120 HRESULT load_volume_from_dds(IDirect3DVolume9 *dst_volume, const PALETTEENTRY *dst_palette,
121 const D3DBOX *dst_box, const void *src_data, const D3DBOX *src_box, DWORD filter, D3DCOLOR color_key,
122 const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
123 HRESULT load_volume_texture_from_dds(IDirect3DVolumeTexture9 *volume_texture, const void *src_data,
124 const PALETTEENTRY *palette, DWORD filter, DWORD color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
125 HRESULT lock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect, D3DLOCKED_RECT *lock,
126 IDirect3DSurface9 **temp_surface, BOOL write) DECLSPEC_HIDDEN;
127 HRESULT unlock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect,
128 IDirect3DSurface9 *temp_surface, BOOL update) DECLSPEC_HIDDEN;
129 HRESULT save_dds_texture_to_memory(ID3DXBuffer **dst_buffer, IDirect3DBaseTexture9 *src_texture,
130 const PALETTEENTRY *src_palette) DECLSPEC_HIDDEN;
131
132 unsigned short float_32_to_16(const float in) DECLSPEC_HIDDEN;
133 float float_16_to_32(const unsigned short in) DECLSPEC_HIDDEN;
134
135 /* debug helpers */
136 const char *debug_d3dxparameter_class(D3DXPARAMETER_CLASS c) DECLSPEC_HIDDEN;
137 const char *debug_d3dxparameter_type(D3DXPARAMETER_TYPE t) DECLSPEC_HIDDEN;
138 const char *debug_d3dxparameter_registerset(D3DXREGISTER_SET r) DECLSPEC_HIDDEN;
139
140 /* parameter type conversion helpers */
get_bool(D3DXPARAMETER_TYPE type,const void * data)141 static inline BOOL get_bool(D3DXPARAMETER_TYPE type, const void *data)
142 {
143 switch (type)
144 {
145 case D3DXPT_FLOAT:
146 case D3DXPT_INT:
147 case D3DXPT_BOOL:
148 return !!*(DWORD *)data;
149
150 case D3DXPT_VOID:
151 return *(BOOL *)data;
152
153 default:
154 return FALSE;
155 }
156 }
157
get_int(D3DXPARAMETER_TYPE type,const void * data)158 static inline int get_int(D3DXPARAMETER_TYPE type, const void *data)
159 {
160 switch (type)
161 {
162 case D3DXPT_FLOAT:
163 return (int)(*(float *)data);
164
165 case D3DXPT_INT:
166 case D3DXPT_VOID:
167 return *(int *)data;
168
169 case D3DXPT_BOOL:
170 return get_bool(type, data);
171
172 default:
173 return 0;
174 }
175 }
176
get_float(D3DXPARAMETER_TYPE type,const void * data)177 static inline float get_float(D3DXPARAMETER_TYPE type, const void *data)
178 {
179 switch (type)
180 {
181 case D3DXPT_FLOAT:
182 case D3DXPT_VOID:
183 return *(float *)data;
184
185 case D3DXPT_INT:
186 return (float)(*(int *)data);
187
188 case D3DXPT_BOOL:
189 return (float)get_bool(type, data);
190
191 default:
192 return 0.0f;
193 }
194 }
195
set_number(void * outdata,D3DXPARAMETER_TYPE outtype,const void * indata,D3DXPARAMETER_TYPE intype)196 static inline void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
197 {
198 if (outtype == intype)
199 {
200 *(DWORD *)outdata = *(DWORD *)indata;
201 return;
202 }
203
204 switch (outtype)
205 {
206 case D3DXPT_FLOAT:
207 *(float *)outdata = get_float(intype, indata);
208 break;
209
210 case D3DXPT_BOOL:
211 *(BOOL *)outdata = get_bool(intype, indata);
212 break;
213
214 case D3DXPT_INT:
215 *(int *)outdata = get_int(intype, indata);
216 break;
217
218 default:
219 *(DWORD *)outdata = 0;
220 break;
221 }
222 }
223
is_param_type_sampler(D3DXPARAMETER_TYPE type)224 static inline BOOL is_param_type_sampler(D3DXPARAMETER_TYPE type)
225 {
226 return type == D3DXPT_SAMPLER
227 || type == D3DXPT_SAMPLER1D || type == D3DXPT_SAMPLER2D
228 || type == D3DXPT_SAMPLER3D || type == D3DXPT_SAMPLERCUBE;
229 }
230
231 /* Returns the smallest power of 2 which is greater than or equal to num */
make_pow2(uint32_t num)232 static inline uint32_t make_pow2(uint32_t num)
233 {
234 #ifndef __REACTOS__
235 uint32_t index;
236 #else
237 unsigned long index;
238 #endif
239 return BitScanReverse(&index, num - 1) ? 1u << (index + 1) : 1;
240 }
241
242 struct d3dx_parameter;
243
244 enum pres_reg_tables
245 {
246 PRES_REGTAB_IMMED,
247 PRES_REGTAB_CONST,
248 PRES_REGTAB_OCONST,
249 PRES_REGTAB_OBCONST,
250 PRES_REGTAB_OICONST,
251 PRES_REGTAB_TEMP,
252 PRES_REGTAB_COUNT,
253 PRES_REGTAB_FIRST_SHADER = PRES_REGTAB_CONST,
254 };
255
256 struct d3dx_const_param_eval_output
257 {
258 struct d3dx_parameter *param;
259 enum pres_reg_tables table;
260 enum D3DXPARAMETER_CLASS constant_class;
261 unsigned int register_index;
262 unsigned int register_count;
263 BOOL direct_copy;
264 unsigned int element_count;
265 };
266
267 struct d3dx_const_tab
268 {
269 unsigned int input_count;
270 D3DXCONSTANT_DESC *inputs;
271 struct d3dx_parameter **inputs_param;
272 unsigned int const_set_count;
273 unsigned int const_set_size;
274 struct d3dx_const_param_eval_output *const_set;
275 const enum pres_reg_tables *regset2table;
276 ULONG64 update_version;
277 };
278
279 struct d3dx_regstore
280 {
281 void *tables[PRES_REGTAB_COUNT];
282 unsigned int table_sizes[PRES_REGTAB_COUNT]; /* registers count */
283 };
284
285 struct d3dx_pres_ins;
286
287 struct d3dx_preshader
288 {
289 struct d3dx_regstore regs;
290
291 unsigned int ins_count;
292 struct d3dx_pres_ins *ins;
293
294 struct d3dx_const_tab inputs;
295 };
296
297 struct d3dx_param_eval
298 {
299 D3DXPARAMETER_TYPE param_type;
300
301 struct d3dx_preshader pres;
302 struct d3dx_const_tab shader_inputs;
303
304 ULONG64 *version_counter;
305 };
306
307 struct param_rb_entry
308 {
309 struct wine_rb_entry entry;
310 char *full_name;
311 struct d3dx_parameter *param;
312 };
313
314 struct d3dx_shared_data;
315 struct d3dx_top_level_parameter;
316
317 struct d3dx_parameter
318 {
319 char magic_string[4];
320 struct d3dx_top_level_parameter *top_level_param;
321 struct d3dx_param_eval *param_eval;
322 char *name;
323 void *data;
324 D3DXPARAMETER_CLASS class;
325 D3DXPARAMETER_TYPE type;
326 UINT rows;
327 UINT columns;
328 UINT element_count;
329 UINT member_count;
330 DWORD flags;
331 UINT bytes;
332 DWORD object_id;
333
334 struct d3dx_parameter *members;
335 char *semantic;
336
337 char *full_name;
338 struct wine_rb_entry rb_entry;
339 };
340
341 struct d3dx_top_level_parameter
342 {
343 struct d3dx_parameter param;
344 UINT annotation_count;
345 struct d3dx_parameter *annotations;
346 ULONG64 update_version;
347 ULONG64 *version_counter;
348 struct d3dx_shared_data *shared_data;
349 };
350
351 struct d3dx_shared_data
352 {
353 void *data;
354 struct d3dx_top_level_parameter **parameters;
355 unsigned int size, count;
356 ULONG64 update_version;
357 };
358
359 struct d3dx_effect;
360
is_top_level_parameter(struct d3dx_parameter * param)361 static inline BOOL is_top_level_parameter(struct d3dx_parameter *param)
362 {
363 return ¶m->top_level_param->param == param;
364 }
365
366 static inline struct d3dx_top_level_parameter
top_level_parameter_from_parameter(struct d3dx_parameter * param)367 *top_level_parameter_from_parameter(struct d3dx_parameter *param)
368 {
369 return CONTAINING_RECORD(param, struct d3dx_top_level_parameter, param);
370 }
371
next_update_version(ULONG64 * version_counter)372 static inline ULONG64 next_update_version(ULONG64 *version_counter)
373 {
374 return ++*version_counter;
375 }
376
is_top_level_param_dirty(struct d3dx_top_level_parameter * param,ULONG64 update_version)377 static inline BOOL is_top_level_param_dirty(struct d3dx_top_level_parameter *param, ULONG64 update_version)
378 {
379 struct d3dx_shared_data *shared_data;
380
381 if ((shared_data = param->shared_data))
382 return update_version < shared_data->update_version;
383 else
384 return update_version < param->update_version;
385 }
386
is_param_dirty(struct d3dx_parameter * param,ULONG64 update_version)387 static inline BOOL is_param_dirty(struct d3dx_parameter *param, ULONG64 update_version)
388 {
389 return is_top_level_param_dirty(param->top_level_param, update_version);
390 }
391
392 struct d3dx_parameter *get_parameter_by_name(struct d3dx_effect *effect,
393 struct d3dx_parameter *parameter, const char *name) DECLSPEC_HIDDEN;
394
395 #ifdef __REACTOS__
396 #define SET_D3D_STATE_(_manager, _device, _method, ...) ((_manager) ? (_manager)->lpVtbl->_method((_manager), __VA_ARGS__) \
397 : (_device)->lpVtbl->_method((_device), __VA_ARGS__))
398 #define SET_D3D_STATE(_base_effect, _method, ...) SET_D3D_STATE_((_base_effect)->manager, (_base_effect)->device, _method, __VA_ARGS__)
399 #else
400 #define SET_D3D_STATE_(manager, device, method, args...) (manager ? manager->lpVtbl->method(manager, args) \
401 : device->lpVtbl->method(device, args))
402 #define SET_D3D_STATE(base_effect, args...) SET_D3D_STATE_(base_effect->manager, base_effect->device, args)
403 #endif
404
405 HRESULT d3dx_create_param_eval(struct d3dx_effect *effect, void *byte_code,
406 unsigned int byte_code_size, D3DXPARAMETER_TYPE type,
407 struct d3dx_param_eval **peval, ULONG64 *version_counter,
408 const char **skip_constants, unsigned int skip_constants_count) DECLSPEC_HIDDEN;
409 void d3dx_free_param_eval(struct d3dx_param_eval *peval) DECLSPEC_HIDDEN;
410 HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval,
411 const struct d3dx_parameter *param, void *param_value) DECLSPEC_HIDDEN;
412 HRESULT d3dx_param_eval_set_shader_constants(ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device,
413 struct d3dx_param_eval *peval, BOOL update_all) DECLSPEC_HIDDEN;
414 BOOL is_param_eval_input_dirty(struct d3dx_param_eval *peval, ULONG64 update_version) DECLSPEC_HIDDEN;
415
416 struct ctab_constant {
417 D3DXCONSTANT_DESC desc;
418 WORD constantinfo_reserved;
419 struct ctab_constant *constants;
420 };
421
422 const struct ctab_constant *d3dx_shader_get_ctab_constant(ID3DXConstantTable *iface,
423 D3DXHANDLE constant) DECLSPEC_HIDDEN;
424
425 #endif /* __WINE_D3DX9_PRIVATE_H */
426