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