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

texture.c
Go to the documentation of this file.
00001 /*
00002  * IDirect3DTexture9 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 static inline IDirect3DTexture9Impl *impl_from_IDirect3DTexture9(IDirect3DTexture9 *iface)
00029 {
00030     return CONTAINING_RECORD(iface, IDirect3DTexture9Impl, IDirect3DTexture9_iface);
00031 }
00032 
00033 static HRESULT WINAPI IDirect3DTexture9Impl_QueryInterface(IDirect3DTexture9 *iface, REFIID riid,
00034         void **ppobj)
00035 {
00036     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00037 
00038     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
00039 
00040     if (IsEqualGUID(riid, &IID_IUnknown)
00041         || IsEqualGUID(riid, &IID_IDirect3DResource9)
00042         || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
00043         || IsEqualGUID(riid, &IID_IDirect3DTexture9)) {
00044         IDirect3DTexture9_AddRef(iface);
00045         *ppobj = This;
00046         return S_OK;
00047     }
00048 
00049     WARN("(%p)->(%s,%p) not found\n", This, debugstr_guid(riid), ppobj);
00050     *ppobj = NULL;
00051     return E_NOINTERFACE;
00052 }
00053 
00054 static ULONG WINAPI IDirect3DTexture9Impl_AddRef(IDirect3DTexture9 *iface)
00055 {
00056     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00057     ULONG ref = InterlockedIncrement(&This->ref);
00058 
00059     TRACE("%p increasing refcount to %u.\n", iface, ref);
00060 
00061     if (ref == 1)
00062     {
00063         IDirect3DDevice9Ex_AddRef(This->parentDevice);
00064         wined3d_mutex_lock();
00065         wined3d_texture_incref(This->wined3d_texture);
00066         wined3d_mutex_unlock();
00067     }
00068 
00069     return ref;
00070 }
00071 
00072 static ULONG WINAPI IDirect3DTexture9Impl_Release(IDirect3DTexture9 *iface)
00073 {
00074     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00075     ULONG ref = InterlockedDecrement(&This->ref);
00076 
00077     TRACE("%p decreasing refcount to %u.\n", iface, ref);
00078 
00079     if (ref == 0) {
00080         IDirect3DDevice9Ex *parentDevice = This->parentDevice;
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         IDirect3DDevice9Ex_Release(parentDevice);
00088     }
00089     return ref;
00090 }
00091 
00092 static HRESULT WINAPI IDirect3DTexture9Impl_GetDevice(IDirect3DTexture9 *iface,
00093         IDirect3DDevice9 **device)
00094 {
00095     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00096 
00097     TRACE("iface %p, device %p.\n", iface, device);
00098 
00099     *device = (IDirect3DDevice9 *)This->parentDevice;
00100     IDirect3DDevice9_AddRef(*device);
00101 
00102     TRACE("Returning device %p.\n", *device);
00103 
00104     return D3D_OK;
00105 }
00106 
00107 static HRESULT WINAPI IDirect3DTexture9Impl_SetPrivateData(IDirect3DTexture9 *iface,
00108         REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
00109 {
00110     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00111     struct wined3d_resource *resource;
00112     HRESULT hr;
00113 
00114     TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
00115             iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
00116 
00117     wined3d_mutex_lock();
00118     resource = wined3d_texture_get_resource(This->wined3d_texture);
00119     hr = wined3d_resource_set_private_data(resource, refguid, pData, SizeOfData, Flags);
00120     wined3d_mutex_unlock();
00121 
00122     return hr;
00123 }
00124 
00125 static HRESULT WINAPI IDirect3DTexture9Impl_GetPrivateData(IDirect3DTexture9 *iface,
00126         REFGUID refguid, void *pData, DWORD *pSizeOfData)
00127 {
00128     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00129     struct wined3d_resource *resource;
00130     HRESULT hr;
00131 
00132     TRACE("iface %p, guid %s, data %p, data_size %p.\n",
00133             iface, debugstr_guid(refguid), pData, pSizeOfData);
00134 
00135     wined3d_mutex_lock();
00136     resource = wined3d_texture_get_resource(This->wined3d_texture);
00137     hr = wined3d_resource_get_private_data(resource, refguid, pData, pSizeOfData);
00138     wined3d_mutex_unlock();
00139 
00140     return hr;
00141 }
00142 
00143 static HRESULT WINAPI IDirect3DTexture9Impl_FreePrivateData(IDirect3DTexture9 *iface,
00144         REFGUID refguid)
00145 {
00146     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00147     struct wined3d_resource *resource;
00148     HRESULT hr;
00149 
00150     TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
00151 
00152     wined3d_mutex_lock();
00153     resource = wined3d_texture_get_resource(This->wined3d_texture);
00154     hr = wined3d_resource_free_private_data(resource, refguid);
00155     wined3d_mutex_unlock();
00156 
00157     return hr;
00158 }
00159 
00160 static DWORD WINAPI IDirect3DTexture9Impl_SetPriority(IDirect3DTexture9 *iface, DWORD PriorityNew)
00161 {
00162     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_GetPriority(IDirect3DTexture9 *iface)
00175 {
00176     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_PreLoad(IDirect3DTexture9 *iface)
00189 {
00190     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_GetType(IDirect3DTexture9 *iface)
00200 {
00201     TRACE("iface %p.\n", iface);
00202 
00203     return D3DRTYPE_TEXTURE;
00204 }
00205 
00206 /* IDirect3DTexture9 IDirect3DBaseTexture9 Interface follow: */
00207 static DWORD WINAPI IDirect3DTexture9Impl_SetLOD(IDirect3DTexture9 *iface, DWORD LODNew)
00208 {
00209     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_GetLOD(IDirect3DTexture9 *iface)
00222 {
00223     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_GetLevelCount(IDirect3DTexture9 *iface)
00236 {
00237     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(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 IDirect3DTexture9Impl_SetAutoGenFilterType(IDirect3DTexture9 *iface,
00250         D3DTEXTUREFILTERTYPE FilterType)
00251 {
00252     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00253     HRESULT hr;
00254 
00255     TRACE("iface %p, filter_type %#x.\n", iface, FilterType);
00256 
00257     wined3d_mutex_lock();
00258     hr = wined3d_texture_set_autogen_filter_type(This->wined3d_texture, (enum wined3d_texture_filter_type)FilterType);
00259     wined3d_mutex_unlock();
00260 
00261     return hr;
00262 }
00263 
00264 static D3DTEXTUREFILTERTYPE WINAPI IDirect3DTexture9Impl_GetAutoGenFilterType(IDirect3DTexture9 *iface)
00265 {
00266     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00267     D3DTEXTUREFILTERTYPE ret;
00268 
00269     TRACE("iface %p.\n", iface);
00270 
00271     wined3d_mutex_lock();
00272     ret = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(This->wined3d_texture);
00273     wined3d_mutex_unlock();
00274 
00275     return ret;
00276 }
00277 
00278 static void WINAPI IDirect3DTexture9Impl_GenerateMipSubLevels(IDirect3DTexture9 *iface)
00279 {
00280     IDirect3DTexture9Impl *This = impl_from_IDirect3DTexture9(iface);
00281 
00282     TRACE("iface %p.\n", iface);
00283 
00284     wined3d_mutex_lock();
00285     wined3d_texture_generate_mipmaps(This->wined3d_texture);
00286     wined3d_mutex_unlock();
00287 }
00288 
00289 static HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(IDirect3DTexture9 *iface,
00290         UINT level, D3DSURFACE_DESC *desc)
00291 {
00292     IDirect3DTexture9Impl *texture = impl_from_IDirect3DTexture9(iface);
00293     struct wined3d_resource *sub_resource;
00294     HRESULT hr = D3D_OK;
00295 
00296     TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
00297 
00298     wined3d_mutex_lock();
00299     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00300         hr = D3DERR_INVALIDCALL;
00301     else
00302     {
00303         struct wined3d_resource_desc wined3d_desc;
00304 
00305         wined3d_resource_get_desc(sub_resource, &wined3d_desc);
00306         desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
00307         desc->Type = wined3d_desc.resource_type;
00308         desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
00309         desc->Pool = wined3d_desc.pool;
00310         desc->MultiSampleType = wined3d_desc.multisample_type;
00311         desc->MultiSampleQuality = wined3d_desc.multisample_quality;
00312         desc->Width = wined3d_desc.width;
00313         desc->Height = wined3d_desc.height;
00314     }
00315     wined3d_mutex_unlock();
00316 
00317     return hr;
00318 }
00319 
00320 static HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(IDirect3DTexture9 *iface,
00321         UINT level, IDirect3DSurface9 **surface)
00322 {
00323     IDirect3DTexture9Impl *texture = impl_from_IDirect3DTexture9(iface);
00324     struct wined3d_resource *sub_resource;
00325 
00326     TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
00327 
00328     wined3d_mutex_lock();
00329     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00330     {
00331         wined3d_mutex_unlock();
00332         return D3DERR_INVALIDCALL;
00333     }
00334 
00335     *surface = wined3d_resource_get_parent(sub_resource);
00336     IDirect3DSurface9_AddRef(*surface);
00337     wined3d_mutex_unlock();
00338 
00339     return D3D_OK;
00340 }
00341 
00342 static HRESULT WINAPI IDirect3DTexture9Impl_LockRect(IDirect3DTexture9 *iface,
00343         UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
00344 {
00345     IDirect3DTexture9Impl *texture = impl_from_IDirect3DTexture9(iface);
00346     struct wined3d_resource *sub_resource;
00347     HRESULT hr;
00348 
00349     TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
00350             iface, level, locked_rect, rect, flags);
00351 
00352     wined3d_mutex_lock();
00353     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00354         hr = D3DERR_INVALIDCALL;
00355     else
00356         hr = IDirect3DSurface9_LockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource),
00357                 locked_rect, rect, flags);
00358     wined3d_mutex_unlock();
00359 
00360     return hr;
00361 }
00362 
00363 static HRESULT WINAPI IDirect3DTexture9Impl_UnlockRect(IDirect3DTexture9 *iface, UINT level)
00364 {
00365     IDirect3DTexture9Impl *texture = impl_from_IDirect3DTexture9(iface);
00366     struct wined3d_resource *sub_resource;
00367     HRESULT hr;
00368 
00369     TRACE("iface %p, level %u.\n", iface, level);
00370 
00371     wined3d_mutex_lock();
00372     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00373         hr = D3DERR_INVALIDCALL;
00374     else
00375         hr = IDirect3DSurface9_UnlockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource));
00376     wined3d_mutex_unlock();
00377 
00378     return hr;
00379 }
00380 
00381 static HRESULT WINAPI IDirect3DTexture9Impl_AddDirtyRect(IDirect3DTexture9 *iface,
00382         const RECT *dirty_rect)
00383 {
00384     IDirect3DTexture9Impl *texture = impl_from_IDirect3DTexture9(iface);
00385     HRESULT hr;
00386 
00387     TRACE("iface %p, dirty_rect %s.\n",
00388             iface, wine_dbgstr_rect(dirty_rect));
00389 
00390     wined3d_mutex_lock();
00391     if (!dirty_rect)
00392         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
00393     else
00394     {
00395         struct wined3d_box dirty_region;
00396 
00397         dirty_region.left = dirty_rect->left;
00398         dirty_region.top = dirty_rect->top;
00399         dirty_region.right = dirty_rect->right;
00400         dirty_region.bottom = dirty_rect->bottom;
00401         dirty_region.front = 0;
00402         dirty_region.back = 1;
00403         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
00404     }
00405     wined3d_mutex_unlock();
00406 
00407     return hr;
00408 }
00409 
00410 static const IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl =
00411 {
00412     /* IUnknown */
00413     IDirect3DTexture9Impl_QueryInterface,
00414     IDirect3DTexture9Impl_AddRef,
00415     IDirect3DTexture9Impl_Release,
00416      /* IDirect3DResource9 */
00417     IDirect3DTexture9Impl_GetDevice,
00418     IDirect3DTexture9Impl_SetPrivateData,
00419     IDirect3DTexture9Impl_GetPrivateData,
00420     IDirect3DTexture9Impl_FreePrivateData,
00421     IDirect3DTexture9Impl_SetPriority,
00422     IDirect3DTexture9Impl_GetPriority,
00423     IDirect3DTexture9Impl_PreLoad,
00424     IDirect3DTexture9Impl_GetType,
00425     /* IDirect3dBaseTexture9 */
00426     IDirect3DTexture9Impl_SetLOD,
00427     IDirect3DTexture9Impl_GetLOD,
00428     IDirect3DTexture9Impl_GetLevelCount,
00429     IDirect3DTexture9Impl_SetAutoGenFilterType,
00430     IDirect3DTexture9Impl_GetAutoGenFilterType,
00431     IDirect3DTexture9Impl_GenerateMipSubLevels,
00432     /* IDirect3DTexture9 */
00433     IDirect3DTexture9Impl_GetLevelDesc,
00434     IDirect3DTexture9Impl_GetSurfaceLevel,
00435     IDirect3DTexture9Impl_LockRect,
00436     IDirect3DTexture9Impl_UnlockRect,
00437     IDirect3DTexture9Impl_AddDirtyRect
00438 };
00439 
00440 static void STDMETHODCALLTYPE d3d9_texture_wined3d_object_destroyed(void *parent)
00441 {
00442     HeapFree(GetProcessHeap(), 0, parent);
00443 }
00444 
00445 static const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops =
00446 {
00447     d3d9_texture_wined3d_object_destroyed,
00448 };
00449 
00450 HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device,
00451         UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
00452 {
00453     HRESULT hr;
00454 
00455     texture->IDirect3DTexture9_iface.lpVtbl = &Direct3DTexture9_Vtbl;
00456     texture->ref = 1;
00457 
00458     wined3d_mutex_lock();
00459     hr = wined3d_texture_create_2d(device->wined3d_device, width, height, levels,
00460             usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
00461             texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
00462     wined3d_mutex_unlock();
00463     if (FAILED(hr))
00464     {
00465         WARN("Failed to create wined3d texture, hr %#x.\n", hr);
00466         return hr;
00467     }
00468 
00469     texture->parentDevice = &device->IDirect3DDevice9Ex_iface;
00470     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
00471 
00472     return D3D_OK;
00473 }

Generated on Sun May 27 2012 04:22:08 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.