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  * IDirect3DTexture8 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 /* IDirect3DTexture8 IUnknown parts follow: */
00027 static inline IDirect3DTexture8Impl *impl_from_IDirect3DTexture8(IDirect3DTexture8 *iface)
00028 {
00029     return CONTAINING_RECORD(iface, IDirect3DTexture8Impl, IDirect3DTexture8_iface);
00030 }
00031 
00032 static HRESULT WINAPI IDirect3DTexture8Impl_QueryInterface(IDirect3DTexture8 *iface, REFIID riid,
00033         void **ppobj)
00034 {
00035     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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_IDirect3DResource8)
00041         || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
00042         || IsEqualGUID(riid, &IID_IDirect3DTexture8)) {
00043         IUnknown_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 IDirect3DTexture8Impl_AddRef(IDirect3DTexture8 *iface)
00054 {
00055     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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         IDirect3DDevice8_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 IDirect3DTexture8Impl_Release(IDirect3DTexture8 *iface)
00072 {
00073     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
00074     ULONG ref = InterlockedDecrement(&This->ref);
00075 
00076     TRACE("%p decreasing refcount to %u.\n", iface, ref);
00077 
00078     if (ref == 0) {
00079         IDirect3DDevice8 *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         IDirect3DDevice8_Release(parentDevice);
00087     }
00088     return ref;
00089 }
00090 
00091 /* IDirect3DTexture8 IDirect3DResource8 Interface follow: */
00092 static HRESULT WINAPI IDirect3DTexture8Impl_GetDevice(IDirect3DTexture8 *iface,
00093         IDirect3DDevice8 **device)
00094 {
00095     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(iface);
00096 
00097     TRACE("iface %p, device %p.\n", iface, device);
00098 
00099     *device = This->parentDevice;
00100     IDirect3DDevice8_AddRef(*device);
00101 
00102     TRACE("Returning device %p.\n", *device);
00103 
00104     return D3D_OK;
00105 }
00106 
00107 static HRESULT WINAPI IDirect3DTexture8Impl_SetPrivateData(IDirect3DTexture8 *iface,
00108         REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
00109 {
00110     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetPrivateData(IDirect3DTexture8 *iface,
00126         REFGUID refguid, void *pData, DWORD *pSizeOfData)
00127 {
00128     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_FreePrivateData(IDirect3DTexture8 *iface,
00144         REFGUID refguid)
00145 {
00146     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_SetPriority(IDirect3DTexture8 *iface, DWORD PriorityNew)
00161 {
00162     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetPriority(IDirect3DTexture8 *iface)
00175 {
00176     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_PreLoad(IDirect3DTexture8 *iface)
00189 {
00190     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetType(IDirect3DTexture8 *iface)
00200 {
00201     TRACE("iface %p.\n", iface);
00202 
00203     return D3DRTYPE_TEXTURE;
00204 }
00205 
00206 /* IDirect3DTexture8 IDirect3DBaseTexture8 Interface follow: */
00207 static DWORD WINAPI IDirect3DTexture8Impl_SetLOD(IDirect3DTexture8 *iface, DWORD LODNew)
00208 {
00209     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetLOD(IDirect3DTexture8 *iface)
00222 {
00223     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetLevelCount(IDirect3DTexture8 *iface)
00236 {
00237     IDirect3DTexture8Impl *This = impl_from_IDirect3DTexture8(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 IDirect3DTexture8Impl_GetLevelDesc(IDirect3DTexture8 *iface,
00250         UINT level, D3DSURFACE_DESC *desc)
00251 {
00252     IDirect3DTexture8Impl *texture = impl_from_IDirect3DTexture8(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->MultiSampleType = wined3d_desc.multisample_type;
00272         desc->Width = wined3d_desc.width;
00273         desc->Height = wined3d_desc.height;
00274     }
00275     wined3d_mutex_unlock();
00276 
00277     return hr;
00278 }
00279 
00280 static HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(IDirect3DTexture8 *iface,
00281         UINT level, IDirect3DSurface8 **surface)
00282 {
00283     IDirect3DTexture8Impl *texture = impl_from_IDirect3DTexture8(iface);
00284     struct wined3d_resource *sub_resource;
00285 
00286     TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
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     *surface = wined3d_resource_get_parent(sub_resource);
00296     IDirect3DSurface8_AddRef(*surface);
00297     wined3d_mutex_unlock();
00298 
00299     return D3D_OK;
00300 }
00301 
00302 static HRESULT WINAPI IDirect3DTexture8Impl_LockRect(IDirect3DTexture8 *iface, UINT level,
00303         D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
00304 {
00305     IDirect3DTexture8Impl *texture = impl_from_IDirect3DTexture8(iface);
00306     struct wined3d_resource *sub_resource;
00307     HRESULT hr;
00308 
00309     TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
00310             iface, level, locked_rect, rect, 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 = IDirect3DSurface8_LockRect((IDirect3DSurface8 *)wined3d_resource_get_parent(sub_resource),
00317                 locked_rect, rect, flags);
00318     wined3d_mutex_unlock();
00319 
00320     return hr;
00321 }
00322 
00323 static HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(IDirect3DTexture8 *iface, UINT level)
00324 {
00325     IDirect3DTexture8Impl *texture = impl_from_IDirect3DTexture8(iface);
00326     struct wined3d_resource *sub_resource;
00327     HRESULT hr;
00328 
00329     TRACE("iface %p, level %u.\n", iface, level);
00330 
00331     wined3d_mutex_lock();
00332     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
00333         hr = D3DERR_INVALIDCALL;
00334     else
00335         hr = IDirect3DSurface8_UnlockRect((IDirect3DSurface8 *)wined3d_resource_get_parent(sub_resource));
00336     wined3d_mutex_unlock();
00337 
00338     return hr;
00339 }
00340 
00341 static HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(IDirect3DTexture8 *iface, const RECT *dirty_rect)
00342 {
00343     IDirect3DTexture8Impl *texture = impl_from_IDirect3DTexture8(iface);
00344     HRESULT hr;
00345 
00346     TRACE("iface %p, dirty_rect %s.\n",
00347             iface, wine_dbgstr_rect(dirty_rect));
00348 
00349     wined3d_mutex_lock();
00350     if (!dirty_rect)
00351         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
00352     else
00353     {
00354         struct wined3d_box dirty_region;
00355 
00356         dirty_region.left = dirty_rect->left;
00357         dirty_region.top = dirty_rect->top;
00358         dirty_region.right = dirty_rect->right;
00359         dirty_region.bottom = dirty_rect->bottom;
00360         dirty_region.front = 0;
00361         dirty_region.back = 1;
00362         hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
00363     }
00364     wined3d_mutex_unlock();
00365 
00366     return hr;
00367 }
00368 
00369 static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl =
00370 {
00371     /* IUnknown */
00372     IDirect3DTexture8Impl_QueryInterface,
00373     IDirect3DTexture8Impl_AddRef,
00374     IDirect3DTexture8Impl_Release,
00375      /* IDirect3DResource8 */
00376     IDirect3DTexture8Impl_GetDevice,
00377     IDirect3DTexture8Impl_SetPrivateData,
00378     IDirect3DTexture8Impl_GetPrivateData,
00379     IDirect3DTexture8Impl_FreePrivateData,
00380     IDirect3DTexture8Impl_SetPriority,
00381     IDirect3DTexture8Impl_GetPriority,
00382     IDirect3DTexture8Impl_PreLoad,
00383     IDirect3DTexture8Impl_GetType,
00384     /* IDirect3dBaseTexture8 */
00385     IDirect3DTexture8Impl_SetLOD,
00386     IDirect3DTexture8Impl_GetLOD,
00387     IDirect3DTexture8Impl_GetLevelCount,
00388     /* IDirect3DTexture8 */
00389     IDirect3DTexture8Impl_GetLevelDesc,
00390     IDirect3DTexture8Impl_GetSurfaceLevel,
00391     IDirect3DTexture8Impl_LockRect,
00392     IDirect3DTexture8Impl_UnlockRect,
00393     IDirect3DTexture8Impl_AddDirtyRect
00394 };
00395 
00396 static void STDMETHODCALLTYPE d3d8_texture_wined3d_object_destroyed(void *parent)
00397 {
00398     HeapFree(GetProcessHeap(), 0, parent);
00399 }
00400 
00401 static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops =
00402 {
00403     d3d8_texture_wined3d_object_destroyed,
00404 };
00405 
00406 HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *device,
00407         UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
00408 {
00409     HRESULT hr;
00410 
00411     texture->IDirect3DTexture8_iface.lpVtbl = &Direct3DTexture8_Vtbl;
00412     texture->ref = 1;
00413 
00414     wined3d_mutex_lock();
00415     hr = wined3d_texture_create_2d(device->wined3d_device, width, height, levels,
00416             usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
00417             texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
00418     wined3d_mutex_unlock();
00419     if (FAILED(hr))
00420     {
00421         WARN("Failed to create wined3d texture, hr %#x.\n", hr);
00422         return hr;
00423     }
00424 
00425     texture->parentDevice = &device->IDirect3DDevice8_iface;
00426     IDirect3DDevice8_AddRef(texture->parentDevice);
00427 
00428     return D3D_OK;
00429 }

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.