1 /* 2 * Direct3D 8 private include file 3 * 4 * Copyright 2002-2004 Jason Edmeades 5 * Copyright 2003-2004 Raphael Junqueira 6 * Copyright 2004 Christian Costa 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_D3D8_PRIVATE_H 24 #define __WINE_D3D8_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 "wine/debug.h" 36 #include "wine/heap.h" 37 #include "d3d8.h" 38 #include "wine/wined3d.h" 39 40 #define D3DPRESENTFLAGS_MASK 0x00000fffu 41 42 /* CreateVertexShader can return > 0xFFFF */ 43 #define VS_HIGHESTFIXEDFXF 0xF0000000 44 45 void d3dcaps_from_wined3dcaps(D3DCAPS8 *caps, const WINED3DCAPS *wined3d_caps) DECLSPEC_HIDDEN; 46 47 struct d3d8 48 { 49 IDirect3D8 IDirect3D8_iface; 50 LONG refcount; 51 struct wined3d *wined3d; 52 }; 53 54 BOOL d3d8_init(struct d3d8 *d3d8) DECLSPEC_HIDDEN; 55 56 /***************************************************************************** 57 * IDirect3DDevice8 implementation structure 58 */ 59 60 #define D3D8_INITIAL_HANDLE_TABLE_SIZE 64 61 #define D3D8_INVALID_HANDLE ~0U 62 63 enum d3d8_handle_type 64 { 65 D3D8_HANDLE_FREE, 66 D3D8_HANDLE_VS, 67 D3D8_HANDLE_PS, 68 D3D8_HANDLE_SB, 69 }; 70 71 struct d3d8_handle_entry 72 { 73 void *object; 74 enum d3d8_handle_type type; 75 }; 76 77 struct d3d8_handle_table 78 { 79 struct d3d8_handle_entry *entries; 80 struct d3d8_handle_entry *free_entries; 81 UINT table_size; 82 UINT entry_count; 83 }; 84 85 struct FvfToDecl 86 { 87 DWORD fvf; 88 struct d3d8_vertex_declaration *declaration; 89 }; 90 91 enum d3d8_device_state 92 { 93 D3D8_DEVICE_STATE_OK, 94 D3D8_DEVICE_STATE_LOST, 95 D3D8_DEVICE_STATE_NOT_RESET, 96 }; 97 98 struct d3d8_device 99 { 100 /* IUnknown fields */ 101 IDirect3DDevice8 IDirect3DDevice8_iface; 102 struct wined3d_device_parent device_parent; 103 LONG ref; 104 struct wined3d_device *wined3d_device; 105 IDirect3D8 *d3d_parent; 106 struct d3d8_handle_table handle_table; 107 108 /* FVF management */ 109 struct FvfToDecl *decls; 110 UINT numConvertedDecls, declArraySize; 111 112 /* User data draws */ 113 struct wined3d_buffer *vertex_buffer; 114 UINT vertex_buffer_size; 115 UINT vertex_buffer_pos; 116 struct wined3d_buffer *index_buffer; 117 UINT index_buffer_size; 118 UINT index_buffer_pos; 119 120 LONG device_state; 121 /* Avoids recursion with nested ReleaseRef to 0 */ 122 BOOL inDestruction; 123 124 /* The d3d8 API supports only one implicit swapchain (no D3DCREATE_ADAPTERGROUP_DEVICE, 125 * no GetSwapchain, GetBackBuffer doesn't accept a swapchain number). */ 126 struct d3d8_swapchain *implicit_swapchain; 127 }; 128 129 HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wined3d *wined3d, UINT adapter, 130 D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) DECLSPEC_HIDDEN; 131 132 static inline struct d3d8_device *impl_from_IDirect3DDevice8(IDirect3DDevice8 *iface) 133 { 134 return CONTAINING_RECORD(iface, struct d3d8_device, IDirect3DDevice8_iface); 135 } 136 137 struct d3d8_resource 138 { 139 LONG refcount; 140 struct wined3d_private_store private_store; 141 }; 142 143 void d3d8_resource_cleanup(struct d3d8_resource *resource) DECLSPEC_HIDDEN; 144 HRESULT d3d8_resource_free_private_data(struct d3d8_resource *resource, const GUID *guid) DECLSPEC_HIDDEN; 145 HRESULT d3d8_resource_get_private_data(struct d3d8_resource *resource, const GUID *guid, 146 void *data, DWORD *data_size) DECLSPEC_HIDDEN; 147 void d3d8_resource_init(struct d3d8_resource *resource) DECLSPEC_HIDDEN; 148 HRESULT d3d8_resource_set_private_data(struct d3d8_resource *resource, const GUID *guid, 149 const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; 150 151 struct d3d8_volume 152 { 153 IDirect3DVolume8 IDirect3DVolume8_iface; 154 struct d3d8_resource resource; 155 struct wined3d_texture *wined3d_texture; 156 unsigned int sub_resource_idx; 157 struct d3d8_texture *texture; 158 }; 159 160 void volume_init(struct d3d8_volume *volume, struct wined3d_texture *wined3d_texture, 161 unsigned int sub_resource_idx, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; 162 163 struct d3d8_swapchain 164 { 165 IDirect3DSwapChain8 IDirect3DSwapChain8_iface; 166 LONG refcount; 167 struct wined3d_swapchain *wined3d_swapchain; 168 IDirect3DDevice8 *parent_device; 169 unsigned int swap_interval; 170 }; 171 172 HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapchain_desc *desc, 173 unsigned int swap_interval, struct d3d8_swapchain **swapchain) DECLSPEC_HIDDEN; 174 175 struct d3d8_surface 176 { 177 IDirect3DSurface8 IDirect3DSurface8_iface; 178 struct d3d8_resource resource; 179 struct wined3d_texture *wined3d_texture; 180 unsigned int sub_resource_idx; 181 struct list rtv_entry; 182 struct wined3d_rendertarget_view *wined3d_rtv; 183 IDirect3DDevice8 *parent_device; 184 IUnknown *container; 185 struct d3d8_texture *texture; 186 }; 187 188 struct wined3d_rendertarget_view *d3d8_surface_acquire_rendertarget_view(struct d3d8_surface *surface) DECLSPEC_HIDDEN; 189 struct d3d8_device *d3d8_surface_get_device(const struct d3d8_surface *surface) DECLSPEC_HIDDEN; 190 void d3d8_surface_release_rendertarget_view(struct d3d8_surface *surface, 191 struct wined3d_rendertarget_view *rtv) DECLSPEC_HIDDEN; 192 void surface_init(struct d3d8_surface *surface, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, 193 const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; 194 struct d3d8_surface *unsafe_impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface) DECLSPEC_HIDDEN; 195 196 struct d3d8_vertexbuffer 197 { 198 IDirect3DVertexBuffer8 IDirect3DVertexBuffer8_iface; 199 struct d3d8_resource resource; 200 struct wined3d_buffer *wined3d_buffer; 201 IDirect3DDevice8 *parent_device; 202 DWORD fvf; 203 }; 204 205 HRESULT vertexbuffer_init(struct d3d8_vertexbuffer *buffer, struct d3d8_device *device, 206 UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; 207 struct d3d8_vertexbuffer *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface) DECLSPEC_HIDDEN; 208 209 struct d3d8_indexbuffer 210 { 211 IDirect3DIndexBuffer8 IDirect3DIndexBuffer8_iface; 212 struct d3d8_resource resource; 213 struct wined3d_buffer *wined3d_buffer; 214 IDirect3DDevice8 *parent_device; 215 enum wined3d_format_id format; 216 }; 217 218 HRESULT indexbuffer_init(struct d3d8_indexbuffer *buffer, struct d3d8_device *device, 219 UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 220 struct d3d8_indexbuffer *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface) DECLSPEC_HIDDEN; 221 222 struct d3d8_texture 223 { 224 IDirect3DBaseTexture8 IDirect3DBaseTexture8_iface; 225 struct d3d8_resource resource; 226 struct wined3d_texture *wined3d_texture; 227 IDirect3DDevice8 *parent_device; 228 struct list rtv_list; 229 }; 230 231 HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *device, 232 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 233 HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device, 234 UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 235 HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *device, 236 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 237 struct d3d8_texture *unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture8 *iface) DECLSPEC_HIDDEN; 238 239 struct d3d8_vertex_declaration 240 { 241 DWORD *elements; 242 DWORD elements_size; /* Size of elements, in bytes */ 243 struct wined3d_vertex_declaration *wined3d_vertex_declaration; 244 DWORD shader_handle; 245 }; 246 247 void d3d8_vertex_declaration_destroy(struct d3d8_vertex_declaration *declaration) DECLSPEC_HIDDEN; 248 HRESULT d3d8_vertex_declaration_init(struct d3d8_vertex_declaration *declaration, 249 struct d3d8_device *device, const DWORD *elements, DWORD shader_handle) DECLSPEC_HIDDEN; 250 HRESULT d3d8_vertex_declaration_init_fvf(struct d3d8_vertex_declaration *declaration, 251 struct d3d8_device *device, DWORD fvf) DECLSPEC_HIDDEN; 252 253 struct d3d8_vertex_shader 254 { 255 struct d3d8_vertex_declaration *vertex_declaration; 256 struct wined3d_shader *wined3d_shader; 257 }; 258 259 void d3d8_vertex_shader_destroy(struct d3d8_vertex_shader *shader) DECLSPEC_HIDDEN; 260 HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, struct d3d8_device *device, 261 const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) DECLSPEC_HIDDEN; 262 263 #define D3D8_MAX_VERTEX_SHADER_CONSTANTF 256 264 265 struct d3d8_pixel_shader 266 { 267 DWORD handle; 268 struct wined3d_shader *wined3d_shader; 269 }; 270 271 void d3d8_pixel_shader_destroy(struct d3d8_pixel_shader *shader) DECLSPEC_HIDDEN; 272 HRESULT d3d8_pixel_shader_init(struct d3d8_pixel_shader *shader, struct d3d8_device *device, 273 const DWORD *byte_code, DWORD shader_handle) DECLSPEC_HIDDEN; 274 275 D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; 276 enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; 277 unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags) DECLSPEC_HIDDEN; 278 void load_local_constants(const DWORD *d3d8_elements, struct wined3d_shader *wined3d_vertex_shader) DECLSPEC_HIDDEN; 279 size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN; 280 281 static inline DWORD d3dusage_from_wined3dusage(unsigned int usage) 282 { 283 return usage & WINED3DUSAGE_MASK; 284 } 285 286 static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage) 287 { 288 switch (access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU)) 289 { 290 default: 291 case WINED3D_RESOURCE_ACCESS_GPU: 292 return D3DPOOL_DEFAULT; 293 case WINED3D_RESOURCE_ACCESS_CPU: 294 if (usage & WINED3DUSAGE_SCRATCH) 295 return D3DPOOL_SCRATCH; 296 return D3DPOOL_SYSTEMMEM; 297 case WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU: 298 return D3DPOOL_MANAGED; 299 } 300 } 301 302 static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int usage) 303 { 304 switch (pool) 305 { 306 case D3DPOOL_DEFAULT: 307 if (usage & D3DUSAGE_DYNAMIC) 308 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 309 return WINED3D_RESOURCE_ACCESS_GPU; 310 case D3DPOOL_MANAGED: 311 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU 312 | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 313 case D3DPOOL_SYSTEMMEM: 314 case D3DPOOL_SCRATCH: 315 return WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 316 default: 317 return 0; 318 } 319 } 320 321 #endif /* __WINE_D3DX8_PRIVATE_H */ 322