ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

volumetexture.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.