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