Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

412 lines
11 KiB

  1. /*==========================================================================;
  2. *
  3. * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved.
  4. *
  5. * File: buffer.c
  6. * Content: Direct3DExecuteBuffer implementation
  7. *@@BEGIN_MSINTERNAL
  8. *
  9. * History:
  10. * Date By Reason
  11. * ==== == ======
  12. * 10/12/95 stevela Initial rev with this header.
  13. *@@END_MSINTERNAL
  14. *
  15. ***************************************************************************/
  16. #include "pch.cpp"
  17. #pragma hdrstop
  18. HRESULT hookBufferToDevice(LPDIRECT3DDEVICEI lpDevI,
  19. LPDIRECT3DEXECUTEBUFFERI lpD3DBuf)
  20. {
  21. LIST_INSERT_ROOT(&lpDevI->buffers, lpD3DBuf, list);
  22. lpD3DBuf->lpDevI = lpDevI;
  23. return (D3D_OK);
  24. }
  25. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::Initialize(LPDIRECT3DDEVICE lpD3DDevice, LPD3DEXECUTEBUFFERDESC lpDesc)
  26. {
  27. return DDERR_ALREADYINITIALIZED;
  28. }
  29. /*
  30. * Create the Buffer
  31. */
  32. #undef DPF_MODNAME
  33. #define DPF_MODNAME "Direct3DDevice::CreateExecuteBuffer"
  34. HRESULT D3DAPI DIRECT3DDEVICEI::CreateExecuteBuffer(LPD3DEXECUTEBUFFERDESC lpDesc,
  35. LPDIRECT3DEXECUTEBUFFER* lplpBuffer,
  36. IUnknown* pUnkOuter)
  37. {
  38. LPDIRECT3DEXECUTEBUFFERI lpBuffer;
  39. HRESULT ret;
  40. D3DEXECUTEBUFFERDESC debDesc;
  41. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  42. // Release in the destructor
  43. /*
  44. * validate parms
  45. */
  46. if (!VALID_DIRECT3DDEVICE3_PTR(this)) {
  47. D3D_ERR( "Invalid Direct3DDevice pointer" );
  48. return DDERR_INVALIDOBJECT;
  49. }
  50. if (!VALID_D3DEXECUTEBUFFERDESC_PTR(lpDesc)) {
  51. D3D_ERR( "Invalid D3DEXECUTEBUFFERDESC pointer" );
  52. return DDERR_INVALIDPARAMS;
  53. }
  54. if (!VALID_OUTPTR(lplpBuffer)) {
  55. D3D_ERR( "Invalid ptr to the buffer pointer" );
  56. return DDERR_INVALIDPARAMS;
  57. }
  58. if (pUnkOuter != NULL) {
  59. return CLASS_E_NOAGGREGATION;
  60. }
  61. *lplpBuffer = NULL;
  62. ret = D3D_OK;
  63. debDesc = *lpDesc;
  64. /*
  65. * We need size of the buffer, and optionally some stuff indicating
  66. * where the app would like the memory to be - system or card.
  67. */
  68. if ((!debDesc.dwFlags) & D3DDEB_BUFSIZE) {
  69. D3D_ERR("D3DDEB_BUFSIZE flag not set");
  70. return (DDERR_INVALIDPARAMS);
  71. }
  72. /*
  73. * Zero is an invalid execute buffer size.
  74. */
  75. if (debDesc.dwBufferSize == 0) {
  76. D3D_ERR("dwBufferSize = 0, zero sized execute buffers are illegal");
  77. return (DDERR_INVALIDPARAMS);
  78. }
  79. /*
  80. * Check the requested size.
  81. * If it's larger than allowed, error.
  82. *
  83. * The HEL always has the correct maximum value.
  84. */
  85. if (this->d3dHELDevDesc.dwMaxBufferSize) {
  86. /* We have a size for maximum */
  87. if (debDesc.dwBufferSize > this->d3dHELDevDesc.dwMaxBufferSize) {
  88. DPF(0,"(ERROR) Direct3DDevice::CreateExecuteBuffer: requested size is too large. %d > %d",
  89. debDesc.dwBufferSize, this->d3dHELDevDesc.dwMaxBufferSize);
  90. return (DDERR_INVALIDPARAMS);
  91. }
  92. }
  93. lpBuffer = static_cast<LPDIRECT3DEXECUTEBUFFERI>(new DIRECT3DEXECUTEBUFFERI());
  94. if (!lpBuffer) {
  95. D3D_ERR("Out of memory allocating execute-buffer");
  96. return (DDERR_OUTOFMEMORY);
  97. }
  98. /*
  99. * Allocated memory for the buffer
  100. */
  101. {
  102. LPDIRECTDRAWSURFACE dummy;
  103. if ((ret = D3DHAL_AllocateBuffer(this, &lpBuffer->hBuf,
  104. &debDesc,
  105. &dummy)) != DD_OK)
  106. {
  107. D3D_ERR("Out of memory allocating internal buffer description");
  108. delete lpBuffer;
  109. return ret;
  110. }
  111. }
  112. /*
  113. * Put this device in the list of those owned by the
  114. * Direct3DDevice object
  115. */
  116. ret = hookBufferToDevice(this, lpBuffer);
  117. if (ret != D3D_OK) {
  118. D3D_ERR("Failed to associate buffer with device");
  119. delete lpBuffer;
  120. return (ret);
  121. }
  122. *lplpBuffer = static_cast<LPDIRECT3DEXECUTEBUFFER>(lpBuffer);
  123. return (D3D_OK);
  124. }
  125. DIRECT3DEXECUTEBUFFERI::DIRECT3DEXECUTEBUFFERI()
  126. {
  127. /*
  128. * setup the object
  129. */
  130. pid = 0;
  131. memset(&debDesc,0,sizeof(D3DEXECUTEBUFFERDESC));
  132. memset(&exData, 0, sizeof(D3DEXECUTEDATA));
  133. locked = false;
  134. memset(&hBuf, 0, sizeof(D3DI_BUFFERHANDLE));
  135. refCnt = 1;
  136. }
  137. #undef DPF_MODNAME
  138. #define DPF_MODNAME "Direct3DExecuteBuffer::Lock"
  139. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::Lock(LPD3DEXECUTEBUFFERDESC lpDesc)
  140. {
  141. D3DEXECUTEBUFFERDESC debDesc;
  142. HRESULT ret;
  143. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  144. // Release in the destructor
  145. /*
  146. * validate parms
  147. */
  148. TRY
  149. {
  150. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  151. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  152. return DDERR_INVALIDOBJECT;
  153. }
  154. if (!VALID_D3DEXECUTEBUFFERDESC_PTR(lpDesc)) {
  155. D3D_ERR( "Invalid D3DEXECUTEBUFFERDESC pointer" );
  156. return DDERR_INVALIDPARAMS;
  157. }
  158. }
  159. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  160. {
  161. D3D_ERR( "Exception encountered validating parameters" );
  162. return DDERR_INVALIDPARAMS;
  163. }
  164. ret = D3D_OK;
  165. if (this->locked) {
  166. D3D_ERR("buffer already locked");
  167. return (D3DERR_EXECUTE_LOCKED);
  168. }
  169. debDesc = *lpDesc;
  170. this->locked = 1;
  171. this->pid = GetCurrentProcessId();
  172. {
  173. LPDIRECTDRAWSURFACE dummy;
  174. if ((ret = D3DHAL_LockBuffer(this->lpDevI, this->hBuf, &debDesc, &dummy)) != DD_OK)
  175. {
  176. D3D_ERR("Failed to lock buffer");
  177. this->locked = 0;
  178. return ret;
  179. }
  180. }
  181. *lpDesc = debDesc;
  182. return (ret);
  183. }
  184. #undef DPF_MODNAME
  185. #define DPF_MODNAME "Direct3DExecuteBuffer::Unlock"
  186. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::Unlock()
  187. {
  188. DWORD pid;
  189. HRESULT ret;
  190. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  191. // Release in the destructor
  192. /*
  193. * validate parms
  194. */
  195. TRY
  196. {
  197. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  198. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  199. return DDERR_INVALIDOBJECT;
  200. }
  201. }
  202. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  203. {
  204. D3D_ERR( "Exception encountered validating parameters" );
  205. return DDERR_INVALIDPARAMS;
  206. }
  207. ret = D3D_OK;
  208. if (!this->locked)
  209. {
  210. D3D_ERR("buffer not locked");
  211. return (D3DERR_EXECUTE_NOT_LOCKED);
  212. }
  213. #ifdef XWIN_SUPPORT
  214. pid = getpid();
  215. #else
  216. pid = GetCurrentProcessId();
  217. #endif
  218. if (pid != this->pid)
  219. {
  220. /* Unlocking process didn't lock it */
  221. D3D_ERR("Unlocking process didn't lock it");
  222. return (DDERR_INVALIDPARAMS);
  223. }
  224. if ((ret = D3DHAL_UnlockBuffer(this->lpDevI, this->hBuf)) != DD_OK)
  225. {
  226. D3D_ERR("Failed to unlock buffer");
  227. this->locked = 0;
  228. return ret;
  229. }
  230. this->locked = 0;
  231. return (ret);
  232. }
  233. #undef DPF_MODNAME
  234. #define DPF_MODNAME "Direct3DExecuteBuffer::SetExecuteData"
  235. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::SetExecuteData(LPD3DEXECUTEDATA lpData)
  236. {
  237. HRESULT ret;
  238. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  239. // Release in the destructor
  240. /*
  241. * validate parms
  242. */
  243. TRY
  244. {
  245. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  246. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  247. return DDERR_INVALIDOBJECT;
  248. }
  249. if (!VALID_D3DEXECUTEDATA_PTR(lpData)) {
  250. D3D_ERR( "Invalid D3DEXECUTEDATA pointer" );
  251. return DDERR_INVALIDPARAMS;
  252. }
  253. }
  254. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  255. {
  256. D3D_ERR( "Exception encountered validating parameters" );
  257. return DDERR_INVALIDPARAMS;
  258. }
  259. ret = D3D_OK;
  260. this->exData = *lpData;
  261. return (ret);
  262. }
  263. #undef DPF_MODNAME
  264. #define DPF_MODNAME "Direct3DExecuteBuffer::GetExecuteData"
  265. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::GetExecuteData(LPD3DEXECUTEDATA lpData)
  266. {
  267. HRESULT ret;
  268. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  269. // Release in the destructor
  270. /*
  271. * validate parms
  272. */
  273. TRY
  274. {
  275. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  276. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  277. return DDERR_INVALIDOBJECT;
  278. }
  279. if (!lpData) {
  280. D3D_ERR( "Null D3DExecuteData pointer" );
  281. return DDERR_INVALIDPARAMS;
  282. }
  283. }
  284. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  285. {
  286. D3D_ERR( "Exception encountered validating parameters" );
  287. return DDERR_INVALIDPARAMS;
  288. }
  289. ret = D3D_OK;
  290. *lpData = this->exData;
  291. return (ret);
  292. }
  293. #undef DPF_MODNAME
  294. #define DPF_MODNAME "Direct3DExecuteBuffer::Validate"
  295. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::Validate(LPDWORD lpdwOffset,
  296. LPD3DVALIDATECALLBACK lpFunc,
  297. LPVOID lpUserArg,
  298. DWORD dwFlags)
  299. {
  300. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  301. // Release in the destructor
  302. /*
  303. * validate parms
  304. */
  305. TRY
  306. {
  307. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  308. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  309. return DDERR_INVALIDOBJECT;
  310. }
  311. if (!VALID_DWORD_PTR(lpdwOffset)) {
  312. D3D_ERR( "Invalid offset pointer" );
  313. return DDERR_INVALIDPARAMS;
  314. }
  315. }
  316. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  317. {
  318. D3D_ERR( "Exception encountered validating parameters" );
  319. return DDERR_INVALIDPARAMS;
  320. }
  321. return (DDERR_UNSUPPORTED);
  322. }
  323. #undef DPF_MODNAME
  324. #define DPF_MODNAME "Direct3DExecuteBuffer::Optimize"
  325. HRESULT D3DAPI DIRECT3DEXECUTEBUFFERI::Optimize(DWORD dwFlags)
  326. {
  327. CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
  328. // Release in the destructor
  329. /*
  330. * validate parms
  331. */
  332. TRY
  333. {
  334. if (!VALID_DIRECT3DEXECUTEBUFFER_PTR(this)) {
  335. D3D_ERR( "Invalid Direct3DExecuteBuffer pointer" );
  336. return DDERR_INVALIDOBJECT;
  337. }
  338. }
  339. EXCEPT( EXCEPTION_EXECUTE_HANDLER )
  340. {
  341. D3D_ERR( "Exception encountered validating parameters" );
  342. return DDERR_INVALIDPARAMS;
  343. }
  344. if (dwFlags) {
  345. D3D_ERR( "Flags are non-zero" );
  346. return DDERR_INVALIDPARAMS;
  347. }
  348. return (DDERR_UNSUPPORTED);
  349. }