Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenvolumetexture.c
Go to the documentation of this file.
00001 /* 00002 * IDirect3DVolumeTexture8 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 IDirect3DVolumeTexture8Impl *impl_from_IDirect3DVolumeTexture8(IDirect3DVolumeTexture8 *iface) 00027 { 00028 return CONTAINING_RECORD(iface, IDirect3DVolumeTexture8Impl, IDirect3DVolumeTexture8_iface); 00029 } 00030 00031 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_QueryInterface(IDirect3DVolumeTexture8 *iface, 00032 REFIID riid, void **ppobj) 00033 { 00034 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(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_IDirect3DVolumeTexture8)) { 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 IDirect3DVolumeTexture8Impl_AddRef(IDirect3DVolumeTexture8 *iface) 00053 { 00054 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(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 IDirect3DDevice8_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 IDirect3DVolumeTexture8Impl_Release(IDirect3DVolumeTexture8 *iface) 00071 { 00072 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(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 wined3d_mutex_lock(); 00081 wined3d_texture_decref(This->wined3d_texture); 00082 wined3d_mutex_unlock(); 00083 00084 /* Release the device last, as it may cause the device to be destroyed. */ 00085 IDirect3DDevice8_Release(parentDevice); 00086 } 00087 return ref; 00088 } 00089 00090 /* IDirect3DVolumeTexture8 IDirect3DResource8 Interface follow: */ 00091 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetDevice(IDirect3DVolumeTexture8 *iface, 00092 IDirect3DDevice8 **device) 00093 { 00094 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00095 00096 TRACE("iface %p, device %p.\n", iface, device); 00097 00098 *device = This->parentDevice; 00099 IDirect3DDevice8_AddRef(*device); 00100 00101 TRACE("Returning device %p.\n", *device); 00102 00103 return D3D_OK; 00104 } 00105 00106 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(IDirect3DVolumeTexture8 *iface, 00107 REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags) 00108 { 00109 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00110 struct wined3d_resource *resource; 00111 HRESULT hr; 00112 00113 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", 00114 iface, debugstr_guid(refguid), pData, SizeOfData, Flags); 00115 00116 wined3d_mutex_lock(); 00117 resource = wined3d_texture_get_resource(This->wined3d_texture); 00118 hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags); 00119 wined3d_mutex_unlock(); 00120 00121 return hr; 00122 } 00123 00124 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetPrivateData(IDirect3DVolumeTexture8 *iface, 00125 REFGUID refguid, void *pData, DWORD *pSizeOfData) 00126 { 00127 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00128 struct wined3d_resource *resource; 00129 HRESULT hr; 00130 00131 TRACE("iface %p, guid %s, data %p, data_size %p.\n", 00132 iface, debugstr_guid(refguid), pData, pSizeOfData); 00133 00134 wined3d_mutex_lock(); 00135 resource = wined3d_texture_get_resource(This->wined3d_texture); 00136 hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData); 00137 wined3d_mutex_unlock(); 00138 00139 return hr; 00140 } 00141 00142 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_FreePrivateData(IDirect3DVolumeTexture8 *iface, 00143 REFGUID refguid) 00144 { 00145 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00146 struct wined3d_resource *resource; 00147 HRESULT hr; 00148 00149 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); 00150 00151 wined3d_mutex_lock(); 00152 resource = wined3d_texture_get_resource(This->wined3d_texture); 00153 hr = wined3d_resource_free_private_data(resource, refguid); 00154 wined3d_mutex_unlock(); 00155 00156 return hr; 00157 } 00158 00159 static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetPriority(IDirect3DVolumeTexture8 *iface, 00160 DWORD PriorityNew) 00161 { 00162 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00163 DWORD ret; 00164 00165 TRACE("iface %p, priority %u.\n", iface, PriorityNew); 00166 00167 wined3d_mutex_lock(); 00168 ret = wined3d_texture_set_priority(This->wined3d_texture, PriorityNew); 00169 wined3d_mutex_unlock(); 00170 00171 return ret; 00172 } 00173 00174 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetPriority(IDirect3DVolumeTexture8 *iface) 00175 { 00176 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00177 DWORD ret; 00178 00179 TRACE("iface %p.\n", iface); 00180 00181 wined3d_mutex_lock(); 00182 ret = wined3d_texture_get_priority(This->wined3d_texture); 00183 wined3d_mutex_unlock(); 00184 00185 return ret; 00186 } 00187 00188 static void WINAPI IDirect3DVolumeTexture8Impl_PreLoad(IDirect3DVolumeTexture8 *iface) 00189 { 00190 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00191 00192 TRACE("iface %p.\n", iface); 00193 00194 wined3d_mutex_lock(); 00195 wined3d_texture_preload(This->wined3d_texture); 00196 wined3d_mutex_unlock(); 00197 } 00198 00199 static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(IDirect3DVolumeTexture8 *iface) 00200 { 00201 TRACE("iface %p.\n", iface); 00202 00203 return D3DRTYPE_VOLUMETEXTURE; 00204 } 00205 00206 /* IDirect3DVolumeTexture8 IDirect3DBaseTexture8 Interface follow: */ 00207 static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetLOD(IDirect3DVolumeTexture8 *iface, DWORD LODNew) 00208 { 00209 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00210 DWORD ret; 00211 00212 TRACE("iface %p, lod %u.\n", iface, LODNew); 00213 00214 wined3d_mutex_lock(); 00215 ret = wined3d_texture_set_lod(This->wined3d_texture, LODNew); 00216 wined3d_mutex_unlock(); 00217 00218 return ret; 00219 } 00220 00221 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLOD(IDirect3DVolumeTexture8 *iface) 00222 { 00223 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00224 DWORD ret; 00225 00226 TRACE("iface %p.\n", iface); 00227 00228 wined3d_mutex_lock(); 00229 ret = wined3d_texture_get_lod(This->wined3d_texture); 00230 wined3d_mutex_unlock(); 00231 00232 return ret; 00233 } 00234 00235 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(IDirect3DVolumeTexture8 *iface) 00236 { 00237 IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface); 00238 DWORD ret; 00239 00240 TRACE("iface %p.\n", iface); 00241 00242 wined3d_mutex_lock(); 00243 ret = wined3d_texture_get_level_count(This->wined3d_texture); 00244 wined3d_mutex_unlock(); 00245 00246 return ret; 00247 } 00248 00249 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(IDirect3DVolumeTexture8 *iface, 00250 UINT level, D3DVOLUME_DESC *desc) 00251 { 00252 IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface); 00253 struct wined3d_resource *sub_resource; 00254 HRESULT hr = D3D_OK; 00255 00256 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc); 00257 00258 wined3d_mutex_lock(); 00259 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00260 hr = D3DERR_INVALIDCALL; 00261 else 00262 { 00263 struct wined3d_resource_desc wined3d_desc; 00264 00265 wined3d_resource_get_desc(sub_resource, &wined3d_desc); 00266 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format); 00267 desc->Type = wined3d_desc.resource_type; 00268 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; 00269 desc->Pool = wined3d_desc.pool; 00270 desc->Size = wined3d_desc.size; 00271 desc->Width = wined3d_desc.width; 00272 desc->Height = wined3d_desc.height; 00273 desc->Depth = wined3d_desc.depth; 00274 } 00275 wined3d_mutex_unlock(); 00276 00277 return hr; 00278 } 00279 00280 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(IDirect3DVolumeTexture8 *iface, 00281 UINT level, IDirect3DVolume8 **volume) 00282 { 00283 IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface); 00284 struct wined3d_resource *sub_resource; 00285 00286 TRACE("iface %p, level %u, volume %p.\n", iface, level, volume); 00287 00288 wined3d_mutex_lock(); 00289 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00290 { 00291 wined3d_mutex_unlock(); 00292 return D3DERR_INVALIDCALL; 00293 } 00294 00295 *volume = wined3d_resource_get_parent(sub_resource); 00296 IDirect3DVolume8_AddRef(*volume); 00297 wined3d_mutex_unlock(); 00298 00299 return D3D_OK; 00300 } 00301 00302 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(IDirect3DVolumeTexture8 *iface, 00303 UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags) 00304 { 00305 IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface); 00306 struct wined3d_resource *sub_resource; 00307 HRESULT hr; 00308 00309 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n", 00310 iface, level, locked_box, box, flags); 00311 00312 wined3d_mutex_lock(); 00313 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00314 hr = D3DERR_INVALIDCALL; 00315 else 00316 hr = IDirect3DVolume8_LockBox((IDirect3DVolume8 *)wined3d_resource_get_parent(sub_resource), 00317 locked_box, box, flags); 00318 wined3d_mutex_unlock(); 00319 00320 return hr; 00321 } 00322 00323 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(IDirect3DVolumeTexture8 *iface, 00324 UINT level) 00325 { 00326 IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface); 00327 struct wined3d_resource *sub_resource; 00328 HRESULT hr; 00329 00330 TRACE("iface %p, level %u.\n", iface, level); 00331 00332 wined3d_mutex_lock(); 00333 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00334 hr = D3DERR_INVALIDCALL; 00335 else 00336 hr = IDirect3DVolume8_UnlockBox((IDirect3DVolume8 *)wined3d_resource_get_parent(sub_resource)); 00337 wined3d_mutex_unlock(); 00338 00339 return hr; 00340 } 00341 00342 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(IDirect3DVolumeTexture8 *iface, 00343 const D3DBOX *dirty_box) 00344 { 00345 IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface); 00346 HRESULT hr; 00347 00348 TRACE("iface %p, dirty_box %p.\n", iface, dirty_box); 00349 00350 wined3d_mutex_lock(); 00351 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box); 00352 wined3d_mutex_unlock(); 00353 00354 return hr; 00355 } 00356 00357 static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl = 00358 { 00359 /* IUnknown */ 00360 IDirect3DVolumeTexture8Impl_QueryInterface, 00361 IDirect3DVolumeTexture8Impl_AddRef, 00362 IDirect3DVolumeTexture8Impl_Release, 00363 /* IDirect3DResource8 */ 00364 IDirect3DVolumeTexture8Impl_GetDevice, 00365 IDirect3DVolumeTexture8Impl_SetPrivateData, 00366 IDirect3DVolumeTexture8Impl_GetPrivateData, 00367 IDirect3DVolumeTexture8Impl_FreePrivateData, 00368 IDirect3DVolumeTexture8Impl_SetPriority, 00369 IDirect3DVolumeTexture8Impl_GetPriority, 00370 IDirect3DVolumeTexture8Impl_PreLoad, 00371 IDirect3DVolumeTexture8Impl_GetType, 00372 /* IDirect3DBaseTexture8 */ 00373 IDirect3DVolumeTexture8Impl_SetLOD, 00374 IDirect3DVolumeTexture8Impl_GetLOD, 00375 IDirect3DVolumeTexture8Impl_GetLevelCount, 00376 /* IDirect3DVolumeTexture8 */ 00377 IDirect3DVolumeTexture8Impl_GetLevelDesc, 00378 IDirect3DVolumeTexture8Impl_GetVolumeLevel, 00379 IDirect3DVolumeTexture8Impl_LockBox, 00380 IDirect3DVolumeTexture8Impl_UnlockBox, 00381 IDirect3DVolumeTexture8Impl_AddDirtyBox 00382 }; 00383 00384 static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent) 00385 { 00386 HeapFree(GetProcessHeap(), 0, parent); 00387 } 00388 00389 static const struct wined3d_parent_ops d3d8_volumetexture_wined3d_parent_ops = 00390 { 00391 volumetexture_wined3d_object_destroyed, 00392 }; 00393 00394 HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device, 00395 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) 00396 { 00397 HRESULT hr; 00398 00399 texture->IDirect3DVolumeTexture8_iface.lpVtbl = &Direct3DVolumeTexture8_Vtbl; 00400 texture->ref = 1; 00401 00402 wined3d_mutex_lock(); 00403 hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, 00404 usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, 00405 &d3d8_volumetexture_wined3d_parent_ops, &texture->wined3d_texture); 00406 wined3d_mutex_unlock(); 00407 if (FAILED(hr)) 00408 { 00409 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); 00410 return hr; 00411 } 00412 00413 texture->parentDevice = &device->IDirect3DDevice8_iface; 00414 IDirect3DDevice8_AddRef(texture->parentDevice); 00415 00416 return D3D_OK; 00417 } Generated on Sat May 26 2012 04:20:41 for ReactOS by
1.7.6.1
|