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 }; 170 171 HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapchain_desc *desc, 172 struct d3d8_swapchain **swapchain) DECLSPEC_HIDDEN; 173 174 struct d3d8_surface 175 { 176 IDirect3DSurface8 IDirect3DSurface8_iface; 177 struct d3d8_resource resource; 178 struct wined3d_texture *wined3d_texture; 179 unsigned int sub_resource_idx; 180 struct list rtv_entry; 181 struct wined3d_rendertarget_view *wined3d_rtv; 182 IDirect3DDevice8 *parent_device; 183 IUnknown *container; 184 struct d3d8_texture *texture; 185 }; 186 187 struct wined3d_rendertarget_view *d3d8_surface_acquire_rendertarget_view(struct d3d8_surface *surface) DECLSPEC_HIDDEN; 188 struct d3d8_device *d3d8_surface_get_device(const struct d3d8_surface *surface) DECLSPEC_HIDDEN; 189 void d3d8_surface_release_rendertarget_view(struct d3d8_surface *surface, 190 struct wined3d_rendertarget_view *rtv) DECLSPEC_HIDDEN; 191 void surface_init(struct d3d8_surface *surface, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, 192 const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; 193 struct d3d8_surface *unsafe_impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface) DECLSPEC_HIDDEN; 194 195 struct d3d8_vertexbuffer 196 { 197 IDirect3DVertexBuffer8 IDirect3DVertexBuffer8_iface; 198 struct d3d8_resource resource; 199 struct wined3d_buffer *wined3d_buffer; 200 IDirect3DDevice8 *parent_device; 201 DWORD fvf; 202 }; 203 204 HRESULT vertexbuffer_init(struct d3d8_vertexbuffer *buffer, struct d3d8_device *device, 205 UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; 206 struct d3d8_vertexbuffer *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface) DECLSPEC_HIDDEN; 207 208 struct d3d8_indexbuffer 209 { 210 IDirect3DIndexBuffer8 IDirect3DIndexBuffer8_iface; 211 struct d3d8_resource resource; 212 struct wined3d_buffer *wined3d_buffer; 213 IDirect3DDevice8 *parent_device; 214 enum wined3d_format_id format; 215 }; 216 217 HRESULT indexbuffer_init(struct d3d8_indexbuffer *buffer, struct d3d8_device *device, 218 UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 219 struct d3d8_indexbuffer *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface) DECLSPEC_HIDDEN; 220 221 struct d3d8_texture 222 { 223 IDirect3DBaseTexture8 IDirect3DBaseTexture8_iface; 224 struct d3d8_resource resource; 225 struct wined3d_texture *wined3d_texture; 226 IDirect3DDevice8 *parent_device; 227 struct list rtv_list; 228 }; 229 230 HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *device, 231 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 232 HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device, 233 UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 234 HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *device, 235 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; 236 struct d3d8_texture *unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture8 *iface) DECLSPEC_HIDDEN; 237 238 struct d3d8_vertex_declaration 239 { 240 DWORD *elements; 241 DWORD elements_size; /* Size of elements, in bytes */ 242 struct wined3d_vertex_declaration *wined3d_vertex_declaration; 243 DWORD shader_handle; 244 }; 245 246 void d3d8_vertex_declaration_destroy(struct d3d8_vertex_declaration *declaration) DECLSPEC_HIDDEN; 247 HRESULT d3d8_vertex_declaration_init(struct d3d8_vertex_declaration *declaration, 248 struct d3d8_device *device, const DWORD *elements, DWORD shader_handle) DECLSPEC_HIDDEN; 249 HRESULT d3d8_vertex_declaration_init_fvf(struct d3d8_vertex_declaration *declaration, 250 struct d3d8_device *device, DWORD fvf) DECLSPEC_HIDDEN; 251 252 struct d3d8_vertex_shader 253 { 254 struct d3d8_vertex_declaration *vertex_declaration; 255 struct wined3d_shader *wined3d_shader; 256 }; 257 258 void d3d8_vertex_shader_destroy(struct d3d8_vertex_shader *shader) DECLSPEC_HIDDEN; 259 HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, struct d3d8_device *device, 260 const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) DECLSPEC_HIDDEN; 261 262 #define D3D8_MAX_VERTEX_SHADER_CONSTANTF 256 263 264 struct d3d8_pixel_shader 265 { 266 DWORD handle; 267 struct wined3d_shader *wined3d_shader; 268 }; 269 270 void d3d8_pixel_shader_destroy(struct d3d8_pixel_shader *shader) DECLSPEC_HIDDEN; 271 HRESULT d3d8_pixel_shader_init(struct d3d8_pixel_shader *shader, struct d3d8_device *device, 272 const DWORD *byte_code, DWORD shader_handle) DECLSPEC_HIDDEN; 273 274 D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; 275 enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; 276 unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags) DECLSPEC_HIDDEN; 277 void load_local_constants(const DWORD *d3d8_elements, struct wined3d_shader *wined3d_vertex_shader) DECLSPEC_HIDDEN; 278 size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN; 279 280 static inline DWORD d3dusage_from_wined3dusage(unsigned int usage) 281 { 282 return usage & WINED3DUSAGE_MASK; 283 } 284 285 static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage) 286 { 287 switch (access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU)) 288 { 289 default: 290 case WINED3D_RESOURCE_ACCESS_GPU: 291 return D3DPOOL_DEFAULT; 292 case WINED3D_RESOURCE_ACCESS_CPU: 293 if (usage & WINED3DUSAGE_SCRATCH) 294 return D3DPOOL_SCRATCH; 295 return D3DPOOL_SYSTEMMEM; 296 case WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU: 297 return D3DPOOL_MANAGED; 298 } 299 } 300 301 static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int usage) 302 { 303 switch (pool) 304 { 305 case D3DPOOL_DEFAULT: 306 if (usage & D3DUSAGE_DYNAMIC) 307 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 308 return WINED3D_RESOURCE_ACCESS_GPU; 309 case D3DPOOL_MANAGED: 310 return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU 311 | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 312 case D3DPOOL_SYSTEMMEM: 313 case D3DPOOL_SCRATCH: 314 return WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; 315 default: 316 return 0; 317 } 318 } 319 320 #endif /* __WINE_D3DX8_PRIVATE_H */ 321