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.

300 lines
10 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: dl_pdata.h
  3. *
  4. * Routines to execute fast PolyData primitives.
  5. *
  6. * Created: 1-10-1996
  7. * Author: Hock San Lee [hockl]
  8. *
  9. * Copyright (c) 1996 Microsoft Corporation
  10. \**************************************************************************/
  11. #ifndef __dl_pdata_h_
  12. #define __dl_pdata_h_
  13. #define __PDATA_SIZE_T2F (2 * sizeof(__GLfloat))
  14. #define __PDATA_SIZE_C3F (3 * sizeof(__GLfloat))
  15. #define __PDATA_SIZE_C4F (sizeof(__GLcolor))
  16. #define __PDATA_SIZE_N3F (3 * sizeof(__GLfloat))
  17. //#define __PDATA_SIZE_V2F (2 * sizeof(__GLfloat))
  18. #define __PDATA_SIZE_V3F (3 * sizeof(__GLfloat))
  19. // We always set the POLYDATA_DLIST_COLOR_SLOW flag for colors. It allows us
  20. // to eliminate the flags field in the fast PolyData records.
  21. #define __PDATA_PD_FLAGS_T2F (POLYDATA_TEXTURE_VALID|POLYDATA_DLIST_TEXTURE2)
  22. #define __PDATA_PD_FLAGS_C3F (POLYDATA_COLOR_VALID)
  23. #define __PDATA_PD_FLAGS_C4F (POLYDATA_COLOR_VALID|POLYDATA_DLIST_COLOR_4)
  24. #define __PDATA_PD_FLAGS_N3F (POLYDATA_NORMAL_VALID)
  25. //#define __PDATA_PD_FLAGS_V2F (POLYDATA_VERTEX2)
  26. #define __PDATA_PD_FLAGS_V3F (POLYDATA_VERTEX3)
  27. #define __PDATA_PA_FLAGS_T2F (POLYARRAY_TEXTURE2)
  28. #define __PDATA_PA_FLAGS_C3F (0)
  29. #define __PDATA_PA_FLAGS_C4F (0)
  30. #define __PDATA_PA_FLAGS_N3F (0)
  31. //#define __PDATA_PA_FLAGS_V2F (POLYARRAY_VERTEX2)
  32. #define __PDATA_PA_FLAGS_V3F (POLYARRAY_VERTEX3)
  33. #endif // __dl_pdata_h_
  34. #ifndef __BUILD_GLI386__
  35. #ifdef __GLLE_POLYDATA_C3F_V3F
  36. #define __DL_PDATA_NAME __glle_PolyData_C3F_V3F
  37. #define __DL_PDATA_T2F 0
  38. #define __DL_PDATA_C3F 1
  39. #define __DL_PDATA_C4F 0
  40. #define __DL_PDATA_N3F 0
  41. // #define __DL_PDATA_V2F 0
  42. #define __DL_PDATA_V3F 1
  43. #endif
  44. #ifdef __GLLE_POLYDATA_N3F_V3F
  45. #define __DL_PDATA_NAME __glle_PolyData_N3F_V3F
  46. #define __DL_PDATA_T2F 0
  47. #define __DL_PDATA_C3F 0
  48. #define __DL_PDATA_C4F 0
  49. #define __DL_PDATA_N3F 1
  50. // #define __DL_PDATA_V2F 0
  51. #define __DL_PDATA_V3F 1
  52. #endif
  53. #ifdef __GLLE_POLYDATA_C3F_N3F_V3F
  54. #define __DL_PDATA_NAME __glle_PolyData_C3F_N3F_V3F
  55. #define __DL_PDATA_T2F 0
  56. #define __DL_PDATA_C3F 1
  57. #define __DL_PDATA_C4F 0
  58. #define __DL_PDATA_N3F 1
  59. // #define __DL_PDATA_V2F 0
  60. #define __DL_PDATA_V3F 1
  61. #endif
  62. #ifdef __GLLE_POLYDATA_C4F_N3F_V3F
  63. #define __DL_PDATA_NAME __glle_PolyData_C4F_N3F_V3F
  64. #define __DL_PDATA_T2F 0
  65. #define __DL_PDATA_C3F 0
  66. #define __DL_PDATA_C4F 1
  67. #define __DL_PDATA_N3F 1
  68. // #define __DL_PDATA_V2F 0
  69. #define __DL_PDATA_V3F 1
  70. #endif
  71. #ifdef __GLLE_POLYDATA_T2F_V3F
  72. #define __DL_PDATA_NAME __glle_PolyData_T2F_V3F
  73. #define __DL_PDATA_T2F 1
  74. #define __DL_PDATA_C3F 0
  75. #define __DL_PDATA_C4F 0
  76. #define __DL_PDATA_N3F 0
  77. // #define __DL_PDATA_V2F 0
  78. #define __DL_PDATA_V3F 1
  79. #endif
  80. #ifdef __GLLE_POLYDATA_T2F_C3F_V3F
  81. #define __DL_PDATA_NAME __glle_PolyData_T2F_C3F_V3F
  82. #define __DL_PDATA_T2F 1
  83. #define __DL_PDATA_C3F 1
  84. #define __DL_PDATA_C4F 0
  85. #define __DL_PDATA_N3F 0
  86. // #define __DL_PDATA_V2F 0
  87. #define __DL_PDATA_V3F 1
  88. #endif
  89. #ifdef __GLLE_POLYDATA_T2F_N3F_V3F
  90. #define __DL_PDATA_NAME __glle_PolyData_T2F_N3F_V3F
  91. #define __DL_PDATA_T2F 1
  92. #define __DL_PDATA_C3F 0
  93. #define __DL_PDATA_C4F 0
  94. #define __DL_PDATA_N3F 1
  95. // #define __DL_PDATA_V2F 0
  96. #define __DL_PDATA_V3F 1
  97. #endif
  98. #ifdef __GLLE_POLYDATA_T2F_C3F_N3F_V3F
  99. #define __DL_PDATA_NAME __glle_PolyData_T2F_C3F_N3F_V3F
  100. #define __DL_PDATA_T2F 1
  101. #define __DL_PDATA_C3F 1
  102. #define __DL_PDATA_C4F 0
  103. #define __DL_PDATA_N3F 1
  104. // #define __DL_PDATA_V2F 0
  105. #define __DL_PDATA_V3F 1
  106. #endif
  107. #ifdef __GLLE_POLYDATA_T2F_C4F_N3F_V3F
  108. #define __DL_PDATA_NAME __glle_PolyData_T2F_C4F_N3F_V3F
  109. #define __DL_PDATA_T2F 1
  110. #define __DL_PDATA_C3F 0
  111. #define __DL_PDATA_C4F 1
  112. #define __DL_PDATA_N3F 1
  113. // #define __DL_PDATA_V2F 0
  114. #define __DL_PDATA_V3F 1
  115. #endif
  116. /*************************************************************************/
  117. // Compute record size, pd flags and pa flags
  118. #if __DL_PDATA_T2F
  119. #define __DL_PDATA_SIZE_T __PDATA_SIZE_T2F
  120. #define __DL_PDATA_PD_FLAGS_T __PDATA_PD_FLAGS_T2F
  121. #define __DL_PDATA_PA_FLAGS_T __PDATA_PA_FLAGS_T2F
  122. #else
  123. #define __DL_PDATA_SIZE_T 0
  124. #define __DL_PDATA_PD_FLAGS_T 0
  125. #define __DL_PDATA_PA_FLAGS_T 0
  126. #endif
  127. #if __DL_PDATA_C3F
  128. #define __DL_PDATA_SIZE_C __PDATA_SIZE_C3F
  129. #define __DL_PDATA_PD_FLAGS_C __PDATA_PD_FLAGS_C3F
  130. #define __DL_PDATA_PA_FLAGS_C __PDATA_PA_FLAGS_C3F
  131. #elif __DL_PDATA_C4F
  132. #define __DL_PDATA_SIZE_C __PDATA_SIZE_C4F
  133. #define __DL_PDATA_PD_FLAGS_C __PDATA_PD_FLAGS_C4F
  134. #define __DL_PDATA_PA_FLAGS_C __PDATA_PA_FLAGS_C4F
  135. #else
  136. #define __DL_PDATA_SIZE_C 0
  137. #define __DL_PDATA_PD_FLAGS_C 0
  138. #define __DL_PDATA_PA_FLAGS_C 0
  139. #endif
  140. #if __DL_PDATA_N3F
  141. #define __DL_PDATA_SIZE_N __PDATA_SIZE_N3F
  142. #define __DL_PDATA_PD_FLAGS_N __PDATA_PD_FLAGS_N3F
  143. #define __DL_PDATA_PA_FLAGS_N __PDATA_PA_FLAGS_N3F
  144. #else
  145. #define __DL_PDATA_SIZE_N 0
  146. #define __DL_PDATA_PD_FLAGS_N 0
  147. #define __DL_PDATA_PA_FLAGS_N 0
  148. #endif
  149. #if __DL_PDATA_V2F
  150. #define __DL_PDATA_SIZE_V __PDATA_SIZE_V2F
  151. #define __DL_PDATA_PD_FLAGS_V __PDATA_PD_FLAGS_V2F
  152. #define __DL_PDATA_PA_FLAGS_V __PDATA_PA_FLAGS_V2F
  153. #elif __DL_PDATA_V3F
  154. #define __DL_PDATA_SIZE_V __PDATA_SIZE_V3F
  155. #define __DL_PDATA_PD_FLAGS_V __PDATA_PD_FLAGS_V3F
  156. #define __DL_PDATA_PA_FLAGS_V __PDATA_PA_FLAGS_V3F
  157. #else
  158. #define __DL_PDATA_SIZE_V 0
  159. #define __DL_PDATA_PD_FLAGS_V 0
  160. #define __DL_PDATA_PA_FLAGS_V 0
  161. #endif
  162. #define __DL_PDATA_SIZE \
  163. (__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C+__DL_PDATA_SIZE_N+__DL_PDATA_SIZE_V)
  164. #define __DL_PDATA_PD_FLAGS \
  165. (__DL_PDATA_PD_FLAGS_T|__DL_PDATA_PD_FLAGS_C|__DL_PDATA_PD_FLAGS_N|__DL_PDATA_PD_FLAGS_V)
  166. #define __DL_PDATA_PA_FLAGS \
  167. (__DL_PDATA_PA_FLAGS_T|__DL_PDATA_PA_FLAGS_C|__DL_PDATA_PA_FLAGS_N|__DL_PDATA_PA_FLAGS_V)
  168. /*************************************************************************/
  169. // Compute data offsets. This is here only because our compiler generates
  170. // better x86 assembly output!
  171. #define __DL_PDATA_TEXTURE_OFFSET (0)
  172. #define __DL_PDATA_COLOR_OFFSET (__DL_PDATA_SIZE_T)
  173. #define __DL_PDATA_NORMAL_OFFSET (__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C)
  174. #define __DL_PDATA_VERTEX_OFFSET (__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C+__DL_PDATA_SIZE_N)
  175. /*************************************************************************/
  176. // Playback a fast __glle_PolyData record in Begin.
  177. const GLubyte * FASTCALL __DL_PDATA_NAME(__GLcontext *gc, const GLubyte *PC)
  178. {
  179. POLYARRAY *pa;
  180. POLYDATA *pd;
  181. pa = gc->paTeb;
  182. if (pa->flags & POLYARRAY_IN_BEGIN)
  183. {
  184. // Update pa fields.
  185. pa->flags |= __DL_PDATA_PA_FLAGS;
  186. pd = pa->pdNextVertex++;
  187. #if __DL_PDATA_T2F
  188. pa->pdCurTexture = pd;
  189. #endif
  190. #if __DL_PDATA_C3F || __DL_PDATA_C4F
  191. pa->pdCurColor = pd;
  192. #endif
  193. #if __DL_PDATA_N3F
  194. pa->pdCurNormal = pd;
  195. #endif
  196. // Update pd attributes.
  197. pd->flags |= __DL_PDATA_PD_FLAGS;
  198. #if __DL_PDATA_V2F
  199. // Vertex
  200. pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
  201. pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
  202. pd->obj.z = __glZero;
  203. pd->obj.w = __glOne;
  204. #elif __DL_PDATA_V3F
  205. // Vertex
  206. pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
  207. pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
  208. pd->obj.z = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->z;
  209. pd->obj.w = __glOne;
  210. #endif
  211. #if __DL_PDATA_T2F
  212. // Texture coord
  213. pd->texture.x = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->x;
  214. pd->texture.y = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->y;
  215. pd->texture.z = __glZero;
  216. pd->texture.w = __glOne;
  217. #endif
  218. #if __DL_PDATA_C3F
  219. // Color
  220. pd->color[0].r = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->r;
  221. pd->color[0].g = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->g;
  222. pd->color[0].b = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->b;
  223. pd->color[0].a = gc->alphaVertexScale;
  224. #elif __DL_PDATA_C4F
  225. // Color
  226. pd->color[0] = *((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET]);
  227. #endif
  228. #if __DL_PDATA_N3F
  229. // Normal
  230. pd->normal.x = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->x;
  231. pd->normal.y = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->y;
  232. pd->normal.z = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->z;
  233. #endif
  234. pd[1].flags = 0;
  235. if (pd >= pa->pdFlush)
  236. PolyArrayFlushPartialPrimitive();
  237. }
  238. else
  239. {
  240. // Something went wrong at playback time! We can either try to playback
  241. // this record using the regular API or punt it altogether. I cannot think
  242. // of a situation when this can happen, so we will punt it for now.
  243. WARNING("Display list: playing back POLYDATA outside BEGIN!\n");
  244. }
  245. return PC + __DL_PDATA_SIZE;
  246. }
  247. #undef __DL_PDATA_NAME
  248. #undef __DL_PDATA_T2F
  249. #undef __DL_PDATA_C3F
  250. #undef __DL_PDATA_C4F
  251. #undef __DL_PDATA_N3F
  252. #undef __DL_PDATA_V2F
  253. #undef __DL_PDATA_V3F
  254. #undef __DL_PDATA_SIZE_T
  255. #undef __DL_PDATA_SIZE_C
  256. #undef __DL_PDATA_SIZE_N
  257. #undef __DL_PDATA_SIZE_V
  258. #undef __DL_PDATA_PD_FLAGS_T
  259. #undef __DL_PDATA_PD_FLAGS_C
  260. #undef __DL_PDATA_PD_FLAGS_N
  261. #undef __DL_PDATA_PD_FLAGS_V
  262. #undef __DL_PDATA_PA_FLAGS_T
  263. #undef __DL_PDATA_PA_FLAGS_C
  264. #undef __DL_PDATA_PA_FLAGS_N
  265. #undef __DL_PDATA_PA_FLAGS_V
  266. #undef __DL_PDATA_SIZE
  267. #undef __DL_PDATA_PD_FLAGS
  268. #undef __DL_PDATA_PA_FLAGS
  269. #undef __DL_PDATA_TEXTURE_OFFSET
  270. #undef __DL_PDATA_COLOR_OFFSET
  271. #undef __DL_PDATA_NORMAL_OFFSET
  272. #undef __DL_PDATA_VERTEX_OFFSET
  273. #endif // __BUILD_GLI386__