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 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 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 */ 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 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 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 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 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 */ 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 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 367 *top_level_parameter_from_parameter(struct d3dx_parameter *param) 368 { 369 return CONTAINING_RECORD(param, struct d3dx_top_level_parameter, param); 370 } 371 372 static inline ULONG64 next_update_version(ULONG64 *version_counter) 373 { 374 return ++*version_counter; 375 } 376 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 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