1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker /*
9*61046927SAndroid Build Coastguard Worker * (C) Copyright IBM Corporation 2005
10*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
11*61046927SAndroid Build Coastguard Worker *
12*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
13*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
14*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
15*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sub license,
16*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
17*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
18*61046927SAndroid Build Coastguard Worker *
19*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
20*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
21*61046927SAndroid Build Coastguard Worker * Software.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
26*61046927SAndroid Build Coastguard Worker * IBM,
27*61046927SAndroid Build Coastguard Worker * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
28*61046927SAndroid Build Coastguard Worker * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
29*61046927SAndroid Build Coastguard Worker * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30*61046927SAndroid Build Coastguard Worker * SOFTWARE.
31*61046927SAndroid Build Coastguard Worker */
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "packrender.h"
34*61046927SAndroid Build Coastguard Worker #include "indirect.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker /**
37*61046927SAndroid Build Coastguard Worker * Send a large image to the server. If necessary, a buffer is allocated
38*61046927SAndroid Build Coastguard Worker * to hold the unpacked data that is copied from the clients memory.
39*61046927SAndroid Build Coastguard Worker *
40*61046927SAndroid Build Coastguard Worker * \param gc Current GLX context
41*61046927SAndroid Build Coastguard Worker * \param compsize Size, in bytes, of the image portion
42*61046927SAndroid Build Coastguard Worker * \param dim Number of dimensions of the image
43*61046927SAndroid Build Coastguard Worker * \param width Width of the image
44*61046927SAndroid Build Coastguard Worker * \param height Height of the image, must be 1 for 1D images
45*61046927SAndroid Build Coastguard Worker * \param depth Depth of the image, must be 1 for 1D or 2D images
46*61046927SAndroid Build Coastguard Worker * \param format Format of the image
47*61046927SAndroid Build Coastguard Worker * \param type Data type of the image
48*61046927SAndroid Build Coastguard Worker * \param src Pointer to the image data
49*61046927SAndroid Build Coastguard Worker * \param pc Pointer to end of the command header
50*61046927SAndroid Build Coastguard Worker * \param modes Pointer to the pixel unpack data
51*61046927SAndroid Build Coastguard Worker *
52*61046927SAndroid Build Coastguard Worker * \todo
53*61046927SAndroid Build Coastguard Worker * Modify this function so that \c NULL images are sent using
54*61046927SAndroid Build Coastguard Worker * \c __glXSendLargeChunk instead of __glXSendLargeCommand. Doing this
55*61046927SAndroid Build Coastguard Worker * will eliminate the need to allocate a buffer for that case.
56*61046927SAndroid Build Coastguard Worker */
57*61046927SAndroid Build Coastguard Worker void
__glXSendLargeImage(struct glx_context * gc,GLint compsize,GLint dim,GLint width,GLint height,GLint depth,GLenum format,GLenum type,const GLvoid * src,GLubyte * pc,GLubyte * modes)58*61046927SAndroid Build Coastguard Worker __glXSendLargeImage(struct glx_context * gc, GLint compsize, GLint dim,
59*61046927SAndroid Build Coastguard Worker GLint width, GLint height, GLint depth,
60*61046927SAndroid Build Coastguard Worker GLenum format, GLenum type, const GLvoid * src,
61*61046927SAndroid Build Coastguard Worker GLubyte * pc, GLubyte * modes)
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker /* Allocate a temporary holding buffer */
64*61046927SAndroid Build Coastguard Worker GLubyte *buf = malloc(compsize);
65*61046927SAndroid Build Coastguard Worker if (!buf) {
66*61046927SAndroid Build Coastguard Worker __glXSetError(gc, GL_OUT_OF_MEMORY);
67*61046927SAndroid Build Coastguard Worker return;
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker /* Apply pixel store unpack modes to copy data into buf */
71*61046927SAndroid Build Coastguard Worker if (src != NULL) {
72*61046927SAndroid Build Coastguard Worker __glFillImage(gc, dim, width, height, depth, format, type,
73*61046927SAndroid Build Coastguard Worker src, buf, modes);
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker else {
76*61046927SAndroid Build Coastguard Worker if (dim < 3) {
77*61046927SAndroid Build Coastguard Worker (void) memcpy(modes, __glXDefaultPixelStore + 4, 20);
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker else {
80*61046927SAndroid Build Coastguard Worker (void) memcpy(modes, __glXDefaultPixelStore + 0, 36);
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker /* Send large command */
85*61046927SAndroid Build Coastguard Worker __glXSendLargeCommand(gc, gc->pc, pc - gc->pc, buf, compsize);
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker /* Free buffer */
88*61046927SAndroid Build Coastguard Worker free((char *) buf);
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker /************************************************************************/
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker /**
94*61046927SAndroid Build Coastguard Worker * Implement GLX protocol for \c glSeparableFilter2D.
95*61046927SAndroid Build Coastguard Worker */
96*61046927SAndroid Build Coastguard Worker void
__indirect_glSeparableFilter2D(GLenum target,GLenum internalformat,GLsizei width,GLsizei height,GLenum format,GLenum type,const GLvoid * row,const GLvoid * column)97*61046927SAndroid Build Coastguard Worker __indirect_glSeparableFilter2D(GLenum target, GLenum internalformat,
98*61046927SAndroid Build Coastguard Worker GLsizei width, GLsizei height, GLenum format,
99*61046927SAndroid Build Coastguard Worker GLenum type, const GLvoid * row,
100*61046927SAndroid Build Coastguard Worker const GLvoid * column)
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker __GLX_DECLARE_VARIABLES();
103*61046927SAndroid Build Coastguard Worker GLuint compsize2, hdrlen, totalhdrlen, image1len, image2len;
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker __GLX_LOAD_VARIABLES();
106*61046927SAndroid Build Coastguard Worker compsize = __glImageSize(width, 1, 1, format, type, 0);
107*61046927SAndroid Build Coastguard Worker compsize2 = __glImageSize(height, 1, 1, format, type, 0);
108*61046927SAndroid Build Coastguard Worker totalhdrlen = __GLX_PAD(__GLX_CONV_FILT_CMD_HDR_SIZE);
109*61046927SAndroid Build Coastguard Worker hdrlen = __GLX_PAD(__GLX_CONV_FILT_HDR_SIZE);
110*61046927SAndroid Build Coastguard Worker image1len = __GLX_PAD(compsize);
111*61046927SAndroid Build Coastguard Worker image2len = __GLX_PAD(compsize2);
112*61046927SAndroid Build Coastguard Worker cmdlen = totalhdrlen + image1len + image2len;
113*61046927SAndroid Build Coastguard Worker if (!gc->currentDpy)
114*61046927SAndroid Build Coastguard Worker return;
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker if (cmdlen <= gc->maxSmallRenderCommandSize) {
117*61046927SAndroid Build Coastguard Worker /* Use GLXRender protocol to send small command */
118*61046927SAndroid Build Coastguard Worker __GLX_BEGIN_VARIABLE_WITH_PIXEL(X_GLrop_SeparableFilter2D, cmdlen);
119*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(0, target);
120*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(4, internalformat);
121*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(8, width);
122*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(12, height);
123*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(16, format);
124*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(20, type);
125*61046927SAndroid Build Coastguard Worker pc += hdrlen;
126*61046927SAndroid Build Coastguard Worker if (compsize > 0) {
127*61046927SAndroid Build Coastguard Worker __glFillImage(gc, 1, width, 1, 1, format, type, row, pc,
128*61046927SAndroid Build Coastguard Worker pixelHeaderPC);
129*61046927SAndroid Build Coastguard Worker pc += image1len;
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker if (compsize2 > 0) {
132*61046927SAndroid Build Coastguard Worker __glFillImage(gc, 1, height, 1, 1, format, type, column, pc, NULL);
133*61046927SAndroid Build Coastguard Worker pc += image2len;
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker if ((compsize == 0) && (compsize2 == 0)) {
136*61046927SAndroid Build Coastguard Worker /* Setup default store modes */
137*61046927SAndroid Build Coastguard Worker (void) memcpy(pixelHeaderPC, __glXDefaultPixelStore + 4, 20);
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker __GLX_END(0);
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker else {
142*61046927SAndroid Build Coastguard Worker GLubyte *buf;
143*61046927SAndroid Build Coastguard Worker const GLint bufsize = image1len + image2len;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker /* Use GLXRenderLarge protocol to send command */
146*61046927SAndroid Build Coastguard Worker __GLX_BEGIN_VARIABLE_LARGE_WITH_PIXEL(X_GLrop_SeparableFilter2D,
147*61046927SAndroid Build Coastguard Worker cmdlen + 4);
148*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(0, target);
149*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(4, internalformat);
150*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(8, width);
151*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(12, height);
152*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(16, format);
153*61046927SAndroid Build Coastguard Worker __GLX_PUT_LONG(20, type);
154*61046927SAndroid Build Coastguard Worker pc += hdrlen;
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker /* Allocate a temporary holding buffer */
157*61046927SAndroid Build Coastguard Worker buf = malloc(bufsize);
158*61046927SAndroid Build Coastguard Worker if (!buf) {
159*61046927SAndroid Build Coastguard Worker __glXSetError(gc, GL_OUT_OF_MEMORY);
160*61046927SAndroid Build Coastguard Worker return;
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker __glFillImage(gc, 1, width, 1, 1, format, type, row, buf,
163*61046927SAndroid Build Coastguard Worker pixelHeaderPC);
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker __glFillImage(gc, 1, height, 1, 1, format, type, column,
166*61046927SAndroid Build Coastguard Worker buf + image1len, pixelHeaderPC);
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker /* Send large command */
169*61046927SAndroid Build Coastguard Worker __glXSendLargeCommand(gc, gc->pc, (GLint) (pc - gc->pc), buf,
170*61046927SAndroid Build Coastguard Worker bufsize);
171*61046927SAndroid Build Coastguard Worker /* Free buffer */
172*61046927SAndroid Build Coastguard Worker free((char *) buf);
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker }
175