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.

1189 lines
34 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: dl_listc.c (formerly soft\so_listc.c)
  3. *
  4. * Display list compilation routines.
  5. *
  6. * Created: 12-27-1995
  7. * Author: Hock San Lee [hockl]
  8. *
  9. * Copyright (c) 1995 Microsoft Corporation
  10. \**************************************************************************/
  11. /*
  12. ** Copyright 1991,1992, Silicon Graphics, Inc.
  13. ** All Rights Reserved.
  14. **
  15. ** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  16. ** the contents of this file may not be disclosed to third parties, copied or
  17. ** duplicated in any form, in whole or in part, without the prior written
  18. ** permission of Silicon Graphics, Inc.
  19. **
  20. ** RESTRICTED RIGHTS LEGEND:
  21. ** Use, duplication or disclosure by the Government is subject to restrictions
  22. ** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  23. ** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  24. ** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  25. ** rights reserved under the Copyright Laws of the United States.
  26. **
  27. ** $Revision: 1.15 $
  28. ** $Date: 1993/10/23 00:34:54 $
  29. */
  30. #include "precomp.h"
  31. #pragma hdrstop
  32. /* Generic OpenGL Client using subbatching. */
  33. #include "glsbmsg.h"
  34. #include "glsbmsgh.h"
  35. #include "glsrvspt.h"
  36. #include "subbatch.h"
  37. #include "batchinf.h"
  38. #include "image.h" // __glFillImage and __glImageSize definitions
  39. #include "listcomp.h"
  40. #include "lcfuncs.h"
  41. #include "dlist.h"
  42. #include "dlistopt.h"
  43. #include "glclt.h"
  44. /*
  45. ** The code in here makes a lot of assumptions about the size of the
  46. ** various user types (GLfloat, GLint, etcetra).
  47. */
  48. void APIENTRY
  49. __gllc_Bitmap ( IN GLsizei width,
  50. IN GLsizei height,
  51. IN GLfloat xorig,
  52. IN GLfloat yorig,
  53. IN GLfloat xmove,
  54. IN GLfloat ymove,
  55. IN const GLubyte oldbits[]
  56. )
  57. {
  58. __GLbitmap *bitmap;
  59. GLubyte *newbits;
  60. GLint imageSize;
  61. __GL_SETUP();
  62. // Flush the command buffer before accessing server side gc states.
  63. glsbAttention();
  64. if ((width < 0) || (height < 0)) {
  65. __gllc_InvalidValue();
  66. return;
  67. }
  68. imageSize = height * ((width + 7) >> 3);
  69. imageSize = __GL_PAD(imageSize);
  70. bitmap = (__GLbitmap *)
  71. __glDlistAddOpUnaligned(gc, DLIST_SIZE(imageSize + sizeof(__GLbitmap)),
  72. DLIST_GENERIC_OP(Bitmap));
  73. if (bitmap == NULL) return;
  74. bitmap->width = width;
  75. bitmap->height = height;
  76. bitmap->xorig = xorig;
  77. bitmap->yorig = yorig;
  78. bitmap->xmove = xmove;
  79. bitmap->ymove = ymove;
  80. bitmap->imageSize = imageSize;
  81. newbits = (GLubyte *)bitmap + sizeof(__GLbitmap);
  82. __glFillImage(gc, width, height, GL_COLOR_INDEX, GL_BITMAP,
  83. oldbits, newbits);
  84. __glDlistAppendOp(gc, bitmap, __glle_Bitmap);
  85. }
  86. const GLubyte * FASTCALL __glle_Bitmap(__GLcontext *gc, const GLubyte *PC)
  87. {
  88. const __GLbitmap *bitmap;
  89. // Call the server side display list execute function.
  90. // Batch the pointer here but we need to flush the command buffer before
  91. // the memory is moved or modified!
  92. bitmap = (const __GLbitmap *) PC;
  93. GLCLIENT_BEGIN( Bitmap, BITMAP )
  94. pMsg->width = bitmap->width ;
  95. pMsg->height = bitmap->height ;
  96. pMsg->xorig = bitmap->xorig ;
  97. pMsg->yorig = bitmap->yorig ;
  98. pMsg->xmove = bitmap->xmove ;
  99. pMsg->ymove = bitmap->ymove ;
  100. pMsg->bitmapOff = (ULONG_PTR) bitmap ;
  101. pMsg->_IsDlist = GL_TRUE ;
  102. GLCLIENT_END
  103. return PC + sizeof(__GLbitmap) + bitmap->imageSize;
  104. }
  105. void APIENTRY
  106. __gllc_PolygonStipple ( const GLubyte *mask )
  107. {
  108. void *data;
  109. __GL_SETUP();
  110. GLubyte *newbits;
  111. // Flush the command buffer before accessing server side gc states.
  112. glsbAttention();
  113. newbits = (GLubyte *)
  114. __glDlistAddOpUnaligned(gc, DLIST_SIZE(__glImageSize(32, 32, GL_COLOR_INDEX, GL_BITMAP)),
  115. DLIST_GENERIC_OP(PolygonStipple));
  116. if (newbits == NULL) return;
  117. __glFillImage(gc, 32, 32, GL_COLOR_INDEX, GL_BITMAP, mask, newbits);
  118. __glDlistAppendOp(gc, newbits, __glle_PolygonStipple);
  119. }
  120. const GLubyte * FASTCALL __glle_PolygonStipple(__GLcontext *gc, const GLubyte *PC)
  121. {
  122. // Call the server side display list execute function.
  123. // Batch the pointer here but we need to flush the command buffer before
  124. // the memory is moved or modified!
  125. GLCLIENT_BEGIN( PolygonStipple, POLYGONSTIPPLE )
  126. pMsg->maskOff = (ULONG_PTR) PC ;
  127. pMsg->_IsDlist = GL_TRUE ;
  128. GLCLIENT_END
  129. return PC + __glImageSize(32, 32, GL_COLOR_INDEX, GL_BITMAP);
  130. }
  131. void
  132. __gllc_Map1_Internal ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint stride, IN GLint order, IN const void *points , GLboolean bDouble )
  133. {
  134. __GLmap1 *map1data;
  135. GLint k;
  136. GLint cmdsize;
  137. __GLfloat *data;
  138. __GL_SETUP();
  139. k=__glEvalComputeK(target);
  140. if (k < 0) {
  141. __gllc_InvalidEnum();
  142. return;
  143. }
  144. if (order > gc->constants.maxEvalOrder || stride < k ||
  145. order < 1 || u1 == u2) {
  146. __gllc_InvalidValue();
  147. return;
  148. }
  149. cmdsize = sizeof(__GLmap1) +
  150. __glMap1_size(k, order) * sizeof(__GLfloat);
  151. map1data = (__GLmap1 *)
  152. __glDlistAddOpUnaligned(gc, DLIST_SIZE(cmdsize), DLIST_GENERIC_OP(Map1));
  153. if (map1data == NULL) return;
  154. map1data->target = target;
  155. map1data->u1 = u1;
  156. map1data->u2 = u2;
  157. map1data->order = order;
  158. data = (__GLfloat *) ((GLubyte *)map1data + sizeof(__GLmap1));
  159. if (bDouble)
  160. __glFillMap1d(k, order, stride, (const GLdouble *) points, data);
  161. else
  162. __glFillMap1f(k, order, stride, (const GLfloat *) points, data);
  163. __glDlistAppendOp(gc, map1data, __glle_Map1);
  164. }
  165. void APIENTRY
  166. __gllc_Map1f ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint stride, IN GLint order, IN const GLfloat points[] )
  167. {
  168. __gllc_Map1_Internal(target, u1, u2, stride, order,
  169. (const void *) points, GL_FALSE);
  170. }
  171. void APIENTRY
  172. __gllc_Map1d ( IN GLenum target, IN GLdouble u1, IN GLdouble u2, IN GLint stride, IN GLint order, IN const GLdouble points[] )
  173. {
  174. __gllc_Map1_Internal(target, (GLfloat) u1, (GLfloat) u2, stride, order,
  175. (const void *) points, GL_TRUE);
  176. }
  177. const GLubyte * FASTCALL __glle_Map1(__GLcontext *gc, const GLubyte *PC)
  178. {
  179. const __GLmap1 *map1data;
  180. GLint k, dataSize;
  181. __GLevaluator1 *ev;
  182. __GLfloat *gc_data;
  183. POLYARRAY *pa;
  184. map1data = (const __GLmap1 *) PC;
  185. k = __glEvalComputeK(map1data->target);
  186. dataSize = __glMap1_size(k, map1data->order) * sizeof(__GLfloat);
  187. // Check if it is called inside a Begin-End block
  188. // If we are already in the begin/end bracket, return an error.
  189. pa = GLTEB_CLTPOLYARRAY();
  190. if (pa->flags & POLYARRAY_IN_BEGIN)
  191. {
  192. GLSETERROR(GL_INVALID_OPERATION);
  193. return PC + sizeof(__GLmap1) + dataSize;
  194. }
  195. ev = __glSetUpMap1 (gc, map1data->target, map1data->order,
  196. map1data->u1, map1data->u2);
  197. if (ev != 0)
  198. {
  199. gc_data = gc->eval.eval1Data[__GL_EVAL1D_INDEX(map1data->target)];
  200. memcpy (gc_data, (GLfloat *) (PC + sizeof(__GLmap1)), dataSize);
  201. }
  202. return PC + sizeof(__GLmap1) + dataSize;
  203. }
  204. void
  205. __gllc_Map2_Internal ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint ustride, IN GLint uorder, IN GLfloat v1, IN GLfloat v2, IN GLint vstride, IN GLint vorder, IN const void *points , GLboolean bDouble )
  206. {
  207. __GLmap2 *map2data;
  208. GLint k;
  209. GLint cmdsize;
  210. __GLfloat *data;
  211. __GL_SETUP();
  212. k=__glEvalComputeK(target);
  213. if (k < 0) {
  214. __gllc_InvalidEnum();
  215. return;
  216. }
  217. if (vorder > gc->constants.maxEvalOrder || vstride < k ||
  218. vorder < 1 || u1 == u2 || ustride < k ||
  219. uorder > gc->constants.maxEvalOrder || uorder < 1 ||
  220. v1 == v2) {
  221. __gllc_InvalidValue();
  222. return;
  223. }
  224. cmdsize = sizeof(__GLmap2) +
  225. __glMap2_size(k, uorder, vorder) * sizeof(__GLfloat);
  226. map2data = (__GLmap2 *)
  227. __glDlistAddOpUnaligned(gc, DLIST_SIZE(cmdsize), DLIST_GENERIC_OP(Map2));
  228. if (map2data == NULL) return;
  229. map2data->target = target;
  230. map2data->u1 = u1;
  231. map2data->u2 = u2;
  232. map2data->uorder = uorder;
  233. map2data->v1 = v1;
  234. map2data->v2 = v2;
  235. map2data->vorder = vorder;
  236. data = (__GLfloat *) ((GLubyte *)map2data + sizeof(__GLmap2));
  237. if (bDouble)
  238. __glFillMap2d(k, uorder, vorder, ustride, vstride,
  239. (const GLdouble *) points, data);
  240. else
  241. __glFillMap2f(k, uorder, vorder, ustride, vstride,
  242. (const GLfloat *) points, data);
  243. __glDlistAppendOp(gc, map2data, __glle_Map2);
  244. }
  245. void APIENTRY
  246. __gllc_Map2f ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint ustride, IN GLint uorder, IN GLfloat v1, IN GLfloat v2, IN GLint vstride, IN GLint vorder, IN const GLfloat points[] )
  247. {
  248. __gllc_Map2_Internal(target, u1, u2, ustride, uorder,
  249. v1, v2, vstride, vorder, (const void *) points, GL_FALSE);
  250. }
  251. void APIENTRY
  252. __gllc_Map2d ( IN GLenum target, IN GLdouble u1, IN GLdouble u2, IN GLint ustride, IN GLint uorder, IN GLdouble v1, IN GLdouble v2, IN GLint vstride, IN GLint vorder, IN const GLdouble points[] )
  253. {
  254. __gllc_Map2_Internal(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
  255. (GLfloat) v1, (GLfloat) v2, vstride, vorder, (const void *) points, GL_TRUE);
  256. }
  257. const GLubyte * FASTCALL __glle_Map2(__GLcontext *gc, const GLubyte *PC)
  258. {
  259. const __GLmap2 *map2data;
  260. GLint k, dataSize;
  261. __GLevaluator2 *ev;
  262. __GLfloat *gc_data;
  263. POLYARRAY *pa;
  264. map2data = (const __GLmap2 *) PC;
  265. k = __glEvalComputeK (map2data->target);
  266. dataSize = __glMap2_size(k, map2data->uorder, map2data->vorder) *
  267. sizeof(__GLfloat);
  268. // Check if it is called inside a Begin-End block
  269. // If we are already in the begin/end bracket, return an error.
  270. pa = GLTEB_CLTPOLYARRAY();
  271. if (pa->flags & POLYARRAY_IN_BEGIN)
  272. {
  273. GLSETERROR(GL_INVALID_OPERATION);
  274. return PC + sizeof(__GLmap2) + dataSize;
  275. }
  276. ev = __glSetUpMap2 (gc, map2data->target,
  277. map2data->uorder, map2data->vorder,
  278. map2data->u1, map2data->u2,
  279. map2data->v1, map2data->v2);
  280. if (ev != 0)
  281. {
  282. gc_data = gc->eval.eval2Data[__GL_EVAL2D_INDEX(map2data->target)];
  283. memcpy (gc_data, (GLfloat *) (PC + sizeof(__GLmap2)), dataSize);
  284. }
  285. return PC + sizeof(__GLmap2) + dataSize;
  286. }
  287. void APIENTRY
  288. __gllc_DrawPixels ( IN GLsizei width,
  289. IN GLsizei height,
  290. IN GLenum format,
  291. IN GLenum type,
  292. IN const GLvoid *pixels
  293. )
  294. {
  295. __GLdrawPixels *pixdata;
  296. GLint imageSize;
  297. GLboolean index;
  298. __GL_SETUP();
  299. // Flush the command buffer before accessing server side gc states.
  300. glsbAttention();
  301. if ((width < 0) || (height < 0)) {
  302. __gllc_InvalidValue();
  303. return;
  304. }
  305. switch (format) {
  306. case GL_STENCIL_INDEX:
  307. case GL_COLOR_INDEX:
  308. index = GL_TRUE;
  309. break;
  310. case GL_RED:
  311. case GL_GREEN:
  312. case GL_BLUE:
  313. case GL_ALPHA:
  314. case GL_RGB:
  315. case GL_RGBA:
  316. case GL_LUMINANCE:
  317. case GL_LUMINANCE_ALPHA:
  318. case GL_DEPTH_COMPONENT:
  319. #ifdef GL_EXT_bgra
  320. case GL_BGRA_EXT:
  321. case GL_BGR_EXT:
  322. #endif
  323. index = GL_FALSE;
  324. break;
  325. default:
  326. __gllc_InvalidEnum();
  327. return;
  328. }
  329. switch (type) {
  330. case GL_BITMAP:
  331. if (!index) {
  332. __gllc_InvalidEnum();
  333. return;
  334. }
  335. break;
  336. case GL_BYTE:
  337. case GL_UNSIGNED_BYTE:
  338. case GL_SHORT:
  339. case GL_UNSIGNED_SHORT:
  340. case GL_INT:
  341. case GL_UNSIGNED_INT:
  342. case GL_FLOAT:
  343. break;
  344. default:
  345. __gllc_InvalidEnum();
  346. return;
  347. }
  348. imageSize = __glImageSize(width, height, format, type);
  349. imageSize = __GL_PAD(imageSize);
  350. pixdata = (__GLdrawPixels *)
  351. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLdrawPixels) + imageSize),
  352. DLIST_GENERIC_OP(DrawPixels));
  353. if (pixdata == NULL) return;
  354. pixdata->width = width;
  355. pixdata->height = height;
  356. pixdata->format = format;
  357. pixdata->type = type;
  358. __glFillImage(gc, width, height, format, type, pixels,
  359. (GLubyte *)pixdata + sizeof(__GLdrawPixels));
  360. __glDlistAppendOp(gc, pixdata, __glle_DrawPixels);
  361. }
  362. const GLubyte * FASTCALL __glle_DrawPixels(__GLcontext *gc, const GLubyte *PC)
  363. {
  364. const __GLdrawPixels *pixdata;
  365. GLint imageSize;
  366. // Call the server side display list execute function.
  367. // Batch the pointer here but we need to flush the command buffer before
  368. // the memory is moved or modified!
  369. pixdata = (const __GLdrawPixels *) PC;
  370. imageSize = __glImageSize(pixdata->width, pixdata->height,
  371. pixdata->format, pixdata->type);
  372. GLCLIENT_BEGIN( DrawPixels, DRAWPIXELS )
  373. pMsg->width = pixdata->width ;
  374. pMsg->height = pixdata->height ;
  375. pMsg->format = pixdata->format ;
  376. pMsg->type = pixdata->type ;
  377. pMsg->pixelsOff = (ULONG_PTR) (pixdata+1) ;
  378. pMsg->_IsDlist = GL_TRUE ;
  379. GLCLIENT_END
  380. return PC + sizeof(__GLdrawPixels) + __GL_PAD(imageSize);
  381. }
  382. void APIENTRY
  383. __gllc_TexImage1D ( IN GLenum target,
  384. IN GLint level,
  385. IN GLint components,
  386. IN GLsizei width,
  387. IN GLint border,
  388. IN GLenum format,
  389. IN GLenum type,
  390. IN const GLvoid *pixels
  391. )
  392. {
  393. __GLtexImage1D *texdata;
  394. GLint imageSize;
  395. GLboolean index;
  396. __GL_SETUP();
  397. // Flush the command buffer before accessing server side gc states.
  398. glsbAttention();
  399. if (border < 0 || border > 1) {
  400. __gllc_InvalidValue();
  401. return;
  402. }
  403. if (width < 0) {
  404. __gllc_InvalidValue();
  405. return;
  406. }
  407. switch (format) {
  408. case GL_COLOR_INDEX:
  409. index = GL_TRUE;
  410. break;
  411. case GL_RED:
  412. case GL_GREEN:
  413. case GL_BLUE:
  414. case GL_ALPHA:
  415. case GL_RGB:
  416. case GL_RGBA:
  417. case GL_LUMINANCE:
  418. case GL_LUMINANCE_ALPHA:
  419. #ifdef GL_EXT_bgra
  420. case GL_BGRA_EXT:
  421. case GL_BGR_EXT:
  422. #endif
  423. index = GL_FALSE;
  424. break;
  425. default:
  426. __gllc_InvalidEnum();
  427. return;
  428. }
  429. switch (type) {
  430. case GL_BITMAP:
  431. if (!index) {
  432. __gllc_InvalidEnum();
  433. return;
  434. }
  435. break;
  436. case GL_BYTE:
  437. case GL_UNSIGNED_BYTE:
  438. case GL_SHORT:
  439. case GL_UNSIGNED_SHORT:
  440. case GL_INT:
  441. case GL_UNSIGNED_INT:
  442. case GL_FLOAT:
  443. break;
  444. default:
  445. __gllc_InvalidEnum();
  446. return;
  447. }
  448. if (target == GL_PROXY_TEXTURE_1D) {
  449. glcltTexImage1D(target, level, components, width, border, format,
  450. type, pixels);
  451. return;
  452. } else if (target != GL_TEXTURE_1D) {
  453. __gllc_InvalidEnum();
  454. return;
  455. } else if (pixels == NULL) {
  456. imageSize = 0;
  457. } else {
  458. imageSize = __glImageSize(width, 1, format, type);
  459. }
  460. imageSize = __GL_PAD(imageSize);
  461. texdata = (__GLtexImage1D *)
  462. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexImage1D)+imageSize),
  463. DLIST_GENERIC_OP(TexImage1D));
  464. if (texdata == NULL) return;
  465. texdata->target = target;
  466. texdata->level = level;
  467. texdata->components = components;
  468. texdata->width = width;
  469. texdata->border = border;
  470. texdata->format = format;
  471. texdata->type = type;
  472. texdata->imageSize = imageSize;
  473. if (imageSize > 0)
  474. {
  475. __glFillImage(gc, width, 1, format, type, pixels,
  476. (GLubyte *)texdata + sizeof(__GLtexImage1D));
  477. }
  478. __glDlistAppendOp(gc, texdata, __glle_TexImage1D);
  479. }
  480. void APIENTRY
  481. __gllc_TexImage2D ( IN GLenum target,
  482. IN GLint level,
  483. IN GLint components,
  484. IN GLsizei width,
  485. IN GLsizei height,
  486. IN GLint border,
  487. IN GLenum format,
  488. IN GLenum type,
  489. IN const GLvoid *pixels
  490. )
  491. {
  492. __GLtexImage2D *texdata;
  493. GLint imageSize;
  494. GLboolean index;
  495. __GL_SETUP();
  496. // Flush the command buffer before accessing server side gc states.
  497. glsbAttention();
  498. if (border < 0 || border > 1) {
  499. __gllc_InvalidValue();
  500. return;
  501. }
  502. if ((width < 0) || (height < 0)) {
  503. __gllc_InvalidValue();
  504. return;
  505. }
  506. switch (format) {
  507. case GL_COLOR_INDEX:
  508. index = GL_TRUE;
  509. break;
  510. case GL_RED:
  511. case GL_GREEN:
  512. case GL_BLUE:
  513. case GL_ALPHA:
  514. case GL_RGB:
  515. case GL_RGBA:
  516. case GL_LUMINANCE:
  517. case GL_LUMINANCE_ALPHA:
  518. #ifdef GL_EXT_bgra
  519. case GL_BGRA_EXT:
  520. case GL_BGR_EXT:
  521. #endif
  522. index = GL_FALSE;
  523. break;
  524. default:
  525. __gllc_InvalidEnum();
  526. return;
  527. }
  528. switch (type) {
  529. case GL_BITMAP:
  530. if (!index) {
  531. __gllc_InvalidEnum();
  532. return;
  533. }
  534. break;
  535. case GL_BYTE:
  536. case GL_UNSIGNED_BYTE:
  537. case GL_SHORT:
  538. case GL_UNSIGNED_SHORT:
  539. case GL_INT:
  540. case GL_UNSIGNED_INT:
  541. case GL_FLOAT:
  542. break;
  543. default:
  544. __gllc_InvalidEnum();
  545. return;
  546. }
  547. if (target == GL_PROXY_TEXTURE_2D) {
  548. glcltTexImage2D(target, level, components, width, height, border,
  549. format, type, pixels);
  550. return;
  551. } else if (target != GL_TEXTURE_2D) {
  552. __gllc_InvalidEnum();
  553. return;
  554. } else if (pixels == NULL) {
  555. imageSize = 0;
  556. } else {
  557. imageSize = __glImageSize(width, height, format, type);
  558. }
  559. imageSize = __GL_PAD(imageSize);
  560. texdata = (__GLtexImage2D *)
  561. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexImage2D) + imageSize),
  562. DLIST_GENERIC_OP(TexImage2D));
  563. if (texdata == NULL) return;
  564. texdata->target = target;
  565. texdata->level = level;
  566. texdata->components = components;
  567. texdata->width = width;
  568. texdata->height = height;
  569. texdata->border = border;
  570. texdata->format = format;
  571. texdata->type = type;
  572. texdata->imageSize = imageSize;
  573. if (imageSize > 0)
  574. {
  575. __glFillImage(gc, width, height, format, type, pixels,
  576. (GLubyte *) (GLubyte *)texdata + sizeof(__GLtexImage2D));
  577. }
  578. __glDlistAppendOp(gc, texdata, __glle_TexImage2D);
  579. }
  580. const GLubyte * FASTCALL __glle_TexImage1D(__GLcontext *gc, const GLubyte *PC)
  581. {
  582. const __GLtexImage1D *data;
  583. // Call the server side display list execute function.
  584. // Batch the pointer here but we need to flush the command buffer before
  585. // the memory is moved or modified!
  586. data = (const __GLtexImage1D *) PC;
  587. GLCLIENT_BEGIN( TexImage1D, TEXIMAGE1D )
  588. pMsg->target = data->target ;
  589. pMsg->level = data->level ;
  590. pMsg->components = data->components ;
  591. pMsg->width = data->width ;
  592. pMsg->border = data->border ;
  593. pMsg->format = data->format ;
  594. pMsg->type = data->type ;
  595. pMsg->pixelsOff = data->imageSize > 0 ? (ULONG_PTR) (data+1) : 0;
  596. pMsg->_IsDlist = GL_TRUE ;
  597. GLCLIENT_END
  598. return PC + sizeof(__GLtexImage1D) + data->imageSize;
  599. }
  600. const GLubyte * FASTCALL __glle_TexImage2D(__GLcontext *gc, const GLubyte *PC)
  601. {
  602. const __GLtexImage2D *data;
  603. // Call the server side display list execute function.
  604. // Batch the pointer here but we need to flush the command buffer before
  605. // the memory is moved or modified!
  606. data = (const __GLtexImage2D *) PC;
  607. GLCLIENT_BEGIN( TexImage2D, TEXIMAGE2D )
  608. pMsg->target = data->target ;
  609. pMsg->level = data->level ;
  610. pMsg->components = data->components ;
  611. pMsg->width = data->width ;
  612. pMsg->height = data->height ;
  613. pMsg->border = data->border ;
  614. pMsg->format = data->format ;
  615. pMsg->type = data->type ;
  616. pMsg->pixelsOff = data->imageSize > 0 ? (ULONG_PTR) (data+1) : 0;
  617. pMsg->_IsDlist = GL_TRUE ;
  618. GLCLIENT_END
  619. return PC + sizeof(__GLtexImage2D) + data->imageSize;
  620. }
  621. void APIENTRY __gllc_TexSubImage1D(GLenum target, GLint level, GLint xoffset,
  622. GLsizei width, GLenum format, GLenum type,
  623. const GLvoid *pixels)
  624. {
  625. __GLtexSubImage1D *texdata;
  626. GLint imageSize;
  627. GLboolean index;
  628. __GL_SETUP();
  629. // Flush the command buffer before accessing server side gc states.
  630. glsbAttention();
  631. if (width < 0) {
  632. __gllc_InvalidValue();
  633. return;
  634. }
  635. switch (format) {
  636. case GL_COLOR_INDEX:
  637. index = GL_TRUE;
  638. break;
  639. case GL_RED:
  640. case GL_GREEN:
  641. case GL_BLUE:
  642. case GL_ALPHA:
  643. case GL_RGB:
  644. case GL_RGBA:
  645. case GL_LUMINANCE:
  646. case GL_LUMINANCE_ALPHA:
  647. #ifdef GL_EXT_bgra
  648. case GL_BGRA_EXT:
  649. case GL_BGR_EXT:
  650. #endif
  651. index = GL_FALSE;
  652. break;
  653. default:
  654. __gllc_InvalidEnum();
  655. return;
  656. }
  657. switch (type) {
  658. case GL_BITMAP:
  659. if (!index) {
  660. __gllc_InvalidEnum();
  661. return;
  662. }
  663. break;
  664. case GL_BYTE:
  665. case GL_UNSIGNED_BYTE:
  666. case GL_SHORT:
  667. case GL_UNSIGNED_SHORT:
  668. case GL_INT:
  669. case GL_UNSIGNED_INT:
  670. case GL_FLOAT:
  671. break;
  672. default:
  673. __gllc_InvalidEnum();
  674. return;
  675. }
  676. imageSize = __glImageSize(width, 1, format, type);
  677. imageSize = __GL_PAD(imageSize);
  678. texdata = (__GLtexSubImage1D *)
  679. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexSubImage1D) + imageSize),
  680. DLIST_GENERIC_OP(TexSubImage1D));
  681. if (texdata == NULL) return;
  682. texdata->target = target;
  683. texdata->level = level;
  684. texdata->xoffset = xoffset;
  685. texdata->width = width;
  686. texdata->format = format;
  687. texdata->type = type;
  688. texdata->imageSize = imageSize;
  689. if (imageSize > 0) {
  690. __glFillImage(gc, width, 1, format, type, pixels,
  691. (GLubyte *)texdata + sizeof(__GLtexSubImage1D));
  692. }
  693. __glDlistAppendOp(gc, texdata, __glle_TexSubImage1D);
  694. }
  695. void APIENTRY __gllc_TexSubImage2D(GLenum target, GLint level, GLint xoffset,
  696. GLint yoffset, GLsizei width, GLsizei height,
  697. GLenum format, GLenum type,
  698. const GLvoid *pixels)
  699. {
  700. __GLtexSubImage2D *texdata;
  701. GLint imageSize;
  702. GLboolean index;
  703. __GL_SETUP();
  704. // Flush the command buffer before accessing server side gc states.
  705. glsbAttention();
  706. if ((width < 0) || (height < 0)) {
  707. __gllc_InvalidValue();
  708. return;
  709. }
  710. switch (format) {
  711. case GL_COLOR_INDEX:
  712. index = GL_TRUE;
  713. break;
  714. case GL_RED:
  715. case GL_GREEN:
  716. case GL_BLUE:
  717. case GL_ALPHA:
  718. case GL_RGB:
  719. case GL_RGBA:
  720. case GL_LUMINANCE:
  721. case GL_LUMINANCE_ALPHA:
  722. #ifdef GL_EXT_bgra
  723. case GL_BGRA_EXT:
  724. case GL_BGR_EXT:
  725. #endif
  726. index = GL_FALSE;
  727. break;
  728. default:
  729. __gllc_InvalidEnum();
  730. return;
  731. }
  732. switch (type) {
  733. case GL_BITMAP:
  734. if (!index) {
  735. __gllc_InvalidEnum();
  736. return;
  737. }
  738. break;
  739. case GL_BYTE:
  740. case GL_UNSIGNED_BYTE:
  741. case GL_SHORT:
  742. case GL_UNSIGNED_SHORT:
  743. case GL_INT:
  744. case GL_UNSIGNED_INT:
  745. case GL_FLOAT:
  746. break;
  747. default:
  748. __gllc_InvalidEnum();
  749. return;
  750. }
  751. imageSize = __glImageSize(width, height, format, type);
  752. imageSize = __GL_PAD(imageSize);
  753. texdata = (__GLtexSubImage2D *)
  754. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexSubImage2D) + imageSize),
  755. DLIST_GENERIC_OP(TexSubImage2D));
  756. if (texdata == NULL) return;
  757. texdata->target = target;
  758. texdata->level = level;
  759. texdata->xoffset = xoffset;
  760. texdata->yoffset = yoffset;
  761. texdata->width = width;
  762. texdata->height = height;
  763. texdata->format = format;
  764. texdata->type = type;
  765. texdata->imageSize = imageSize;
  766. if (imageSize > 0) {
  767. __glFillImage(gc, width, height, format, type, pixels,
  768. (GLubyte *) texdata + sizeof(__GLtexSubImage2D));
  769. }
  770. __glDlistAppendOp(gc, texdata, __glle_TexSubImage2D);
  771. }
  772. const GLubyte * FASTCALL __glle_TexSubImage1D(__GLcontext *gc, const GLubyte *PC)
  773. {
  774. const __GLtexSubImage1D *data;
  775. // Call the server side display list execute function.
  776. // Batch the pointer here but we need to flush the command buffer before
  777. // the memory is moved or modified!
  778. data = (const __GLtexSubImage1D *) PC;
  779. GLCLIENT_BEGIN( TexSubImage1D, TEXSUBIMAGE1D )
  780. pMsg->target = data->target ;
  781. pMsg->level = data->level ;
  782. pMsg->xoffset = data->xoffset ;
  783. pMsg->width = data->width ;
  784. pMsg->format = data->format ;
  785. pMsg->type = data->type ;
  786. pMsg->pixelsOff = (ULONG_PTR) (data+1) ;
  787. pMsg->_IsDlist = GL_TRUE ;
  788. GLCLIENT_END
  789. return PC + sizeof(__GLtexSubImage1D) + data->imageSize;
  790. }
  791. const GLubyte * FASTCALL __glle_TexSubImage2D(__GLcontext *gc, const GLubyte *PC)
  792. {
  793. const __GLtexSubImage2D *data;
  794. // Call the server side display list execute function.
  795. // Batch the pointer here but we need to flush the command buffer before
  796. // the memory is moved or modified!
  797. data = (const __GLtexSubImage2D *) PC;
  798. GLCLIENT_BEGIN( TexSubImage2D, TEXSUBIMAGE2D )
  799. pMsg->target = data->target ;
  800. pMsg->level = data->level ;
  801. pMsg->xoffset = data->xoffset ;
  802. pMsg->yoffset = data->yoffset ;
  803. pMsg->width = data->width ;
  804. pMsg->height = data->height ;
  805. pMsg->format = data->format ;
  806. pMsg->type = data->type ;
  807. pMsg->pixelsOff = (ULONG_PTR) (data+1) ;
  808. pMsg->_IsDlist = GL_TRUE ;
  809. GLCLIENT_END
  810. return PC + sizeof(__GLtexSubImage2D) + data->imageSize;
  811. }
  812. GLint __gllc_CheckColorTableArgs(GLenum target, GLsizei count,
  813. GLenum format, GLenum type)
  814. {
  815. GLint imageSize;
  816. switch (type) {
  817. case GL_BYTE:
  818. case GL_UNSIGNED_BYTE:
  819. case GL_SHORT:
  820. case GL_UNSIGNED_SHORT:
  821. case GL_INT:
  822. case GL_UNSIGNED_INT:
  823. case GL_FLOAT:
  824. break;
  825. default:
  826. __gllc_InvalidEnum();
  827. return -1;
  828. }
  829. switch (format)
  830. {
  831. case GL_RED:
  832. case GL_GREEN: case GL_BLUE:
  833. case GL_ALPHA: case GL_RGB:
  834. case GL_RGBA:
  835. #ifdef GL_EXT_bgra
  836. case GL_BGRA_EXT:
  837. case GL_BGR_EXT:
  838. #endif
  839. break;
  840. default:
  841. __gllc_InvalidEnum();
  842. return -1;
  843. }
  844. if (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D &&
  845. target != GL_PROXY_TEXTURE_1D && target != GL_PROXY_TEXTURE_2D)
  846. {
  847. __gllc_InvalidEnum();
  848. return -1;
  849. }
  850. else
  851. {
  852. imageSize = __glImageSize(count, 1, format, type);
  853. }
  854. imageSize = __GL_PAD(imageSize);
  855. return imageSize;
  856. }
  857. void APIENTRY
  858. __gllc_ColorTableEXT ( IN GLenum target,
  859. IN GLenum internalFormat,
  860. IN GLsizei width,
  861. IN GLenum format,
  862. IN GLenum type,
  863. IN const GLvoid *data
  864. )
  865. {
  866. __GLcolorTableEXT *record;
  867. GLint imageSize;
  868. __GL_SETUP();
  869. // Flush the command buffer before accessing server side gc states.
  870. glsbAttention();
  871. imageSize = __gllc_CheckColorTableArgs(target, width, format, type);
  872. if (imageSize < 0)
  873. {
  874. return;
  875. }
  876. switch(internalFormat)
  877. {
  878. case GL_RGB: case 3:
  879. case GL_R3_G3_B2: case GL_RGB4:
  880. case GL_RGB5: case GL_RGB8:
  881. case GL_RGB10: case GL_RGB12:
  882. case GL_RGB16:
  883. #ifdef GL_EXT_bgra
  884. case GL_BGR_EXT:
  885. #endif
  886. break;
  887. case GL_RGBA: case 4:
  888. case GL_RGBA2: case GL_RGBA4:
  889. case GL_RGBA8: case GL_RGB5_A1:
  890. case GL_RGBA12: case GL_RGBA16:
  891. case GL_RGB10_A2:
  892. #ifdef GL_EXT_bgra
  893. case GL_BGRA_EXT:
  894. #endif
  895. break;
  896. default:
  897. __gllc_InvalidEnum();
  898. return;
  899. }
  900. record = (__GLcolorTableEXT *)
  901. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLcolorTableEXT)+imageSize),
  902. DLIST_GENERIC_OP(ColorTableEXT));
  903. if (record == NULL) return;
  904. record->target = target;
  905. record->internalFormat = internalFormat;
  906. record->width = width;
  907. record->format = format;
  908. record->type = type;
  909. record->imageSize = imageSize;
  910. if (imageSize > 0)
  911. {
  912. __glFillImage(gc, width, 1, format, type, data,
  913. (GLubyte *)record + sizeof(__GLcolorTableEXT));
  914. }
  915. __glDlistAppendOp(gc, record, __glle_ColorTableEXT);
  916. }
  917. const GLubyte * FASTCALL __glle_ColorTableEXT(__GLcontext *gc,
  918. const GLubyte *PC)
  919. {
  920. const __GLcolorTableEXT *data;
  921. // Call the server side display list execute function.
  922. // Batch the pointer here but we need to flush the command buffer before
  923. // the memory is moved or modified!
  924. data = (const __GLcolorTableEXT *) PC;
  925. GLCLIENT_BEGIN( ColorTableEXT, COLORTABLEEXT )
  926. pMsg->target = data->target ;
  927. pMsg->internalFormat = data->internalFormat;
  928. pMsg->width = data->width ;
  929. pMsg->format = data->format ;
  930. pMsg->type = data->type ;
  931. pMsg->data = (const GLvoid *) (data+1);
  932. pMsg->_IsDlist = GL_TRUE ;
  933. GLCLIENT_END
  934. return PC + sizeof(__GLcolorTableEXT) + data->imageSize;
  935. }
  936. void APIENTRY
  937. __gllc_ColorSubTableEXT ( IN GLenum target,
  938. IN GLsizei start,
  939. IN GLsizei count,
  940. IN GLenum format,
  941. IN GLenum type,
  942. IN const GLvoid *data
  943. )
  944. {
  945. __GLcolorSubTableEXT *record;
  946. GLint imageSize;
  947. __GL_SETUP();
  948. // Flush the command buffer before accessing server side gc states.
  949. glsbAttention();
  950. imageSize = __gllc_CheckColorTableArgs(target, count, format, type);
  951. if (imageSize < 0)
  952. {
  953. return;
  954. }
  955. record = (__GLcolorSubTableEXT *)
  956. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLcolorSubTableEXT)+imageSize),
  957. DLIST_GENERIC_OP(ColorSubTableEXT));
  958. if (record == NULL) return;
  959. record->target = target;
  960. record->start = start;
  961. record->count = count;
  962. record->format = format;
  963. record->type = type;
  964. record->imageSize = imageSize;
  965. if (imageSize > 0)
  966. {
  967. __glFillImage(gc, count, 1, format, type, data,
  968. (GLubyte *)record + sizeof(__GLcolorSubTableEXT));
  969. }
  970. __glDlistAppendOp(gc, record, __glle_ColorSubTableEXT);
  971. }
  972. const GLubyte * FASTCALL __glle_ColorSubTableEXT(__GLcontext *gc,
  973. const GLubyte *PC)
  974. {
  975. const __GLcolorSubTableEXT *data;
  976. // Call the server side display list execute function.
  977. // Batch the pointer here but we need to flush the command buffer before
  978. // the memory is moved or modified!
  979. data = (const __GLcolorSubTableEXT *) PC;
  980. GLCLIENT_BEGIN( ColorSubTableEXT, COLORSUBTABLEEXT )
  981. pMsg->target = data->target ;
  982. pMsg->start = data->start ;
  983. pMsg->count = data->count ;
  984. pMsg->format = data->format ;
  985. pMsg->type = data->type ;
  986. pMsg->data = (const GLvoid *) (data+1);
  987. pMsg->_IsDlist = GL_TRUE ;
  988. GLCLIENT_END
  989. return PC + sizeof(__GLcolorSubTableEXT) + data->imageSize;
  990. }
  991. #ifdef GL_WIN_multiple_textures
  992. void APIENTRY __gllc_CurrentTextureIndexWIN
  993. (GLuint index)
  994. {
  995. struct __gllc_CurrentTextureIndexWIN_Rec *data;
  996. __GL_SETUP();
  997. data = (struct __gllc_CurrentTextureIndexWIN_Rec *)
  998. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_CurrentTextureIndexWIN_Rec)),
  999. DLIST_GENERIC_OP(CurrentTextureIndexWIN));
  1000. if (data == NULL) return;
  1001. data->index = index;
  1002. __glDlistAppendOp(gc, data, __glle_CurrentTextureIndexWIN);
  1003. }
  1004. void APIENTRY __gllc_BindNthTextureWIN
  1005. (GLuint index, GLenum target, GLuint texture)
  1006. {
  1007. struct __gllc_BindNthTextureWIN_Rec *data;
  1008. __GL_SETUP();
  1009. data = (struct __gllc_BindNthTextureWIN_Rec *)
  1010. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_BindNthTextureWIN_Rec)),
  1011. DLIST_GENERIC_OP(BindNthTextureWIN));
  1012. if (data == NULL) return;
  1013. data->index = index;
  1014. data->target = target;
  1015. data->texture = texture;
  1016. __glDlistAppendOp(gc, data, __glle_BindNthTextureWIN);
  1017. }
  1018. void APIENTRY __gllc_NthTexCombineFuncWIN
  1019. (GLuint index,
  1020. GLenum leftColorFactor, GLenum colorOp, GLenum rightColorFactor,
  1021. GLenum leftAlphaFactor, GLenum alphaOp, GLenum rightAlphaFactor)
  1022. {
  1023. struct __gllc_NthTexCombineFuncWIN_Rec *data;
  1024. __GL_SETUP();
  1025. data = (struct __gllc_NthTexCombineFuncWIN_Rec *)
  1026. __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_NthTexCombineFuncWIN_Rec)),
  1027. DLIST_GENERIC_OP(NthTexCombineFuncWIN));
  1028. if (data == NULL) return;
  1029. data->index = index;
  1030. data->leftColorFactor = leftColorFactor;
  1031. data->colorOp = colorOp;
  1032. data->rightColorFactor = rightColorFactor;
  1033. data->leftAlphaFactor = leftAlphaFactor;
  1034. data->alphaOp = alphaOp;
  1035. data->rightAlphaFactor = rightAlphaFactor;
  1036. __glDlistAppendOp(gc, data, __glle_NthTexCombineFuncWIN);
  1037. }
  1038. #endif // GL_WIN_multiple_textures