Source code of Windows XP (NT5)
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.

508 lines
19 KiB

  1. #include <stddef.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <nt.h>
  5. #include <ntrtl.h>
  6. #include <nturtl.h>
  7. #include <windows.h>
  8. #include <winddi.h>
  9. #include <ksmips.h>
  10. #include "glteb.h"
  11. #include <GL/gl.h>
  12. #include <gldrv.h>
  13. /***************************************************
  14. * *
  15. * Client API generator for MIPS (capimips) *
  16. * *
  17. ***************************************************/
  18. /*
  19. * from /nt/private/windows/gdi/opengl/inc/glteb.h:
  20. *
  21. * #define GLTEB_CLTDISPATCHTABLE
  22. * ((PGLDISPATCHTABLE)(NtCurrentTeb()->glDispatchTable))
  23. *
  24. * from /nt/public/sdk/inc/ntmips.h:#define NtCurrentTeb() ((PTEB)(PCR->Teb))
  25. *
  26. * #define NtCurrentTeb() ((PTEB)(USER_PCR->Teb))
  27. *
  28. * Define Address of Processor Control Registers.
  29. *
  30. * #define USPCR 0x7ffff000 // user address of PCR
  31. *
  32. * Define Pointer to Processor Control Registers.
  33. *
  34. * #define USER_PCR ((KPCR * const)USPCR)
  35. *
  36. */
  37. /*
  38. * The compiler generated the the following code:
  39. *
  40. * glNewList:
  41. * 00000000: 27BDFFE8 addiu sp,sp,FFE8
  42. * 00000004: AFBF0014 sw ra,0014(sp)
  43. * 00000008: 3C0E8000 lui t6,8000
  44. * 0000000C: 8DCFF4A8 lw t7,F4A8(t6)
  45. * 00000010: 8DF80714 lw t8,0714(t7)
  46. * 00000014: 0300F809 jalr ra,t8
  47. * 00000018: 00000000 nop
  48. * 0000001C: 8FBF0014 lw ra,0014(sp)
  49. * 00000020: 03E00008 jr ra
  50. * 00000024: 27BD0018 addiu sp,sp,0018
  51. * 00000028: 00000000 nop
  52. * 0000002C: 00000000 nop
  53. *
  54. * glMap2d:
  55. * 00000000: 27BDFFB8 addiu sp,sp,FFB8
  56. * 00000004: AFBF0044 sw ra,0044(sp)
  57. * 00000008: 44866000 mtc1 a2,$12
  58. * 0000000C: 44876800 mtc1 a3,$13
  59. * 00000010: 00000000 nop
  60. * 00000014: D7A40058 ldc1 $4,0058(sp)
  61. * 00000018: 3C098000 lui t1,8000
  62. * 0000001C: 8FAE0060 lw t6,0060(sp)
  63. * 00000020: 8FAF0064 lw t7,0064(sp)
  64. * 00000024: D7A60068 ldc1 $6,0068(sp)
  65. * 00000028: D7A80070 ldc1 $8,0070(sp)
  66. * 0000002C: 8FB80078 lw t8,0078(sp)
  67. * 00000030: 8FB9007C lw t9,007C(sp)
  68. * 00000034: 8FA80080 lw t0,0080(sp)
  69. * 00000038: F7A40010 sdc1 $4,0010(sp)
  70. * 0000003C: AFAE0018 sw t6,0018(sp)
  71. * 00000040: AFAF001C sw t7,001C(sp)
  72. * 00000044: F7A60020 sdc1 $6,0020(sp)
  73. * 00000048: F7A80028 sdc1 $8,0028(sp)
  74. * 0000004C: AFB80030 sw t8,0030(sp)
  75. * 00000050: AFB90034 sw t9,0034(sp)
  76. * 00000054: AFA80038 sw t0,0038(sp)
  77. * 00000058: 8D2AF4A8 lw t2,F4A8(t1)
  78. * 0000005C: 44066000 mfc1 a2,$12
  79. * 00000060: 44076800 mfc1 a3,$13
  80. * 00000064: 8D4B0A8C lw t3,0A8C(t2)
  81. * 00000068: 0160F809 jalr ra,t3
  82. * 0000006C: 00000000 nop
  83. * 00000070: 8FBF0044 lw ra,0044(sp)
  84. * 00000074: 03E00008 jr ra
  85. * 00000078: 27BD0048 addiu sp,sp,0048
  86. * 0000007C: 00000000 nop
  87. *
  88. * Summary:
  89. *
  90. * C Version: Assembly version:
  91. *
  92. * A0F0 .debug$S 5C .debug$S
  93. * 425C .debug$T
  94. * 17E8 .pdata
  95. * 3ED0 .text 17F0 .text
  96. */
  97. #define PAGE_AFTER_LAST 0x80000000
  98. #define OFFSET_FROM_PAGE (PAGE_AFTER_LAST - (size_t)USER_PCR)
  99. #define ADD_DEBUG_FORMATION
  100. #define JUSTDOIT(x) Do( #x, offsetof(GLDISPATCHTABLE, x))
  101. void Do( char *Func, size_t Fo );
  102. void PrintEntryMacro( void );
  103. void
  104. main ( int argc, char **argv )
  105. {
  106. printf("\n");
  107. printf("//////////////////////////////////////////////////////////\n");
  108. printf("// This file was generated by %s\n", *argv);
  109. printf("// DO NOT MODIFY\n");
  110. printf("//////////////////////////////////////////////////////////\n");
  111. printf("\n");
  112. printf("#include \"ksmips.h\"\n\n");
  113. PrintEntryMacro();
  114. JUSTDOIT( glNewList );
  115. JUSTDOIT( glEndList );
  116. JUSTDOIT( glCallList );
  117. JUSTDOIT( glCallLists );
  118. JUSTDOIT( glDeleteLists );
  119. JUSTDOIT( glGenLists );
  120. JUSTDOIT( glListBase );
  121. JUSTDOIT( glBegin );
  122. JUSTDOIT( glBitmap );
  123. JUSTDOIT( glColor3b );
  124. JUSTDOIT( glColor3bv );
  125. JUSTDOIT( glColor3d );
  126. JUSTDOIT( glColor3dv );
  127. JUSTDOIT( glColor3f );
  128. JUSTDOIT( glColor3fv );
  129. JUSTDOIT( glColor3i );
  130. JUSTDOIT( glColor3iv );
  131. JUSTDOIT( glColor3s );
  132. JUSTDOIT( glColor3sv );
  133. JUSTDOIT( glColor3ub );
  134. JUSTDOIT( glColor3ubv );
  135. JUSTDOIT( glColor3ui );
  136. JUSTDOIT( glColor3uiv );
  137. JUSTDOIT( glColor3us );
  138. JUSTDOIT( glColor3usv );
  139. JUSTDOIT( glColor4b );
  140. JUSTDOIT( glColor4bv );
  141. JUSTDOIT( glColor4d );
  142. JUSTDOIT( glColor4dv );
  143. JUSTDOIT( glColor4f );
  144. JUSTDOIT( glColor4fv );
  145. JUSTDOIT( glColor4i );
  146. JUSTDOIT( glColor4iv );
  147. JUSTDOIT( glColor4s );
  148. JUSTDOIT( glColor4sv );
  149. JUSTDOIT( glColor4ub );
  150. JUSTDOIT( glColor4ubv );
  151. JUSTDOIT( glColor4ui );
  152. JUSTDOIT( glColor4uiv );
  153. JUSTDOIT( glColor4us );
  154. JUSTDOIT( glColor4usv );
  155. JUSTDOIT( glEdgeFlag );
  156. JUSTDOIT( glEdgeFlagv );
  157. JUSTDOIT( glEnd );
  158. JUSTDOIT( glIndexd );
  159. JUSTDOIT( glIndexdv );
  160. JUSTDOIT( glIndexf );
  161. JUSTDOIT( glIndexfv );
  162. JUSTDOIT( glIndexi );
  163. JUSTDOIT( glIndexiv );
  164. JUSTDOIT( glIndexs );
  165. JUSTDOIT( glIndexsv );
  166. JUSTDOIT( glNormal3b );
  167. JUSTDOIT( glNormal3bv );
  168. JUSTDOIT( glNormal3d );
  169. JUSTDOIT( glNormal3dv );
  170. JUSTDOIT( glNormal3f );
  171. JUSTDOIT( glNormal3fv );
  172. JUSTDOIT( glNormal3i );
  173. JUSTDOIT( glNormal3iv );
  174. JUSTDOIT( glNormal3s );
  175. JUSTDOIT( glNormal3sv );
  176. JUSTDOIT( glRasterPos2d );
  177. JUSTDOIT( glRasterPos2dv );
  178. JUSTDOIT( glRasterPos2f );
  179. JUSTDOIT( glRasterPos2fv );
  180. JUSTDOIT( glRasterPos2i );
  181. JUSTDOIT( glRasterPos2iv );
  182. JUSTDOIT( glRasterPos2s );
  183. JUSTDOIT( glRasterPos2sv );
  184. JUSTDOIT( glRasterPos3d );
  185. JUSTDOIT( glRasterPos3dv );
  186. JUSTDOIT( glRasterPos3f );
  187. JUSTDOIT( glRasterPos3fv );
  188. JUSTDOIT( glRasterPos3i );
  189. JUSTDOIT( glRasterPos3iv );
  190. JUSTDOIT( glRasterPos3s );
  191. JUSTDOIT( glRasterPos3sv );
  192. JUSTDOIT( glRasterPos4d );
  193. JUSTDOIT( glRasterPos4dv );
  194. JUSTDOIT( glRasterPos4f );
  195. JUSTDOIT( glRasterPos4fv );
  196. JUSTDOIT( glRasterPos4i );
  197. JUSTDOIT( glRasterPos4iv );
  198. JUSTDOIT( glRasterPos4s );
  199. JUSTDOIT( glRasterPos4sv );
  200. JUSTDOIT( glRectd );
  201. JUSTDOIT( glRectdv );
  202. JUSTDOIT( glRectf );
  203. JUSTDOIT( glRectfv );
  204. JUSTDOIT( glRecti );
  205. JUSTDOIT( glRectiv );
  206. JUSTDOIT( glRects );
  207. JUSTDOIT( glRectsv );
  208. JUSTDOIT( glTexCoord1d );
  209. JUSTDOIT( glTexCoord1dv );
  210. JUSTDOIT( glTexCoord1f );
  211. JUSTDOIT( glTexCoord1fv );
  212. JUSTDOIT( glTexCoord1i );
  213. JUSTDOIT( glTexCoord1iv );
  214. JUSTDOIT( glTexCoord1s );
  215. JUSTDOIT( glTexCoord1sv );
  216. JUSTDOIT( glTexCoord2d );
  217. JUSTDOIT( glTexCoord2dv );
  218. JUSTDOIT( glTexCoord2f );
  219. JUSTDOIT( glTexCoord2fv );
  220. JUSTDOIT( glTexCoord2i );
  221. JUSTDOIT( glTexCoord2iv );
  222. JUSTDOIT( glTexCoord2s );
  223. JUSTDOIT( glTexCoord2sv );
  224. JUSTDOIT( glTexCoord3d );
  225. JUSTDOIT( glTexCoord3dv );
  226. JUSTDOIT( glTexCoord3f );
  227. JUSTDOIT( glTexCoord3fv );
  228. JUSTDOIT( glTexCoord3i );
  229. JUSTDOIT( glTexCoord3iv );
  230. JUSTDOIT( glTexCoord3s );
  231. JUSTDOIT( glTexCoord3sv );
  232. JUSTDOIT( glTexCoord4d );
  233. JUSTDOIT( glTexCoord4dv );
  234. JUSTDOIT( glTexCoord4f );
  235. JUSTDOIT( glTexCoord4fv );
  236. JUSTDOIT( glTexCoord4i );
  237. JUSTDOIT( glTexCoord4iv );
  238. JUSTDOIT( glTexCoord4s );
  239. JUSTDOIT( glTexCoord4sv );
  240. JUSTDOIT( glVertex2d );
  241. JUSTDOIT( glVertex2dv );
  242. JUSTDOIT( glVertex2f );
  243. JUSTDOIT( glVertex2fv );
  244. JUSTDOIT( glVertex2i );
  245. JUSTDOIT( glVertex2iv );
  246. JUSTDOIT( glVertex2s );
  247. JUSTDOIT( glVertex2sv );
  248. JUSTDOIT( glVertex3d );
  249. JUSTDOIT( glVertex3dv );
  250. JUSTDOIT( glVertex3f );
  251. JUSTDOIT( glVertex3fv );
  252. JUSTDOIT( glVertex3i );
  253. JUSTDOIT( glVertex3iv );
  254. JUSTDOIT( glVertex3s );
  255. JUSTDOIT( glVertex3sv );
  256. JUSTDOIT( glVertex4d );
  257. JUSTDOIT( glVertex4dv );
  258. JUSTDOIT( glVertex4f );
  259. JUSTDOIT( glVertex4fv );
  260. JUSTDOIT( glVertex4i );
  261. JUSTDOIT( glVertex4iv );
  262. JUSTDOIT( glVertex4s );
  263. JUSTDOIT( glVertex4sv );
  264. JUSTDOIT( glClipPlane );
  265. JUSTDOIT( glColorMaterial );
  266. JUSTDOIT( glCullFace );
  267. JUSTDOIT( glFogf );
  268. JUSTDOIT( glFogfv );
  269. JUSTDOIT( glFogi );
  270. JUSTDOIT( glFogiv );
  271. JUSTDOIT( glFrontFace );
  272. JUSTDOIT( glHint );
  273. JUSTDOIT( glLightf );
  274. JUSTDOIT( glLightfv );
  275. JUSTDOIT( glLighti );
  276. JUSTDOIT( glLightiv );
  277. JUSTDOIT( glLightModelf );
  278. JUSTDOIT( glLightModelfv );
  279. JUSTDOIT( glLightModeli );
  280. JUSTDOIT( glLightModeliv );
  281. JUSTDOIT( glLineStipple );
  282. JUSTDOIT( glLineWidth );
  283. JUSTDOIT( glMaterialf );
  284. JUSTDOIT( glMaterialfv );
  285. JUSTDOIT( glMateriali );
  286. JUSTDOIT( glMaterialiv );
  287. JUSTDOIT( glPointSize );
  288. JUSTDOIT( glPolygonMode );
  289. JUSTDOIT( glPolygonStipple );
  290. JUSTDOIT( glScissor );
  291. JUSTDOIT( glShadeModel );
  292. JUSTDOIT( glTexParameterf );
  293. JUSTDOIT( glTexParameterfv );
  294. JUSTDOIT( glTexParameteri );
  295. JUSTDOIT( glTexParameteriv );
  296. JUSTDOIT( glTexImage1D );
  297. JUSTDOIT( glTexImage2D );
  298. JUSTDOIT( glTexEnvf );
  299. JUSTDOIT( glTexEnvfv );
  300. JUSTDOIT( glTexEnvi );
  301. JUSTDOIT( glTexEnviv );
  302. JUSTDOIT( glTexGend );
  303. JUSTDOIT( glTexGendv );
  304. JUSTDOIT( glTexGenf );
  305. JUSTDOIT( glTexGenfv );
  306. JUSTDOIT( glTexGeni );
  307. JUSTDOIT( glTexGeniv );
  308. JUSTDOIT( glFeedbackBuffer );
  309. JUSTDOIT( glSelectBuffer );
  310. JUSTDOIT( glRenderMode );
  311. JUSTDOIT( glInitNames );
  312. JUSTDOIT( glLoadName );
  313. JUSTDOIT( glPassThrough );
  314. JUSTDOIT( glPopName );
  315. JUSTDOIT( glPushName );
  316. JUSTDOIT( glDrawBuffer );
  317. JUSTDOIT( glClear );
  318. JUSTDOIT( glClearAccum );
  319. JUSTDOIT( glClearIndex );
  320. JUSTDOIT( glClearColor );
  321. JUSTDOIT( glClearStencil );
  322. JUSTDOIT( glClearDepth );
  323. JUSTDOIT( glStencilMask );
  324. JUSTDOIT( glColorMask );
  325. JUSTDOIT( glDepthMask );
  326. JUSTDOIT( glIndexMask );
  327. JUSTDOIT( glAccum );
  328. JUSTDOIT( glDisable );
  329. JUSTDOIT( glEnable );
  330. JUSTDOIT( glFinish );
  331. JUSTDOIT( glFlush );
  332. JUSTDOIT( glPopAttrib );
  333. JUSTDOIT( glPushAttrib );
  334. JUSTDOIT( glMap1d );
  335. JUSTDOIT( glMap1f );
  336. JUSTDOIT( glMap2d );
  337. JUSTDOIT( glMap2f );
  338. JUSTDOIT( glMapGrid1d );
  339. JUSTDOIT( glMapGrid1f );
  340. JUSTDOIT( glMapGrid2d );
  341. JUSTDOIT( glMapGrid2f );
  342. JUSTDOIT( glEvalCoord1d );
  343. JUSTDOIT( glEvalCoord1dv );
  344. JUSTDOIT( glEvalCoord1f );
  345. JUSTDOIT( glEvalCoord1fv );
  346. JUSTDOIT( glEvalCoord2d );
  347. JUSTDOIT( glEvalCoord2dv );
  348. JUSTDOIT( glEvalCoord2f );
  349. JUSTDOIT( glEvalCoord2fv );
  350. JUSTDOIT( glEvalMesh1 );
  351. JUSTDOIT( glEvalPoint1 );
  352. JUSTDOIT( glEvalMesh2 );
  353. JUSTDOIT( glEvalPoint2 );
  354. JUSTDOIT( glAlphaFunc );
  355. JUSTDOIT( glBlendFunc );
  356. JUSTDOIT( glLogicOp );
  357. JUSTDOIT( glStencilFunc );
  358. JUSTDOIT( glStencilOp );
  359. JUSTDOIT( glDepthFunc );
  360. JUSTDOIT( glPixelZoom );
  361. JUSTDOIT( glPixelTransferf );
  362. JUSTDOIT( glPixelTransferi );
  363. JUSTDOIT( glPixelStoref );
  364. JUSTDOIT( glPixelStorei );
  365. JUSTDOIT( glPixelMapfv );
  366. JUSTDOIT( glPixelMapuiv );
  367. JUSTDOIT( glPixelMapusv );
  368. JUSTDOIT( glReadBuffer );
  369. JUSTDOIT( glCopyPixels );
  370. JUSTDOIT( glReadPixels );
  371. JUSTDOIT( glDrawPixels );
  372. JUSTDOIT( glGetBooleanv );
  373. JUSTDOIT( glGetClipPlane );
  374. JUSTDOIT( glGetDoublev );
  375. JUSTDOIT( glGetError );
  376. JUSTDOIT( glGetFloatv );
  377. JUSTDOIT( glGetIntegerv );
  378. JUSTDOIT( glGetLightfv );
  379. JUSTDOIT( glGetLightiv );
  380. JUSTDOIT( glGetMapdv );
  381. JUSTDOIT( glGetMapfv );
  382. JUSTDOIT( glGetMapiv );
  383. JUSTDOIT( glGetMaterialfv );
  384. JUSTDOIT( glGetMaterialiv );
  385. JUSTDOIT( glGetPixelMapfv );
  386. JUSTDOIT( glGetPixelMapuiv );
  387. JUSTDOIT( glGetPixelMapusv );
  388. JUSTDOIT( glGetPolygonStipple );
  389. JUSTDOIT( glGetString );
  390. JUSTDOIT( glGetTexEnvfv );
  391. JUSTDOIT( glGetTexEnviv );
  392. JUSTDOIT( glGetTexGendv );
  393. JUSTDOIT( glGetTexGenfv );
  394. JUSTDOIT( glGetTexGeniv );
  395. JUSTDOIT( glGetTexImage );
  396. JUSTDOIT( glGetTexParameterfv );
  397. JUSTDOIT( glGetTexParameteriv );
  398. JUSTDOIT( glGetTexLevelParameterfv );
  399. JUSTDOIT( glGetTexLevelParameteriv );
  400. JUSTDOIT( glIsEnabled );
  401. JUSTDOIT( glIsList );
  402. JUSTDOIT( glDepthRange );
  403. JUSTDOIT( glFrustum );
  404. JUSTDOIT( glLoadIdentity );
  405. JUSTDOIT( glLoadMatrixf );
  406. JUSTDOIT( glLoadMatrixd );
  407. JUSTDOIT( glMatrixMode );
  408. JUSTDOIT( glMultMatrixf );
  409. JUSTDOIT( glMultMatrixd );
  410. JUSTDOIT( glOrtho );
  411. JUSTDOIT( glPopMatrix );
  412. JUSTDOIT( glPushMatrix );
  413. JUSTDOIT( glRotated );
  414. JUSTDOIT( glRotatef );
  415. JUSTDOIT( glScaled );
  416. JUSTDOIT( glScalef );
  417. JUSTDOIT( glTranslated );
  418. JUSTDOIT( glTranslatef );
  419. JUSTDOIT( glViewport );
  420. }
  421. void
  422. oDo( char *Func, size_t Fo )
  423. {
  424. /*
  425. * This code will generate the following code:
  426. *
  427. * glNewList:
  428. * 00000000: 3C0E8000 lui t6,8000
  429. * 00000004: 8DCFF4A8 lw t7,F4A8(t6)
  430. * 00000008: 8DF80714 lw t8,0714(t7)
  431. * 0000000C: 03000008 jr t8
  432. * 00000010: 00000000 nop
  433. */
  434. printf(" .text\n");
  435. printf(" .align 2\n");
  436. #ifdef ADD_DEBUG_FORMATION
  437. printf(" .ent %s\n", Func);
  438. #endif
  439. printf(" .globl %s\n", Func);
  440. printf(" li $14, 0x%lX\n", PAGE_AFTER_LAST );
  441. printf(" lw $15, 0x%lX($14)\n",
  442. offsetof(KPCR, Teb) - OFFSET_FROM_PAGE );
  443. printf(" lw $24, 0x%lX($15)\n", offsetof(TEB, glDispatchTable)+Fo);
  444. printf(" j $24\n");
  445. #ifdef ADD_DEBUG_FORMATION
  446. printf(" .end\n");
  447. #endif
  448. printf("\n");
  449. }
  450. void
  451. Do( char *Func, size_t Fo )
  452. {
  453. /*
  454. * This code will generate the following code:
  455. *
  456. * glNewList:
  457. * 00000000: 3C0E8000 lui t6,8000
  458. * 00000004: 8DCFF4A8 lw t7,F4A8(t6)
  459. * 00000008: 8DF80714 lw t8,0714(t7)
  460. * 0000000C: 03000008 jr t8
  461. * 00000010: 00000000 nop
  462. */
  463. printf(" GL_TABLE_ENTRY(%s)\n", Func);
  464. printf(" lw t7, UsPcr + PcTeb\n");
  465. printf(" lw t8,TeglDispatchTable + 0x%lX(t7)\n", Fo);
  466. printf(" j t8\n");
  467. #ifdef ADD_DEBUG_FORMATION
  468. printf(" .end\n");
  469. #endif
  470. printf("\n");
  471. }
  472. void
  473. PrintEntryMacro(void)
  474. {
  475. printf("#define GL_TABLE_ENTRY(Name) \\\n");
  476. printf(" .text; \\\n");
  477. printf(" .align 2; \\\n");
  478. printf(" .globl Name; \\\n");
  479. printf(" .ent Name, 0; \\\n");
  480. printf("Name:; \\\n");
  481. printf(" .frame sp, 0, ra; \\\n");
  482. printf(" .prologue 0;\n\n");
  483. }