Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencubetexture.c
Go to the documentation of this file.
00001 /* 00002 * IDirect3DCubeTexture9 implementation 00003 * 00004 * Copyright 2002-2005 Jason Edmeades 00005 * Copyright 2002-2005 Raphael Junqueira 00006 * Copyright 2005 Oliver Stieber 00007 * 00008 * This library is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * This library is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00021 */ 00022 00023 #include "config.h" 00024 #include "d3d9_private.h" 00025 00026 WINE_DEFAULT_DEBUG_CHANNEL(d3d9); 00027 00028 00029 static inline IDirect3DCubeTexture9Impl *impl_from_IDirect3DCubeTexture9(IDirect3DCubeTexture9 *iface) 00030 { 00031 return CONTAINING_RECORD(iface, IDirect3DCubeTexture9Impl, IDirect3DCubeTexture9_iface); 00032 } 00033 00034 static HRESULT WINAPI IDirect3DCubeTexture9Impl_QueryInterface(IDirect3DCubeTexture9 *iface, 00035 REFIID riid, void **ppobj) 00036 { 00037 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00038 00039 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); 00040 00041 if (IsEqualGUID(riid, &IID_IUnknown) 00042 || IsEqualGUID(riid, &IID_IDirect3DResource9) 00043 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9) 00044 || IsEqualGUID(riid, &IID_IDirect3DCubeTexture9)) { 00045 IDirect3DCubeTexture9_AddRef(iface); 00046 *ppobj = This; 00047 return S_OK; 00048 } 00049 00050 WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); 00051 *ppobj = NULL; 00052 return E_NOINTERFACE; 00053 } 00054 00055 static ULONG WINAPI IDirect3DCubeTexture9Impl_AddRef(IDirect3DCubeTexture9 *iface) 00056 { 00057 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00058 ULONG ref = InterlockedIncrement(&This->ref); 00059 00060 TRACE("%p increasing refcount to %u.\n", iface, ref); 00061 00062 if (ref == 1) 00063 { 00064 IDirect3DDevice9Ex_AddRef(This->parentDevice); 00065 wined3d_mutex_lock(); 00066 wined3d_texture_incref(This->wined3d_texture); 00067 wined3d_mutex_unlock(); 00068 } 00069 00070 return ref; 00071 } 00072 00073 static ULONG WINAPI IDirect3DCubeTexture9Impl_Release(IDirect3DCubeTexture9 *iface) 00074 { 00075 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00076 ULONG ref = InterlockedDecrement(&This->ref); 00077 00078 TRACE("%p decreasing refcount to %u.\n", iface, ref); 00079 00080 if (ref == 0) { 00081 IDirect3DDevice9Ex *parentDevice = This->parentDevice; 00082 00083 TRACE("Releasing child %p.\n", This->wined3d_texture); 00084 00085 wined3d_mutex_lock(); 00086 wined3d_texture_decref(This->wined3d_texture); 00087 wined3d_mutex_unlock(); 00088 00089 /* Release the device last, as it may cause the device to be destroyed. */ 00090 IDirect3DDevice9Ex_Release(parentDevice); 00091 } 00092 return ref; 00093 } 00094 00095 /* IDirect3DCubeTexture9 IDirect3DResource9 Interface follow: */ 00096 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetDevice(IDirect3DCubeTexture9 *iface, 00097 IDirect3DDevice9 **device) 00098 { 00099 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00100 00101 TRACE("iface %p, device %p.\n", iface, device); 00102 00103 *device = (IDirect3DDevice9 *)This->parentDevice; 00104 IDirect3DDevice9_AddRef(*device); 00105 00106 TRACE("Returning device %p.\n", *device); 00107 00108 return D3D_OK; 00109 } 00110 00111 static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetPrivateData(IDirect3DCubeTexture9 *iface, 00112 REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags) 00113 { 00114 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00115 struct wined3d_resource *resource; 00116 HRESULT hr; 00117 00118 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", 00119 iface, debugstr_guid(refguid), pData, SizeOfData, Flags); 00120 00121 wined3d_mutex_lock(); 00122 resource = wined3d_texture_get_resource(This->wined3d_texture); 00123 hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags); 00124 wined3d_mutex_unlock(); 00125 00126 return hr; 00127 } 00128 00129 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetPrivateData(IDirect3DCubeTexture9 *iface, 00130 REFGUID refguid, void *pData, DWORD *pSizeOfData) 00131 { 00132 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00133 struct wined3d_resource *resource; 00134 HRESULT hr; 00135 00136 TRACE("iface %p, guid %s, data %p, data_size %p.\n", 00137 iface, debugstr_guid(refguid), pData, pSizeOfData); 00138 00139 wined3d_mutex_lock(); 00140 resource = wined3d_texture_get_resource(This->wined3d_texture); 00141 hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData); 00142 wined3d_mutex_unlock(); 00143 00144 return hr; 00145 } 00146 00147 static HRESULT WINAPI IDirect3DCubeTexture9Impl_FreePrivateData(IDirect3DCubeTexture9 *iface, 00148 REFGUID refguid) 00149 { 00150 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00151 struct wined3d_resource *resource; 00152 HRESULT hr; 00153 00154 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); 00155 00156 wined3d_mutex_lock(); 00157 resource = wined3d_texture_get_resource(This->wined3d_texture); 00158 hr = wined3d_resource_free_private_data(resource, refguid); 00159 wined3d_mutex_unlock(); 00160 00161 return hr; 00162 } 00163 00164 static DWORD WINAPI IDirect3DCubeTexture9Impl_SetPriority(IDirect3DCubeTexture9 *iface, 00165 DWORD PriorityNew) 00166 { 00167 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00168 DWORD ret; 00169 00170 TRACE("iface %p, priority %u.\n", iface, PriorityNew); 00171 00172 wined3d_mutex_lock(); 00173 ret = wined3d_texture_set_priority(This->wined3d_texture, PriorityNew); 00174 wined3d_mutex_unlock(); 00175 00176 return ret; 00177 } 00178 00179 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetPriority(IDirect3DCubeTexture9 *iface) 00180 { 00181 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00182 DWORD ret; 00183 00184 TRACE("iface %p.\n", iface); 00185 00186 wined3d_mutex_lock(); 00187 ret = wined3d_texture_get_priority(This->wined3d_texture); 00188 wined3d_mutex_unlock(); 00189 00190 return ret; 00191 } 00192 00193 static void WINAPI IDirect3DCubeTexture9Impl_PreLoad(IDirect3DCubeTexture9 *iface) 00194 { 00195 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00196 00197 TRACE("iface %p.\n", iface); 00198 00199 wined3d_mutex_lock(); 00200 wined3d_texture_preload(This->wined3d_texture); 00201 wined3d_mutex_unlock(); 00202 } 00203 00204 static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(IDirect3DCubeTexture9 *iface) 00205 { 00206 TRACE("iface %p.\n", iface); 00207 00208 return D3DRTYPE_CUBETEXTURE; 00209 } 00210 00211 /* IDirect3DCubeTexture9 IDirect3DBaseTexture9 Interface follow: */ 00212 static DWORD WINAPI IDirect3DCubeTexture9Impl_SetLOD(IDirect3DCubeTexture9 *iface, DWORD LODNew) 00213 { 00214 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00215 DWORD ret; 00216 00217 TRACE("iface %p, lod %u.\n", iface, LODNew); 00218 00219 wined3d_mutex_lock(); 00220 ret = wined3d_texture_set_lod(This->wined3d_texture, LODNew); 00221 wined3d_mutex_unlock(); 00222 00223 return ret; 00224 } 00225 00226 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLOD(IDirect3DCubeTexture9 *iface) 00227 { 00228 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00229 DWORD ret; 00230 00231 TRACE("iface %p.\n", iface); 00232 00233 wined3d_mutex_lock(); 00234 ret = wined3d_texture_get_lod(This->wined3d_texture); 00235 wined3d_mutex_unlock(); 00236 00237 return ret; 00238 } 00239 00240 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLevelCount(IDirect3DCubeTexture9 *iface) 00241 { 00242 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00243 DWORD ret; 00244 00245 TRACE("iface %p.\n", iface); 00246 00247 wined3d_mutex_lock(); 00248 ret = wined3d_texture_get_level_count(This->wined3d_texture); 00249 wined3d_mutex_unlock(); 00250 00251 return ret; 00252 } 00253 00254 static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetAutoGenFilterType(IDirect3DCubeTexture9 *iface, 00255 D3DTEXTUREFILTERTYPE FilterType) 00256 { 00257 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00258 HRESULT hr; 00259 00260 TRACE("iface %p, filter_type %#x.\n", iface, FilterType); 00261 00262 wined3d_mutex_lock(); 00263 hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType); 00264 wined3d_mutex_unlock(); 00265 00266 return hr; 00267 } 00268 00269 static D3DTEXTUREFILTERTYPE WINAPI IDirect3DCubeTexture9Impl_GetAutoGenFilterType(IDirect3DCubeTexture9 *iface) 00270 { 00271 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00272 D3DTEXTUREFILTERTYPE ret; 00273 00274 TRACE("iface %p.\n", iface); 00275 00276 wined3d_mutex_lock(); 00277 ret = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(This->wined3d_texture); 00278 wined3d_mutex_unlock(); 00279 00280 return ret; 00281 } 00282 00283 static void WINAPI IDirect3DCubeTexture9Impl_GenerateMipSubLevels(IDirect3DCubeTexture9 *iface) 00284 { 00285 IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface); 00286 00287 TRACE("iface %p.\n", iface); 00288 00289 wined3d_mutex_lock(); 00290 wined3d_texture_generate_mipmaps(This->wined3d_texture); 00291 wined3d_mutex_unlock(); 00292 } 00293 00294 /* IDirect3DCubeTexture9 Interface follow: */ 00295 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(IDirect3DCubeTexture9 *iface, 00296 UINT level, D3DSURFACE_DESC *desc) 00297 { 00298 IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface); 00299 struct wined3d_resource *sub_resource; 00300 HRESULT hr = D3D_OK; 00301 00302 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc); 00303 00304 wined3d_mutex_lock(); 00305 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00306 hr = D3DERR_INVALIDCALL; 00307 else 00308 { 00309 struct wined3d_resource_desc wined3d_desc; 00310 00311 wined3d_resource_get_desc(sub_resource, &wined3d_desc); 00312 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format); 00313 desc->Type = wined3d_desc.resource_type; 00314 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; 00315 desc->Pool = wined3d_desc.pool; 00316 desc->MultiSampleType = wined3d_desc.multisample_type; 00317 desc->MultiSampleQuality = wined3d_desc.multisample_quality; 00318 desc->Width = wined3d_desc.width; 00319 desc->Height = wined3d_desc.height; 00320 } 00321 wined3d_mutex_unlock(); 00322 00323 return hr; 00324 } 00325 00326 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(IDirect3DCubeTexture9 *iface, 00327 D3DCUBEMAP_FACES face, UINT level, IDirect3DSurface9 **surface) 00328 { 00329 IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface); 00330 struct wined3d_resource *sub_resource; 00331 UINT sub_resource_idx; 00332 00333 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, face, level, surface); 00334 00335 wined3d_mutex_lock(); 00336 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level; 00337 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx))) 00338 { 00339 wined3d_mutex_unlock(); 00340 return D3DERR_INVALIDCALL; 00341 } 00342 00343 *surface = wined3d_resource_get_parent(sub_resource); 00344 IDirect3DSurface9_AddRef(*surface); 00345 wined3d_mutex_unlock(); 00346 00347 return D3D_OK; 00348 } 00349 00350 static HRESULT WINAPI IDirect3DCubeTexture9Impl_LockRect(IDirect3DCubeTexture9 *iface, 00351 D3DCUBEMAP_FACES face, UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect, 00352 DWORD flags) 00353 { 00354 IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface); 00355 struct wined3d_resource *sub_resource; 00356 UINT sub_resource_idx; 00357 HRESULT hr; 00358 00359 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n", 00360 iface, face, level, locked_rect, rect, flags); 00361 00362 wined3d_mutex_lock(); 00363 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level; 00364 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx))) 00365 hr = D3DERR_INVALIDCALL; 00366 else 00367 hr = IDirect3DSurface9_LockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource), 00368 locked_rect, rect, flags); 00369 wined3d_mutex_unlock(); 00370 00371 return hr; 00372 } 00373 00374 static HRESULT WINAPI IDirect3DCubeTexture9Impl_UnlockRect(IDirect3DCubeTexture9 *iface, 00375 D3DCUBEMAP_FACES face, UINT level) 00376 { 00377 IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface); 00378 struct wined3d_resource *sub_resource; 00379 UINT sub_resource_idx; 00380 HRESULT hr; 00381 00382 TRACE("iface %p, face %#x, level %u.\n", iface, face, level); 00383 00384 wined3d_mutex_lock(); 00385 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level; 00386 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx))) 00387 hr = D3DERR_INVALIDCALL; 00388 else 00389 hr = IDirect3DSurface9_UnlockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource)); 00390 wined3d_mutex_unlock(); 00391 00392 return hr; 00393 } 00394 00395 static HRESULT WINAPI IDirect3DCubeTexture9Impl_AddDirtyRect(IDirect3DCubeTexture9 *iface, 00396 D3DCUBEMAP_FACES face, const RECT *dirty_rect) 00397 { 00398 IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface); 00399 HRESULT hr; 00400 00401 TRACE("iface %p, face %#x, dirty_rect %s.\n", 00402 iface, face, wine_dbgstr_rect(dirty_rect)); 00403 00404 wined3d_mutex_lock(); 00405 if (!dirty_rect) 00406 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL); 00407 else 00408 { 00409 struct wined3d_box dirty_region; 00410 00411 dirty_region.left = dirty_rect->left; 00412 dirty_region.top = dirty_rect->top; 00413 dirty_region.right = dirty_rect->right; 00414 dirty_region.bottom = dirty_rect->bottom; 00415 dirty_region.front = 0; 00416 dirty_region.back = 1; 00417 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region); 00418 } 00419 wined3d_mutex_unlock(); 00420 00421 return hr; 00422 } 00423 00424 static const IDirect3DCubeTexture9Vtbl Direct3DCubeTexture9_Vtbl = 00425 { 00426 /* IUnknown */ 00427 IDirect3DCubeTexture9Impl_QueryInterface, 00428 IDirect3DCubeTexture9Impl_AddRef, 00429 IDirect3DCubeTexture9Impl_Release, 00430 /* IDirect3DResource9 */ 00431 IDirect3DCubeTexture9Impl_GetDevice, 00432 IDirect3DCubeTexture9Impl_SetPrivateData, 00433 IDirect3DCubeTexture9Impl_GetPrivateData, 00434 IDirect3DCubeTexture9Impl_FreePrivateData, 00435 IDirect3DCubeTexture9Impl_SetPriority, 00436 IDirect3DCubeTexture9Impl_GetPriority, 00437 IDirect3DCubeTexture9Impl_PreLoad, 00438 IDirect3DCubeTexture9Impl_GetType, 00439 /* IDirect3DBaseTexture9 */ 00440 IDirect3DCubeTexture9Impl_SetLOD, 00441 IDirect3DCubeTexture9Impl_GetLOD, 00442 IDirect3DCubeTexture9Impl_GetLevelCount, 00443 IDirect3DCubeTexture9Impl_SetAutoGenFilterType, 00444 IDirect3DCubeTexture9Impl_GetAutoGenFilterType, 00445 IDirect3DCubeTexture9Impl_GenerateMipSubLevels, 00446 IDirect3DCubeTexture9Impl_GetLevelDesc, 00447 IDirect3DCubeTexture9Impl_GetCubeMapSurface, 00448 IDirect3DCubeTexture9Impl_LockRect, 00449 IDirect3DCubeTexture9Impl_UnlockRect, 00450 IDirect3DCubeTexture9Impl_AddDirtyRect 00451 }; 00452 00453 static void STDMETHODCALLTYPE cubetexture_wined3d_object_destroyed(void *parent) 00454 { 00455 HeapFree(GetProcessHeap(), 0, parent); 00456 } 00457 00458 static const struct wined3d_parent_ops d3d9_cubetexture_wined3d_parent_ops = 00459 { 00460 cubetexture_wined3d_object_destroyed, 00461 }; 00462 00463 HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Impl *device, 00464 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) 00465 { 00466 HRESULT hr; 00467 00468 texture->IDirect3DCubeTexture9_iface.lpVtbl = &Direct3DCubeTexture9_Vtbl; 00469 texture->ref = 1; 00470 00471 wined3d_mutex_lock(); 00472 hr = wined3d_texture_create_cube(device->wined3d_device, edge_length, 00473 levels, usage, wined3dformat_from_d3dformat(format), pool, texture, 00474 &d3d9_cubetexture_wined3d_parent_ops, &texture->wined3d_texture); 00475 wined3d_mutex_unlock(); 00476 if (FAILED(hr)) 00477 { 00478 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); 00479 return hr; 00480 } 00481 00482 texture->parentDevice = &device->IDirect3DDevice9Ex_iface; 00483 IDirect3DDevice9Ex_AddRef(texture->parentDevice); 00484 00485 return D3D_OK; 00486 } Generated on Mon May 28 2012 04:21:34 for ReactOS by
1.7.6.1
|