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.

571 lines
18 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: array.h
  3. *
  4. * Fast VA_ArrayElement functions.
  5. *
  6. * Created: 1-31-1996
  7. * Author: Hock San Lee [hockl]
  8. *
  9. * Copyright (c) 1996 Microsoft Corporation
  10. \**************************************************************************/
  11. #ifndef __array_h_
  12. #define __array_h_
  13. #define __VA_PD_FLAGS_T2F (POLYDATA_TEXTURE_VALID|POLYDATA_DLIST_TEXTURE2)
  14. #define __VA_PD_FLAGS_C3F (POLYDATA_COLOR_VALID)
  15. #define __VA_PD_FLAGS_C4F (POLYDATA_COLOR_VALID| POLYDATA_DLIST_COLOR_4)
  16. #define __VA_PD_FLAGS_N3F (POLYDATA_NORMAL_VALID)
  17. #define __VA_PD_FLAGS_V2F (POLYDATA_VERTEX2)
  18. #define __VA_PD_FLAGS_V3F (POLYDATA_VERTEX3)
  19. #define __VA_PD_FLAGS_V4F (POLYDATA_VERTEX4)
  20. #define __VA_PA_FLAGS_T2F (POLYARRAY_TEXTURE2)
  21. #define __VA_PA_FLAGS_C3F (0)
  22. #define __VA_PA_FLAGS_C4F (0)
  23. #define __VA_PA_FLAGS_N3F (0)
  24. #define __VA_PA_FLAGS_V2F (POLYARRAY_VERTEX2)
  25. #define __VA_PA_FLAGS_V3F (POLYARRAY_VERTEX3)
  26. #define __VA_PA_FLAGS_V4F (POLYARRAY_VERTEX4)
  27. #endif // __array_h_
  28. #ifdef __VA_ARRAY_ELEMENT_V2F
  29. #define __VA_NAME VA_ArrayElement_V2F
  30. #define __VA_NAMEB VA_ArrayElement_V2F_B
  31. #define __VA_NAMEBI VA_ArrayElement_V2F_BI
  32. #define __VA_T2F 0
  33. #define __VA_C3F 0
  34. #define __VA_C4F 0
  35. #define __VA_N3F 0
  36. #define __VA_V2F 1
  37. #define __VA_V3F 0
  38. #define __VA_V4F 0
  39. #endif
  40. #ifdef __VA_ARRAY_ELEMENT_V3F
  41. #define __VA_NAME VA_ArrayElement_V3F
  42. #define __VA_NAMEB VA_ArrayElement_V3F_B
  43. #define __VA_NAMEBI VA_ArrayElement_V3F_BI
  44. #define __VA_T2F 0
  45. #define __VA_C3F 0
  46. #define __VA_C4F 0
  47. #define __VA_N3F 0
  48. #define __VA_V2F 0
  49. #define __VA_V3F 1
  50. #define __VA_V4F 0
  51. #endif
  52. #ifdef __VA_ARRAY_ELEMENT_C3F_V3F
  53. #define __VA_NAME VA_ArrayElement_C3F_V3F
  54. #define __VA_NAMEB VA_ArrayElement_C3F_V3F_B
  55. #define __VA_NAMEBI VA_ArrayElement_C3F_V3F_BI
  56. #define __VA_T2F 0
  57. #define __VA_C3F 1
  58. #define __VA_C4F 0
  59. #define __VA_N3F 0
  60. #define __VA_V2F 0
  61. #define __VA_V3F 1
  62. #define __VA_V4F 0
  63. #endif
  64. #ifdef __VA_ARRAY_ELEMENT_N3F_V3F
  65. #define __VA_NAME VA_ArrayElement_N3F_V3F
  66. #define __VA_NAMEB VA_ArrayElement_N3F_V3F_B
  67. #define __VA_NAMEBI VA_ArrayElement_N3F_V3F_BI
  68. #define __VA_T2F 0
  69. #define __VA_C3F 0
  70. #define __VA_C4F 0
  71. #define __VA_N3F 1
  72. #define __VA_V2F 0
  73. #define __VA_V3F 1
  74. #define __VA_V4F 0
  75. #endif
  76. #ifdef __VA_ARRAY_ELEMENT_C3F_N3F_V3F
  77. #define __VA_NAME VA_ArrayElement_C3F_N3F_V3F
  78. #define __VA_NAMEB VA_ArrayElement_C3F_N3F_V3F_B
  79. #define __VA_NAMEBI VA_ArrayElement_C3F_N3F_V3F_BI
  80. #define __VA_T2F 0
  81. #define __VA_C3F 1
  82. #define __VA_C4F 0
  83. #define __VA_N3F 1
  84. #define __VA_V2F 0
  85. #define __VA_V3F 1
  86. #define __VA_V4F 0
  87. #endif
  88. #ifdef __VA_ARRAY_ELEMENT_C4F_N3F_V3F
  89. #define __VA_NAME VA_ArrayElement_C4F_N3F_V3F
  90. #define __VA_NAMEB VA_ArrayElement_C4F_N3F_V3F_B
  91. #define __VA_NAMEBI VA_ArrayElement_C4F_N3F_V3F_BI
  92. #define __VA_T2F 0
  93. #define __VA_C3F 0
  94. #define __VA_C4F 1
  95. #define __VA_N3F 1
  96. #define __VA_V2F 0
  97. #define __VA_V3F 1
  98. #define __VA_V4F 0
  99. #endif
  100. #ifdef __VA_ARRAY_ELEMENT_T2F_V3F
  101. #define __VA_NAME VA_ArrayElement_T2F_V3F
  102. #define __VA_NAMEB VA_ArrayElement_T2F_V3F_B
  103. #define __VA_NAMEBI VA_ArrayElement_T2F_V3F_BI
  104. #define __VA_T2F 1
  105. #define __VA_C3F 0
  106. #define __VA_C4F 0
  107. #define __VA_N3F 0
  108. #define __VA_V2F 0
  109. #define __VA_V3F 1
  110. #define __VA_V4F 0
  111. #endif
  112. #ifdef __VA_ARRAY_ELEMENT_T2F_C3F_V3F
  113. #define __VA_NAME VA_ArrayElement_T2F_C3F_V3F
  114. #define __VA_NAMEB VA_ArrayElement_T2F_C3F_V3F_B
  115. #define __VA_NAMEBI VA_ArrayElement_T2F_C3F_V3F_BI
  116. #define __VA_T2F 1
  117. #define __VA_C3F 1
  118. #define __VA_C4F 0
  119. #define __VA_N3F 0
  120. #define __VA_V2F 0
  121. #define __VA_V3F 1
  122. #define __VA_V4F 0
  123. #endif
  124. #ifdef __VA_ARRAY_ELEMENT_T2F_N3F_V3F
  125. #define __VA_NAME VA_ArrayElement_T2F_N3F_V3F
  126. #define __VA_NAMEB VA_ArrayElement_T2F_N3F_V3F_B
  127. #define __VA_NAMEBI VA_ArrayElement_T2F_N3F_V3F_BI
  128. #define __VA_T2F 1
  129. #define __VA_C3F 0
  130. #define __VA_C4F 0
  131. #define __VA_N3F 1
  132. #define __VA_V2F 0
  133. #define __VA_V3F 1
  134. #define __VA_V4F 0
  135. #endif
  136. #ifdef __VA_ARRAY_ELEMENT_T2F_C3F_N3F_V3F
  137. #define __VA_NAME VA_ArrayElement_T2F_C3F_N3F_V3F
  138. #define __VA_NAMEB VA_ArrayElement_T2F_C3F_N3F_V3F_B
  139. #define __VA_NAMEBI VA_ArrayElement_T2F_C3F_N3F_V3F_BI
  140. #define __VA_T2F 1
  141. #define __VA_C3F 1
  142. #define __VA_C4F 0
  143. #define __VA_N3F 1
  144. #define __VA_V2F 0
  145. #define __VA_V3F 1
  146. #define __VA_V4F 0
  147. #endif
  148. #ifdef __VA_ARRAY_ELEMENT_T2F_C4F_N3F_V3F
  149. #define __VA_NAME VA_ArrayElement_T2F_C4F_N3F_V3F
  150. #define __VA_NAMEB VA_ArrayElement_T2F_C4F_N3F_V3F_B
  151. #define __VA_NAMEBI VA_ArrayElement_T2F_C4F_N3F_V3F_BI
  152. #define __VA_T2F 1
  153. #define __VA_C3F 0
  154. #define __VA_C4F 1
  155. #define __VA_N3F 1
  156. #define __VA_V2F 0
  157. #define __VA_V3F 1
  158. #define __VA_V4F 0
  159. #endif
  160. /*************************************************************************/
  161. // Compute pd flags and pa flags
  162. #if __VA_T2F
  163. #define __VA_PD_FLAGS_T __VA_PD_FLAGS_T2F
  164. #define __VA_PA_FLAGS_T __VA_PA_FLAGS_T2F
  165. #else
  166. #define __VA_PD_FLAGS_T 0
  167. #define __VA_PA_FLAGS_T 0
  168. #endif
  169. #if __VA_C3F
  170. #define __VA_PD_FLAGS_C __VA_PD_FLAGS_C3F
  171. #define __VA_PA_FLAGS_C __VA_PA_FLAGS_C3F
  172. #elif __VA_C4F
  173. #define __VA_PD_FLAGS_C __VA_PD_FLAGS_C4F
  174. #define __VA_PA_FLAGS_C __VA_PA_FLAGS_C4F
  175. #else
  176. #define __VA_PD_FLAGS_C 0
  177. #define __VA_PA_FLAGS_C 0
  178. #endif
  179. #if __VA_N3F
  180. #define __VA_PD_FLAGS_N __VA_PD_FLAGS_N3F
  181. #define __VA_PA_FLAGS_N __VA_PA_FLAGS_N3F
  182. #else
  183. #define __VA_PD_FLAGS_N 0
  184. #define __VA_PA_FLAGS_N 0
  185. #endif
  186. #if __VA_V2F
  187. #define __VA_PD_FLAGS_V __VA_PD_FLAGS_V2F
  188. #define __VA_PA_FLAGS_V __VA_PA_FLAGS_V2F
  189. #elif __VA_V3F
  190. #define __VA_PD_FLAGS_V __VA_PD_FLAGS_V3F
  191. #define __VA_PA_FLAGS_V __VA_PA_FLAGS_V3F
  192. #elif __VA_V4F
  193. #define __VA_PD_FLAGS_V __VA_PD_FLAGS_V4F
  194. #define __VA_PA_FLAGS_V __VA_PA_FLAGS_V4F
  195. #endif
  196. #define __VA_PD_FLAGS \
  197. (__VA_PD_FLAGS_T|__VA_PD_FLAGS_C|__VA_PD_FLAGS_N|__VA_PD_FLAGS_V)
  198. #define __VA_PA_FLAGS \
  199. (__VA_PA_FLAGS_T|__VA_PA_FLAGS_C|__VA_PA_FLAGS_N|__VA_PA_FLAGS_V)
  200. #define VA_COPY_VERTEX_V2F(dataCoord) \
  201. pd->obj.x = ((__GLcoord *) dataCoord)->x; \
  202. pd->obj.y = ((__GLcoord *) dataCoord)->y; \
  203. pd->obj.z = __glZero; \
  204. pd->obj.w = __glOne;
  205. #define VA_COPY_VERTEX_V3F(dataCoord) \
  206. pd->obj.x = ((__GLcoord *) dataCoord)->x; \
  207. pd->obj.y = ((__GLcoord *) dataCoord)->y; \
  208. pd->obj.z = ((__GLcoord *) dataCoord)->z; \
  209. pd->obj.w = __glOne;
  210. #define VA_COPY_VERTEX_V4F(dataCoord) \
  211. pd->obj = *((__GLcoord *) data);
  212. #define VA_COPY_TEXTURE_T2F(dataTexture) \
  213. pd->texture.x = ((__GLcoord *) dataTexture)->x; \
  214. pd->texture.y = ((__GLcoord *) dataTexture)->y; \
  215. pd->texture.z = __glZero; \
  216. pd->texture.w = __glOne;
  217. #define VA_COPY_COLOR_C3F(dataColor) \
  218. __GL_SCALE_AND_CHECK_CLAMP_RGB(pd->colors[0].r, \
  219. pd->colors[0].g, \
  220. pd->colors[0].b, \
  221. gc, pa->flags, \
  222. ((__GLcolor *) dataColor)->r, \
  223. ((__GLcolor *) dataColor)->g, \
  224. ((__GLcolor *) dataColor)->b); \
  225. pd->colors[0].a = gc->alphaVertexScale;
  226. #define VA_COPY_COLOR_C4F(dataColor) \
  227. __GL_SCALE_AND_CHECK_CLAMP_RGBA(pd->colors[0].r, \
  228. pd->colors[0].g, \
  229. pd->colors[0].b, \
  230. pd->colors[0].a, \
  231. gc, pa->flags, \
  232. ((__GLcolor *) dataColor)->r, \
  233. ((__GLcolor *) dataColor)->g, \
  234. ((__GLcolor *) dataColor)->b, \
  235. ((__GLcolor *) dataColor)->a);
  236. #define VA_COPY_NORMAL_N3F(dataNormal) \
  237. pd->normal.x = ((__GLcoord *) dataNormal)->x; \
  238. pd->normal.y = ((__GLcoord *) dataNormal)->y; \
  239. pd->normal.z = ((__GLcoord *) dataNormal)->z;
  240. /*************************************************************************/
  241. // Define a fast VA_ArrayElement function for batch mode.
  242. // This function is called in Begin and in RGBA mode only!
  243. //
  244. void FASTCALL __VA_NAMEB(__GLcontext *gc, GLint firstIndex, GLint nVertices)
  245. {
  246. POLYARRAY* const pa = gc->paTeb;
  247. POLYDATA* pd;
  248. const GLbyte *dataCoord = gc->vertexArray.vertex.pointer;
  249. const int coordStride = gc->vertexArray.vertex.ibytes;
  250. #if __VA_N3F
  251. const GLbyte *dataNormal = gc->vertexArray.normal.pointer;
  252. const int normalStride = gc->vertexArray.normal.ibytes;
  253. #endif
  254. #if __VA_T2F
  255. const GLbyte *dataTexture = gc->vertexArray.texCoord.pointer;
  256. const int textureStride = gc->vertexArray.texCoord.ibytes;
  257. #endif
  258. #if __VA_C3F || __VA_C4F
  259. const GLbyte *dataColor = gc->vertexArray.color.pointer;
  260. const int colorStride = gc->vertexArray.color.ibytes;
  261. #endif
  262. if (firstIndex != 0)
  263. {
  264. dataCoord += firstIndex*coordStride;
  265. #if __VA_N3F
  266. dataNormal += firstIndex*normalStride;
  267. #endif
  268. #if __VA_T2F
  269. dataTexture+= firstIndex*textureStride;
  270. #endif
  271. #if __VA_C3F || __VA_C4F
  272. dataColor += firstIndex*colorStride;
  273. #endif
  274. }
  275. ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN,
  276. "VA_ArrayElement called outside Begin!\n");
  277. while (nVertices > 0)
  278. {
  279. int n, nProcess;
  280. int needFlush = FALSE;
  281. pa->flags |= __VA_PA_FLAGS;
  282. pd = pa->pdNextVertex;
  283. if (&pd[nVertices-1] >= pa->pdFlush)
  284. {
  285. nProcess = (int)((ULONG_PTR)(pa->pdFlush - pd) + 1);
  286. needFlush = TRUE;
  287. }
  288. else
  289. nProcess = nVertices;
  290. for (n=nProcess; n > 0; n--)
  291. {
  292. // Update pd attributes.
  293. pd->flags = __VA_PD_FLAGS;
  294. #if __VA_V2F
  295. VA_COPY_VERTEX_V2F(dataCoord);
  296. #elif __VA_V3F
  297. VA_COPY_VERTEX_V3F(dataCoord);
  298. #elif __VA_V4F
  299. VA_COPY_VERTEX_V4F(dataCoord);
  300. #endif
  301. dataCoord += coordStride;
  302. #if __VA_T2F
  303. VA_COPY_TEXTURE_T2F(dataTexture);
  304. dataTexture += textureStride;
  305. #endif
  306. #if __VA_C3F
  307. // Color
  308. VA_COPY_COLOR_C3F(dataColor);
  309. dataColor += colorStride;
  310. #elif __VA_C4F
  311. // Color
  312. VA_COPY_COLOR_C4F(dataColor);
  313. dataColor += colorStride;
  314. #endif
  315. #if __VA_N3F
  316. // Normal
  317. VA_COPY_NORMAL_N3F(dataNormal);
  318. dataNormal += normalStride;
  319. #endif
  320. pd++;
  321. } // End of loop
  322. pa->pdNextVertex = pd;
  323. pd->flags = 0;
  324. pd--;
  325. #if __VA_T2F
  326. pa->pdCurTexture = pd;
  327. #endif
  328. #if __VA_C3F || __VA_C4F
  329. pa->pdCurColor = pd;
  330. #endif
  331. #if __VA_N3F
  332. pa->pdCurNormal = pd;
  333. #endif
  334. nVertices-= nProcess;
  335. if (needFlush)
  336. PolyArrayFlushPartialPrimitive();
  337. }
  338. }
  339. /*************************************************************************/
  340. // Define a fast VA_ArrayElement function for batch indirect mode.
  341. // This function is called in Begin and in RGBA mode only!
  342. //
  343. void FASTCALL __VA_NAMEBI(__GLcontext *gc, GLint nVertices, VAMAP* indices)
  344. {
  345. POLYARRAY* const pa = gc->paTeb;
  346. POLYDATA* pd;
  347. const GLbyte *dataCoord0 = gc->vertexArray.vertex.pointer;
  348. const int coordStride = gc->vertexArray.vertex.ibytes;
  349. #if __VA_N3F
  350. const GLbyte *dataNormal0 = gc->vertexArray.normal.pointer;
  351. const int normalStride = gc->vertexArray.normal.ibytes;
  352. #endif
  353. #if __VA_T2F
  354. const GLbyte *dataTexture0 = gc->vertexArray.texCoord.pointer;
  355. const int textureStride = gc->vertexArray.texCoord.ibytes;
  356. #endif
  357. #if __VA_C3F || __VA_C4F
  358. const GLbyte *dataColor0 = gc->vertexArray.color.pointer;
  359. const int colorStride = gc->vertexArray.color.ibytes;
  360. #endif
  361. ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN,
  362. "VA_ArrayElement called outside Begin!\n");
  363. while (nVertices > 0)
  364. {
  365. int n, nProcess;
  366. int needFlush = FALSE;
  367. pa->flags |= __VA_PA_FLAGS;
  368. pd = pa->pdNextVertex;
  369. if (&pd[nVertices-1] >= pa->pdFlush)
  370. {
  371. nProcess = (int)((ULONG_PTR)(pa->pdFlush - pd) + 1);
  372. needFlush = TRUE;
  373. }
  374. else
  375. nProcess = nVertices;
  376. for (n=nProcess; n > 0; n--)
  377. {
  378. int i = indices->iIn;
  379. const GLbyte* dataCoord;
  380. #if __VA_N3F
  381. const GLbyte* dataNormal;
  382. #endif
  383. #if __VA_C3F || __VA_C4F
  384. const GLbyte* dataColor;
  385. #endif
  386. #if __VA_T2F
  387. const GLbyte* dataTexture;
  388. #endif
  389. indices++;
  390. // Update pd attributes.
  391. pd->flags = __VA_PD_FLAGS;
  392. dataCoord = dataCoord0 + i * coordStride;
  393. #if __VA_V2F
  394. VA_COPY_VERTEX_V2F(dataCoord);
  395. #elif __VA_V3F
  396. VA_COPY_VERTEX_V3F(dataCoord);
  397. #elif __VA_V4F
  398. VA_COPY_VERTEX_V4F(dataCoord);
  399. #endif
  400. #if __VA_T2F
  401. dataTexture = dataTexture0 + i * textureStride;
  402. VA_COPY_TEXTURE_T2F(dataTexture);
  403. #endif
  404. #if __VA_C3F
  405. // Color
  406. dataColor = dataColor0 + i * colorStride;
  407. VA_COPY_COLOR_C3F(dataColor);
  408. #elif __VA_C4F
  409. // Color
  410. dataColor = dataColor0 + i * colorStride;
  411. VA_COPY_COLOR_C4F(dataColor);
  412. #endif
  413. #if __VA_N3F
  414. // Normal
  415. dataNormal = dataNormal0 + i * normalStride;
  416. VA_COPY_NORMAL_N3F(dataNormal);
  417. #endif
  418. pd++;
  419. } // End of loop
  420. pa->pdNextVertex = pd;
  421. pd->flags = 0;
  422. pd--;
  423. #if __VA_T2F
  424. pa->pdCurTexture = pd;
  425. #endif
  426. #if __VA_C3F || __VA_C4F
  427. pa->pdCurColor = pd;
  428. #endif
  429. #if __VA_N3F
  430. pa->pdCurNormal = pd;
  431. #endif
  432. nVertices-= nProcess;
  433. if (needFlush)
  434. PolyArrayFlushPartialPrimitive();
  435. }
  436. }
  437. /*************************************************************************/
  438. // Define a fast VA_ArrayElement function.
  439. // This function is called in Begin and in RGBA mode only!
  440. void FASTCALL __VA_NAME(__GLcontext *gc, GLint i)
  441. {
  442. POLYARRAY *pa;
  443. POLYDATA *pd;
  444. const GLbyte *data;
  445. pa = gc->paTeb;
  446. ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN,
  447. "VA_ArrayElement called outside Begin!\n");
  448. // Update pa fields.
  449. pa->flags |= __VA_PA_FLAGS;
  450. pd = pa->pdNextVertex++;
  451. #if __VA_T2F
  452. pa->pdCurTexture = pd;
  453. #endif
  454. #if __VA_C3F || __VA_C4F
  455. pa->pdCurColor = pd;
  456. #endif
  457. #if __VA_N3F
  458. pa->pdCurNormal = pd;
  459. #endif
  460. // Update pd attributes.
  461. pd->flags |= __VA_PD_FLAGS;
  462. data = gc->vertexArray.vertex.pointer + i * gc->vertexArray.vertex.ibytes;
  463. #if __VA_V2F
  464. VA_COPY_VERTEX_V2F(data);
  465. #elif __VA_V3F
  466. VA_COPY_VERTEX_V3F(data);
  467. #elif __VA_V4F
  468. VA_COPY_VERTEX_V4F(data);
  469. #endif
  470. #if __VA_T2F
  471. data = gc->vertexArray.texCoord.pointer + i * gc->vertexArray.texCoord.ibytes;
  472. VA_COPY_TEXTURE_T2F(data);
  473. #endif
  474. #if __VA_C3F
  475. data = gc->vertexArray.color.pointer + i * gc->vertexArray.color.ibytes;
  476. VA_COPY_COLOR_C3F(data);
  477. #elif __VA_C4F
  478. data = gc->vertexArray.color.pointer + i * gc->vertexArray.color.ibytes;
  479. VA_COPY_COLOR_C4F(data);
  480. #endif
  481. #if __VA_N3F
  482. // Normal
  483. data = gc->vertexArray.normal.pointer + i * gc->vertexArray.normal.ibytes;
  484. VA_COPY_NORMAL_N3F(data);
  485. #endif
  486. pd[1].flags = 0;
  487. if (pd >= pa->pdFlush)
  488. PolyArrayFlushPartialPrimitive();
  489. }
  490. #undef __VA_NAMEB
  491. #undef __VA_NAMEBI
  492. #undef VA_COPY_VERTEX_V2F
  493. #undef VA_COPY_VERTEX_V3F
  494. #undef VA_COPY_VERTEX_V4F
  495. #undef VA_COPY_TEXTURE
  496. #undef VA_COPY_COLOR_C3F
  497. #undef VA_COPY_COLOR_C4F
  498. #undef VA_COPY_NORMAL
  499. #undef __VA_NAME
  500. #undef __VA_T2F
  501. #undef __VA_C3F
  502. #undef __VA_C4F
  503. #undef __VA_N3F
  504. #undef __VA_V2F
  505. #undef __VA_V3F
  506. #undef __VA_V4F
  507. #undef __VA_PD_FLAGS_T
  508. #undef __VA_PD_FLAGS_C
  509. #undef __VA_PD_FLAGS_N
  510. #undef __VA_PD_FLAGS_V
  511. #undef __VA_PA_FLAGS_T
  512. #undef __VA_PA_FLAGS_C
  513. #undef __VA_PA_FLAGS_N
  514. #undef __VA_PA_FLAGS_V
  515. #undef __VA_PD_FLAGS
  516. #undef __VA_PA_FLAGS