xref: /aosp_15_r20/external/mesa3d/src/glx/renderpix.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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