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

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

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