13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * (C) Copyright IBM Corporation 2004
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"),
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the Software is furnished to do so, subject to the following conditions:
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the next
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * paragraph) shall be included in all copies or substantial portions of the
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software.
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \file glx_texture_compression.c
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Contains the routines required to implement GLX protocol for
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ARB_texture_compression and related extensions.
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \sa http://oss.sgi.com/projects/ogl-sample/registry/ARB/texture_compression.txt
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \author Ian Romanick <idr@us.ibm.com>
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "packrender.h"
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "packsingle.h"
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect.h"
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include <assert.h>
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glGetCompressedTexImageARB(GLenum target, GLint level,
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                      GLvoid * img)
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_DECLARE_VARIABLES();
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   xGLXGetTexImageReply reply;
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   size_t image_bytes;
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_LOAD_VARIABLES();
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_BEGIN(X_GLsop_GetCompressedTexImage, 8);
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_PUT_LONG(0, target);
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_PUT_LONG(4, level);
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_READ_XREPLY();
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   image_bytes = reply.width;
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   assert(image_bytes <= ((4 * reply.length) - 0));
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   assert(image_bytes >= ((4 * reply.length) - 3));
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (image_bytes != 0) {
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      _XRead(dpy, (char *) img, image_bytes);
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (image_bytes < (4 * reply.length)) {
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         _XEatData(dpy, (4 * reply.length) - image_bytes);
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_SINGLE_END();
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Internal function used for \c glCompressedTexImage1D and
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \c glCompressedTexImage2D.
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgCompressedTexImage1D2D(GLenum target, GLint level,
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       GLenum internal_format,
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       GLsizei width, GLsizei height,
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       GLint border, GLsizei image_size,
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                       const GLvoid * data, CARD32 rop)
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (gc->currentDpy == NULL) {
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if ((target == GL_PROXY_TEXTURE_1D)
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       || (target == GL_PROXY_TEXTURE_2D)
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       || (target == GL_PROXY_TEXTURE_CUBE_MAP)) {
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      compsize = 0;
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      compsize = image_size;
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = __GLX_PAD(__GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE + compsize);
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(rop, cmdlen);
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, level);
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, internal_format);
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, width);
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, height);
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, border);
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, image_size);
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (compsize != 0) {
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __GLX_PUT_CHAR_ARRAY(__GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE,
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              data, image_size);
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      assert(compsize != 0);
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(rop, cmdlen + 4);
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, level);
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, internal_format);
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, width);
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, height);
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, border);
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, image_size);
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSendLargeCommand(gc, gc->pc,
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            __GLX_COMPRESSED_TEXIMAGE_CMD_HDR_SIZE + 4,
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            data, image_size);
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Internal function used for \c glCompressedTexSubImage1D and
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \c glCompressedTexSubImage2D.
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgCompressedTexSubImage1D2D(GLenum target, GLint level,
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          GLsizei xoffset, GLsizei yoffset,
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          GLsizei width, GLsizei height,
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          GLenum format, GLsizei image_size,
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          const GLvoid * data, CARD32 rop)
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (gc->currentDpy == NULL) {
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (target == GL_PROXY_TEXTURE_3D) {
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      compsize = 0;
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      compsize = image_size;
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = __GLX_PAD(__GLX_COMPRESSED_TEXSUBIMAGE_CMD_HDR_SIZE + compsize);
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(rop, cmdlen);
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, level);
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, xoffset);
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, yoffset);
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, width);
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, height);
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, format);
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, image_size);
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (compsize != 0) {
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __GLX_PUT_CHAR_ARRAY(__GLX_COMPRESSED_TEXSUBIMAGE_CMD_HDR_SIZE,
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              data, image_size);
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      assert(compsize != 0);
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(rop, cmdlen + 4);
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, level);
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, xoffset);
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, yoffset);
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, width);
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, height);
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, format);
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(36, image_size);
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSendLargeCommand(gc, gc->pc,
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            __GLX_COMPRESSED_TEXSUBIMAGE_CMD_HDR_SIZE + 4,
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            data, image_size);
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexImage1DARB(GLenum target, GLint level,
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLenum internal_format, GLsizei width,
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLint border, GLsizei image_size,
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     const GLvoid * data)
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   CompressedTexImage1D2D(target, level, internal_format, width, 0,
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          border, image_size, data,
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          X_GLrop_CompressedTexImage1D);
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexImage2DARB(GLenum target, GLint level,
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLenum internal_format,
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLsizei width, GLsizei height,
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLint border, GLsizei image_size,
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     const GLvoid * data)
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   CompressedTexImage1D2D(target, level, internal_format, width, height,
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          border, image_size, data,
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          X_GLrop_CompressedTexImage2D);
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexImage3DARB(GLenum target, GLint level,
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLenum internal_format,
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLsizei width, GLsizei height,
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLsizei depth, GLint border,
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLsizei image_size, const GLvoid * data)
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (gc->currentDpy == NULL) {
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = __GLX_PAD(__GLX_COMPRESSED_TEXIMAGE_3D_CMD_HDR_SIZE + image_size);
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_CompressedTexImage3D, cmdlen);
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, level);
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, internal_format);
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, width);
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, height);
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, depth);
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, border);
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, image_size);
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (image_size != 0) {
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __GLX_PUT_CHAR_ARRAY(__GLX_COMPRESSED_TEXIMAGE_3D_CMD_HDR_SIZE,
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              data, image_size);
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_CompressedTexImage3D, cmdlen + 4);
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, level);
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, internal_format);
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, width);
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, height);
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, depth);
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, border);
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(36, image_size);
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSendLargeCommand(gc, gc->pc,
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            __GLX_COMPRESSED_TEXIMAGE_3D_CMD_HDR_SIZE + 4,
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            data, image_size);
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexSubImage1DARB(GLenum target, GLint level,
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLint xoffset,
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLsizei width,
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLenum format, GLsizei image_size,
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        const GLvoid * data)
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   CompressedTexSubImage1D2D(target, level, xoffset, 0, width, 0,
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             format, image_size, data,
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             X_GLrop_CompressedTexSubImage1D);
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexSubImage2DARB(GLenum target, GLint level,
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLint xoffset, GLint yoffset,
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLsizei width, GLsizei height,
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLenum format, GLsizei image_size,
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        const GLvoid * data)
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   CompressedTexSubImage1D2D(target, level, xoffset, yoffset, width, height,
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             format, image_size, data,
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             X_GLrop_CompressedTexSubImage2D);
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glCompressedTexSubImage3DARB(GLenum target, GLint level,
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLint xoffset, GLint yoffset,
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLint zoffset, GLsizei width,
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLsizei height, GLsizei depth,
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        GLenum format, GLsizei image_size,
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        const GLvoid * data)
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_DECLARE_VARIABLES();
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   __GLX_LOAD_VARIABLES();
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (gc->currentDpy == NULL) {
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdlen = __GLX_PAD(__GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                      + image_size);
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdlen <= gc->maxSmallRenderCommandSize) {
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE(X_GLrop_CompressedTexSubImage3D, cmdlen);
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(4, target);
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, level);
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, xoffset);
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, yoffset);
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, zoffset);
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, width);
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, height);
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, depth);
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(36, format);
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(40, image_size);
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (image_size != 0) {
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         __GLX_PUT_CHAR_ARRAY(__GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE,
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              data, image_size);
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_END(cmdlen);
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_BEGIN_VARIABLE_LARGE(X_GLrop_CompressedTexSubImage3D, cmdlen + 4);
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(8, target);
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(12, level);
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(16, xoffset);
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(20, yoffset);
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(24, zoffset);
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(28, width);
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(32, height);
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(36, depth);
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(40, format);
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __GLX_PUT_LONG(44, image_size);
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      __glXSendLargeCommand(gc, gc->pc,
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            __GLX_COMPRESSED_TEXSUBIMAGE_3D_CMD_HDR_SIZE + 4,
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            data, image_size);
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
344