xref: /aosp_15_r20/external/mesa3d/src/mesa/main/pixelstore.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker  *
13*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker /**
26*61046927SAndroid Build Coastguard Worker  * \file pixelstore.c
27*61046927SAndroid Build Coastguard Worker  * glPixelStore functions.
28*61046927SAndroid Build Coastguard Worker  */
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
32*61046927SAndroid Build Coastguard Worker #include "bufferobj.h"
33*61046927SAndroid Build Coastguard Worker #include "context.h"
34*61046927SAndroid Build Coastguard Worker #include "pixelstore.h"
35*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
36*61046927SAndroid Build Coastguard Worker #include "util/rounding.h"
37*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
pixel_storei(GLenum pname,GLint param,bool no_error)41*61046927SAndroid Build Coastguard Worker pixel_storei(GLenum pname, GLint param, bool no_error)
42*61046927SAndroid Build Coastguard Worker {
43*61046927SAndroid Build Coastguard Worker    /* NOTE: this call can't be compiled into the display list */
44*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker    switch (pname) {
47*61046927SAndroid Build Coastguard Worker       case GL_PACK_SWAP_BYTES:
48*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
49*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
50*61046927SAndroid Build Coastguard Worker          ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
51*61046927SAndroid Build Coastguard Worker          break;
52*61046927SAndroid Build Coastguard Worker       case GL_PACK_LSB_FIRST:
53*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
54*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
55*61046927SAndroid Build Coastguard Worker          ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
56*61046927SAndroid Build Coastguard Worker          break;
57*61046927SAndroid Build Coastguard Worker       case GL_PACK_ROW_LENGTH:
58*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
59*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
60*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
61*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
62*61046927SAndroid Build Coastguard Worker          ctx->Pack.RowLength = param;
63*61046927SAndroid Build Coastguard Worker          break;
64*61046927SAndroid Build Coastguard Worker       case GL_PACK_IMAGE_HEIGHT:
65*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
66*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
67*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
68*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
69*61046927SAndroid Build Coastguard Worker          ctx->Pack.ImageHeight = param;
70*61046927SAndroid Build Coastguard Worker          break;
71*61046927SAndroid Build Coastguard Worker       case GL_PACK_SKIP_PIXELS:
72*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
73*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
74*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
75*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
76*61046927SAndroid Build Coastguard Worker          ctx->Pack.SkipPixels = param;
77*61046927SAndroid Build Coastguard Worker          break;
78*61046927SAndroid Build Coastguard Worker       case GL_PACK_SKIP_ROWS:
79*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
80*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
81*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
82*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
83*61046927SAndroid Build Coastguard Worker          ctx->Pack.SkipRows = param;
84*61046927SAndroid Build Coastguard Worker          break;
85*61046927SAndroid Build Coastguard Worker       case GL_PACK_SKIP_IMAGES:
86*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
87*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
88*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
89*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
90*61046927SAndroid Build Coastguard Worker          ctx->Pack.SkipImages = param;
91*61046927SAndroid Build Coastguard Worker          break;
92*61046927SAndroid Build Coastguard Worker       case GL_PACK_ALIGNMENT:
93*61046927SAndroid Build Coastguard Worker          if (!no_error && param!=1 && param!=2 && param!=4 && param!=8)
94*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
95*61046927SAndroid Build Coastguard Worker          ctx->Pack.Alignment = param;
96*61046927SAndroid Build Coastguard Worker          break;
97*61046927SAndroid Build Coastguard Worker       case GL_PACK_INVERT_MESA:
98*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_has_MESA_pack_invert(ctx))
99*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
100*61046927SAndroid Build Coastguard Worker          ctx->Pack.Invert = param;
101*61046927SAndroid Build Coastguard Worker          break;
102*61046927SAndroid Build Coastguard Worker       case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
103*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_has_ANGLE_pack_reverse_row_order(ctx))
104*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
105*61046927SAndroid Build Coastguard Worker          ctx->Pack.Invert = param;
106*61046927SAndroid Build Coastguard Worker          break;
107*61046927SAndroid Build Coastguard Worker       case GL_PACK_COMPRESSED_BLOCK_WIDTH:
108*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
109*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
110*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
111*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
112*61046927SAndroid Build Coastguard Worker          ctx->Pack.CompressedBlockWidth = param;
113*61046927SAndroid Build Coastguard Worker          break;
114*61046927SAndroid Build Coastguard Worker       case GL_PACK_COMPRESSED_BLOCK_HEIGHT:
115*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
116*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
117*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
118*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
119*61046927SAndroid Build Coastguard Worker          ctx->Pack.CompressedBlockHeight = param;
120*61046927SAndroid Build Coastguard Worker          break;
121*61046927SAndroid Build Coastguard Worker       case GL_PACK_COMPRESSED_BLOCK_DEPTH:
122*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
123*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
124*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
125*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
126*61046927SAndroid Build Coastguard Worker          ctx->Pack.CompressedBlockDepth = param;
127*61046927SAndroid Build Coastguard Worker          break;
128*61046927SAndroid Build Coastguard Worker       case GL_PACK_COMPRESSED_BLOCK_SIZE:
129*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
130*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
131*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
132*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
133*61046927SAndroid Build Coastguard Worker          ctx->Pack.CompressedBlockSize = param;
134*61046927SAndroid Build Coastguard Worker          break;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_SWAP_BYTES:
137*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
138*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
139*61046927SAndroid Build Coastguard Worker          ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
140*61046927SAndroid Build Coastguard Worker          break;
141*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_LSB_FIRST:
142*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
143*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
144*61046927SAndroid Build Coastguard Worker          ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
145*61046927SAndroid Build Coastguard Worker          break;
146*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_ROW_LENGTH:
147*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
148*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
149*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
150*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
151*61046927SAndroid Build Coastguard Worker          ctx->Unpack.RowLength = param;
152*61046927SAndroid Build Coastguard Worker          break;
153*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_IMAGE_HEIGHT:
154*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
155*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
156*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
157*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
158*61046927SAndroid Build Coastguard Worker          ctx->Unpack.ImageHeight = param;
159*61046927SAndroid Build Coastguard Worker          break;
160*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_SKIP_PIXELS:
161*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
162*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
163*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
164*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
165*61046927SAndroid Build Coastguard Worker          ctx->Unpack.SkipPixels = param;
166*61046927SAndroid Build Coastguard Worker          break;
167*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_SKIP_ROWS:
168*61046927SAndroid Build Coastguard Worker          if (!no_error && _mesa_is_gles1(ctx))
169*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
170*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
171*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
172*61046927SAndroid Build Coastguard Worker          ctx->Unpack.SkipRows = param;
173*61046927SAndroid Build Coastguard Worker          break;
174*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_SKIP_IMAGES:
175*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
176*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
177*61046927SAndroid Build Coastguard Worker          if (!no_error && param < 0)
178*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
179*61046927SAndroid Build Coastguard Worker          ctx->Unpack.SkipImages = param;
180*61046927SAndroid Build Coastguard Worker          break;
181*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_ALIGNMENT:
182*61046927SAndroid Build Coastguard Worker          if (!no_error && param!=1 && param!=2 && param!=4 && param!=8)
183*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
184*61046927SAndroid Build Coastguard Worker          ctx->Unpack.Alignment = param;
185*61046927SAndroid Build Coastguard Worker          break;
186*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_COMPRESSED_BLOCK_WIDTH:
187*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
188*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
189*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
190*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
191*61046927SAndroid Build Coastguard Worker          ctx->Unpack.CompressedBlockWidth = param;
192*61046927SAndroid Build Coastguard Worker          break;
193*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_COMPRESSED_BLOCK_HEIGHT:
194*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
195*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
196*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
197*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
198*61046927SAndroid Build Coastguard Worker          ctx->Unpack.CompressedBlockHeight = param;
199*61046927SAndroid Build Coastguard Worker          break;
200*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_COMPRESSED_BLOCK_DEPTH:
201*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
202*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
203*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
204*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
205*61046927SAndroid Build Coastguard Worker          ctx->Unpack.CompressedBlockDepth = param;
206*61046927SAndroid Build Coastguard Worker          break;
207*61046927SAndroid Build Coastguard Worker       case GL_UNPACK_COMPRESSED_BLOCK_SIZE:
208*61046927SAndroid Build Coastguard Worker          if (!no_error && !_mesa_is_desktop_gl(ctx))
209*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
210*61046927SAndroid Build Coastguard Worker          if (!no_error && param<0)
211*61046927SAndroid Build Coastguard Worker             goto invalid_value_error;
212*61046927SAndroid Build Coastguard Worker          ctx->Unpack.CompressedBlockSize = param;
213*61046927SAndroid Build Coastguard Worker          break;
214*61046927SAndroid Build Coastguard Worker       default:
215*61046927SAndroid Build Coastguard Worker          if (!no_error)
216*61046927SAndroid Build Coastguard Worker             goto invalid_enum_error;
217*61046927SAndroid Build Coastguard Worker          else
218*61046927SAndroid Build Coastguard Worker             unreachable("invalid pixel store enum");
219*61046927SAndroid Build Coastguard Worker    }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    return;
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker invalid_enum_error:
224*61046927SAndroid Build Coastguard Worker    _mesa_error(ctx, GL_INVALID_ENUM, "glPixelStore");
225*61046927SAndroid Build Coastguard Worker    return;
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker invalid_value_error:
228*61046927SAndroid Build Coastguard Worker    _mesa_error(ctx, GL_INVALID_VALUE, "glPixelStore(param)");
229*61046927SAndroid Build Coastguard Worker    return;
230*61046927SAndroid Build Coastguard Worker }
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelStorei(GLenum pname,GLint param)234*61046927SAndroid Build Coastguard Worker _mesa_PixelStorei(GLenum pname, GLint param)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker    pixel_storei(pname, param, false);
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelStoref(GLenum pname,GLfloat param)241*61046927SAndroid Build Coastguard Worker _mesa_PixelStoref(GLenum pname, GLfloat param)
242*61046927SAndroid Build Coastguard Worker {
243*61046927SAndroid Build Coastguard Worker    _mesa_PixelStorei(pname, lroundf(param));
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelStorei_no_error(GLenum pname,GLint param)248*61046927SAndroid Build Coastguard Worker _mesa_PixelStorei_no_error(GLenum pname, GLint param)
249*61046927SAndroid Build Coastguard Worker {
250*61046927SAndroid Build Coastguard Worker    pixel_storei(pname, param, true);
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelStoref_no_error(GLenum pname,GLfloat param)255*61046927SAndroid Build Coastguard Worker _mesa_PixelStoref_no_error(GLenum pname, GLfloat param)
256*61046927SAndroid Build Coastguard Worker {
257*61046927SAndroid Build Coastguard Worker    _mesa_PixelStorei_no_error(pname, lroundf(param));
258*61046927SAndroid Build Coastguard Worker }
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker void
_mesa_init_pixelstore_attrib(struct gl_context * ctx,struct gl_pixelstore_attrib * pack)261*61046927SAndroid Build Coastguard Worker _mesa_init_pixelstore_attrib(struct gl_context *ctx,
262*61046927SAndroid Build Coastguard Worker                              struct gl_pixelstore_attrib *pack)
263*61046927SAndroid Build Coastguard Worker {
264*61046927SAndroid Build Coastguard Worker    pack->Alignment = 4;
265*61046927SAndroid Build Coastguard Worker    pack->RowLength = 0;
266*61046927SAndroid Build Coastguard Worker    pack->ImageHeight = 0;
267*61046927SAndroid Build Coastguard Worker    pack->SkipPixels = 0;
268*61046927SAndroid Build Coastguard Worker    pack->SkipRows = 0;
269*61046927SAndroid Build Coastguard Worker    pack->SkipImages = 0;
270*61046927SAndroid Build Coastguard Worker    pack->SwapBytes = GL_FALSE;
271*61046927SAndroid Build Coastguard Worker    pack->LsbFirst = GL_FALSE;
272*61046927SAndroid Build Coastguard Worker    pack->Invert = GL_FALSE;
273*61046927SAndroid Build Coastguard Worker    pack->CompressedBlockWidth = 0;
274*61046927SAndroid Build Coastguard Worker    pack->CompressedBlockHeight = 0;
275*61046927SAndroid Build Coastguard Worker    pack->CompressedBlockDepth = 0;
276*61046927SAndroid Build Coastguard Worker    pack->CompressedBlockSize = 0;
277*61046927SAndroid Build Coastguard Worker    _mesa_reference_buffer_object(ctx, &pack->BufferObj, NULL);
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker /**
281*61046927SAndroid Build Coastguard Worker  * Initialize the context's pixel store state.
282*61046927SAndroid Build Coastguard Worker  */
283*61046927SAndroid Build Coastguard Worker void
_mesa_init_pixelstore(struct gl_context * ctx)284*61046927SAndroid Build Coastguard Worker _mesa_init_pixelstore(struct gl_context *ctx)
285*61046927SAndroid Build Coastguard Worker {
286*61046927SAndroid Build Coastguard Worker    /* Pixel transfer */
287*61046927SAndroid Build Coastguard Worker    _mesa_init_pixelstore_attrib(ctx, &ctx->Pack);
288*61046927SAndroid Build Coastguard Worker    _mesa_init_pixelstore_attrib(ctx, &ctx->Unpack);
289*61046927SAndroid Build Coastguard Worker    _mesa_init_pixelstore_attrib(ctx, &ctx->DefaultPacking);
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    /*
292*61046927SAndroid Build Coastguard Worker     * _mesa_unpack_image() returns image data in this format.  When we
293*61046927SAndroid Build Coastguard Worker     * execute image commands (glDrawPixels(), glTexImage(), etc) from
294*61046927SAndroid Build Coastguard Worker     * within display lists we have to be sure to set the current
295*61046927SAndroid Build Coastguard Worker     * unpacking parameters to these values!
296*61046927SAndroid Build Coastguard Worker     */
297*61046927SAndroid Build Coastguard Worker    ctx->DefaultPacking.Alignment = 1;
298*61046927SAndroid Build Coastguard Worker }
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker /**
302*61046927SAndroid Build Coastguard Worker  * Check if the given compressed pixel storage parameters are legal.
303*61046927SAndroid Build Coastguard Worker  * Record a GL error if illegal.
304*61046927SAndroid Build Coastguard Worker  * \return  true if legal, false if illegal
305*61046927SAndroid Build Coastguard Worker  */
306*61046927SAndroid Build Coastguard Worker bool
_mesa_compressed_pixel_storage_error_check(struct gl_context * ctx,GLint dimensions,const struct gl_pixelstore_attrib * packing,const char * caller)307*61046927SAndroid Build Coastguard Worker _mesa_compressed_pixel_storage_error_check(
308*61046927SAndroid Build Coastguard Worker    struct gl_context *ctx,
309*61046927SAndroid Build Coastguard Worker    GLint dimensions,
310*61046927SAndroid Build Coastguard Worker    const struct gl_pixelstore_attrib *packing,
311*61046927SAndroid Build Coastguard Worker    const char *caller)
312*61046927SAndroid Build Coastguard Worker {
313*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_desktop_gl(ctx) || !packing->CompressedBlockSize)
314*61046927SAndroid Build Coastguard Worker       return true;
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    if (packing->CompressedBlockWidth &&
317*61046927SAndroid Build Coastguard Worker        packing->SkipPixels % packing->CompressedBlockWidth) {
318*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
319*61046927SAndroid Build Coastguard Worker                   "%s(skip-pixels %% block-width)", caller);
320*61046927SAndroid Build Coastguard Worker       return false;
321*61046927SAndroid Build Coastguard Worker    }
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker    if (dimensions > 1 &&
324*61046927SAndroid Build Coastguard Worker        packing->CompressedBlockHeight &&
325*61046927SAndroid Build Coastguard Worker        packing->SkipRows % packing->CompressedBlockHeight) {
326*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
327*61046927SAndroid Build Coastguard Worker                   "%s(skip-rows %% block-height)", caller);
328*61046927SAndroid Build Coastguard Worker       return false;
329*61046927SAndroid Build Coastguard Worker    }
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker    if (dimensions > 2 &&
332*61046927SAndroid Build Coastguard Worker        packing->CompressedBlockDepth &&
333*61046927SAndroid Build Coastguard Worker        packing->SkipImages % packing->CompressedBlockDepth) {
334*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
335*61046927SAndroid Build Coastguard Worker                   "%s(skip-images %% block-depth)", caller);
336*61046927SAndroid Build Coastguard Worker       return false;
337*61046927SAndroid Build Coastguard Worker    }
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    return true;
340*61046927SAndroid Build Coastguard Worker }
341