Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenvolumetexture.c
Go to the documentation of this file.
00001 /* 00002 * IDirect3DVolumeTexture9 implementation 00003 * 00004 * Copyright 2002-2005 Jason Edmeades 00005 * Raphael Junqueira 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00020 */ 00021 00022 #include "config.h" 00023 #include "d3d9_private.h" 00024 00025 WINE_DEFAULT_DEBUG_CHANNEL(d3d9); 00026 00027 static inline IDirect3DVolumeTexture9Impl *impl_from_IDirect3DVolumeTexture9(IDirect3DVolumeTexture9 *iface) 00028 { 00029 return CONTAINING_RECORD(iface, IDirect3DVolumeTexture9Impl, IDirect3DVolumeTexture9_iface); 00030 } 00031 00032 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_QueryInterface(IDirect3DVolumeTexture9 *iface, 00033 REFIID riid, void **ppobj) 00034 { 00035 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00036 00037 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); 00038 00039 if (IsEqualGUID(riid, &IID_IUnknown) 00040 || IsEqualGUID(riid, &IID_IDirect3DResource9) 00041 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9) 00042 || IsEqualGUID(riid, &IID_IDirect3DVolumeTexture9)) { 00043 IDirect3DVolumeTexture9_AddRef(iface); 00044 *ppobj = This; 00045 return S_OK; 00046 } 00047 00048 WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); 00049 *ppobj = NULL; 00050 return E_NOINTERFACE; 00051 } 00052 00053 static ULONG WINAPI IDirect3DVolumeTexture9Impl_AddRef(IDirect3DVolumeTexture9 *iface) 00054 { 00055 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00056 ULONG ref = InterlockedIncrement(&This->ref); 00057 00058 TRACE("%p increasing refcount to %u.\n", iface, ref); 00059 00060 if (ref == 1) 00061 { 00062 IDirect3DDevice9Ex_AddRef(This->parentDevice); 00063 wined3d_mutex_lock(); 00064 wined3d_texture_incref(This->wined3d_texture); 00065 wined3d_mutex_unlock(); 00066 } 00067 00068 return ref; 00069 } 00070 00071 static ULONG WINAPI IDirect3DVolumeTexture9Impl_Release(IDirect3DVolumeTexture9 *iface) 00072 { 00073 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00074 ULONG ref = InterlockedDecrement(&This->ref); 00075 00076 TRACE("%p decreasing refcount to %u.\n", iface, ref); 00077 00078 if (ref == 0) { 00079 IDirect3DDevice9Ex *parentDevice = This->parentDevice; 00080 00081 wined3d_mutex_lock(); 00082 wined3d_texture_decref(This->wined3d_texture); 00083 wined3d_mutex_unlock(); 00084 00085 /* Release the device last, as it may cause the device to be destroyed. */ 00086 IDirect3DDevice9Ex_Release(parentDevice); 00087 } 00088 return ref; 00089 } 00090 00091 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetDevice(IDirect3DVolumeTexture9 *iface, 00092 IDirect3DDevice9 **device) 00093 { 00094 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00095 00096 TRACE("iface %p, device %p.\n", iface, device); 00097 00098 *device = (IDirect3DDevice9 *)This->parentDevice; 00099 IDirect3DDevice9_AddRef(*device); 00100 00101 TRACE("Returning device %p.\n", *device); 00102 00103 return D3D_OK; 00104 } 00105 00106 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetPrivateData(IDirect3DVolumeTexture9 *iface, 00107 REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags) 00108 { 00109 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(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 IDirect3DVolumeTexture9Impl_GetPrivateData(IDirect3DVolumeTexture9 *iface, 00125 REFGUID refguid, void *pData, DWORD *pSizeOfData) 00126 { 00127 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(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 IDirect3DVolumeTexture9Impl_FreePrivateData(IDirect3DVolumeTexture9 *iface, 00143 REFGUID refguid) 00144 { 00145 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(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 IDirect3DVolumeTexture9Impl_SetPriority(IDirect3DVolumeTexture9 *iface, 00160 DWORD PriorityNew) 00161 { 00162 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00163 DWORD priority; 00164 00165 TRACE("iface %p, priority %u.\n", iface, PriorityNew); 00166 00167 wined3d_mutex_lock(); 00168 priority = wined3d_texture_set_priority(This->wined3d_texture, PriorityNew); 00169 wined3d_mutex_unlock(); 00170 00171 return priority; 00172 } 00173 00174 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetPriority(IDirect3DVolumeTexture9 *iface) 00175 { 00176 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00177 DWORD priority; 00178 00179 TRACE("iface %p.\n", iface); 00180 00181 wined3d_mutex_lock(); 00182 priority = wined3d_texture_get_priority(This->wined3d_texture); 00183 wined3d_mutex_unlock(); 00184 00185 return priority; 00186 } 00187 00188 static void WINAPI IDirect3DVolumeTexture9Impl_PreLoad(IDirect3DVolumeTexture9 *iface) 00189 { 00190 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(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 IDirect3DVolumeTexture9Impl_GetType(IDirect3DVolumeTexture9 *iface) 00200 { 00201 TRACE("iface %p.\n", iface); 00202 00203 return D3DRTYPE_VOLUMETEXTURE; 00204 } 00205 00206 static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetLOD(IDirect3DVolumeTexture9 *iface, DWORD LODNew) 00207 { 00208 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00209 DWORD lod; 00210 00211 TRACE("iface %p, lod %u.\n", iface, LODNew); 00212 00213 wined3d_mutex_lock(); 00214 lod = wined3d_texture_set_lod(This->wined3d_texture, LODNew); 00215 wined3d_mutex_unlock(); 00216 00217 return lod; 00218 } 00219 00220 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLOD(IDirect3DVolumeTexture9 *iface) 00221 { 00222 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00223 DWORD lod; 00224 00225 TRACE("iface %p.\n", iface); 00226 00227 wined3d_mutex_lock(); 00228 lod = wined3d_texture_get_lod(This->wined3d_texture); 00229 wined3d_mutex_unlock(); 00230 00231 return lod; 00232 } 00233 00234 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLevelCount(IDirect3DVolumeTexture9 *iface) 00235 { 00236 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00237 DWORD level_count; 00238 00239 TRACE("iface %p.\n", iface); 00240 00241 wined3d_mutex_lock(); 00242 level_count = wined3d_texture_get_level_count(This->wined3d_texture); 00243 wined3d_mutex_unlock(); 00244 00245 return level_count; 00246 } 00247 00248 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetAutoGenFilterType(IDirect3DVolumeTexture9 *iface, 00249 D3DTEXTUREFILTERTYPE FilterType) 00250 { 00251 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00252 HRESULT hr; 00253 00254 TRACE("iface %p, filter_type %#x.\n", iface, FilterType); 00255 00256 wined3d_mutex_lock(); 00257 hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType); 00258 wined3d_mutex_unlock(); 00259 00260 return hr; 00261 } 00262 00263 static D3DTEXTUREFILTERTYPE WINAPI IDirect3DVolumeTexture9Impl_GetAutoGenFilterType(IDirect3DVolumeTexture9 *iface) 00264 { 00265 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00266 D3DTEXTUREFILTERTYPE filter_type; 00267 00268 TRACE("iface %p.\n", iface); 00269 00270 wined3d_mutex_lock(); 00271 filter_type = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(This->wined3d_texture); 00272 wined3d_mutex_unlock(); 00273 00274 return filter_type; 00275 } 00276 00277 static void WINAPI IDirect3DVolumeTexture9Impl_GenerateMipSubLevels(IDirect3DVolumeTexture9 *iface) 00278 { 00279 IDirect3DVolumeTexture9Impl *This = impl_from_IDirect3DVolumeTexture9(iface); 00280 00281 TRACE("iface %p.\n", iface); 00282 00283 wined3d_mutex_lock(); 00284 wined3d_texture_generate_mipmaps(This->wined3d_texture); 00285 wined3d_mutex_unlock(); 00286 } 00287 00288 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(IDirect3DVolumeTexture9 *iface, 00289 UINT level, D3DVOLUME_DESC *desc) 00290 { 00291 IDirect3DVolumeTexture9Impl *texture = impl_from_IDirect3DVolumeTexture9(iface); 00292 struct wined3d_resource *sub_resource; 00293 HRESULT hr = D3D_OK; 00294 00295 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc); 00296 00297 wined3d_mutex_lock(); 00298 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00299 hr = D3DERR_INVALIDCALL; 00300 else 00301 { 00302 struct wined3d_resource_desc wined3d_desc; 00303 00304 wined3d_resource_get_desc(sub_resource, &wined3d_desc); 00305 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format); 00306 desc->Type = wined3d_desc.resource_type; 00307 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; 00308 desc->Pool = wined3d_desc.pool; 00309 desc->Width = wined3d_desc.width; 00310 desc->Height = wined3d_desc.height; 00311 desc->Depth = wined3d_desc.depth; 00312 } 00313 wined3d_mutex_unlock(); 00314 00315 return hr; 00316 } 00317 00318 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(IDirect3DVolumeTexture9 *iface, 00319 UINT level, IDirect3DVolume9 **volume) 00320 { 00321 IDirect3DVolumeTexture9Impl *texture = impl_from_IDirect3DVolumeTexture9(iface); 00322 struct wined3d_resource *sub_resource; 00323 00324 TRACE("iface %p, level %u, volume %p.\n", iface, level, volume); 00325 00326 wined3d_mutex_lock(); 00327 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00328 { 00329 wined3d_mutex_unlock(); 00330 return D3DERR_INVALIDCALL; 00331 } 00332 00333 *volume = wined3d_resource_get_parent(sub_resource); 00334 IDirect3DVolume9_AddRef(*volume); 00335 wined3d_mutex_unlock(); 00336 00337 return D3D_OK; 00338 } 00339 00340 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_LockBox(IDirect3DVolumeTexture9 *iface, 00341 UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags) 00342 { 00343 IDirect3DVolumeTexture9Impl *texture = impl_from_IDirect3DVolumeTexture9(iface); 00344 struct wined3d_resource *sub_resource; 00345 HRESULT hr; 00346 00347 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n", 00348 iface, level, locked_box, box, flags); 00349 00350 wined3d_mutex_lock(); 00351 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00352 hr = D3DERR_INVALIDCALL; 00353 else 00354 hr = IDirect3DVolume9_LockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource), 00355 locked_box, box, flags); 00356 wined3d_mutex_unlock(); 00357 00358 return hr; 00359 } 00360 00361 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_UnlockBox(IDirect3DVolumeTexture9 *iface, 00362 UINT level) 00363 { 00364 IDirect3DVolumeTexture9Impl *texture = impl_from_IDirect3DVolumeTexture9(iface); 00365 struct wined3d_resource *sub_resource; 00366 HRESULT hr; 00367 00368 TRACE("iface %p, level %u.\n", iface, level); 00369 00370 wined3d_mutex_lock(); 00371 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) 00372 hr = D3DERR_INVALIDCALL; 00373 else 00374 hr = IDirect3DVolume9_UnlockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource)); 00375 wined3d_mutex_unlock(); 00376 00377 return hr; 00378 } 00379 00380 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_AddDirtyBox(IDirect3DVolumeTexture9 *iface, 00381 const D3DBOX *dirty_box) 00382 { 00383 IDirect3DVolumeTexture9Impl *texture = impl_from_IDirect3DVolumeTexture9(iface); 00384 HRESULT hr; 00385 00386 TRACE("iface %p, dirty_box %p.\n", iface, dirty_box); 00387 00388 wined3d_mutex_lock(); 00389 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box); 00390 wined3d_mutex_unlock(); 00391 00392 return hr; 00393 } 00394 00395 00396 static const IDirect3DVolumeTexture9Vtbl Direct3DVolumeTexture9_Vtbl = 00397 { 00398 /* IUnknown */ 00399 IDirect3DVolumeTexture9Impl_QueryInterface, 00400 IDirect3DVolumeTexture9Impl_AddRef, 00401 IDirect3DVolumeTexture9Impl_Release, 00402 /* IDirect3DResource9 */ 00403 IDirect3DVolumeTexture9Impl_GetDevice, 00404 IDirect3DVolumeTexture9Impl_SetPrivateData, 00405 IDirect3DVolumeTexture9Impl_GetPrivateData, 00406 IDirect3DVolumeTexture9Impl_FreePrivateData, 00407 IDirect3DVolumeTexture9Impl_SetPriority, 00408 IDirect3DVolumeTexture9Impl_GetPriority, 00409 IDirect3DVolumeTexture9Impl_PreLoad, 00410 IDirect3DVolumeTexture9Impl_GetType, 00411 /* IDirect3DBaseTexture9 */ 00412 IDirect3DVolumeTexture9Impl_SetLOD, 00413 IDirect3DVolumeTexture9Impl_GetLOD, 00414 IDirect3DVolumeTexture9Impl_GetLevelCount, 00415 IDirect3DVolumeTexture9Impl_SetAutoGenFilterType, 00416 IDirect3DVolumeTexture9Impl_GetAutoGenFilterType, 00417 IDirect3DVolumeTexture9Impl_GenerateMipSubLevels, 00418 /* IDirect3DVolumeTexture9 */ 00419 IDirect3DVolumeTexture9Impl_GetLevelDesc, 00420 IDirect3DVolumeTexture9Impl_GetVolumeLevel, 00421 IDirect3DVolumeTexture9Impl_LockBox, 00422 IDirect3DVolumeTexture9Impl_UnlockBox, 00423 IDirect3DVolumeTexture9Impl_AddDirtyBox 00424 }; 00425 00426 static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent) 00427 { 00428 HeapFree(GetProcessHeap(), 0, parent); 00429 } 00430 00431 static const struct wined3d_parent_ops d3d9_volumetexture_wined3d_parent_ops = 00432 { 00433 volumetexture_wined3d_object_destroyed, 00434 }; 00435 00436 HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device, 00437 UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) 00438 { 00439 HRESULT hr; 00440 00441 texture->IDirect3DVolumeTexture9_iface.lpVtbl = &Direct3DVolumeTexture9_Vtbl; 00442 texture->ref = 1; 00443 00444 wined3d_mutex_lock(); 00445 hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, 00446 usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, 00447 &d3d9_volumetexture_wined3d_parent_ops, &texture->wined3d_texture); 00448 wined3d_mutex_unlock(); 00449 if (FAILED(hr)) 00450 { 00451 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); 00452 return hr; 00453 } 00454 00455 texture->parentDevice = &device->IDirect3DDevice9Ex_iface; 00456 IDirect3DDevice9Ex_AddRef(texture->parentDevice); 00457 00458 return D3D_OK; 00459 } Generated on Thu May 24 2012 04:22:25 for ReactOS by
1.7.6.1
|