PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/dlls/d3d8/volumetexture.c

https://github.com/wesgarner/wine
C | 376 lines | 260 code | 88 blank | 28 comment | 12 complexity | 563803e155dbc1b5624dcae1e3ac507f MD5 | raw file
  1. /*
  2. * IDirect3DVolumeTexture8 implementation
  3. *
  4. * Copyright 2005 Oliver Stieber
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  19. */
  20. #include "config.h"
  21. #include "d3d8_private.h"
  22. WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
  23. /* IDirect3DVolumeTexture8 IUnknown parts follow: */
  24. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_QueryInterface(LPDIRECT3DVOLUMETEXTURE8 iface, REFIID riid, LPVOID *ppobj) {
  25. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  26. TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
  27. if (IsEqualGUID(riid, &IID_IUnknown)
  28. || IsEqualGUID(riid, &IID_IDirect3DResource8)
  29. || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
  30. || IsEqualGUID(riid, &IID_IDirect3DVolumeTexture8)) {
  31. IUnknown_AddRef(iface);
  32. *ppobj = This;
  33. return S_OK;
  34. }
  35. WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
  36. *ppobj = NULL;
  37. return E_NOINTERFACE;
  38. }
  39. static ULONG WINAPI IDirect3DVolumeTexture8Impl_AddRef(LPDIRECT3DVOLUMETEXTURE8 iface) {
  40. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  41. ULONG ref = InterlockedIncrement(&This->ref);
  42. TRACE("%p increasing refcount to %u.\n", iface, ref);
  43. if (ref == 1)
  44. {
  45. IDirect3DDevice8_AddRef(This->parentDevice);
  46. wined3d_mutex_lock();
  47. IWineD3DVolumeTexture_AddRef(This->wineD3DVolumeTexture);
  48. wined3d_mutex_unlock();
  49. }
  50. return ref;
  51. }
  52. static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(LPDIRECT3DVOLUMETEXTURE8 iface) {
  53. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  54. ULONG ref = InterlockedDecrement(&This->ref);
  55. TRACE("%p decreasing refcount to %u.\n", iface, ref);
  56. if (ref == 0) {
  57. IDirect3DDevice8 *parentDevice = This->parentDevice;
  58. wined3d_mutex_lock();
  59. IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture);
  60. wined3d_mutex_unlock();
  61. /* Release the device last, as it may cause the device to be destroyed. */
  62. IDirect3DDevice8_Release(parentDevice);
  63. }
  64. return ref;
  65. }
  66. /* IDirect3DVolumeTexture8 IDirect3DResource8 Interface follow: */
  67. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetDevice(IDirect3DVolumeTexture8 *iface, IDirect3DDevice8 **device)
  68. {
  69. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  70. TRACE("iface %p, device %p.\n", iface, device);
  71. *device = (IDirect3DDevice8 *)This->parentDevice;
  72. IDirect3DDevice8_AddRef(*device);
  73. TRACE("Returning device %p.\n", *device);
  74. return D3D_OK;
  75. }
  76. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(LPDIRECT3DVOLUMETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
  77. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  78. HRESULT hr;
  79. TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
  80. iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
  81. wined3d_mutex_lock();
  82. hr = IWineD3DVolumeTexture_SetPrivateData(This->wineD3DVolumeTexture, refguid, pData, SizeOfData, Flags);
  83. wined3d_mutex_unlock();
  84. return hr;
  85. }
  86. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetPrivateData(LPDIRECT3DVOLUMETEXTURE8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) {
  87. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  88. HRESULT hr;
  89. TRACE("iface %p, guid %s, data %p, data_size %p.\n",
  90. iface, debugstr_guid(refguid), pData, pSizeOfData);
  91. wined3d_mutex_lock();
  92. hr = IWineD3DVolumeTexture_GetPrivateData(This->wineD3DVolumeTexture, refguid, pData, pSizeOfData);
  93. wined3d_mutex_unlock();
  94. return hr;
  95. }
  96. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_FreePrivateData(LPDIRECT3DVOLUMETEXTURE8 iface, REFGUID refguid) {
  97. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  98. HRESULT hr;
  99. TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
  100. wined3d_mutex_lock();
  101. hr = IWineD3DVolumeTexture_FreePrivateData(This->wineD3DVolumeTexture, refguid);
  102. wined3d_mutex_unlock();
  103. return hr;
  104. }
  105. static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetPriority(LPDIRECT3DVOLUMETEXTURE8 iface, DWORD PriorityNew) {
  106. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  107. DWORD ret;
  108. TRACE("iface %p, priority %u.\n", iface, PriorityNew);
  109. wined3d_mutex_lock();
  110. ret = IWineD3DVolumeTexture_SetPriority(This->wineD3DVolumeTexture, PriorityNew);
  111. wined3d_mutex_unlock();
  112. return ret;
  113. }
  114. static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetPriority(LPDIRECT3DVOLUMETEXTURE8 iface) {
  115. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  116. DWORD ret;
  117. TRACE("iface %p.\n", iface);
  118. wined3d_mutex_lock();
  119. ret = IWineD3DVolumeTexture_GetPriority(This->wineD3DVolumeTexture);
  120. wined3d_mutex_unlock();
  121. return ret;
  122. }
  123. static void WINAPI IDirect3DVolumeTexture8Impl_PreLoad(LPDIRECT3DVOLUMETEXTURE8 iface) {
  124. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  125. TRACE("iface %p.\n", iface);
  126. wined3d_mutex_lock();
  127. IWineD3DVolumeTexture_PreLoad(This->wineD3DVolumeTexture);
  128. wined3d_mutex_unlock();
  129. }
  130. static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(LPDIRECT3DVOLUMETEXTURE8 iface) {
  131. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  132. D3DRESOURCETYPE type;
  133. TRACE("iface %p.\n", iface);
  134. wined3d_mutex_lock();
  135. type = IWineD3DVolumeTexture_GetType(This->wineD3DVolumeTexture);
  136. wined3d_mutex_unlock();
  137. return type;
  138. }
  139. /* IDirect3DVolumeTexture8 IDirect3DBaseTexture8 Interface follow: */
  140. static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetLOD(LPDIRECT3DVOLUMETEXTURE8 iface, DWORD LODNew) {
  141. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  142. DWORD ret;
  143. TRACE("iface %p, lod %u.\n", iface, LODNew);
  144. wined3d_mutex_lock();
  145. ret = IWineD3DVolumeTexture_SetLOD(This->wineD3DVolumeTexture, LODNew);
  146. wined3d_mutex_unlock();
  147. return ret;
  148. }
  149. static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLOD(LPDIRECT3DVOLUMETEXTURE8 iface) {
  150. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  151. DWORD ret;
  152. TRACE("iface %p.\n", iface);
  153. wined3d_mutex_lock();
  154. ret = IWineD3DVolumeTexture_GetLOD(This->wineD3DVolumeTexture);
  155. wined3d_mutex_unlock();
  156. return ret;
  157. }
  158. static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(LPDIRECT3DVOLUMETEXTURE8 iface) {
  159. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  160. DWORD ret;
  161. TRACE("iface %p.\n", iface);
  162. wined3d_mutex_lock();
  163. ret = IWineD3DVolumeTexture_GetLevelCount(This->wineD3DVolumeTexture);
  164. wined3d_mutex_unlock();
  165. return ret;
  166. }
  167. /* IDirect3DVolumeTexture8 Interface follow: */
  168. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DVOLUME_DESC* pDesc) {
  169. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  170. WINED3DVOLUME_DESC wined3ddesc;
  171. HRESULT hr;
  172. TRACE("iface %p, level %u, desc %p.\n", iface, Level, pDesc);
  173. wined3d_mutex_lock();
  174. hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc);
  175. wined3d_mutex_unlock();
  176. if (SUCCEEDED(hr))
  177. {
  178. pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
  179. pDesc->Type = wined3ddesc.Type;
  180. pDesc->Usage = wined3ddesc.Usage;
  181. pDesc->Pool = wined3ddesc.Pool;
  182. pDesc->Size = wined3ddesc.Size;
  183. pDesc->Width = wined3ddesc.Width;
  184. pDesc->Height = wined3ddesc.Height;
  185. pDesc->Depth = wined3ddesc.Depth;
  186. }
  187. return hr;
  188. }
  189. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(IDirect3DVolumeTexture8 *iface,
  190. UINT Level, IDirect3DVolume8 **ppVolumeLevel)
  191. {
  192. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  193. IWineD3DVolume *myVolume = NULL;
  194. HRESULT hr;
  195. TRACE("iface %p, level %u, volume %p.\n", iface, Level, ppVolumeLevel);
  196. wined3d_mutex_lock();
  197. hr = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume);
  198. if (SUCCEEDED(hr) && ppVolumeLevel)
  199. {
  200. *ppVolumeLevel = IWineD3DVolumeTexture_GetParent(myVolume);
  201. IDirect3DVolume8_AddRef(*ppVolumeLevel);
  202. IWineD3DVolumeTexture_Release(myVolume);
  203. }
  204. wined3d_mutex_unlock();
  205. return hr;
  206. }
  207. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DLOCKED_BOX *pLockedVolume, CONST D3DBOX *pBox, DWORD Flags) {
  208. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  209. HRESULT hr;
  210. TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
  211. iface, Level, pLockedVolume, pBox, Flags);
  212. wined3d_mutex_lock();
  213. hr = IWineD3DVolumeTexture_LockBox(This->wineD3DVolumeTexture, Level, (WINED3DLOCKED_BOX *) pLockedVolume, (CONST WINED3DBOX *) pBox, Flags);
  214. wined3d_mutex_unlock();
  215. return hr;
  216. }
  217. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level) {
  218. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  219. HRESULT hr;
  220. TRACE("iface %p, level %u.\n", iface, Level);
  221. wined3d_mutex_lock();
  222. hr = IWineD3DVolumeTexture_UnlockBox(This->wineD3DVolumeTexture, Level);
  223. wined3d_mutex_unlock();
  224. return hr;
  225. }
  226. static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX *pDirtyBox) {
  227. IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
  228. HRESULT hr;
  229. TRACE("iface %p, dirty_box %p.\n", iface, pDirtyBox);
  230. wined3d_mutex_lock();
  231. hr = IWineD3DVolumeTexture_AddDirtyBox(This->wineD3DVolumeTexture, (CONST WINED3DBOX *) pDirtyBox);
  232. wined3d_mutex_unlock();
  233. return hr;
  234. }
  235. static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl =
  236. {
  237. /* IUnknown */
  238. IDirect3DVolumeTexture8Impl_QueryInterface,
  239. IDirect3DVolumeTexture8Impl_AddRef,
  240. IDirect3DVolumeTexture8Impl_Release,
  241. /* IDirect3DResource8 */
  242. IDirect3DVolumeTexture8Impl_GetDevice,
  243. IDirect3DVolumeTexture8Impl_SetPrivateData,
  244. IDirect3DVolumeTexture8Impl_GetPrivateData,
  245. IDirect3DVolumeTexture8Impl_FreePrivateData,
  246. IDirect3DVolumeTexture8Impl_SetPriority,
  247. IDirect3DVolumeTexture8Impl_GetPriority,
  248. IDirect3DVolumeTexture8Impl_PreLoad,
  249. IDirect3DVolumeTexture8Impl_GetType,
  250. /* IDirect3DBaseTexture8 */
  251. IDirect3DVolumeTexture8Impl_SetLOD,
  252. IDirect3DVolumeTexture8Impl_GetLOD,
  253. IDirect3DVolumeTexture8Impl_GetLevelCount,
  254. /* IDirect3DVolumeTexture8 */
  255. IDirect3DVolumeTexture8Impl_GetLevelDesc,
  256. IDirect3DVolumeTexture8Impl_GetVolumeLevel,
  257. IDirect3DVolumeTexture8Impl_LockBox,
  258. IDirect3DVolumeTexture8Impl_UnlockBox,
  259. IDirect3DVolumeTexture8Impl_AddDirtyBox
  260. };
  261. static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent)
  262. {
  263. HeapFree(GetProcessHeap(), 0, parent);
  264. }
  265. static const struct wined3d_parent_ops d3d8_volumetexture_wined3d_parent_ops =
  266. {
  267. volumetexture_wined3d_object_destroyed,
  268. };
  269. HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device,
  270. UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
  271. {
  272. HRESULT hr;
  273. texture->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
  274. texture->ref = 1;
  275. wined3d_mutex_lock();
  276. hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels,
  277. usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture,
  278. &d3d8_volumetexture_wined3d_parent_ops, &texture->wineD3DVolumeTexture);
  279. wined3d_mutex_unlock();
  280. if (FAILED(hr))
  281. {
  282. WARN("Failed to create wined3d volume texture, hr %#x.\n", hr);
  283. return hr;
  284. }
  285. texture->parentDevice = (IDirect3DDevice8 *)device;
  286. IDirect3DDevice8_AddRef(texture->parentDevice);
  287. return D3D_OK;
  288. }