Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentexture.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
1.7.6.1
|