1 /* 2 * Direct3D 9 private include file 3 * 4 * Copyright 2002-2003 Jason Edmeades 5 * Copyright 2002-2003 Raphael Junqueira 6 * Copyright 2005 Oliver Stieber 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 21 */ 22 23 #ifndef __WINE_D3D9_PRIVATE_H 24 #define __WINE_D3D9_PRIVATE_H 25 26 #include <assert.h> 27 #include <stdarg.h> 28 29 #define NONAMELESSUNION 30 #define NONAMELESSSTRUCT 31 #define COBJMACROS 32 #include "windef.h" 33 #include "winbase.h" 34 #include "wingdi.h" 35 #include "winuser.h" 36 #include "wine/debug.h" 37 #include "wine/heap.h" 38 #include "wine/unicode.h" 39 40 #include "d3d9.h" 41 #include "wine/wined3d.h" 42 43 #define D3D9_MAX_VERTEX_SHADER_CONSTANTF 256 44 #define D3D9_MAX_TEXTURE_UNITS 20 45 46 #define D3DPRESENTFLAGS_MASK 0x00000fffu 47 48 #define D3D9_TEXTURE_MIPMAP_DIRTY 0x1 49 50 #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) 51 52 extern const struct wined3d_parent_ops d3d9_null_wined3d_parent_ops DECLSPEC_HIDDEN; 53 54 HRESULT vdecl_convert_fvf(DWORD FVF, D3DVERTEXELEMENT9 **ppVertexElements) DECLSPEC_HIDDEN; 55 D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; 56 BOOL is_gdi_compat_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; 57 enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; 58 unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags) DECLSPEC_HIDDEN; 59 void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *present_parameters, 60 const struct wined3d_swapchain_desc *swapchain_desc, DWORD presentation_interval) DECLSPEC_HIDDEN; 61 void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const WINED3DCAPS *wined3d_caps) DECLSPEC_HIDDEN; 62 63 struct d3d9 64 { 65 IDirect3D9Ex IDirect3D9Ex_iface; 66 LONG refcount; 67 struct wined3d *wined3d; 68 BOOL extended; 69 }; 70 71 BOOL d3d9_init(struct d3d9 *d3d9, BOOL extended) DECLSPEC_HIDDEN; 72 73 struct fvf_declaration 74 { 75 struct wined3d_vertex_declaration *decl; 76 DWORD fvf; 77 }; 78 79 enum d3d9_device_state 80 { 81 D3D9_DEVICE_STATE_OK, 82 D3D9_DEVICE_STATE_LOST, 83 D3D9_DEVICE_STATE_NOT_RESET, 84 }; 85 86 struct d3d9_device 87 { 88 IDirect3DDevice9Ex IDirect3DDevice9Ex_iface; 89 struct wined3d_device_parent device_parent; 90 LONG refcount; 91 struct wined3d_device *wined3d_device; 92 struct d3d9 *d3d_parent; 93 94 struct fvf_declaration *fvf_decls; 95 UINT fvf_decl_count, fvf_decl_size; 96 97 struct wined3d_buffer *vertex_buffer; 98 UINT vertex_buffer_size; 99 UINT vertex_buffer_pos; 100 struct wined3d_buffer *index_buffer; 101 UINT index_buffer_size; 102 UINT index_buffer_pos; 103 104 struct d3d9_surface *render_targets[D3D_MAX_SIMULTANEOUS_RENDERTARGETS]; 105 106 LONG device_state; 107 BOOL in_destruction; 108 BOOL in_scene; 109 BOOL has_vertex_declaration; 110 111 unsigned int max_user_clip_planes; 112 113 UINT implicit_swapchain_count; 114 struct d3d9_swapchain **implicit_swapchains; 115 }; 116 117 HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wined3d *wined3d, 118 UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags, 119 D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode) DECLSPEC_HIDDEN; 120 121 struct d3d9_resource 122 { 123 LONG refcount; 124 struct wined3d_private_store private_store; 125 }; 126 127 void d3d9_resource_cleanup(struct d3d9_resource *resource) DECLSPEC_HIDDEN; 128 HRESULT d3d9_resource_free_private_data(struct d3d9_resource *resource, const GUID *guid) DECLSPEC_HIDDEN; 129 HRESULT d3d9_resource_get_private_data(struct d3d9_resource *resource, const GUID *guid, 130 void *data, DWORD *data_size) DECLSPEC_HIDDEN; 131 void d3d9_resource_init(struct d3d9_resource *resource) DECLSPEC_HIDDEN; 132 HRESULT d3d9_resource_set_private_data(struct d3d9_resource *resource, const GUID *guid, 133 const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; 134 135 struct d3d9_volume 136 { 137 IDirect3DVolume9 IDirect3DVolume9_iface; 138 struct d3d9_resource resource; 139 struct wined3d_texture *wined3d_texture; 140 unsigned int sub_resource_idx; 141 struct d3d9_texture *texture; 142 }; 143 144 void volume_init(struct d3d9_volume *volume, struct wined3d_texture *wined3d_texture, 145 unsigned int sub_resource_idx, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; 146 147 struct d3d9_swapchain 148 { 149 IDirect3DSwapChain9Ex IDirect3DSwapChain9Ex_iface; 150 LONG refcount; 151 struct wined3d_swapchain *wined3d_swapchain; 152 IDirect3DDevice9Ex *parent_device; 153 unsigned int swap_interval; 154 }; 155 156 HRESULT d3d9_swapchain_create(struct d3d9_device *device, struct wined3d_swapchain_desc *desc, 157 unsigned int swap_interval, struct d3d9_swapchain **swapchain) DECLSPEC_HIDDEN; 158 159 struct d3d9_surface 160 { 161 IDirect3DSurface9 IDirect3DSurface9_iface; 162 struct d3d9_resource resource; 163 struct wined3d_texture *wined3d_texture; 164 unsigned int sub_resource_idx; 165 struct list rtv_entry; 166 struct wined3d_rendertarget_view *wined3d_rtv; 167 IDirect3DDevice9Ex *parent_device; 168 IUnknown *container; 169 struct d3d9_texture *texture; 170 }; 171 172 struct wined3d_rendertarget_view *d3d9_surface_acquire_rendertarget_view(struct d3d9_surface *surface) DECLSPEC_HIDDEN; 173 struct d3d9_device *d3d9_surface_get_device(const struct d3d9_surface *surface) DECLSPEC_HIDDEN; 174 void d3d9_surface_release_rendertarget_view(struct d3d9_surface *surface, 175 struct wined3d_rendertarget_view *rtv) DECLSPEC_HIDDEN; 176 void surface_init(struct d3d9_surface *surface, struct wined3d_texture *wined3d_texture, 177 unsigned int sub_resource_idx, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; 178 struct d3d9_surface *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) DECLSPEC_HIDDEN; 179 180 struct d3d9_vertexbuffer 181 { 182 IDirect3DVertexBuffer9 IDirect3DVertexBuffer9_iface; 183 struct d3d9_resource resource; 184 struct wined3d_buffer *wined3d_buffer; 185 IDirect3DDevice9Ex *parent_device; 186 DWORD fvf; 187 }; 188 189 HRESULT vertexbuffer_init(struct d3d9_vertexbuffer *buffer, struct d3d9_device *device, 190 UINT size, UINT usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; 191 struct d3d9_vertexbuffer *unsafe_impl_from_IDirect3DVertexBuffer9(IDirect3DVertexBuffer9 *iface) DECLSPEC_HIDDEN; 192 193 struct d3d9_indexbuffer 194 { 195 IDirect3DIndexBuffer9 IDirect3DIndexBuffer9_iface; 196 struct d3d9_resource resource; 197 struct wined3d_buffer *wined3d_buffer; 198 IDirect3DDevice9Ex *parent_device; 199 enum wined3d_format_id format; 200 }; 201 202 HRESULT indexbuffer_init(struct d3d9_indexbuffer *buffer, struct d3d9_device *device, 203 UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 204 struct d3d9_indexbuffer *unsafe_impl_from_IDirect3DIndexBuffer9(IDirect3DIndexBuffer9 *iface) DECLSPEC_HIDDEN; 205 206 struct d3d9_texture 207 { 208 IDirect3DBaseTexture9 IDirect3DBaseTexture9_iface; 209 struct d3d9_resource resource; 210 struct wined3d_texture *wined3d_texture; 211 IDirect3DDevice9Ex *parent_device; 212 struct list rtv_list; 213 DWORD usage; 214 BOOL flags; 215 struct wined3d_shader_resource_view *wined3d_srv; 216 D3DTEXTUREFILTERTYPE autogen_filter_type; 217 }; 218 219 HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *device, 220 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 221 HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device, 222 UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 223 HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *device, 224 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 225 struct d3d9_texture *unsafe_impl_from_IDirect3DBaseTexture9(IDirect3DBaseTexture9 *iface) DECLSPEC_HIDDEN; 226 void d3d9_texture_flag_auto_gen_mipmap(struct d3d9_texture *texture) DECLSPEC_HIDDEN; 227 void d3d9_texture_gen_auto_mipmap(struct d3d9_texture *texture) DECLSPEC_HIDDEN; 228 229 struct d3d9_stateblock 230 { 231 IDirect3DStateBlock9 IDirect3DStateBlock9_iface; 232 LONG refcount; 233 struct wined3d_stateblock *wined3d_stateblock; 234 IDirect3DDevice9Ex *parent_device; 235 }; 236 237 HRESULT stateblock_init(struct d3d9_stateblock *stateblock, struct d3d9_device *device, 238 D3DSTATEBLOCKTYPE type, struct wined3d_stateblock *wined3d_stateblock) DECLSPEC_HIDDEN; 239 240 struct d3d9_vertex_declaration 241 { 242 IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9_iface; 243 LONG refcount; 244 D3DVERTEXELEMENT9 *elements; 245 UINT element_count; 246 struct wined3d_vertex_declaration *wined3d_declaration; 247 DWORD fvf; 248 IDirect3DDevice9Ex *parent_device; 249 }; 250 251 HRESULT d3d9_vertex_declaration_create(struct d3d9_device *device, 252 const D3DVERTEXELEMENT9 *elements, struct d3d9_vertex_declaration **declaration) DECLSPEC_HIDDEN; 253 struct d3d9_vertex_declaration *unsafe_impl_from_IDirect3DVertexDeclaration9( 254 IDirect3DVertexDeclaration9 *iface) DECLSPEC_HIDDEN; 255 256 struct d3d9_vertexshader 257 { 258 IDirect3DVertexShader9 IDirect3DVertexShader9_iface; 259 LONG refcount; 260 struct wined3d_shader *wined3d_shader; 261 IDirect3DDevice9Ex *parent_device; 262 }; 263 264 HRESULT vertexshader_init(struct d3d9_vertexshader *shader, 265 struct d3d9_device *device, const DWORD *byte_code) DECLSPEC_HIDDEN; 266 struct d3d9_vertexshader *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface) DECLSPEC_HIDDEN; 267 268 struct d3d9_pixelshader 269 { 270 IDirect3DPixelShader9 IDirect3DPixelShader9_iface; 271 LONG refcount; 272 struct wined3d_shader *wined3d_shader; 273 IDirect3DDevice9Ex *parent_device; 274 }; 275 276 HRESULT pixelshader_init(struct d3d9_pixelshader *shader, 277 struct d3d9_device *device, const DWORD *byte_code) DECLSPEC_HIDDEN; 278 struct d3d9_pixelshader *unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface) DECLSPEC_HIDDEN; 279 280 struct d3d9_query 281 { 282 IDirect3DQuery9 IDirect3DQuery9_iface; 283 LONG refcount; 284 struct wined3d_query *wined3d_query; 285 IDirect3DDevice9Ex *parent_device; 286 DWORD data_size; 287 }; 288 289 HRESULT query_init(struct d3d9_query *query, struct d3d9_device *device, D3DQUERYTYPE type) DECLSPEC_HIDDEN; 290 291 static inline struct d3d9_device *impl_from_IDirect3DDevice9Ex(IDirect3DDevice9Ex *iface) 292 { 293 return CONTAINING_RECORD(iface, struct d3d9_device, IDirect3DDevice9Ex_iface); 294 } 295 296 static inline DWORD d3dusage_from_wined3dusage(unsigned int usage) 297 { 298 return usage & WINED3DUSAGE_MASK; 299 } 300 301 static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage) 302 { 303 switch (access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU)) 304 { 305 default: 306 case WINED3D_RESOURCE_ACCESS_GPU: 307 return D3DPOOL_DEFAULT; 308 case WINED3D_RESOURCE_ACCESS_CPU: 309 if (usage & WINED3DUSAGE_SCRATCH) 310 return D3DPOOL_SCRATCH; 311 return D3DPOOL_SYSTEMMEM; 312 case WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU: 313 return D3DPOOL_MANAGED; 314 } 315 } 316 317 static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int usage) 318 { 319 switch (pool) 320 { 321 case D3DPOOL_DEFAULT: 322 if (usage & D3DUSAGE_DYNAMIC) 323 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 324 return WINED3D_RESOURCE_ACCESS_GPU; 325 case D3DPOOL_MANAGED: 326 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU 327 | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 328 case D3DPOOL_SYSTEMMEM: 329 case D3DPOOL_SCRATCH: 330 return WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 331 default: 332 return 0; 333 } 334 } 335 336 static inline DWORD wined3dusage_from_d3dusage(unsigned int usage) 337 { 338 return usage & WINED3DUSAGE_MASK; 339 } 340 341 #endif /* __WINE_D3D9_PRIVATE_H */ 342