VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d8/texture.c@ 69362

Last change on this file since 69362 was 48345, checked in by vboxsync, 12 years ago

header fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 40.2 KB
Line 
1/*
2 * Copyright 2005 Oliver Stieber
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19/*
20 * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
21 * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
22 * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
23 * a choice of LGPL license versions is made available with the language indicating
24 * that LGPLv2 or any later version may be used, or where a choice of which version
25 * of the LGPL is applied is otherwise unspecified.
26 */
27
28#include "config.h"
29#include "d3d8_private.h"
30
31WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
32
33static inline struct d3d8_texture *impl_from_IDirect3DTexture8(IDirect3DTexture8 *iface)
34{
35 return CONTAINING_RECORD(iface, struct d3d8_texture, IDirect3DBaseTexture8_iface);
36}
37
38static inline struct d3d8_texture *impl_from_IDirect3DCubeTexture8(IDirect3DCubeTexture8 *iface)
39{
40 return CONTAINING_RECORD(iface, struct d3d8_texture, IDirect3DBaseTexture8_iface);
41}
42
43static inline struct d3d8_texture *impl_from_IDirect3DVolumeTexture8(IDirect3DVolumeTexture8 *iface)
44{
45 return CONTAINING_RECORD(iface, struct d3d8_texture, IDirect3DBaseTexture8_iface);
46}
47
48static HRESULT WINAPI d3d8_texture_2d_QueryInterface(IDirect3DTexture8 *iface, REFIID riid, void **out)
49{
50 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
51
52 if (IsEqualGUID(riid, &IID_IDirect3DTexture8)
53 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
54 || IsEqualGUID(riid, &IID_IDirect3DResource8)
55 || IsEqualGUID(riid, &IID_IUnknown))
56 {
57 IDirect3DTexture8_AddRef(iface);
58 *out = iface;
59 return S_OK;
60 }
61
62 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
63
64 *out = NULL;
65 return E_NOINTERFACE;
66}
67
68static ULONG WINAPI d3d8_texture_2d_AddRef(IDirect3DTexture8 *iface)
69{
70 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
71 ULONG ref = InterlockedIncrement(&texture->refcount);
72
73 TRACE("%p increasing refcount to %u.\n", iface, ref);
74
75 if (ref == 1)
76 {
77 IDirect3DDevice8_AddRef(texture->parent_device);
78 wined3d_mutex_lock();
79 wined3d_texture_incref(texture->wined3d_texture);
80 wined3d_mutex_unlock();
81 }
82
83 return ref;
84}
85
86static ULONG WINAPI d3d8_texture_2d_Release(IDirect3DTexture8 *iface)
87{
88 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
89 ULONG ref = InterlockedDecrement(&texture->refcount);
90
91 TRACE("%p decreasing refcount to %u.\n", iface, ref);
92
93 if (!ref)
94 {
95 IDirect3DDevice8 *parent_device = texture->parent_device;
96
97 wined3d_mutex_lock();
98 wined3d_texture_decref(texture->wined3d_texture);
99 wined3d_mutex_unlock();
100
101 /* Release the device last, as it may cause the device to be destroyed. */
102 IDirect3DDevice8_Release(parent_device);
103 }
104 return ref;
105}
106
107static HRESULT WINAPI d3d8_texture_2d_GetDevice(IDirect3DTexture8 *iface, IDirect3DDevice8 **device)
108{
109 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
110
111 TRACE("iface %p, device %p.\n", iface, device);
112
113 *device = texture->parent_device;
114 IDirect3DDevice8_AddRef(*device);
115
116 TRACE("Returning device %p.\n", *device);
117
118 return D3D_OK;
119}
120
121static HRESULT WINAPI d3d8_texture_2d_SetPrivateData(IDirect3DTexture8 *iface,
122 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
123{
124 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
125 struct wined3d_resource *resource;
126 HRESULT hr;
127
128 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
129 iface, debugstr_guid(guid), data, data_size, flags);
130
131 wined3d_mutex_lock();
132 resource = wined3d_texture_get_resource(texture->wined3d_texture);
133 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
134 wined3d_mutex_unlock();
135
136 return hr;
137}
138
139static HRESULT WINAPI d3d8_texture_2d_GetPrivateData(IDirect3DTexture8 *iface,
140 REFGUID guid, void *data, DWORD *data_size)
141{
142 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
143 struct wined3d_resource *resource;
144 HRESULT hr;
145
146 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
147 iface, debugstr_guid(guid), data, data_size);
148
149 wined3d_mutex_lock();
150 resource = wined3d_texture_get_resource(texture->wined3d_texture);
151 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
152 wined3d_mutex_unlock();
153
154 return hr;
155}
156
157static HRESULT WINAPI d3d8_texture_2d_FreePrivateData(IDirect3DTexture8 *iface, REFGUID guid)
158{
159 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
160 struct wined3d_resource *resource;
161 HRESULT hr;
162
163 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
164
165 wined3d_mutex_lock();
166 resource = wined3d_texture_get_resource(texture->wined3d_texture);
167 hr = wined3d_resource_free_private_data(resource, guid);
168 wined3d_mutex_unlock();
169
170 return hr;
171}
172
173static DWORD WINAPI d3d8_texture_2d_SetPriority(IDirect3DTexture8 *iface, DWORD priority)
174{
175 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
176 DWORD ret;
177
178 TRACE("iface %p, priority %u.\n", iface, priority);
179
180 wined3d_mutex_lock();
181 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
182 wined3d_mutex_unlock();
183
184 return ret;
185}
186
187static DWORD WINAPI d3d8_texture_2d_GetPriority(IDirect3DTexture8 *iface)
188{
189 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
190 DWORD ret;
191
192 TRACE("iface %p.\n", iface);
193
194 wined3d_mutex_lock();
195 ret = wined3d_texture_get_priority(texture->wined3d_texture);
196 wined3d_mutex_unlock();
197
198 return ret;
199}
200
201static void WINAPI d3d8_texture_2d_PreLoad(IDirect3DTexture8 *iface)
202{
203 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
204
205 TRACE("iface %p.\n", iface);
206
207 wined3d_mutex_lock();
208 wined3d_texture_preload(texture->wined3d_texture);
209 wined3d_mutex_unlock();
210}
211
212static D3DRESOURCETYPE WINAPI d3d8_texture_2d_GetType(IDirect3DTexture8 *iface)
213{
214 TRACE("iface %p.\n", iface);
215
216 return D3DRTYPE_TEXTURE;
217}
218
219static DWORD WINAPI d3d8_texture_2d_SetLOD(IDirect3DTexture8 *iface, DWORD lod)
220{
221 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
222 DWORD ret;
223
224 TRACE("iface %p, lod %u.\n", iface, lod);
225
226 wined3d_mutex_lock();
227 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
228 wined3d_mutex_unlock();
229
230 return ret;
231}
232
233static DWORD WINAPI d3d8_texture_2d_GetLOD(IDirect3DTexture8 *iface)
234{
235 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
236 DWORD ret;
237
238 TRACE("iface %p.\n", iface);
239
240 wined3d_mutex_lock();
241 ret = wined3d_texture_get_lod(texture->wined3d_texture);
242 wined3d_mutex_unlock();
243
244 return ret;
245}
246
247static DWORD WINAPI d3d8_texture_2d_GetLevelCount(IDirect3DTexture8 *iface)
248{
249 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
250 DWORD ret;
251
252 TRACE("iface %p.\n", iface);
253
254 wined3d_mutex_lock();
255 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
256 wined3d_mutex_unlock();
257
258 return ret;
259}
260
261static HRESULT WINAPI d3d8_texture_2d_GetLevelDesc(IDirect3DTexture8 *iface, UINT level, D3DSURFACE_DESC *desc)
262{
263 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
264 struct wined3d_resource *sub_resource;
265 HRESULT hr = D3D_OK;
266
267 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
268
269 wined3d_mutex_lock();
270 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
271 hr = D3DERR_INVALIDCALL;
272 else
273 {
274 struct wined3d_resource_desc wined3d_desc;
275
276 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
277 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
278 desc->Type = wined3d_desc.resource_type;
279 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
280 desc->Pool = wined3d_desc.pool;
281 desc->Size = wined3d_desc.size;
282 desc->MultiSampleType = wined3d_desc.multisample_type;
283 desc->Width = wined3d_desc.width;
284 desc->Height = wined3d_desc.height;
285 }
286 wined3d_mutex_unlock();
287
288 return hr;
289}
290
291static HRESULT WINAPI d3d8_texture_2d_GetSurfaceLevel(IDirect3DTexture8 *iface,
292 UINT level, IDirect3DSurface8 **surface)
293{
294 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
295 struct wined3d_resource *sub_resource;
296 struct d3d8_surface *surface_impl;
297
298 TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
299
300 wined3d_mutex_lock();
301 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
302 {
303 wined3d_mutex_unlock();
304 return D3DERR_INVALIDCALL;
305 }
306
307 surface_impl = wined3d_resource_get_parent(sub_resource);
308 *surface = &surface_impl->IDirect3DSurface8_iface;
309 IDirect3DSurface8_AddRef(*surface);
310 wined3d_mutex_unlock();
311
312 return D3D_OK;
313}
314
315static HRESULT WINAPI d3d8_texture_2d_LockRect(IDirect3DTexture8 *iface, UINT level,
316 D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
317{
318 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
319 struct wined3d_resource *sub_resource;
320 struct d3d8_surface *surface_impl;
321 HRESULT hr;
322
323 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
324 iface, level, locked_rect, rect, flags);
325
326 wined3d_mutex_lock();
327 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
328 hr = D3DERR_INVALIDCALL;
329 else
330 {
331 surface_impl = wined3d_resource_get_parent(sub_resource);
332 hr = IDirect3DSurface8_LockRect(&surface_impl->IDirect3DSurface8_iface, locked_rect, rect, flags);
333 }
334 wined3d_mutex_unlock();
335
336 return hr;
337}
338
339static HRESULT WINAPI d3d8_texture_2d_UnlockRect(IDirect3DTexture8 *iface, UINT level)
340{
341 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
342 struct wined3d_resource *sub_resource;
343 struct d3d8_surface *surface_impl;
344 HRESULT hr;
345
346 TRACE("iface %p, level %u.\n", iface, level);
347
348 wined3d_mutex_lock();
349 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
350 hr = D3DERR_INVALIDCALL;
351 else
352 {
353 surface_impl = wined3d_resource_get_parent(sub_resource);
354 hr = IDirect3DSurface8_UnlockRect(&surface_impl->IDirect3DSurface8_iface);
355 }
356 wined3d_mutex_unlock();
357
358 return hr;
359}
360
361static HRESULT WINAPI d3d8_texture_2d_AddDirtyRect(IDirect3DTexture8 *iface, const RECT *dirty_rect)
362{
363 struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
364 HRESULT hr;
365
366 TRACE("iface %p, dirty_rect %s.\n",
367 iface, wine_dbgstr_rect(dirty_rect));
368
369 wined3d_mutex_lock();
370 if (!dirty_rect)
371 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
372 else
373 {
374 struct wined3d_box dirty_region;
375
376 dirty_region.left = dirty_rect->left;
377 dirty_region.top = dirty_rect->top;
378 dirty_region.right = dirty_rect->right;
379 dirty_region.bottom = dirty_rect->bottom;
380 dirty_region.front = 0;
381 dirty_region.back = 1;
382 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
383 }
384 wined3d_mutex_unlock();
385
386 return hr;
387}
388
389static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl =
390{
391 /* IUnknown */
392 d3d8_texture_2d_QueryInterface,
393 d3d8_texture_2d_AddRef,
394 d3d8_texture_2d_Release,
395 /* IDirect3DResource8 */
396 d3d8_texture_2d_GetDevice,
397 d3d8_texture_2d_SetPrivateData,
398 d3d8_texture_2d_GetPrivateData,
399 d3d8_texture_2d_FreePrivateData,
400 d3d8_texture_2d_SetPriority,
401 d3d8_texture_2d_GetPriority,
402 d3d8_texture_2d_PreLoad,
403 d3d8_texture_2d_GetType,
404 /* IDirect3dBaseTexture8 */
405 d3d8_texture_2d_SetLOD,
406 d3d8_texture_2d_GetLOD,
407 d3d8_texture_2d_GetLevelCount,
408 /* IDirect3DTexture8 */
409 d3d8_texture_2d_GetLevelDesc,
410 d3d8_texture_2d_GetSurfaceLevel,
411 d3d8_texture_2d_LockRect,
412 d3d8_texture_2d_UnlockRect,
413 d3d8_texture_2d_AddDirtyRect,
414};
415
416static HRESULT WINAPI d3d8_texture_cube_QueryInterface(IDirect3DCubeTexture8 *iface, REFIID riid, void **out)
417{
418 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
419
420 if (IsEqualGUID(riid, &IID_IDirect3DCubeTexture8)
421 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
422 || IsEqualGUID(riid, &IID_IDirect3DResource8)
423 || IsEqualGUID(riid, &IID_IUnknown))
424 {
425 IDirect3DCubeTexture8_AddRef(iface);
426 *out = iface;
427 return S_OK;
428 }
429
430 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
431
432 *out = NULL;
433 return E_NOINTERFACE;
434}
435
436static ULONG WINAPI d3d8_texture_cube_AddRef(IDirect3DCubeTexture8 *iface)
437{
438 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
439 ULONG ref = InterlockedIncrement(&texture->refcount);
440
441 TRACE("%p increasing refcount to %u.\n", iface, ref);
442
443 if (ref == 1)
444 {
445 IDirect3DDevice8_AddRef(texture->parent_device);
446 wined3d_mutex_lock();
447 wined3d_texture_incref(texture->wined3d_texture);
448 wined3d_mutex_unlock();
449 }
450
451 return ref;
452}
453
454static ULONG WINAPI d3d8_texture_cube_Release(IDirect3DCubeTexture8 *iface)
455{
456 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
457 ULONG ref = InterlockedDecrement(&texture->refcount);
458
459 TRACE("%p decreasing refcount to %u.\n", iface, ref);
460
461 if (!ref)
462 {
463 IDirect3DDevice8 *parent_device = texture->parent_device;
464
465 TRACE("Releasing child %p.\n", texture->wined3d_texture);
466
467 wined3d_mutex_lock();
468 wined3d_texture_decref(texture->wined3d_texture);
469 wined3d_mutex_unlock();
470
471 /* Release the device last, as it may cause the device to be destroyed. */
472 IDirect3DDevice8_Release(parent_device);
473 }
474 return ref;
475}
476
477static HRESULT WINAPI d3d8_texture_cube_GetDevice(IDirect3DCubeTexture8 *iface, IDirect3DDevice8 **device)
478{
479 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
480
481 TRACE("iface %p, device %p.\n", iface, device);
482
483 *device = texture->parent_device;
484 IDirect3DDevice8_AddRef(*device);
485
486 TRACE("Returning device %p.\n", *device);
487
488 return D3D_OK;
489}
490
491static HRESULT WINAPI d3d8_texture_cube_SetPrivateData(IDirect3DCubeTexture8 *iface,
492 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
493{
494 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
495 struct wined3d_resource *resource;
496 HRESULT hr;
497
498 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
499 iface, debugstr_guid(guid), data, data_size, flags);
500
501 wined3d_mutex_lock();
502 resource = wined3d_texture_get_resource(texture->wined3d_texture);
503 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
504 wined3d_mutex_unlock();
505
506 return hr;
507}
508
509static HRESULT WINAPI d3d8_texture_cube_GetPrivateData(IDirect3DCubeTexture8 *iface,
510 REFGUID guid, void *data, DWORD *data_size)
511{
512 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
513 struct wined3d_resource *resource;
514 HRESULT hr;
515
516 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
517 iface, debugstr_guid(guid), data, data_size);
518
519 wined3d_mutex_lock();
520 resource = wined3d_texture_get_resource(texture->wined3d_texture);
521 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
522 wined3d_mutex_unlock();
523
524 return hr;
525}
526
527static HRESULT WINAPI d3d8_texture_cube_FreePrivateData(IDirect3DCubeTexture8 *iface, REFGUID guid)
528{
529 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
530 struct wined3d_resource *resource;
531 HRESULT hr;
532
533 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
534
535 wined3d_mutex_lock();
536 resource = wined3d_texture_get_resource(texture->wined3d_texture);
537 hr = wined3d_resource_free_private_data(resource, guid);
538 wined3d_mutex_unlock();
539
540 return hr;
541}
542
543static DWORD WINAPI d3d8_texture_cube_SetPriority(IDirect3DCubeTexture8 *iface, DWORD priority)
544{
545 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
546 DWORD ret;
547
548 TRACE("iface %p, priority %u.\n", iface, priority);
549
550 wined3d_mutex_lock();
551 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
552 wined3d_mutex_unlock();
553
554 return ret;
555}
556
557static DWORD WINAPI d3d8_texture_cube_GetPriority(IDirect3DCubeTexture8 *iface)
558{
559 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
560 DWORD ret;
561
562 TRACE("iface %p.\n", iface);
563
564 wined3d_mutex_lock();
565 ret = wined3d_texture_get_priority(texture->wined3d_texture);
566 wined3d_mutex_unlock();
567
568 return ret;
569}
570
571static void WINAPI d3d8_texture_cube_PreLoad(IDirect3DCubeTexture8 *iface)
572{
573 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
574
575 TRACE("iface %p.\n", iface);
576
577 wined3d_mutex_lock();
578 wined3d_texture_preload(texture->wined3d_texture);
579 wined3d_mutex_unlock();
580}
581
582static D3DRESOURCETYPE WINAPI d3d8_texture_cube_GetType(IDirect3DCubeTexture8 *iface)
583{
584 TRACE("iface %p.\n", iface);
585
586 return D3DRTYPE_CUBETEXTURE;
587}
588
589static DWORD WINAPI d3d8_texture_cube_SetLOD(IDirect3DCubeTexture8 *iface, DWORD lod)
590{
591 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
592 DWORD ret;
593
594 TRACE("iface %p, lod %u.\n", iface, lod);
595
596 wined3d_mutex_lock();
597 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
598 wined3d_mutex_unlock();
599
600 return ret;
601}
602
603static DWORD WINAPI d3d8_texture_cube_GetLOD(IDirect3DCubeTexture8 *iface)
604{
605 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
606 DWORD ret;
607
608 TRACE("iface %p.\n", iface);
609
610 wined3d_mutex_lock();
611 ret = wined3d_texture_get_lod(texture->wined3d_texture);
612 wined3d_mutex_unlock();
613
614 return ret;
615}
616
617static DWORD WINAPI d3d8_texture_cube_GetLevelCount(IDirect3DCubeTexture8 *iface)
618{
619 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
620 DWORD ret;
621
622 TRACE("iface %p.\n", iface);
623
624 wined3d_mutex_lock();
625 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
626 wined3d_mutex_unlock();
627
628 return ret;
629}
630
631static HRESULT WINAPI d3d8_texture_cube_GetLevelDesc(IDirect3DCubeTexture8 *iface, UINT level, D3DSURFACE_DESC *desc)
632{
633 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
634 struct wined3d_resource *sub_resource;
635 HRESULT hr = D3D_OK;
636
637 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
638
639 wined3d_mutex_lock();
640 if (level >= wined3d_texture_get_level_count(texture->wined3d_texture))
641 {
642 wined3d_mutex_unlock();
643 return D3DERR_INVALIDCALL;
644 }
645
646 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
647 hr = D3DERR_INVALIDCALL;
648 else
649 {
650 struct wined3d_resource_desc wined3d_desc;
651
652 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
653 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
654 desc->Type = wined3d_desc.resource_type;
655 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
656 desc->Pool = wined3d_desc.pool;
657 desc->Size = wined3d_desc.size;
658 desc->MultiSampleType = wined3d_desc.multisample_type;
659 desc->Width = wined3d_desc.width;
660 desc->Height = wined3d_desc.height;
661 }
662 wined3d_mutex_unlock();
663
664 return hr;
665}
666
667static HRESULT WINAPI d3d8_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture8 *iface,
668 D3DCUBEMAP_FACES face, UINT level, IDirect3DSurface8 **surface)
669{
670 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
671 struct wined3d_resource *sub_resource;
672 struct d3d8_surface *surface_impl;
673 UINT sub_resource_idx;
674 DWORD level_count;
675
676 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, face, level, surface);
677
678 wined3d_mutex_lock();
679 level_count = wined3d_texture_get_level_count(texture->wined3d_texture);
680 if (level >= level_count)
681 {
682 wined3d_mutex_unlock();
683 return D3DERR_INVALIDCALL;
684 }
685
686 sub_resource_idx = level_count * face + level;
687 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
688 {
689 wined3d_mutex_unlock();
690 return D3DERR_INVALIDCALL;
691 }
692
693 surface_impl = wined3d_resource_get_parent(sub_resource);
694 *surface = &surface_impl->IDirect3DSurface8_iface;
695 IDirect3DSurface8_AddRef(*surface);
696 wined3d_mutex_unlock();
697
698 return D3D_OK;
699}
700
701static HRESULT WINAPI d3d8_texture_cube_LockRect(IDirect3DCubeTexture8 *iface,
702 D3DCUBEMAP_FACES face, UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect,
703 DWORD flags)
704{
705 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
706 struct wined3d_resource *sub_resource;
707 struct d3d8_surface *surface_impl;
708 UINT sub_resource_idx;
709 HRESULT hr;
710
711 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
712 iface, face, level, locked_rect, rect, flags);
713
714 wined3d_mutex_lock();
715 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
716 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
717 hr = D3DERR_INVALIDCALL;
718 else
719 {
720 surface_impl = wined3d_resource_get_parent(sub_resource);
721 hr = IDirect3DSurface8_LockRect(&surface_impl->IDirect3DSurface8_iface, locked_rect, rect, flags);
722 }
723 wined3d_mutex_unlock();
724
725 return hr;
726}
727
728static HRESULT WINAPI d3d8_texture_cube_UnlockRect(IDirect3DCubeTexture8 *iface,
729 D3DCUBEMAP_FACES face, UINT level)
730{
731 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
732 struct wined3d_resource *sub_resource;
733 struct d3d8_surface *surface_impl;
734 UINT sub_resource_idx;
735 HRESULT hr;
736
737 TRACE("iface %p, face %#x, level %u.\n", iface, face, level);
738
739 wined3d_mutex_lock();
740 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
741 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
742 hr = D3DERR_INVALIDCALL;
743 else
744 {
745 surface_impl = wined3d_resource_get_parent(sub_resource);
746 hr = IDirect3DSurface8_UnlockRect(&surface_impl->IDirect3DSurface8_iface);
747 }
748 wined3d_mutex_unlock();
749
750 return hr;
751}
752
753static HRESULT WINAPI d3d8_texture_cube_AddDirtyRect(IDirect3DCubeTexture8 *iface,
754 D3DCUBEMAP_FACES face, const RECT *dirty_rect)
755{
756 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
757 HRESULT hr;
758
759 TRACE("iface %p, face %#x, dirty_rect %s.\n",
760 iface, face, wine_dbgstr_rect(dirty_rect));
761
762 wined3d_mutex_lock();
763 if (!dirty_rect)
764 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
765 else
766 {
767 struct wined3d_box dirty_region;
768
769 dirty_region.left = dirty_rect->left;
770 dirty_region.top = dirty_rect->top;
771 dirty_region.right = dirty_rect->right;
772 dirty_region.bottom = dirty_rect->bottom;
773 dirty_region.front = 0;
774 dirty_region.back = 1;
775 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
776 }
777 wined3d_mutex_unlock();
778
779 return hr;
780}
781
782static const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl =
783{
784 /* IUnknown */
785 d3d8_texture_cube_QueryInterface,
786 d3d8_texture_cube_AddRef,
787 d3d8_texture_cube_Release,
788 /* IDirect3DResource8 */
789 d3d8_texture_cube_GetDevice,
790 d3d8_texture_cube_SetPrivateData,
791 d3d8_texture_cube_GetPrivateData,
792 d3d8_texture_cube_FreePrivateData,
793 d3d8_texture_cube_SetPriority,
794 d3d8_texture_cube_GetPriority,
795 d3d8_texture_cube_PreLoad,
796 d3d8_texture_cube_GetType,
797 /* IDirect3DBaseTexture8 */
798 d3d8_texture_cube_SetLOD,
799 d3d8_texture_cube_GetLOD,
800 d3d8_texture_cube_GetLevelCount,
801 /* IDirect3DCubeTexture8 */
802 d3d8_texture_cube_GetLevelDesc,
803 d3d8_texture_cube_GetCubeMapSurface,
804 d3d8_texture_cube_LockRect,
805 d3d8_texture_cube_UnlockRect,
806 d3d8_texture_cube_AddDirtyRect,
807};
808
809static HRESULT WINAPI d3d8_texture_3d_QueryInterface(IDirect3DVolumeTexture8 *iface, REFIID riid, void **out)
810{
811 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
812
813 if (IsEqualGUID(riid, &IID_IDirect3DVolumeTexture8)
814 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
815 || IsEqualGUID(riid, &IID_IDirect3DResource8)
816 || IsEqualGUID(riid, &IID_IUnknown))
817 {
818 IDirect3DVolumeTexture8_AddRef(iface);
819 *out = iface;
820 return S_OK;
821 }
822
823 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
824
825 *out = NULL;
826 return E_NOINTERFACE;
827}
828
829static ULONG WINAPI d3d8_texture_3d_AddRef(IDirect3DVolumeTexture8 *iface)
830{
831 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
832 ULONG ref = InterlockedIncrement(&texture->refcount);
833
834 TRACE("%p increasing refcount to %u.\n", iface, ref);
835
836 if (ref == 1)
837 {
838 IDirect3DDevice8_AddRef(texture->parent_device);
839 wined3d_mutex_lock();
840 wined3d_texture_incref(texture->wined3d_texture);
841 wined3d_mutex_unlock();
842 }
843
844 return ref;
845}
846
847static ULONG WINAPI d3d8_texture_3d_Release(IDirect3DVolumeTexture8 *iface)
848{
849 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
850 ULONG ref = InterlockedDecrement(&texture->refcount);
851
852 TRACE("%p decreasing refcount to %u.\n", iface, ref);
853
854 if (!ref)
855 {
856 IDirect3DDevice8 *parent_device = texture->parent_device;
857
858 wined3d_mutex_lock();
859 wined3d_texture_decref(texture->wined3d_texture);
860 wined3d_mutex_unlock();
861
862 /* Release the device last, as it may cause the device to be destroyed. */
863 IDirect3DDevice8_Release(parent_device);
864 }
865 return ref;
866}
867
868static HRESULT WINAPI d3d8_texture_3d_GetDevice(IDirect3DVolumeTexture8 *iface, IDirect3DDevice8 **device)
869{
870 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
871
872 TRACE("iface %p, device %p.\n", iface, device);
873
874 *device = texture->parent_device;
875 IDirect3DDevice8_AddRef(*device);
876
877 TRACE("Returning device %p.\n", *device);
878
879 return D3D_OK;
880}
881
882static HRESULT WINAPI d3d8_texture_3d_SetPrivateData(IDirect3DVolumeTexture8 *iface,
883 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
884{
885 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
886 struct wined3d_resource *resource;
887 HRESULT hr;
888
889 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
890 iface, debugstr_guid(guid), data, data_size, flags);
891
892 wined3d_mutex_lock();
893 resource = wined3d_texture_get_resource(texture->wined3d_texture);
894 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
895 wined3d_mutex_unlock();
896
897 return hr;
898}
899
900static HRESULT WINAPI d3d8_texture_3d_GetPrivateData(IDirect3DVolumeTexture8 *iface,
901 REFGUID guid, void *data, DWORD *data_size)
902{
903 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
904 struct wined3d_resource *resource;
905 HRESULT hr;
906
907 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
908 iface, debugstr_guid(guid), data, data_size);
909
910 wined3d_mutex_lock();
911 resource = wined3d_texture_get_resource(texture->wined3d_texture);
912 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
913 wined3d_mutex_unlock();
914
915 return hr;
916}
917
918static HRESULT WINAPI d3d8_texture_3d_FreePrivateData(IDirect3DVolumeTexture8 *iface, REFGUID guid)
919{
920 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
921 struct wined3d_resource *resource;
922 HRESULT hr;
923
924 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
925
926 wined3d_mutex_lock();
927 resource = wined3d_texture_get_resource(texture->wined3d_texture);
928 hr = wined3d_resource_free_private_data(resource, guid);
929 wined3d_mutex_unlock();
930
931 return hr;
932}
933
934static DWORD WINAPI d3d8_texture_3d_SetPriority(IDirect3DVolumeTexture8 *iface, DWORD priority)
935{
936 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
937 DWORD ret;
938
939 TRACE("iface %p, priority %u.\n", iface, priority);
940
941 wined3d_mutex_lock();
942 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
943 wined3d_mutex_unlock();
944
945 return ret;
946}
947
948static DWORD WINAPI d3d8_texture_3d_GetPriority(IDirect3DVolumeTexture8 *iface)
949{
950 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
951 DWORD ret;
952
953 TRACE("iface %p.\n", iface);
954
955 wined3d_mutex_lock();
956 ret = wined3d_texture_get_priority(texture->wined3d_texture);
957 wined3d_mutex_unlock();
958
959 return ret;
960}
961
962static void WINAPI d3d8_texture_3d_PreLoad(IDirect3DVolumeTexture8 *iface)
963{
964 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
965
966 TRACE("iface %p.\n", iface);
967
968 wined3d_mutex_lock();
969 wined3d_texture_preload(texture->wined3d_texture);
970 wined3d_mutex_unlock();
971}
972
973static D3DRESOURCETYPE WINAPI d3d8_texture_3d_GetType(IDirect3DVolumeTexture8 *iface)
974{
975 TRACE("iface %p.\n", iface);
976
977 return D3DRTYPE_VOLUMETEXTURE;
978}
979
980static DWORD WINAPI d3d8_texture_3d_SetLOD(IDirect3DVolumeTexture8 *iface, DWORD lod)
981{
982 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
983 DWORD ret;
984
985 TRACE("iface %p, lod %u.\n", iface, lod);
986
987 wined3d_mutex_lock();
988 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
989 wined3d_mutex_unlock();
990
991 return ret;
992}
993
994static DWORD WINAPI d3d8_texture_3d_GetLOD(IDirect3DVolumeTexture8 *iface)
995{
996 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
997 DWORD ret;
998
999 TRACE("iface %p.\n", iface);
1000
1001 wined3d_mutex_lock();
1002 ret = wined3d_texture_get_lod(texture->wined3d_texture);
1003 wined3d_mutex_unlock();
1004
1005 return ret;
1006}
1007
1008static DWORD WINAPI d3d8_texture_3d_GetLevelCount(IDirect3DVolumeTexture8 *iface)
1009{
1010 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1011 DWORD ret;
1012
1013 TRACE("iface %p.\n", iface);
1014
1015 wined3d_mutex_lock();
1016 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
1017 wined3d_mutex_unlock();
1018
1019 return ret;
1020}
1021
1022static HRESULT WINAPI d3d8_texture_3d_GetLevelDesc(IDirect3DVolumeTexture8 *iface, UINT level, D3DVOLUME_DESC *desc)
1023{
1024 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1025 struct wined3d_resource *sub_resource;
1026 HRESULT hr = D3D_OK;
1027
1028 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
1029
1030 wined3d_mutex_lock();
1031 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
1032 hr = D3DERR_INVALIDCALL;
1033 else
1034 {
1035 struct wined3d_resource_desc wined3d_desc;
1036
1037 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
1038 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
1039 desc->Type = wined3d_desc.resource_type;
1040 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
1041 desc->Pool = wined3d_desc.pool;
1042 desc->Size = wined3d_desc.size;
1043 desc->Width = wined3d_desc.width;
1044 desc->Height = wined3d_desc.height;
1045 desc->Depth = wined3d_desc.depth;
1046 }
1047 wined3d_mutex_unlock();
1048
1049 return hr;
1050}
1051
1052static HRESULT WINAPI d3d8_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture8 *iface,
1053 UINT level, IDirect3DVolume8 **volume)
1054{
1055 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1056 struct wined3d_resource *sub_resource;
1057 struct d3d8_volume *volume_impl;
1058
1059 TRACE("iface %p, level %u, volume %p.\n", iface, level, volume);
1060
1061 wined3d_mutex_lock();
1062 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
1063 {
1064 wined3d_mutex_unlock();
1065 return D3DERR_INVALIDCALL;
1066 }
1067
1068 volume_impl = wined3d_resource_get_parent(sub_resource);
1069 *volume = &volume_impl->IDirect3DVolume8_iface;
1070 IDirect3DVolume8_AddRef(*volume);
1071 wined3d_mutex_unlock();
1072
1073 return D3D_OK;
1074}
1075
1076static HRESULT WINAPI d3d8_texture_3d_LockBox(IDirect3DVolumeTexture8 *iface,
1077 UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags)
1078{
1079 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1080 struct wined3d_resource *sub_resource;
1081 struct d3d8_volume *volume_impl;
1082 HRESULT hr;
1083
1084 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
1085 iface, level, locked_box, box, flags);
1086
1087 wined3d_mutex_lock();
1088 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
1089 hr = D3DERR_INVALIDCALL;
1090 else
1091 {
1092 volume_impl = wined3d_resource_get_parent(sub_resource);
1093 hr = IDirect3DVolume8_LockBox(&volume_impl->IDirect3DVolume8_iface, locked_box, box, flags);
1094 }
1095 wined3d_mutex_unlock();
1096
1097 return hr;
1098}
1099
1100static HRESULT WINAPI d3d8_texture_3d_UnlockBox(IDirect3DVolumeTexture8 *iface, UINT level)
1101{
1102 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1103 struct wined3d_resource *sub_resource;
1104 struct d3d8_volume *volume_impl;
1105 HRESULT hr;
1106
1107 TRACE("iface %p, level %u.\n", iface, level);
1108
1109 wined3d_mutex_lock();
1110 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
1111 hr = D3DERR_INVALIDCALL;
1112 else
1113 {
1114 volume_impl = wined3d_resource_get_parent(sub_resource);
1115 hr = IDirect3DVolume8_UnlockBox(&volume_impl->IDirect3DVolume8_iface);
1116 }
1117 wined3d_mutex_unlock();
1118
1119 return hr;
1120}
1121
1122static HRESULT WINAPI d3d8_texture_3d_AddDirtyBox(IDirect3DVolumeTexture8 *iface, const D3DBOX *dirty_box)
1123{
1124 struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
1125 HRESULT hr;
1126
1127 TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
1128
1129 wined3d_mutex_lock();
1130 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box);
1131 wined3d_mutex_unlock();
1132
1133 return hr;
1134}
1135
1136static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl =
1137{
1138 /* IUnknown */
1139 d3d8_texture_3d_QueryInterface,
1140 d3d8_texture_3d_AddRef,
1141 d3d8_texture_3d_Release,
1142 /* IDirect3DResource8 */
1143 d3d8_texture_3d_GetDevice,
1144 d3d8_texture_3d_SetPrivateData,
1145 d3d8_texture_3d_GetPrivateData,
1146 d3d8_texture_3d_FreePrivateData,
1147 d3d8_texture_3d_SetPriority,
1148 d3d8_texture_3d_GetPriority,
1149 d3d8_texture_3d_PreLoad,
1150 d3d8_texture_3d_GetType,
1151 /* IDirect3DBaseTexture8 */
1152 d3d8_texture_3d_SetLOD,
1153 d3d8_texture_3d_GetLOD,
1154 d3d8_texture_3d_GetLevelCount,
1155 /* IDirect3DVolumeTexture8 */
1156 d3d8_texture_3d_GetLevelDesc,
1157 d3d8_texture_3d_GetVolumeLevel,
1158 d3d8_texture_3d_LockBox,
1159 d3d8_texture_3d_UnlockBox,
1160 d3d8_texture_3d_AddDirtyBox
1161};
1162
1163struct d3d8_texture *unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture8 *iface)
1164{
1165 if (!iface)
1166 return NULL;
1167
1168 /* SetTexture() in particular doesn't do a lot of validation on the pointer
1169 * that gets passed in, and passing an invalid pointer works as long as the
1170 * application doesn't try to actually render anything with it, so we print
1171 * a WARN and return NULL instead of having the usual assert() here.
1172 * One application affected by this is Fishdom 2. */
1173 if (iface->lpVtbl != (const IDirect3DBaseTexture8Vtbl *)&Direct3DTexture8_Vtbl
1174 && iface->lpVtbl != (const IDirect3DBaseTexture8Vtbl *)&Direct3DCubeTexture8_Vtbl
1175 && iface->lpVtbl != (const IDirect3DBaseTexture8Vtbl *)&Direct3DVolumeTexture8_Vtbl)
1176 {
1177 WARN("%p is not a valid IDirect3DBaseTexture8 interface.\n", iface);
1178 return NULL;
1179 }
1180
1181 return CONTAINING_RECORD(iface, struct d3d8_texture, IDirect3DBaseTexture8_iface);
1182}
1183
1184static void STDMETHODCALLTYPE d3d8_texture_wined3d_object_destroyed(void *parent)
1185{
1186 HeapFree(GetProcessHeap(), 0, parent);
1187}
1188
1189static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops =
1190{
1191 d3d8_texture_wined3d_object_destroyed,
1192};
1193
1194HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
1195 UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
1196{
1197 struct wined3d_resource_desc desc;
1198 DWORD surface_flags = 0;
1199 HRESULT hr;
1200
1201 texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DTexture8_Vtbl;
1202 texture->refcount = 1;
1203
1204 desc.resource_type = WINED3D_RTYPE_TEXTURE;
1205 desc.format = wined3dformat_from_d3dformat(format);
1206 desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
1207 desc.multisample_quality = 0;
1208 desc.usage = usage & WINED3DUSAGE_MASK;
1209 desc.pool = pool;
1210 desc.width = width;
1211 desc.height = height;
1212 desc.depth = 1;
1213 desc.size = 0;
1214
1215 if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC))
1216 surface_flags |= WINED3D_SURFACE_MAPPABLE;
1217
1218 wined3d_mutex_lock();
1219 hr = wined3d_texture_create_2d(device->wined3d_device, &desc, levels, surface_flags,
1220 texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
1221 wined3d_mutex_unlock();
1222 if (FAILED(hr))
1223 {
1224 WARN("Failed to create wined3d texture, hr %#x.\n", hr);
1225 return hr;
1226 }
1227
1228 texture->parent_device = &device->IDirect3DDevice8_iface;
1229 IDirect3DDevice8_AddRef(texture->parent_device);
1230
1231 return D3D_OK;
1232}
1233
1234HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *device,
1235 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
1236{
1237 struct wined3d_resource_desc desc;
1238 DWORD surface_flags = 0;
1239 HRESULT hr;
1240
1241 texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DCubeTexture8_Vtbl;
1242 texture->refcount = 1;
1243
1244 desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE;
1245 desc.format = wined3dformat_from_d3dformat(format);
1246 desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
1247 desc.multisample_quality = 0;
1248 desc.usage = usage & WINED3DUSAGE_MASK;
1249 desc.pool = pool;
1250 desc.width = edge_length;
1251 desc.height = edge_length;
1252 desc.depth = 1;
1253 desc.size = 0;
1254
1255 if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC))
1256 surface_flags |= WINED3D_SURFACE_MAPPABLE;
1257
1258 wined3d_mutex_lock();
1259 hr = wined3d_texture_create_cube(device->wined3d_device, &desc, levels, surface_flags,
1260 texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
1261 wined3d_mutex_unlock();
1262 if (FAILED(hr))
1263 {
1264 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr);
1265 return hr;
1266 }
1267
1268 texture->parent_device = &device->IDirect3DDevice8_iface;
1269 IDirect3DDevice8_AddRef(texture->parent_device);
1270
1271 return D3D_OK;
1272}
1273
1274HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *device,
1275 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
1276{
1277 struct wined3d_resource_desc desc;
1278 HRESULT hr;
1279
1280 texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DVolumeTexture8_Vtbl;
1281 texture->refcount = 1;
1282
1283 desc.resource_type = WINED3D_RTYPE_VOLUME_TEXTURE;
1284 desc.format = wined3dformat_from_d3dformat(format);
1285 desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
1286 desc.multisample_quality = 0;
1287 desc.usage = usage & WINED3DUSAGE_MASK;
1288 desc.pool = pool;
1289 desc.width = width;
1290 desc.height = height;
1291 desc.depth = depth;
1292 desc.size = 0;
1293
1294 wined3d_mutex_lock();
1295 hr = wined3d_texture_create_3d(device->wined3d_device, &desc, levels,
1296 texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
1297 wined3d_mutex_unlock();
1298 if (FAILED(hr))
1299 {
1300 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr);
1301 return hr;
1302 }
1303
1304 texture->parent_device = &device->IDirect3DDevice8_iface;
1305 IDirect3DDevice8_AddRef(texture->parent_device);
1306
1307 return D3D_OK;
1308}
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette