[D3DRM] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / dll / directx / wine / d3dx9_36 / d3dx9_private.h
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 #define NONAMELESSUNION
26 #include "wine/debug.h"
27
28 #define COBJMACROS
29 #include "d3dx9.h"
30
31 #define ULONG64_MAX (~(ULONG64)0)
32
33 #define ARRAY_SIZE(array) (sizeof(array)/sizeof(*array))
34
35 struct vec4
36 {
37 float x, y, z, w;
38 };
39
40 struct volume
41 {
42 UINT width;
43 UINT height;
44 UINT depth;
45 };
46
47 /* for internal use */
48 enum format_type {
49 FORMAT_ARGB, /* unsigned */
50 FORMAT_ARGBF16,/* float 16 */
51 FORMAT_ARGBF, /* float */
52 FORMAT_DXT,
53 FORMAT_INDEX,
54 FORMAT_UNKNOWN
55 };
56
57 struct pixel_format_desc {
58 D3DFORMAT format;
59 BYTE bits[4];
60 BYTE shift[4];
61 UINT bytes_per_pixel;
62 UINT block_width;
63 UINT block_height;
64 UINT block_byte_count;
65 enum format_type type;
66 void (*from_rgba)(const struct vec4 *src, struct vec4 *dst);
67 void (*to_rgba)(const struct vec4 *src, struct vec4 *dst, const PALETTEENTRY *palette);
68 };
69
70 static inline BOOL is_conversion_from_supported(const struct pixel_format_desc *format)
71 {
72 if (format->type == FORMAT_ARGB || format->type == FORMAT_ARGBF16
73 || format->type == FORMAT_ARGBF)
74 return TRUE;
75 return !!format->to_rgba;
76 }
77
78 static inline BOOL is_conversion_to_supported(const struct pixel_format_desc *format)
79 {
80 if (format->type == FORMAT_ARGB || format->type == FORMAT_ARGBF16
81 || format->type == FORMAT_ARGBF)
82 return TRUE;
83 return !!format->from_rgba;
84 }
85
86 HRESULT map_view_of_file(const WCHAR *filename, void **buffer, DWORD *length) DECLSPEC_HIDDEN;
87 HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, void **buffer, DWORD *length) DECLSPEC_HIDDEN;
88
89 HRESULT write_buffer_to_file(const WCHAR *filename, ID3DXBuffer *buffer) DECLSPEC_HIDDEN;
90
91 const struct pixel_format_desc *get_format_info(D3DFORMAT format) DECLSPEC_HIDDEN;
92 const struct pixel_format_desc *get_format_info_idx(int idx) DECLSPEC_HIDDEN;
93
94 void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
95 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size,
96 const struct pixel_format_desc *format) DECLSPEC_HIDDEN;
97 void convert_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
98 const struct volume *src_size, const struct pixel_format_desc *src_format,
99 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *dst_size,
100 const struct pixel_format_desc *dst_format, D3DCOLOR color_key, const PALETTEENTRY *palette) DECLSPEC_HIDDEN;
101 void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
102 const struct volume *src_size, const struct pixel_format_desc *src_format,
103 BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *dst_size,
104 const struct pixel_format_desc *dst_format, D3DCOLOR color_key, const PALETTEENTRY *palette) DECLSPEC_HIDDEN;
105
106 HRESULT load_texture_from_dds(IDirect3DTexture9 *texture, const void *src_data, const PALETTEENTRY *palette,
107 DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info, unsigned int skip_levels,
108 unsigned int *loaded_miplevels) DECLSPEC_HIDDEN;
109 HRESULT load_cube_texture_from_dds(IDirect3DCubeTexture9 *cube_texture, const void *src_data,
110 const PALETTEENTRY *palette, DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
111 HRESULT load_volume_from_dds(IDirect3DVolume9 *dst_volume, const PALETTEENTRY *dst_palette,
112 const D3DBOX *dst_box, const void *src_data, const D3DBOX *src_box, DWORD filter, D3DCOLOR color_key,
113 const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
114 HRESULT load_volume_texture_from_dds(IDirect3DVolumeTexture9 *volume_texture, const void *src_data,
115 const PALETTEENTRY *palette, DWORD filter, DWORD color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
116 HRESULT save_dds_texture_to_memory(ID3DXBuffer **dst_buffer, IDirect3DBaseTexture9 *src_texture,
117 const PALETTEENTRY *src_palette) DECLSPEC_HIDDEN;
118
119 unsigned short float_32_to_16(const float in) DECLSPEC_HIDDEN;
120 float float_16_to_32(const unsigned short in) DECLSPEC_HIDDEN;
121
122 /* debug helpers */
123 const char *debug_d3dxparameter_class(D3DXPARAMETER_CLASS c) DECLSPEC_HIDDEN;
124 const char *debug_d3dxparameter_type(D3DXPARAMETER_TYPE t) DECLSPEC_HIDDEN;
125 const char *debug_d3dxparameter_registerset(D3DXREGISTER_SET r) DECLSPEC_HIDDEN;
126
127 /* parameter type conversion helpers */
128 static inline BOOL get_bool(D3DXPARAMETER_TYPE type, const void *data)
129 {
130 switch (type)
131 {
132 case D3DXPT_FLOAT:
133 case D3DXPT_INT:
134 case D3DXPT_BOOL:
135 return !!*(DWORD *)data;
136
137 case D3DXPT_VOID:
138 return *(BOOL *)data;
139
140 default:
141 return FALSE;
142 }
143 }
144
145 static inline int get_int(D3DXPARAMETER_TYPE type, const void *data)
146 {
147 switch (type)
148 {
149 case D3DXPT_FLOAT:
150 return (int)(*(float *)data);
151
152 case D3DXPT_INT:
153 case D3DXPT_VOID:
154 return *(int *)data;
155
156 case D3DXPT_BOOL:
157 return get_bool(type, data);
158
159 default:
160 return 0;
161 }
162 }
163
164 static inline float get_float(D3DXPARAMETER_TYPE type, const void *data)
165 {
166 switch (type)
167 {
168 case D3DXPT_FLOAT:
169 case D3DXPT_VOID:
170 return *(float *)data;
171
172 case D3DXPT_INT:
173 return (float)(*(int *)data);
174
175 case D3DXPT_BOOL:
176 return (float)get_bool(type, data);
177
178 default:
179 return 0.0f;
180 }
181 }
182
183 static inline void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
184 {
185 if (outtype == intype)
186 {
187 *(DWORD *)outdata = *(DWORD *)indata;
188 return;
189 }
190
191 switch (outtype)
192 {
193 case D3DXPT_FLOAT:
194 *(float *)outdata = get_float(intype, indata);
195 break;
196
197 case D3DXPT_BOOL:
198 *(BOOL *)outdata = get_bool(intype, indata);
199 break;
200
201 case D3DXPT_INT:
202 *(int *)outdata = get_int(intype, indata);
203 break;
204
205 default:
206 *(DWORD *)outdata = 0;
207 break;
208 }
209 }
210
211 static inline BOOL is_param_type_sampler(D3DXPARAMETER_TYPE type)
212 {
213 return type == D3DXPT_SAMPLER
214 || type == D3DXPT_SAMPLER1D || type == D3DXPT_SAMPLER2D
215 || type == D3DXPT_SAMPLER3D || type == D3DXPT_SAMPLERCUBE;
216 }
217
218 struct d3dx_parameter;
219
220 enum pres_reg_tables
221 {
222 PRES_REGTAB_IMMED,
223 PRES_REGTAB_CONST,
224 PRES_REGTAB_OCONST,
225 PRES_REGTAB_OBCONST,
226 PRES_REGTAB_OICONST,
227 PRES_REGTAB_TEMP,
228 PRES_REGTAB_COUNT,
229 PRES_REGTAB_FIRST_SHADER = PRES_REGTAB_CONST,
230 };
231
232 struct d3dx_const_param_eval_output
233 {
234 struct d3dx_parameter *param;
235 enum pres_reg_tables table;
236 enum D3DXPARAMETER_CLASS constant_class;
237 unsigned int register_index;
238 unsigned int register_count;
239 BOOL direct_copy;
240 unsigned int element_count;
241 };
242
243 struct d3dx_const_tab
244 {
245 unsigned int input_count;
246 D3DXCONSTANT_DESC *inputs;
247 struct d3dx_parameter **inputs_param;
248 unsigned int const_set_count;
249 unsigned int const_set_size;
250 struct d3dx_const_param_eval_output *const_set;
251 const enum pres_reg_tables *regset2table;
252 ULONG64 update_version;
253 };
254
255 struct d3dx_regstore
256 {
257 void *tables[PRES_REGTAB_COUNT];
258 unsigned int table_sizes[PRES_REGTAB_COUNT]; /* registers count */
259 };
260
261 struct d3dx_pres_ins;
262
263 struct d3dx_preshader
264 {
265 struct d3dx_regstore regs;
266
267 unsigned int ins_count;
268 struct d3dx_pres_ins *ins;
269
270 struct d3dx_const_tab inputs;
271 };
272
273 struct d3dx_param_eval
274 {
275 D3DXPARAMETER_TYPE param_type;
276
277 struct d3dx_preshader pres;
278 struct d3dx_const_tab shader_inputs;
279
280 ULONG64 *version_counter;
281 };
282
283 struct d3dx_shared_data;
284 struct d3dx_top_level_parameter;
285
286 struct d3dx_parameter
287 {
288 char magic_string[4];
289 struct d3dx_top_level_parameter *top_level_param;
290 struct d3dx_param_eval *param_eval;
291 char *name;
292 void *data;
293 D3DXPARAMETER_CLASS class;
294 D3DXPARAMETER_TYPE type;
295 UINT rows;
296 UINT columns;
297 UINT element_count;
298 UINT member_count;
299 DWORD flags;
300 UINT bytes;
301 DWORD object_id;
302
303 struct d3dx_parameter *members;
304 char *semantic;
305 };
306
307 struct d3dx_top_level_parameter
308 {
309 struct d3dx_parameter param;
310 UINT annotation_count;
311 struct d3dx_parameter *annotations;
312 ULONG64 update_version;
313 ULONG64 *version_counter;
314 struct d3dx_shared_data *shared_data;
315 };
316
317 struct d3dx_shared_data
318 {
319 void *data;
320 struct d3dx_top_level_parameter **parameters;
321 unsigned int size, count;
322 ULONG64 update_version;
323 };
324
325 struct d3dx9_base_effect;
326
327 static inline BOOL is_top_level_parameter(struct d3dx_parameter *param)
328 {
329 return &param->top_level_param->param == param;
330 }
331
332 static inline struct d3dx_top_level_parameter
333 *top_level_parameter_from_parameter(struct d3dx_parameter *param)
334 {
335 return CONTAINING_RECORD(param, struct d3dx_top_level_parameter, param);
336 }
337
338 static inline ULONG64 next_update_version(ULONG64 *version_counter)
339 {
340 return ++*version_counter;
341 }
342
343 static inline BOOL is_top_level_param_dirty(struct d3dx_top_level_parameter *param, ULONG64 update_version)
344 {
345 struct d3dx_shared_data *shared_data;
346
347 if ((shared_data = param->shared_data))
348 return update_version < shared_data->update_version;
349 else
350 return update_version < param->update_version;
351 }
352
353 static inline BOOL is_param_dirty(struct d3dx_parameter *param, ULONG64 update_version)
354 {
355 return is_top_level_param_dirty(param->top_level_param, update_version);
356 }
357
358 struct d3dx_parameter *get_parameter_by_name(struct d3dx9_base_effect *base,
359 struct d3dx_parameter *parameter, const char *name) DECLSPEC_HIDDEN;
360
361 #ifdef __REACTOS__
362 #define SET_D3D_STATE_(_manager, _device, _method, ...) ((_manager) ? (_manager)->lpVtbl->_method((_manager), __VA_ARGS__) \
363 : (_device)->lpVtbl->_method((_device), __VA_ARGS__))
364 #define SET_D3D_STATE(_base_effect, _method, ...) SET_D3D_STATE_((_base_effect)->manager, (_base_effect)->device, _method, __VA_ARGS__)
365 #else
366 #define SET_D3D_STATE_(manager, device, method, args...) (manager ? manager->lpVtbl->method(manager, args) \
367 : device->lpVtbl->method(device, args))
368 #define SET_D3D_STATE(base_effect, args...) SET_D3D_STATE_(base_effect->manager, base_effect->device, args)
369 #endif
370
371 HRESULT d3dx_create_param_eval(struct d3dx9_base_effect *base_effect, void *byte_code,
372 unsigned int byte_code_size, D3DXPARAMETER_TYPE type,
373 struct d3dx_param_eval **peval, ULONG64 *version_counter,
374 const char **skip_constants, unsigned int skip_constants_count) DECLSPEC_HIDDEN;
375 void d3dx_free_param_eval(struct d3dx_param_eval *peval) DECLSPEC_HIDDEN;
376 HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval,
377 const struct d3dx_parameter *param, void *param_value) DECLSPEC_HIDDEN;
378 HRESULT d3dx_param_eval_set_shader_constants(ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device,
379 struct d3dx_param_eval *peval, BOOL update_all) DECLSPEC_HIDDEN;
380 BOOL is_param_eval_input_dirty(struct d3dx_param_eval *peval, ULONG64 update_version) DECLSPEC_HIDDEN;
381
382 struct ctab_constant {
383 D3DXCONSTANT_DESC desc;
384 WORD constantinfo_reserved;
385 struct ctab_constant *constants;
386 };
387
388 const struct ctab_constant *d3dx_shader_get_ctab_constant(ID3DXConstantTable *iface,
389 D3DXHANDLE constant) DECLSPEC_HIDDEN;
390
391 HRESULT create_dummy_skin(ID3DXSkinInfo **iface) DECLSPEC_HIDDEN;
392
393 #endif /* __WINE_D3DX9_PRIVATE_H */