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  * IDirect3DCubeTexture9 implementation
00003  *
00004  * Copyright 2002-2005 Jason Edmeades
00005  * Copyright 2002-2005 Raphael Junqueira
00006  * Copyright 2005 Oliver Stieber
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00021  */
00022 
00023 #include "config.h"
00024 #include "d3d9_private.h"
00025 
00026 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
00027 
00028 
00029 static inline IDirect3DCubeTexture9Impl *impl_from_IDirect3DCubeTexture9(IDirect3DCubeTexture9 *iface)
00030 {
00031     return CONTAINING_RECORD(iface, IDirect3DCubeTexture9Impl, IDirect3DCubeTexture9_iface);
00032 }
00033 
00034 static HRESULT WINAPI IDirect3DCubeTexture9Impl_QueryInterface(IDirect3DCubeTexture9 *iface,
00035         REFIID riid, void **ppobj)
00036 {
00037     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00038 
00039     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
00040 
00041     if (IsEqualGUID(riid, &IID_IUnknown)
00042         || IsEqualGUID(riid, &IID_IDirect3DResource9)
00043         || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
00044         || IsEqualGUID(riid, &IID_IDirect3DCubeTexture9)) {
00045         IDirect3DCubeTexture9_AddRef(iface);
00046         *ppobj = This;
00047         return S_OK;
00048     }
00049 
00050     WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
00051     *ppobj = NULL;
00052     return E_NOINTERFACE;
00053 }
00054 
00055 static ULONG WINAPI IDirect3DCubeTexture9Impl_AddRef(IDirect3DCubeTexture9 *iface)
00056 {
00057     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00058     ULONG ref = InterlockedIncrement(&This->ref);
00059 
00060     TRACE("%p increasing refcount to %u.\n", iface, ref);
00061 
00062     if (ref == 1)
00063     {
00064         IDirect3DDevice9Ex_AddRef(This->parentDevice);
00065         wined3d_mutex_lock();
00066         wined3d_texture_incref(This->wined3d_texture);
00067         wined3d_mutex_unlock();
00068     }
00069 
00070     return ref;
00071 }
00072 
00073 static ULONG WINAPI IDirect3DCubeTexture9Impl_Release(IDirect3DCubeTexture9 *iface)
00074 {
00075     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00076     ULONG ref = InterlockedDecrement(&This->ref);
00077 
00078     TRACE("%p decreasing refcount to %u.\n", iface, ref);
00079 
00080     if (ref == 0) {
00081         IDirect3DDevice9Ex *parentDevice = This->parentDevice;
00082 
00083         TRACE("Releasing child %p.\n", This->wined3d_texture);
00084 
00085         wined3d_mutex_lock();
00086         wined3d_texture_decref(This->wined3d_texture);
00087         wined3d_mutex_unlock();
00088 
00089         /* Release the device last, as it may cause the device to be destroyed. */
00090         IDirect3DDevice9Ex_Release(parentDevice);
00091     }
00092     return ref;
00093 }
00094 
00095 /* IDirect3DCubeTexture9 IDirect3DResource9 Interface follow: */
00096 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetDevice(IDirect3DCubeTexture9 *iface,
00097         IDirect3DDevice9 **device)
00098 {
00099     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00100 
00101     TRACE("iface %p, device %p.\n", iface, device);
00102 
00103     *device = (IDirect3DDevice9 *)This->parentDevice;
00104     IDirect3DDevice9_AddRef(*device);
00105 
00106     TRACE("Returning device %p.\n", *device);
00107 
00108     return D3D_OK;
00109 }
00110 
00111 static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetPrivateData(IDirect3DCubeTexture9 *iface,
00112         REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
00113 {
00114     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00115     struct wined3d_resource *resource;
00116     HRESULT hr;
00117 
00118     TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
00119             iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
00120 
00121     wined3d_mutex_lock();
00122     resource = wined3d_texture_get_resource(This->wined3d_texture);
00123     hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
00124     wined3d_mutex_unlock();
00125 
00126     return hr;
00127 }
00128 
00129 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetPrivateData(IDirect3DCubeTexture9 *iface,
00130         REFGUID refguid, void *pData, DWORD *pSizeOfData)
00131 {
00132     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00133     struct wined3d_resource *resource;
00134     HRESULT hr;
00135 
00136     TRACE("iface %p, guid %s, data %p, data_size %p.\n",
00137             iface, debugstr_guid(refguid), pData, pSizeOfData);
00138 
00139     wined3d_mutex_lock();
00140     resource = wined3d_texture_get_resource(This->wined3d_texture);
00141     hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
00142     wined3d_mutex_unlock();
00143 
00144     return hr;
00145 }
00146 
00147 static HRESULT WINAPI IDirect3DCubeTexture9Impl_FreePrivateData(IDirect3DCubeTexture9 *iface,
00148         REFGUID refguid)
00149 {
00150     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00151     struct wined3d_resource *resource;
00152     HRESULT hr;
00153 
00154     TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
00155 
00156     wined3d_mutex_lock();
00157     resource = wined3d_texture_get_resource(This->wined3d_texture);
00158     hr = wined3d_resource_free_private_data(resource, refguid);
00159     wined3d_mutex_unlock();
00160 
00161     return hr;
00162 }
00163 
00164 static DWORD WINAPI IDirect3DCubeTexture9Impl_SetPriority(IDirect3DCubeTexture9 *iface,
00165         DWORD PriorityNew)
00166 {
00167     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00168     DWORD ret;
00169 
00170     TRACE("iface %p, priority %u.\n", iface, PriorityNew);
00171 
00172     wined3d_mutex_lock();
00173     ret = wined3d_texture_set_priority(This->wined3d_texture, PriorityNew);
00174     wined3d_mutex_unlock();
00175 
00176     return ret;
00177 }
00178 
00179 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetPriority(IDirect3DCubeTexture9 *iface)
00180 {
00181     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00182     DWORD ret;
00183 
00184     TRACE("iface %p.\n", iface);
00185 
00186     wined3d_mutex_lock();
00187     ret = wined3d_texture_get_priority(This->wined3d_texture);
00188     wined3d_mutex_unlock();
00189 
00190     return ret;
00191 }
00192 
00193 static void WINAPI IDirect3DCubeTexture9Impl_PreLoad(IDirect3DCubeTexture9 *iface)
00194 {
00195     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00196 
00197     TRACE("iface %p.\n", iface);
00198 
00199     wined3d_mutex_lock();
00200     wined3d_texture_preload(This->wined3d_texture);
00201     wined3d_mutex_unlock();
00202 }
00203 
00204 static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(IDirect3DCubeTexture9 *iface)
00205 {
00206     TRACE("iface %p.\n", iface);
00207 
00208     return D3DRTYPE_CUBETEXTURE;
00209 }
00210 
00211 /* IDirect3DCubeTexture9 IDirect3DBaseTexture9 Interface follow: */
00212 static DWORD WINAPI IDirect3DCubeTexture9Impl_SetLOD(IDirect3DCubeTexture9 *iface, DWORD LODNew)
00213 {
00214     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00215     DWORD ret;
00216 
00217     TRACE("iface %p, lod %u.\n", iface, LODNew);
00218 
00219     wined3d_mutex_lock();
00220     ret = wined3d_texture_set_lod(This->wined3d_texture, LODNew);
00221     wined3d_mutex_unlock();
00222 
00223     return ret;
00224 }
00225 
00226 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLOD(IDirect3DCubeTexture9 *iface)
00227 {
00228     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00229     DWORD ret;
00230 
00231     TRACE("iface %p.\n", iface);
00232 
00233     wined3d_mutex_lock();
00234     ret = wined3d_texture_get_lod(This->wined3d_texture);
00235     wined3d_mutex_unlock();
00236 
00237     return ret;
00238 }
00239 
00240 static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLevelCount(IDirect3DCubeTexture9 *iface)
00241 {
00242     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00243     DWORD ret;
00244 
00245     TRACE("iface %p.\n", iface);
00246 
00247     wined3d_mutex_lock();
00248     ret = wined3d_texture_get_level_count(This->wined3d_texture);
00249     wined3d_mutex_unlock();
00250 
00251     return ret;
00252 }
00253 
00254 static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetAutoGenFilterType(IDirect3DCubeTexture9 *iface,
00255         D3DTEXTUREFILTERTYPE FilterType)
00256 {
00257     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00258     HRESULT hr;
00259 
00260     TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
00261 
00262     wined3d_mutex_lock();
00263     hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType);
00264     wined3d_mutex_unlock();
00265 
00266     return hr;
00267 }
00268 
00269 static D3DTEXTUREFILTERTYPE WINAPI IDirect3DCubeTexture9Impl_GetAutoGenFilterType(IDirect3DCubeTexture9 *iface)
00270 {
00271     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00272     D3DTEXTUREFILTERTYPE ret;
00273 
00274     TRACE("iface %p.\n", iface);
00275 
00276     wined3d_mutex_lock();
00277     ret = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(This->wined3d_texture);
00278     wined3d_mutex_unlock();
00279 
00280     return ret;
00281 }
00282 
00283 static void WINAPI IDirect3DCubeTexture9Impl_GenerateMipSubLevels(IDirect3DCubeTexture9 *iface)
00284 {
00285     IDirect3DCubeTexture9Impl *This = impl_from_IDirect3DCubeTexture9(iface);
00286 
00287     TRACE("iface %p.\n", iface);
00288 
00289     wined3d_mutex_lock();
00290     wined3d_texture_generate_mipmaps(This->wined3d_texture);
00291     wined3d_mutex_unlock();
00292 }
00293 
00294 /* IDirect3DCubeTexture9 Interface follow: */
00295 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(IDirect3DCubeTexture9 *iface,
00296         UINT level, D3DSURFACE_DESC *desc)
00297 {
00298     IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface);
00299     struct wined3d_resource *sub_resource;
00300     HRESULT hr = D3D_OK;
00301 
00302     TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
00303 
00304     wined3d_mutex_lock();
00305     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00306         hr = D3DERR_INVALIDCALL;
00307     else
00308     {
00309         struct wined3d_resource_desc wined3d_desc;
00310 
00311         wined3d_resource_get_desc(sub_resource, &wined3d_desc);
00312         desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
00313         desc->Type = wined3d_desc.resource_type;
00314         desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
00315         desc->Pool = wined3d_desc.pool;
00316         desc->MultiSampleType = wined3d_desc.multisample_type;
00317         desc->MultiSampleQuality = wined3d_desc.multisample_quality;
00318         desc->Width = wined3d_desc.width;
00319         desc->Height = wined3d_desc.height;
00320     }
00321     wined3d_mutex_unlock();
00322 
00323     return hr;
00324 }
00325 
00326 static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(IDirect3DCubeTexture9 *iface,
00327         D3DCUBEMAP_FACES face, UINT level, IDirect3DSurface9 **surface)
00328 {
00329     IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface);
00330     struct wined3d_resource *sub_resource;
00331     UINT sub_resource_idx;
00332 
00333     TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, face, level, surface);
00334 
00335     wined3d_mutex_lock();
00336     sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
00337     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
00338     {
00339         wined3d_mutex_unlock();
00340         return D3DERR_INVALIDCALL;
00341     }
00342 
00343     *surface = wined3d_resource_get_parent(sub_resource);
00344     IDirect3DSurface9_AddRef(*surface);
00345     wined3d_mutex_unlock();
00346 
00347     return D3D_OK;
00348 }
00349 
00350 static HRESULT WINAPI IDirect3DCubeTexture9Impl_LockRect(IDirect3DCubeTexture9 *iface,
00351         D3DCUBEMAP_FACES face, UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect,
00352         DWORD flags)
00353 {
00354     IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface);
00355     struct wined3d_resource *sub_resource;
00356     UINT sub_resource_idx;
00357     HRESULT hr;
00358 
00359     TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
00360             iface, face, level, locked_rect, rect, flags);
00361 
00362     wined3d_mutex_lock();
00363     sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
00364     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
00365         hr = D3DERR_INVALIDCALL;
00366     else
00367         hr = IDirect3DSurface9_LockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource),
00368                 locked_rect, rect, flags);
00369     wined3d_mutex_unlock();
00370 
00371     return hr;
00372 }
00373 
00374 static HRESULT WINAPI IDirect3DCubeTexture9Impl_UnlockRect(IDirect3DCubeTexture9 *iface,
00375         D3DCUBEMAP_FACES face, UINT level)
00376 {
00377     IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface);
00378     struct wined3d_resource *sub_resource;
00379     UINT sub_resource_idx;
00380     HRESULT hr;
00381 
00382     TRACE("iface %p, face %#x, level %u.\n", iface, face, level);
00383 
00384     wined3d_mutex_lock();
00385     sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
00386     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
00387         hr = D3DERR_INVALIDCALL;
00388     else
00389         hr = IDirect3DSurface9_UnlockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource));
00390     wined3d_mutex_unlock();
00391 
00392     return hr;
00393 }
00394 
00395 static HRESULT  WINAPI IDirect3DCubeTexture9Impl_AddDirtyRect(IDirect3DCubeTexture9 *iface,
00396         D3DCUBEMAP_FACES face, const RECT *dirty_rect)
00397 {
00398     IDirect3DCubeTexture9Impl *texture = impl_from_IDirect3DCubeTexture9(iface);
00399     HRESULT hr;
00400 
00401     TRACE("iface %p, face %#x, dirty_rect %s.\n",
00402             iface, face, wine_dbgstr_rect(dirty_rect));
00403 
00404     wined3d_mutex_lock();
00405     if (!dirty_rect)
00406         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
00407     else
00408     {
00409         struct wined3d_box dirty_region;
00410 
00411         dirty_region.left = dirty_rect->left;
00412         dirty_region.top = dirty_rect->top;
00413         dirty_region.right = dirty_rect->right;
00414         dirty_region.bottom = dirty_rect->bottom;
00415         dirty_region.front = 0;
00416         dirty_region.back = 1;
00417         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
00418     }
00419     wined3d_mutex_unlock();
00420 
00421     return hr;
00422 }
00423 
00424 static const IDirect3DCubeTexture9Vtbl Direct3DCubeTexture9_Vtbl =
00425 {
00426     /* IUnknown */
00427     IDirect3DCubeTexture9Impl_QueryInterface,
00428     IDirect3DCubeTexture9Impl_AddRef,
00429     IDirect3DCubeTexture9Impl_Release,
00430     /* IDirect3DResource9 */
00431     IDirect3DCubeTexture9Impl_GetDevice,
00432     IDirect3DCubeTexture9Impl_SetPrivateData,
00433     IDirect3DCubeTexture9Impl_GetPrivateData,
00434     IDirect3DCubeTexture9Impl_FreePrivateData,
00435     IDirect3DCubeTexture9Impl_SetPriority,
00436     IDirect3DCubeTexture9Impl_GetPriority,
00437     IDirect3DCubeTexture9Impl_PreLoad,
00438     IDirect3DCubeTexture9Impl_GetType,
00439     /* IDirect3DBaseTexture9 */
00440     IDirect3DCubeTexture9Impl_SetLOD,
00441     IDirect3DCubeTexture9Impl_GetLOD,
00442     IDirect3DCubeTexture9Impl_GetLevelCount,
00443     IDirect3DCubeTexture9Impl_SetAutoGenFilterType,
00444     IDirect3DCubeTexture9Impl_GetAutoGenFilterType,
00445     IDirect3DCubeTexture9Impl_GenerateMipSubLevels,
00446     IDirect3DCubeTexture9Impl_GetLevelDesc,
00447     IDirect3DCubeTexture9Impl_GetCubeMapSurface,
00448     IDirect3DCubeTexture9Impl_LockRect,
00449     IDirect3DCubeTexture9Impl_UnlockRect,
00450     IDirect3DCubeTexture9Impl_AddDirtyRect
00451 };
00452 
00453 static void STDMETHODCALLTYPE cubetexture_wined3d_object_destroyed(void *parent)
00454 {
00455     HeapFree(GetProcessHeap(), 0, parent);
00456 }
00457 
00458 static const struct wined3d_parent_ops d3d9_cubetexture_wined3d_parent_ops =
00459 {
00460     cubetexture_wined3d_object_destroyed,
00461 };
00462 
00463 HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Impl *device,
00464         UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
00465 {
00466     HRESULT hr;
00467 
00468     texture->IDirect3DCubeTexture9_iface.lpVtbl = &Direct3DCubeTexture9_Vtbl;
00469     texture->ref = 1;
00470 
00471     wined3d_mutex_lock();
00472     hr = wined3d_texture_create_cube(device->wined3d_device, edge_length,
00473             levels, usage, wined3dformat_from_d3dformat(format), pool, texture,
00474             &d3d9_cubetexture_wined3d_parent_ops, &texture->wined3d_texture);
00475     wined3d_mutex_unlock();
00476     if (FAILED(hr))
00477     {
00478         WARN("Failed to create wined3d cube texture, hr %#x.\n", hr);
00479         return hr;
00480     }
00481 
00482     texture->parentDevice = &device->IDirect3DDevice9Ex_iface;
00483     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
00484 
00485     return D3D_OK;
00486 }

Generated on Mon May 28 2012 04:21:34 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.