d3d8: Get rid of IDirect3DCubeTexture8Impl.
[wine/multimedia.git] / dlls / d3d8 / cubetexture.c
blob56dc21d08acbbf991a356032c640c82249d277d9
1 /*
2 * IDirect3DCubeTexture8 implementation
4 * Copyright 2005 Oliver Stieber
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.
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.
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
21 #include "config.h"
22 #include "d3d8_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
26 static inline struct d3d8_texture *impl_from_IDirect3DCubeTexture8(IDirect3DCubeTexture8 *iface)
28 return CONTAINING_RECORD(iface, struct d3d8_texture, IDirect3DBaseTexture8_iface);
31 static HRESULT WINAPI d3d8_texture_cube_QueryInterface(IDirect3DCubeTexture8 *iface, REFIID riid, void **out)
33 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
35 if (IsEqualGUID(riid, &IID_IDirect3DCubeTexture8)
36 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
37 || IsEqualGUID(riid, &IID_IDirect3DResource8)
38 || IsEqualGUID(riid, &IID_IUnknown))
40 IUnknown_AddRef(iface);
41 *out = iface;
42 return S_OK;
45 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
47 *out = NULL;
48 return E_NOINTERFACE;
51 static ULONG WINAPI d3d8_texture_cube_AddRef(IDirect3DCubeTexture8 *iface)
53 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
54 ULONG ref = InterlockedIncrement(&texture->refcount);
56 TRACE("%p increasing refcount to %u.\n", iface, ref);
58 if (ref == 1)
60 IUnknown_AddRef(texture->parent_device);
61 wined3d_mutex_lock();
62 wined3d_texture_incref(texture->wined3d_texture);
63 wined3d_mutex_unlock();
66 return ref;
69 static ULONG WINAPI d3d8_texture_cube_Release(IDirect3DCubeTexture8 *iface)
71 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
72 ULONG ref = InterlockedDecrement(&texture->refcount);
74 TRACE("%p decreasing refcount to %u.\n", iface, ref);
76 if (!ref)
78 IDirect3DDevice8 *parent_device = texture->parent_device;
80 TRACE("Releasing child %p.\n", texture->wined3d_texture);
82 wined3d_mutex_lock();
83 wined3d_texture_decref(texture->wined3d_texture);
84 wined3d_mutex_unlock();
86 /* Release the device last, as it may cause the device to be destroyed. */
87 IDirect3DDevice8_Release(parent_device);
89 return ref;
92 static HRESULT WINAPI d3d8_texture_cube_GetDevice(IDirect3DCubeTexture8 *iface, IDirect3DDevice8 **device)
94 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
96 TRACE("iface %p, device %p.\n", iface, device);
98 *device = texture->parent_device;
99 IDirect3DDevice8_AddRef(*device);
101 TRACE("Returning device %p.\n", *device);
103 return D3D_OK;
106 static HRESULT WINAPI d3d8_texture_cube_SetPrivateData(IDirect3DCubeTexture8 *iface,
107 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
109 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
110 struct wined3d_resource *resource;
111 HRESULT hr;
113 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
114 iface, debugstr_guid(guid), data, data_size, flags);
116 wined3d_mutex_lock();
117 resource = wined3d_texture_get_resource(texture->wined3d_texture);
118 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
119 wined3d_mutex_unlock();
121 return hr;
124 static HRESULT WINAPI d3d8_texture_cube_GetPrivateData(IDirect3DCubeTexture8 *iface,
125 REFGUID guid, void *data, DWORD *data_size)
127 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
128 struct wined3d_resource *resource;
129 HRESULT hr;
131 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
132 iface, debugstr_guid(guid), data, data_size);
134 wined3d_mutex_lock();
135 resource = wined3d_texture_get_resource(texture->wined3d_texture);
136 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
137 wined3d_mutex_unlock();
139 return hr;
142 static HRESULT WINAPI d3d8_texture_cube_FreePrivateData(IDirect3DCubeTexture8 *iface, REFGUID guid)
144 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
145 struct wined3d_resource *resource;
146 HRESULT hr;
148 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
150 wined3d_mutex_lock();
151 resource = wined3d_texture_get_resource(texture->wined3d_texture);
152 hr = wined3d_resource_free_private_data(resource, guid);
153 wined3d_mutex_unlock();
155 return hr;
158 static DWORD WINAPI d3d8_texture_cube_SetPriority(IDirect3DCubeTexture8 *iface, DWORD priority)
160 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
161 DWORD ret;
163 TRACE("iface %p, priority %u.\n", iface, priority);
165 wined3d_mutex_lock();
166 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
167 wined3d_mutex_unlock();
169 return ret;
172 static DWORD WINAPI d3d8_texture_cube_GetPriority(IDirect3DCubeTexture8 *iface)
174 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
175 DWORD ret;
177 TRACE("iface %p.\n", iface);
179 wined3d_mutex_lock();
180 ret = wined3d_texture_get_priority(texture->wined3d_texture);
181 wined3d_mutex_unlock();
183 return ret;
186 static void WINAPI d3d8_texture_cube_PreLoad(IDirect3DCubeTexture8 *iface)
188 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
190 TRACE("iface %p.\n", iface);
192 wined3d_mutex_lock();
193 wined3d_texture_preload(texture->wined3d_texture);
194 wined3d_mutex_unlock();
197 static D3DRESOURCETYPE WINAPI d3d8_texture_cube_GetType(IDirect3DCubeTexture8 *iface)
199 TRACE("iface %p.\n", iface);
201 return D3DRTYPE_CUBETEXTURE;
204 static DWORD WINAPI d3d8_texture_cube_SetLOD(IDirect3DCubeTexture8 *iface, DWORD lod)
206 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
207 DWORD ret;
209 TRACE("iface %p, lod %u.\n", iface, lod);
211 wined3d_mutex_lock();
212 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
213 wined3d_mutex_unlock();
215 return ret;
218 static DWORD WINAPI d3d8_texture_cube_GetLOD(IDirect3DCubeTexture8 *iface)
220 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
221 DWORD ret;
223 TRACE("iface %p.\n", iface);
225 wined3d_mutex_lock();
226 ret = wined3d_texture_get_lod(texture->wined3d_texture);
227 wined3d_mutex_unlock();
229 return ret;
232 static DWORD WINAPI d3d8_texture_cube_GetLevelCount(IDirect3DCubeTexture8 *iface)
234 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
235 DWORD ret;
237 TRACE("iface %p.\n", iface);
239 wined3d_mutex_lock();
240 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
241 wined3d_mutex_unlock();
243 return ret;
246 static HRESULT WINAPI d3d8_texture_cube_GetLevelDesc(IDirect3DCubeTexture8 *iface, UINT level, D3DSURFACE_DESC *desc)
248 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
249 struct wined3d_resource *sub_resource;
250 HRESULT hr = D3D_OK;
252 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
254 wined3d_mutex_lock();
255 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
256 hr = D3DERR_INVALIDCALL;
257 else
259 struct wined3d_resource_desc wined3d_desc;
261 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
262 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
263 desc->Type = wined3d_desc.resource_type;
264 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
265 desc->Pool = wined3d_desc.pool;
266 desc->Size = wined3d_desc.size;
267 desc->MultiSampleType = wined3d_desc.multisample_type;
268 desc->Width = wined3d_desc.width;
269 desc->Height = wined3d_desc.height;
271 wined3d_mutex_unlock();
273 return hr;
276 static HRESULT WINAPI d3d8_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture8 *iface,
277 D3DCUBEMAP_FACES face, UINT level, IDirect3DSurface8 **surface)
279 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
280 struct wined3d_resource *sub_resource;
281 IDirect3DSurface8Impl *surface_impl;
282 UINT sub_resource_idx;
284 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, face, level, surface);
286 wined3d_mutex_lock();
287 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
288 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
290 wined3d_mutex_unlock();
291 return D3DERR_INVALIDCALL;
294 surface_impl = wined3d_resource_get_parent(sub_resource);
295 *surface = &surface_impl->IDirect3DSurface8_iface;
296 IDirect3DSurface8_AddRef(*surface);
297 wined3d_mutex_unlock();
299 return D3D_OK;
302 static HRESULT WINAPI d3d8_texture_cube_LockRect(IDirect3DCubeTexture8 *iface,
303 D3DCUBEMAP_FACES face, UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect,
304 DWORD flags)
306 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
307 struct wined3d_resource *sub_resource;
308 IDirect3DSurface8Impl *surface_impl;
309 UINT sub_resource_idx;
310 HRESULT hr;
312 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
313 iface, face, level, locked_rect, rect, flags);
315 wined3d_mutex_lock();
316 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
317 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
318 hr = D3DERR_INVALIDCALL;
319 else
321 surface_impl = wined3d_resource_get_parent(sub_resource);
322 hr = IDirect3DSurface8_LockRect(&surface_impl->IDirect3DSurface8_iface, locked_rect, rect, flags);
324 wined3d_mutex_unlock();
326 return hr;
329 static HRESULT WINAPI d3d8_texture_cube_UnlockRect(IDirect3DCubeTexture8 *iface,
330 D3DCUBEMAP_FACES face, UINT level)
332 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
333 struct wined3d_resource *sub_resource;
334 IDirect3DSurface8Impl *surface_impl;
335 UINT sub_resource_idx;
336 HRESULT hr;
338 TRACE("iface %p, face %#x, level %u.\n", iface, face, level);
340 wined3d_mutex_lock();
341 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
342 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
343 hr = D3DERR_INVALIDCALL;
344 else
346 surface_impl = wined3d_resource_get_parent(sub_resource);
347 hr = IDirect3DSurface8_UnlockRect(&surface_impl->IDirect3DSurface8_iface);
349 wined3d_mutex_unlock();
351 return hr;
354 static HRESULT WINAPI d3d8_texture_cube_AddDirtyRect(IDirect3DCubeTexture8 *iface,
355 D3DCUBEMAP_FACES face, const RECT *dirty_rect)
357 struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
358 HRESULT hr;
360 TRACE("iface %p, face %#x, dirty_rect %s.\n",
361 iface, face, wine_dbgstr_rect(dirty_rect));
363 wined3d_mutex_lock();
364 if (!dirty_rect)
365 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
366 else
368 struct wined3d_box dirty_region;
370 dirty_region.left = dirty_rect->left;
371 dirty_region.top = dirty_rect->top;
372 dirty_region.right = dirty_rect->right;
373 dirty_region.bottom = dirty_rect->bottom;
374 dirty_region.front = 0;
375 dirty_region.back = 1;
376 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
378 wined3d_mutex_unlock();
380 return hr;
383 static const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl =
385 /* IUnknown */
386 d3d8_texture_cube_QueryInterface,
387 d3d8_texture_cube_AddRef,
388 d3d8_texture_cube_Release,
389 /* IDirect3DResource8 */
390 d3d8_texture_cube_GetDevice,
391 d3d8_texture_cube_SetPrivateData,
392 d3d8_texture_cube_GetPrivateData,
393 d3d8_texture_cube_FreePrivateData,
394 d3d8_texture_cube_SetPriority,
395 d3d8_texture_cube_GetPriority,
396 d3d8_texture_cube_PreLoad,
397 d3d8_texture_cube_GetType,
398 /* IDirect3DBaseTexture8 */
399 d3d8_texture_cube_SetLOD,
400 d3d8_texture_cube_GetLOD,
401 d3d8_texture_cube_GetLevelCount,
402 /* IDirect3DCubeTexture8 */
403 d3d8_texture_cube_GetLevelDesc,
404 d3d8_texture_cube_GetCubeMapSurface,
405 d3d8_texture_cube_LockRect,
406 d3d8_texture_cube_UnlockRect,
407 d3d8_texture_cube_AddDirtyRect,
410 static void STDMETHODCALLTYPE d3d8_cubetexture_wined3d_object_destroyed(void *parent)
412 HeapFree(GetProcessHeap(), 0, parent);
415 static const struct wined3d_parent_ops d3d8_cubetexture_wined3d_parent_ops =
417 d3d8_cubetexture_wined3d_object_destroyed,
420 HRESULT cubetexture_init(struct d3d8_texture *texture, IDirect3DDevice8Impl *device,
421 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
423 HRESULT hr;
425 texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DCubeTexture8_Vtbl;
426 texture->refcount = 1;
428 wined3d_mutex_lock();
429 hr = wined3d_texture_create_cube(device->wined3d_device, edge_length, levels,
430 usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture,
431 &d3d8_cubetexture_wined3d_parent_ops, &texture->wined3d_texture);
432 wined3d_mutex_unlock();
433 if (FAILED(hr))
435 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr);
436 return hr;
439 texture->parent_device = &device->IDirect3DDevice8_iface;
440 IDirect3DDevice8_AddRef(texture->parent_device);
442 return D3D_OK;