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  * 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 doxygen 1.7.6.1

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