glxcmdsswap.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. /*
  2. * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
  3. * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice including the dates of first publication and
  13. * either this permission notice or a reference to
  14. * http://oss.sgi.com/projects/FreeB/
  15. * shall be included in all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  21. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
  22. * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23. * SOFTWARE.
  24. *
  25. * Except as contained in this notice, the name of Silicon Graphics, Inc.
  26. * shall not be used in advertising or otherwise to promote the sale, use or
  27. * other dealings in this Software without prior written authorization from
  28. * Silicon Graphics, Inc.
  29. */
  30. #ifdef HAVE_DIX_CONFIG_H
  31. #include <dix-config.h>
  32. #endif
  33. #include <string.h>
  34. #include "glxserver.h"
  35. #include "glxutil.h"
  36. #include <GL/glxtokens.h>
  37. #include <unpack.h>
  38. #include <pixmapstr.h>
  39. #include <windowstr.h>
  40. #include "glxext.h"
  41. #include "indirect_dispatch.h"
  42. #include "indirect_table.h"
  43. #include "indirect_util.h"
  44. /************************************************************************/
  45. /*
  46. ** Byteswapping versions of GLX commands. In most cases they just swap
  47. ** the incoming arguments and then call the unswapped routine. For commands
  48. ** that have replies, a separate swapping routine for the reply is provided;
  49. ** it is called at the end of the unswapped routine.
  50. */
  51. int
  52. __glXDispSwap_CreateContext(__GLXclientState * cl, GLbyte * pc)
  53. {
  54. ClientPtr client = cl->client;
  55. xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
  56. __GLX_DECLARE_SWAP_VARIABLES;
  57. REQUEST_SIZE_MATCH(xGLXCreateContextReq);
  58. __GLX_SWAP_SHORT(&req->length);
  59. __GLX_SWAP_INT(&req->context);
  60. __GLX_SWAP_INT(&req->visual);
  61. __GLX_SWAP_INT(&req->screen);
  62. __GLX_SWAP_INT(&req->shareList);
  63. return __glXDisp_CreateContext(cl, pc);
  64. }
  65. int
  66. __glXDispSwap_CreateNewContext(__GLXclientState * cl, GLbyte * pc)
  67. {
  68. ClientPtr client = cl->client;
  69. xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
  70. __GLX_DECLARE_SWAP_VARIABLES;
  71. REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
  72. __GLX_SWAP_SHORT(&req->length);
  73. __GLX_SWAP_INT(&req->context);
  74. __GLX_SWAP_INT(&req->fbconfig);
  75. __GLX_SWAP_INT(&req->screen);
  76. __GLX_SWAP_INT(&req->renderType);
  77. __GLX_SWAP_INT(&req->shareList);
  78. return __glXDisp_CreateNewContext(cl, pc);
  79. }
  80. int
  81. __glXDispSwap_CreateContextWithConfigSGIX(__GLXclientState * cl, GLbyte * pc)
  82. {
  83. ClientPtr client = cl->client;
  84. xGLXCreateContextWithConfigSGIXReq *req =
  85. (xGLXCreateContextWithConfigSGIXReq *) pc;
  86. __GLX_DECLARE_SWAP_VARIABLES;
  87. REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
  88. __GLX_SWAP_SHORT(&req->length);
  89. __GLX_SWAP_INT(&req->context);
  90. __GLX_SWAP_INT(&req->fbconfig);
  91. __GLX_SWAP_INT(&req->screen);
  92. __GLX_SWAP_INT(&req->renderType);
  93. __GLX_SWAP_INT(&req->shareList);
  94. return __glXDisp_CreateContextWithConfigSGIX(cl, pc);
  95. }
  96. int
  97. __glXDispSwap_DestroyContext(__GLXclientState * cl, GLbyte * pc)
  98. {
  99. ClientPtr client = cl->client;
  100. xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
  101. __GLX_DECLARE_SWAP_VARIABLES;
  102. REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
  103. __GLX_SWAP_SHORT(&req->length);
  104. __GLX_SWAP_INT(&req->context);
  105. return __glXDisp_DestroyContext(cl, pc);
  106. }
  107. int
  108. __glXDispSwap_MakeCurrent(__GLXclientState * cl, GLbyte * pc)
  109. {
  110. ClientPtr client = cl->client;
  111. xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
  112. __GLX_DECLARE_SWAP_VARIABLES;
  113. REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
  114. __GLX_SWAP_SHORT(&req->length);
  115. __GLX_SWAP_INT(&req->drawable);
  116. __GLX_SWAP_INT(&req->context);
  117. __GLX_SWAP_INT(&req->oldContextTag);
  118. return __glXDisp_MakeCurrent(cl, pc);
  119. }
  120. int
  121. __glXDispSwap_MakeContextCurrent(__GLXclientState * cl, GLbyte * pc)
  122. {
  123. ClientPtr client = cl->client;
  124. xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
  125. __GLX_DECLARE_SWAP_VARIABLES;
  126. REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
  127. __GLX_SWAP_SHORT(&req->length);
  128. __GLX_SWAP_INT(&req->drawable);
  129. __GLX_SWAP_INT(&req->readdrawable);
  130. __GLX_SWAP_INT(&req->context);
  131. __GLX_SWAP_INT(&req->oldContextTag);
  132. return __glXDisp_MakeContextCurrent(cl, pc);
  133. }
  134. int
  135. __glXDispSwap_MakeCurrentReadSGI(__GLXclientState * cl, GLbyte * pc)
  136. {
  137. ClientPtr client = cl->client;
  138. xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
  139. __GLX_DECLARE_SWAP_VARIABLES;
  140. REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
  141. __GLX_SWAP_SHORT(&req->length);
  142. __GLX_SWAP_INT(&req->drawable);
  143. __GLX_SWAP_INT(&req->readable);
  144. __GLX_SWAP_INT(&req->context);
  145. __GLX_SWAP_INT(&req->oldContextTag);
  146. return __glXDisp_MakeCurrentReadSGI(cl, pc);
  147. }
  148. int
  149. __glXDispSwap_IsDirect(__GLXclientState * cl, GLbyte * pc)
  150. {
  151. ClientPtr client = cl->client;
  152. xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
  153. __GLX_DECLARE_SWAP_VARIABLES;
  154. REQUEST_SIZE_MATCH(xGLXIsDirectReq);
  155. __GLX_SWAP_SHORT(&req->length);
  156. __GLX_SWAP_INT(&req->context);
  157. return __glXDisp_IsDirect(cl, pc);
  158. }
  159. int
  160. __glXDispSwap_QueryVersion(__GLXclientState * cl, GLbyte * pc)
  161. {
  162. ClientPtr client = cl->client;
  163. xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
  164. __GLX_DECLARE_SWAP_VARIABLES;
  165. REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
  166. __GLX_SWAP_SHORT(&req->length);
  167. __GLX_SWAP_INT(&req->majorVersion);
  168. __GLX_SWAP_INT(&req->minorVersion);
  169. return __glXDisp_QueryVersion(cl, pc);
  170. }
  171. int
  172. __glXDispSwap_WaitGL(__GLXclientState * cl, GLbyte * pc)
  173. {
  174. ClientPtr client = cl->client;
  175. xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc;
  176. __GLX_DECLARE_SWAP_VARIABLES;
  177. REQUEST_SIZE_MATCH(xGLXWaitGLReq);
  178. __GLX_SWAP_SHORT(&req->length);
  179. __GLX_SWAP_INT(&req->contextTag);
  180. return __glXDisp_WaitGL(cl, pc);
  181. }
  182. int
  183. __glXDispSwap_WaitX(__GLXclientState * cl, GLbyte * pc)
  184. {
  185. ClientPtr client = cl->client;
  186. xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
  187. __GLX_DECLARE_SWAP_VARIABLES;
  188. REQUEST_SIZE_MATCH(xGLXWaitXReq);
  189. __GLX_SWAP_SHORT(&req->length);
  190. __GLX_SWAP_INT(&req->contextTag);
  191. return __glXDisp_WaitX(cl, pc);
  192. }
  193. int
  194. __glXDispSwap_CopyContext(__GLXclientState * cl, GLbyte * pc)
  195. {
  196. ClientPtr client = cl->client;
  197. xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
  198. __GLX_DECLARE_SWAP_VARIABLES;
  199. REQUEST_SIZE_MATCH(xGLXCopyContextReq);
  200. __GLX_SWAP_SHORT(&req->length);
  201. __GLX_SWAP_INT(&req->source);
  202. __GLX_SWAP_INT(&req->dest);
  203. __GLX_SWAP_INT(&req->mask);
  204. return __glXDisp_CopyContext(cl, pc);
  205. }
  206. int
  207. __glXDispSwap_GetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
  208. {
  209. ClientPtr client = cl->client;
  210. xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
  211. __GLX_DECLARE_SWAP_VARIABLES;
  212. REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
  213. __GLX_SWAP_INT(&req->screen);
  214. return __glXDisp_GetVisualConfigs(cl, pc);
  215. }
  216. int
  217. __glXDispSwap_GetFBConfigs(__GLXclientState * cl, GLbyte * pc)
  218. {
  219. ClientPtr client = cl->client;
  220. xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
  221. __GLX_DECLARE_SWAP_VARIABLES;
  222. REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
  223. __GLX_SWAP_INT(&req->screen);
  224. return __glXDisp_GetFBConfigs(cl, pc);
  225. }
  226. int
  227. __glXDispSwap_GetFBConfigsSGIX(__GLXclientState * cl, GLbyte * pc)
  228. {
  229. ClientPtr client = cl->client;
  230. xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
  231. __GLX_DECLARE_SWAP_VARIABLES;
  232. REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
  233. __GLX_SWAP_INT(&req->screen);
  234. return __glXDisp_GetFBConfigsSGIX(cl, pc);
  235. }
  236. int
  237. __glXDispSwap_CreateGLXPixmap(__GLXclientState * cl, GLbyte * pc)
  238. {
  239. ClientPtr client = cl->client;
  240. xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
  241. __GLX_DECLARE_SWAP_VARIABLES;
  242. REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
  243. __GLX_SWAP_SHORT(&req->length);
  244. __GLX_SWAP_INT(&req->screen);
  245. __GLX_SWAP_INT(&req->visual);
  246. __GLX_SWAP_INT(&req->pixmap);
  247. __GLX_SWAP_INT(&req->glxpixmap);
  248. return __glXDisp_CreateGLXPixmap(cl, pc);
  249. }
  250. int
  251. __glXDispSwap_CreatePixmap(__GLXclientState * cl, GLbyte * pc)
  252. {
  253. ClientPtr client = cl->client;
  254. xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
  255. CARD32 *attribs;
  256. __GLX_DECLARE_SWAP_VARIABLES;
  257. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  258. REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
  259. __GLX_SWAP_SHORT(&req->length);
  260. __GLX_SWAP_INT(&req->screen);
  261. __GLX_SWAP_INT(&req->fbconfig);
  262. __GLX_SWAP_INT(&req->pixmap);
  263. __GLX_SWAP_INT(&req->glxpixmap);
  264. __GLX_SWAP_INT(&req->numAttribs);
  265. if (req->numAttribs > (UINT32_MAX >> 3)) {
  266. client->errorValue = req->numAttribs;
  267. return BadValue;
  268. }
  269. REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
  270. attribs = (CARD32 *) (req + 1);
  271. __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
  272. return __glXDisp_CreatePixmap(cl, pc);
  273. }
  274. int
  275. __glXDispSwap_CreateGLXPixmapWithConfigSGIX(__GLXclientState * cl, GLbyte * pc)
  276. {
  277. ClientPtr client = cl->client;
  278. xGLXCreateGLXPixmapWithConfigSGIXReq *req =
  279. (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
  280. __GLX_DECLARE_SWAP_VARIABLES;
  281. REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
  282. __GLX_SWAP_SHORT(&req->length);
  283. __GLX_SWAP_INT(&req->screen);
  284. __GLX_SWAP_INT(&req->fbconfig);
  285. __GLX_SWAP_INT(&req->pixmap);
  286. __GLX_SWAP_INT(&req->glxpixmap);
  287. return __glXDisp_CreateGLXPixmapWithConfigSGIX(cl, pc);
  288. }
  289. int
  290. __glXDispSwap_DestroyGLXPixmap(__GLXclientState * cl, GLbyte * pc)
  291. {
  292. ClientPtr client = cl->client;
  293. xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
  294. __GLX_DECLARE_SWAP_VARIABLES;
  295. REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
  296. __GLX_SWAP_SHORT(&req->length);
  297. __GLX_SWAP_INT(&req->glxpixmap);
  298. return __glXDisp_DestroyGLXPixmap(cl, pc);
  299. }
  300. int
  301. __glXDispSwap_DestroyPixmap(__GLXclientState * cl, GLbyte * pc)
  302. {
  303. ClientPtr client = cl->client;
  304. xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
  305. __GLX_DECLARE_SWAP_VARIABLES;
  306. REQUEST_AT_LEAST_SIZE(xGLXDestroyGLXPixmapReq);
  307. __GLX_SWAP_SHORT(&req->length);
  308. __GLX_SWAP_INT(&req->glxpixmap);
  309. return __glXDisp_DestroyGLXPixmap(cl, pc);
  310. }
  311. int
  312. __glXDispSwap_QueryContext(__GLXclientState * cl, GLbyte * pc)
  313. {
  314. ClientPtr client = cl->client;
  315. xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
  316. __GLX_DECLARE_SWAP_VARIABLES;
  317. REQUEST_SIZE_MATCH(xGLXQueryContextReq);
  318. __GLX_SWAP_INT(&req->context);
  319. return __glXDisp_QueryContext(cl, pc);
  320. }
  321. int
  322. __glXDispSwap_CreatePbuffer(__GLXclientState * cl, GLbyte * pc)
  323. {
  324. ClientPtr client = cl->client;
  325. xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;
  326. __GLX_DECLARE_SWAP_VARIABLES;
  327. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  328. CARD32 *attribs;
  329. REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
  330. __GLX_SWAP_INT(&req->screen);
  331. __GLX_SWAP_INT(&req->fbconfig);
  332. __GLX_SWAP_INT(&req->pbuffer);
  333. __GLX_SWAP_INT(&req->numAttribs);
  334. if (req->numAttribs > (UINT32_MAX >> 3)) {
  335. client->errorValue = req->numAttribs;
  336. return BadValue;
  337. }
  338. REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
  339. attribs = (CARD32 *) (req + 1);
  340. __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
  341. return __glXDisp_CreatePbuffer(cl, pc);
  342. }
  343. int
  344. __glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState * cl, GLbyte * pc)
  345. {
  346. ClientPtr client = cl->client;
  347. xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
  348. __GLX_DECLARE_SWAP_VARIABLES;
  349. REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
  350. __GLX_SWAP_INT(&req->screen);
  351. __GLX_SWAP_INT(&req->fbconfig);
  352. __GLX_SWAP_INT(&req->pbuffer);
  353. __GLX_SWAP_INT(&req->width);
  354. __GLX_SWAP_INT(&req->height);
  355. return __glXDisp_CreateGLXPbufferSGIX(cl, pc);
  356. }
  357. int
  358. __glXDispSwap_DestroyPbuffer(__GLXclientState * cl, GLbyte * pc)
  359. {
  360. ClientPtr client = cl->client;
  361. xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
  362. __GLX_DECLARE_SWAP_VARIABLES;
  363. REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
  364. __GLX_SWAP_INT(&req->pbuffer);
  365. return __glXDisp_DestroyPbuffer(cl, pc);
  366. }
  367. int
  368. __glXDispSwap_DestroyGLXPbufferSGIX(__GLXclientState * cl, GLbyte * pc)
  369. {
  370. ClientPtr client = cl->client;
  371. xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
  372. __GLX_DECLARE_SWAP_VARIABLES;
  373. REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq);
  374. __GLX_SWAP_INT(&req->pbuffer);
  375. return __glXDisp_DestroyGLXPbufferSGIX(cl, pc);
  376. }
  377. int
  378. __glXDispSwap_ChangeDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
  379. {
  380. ClientPtr client = cl->client;
  381. xGLXChangeDrawableAttributesReq *req =
  382. (xGLXChangeDrawableAttributesReq *) pc;
  383. __GLX_DECLARE_SWAP_VARIABLES;
  384. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  385. CARD32 *attribs;
  386. REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
  387. __GLX_SWAP_INT(&req->drawable);
  388. __GLX_SWAP_INT(&req->numAttribs);
  389. if (req->numAttribs > (UINT32_MAX >> 3)) {
  390. client->errorValue = req->numAttribs;
  391. return BadValue;
  392. }
  393. if (((sizeof(xGLXChangeDrawableAttributesReq) +
  394. (req->numAttribs << 3)) >> 2) < client->req_len)
  395. return BadLength;
  396. attribs = (CARD32 *) (req + 1);
  397. __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
  398. return __glXDisp_ChangeDrawableAttributes(cl, pc);
  399. }
  400. int
  401. __glXDispSwap_ChangeDrawableAttributesSGIX(__GLXclientState * cl, GLbyte * pc)
  402. {
  403. ClientPtr client = cl->client;
  404. xGLXChangeDrawableAttributesSGIXReq *req =
  405. (xGLXChangeDrawableAttributesSGIXReq *) pc;
  406. __GLX_DECLARE_SWAP_VARIABLES;
  407. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  408. CARD32 *attribs;
  409. REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
  410. __GLX_SWAP_INT(&req->drawable);
  411. __GLX_SWAP_INT(&req->numAttribs);
  412. if (req->numAttribs > (UINT32_MAX >> 3)) {
  413. client->errorValue = req->numAttribs;
  414. return BadValue;
  415. }
  416. REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq,
  417. req->numAttribs << 3);
  418. attribs = (CARD32 *) (req + 1);
  419. __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
  420. return __glXDisp_ChangeDrawableAttributesSGIX(cl, pc);
  421. }
  422. int
  423. __glXDispSwap_CreateWindow(__GLXclientState * cl, GLbyte * pc)
  424. {
  425. ClientPtr client = cl->client;
  426. xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
  427. __GLX_DECLARE_SWAP_VARIABLES;
  428. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  429. CARD32 *attribs;
  430. REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
  431. __GLX_SWAP_INT(&req->screen);
  432. __GLX_SWAP_INT(&req->fbconfig);
  433. __GLX_SWAP_INT(&req->window);
  434. __GLX_SWAP_INT(&req->glxwindow);
  435. __GLX_SWAP_INT(&req->numAttribs);
  436. if (req->numAttribs > (UINT32_MAX >> 3)) {
  437. client->errorValue = req->numAttribs;
  438. return BadValue;
  439. }
  440. REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
  441. attribs = (CARD32 *) (req + 1);
  442. __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
  443. return __glXDisp_CreateWindow(cl, pc);
  444. }
  445. int
  446. __glXDispSwap_DestroyWindow(__GLXclientState * cl, GLbyte * pc)
  447. {
  448. ClientPtr client = cl->client;
  449. xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
  450. __GLX_DECLARE_SWAP_VARIABLES;
  451. REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
  452. __GLX_SWAP_INT(&req->glxwindow);
  453. return __glXDisp_DestroyWindow(cl, pc);
  454. }
  455. int
  456. __glXDispSwap_SwapBuffers(__GLXclientState * cl, GLbyte * pc)
  457. {
  458. ClientPtr client = cl->client;
  459. xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
  460. __GLX_DECLARE_SWAP_VARIABLES;
  461. REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
  462. __GLX_SWAP_SHORT(&req->length);
  463. __GLX_SWAP_INT(&req->contextTag);
  464. __GLX_SWAP_INT(&req->drawable);
  465. return __glXDisp_SwapBuffers(cl, pc);
  466. }
  467. int
  468. __glXDispSwap_UseXFont(__GLXclientState * cl, GLbyte * pc)
  469. {
  470. ClientPtr client = cl->client;
  471. xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc;
  472. __GLX_DECLARE_SWAP_VARIABLES;
  473. REQUEST_SIZE_MATCH(xGLXUseXFontReq);
  474. __GLX_SWAP_SHORT(&req->length);
  475. __GLX_SWAP_INT(&req->contextTag);
  476. __GLX_SWAP_INT(&req->font);
  477. __GLX_SWAP_INT(&req->first);
  478. __GLX_SWAP_INT(&req->count);
  479. __GLX_SWAP_INT(&req->listBase);
  480. return __glXDisp_UseXFont(cl, pc);
  481. }
  482. int
  483. __glXDispSwap_QueryExtensionsString(__GLXclientState * cl, GLbyte * pc)
  484. {
  485. ClientPtr client = cl->client;
  486. xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
  487. __GLX_DECLARE_SWAP_VARIABLES;
  488. REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
  489. __GLX_SWAP_SHORT(&req->length);
  490. __GLX_SWAP_INT(&req->screen);
  491. return __glXDisp_QueryExtensionsString(cl, pc);
  492. }
  493. int
  494. __glXDispSwap_QueryServerString(__GLXclientState * cl, GLbyte * pc)
  495. {
  496. ClientPtr client = cl->client;
  497. xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
  498. __GLX_DECLARE_SWAP_VARIABLES;
  499. REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
  500. __GLX_SWAP_SHORT(&req->length);
  501. __GLX_SWAP_INT(&req->screen);
  502. __GLX_SWAP_INT(&req->name);
  503. return __glXDisp_QueryServerString(cl, pc);
  504. }
  505. int
  506. __glXDispSwap_ClientInfo(__GLXclientState * cl, GLbyte * pc)
  507. {
  508. ClientPtr client = cl->client;
  509. xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
  510. __GLX_DECLARE_SWAP_VARIABLES;
  511. REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
  512. __GLX_SWAP_SHORT(&req->length);
  513. __GLX_SWAP_INT(&req->major);
  514. __GLX_SWAP_INT(&req->minor);
  515. __GLX_SWAP_INT(&req->numbytes);
  516. return __glXDisp_ClientInfo(cl, pc);
  517. }
  518. int
  519. __glXDispSwap_QueryContextInfoEXT(__GLXclientState * cl, GLbyte * pc)
  520. {
  521. ClientPtr client = cl->client;
  522. xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
  523. __GLX_DECLARE_SWAP_VARIABLES;
  524. REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
  525. __GLX_SWAP_SHORT(&req->length);
  526. __GLX_SWAP_INT(&req->context);
  527. return __glXDisp_QueryContextInfoEXT(cl, pc);
  528. }
  529. int
  530. __glXDispSwap_BindTexImageEXT(__GLXclientState * cl, GLbyte * pc)
  531. {
  532. ClientPtr client = cl->client;
  533. xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
  534. GLXDrawable *drawId;
  535. int *buffer;
  536. CARD32 *num_attribs;
  537. __GLX_DECLARE_SWAP_VARIABLES;
  538. if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
  539. return BadLength;
  540. pc += __GLX_VENDPRIV_HDR_SIZE;
  541. drawId = ((GLXDrawable *) (pc));
  542. buffer = ((int *) (pc + 4));
  543. num_attribs = ((CARD32 *) (pc + 8));
  544. __GLX_SWAP_SHORT(&req->length);
  545. __GLX_SWAP_INT(&req->contextTag);
  546. __GLX_SWAP_INT(drawId);
  547. __GLX_SWAP_INT(buffer);
  548. __GLX_SWAP_INT(num_attribs);
  549. return __glXDisp_BindTexImageEXT(cl, (GLbyte *) pc);
  550. }
  551. int
  552. __glXDispSwap_ReleaseTexImageEXT(__GLXclientState * cl, GLbyte * pc)
  553. {
  554. ClientPtr client = cl->client;
  555. xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
  556. GLXDrawable *drawId;
  557. int *buffer;
  558. __GLX_DECLARE_SWAP_VARIABLES;
  559. REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
  560. pc += __GLX_VENDPRIV_HDR_SIZE;
  561. drawId = ((GLXDrawable *) (pc));
  562. buffer = ((int *) (pc + 4));
  563. __GLX_SWAP_SHORT(&req->length);
  564. __GLX_SWAP_INT(&req->contextTag);
  565. __GLX_SWAP_INT(drawId);
  566. __GLX_SWAP_INT(buffer);
  567. return __glXDisp_ReleaseTexImageEXT(cl, (GLbyte *) pc);
  568. }
  569. int
  570. __glXDispSwap_CopySubBufferMESA(__GLXclientState * cl, GLbyte * pc)
  571. {
  572. ClientPtr client = cl->client;
  573. xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
  574. GLXDrawable *drawId;
  575. int *buffer;
  576. __GLX_DECLARE_SWAP_VARIABLES;
  577. REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
  578. (void) drawId;
  579. (void) buffer;
  580. pc += __GLX_VENDPRIV_HDR_SIZE;
  581. __GLX_SWAP_SHORT(&req->length);
  582. __GLX_SWAP_INT(&req->contextTag);
  583. __GLX_SWAP_INT(pc);
  584. __GLX_SWAP_INT(pc + 4);
  585. __GLX_SWAP_INT(pc + 8);
  586. __GLX_SWAP_INT(pc + 12);
  587. __GLX_SWAP_INT(pc + 16);
  588. return __glXDisp_CopySubBufferMESA(cl, pc);
  589. }
  590. int
  591. __glXDispSwap_GetDrawableAttributesSGIX(__GLXclientState * cl, GLbyte * pc)
  592. {
  593. ClientPtr client = cl->client;
  594. xGLXVendorPrivateWithReplyReq *req = (xGLXVendorPrivateWithReplyReq *) pc;
  595. CARD32 *data;
  596. __GLX_DECLARE_SWAP_VARIABLES;
  597. REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
  598. data = (CARD32 *) (req + 1);
  599. __GLX_SWAP_SHORT(&req->length);
  600. __GLX_SWAP_INT(&req->contextTag);
  601. __GLX_SWAP_INT(data);
  602. return __glXDisp_GetDrawableAttributesSGIX(cl, pc);
  603. }
  604. int
  605. __glXDispSwap_GetDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
  606. {
  607. ClientPtr client = cl->client;
  608. xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *) pc;
  609. __GLX_DECLARE_SWAP_VARIABLES;
  610. REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
  611. __GLX_SWAP_SHORT(&req->length);
  612. __GLX_SWAP_INT(&req->drawable);
  613. return __glXDisp_GetDrawableAttributes(cl, pc);
  614. }
  615. /************************************************************************/
  616. /*
  617. ** Swap replies.
  618. */
  619. void
  620. __glXSwapMakeCurrentReply(ClientPtr client, xGLXMakeCurrentReply * reply)
  621. {
  622. __GLX_DECLARE_SWAP_VARIABLES;
  623. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  624. __GLX_SWAP_INT(&reply->length);
  625. __GLX_SWAP_INT(&reply->contextTag);
  626. WriteToClient(client, sz_xGLXMakeCurrentReply, reply);
  627. }
  628. void
  629. __glXSwapIsDirectReply(ClientPtr client, xGLXIsDirectReply * reply)
  630. {
  631. __GLX_DECLARE_SWAP_VARIABLES;
  632. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  633. __GLX_SWAP_INT(&reply->length);
  634. WriteToClient(client, sz_xGLXIsDirectReply, reply);
  635. }
  636. void
  637. __glXSwapQueryVersionReply(ClientPtr client, xGLXQueryVersionReply * reply)
  638. {
  639. __GLX_DECLARE_SWAP_VARIABLES;
  640. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  641. __GLX_SWAP_INT(&reply->length);
  642. __GLX_SWAP_INT(&reply->majorVersion);
  643. __GLX_SWAP_INT(&reply->minorVersion);
  644. WriteToClient(client, sz_xGLXQueryVersionReply, reply);
  645. }
  646. void
  647. glxSwapQueryExtensionsStringReply(ClientPtr client,
  648. xGLXQueryExtensionsStringReply * reply,
  649. char *buf)
  650. {
  651. int length = reply->length;
  652. __GLX_DECLARE_SWAP_VARIABLES;
  653. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  654. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  655. __GLX_SWAP_INT(&reply->length);
  656. __GLX_SWAP_INT(&reply->n);
  657. WriteToClient(client, sz_xGLXQueryExtensionsStringReply, reply);
  658. __GLX_SWAP_INT_ARRAY((int *) buf, length);
  659. WriteToClient(client, length << 2, buf);
  660. }
  661. void
  662. glxSwapQueryServerStringReply(ClientPtr client,
  663. xGLXQueryServerStringReply * reply, char *buf)
  664. {
  665. int length = reply->length;
  666. __GLX_DECLARE_SWAP_VARIABLES;
  667. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  668. __GLX_SWAP_INT(&reply->length);
  669. __GLX_SWAP_INT(&reply->n);
  670. WriteToClient(client, sz_xGLXQueryServerStringReply, reply);
  671. /** no swap is needed for an array of chars **/
  672. /* __GLX_SWAP_INT_ARRAY((int *)buf, length); */
  673. WriteToClient(client, length << 2, buf);
  674. }
  675. void
  676. __glXSwapQueryContextInfoEXTReply(ClientPtr client,
  677. xGLXQueryContextInfoEXTReply * reply,
  678. int *buf)
  679. {
  680. int length = reply->length;
  681. __GLX_DECLARE_SWAP_VARIABLES;
  682. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  683. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  684. __GLX_SWAP_INT(&reply->length);
  685. __GLX_SWAP_INT(&reply->n);
  686. WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, reply);
  687. __GLX_SWAP_INT_ARRAY((int *) buf, length);
  688. WriteToClient(client, length << 2, buf);
  689. }
  690. void
  691. __glXSwapGetDrawableAttributesReply(ClientPtr client,
  692. xGLXGetDrawableAttributesReply * reply,
  693. CARD32 *buf)
  694. {
  695. int length = reply->length;
  696. __GLX_DECLARE_SWAP_VARIABLES;
  697. __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
  698. __GLX_SWAP_SHORT(&reply->sequenceNumber);
  699. __GLX_SWAP_INT(&reply->length);
  700. __GLX_SWAP_INT(&reply->numAttribs);
  701. WriteToClient(client, sz_xGLXGetDrawableAttributesReply, reply);
  702. __GLX_SWAP_INT_ARRAY((int *) buf, length);
  703. WriteToClient(client, length << 2, buf);
  704. }
  705. /************************************************************************/
  706. /*
  707. ** Render and Renderlarge are not in the GLX API. They are used by the GLX
  708. ** client library to send batches of GL rendering commands.
  709. */
  710. int
  711. __glXDispSwap_Render(__GLXclientState * cl, GLbyte * pc)
  712. {
  713. return __glXDisp_Render(cl, pc);
  714. }
  715. /*
  716. ** Execute a large rendering request (one that spans multiple X requests).
  717. */
  718. int
  719. __glXDispSwap_RenderLarge(__GLXclientState * cl, GLbyte * pc)
  720. {
  721. return __glXDisp_RenderLarge(cl, pc);
  722. }
  723. /************************************************************************/
  724. /*
  725. ** No support is provided for the vendor-private requests other than
  726. ** allocating these entry points in the dispatch table.
  727. */
  728. int
  729. __glXDispSwap_VendorPrivate(__GLXclientState * cl, GLbyte * pc)
  730. {
  731. ClientPtr client = cl->client;
  732. xGLXVendorPrivateReq *req;
  733. GLint vendorcode;
  734. __GLXdispatchVendorPrivProcPtr proc;
  735. __GLX_DECLARE_SWAP_VARIABLES;
  736. REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
  737. req = (xGLXVendorPrivateReq *) pc;
  738. __GLX_SWAP_SHORT(&req->length);
  739. __GLX_SWAP_INT(&req->vendorCode);
  740. vendorcode = req->vendorCode;
  741. proc = (__GLXdispatchVendorPrivProcPtr)
  742. __glXGetProtocolDecodeFunction(&VendorPriv_dispatch_info,
  743. vendorcode, 1);
  744. if (proc != NULL) {
  745. (*proc) (cl, (GLbyte *) req);
  746. return Success;
  747. }
  748. cl->client->errorValue = req->vendorCode;
  749. return __glXError(GLXUnsupportedPrivateRequest);
  750. }
  751. int
  752. __glXDispSwap_VendorPrivateWithReply(__GLXclientState * cl, GLbyte * pc)
  753. {
  754. ClientPtr client = cl->client;
  755. xGLXVendorPrivateWithReplyReq *req;
  756. GLint vendorcode;
  757. __GLXdispatchVendorPrivProcPtr proc;
  758. __GLX_DECLARE_SWAP_VARIABLES;
  759. REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateWithReplyReq);
  760. req = (xGLXVendorPrivateWithReplyReq *) pc;
  761. __GLX_SWAP_SHORT(&req->length);
  762. __GLX_SWAP_INT(&req->vendorCode);
  763. vendorcode = req->vendorCode;
  764. proc = (__GLXdispatchVendorPrivProcPtr)
  765. __glXGetProtocolDecodeFunction(&VendorPriv_dispatch_info,
  766. vendorcode, 1);
  767. if (proc != NULL) {
  768. return (*proc) (cl, (GLbyte *) req);
  769. }
  770. cl->client->errorValue = req->vendorCode;
  771. return __glXError(GLXUnsupportedPrivateRequest);
  772. }