xref: /aosp_15_r20/external/mesa3d/src/mesa/main/shaderimage.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2013 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  * Authors:
24*61046927SAndroid Build Coastguard Worker  *    Francisco Jerez <[email protected]>
25*61046927SAndroid Build Coastguard Worker  */
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <assert.h>
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "shaderimage.h"
30*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
31*61046927SAndroid Build Coastguard Worker #include "formats.h"
32*61046927SAndroid Build Coastguard Worker #include "errors.h"
33*61046927SAndroid Build Coastguard Worker #include "hash.h"
34*61046927SAndroid Build Coastguard Worker #include "context.h"
35*61046927SAndroid Build Coastguard Worker #include "texobj.h"
36*61046927SAndroid Build Coastguard Worker #include "teximage.h"
37*61046927SAndroid Build Coastguard Worker #include "enums.h"
38*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker mesa_format
_mesa_get_shader_image_format(GLenum format)43*61046927SAndroid Build Coastguard Worker _mesa_get_shader_image_format(GLenum format)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker    switch (format) {
46*61046927SAndroid Build Coastguard Worker    case GL_RGBA32F:
47*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_FLOAT32;
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker    case GL_RGBA16F:
50*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_FLOAT16;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    case GL_RG32F:
53*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_FLOAT32;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    case GL_RG16F:
56*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_FLOAT16;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    case GL_R11F_G11F_B10F:
59*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R11G11B10_FLOAT;
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    case GL_R32F:
62*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_FLOAT32;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    case GL_R16F:
65*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_FLOAT16;
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker    case GL_RGBA32UI:
68*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_UINT32;
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker    case GL_RGBA16UI:
71*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_UINT16;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2UI:
74*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R10G10B10A2_UINT;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    case GL_RGBA8UI:
77*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_UINT8;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    case GL_RG32UI:
80*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_UINT32;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    case GL_RG16UI:
83*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_UINT16;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    case GL_RG8UI:
86*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_UINT8;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker    case GL_R32UI:
89*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_UINT32;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    case GL_R16UI:
92*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_UINT16;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    case GL_R8UI:
95*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_UINT8;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    case GL_RGBA32I:
98*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_SINT32;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    case GL_RGBA16I:
101*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_SINT16;
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    case GL_RGBA8I:
104*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_SINT8;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    case GL_RG32I:
107*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_SINT32;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    case GL_RG16I:
110*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_SINT16;
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker    case GL_RG8I:
113*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_SINT8;
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    case GL_R32I:
116*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_SINT32;
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    case GL_R16I:
119*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_SINT16;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    case GL_R8I:
122*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_SINT8;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    case GL_RGBA16:
125*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_UNORM16;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2:
128*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R10G10B10A2_UNORM;
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    case GL_RGBA8:
131*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_UNORM8;
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker    case GL_RG16:
134*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_UNORM16;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    case GL_RG8:
137*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_UNORM8;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    case GL_R16:
140*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_UNORM16;
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker    case GL_R8:
143*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_UNORM8;
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker    case GL_RGBA16_SNORM:
146*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_SNORM16;
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker    case GL_RGBA8_SNORM:
149*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RGBA_SNORM8;
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    case GL_RG16_SNORM:
152*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_SNORM16;
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker    case GL_RG8_SNORM:
155*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_RG_SNORM8;
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    case GL_R16_SNORM:
158*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_SNORM16;
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker    case GL_R8_SNORM:
161*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_R_SNORM8;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    default:
164*61046927SAndroid Build Coastguard Worker       return MESA_FORMAT_NONE;
165*61046927SAndroid Build Coastguard Worker    }
166*61046927SAndroid Build Coastguard Worker }
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker GLenum
_mesa_get_shader_image_pixel_type(GLenum image_format)169*61046927SAndroid Build Coastguard Worker _mesa_get_shader_image_pixel_type(GLenum image_format)
170*61046927SAndroid Build Coastguard Worker {
171*61046927SAndroid Build Coastguard Worker    /* This is the mapping from image format to pixel type described in table
172*61046927SAndroid Build Coastguard Worker     * 8.35 from the OpenGL 4.6 Compatibility spec.
173*61046927SAndroid Build Coastguard Worker     */
174*61046927SAndroid Build Coastguard Worker    switch (image_format) {
175*61046927SAndroid Build Coastguard Worker    case GL_RGBA32F:
176*61046927SAndroid Build Coastguard Worker    case GL_RG32F:
177*61046927SAndroid Build Coastguard Worker    case GL_R32F:
178*61046927SAndroid Build Coastguard Worker       return GL_FLOAT;
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    case GL_RGBA16F:
181*61046927SAndroid Build Coastguard Worker    case GL_RG16F:
182*61046927SAndroid Build Coastguard Worker    case GL_R16F:
183*61046927SAndroid Build Coastguard Worker       return GL_HALF_FLOAT;
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker    case GL_R11F_G11F_B10F:
186*61046927SAndroid Build Coastguard Worker       return GL_UNSIGNED_INT_10F_11F_11F_REV;
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker    case GL_RGBA32UI:
189*61046927SAndroid Build Coastguard Worker    case GL_RG32UI:
190*61046927SAndroid Build Coastguard Worker    case GL_R32UI:
191*61046927SAndroid Build Coastguard Worker       return GL_UNSIGNED_INT;
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker    case GL_RGBA16UI:
194*61046927SAndroid Build Coastguard Worker    case GL_RG16UI:
195*61046927SAndroid Build Coastguard Worker    case GL_R16UI:
196*61046927SAndroid Build Coastguard Worker    case GL_RGBA16:
197*61046927SAndroid Build Coastguard Worker    case GL_RG16:
198*61046927SAndroid Build Coastguard Worker    case GL_R16:
199*61046927SAndroid Build Coastguard Worker       return GL_UNSIGNED_SHORT;
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2UI:
202*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2:
203*61046927SAndroid Build Coastguard Worker       return GL_UNSIGNED_INT_2_10_10_10_REV;
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    case GL_RGBA8UI:
206*61046927SAndroid Build Coastguard Worker    case GL_RG8UI:
207*61046927SAndroid Build Coastguard Worker    case GL_R8UI:
208*61046927SAndroid Build Coastguard Worker    case GL_RGBA8:
209*61046927SAndroid Build Coastguard Worker    case GL_RG8:
210*61046927SAndroid Build Coastguard Worker    case GL_R8:
211*61046927SAndroid Build Coastguard Worker       return GL_UNSIGNED_BYTE;
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker    case GL_RGBA32I:
214*61046927SAndroid Build Coastguard Worker    case GL_RG32I:
215*61046927SAndroid Build Coastguard Worker    case GL_R32I:
216*61046927SAndroid Build Coastguard Worker       return GL_INT;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    case GL_RGBA16I:
219*61046927SAndroid Build Coastguard Worker    case GL_RG16I:
220*61046927SAndroid Build Coastguard Worker    case GL_R16I:
221*61046927SAndroid Build Coastguard Worker    case GL_RGBA16_SNORM:
222*61046927SAndroid Build Coastguard Worker    case GL_RG16_SNORM:
223*61046927SAndroid Build Coastguard Worker    case GL_R16_SNORM:
224*61046927SAndroid Build Coastguard Worker       return GL_SHORT;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    case GL_RGBA8I:
227*61046927SAndroid Build Coastguard Worker    case GL_RG8I:
228*61046927SAndroid Build Coastguard Worker    case GL_R8I:
229*61046927SAndroid Build Coastguard Worker    case GL_RGBA8_SNORM:
230*61046927SAndroid Build Coastguard Worker    case GL_RG8_SNORM:
231*61046927SAndroid Build Coastguard Worker    case GL_R8_SNORM:
232*61046927SAndroid Build Coastguard Worker       return GL_BYTE;
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker    default:
235*61046927SAndroid Build Coastguard Worker       return GL_NONE;
236*61046927SAndroid Build Coastguard Worker    }
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker enum image_format_class
240*61046927SAndroid Build Coastguard Worker {
241*61046927SAndroid Build Coastguard Worker    /** Not a valid image format. */
242*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_NONE = 0,
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    /** Classes of image formats you can cast into each other. */
245*61046927SAndroid Build Coastguard Worker    /** \{ */
246*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_1X8,
247*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_1X16,
248*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_1X32,
249*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_2X8,
250*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_2X16,
251*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_2X32,
252*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_10_11_11,
253*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_4X8,
254*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_4X16,
255*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_4X32,
256*61046927SAndroid Build Coastguard Worker    IMAGE_FORMAT_CLASS_2_10_10_10
257*61046927SAndroid Build Coastguard Worker    /** \} */
258*61046927SAndroid Build Coastguard Worker };
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker static enum image_format_class
get_image_format_class(mesa_format format)261*61046927SAndroid Build Coastguard Worker get_image_format_class(mesa_format format)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker    switch (format) {
264*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_FLOAT32:
265*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X32;
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_FLOAT16:
268*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X16;
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_FLOAT32:
271*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X32;
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_FLOAT16:
274*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X16;
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R11G11B10_FLOAT:
277*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_10_11_11;
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_FLOAT32:
280*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X32;
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_FLOAT16:
283*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X16;
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_UINT32:
286*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X32;
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_UINT16:
289*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X16;
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R10G10B10A2_UINT:
292*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2_10_10_10;
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_UINT8:
295*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X8;
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_UINT32:
298*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X32;
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_UINT16:
301*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X16;
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_UINT8:
304*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X8;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_UINT32:
307*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X32;
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_UINT16:
310*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X16;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_UINT8:
313*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X8;
314*61046927SAndroid Build Coastguard Worker 
315*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_SINT32:
316*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X32;
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_SINT16:
319*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X16;
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_SINT8:
322*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X8;
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_SINT32:
325*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X32;
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_SINT16:
328*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X16;
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_SINT8:
331*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X8;
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_SINT32:
334*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X32;
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_SINT16:
337*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X16;
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_SINT8:
340*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X8;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_UNORM16:
343*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X16;
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R10G10B10A2_UNORM:
346*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2_10_10_10;
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_UNORM8:
349*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X8;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_UNORM16:
352*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X16;
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_UNORM8:
355*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X8;
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_UNORM16:
358*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X16;
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_UNORM8:
361*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X8;
362*61046927SAndroid Build Coastguard Worker 
363*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_SNORM16:
364*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X16;
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RGBA_SNORM8:
367*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_4X8;
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_SNORM16:
370*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X16;
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_RG_SNORM8:
373*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_2X8;
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_SNORM16:
376*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X16;
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker    case MESA_FORMAT_R_SNORM8:
379*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_1X8;
380*61046927SAndroid Build Coastguard Worker 
381*61046927SAndroid Build Coastguard Worker    default:
382*61046927SAndroid Build Coastguard Worker       return IMAGE_FORMAT_CLASS_NONE;
383*61046927SAndroid Build Coastguard Worker    }
384*61046927SAndroid Build Coastguard Worker }
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker static GLenum
_image_format_class_to_glenum(enum image_format_class class)387*61046927SAndroid Build Coastguard Worker _image_format_class_to_glenum(enum image_format_class class)
388*61046927SAndroid Build Coastguard Worker {
389*61046927SAndroid Build Coastguard Worker    switch (class) {
390*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_NONE:
391*61046927SAndroid Build Coastguard Worker       return GL_NONE;
392*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_1X8:
393*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_1_X_8;
394*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_1X16:
395*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_1_X_16;
396*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_1X32:
397*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_1_X_32;
398*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_2X8:
399*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_2_X_8;
400*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_2X16:
401*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_2_X_16;
402*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_2X32:
403*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_2_X_32;
404*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_10_11_11:
405*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_11_11_10;
406*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_4X8:
407*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_4_X_8;
408*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_4X16:
409*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_4_X_16;
410*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_4X32:
411*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_4_X_32;
412*61046927SAndroid Build Coastguard Worker    case IMAGE_FORMAT_CLASS_2_10_10_10:
413*61046927SAndroid Build Coastguard Worker       return GL_IMAGE_CLASS_10_10_10_2;
414*61046927SAndroid Build Coastguard Worker    default:
415*61046927SAndroid Build Coastguard Worker       assert(!"Invalid image_format_class");
416*61046927SAndroid Build Coastguard Worker       return GL_NONE;
417*61046927SAndroid Build Coastguard Worker    }
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker GLenum
_mesa_get_image_format_class(GLenum format)421*61046927SAndroid Build Coastguard Worker _mesa_get_image_format_class(GLenum format)
422*61046927SAndroid Build Coastguard Worker {
423*61046927SAndroid Build Coastguard Worker    mesa_format tex_format = _mesa_get_shader_image_format(format);
424*61046927SAndroid Build Coastguard Worker    if (tex_format == MESA_FORMAT_NONE)
425*61046927SAndroid Build Coastguard Worker       return GL_NONE;
426*61046927SAndroid Build Coastguard Worker 
427*61046927SAndroid Build Coastguard Worker    enum image_format_class class = get_image_format_class(tex_format);
428*61046927SAndroid Build Coastguard Worker    return _image_format_class_to_glenum(class);
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker bool
_mesa_is_shader_image_format_supported(const struct gl_context * ctx,GLenum format)432*61046927SAndroid Build Coastguard Worker _mesa_is_shader_image_format_supported(const struct gl_context *ctx,
433*61046927SAndroid Build Coastguard Worker                                        GLenum format)
434*61046927SAndroid Build Coastguard Worker {
435*61046927SAndroid Build Coastguard Worker    switch (format) {
436*61046927SAndroid Build Coastguard Worker    /* Formats supported on both desktop and ES GL, c.f. table 8.27 of the
437*61046927SAndroid Build Coastguard Worker     * OpenGL ES 3.1 specification.
438*61046927SAndroid Build Coastguard Worker     */
439*61046927SAndroid Build Coastguard Worker    case GL_RGBA32F:
440*61046927SAndroid Build Coastguard Worker    case GL_RGBA16F:
441*61046927SAndroid Build Coastguard Worker    case GL_R32F:
442*61046927SAndroid Build Coastguard Worker    case GL_RGBA32UI:
443*61046927SAndroid Build Coastguard Worker    case GL_RGBA16UI:
444*61046927SAndroid Build Coastguard Worker    case GL_RGBA8UI:
445*61046927SAndroid Build Coastguard Worker    case GL_R32UI:
446*61046927SAndroid Build Coastguard Worker    case GL_RGBA32I:
447*61046927SAndroid Build Coastguard Worker    case GL_RGBA16I:
448*61046927SAndroid Build Coastguard Worker    case GL_RGBA8I:
449*61046927SAndroid Build Coastguard Worker    case GL_R32I:
450*61046927SAndroid Build Coastguard Worker    case GL_RGBA8:
451*61046927SAndroid Build Coastguard Worker    case GL_RGBA8_SNORM:
452*61046927SAndroid Build Coastguard Worker       return true;
453*61046927SAndroid Build Coastguard Worker 
454*61046927SAndroid Build Coastguard Worker    /* Formats supported on unextended desktop GL and the original
455*61046927SAndroid Build Coastguard Worker     * ARB_shader_image_load_store extension, c.f. table 3.21 of the OpenGL 4.2
456*61046927SAndroid Build Coastguard Worker     * specification or by GLES 3.1 with GL_NV_image_formats extension.
457*61046927SAndroid Build Coastguard Worker     */
458*61046927SAndroid Build Coastguard Worker    case GL_RG32F:
459*61046927SAndroid Build Coastguard Worker    case GL_RG16F:
460*61046927SAndroid Build Coastguard Worker    case GL_R11F_G11F_B10F:
461*61046927SAndroid Build Coastguard Worker    case GL_R16F:
462*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2UI:
463*61046927SAndroid Build Coastguard Worker    case GL_RG32UI:
464*61046927SAndroid Build Coastguard Worker    case GL_RG16UI:
465*61046927SAndroid Build Coastguard Worker    case GL_RG8UI:
466*61046927SAndroid Build Coastguard Worker    case GL_R16UI:
467*61046927SAndroid Build Coastguard Worker    case GL_R8UI:
468*61046927SAndroid Build Coastguard Worker    case GL_RG32I:
469*61046927SAndroid Build Coastguard Worker    case GL_RG16I:
470*61046927SAndroid Build Coastguard Worker    case GL_RG8I:
471*61046927SAndroid Build Coastguard Worker    case GL_R16I:
472*61046927SAndroid Build Coastguard Worker    case GL_R8I:
473*61046927SAndroid Build Coastguard Worker    case GL_RGB10_A2:
474*61046927SAndroid Build Coastguard Worker    case GL_RG8:
475*61046927SAndroid Build Coastguard Worker    case GL_R8:
476*61046927SAndroid Build Coastguard Worker    case GL_RG8_SNORM:
477*61046927SAndroid Build Coastguard Worker    case GL_R8_SNORM:
478*61046927SAndroid Build Coastguard Worker       return true;
479*61046927SAndroid Build Coastguard Worker 
480*61046927SAndroid Build Coastguard Worker    /* Formats supported on unextended desktop GL and the original
481*61046927SAndroid Build Coastguard Worker     * ARB_shader_image_load_store extension, c.f. table 3.21 of the OpenGL 4.2
482*61046927SAndroid Build Coastguard Worker     * specification.
483*61046927SAndroid Build Coastguard Worker     *
484*61046927SAndroid Build Coastguard Worker     * Following formats are supported by GLES 3.1 with GL_NV_image_formats &
485*61046927SAndroid Build Coastguard Worker     * GL_EXT_texture_norm16 extensions.
486*61046927SAndroid Build Coastguard Worker     */
487*61046927SAndroid Build Coastguard Worker    case GL_RGBA16:
488*61046927SAndroid Build Coastguard Worker    case GL_RGBA16_SNORM:
489*61046927SAndroid Build Coastguard Worker    case GL_RG16:
490*61046927SAndroid Build Coastguard Worker    case GL_RG16_SNORM:
491*61046927SAndroid Build Coastguard Worker    case GL_R16:
492*61046927SAndroid Build Coastguard Worker    case GL_R16_SNORM:
493*61046927SAndroid Build Coastguard Worker       return _mesa_is_desktop_gl(ctx) || _mesa_has_EXT_texture_norm16(ctx);
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker    default:
496*61046927SAndroid Build Coastguard Worker       return false;
497*61046927SAndroid Build Coastguard Worker    }
498*61046927SAndroid Build Coastguard Worker }
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker struct gl_image_unit
_mesa_default_image_unit(struct gl_context * ctx)501*61046927SAndroid Build Coastguard Worker _mesa_default_image_unit(struct gl_context *ctx)
502*61046927SAndroid Build Coastguard Worker {
503*61046927SAndroid Build Coastguard Worker    const GLenum format = _mesa_is_desktop_gl(ctx) ? GL_R8 : GL_R32UI;
504*61046927SAndroid Build Coastguard Worker    const struct gl_image_unit u = {
505*61046927SAndroid Build Coastguard Worker       .Access = GL_READ_ONLY,
506*61046927SAndroid Build Coastguard Worker       .Format = format,
507*61046927SAndroid Build Coastguard Worker       ._ActualFormat = _mesa_get_shader_image_format(format)
508*61046927SAndroid Build Coastguard Worker    };
509*61046927SAndroid Build Coastguard Worker    return u;
510*61046927SAndroid Build Coastguard Worker }
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker void
_mesa_init_image_units(struct gl_context * ctx)513*61046927SAndroid Build Coastguard Worker _mesa_init_image_units(struct gl_context *ctx)
514*61046927SAndroid Build Coastguard Worker {
515*61046927SAndroid Build Coastguard Worker    unsigned i;
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker    ASSERT_BITFIELD_SIZE(struct gl_image_unit, Format, MESA_FORMAT_COUNT);
518*61046927SAndroid Build Coastguard Worker 
519*61046927SAndroid Build Coastguard Worker    for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i)
520*61046927SAndroid Build Coastguard Worker       ctx->ImageUnits[i] = _mesa_default_image_unit(ctx);
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker void
_mesa_free_image_textures(struct gl_context * ctx)525*61046927SAndroid Build Coastguard Worker _mesa_free_image_textures(struct gl_context *ctx)
526*61046927SAndroid Build Coastguard Worker {
527*61046927SAndroid Build Coastguard Worker    unsigned i;
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker    for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i)
530*61046927SAndroid Build Coastguard Worker       _mesa_reference_texobj(&ctx->ImageUnits[i].TexObj, NULL);
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_is_image_unit_valid(struct gl_context * ctx,struct gl_image_unit * u)534*61046927SAndroid Build Coastguard Worker _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
535*61046927SAndroid Build Coastguard Worker {
536*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *t = u->TexObj;
537*61046927SAndroid Build Coastguard Worker    mesa_format tex_format;
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker    if (!t)
540*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    if (!t->_BaseComplete && !t->_MipmapComplete)
543*61046927SAndroid Build Coastguard Worker        _mesa_test_texobj_completeness(ctx, t);
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker    if (u->Level < t->Attrib.BaseLevel ||
546*61046927SAndroid Build Coastguard Worker        u->Level > t->_MaxLevel ||
547*61046927SAndroid Build Coastguard Worker        (u->Level == t->Attrib.BaseLevel && !t->_BaseComplete) ||
548*61046927SAndroid Build Coastguard Worker        (u->Level != t->Attrib.BaseLevel && !t->_MipmapComplete))
549*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker    if (_mesa_tex_target_is_layered(t->Target) &&
552*61046927SAndroid Build Coastguard Worker        u->_Layer >= _mesa_get_texture_layers(t, u->Level))
553*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
554*61046927SAndroid Build Coastguard Worker 
555*61046927SAndroid Build Coastguard Worker    if (t->Target == GL_TEXTURE_BUFFER) {
556*61046927SAndroid Build Coastguard Worker       tex_format = _mesa_get_shader_image_format(t->BufferObjectFormat);
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker    } else {
559*61046927SAndroid Build Coastguard Worker       struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
560*61046927SAndroid Build Coastguard Worker                                       t->Image[u->_Layer][u->Level] :
561*61046927SAndroid Build Coastguard Worker                                       t->Image[0][u->Level]);
562*61046927SAndroid Build Coastguard Worker 
563*61046927SAndroid Build Coastguard Worker       if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
564*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker       tex_format = _mesa_get_shader_image_format(img->InternalFormat);
567*61046927SAndroid Build Coastguard Worker    }
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker    if (!tex_format)
570*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
571*61046927SAndroid Build Coastguard Worker 
572*61046927SAndroid Build Coastguard Worker    switch (t->Attrib.ImageFormatCompatibilityType) {
573*61046927SAndroid Build Coastguard Worker    case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE:
574*61046927SAndroid Build Coastguard Worker       if (_mesa_get_format_bytes(tex_format) !=
575*61046927SAndroid Build Coastguard Worker           _mesa_get_format_bytes(u->_ActualFormat))
576*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
577*61046927SAndroid Build Coastguard Worker       break;
578*61046927SAndroid Build Coastguard Worker 
579*61046927SAndroid Build Coastguard Worker    case GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS:
580*61046927SAndroid Build Coastguard Worker       if (get_image_format_class(tex_format) !=
581*61046927SAndroid Build Coastguard Worker           get_image_format_class(u->_ActualFormat))
582*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
583*61046927SAndroid Build Coastguard Worker       break;
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker    default:
586*61046927SAndroid Build Coastguard Worker       assert(!"Unexpected image format compatibility type");
587*61046927SAndroid Build Coastguard Worker    }
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
590*61046927SAndroid Build Coastguard Worker }
591*61046927SAndroid Build Coastguard Worker 
592*61046927SAndroid Build Coastguard Worker static GLboolean
validate_bind_image_texture(struct gl_context * ctx,GLuint unit,GLuint texture,GLint level,GLint layer,GLenum access,GLenum format,bool check_level_layer)593*61046927SAndroid Build Coastguard Worker validate_bind_image_texture(struct gl_context *ctx, GLuint unit,
594*61046927SAndroid Build Coastguard Worker                             GLuint texture, GLint level, GLint layer,
595*61046927SAndroid Build Coastguard Worker                             GLenum access, GLenum format, bool check_level_layer)
596*61046927SAndroid Build Coastguard Worker {
597*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxImageUnits <= MAX_IMAGE_UNITS);
598*61046927SAndroid Build Coastguard Worker 
599*61046927SAndroid Build Coastguard Worker    if (unit >= ctx->Const.MaxImageUnits) {
600*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(unit)");
601*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
602*61046927SAndroid Build Coastguard Worker    }
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker    if (check_level_layer) {
605*61046927SAndroid Build Coastguard Worker       /* EXT_shader_image_load_store doesn't throw an error if level or
606*61046927SAndroid Build Coastguard Worker        * layer is negative.
607*61046927SAndroid Build Coastguard Worker        */
608*61046927SAndroid Build Coastguard Worker       if (level < 0) {
609*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(level)");
610*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
611*61046927SAndroid Build Coastguard Worker       }
612*61046927SAndroid Build Coastguard Worker 
613*61046927SAndroid Build Coastguard Worker          if (layer < 0) {
614*61046927SAndroid Build Coastguard Worker             _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(layer)");
615*61046927SAndroid Build Coastguard Worker             return GL_FALSE;
616*61046927SAndroid Build Coastguard Worker       }
617*61046927SAndroid Build Coastguard Worker    }
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker    if (access != GL_READ_ONLY &&
620*61046927SAndroid Build Coastguard Worker        access != GL_WRITE_ONLY &&
621*61046927SAndroid Build Coastguard Worker        access != GL_READ_WRITE) {
622*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(access)");
623*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
624*61046927SAndroid Build Coastguard Worker    }
625*61046927SAndroid Build Coastguard Worker 
626*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_shader_image_format_supported(ctx, format)) {
627*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(format)");
628*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
629*61046927SAndroid Build Coastguard Worker    }
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
632*61046927SAndroid Build Coastguard Worker }
633*61046927SAndroid Build Coastguard Worker 
634*61046927SAndroid Build Coastguard Worker static void
set_image_binding(struct gl_image_unit * u,struct gl_texture_object * texObj,GLint level,GLboolean layered,GLint layer,GLenum access,GLenum format)635*61046927SAndroid Build Coastguard Worker set_image_binding(struct gl_image_unit *u, struct gl_texture_object *texObj,
636*61046927SAndroid Build Coastguard Worker                   GLint level, GLboolean layered, GLint layer, GLenum access,
637*61046927SAndroid Build Coastguard Worker                   GLenum format)
638*61046927SAndroid Build Coastguard Worker {
639*61046927SAndroid Build Coastguard Worker    u->Level = level;
640*61046927SAndroid Build Coastguard Worker    u->Access = access;
641*61046927SAndroid Build Coastguard Worker    u->Format = format;
642*61046927SAndroid Build Coastguard Worker    u->_ActualFormat = _mesa_get_shader_image_format(format);
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker    if (texObj && _mesa_tex_target_is_layered(texObj->Target)) {
645*61046927SAndroid Build Coastguard Worker       u->Layered = layered;
646*61046927SAndroid Build Coastguard Worker       u->Layer = layer;
647*61046927SAndroid Build Coastguard Worker    } else {
648*61046927SAndroid Build Coastguard Worker       u->Layered = GL_FALSE;
649*61046927SAndroid Build Coastguard Worker       u->Layer = 0;
650*61046927SAndroid Build Coastguard Worker    }
651*61046927SAndroid Build Coastguard Worker    u->_Layer = (u->Layered ? 0 : u->Layer);
652*61046927SAndroid Build Coastguard Worker 
653*61046927SAndroid Build Coastguard Worker    _mesa_reference_texobj(&u->TexObj, texObj);
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker 
656*61046927SAndroid Build Coastguard Worker static void
bind_image_texture(struct gl_context * ctx,struct gl_texture_object * texObj,GLuint unit,GLint level,GLboolean layered,GLint layer,GLenum access,GLenum format)657*61046927SAndroid Build Coastguard Worker bind_image_texture(struct gl_context *ctx, struct gl_texture_object *texObj,
658*61046927SAndroid Build Coastguard Worker                    GLuint unit, GLint level, GLboolean layered, GLint layer,
659*61046927SAndroid Build Coastguard Worker                    GLenum access, GLenum format)
660*61046927SAndroid Build Coastguard Worker {
661*61046927SAndroid Build Coastguard Worker    struct gl_image_unit *u;
662*61046927SAndroid Build Coastguard Worker 
663*61046927SAndroid Build Coastguard Worker    u = &ctx->ImageUnits[unit];
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, 0);
666*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_IMAGE_UNITS;
667*61046927SAndroid Build Coastguard Worker 
668*61046927SAndroid Build Coastguard Worker    set_image_binding(u, texObj, level, layered, layer, access, format);
669*61046927SAndroid Build Coastguard Worker }
670*61046927SAndroid Build Coastguard Worker 
671*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindImageTexture_no_error(GLuint unit,GLuint texture,GLint level,GLboolean layered,GLint layer,GLenum access,GLenum format)672*61046927SAndroid Build Coastguard Worker _mesa_BindImageTexture_no_error(GLuint unit, GLuint texture, GLint level,
673*61046927SAndroid Build Coastguard Worker                                 GLboolean layered, GLint layer, GLenum access,
674*61046927SAndroid Build Coastguard Worker                                 GLenum format)
675*61046927SAndroid Build Coastguard Worker {
676*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
677*61046927SAndroid Build Coastguard Worker 
678*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
679*61046927SAndroid Build Coastguard Worker 
680*61046927SAndroid Build Coastguard Worker    if (texture)
681*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker    bind_image_texture(ctx, texObj, unit, level, layered, layer, access, format);
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker 
686*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindImageTexture(GLuint unit,GLuint texture,GLint level,GLboolean layered,GLint layer,GLenum access,GLenum format)687*61046927SAndroid Build Coastguard Worker _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level,
688*61046927SAndroid Build Coastguard Worker                        GLboolean layered, GLint layer, GLenum access,
689*61046927SAndroid Build Coastguard Worker                        GLenum format)
690*61046927SAndroid Build Coastguard Worker {
691*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
692*61046927SAndroid Build Coastguard Worker 
693*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
694*61046927SAndroid Build Coastguard Worker 
695*61046927SAndroid Build Coastguard Worker    if (!validate_bind_image_texture(ctx, unit, texture, level, layer, access,
696*61046927SAndroid Build Coastguard Worker                                     format, true))
697*61046927SAndroid Build Coastguard Worker       return;
698*61046927SAndroid Build Coastguard Worker 
699*61046927SAndroid Build Coastguard Worker    if (texture) {
700*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker       if (!texObj) {
703*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(texture)");
704*61046927SAndroid Build Coastguard Worker          return;
705*61046927SAndroid Build Coastguard Worker       }
706*61046927SAndroid Build Coastguard Worker 
707*61046927SAndroid Build Coastguard Worker       /* From section 8.22 "Texture Image Loads and Stores" of the OpenGL ES
708*61046927SAndroid Build Coastguard Worker        * 3.1 spec:
709*61046927SAndroid Build Coastguard Worker        *
710*61046927SAndroid Build Coastguard Worker        * "An INVALID_OPERATION error is generated if texture is not the name
711*61046927SAndroid Build Coastguard Worker        *  of an immutable texture object."
712*61046927SAndroid Build Coastguard Worker        *
713*61046927SAndroid Build Coastguard Worker        * However note that issue 7 of the GL_OES_texture_buffer spec
714*61046927SAndroid Build Coastguard Worker        * recognizes that there is no way to create immutable buffer textures,
715*61046927SAndroid Build Coastguard Worker        * so those are excluded from this requirement.
716*61046927SAndroid Build Coastguard Worker        *
717*61046927SAndroid Build Coastguard Worker        * Additionally, issue 10 of the OES_EGL_image_external_essl3 spec
718*61046927SAndroid Build Coastguard Worker        * states that glBindImageTexture must accept external texture objects.
719*61046927SAndroid Build Coastguard Worker        */
720*61046927SAndroid Build Coastguard Worker       if (_mesa_is_gles(ctx) && !texObj->Immutable && !texObj->External &&
721*61046927SAndroid Build Coastguard Worker           texObj->Target != GL_TEXTURE_BUFFER) {
722*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
723*61046927SAndroid Build Coastguard Worker                      "glBindImageTexture(!immutable)");
724*61046927SAndroid Build Coastguard Worker          return;
725*61046927SAndroid Build Coastguard Worker       }
726*61046927SAndroid Build Coastguard Worker    }
727*61046927SAndroid Build Coastguard Worker 
728*61046927SAndroid Build Coastguard Worker    bind_image_texture(ctx, texObj, unit, level, layered, layer, access, format);
729*61046927SAndroid Build Coastguard Worker }
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindImageTextureEXT(GLuint index,GLuint texture,GLint level,GLboolean layered,GLint layer,GLenum access,GLint format)732*61046927SAndroid Build Coastguard Worker _mesa_BindImageTextureEXT(GLuint index, GLuint texture, GLint level,
733*61046927SAndroid Build Coastguard Worker                           GLboolean layered, GLint layer, GLenum access,
734*61046927SAndroid Build Coastguard Worker                           GLint format)
735*61046927SAndroid Build Coastguard Worker {
736*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
737*61046927SAndroid Build Coastguard Worker 
738*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker    if (!validate_bind_image_texture(ctx, index, texture, level, layer, access,
741*61046927SAndroid Build Coastguard Worker                                     format, false))
742*61046927SAndroid Build Coastguard Worker       return;
743*61046927SAndroid Build Coastguard Worker 
744*61046927SAndroid Build Coastguard Worker    if (texture) {
745*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker       if (!texObj) {
748*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTextureEXT(texture)");
749*61046927SAndroid Build Coastguard Worker          return;
750*61046927SAndroid Build Coastguard Worker       }
751*61046927SAndroid Build Coastguard Worker    }
752*61046927SAndroid Build Coastguard Worker 
753*61046927SAndroid Build Coastguard Worker    bind_image_texture(ctx, texObj, index, level, layered, layer, access, format);
754*61046927SAndroid Build Coastguard Worker }
755*61046927SAndroid Build Coastguard Worker 
756*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
bind_image_textures(struct gl_context * ctx,GLuint first,GLuint count,const GLuint * textures,bool no_error)757*61046927SAndroid Build Coastguard Worker bind_image_textures(struct gl_context *ctx, GLuint first, GLuint count,
758*61046927SAndroid Build Coastguard Worker                     const GLuint *textures, bool no_error)
759*61046927SAndroid Build Coastguard Worker {
760*61046927SAndroid Build Coastguard Worker    int i;
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker    /* Assume that at least one binding will be changed */
763*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, 0);
764*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState |= ST_NEW_IMAGE_UNITS;
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker    /* Note that the error semantics for multi-bind commands differ from
767*61046927SAndroid Build Coastguard Worker     * those of other GL commands.
768*61046927SAndroid Build Coastguard Worker     *
769*61046927SAndroid Build Coastguard Worker     * The Issues section in the ARB_multi_bind spec says:
770*61046927SAndroid Build Coastguard Worker     *
771*61046927SAndroid Build Coastguard Worker     *    "(11) Typically, OpenGL specifies that if an error is generated by
772*61046927SAndroid Build Coastguard Worker     *          a command, that command has no effect.  This is somewhat
773*61046927SAndroid Build Coastguard Worker     *          unfortunate for multi-bind commands, because it would require
774*61046927SAndroid Build Coastguard Worker     *          a first pass to scan the entire list of bound objects for
775*61046927SAndroid Build Coastguard Worker     *          errors and then a second pass to actually perform the
776*61046927SAndroid Build Coastguard Worker     *          bindings.  Should we have different error semantics?
777*61046927SAndroid Build Coastguard Worker     *
778*61046927SAndroid Build Coastguard Worker     *       RESOLVED:  Yes.  In this specification, when the parameters for
779*61046927SAndroid Build Coastguard Worker     *       one of the <count> binding points are invalid, that binding
780*61046927SAndroid Build Coastguard Worker     *       point is not updated and an error will be generated.  However,
781*61046927SAndroid Build Coastguard Worker     *       other binding points in the same command will be updated if
782*61046927SAndroid Build Coastguard Worker     *       their parameters are valid and no other error occurs."
783*61046927SAndroid Build Coastguard Worker     */
784*61046927SAndroid Build Coastguard Worker 
785*61046927SAndroid Build Coastguard Worker    _mesa_HashLockMutex(&ctx->Shared->TexObjects);
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker    for (i = 0; i < count; i++) {
788*61046927SAndroid Build Coastguard Worker       struct gl_image_unit *u = &ctx->ImageUnits[first + i];
789*61046927SAndroid Build Coastguard Worker       const GLuint texture = textures ? textures[i] : 0;
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker       if (texture) {
792*61046927SAndroid Build Coastguard Worker          struct gl_texture_object *texObj = u->TexObj;
793*61046927SAndroid Build Coastguard Worker          GLenum tex_format;
794*61046927SAndroid Build Coastguard Worker 
795*61046927SAndroid Build Coastguard Worker          if (!texObj || texObj->Name != texture) {
796*61046927SAndroid Build Coastguard Worker             texObj = _mesa_lookup_texture_locked(ctx, texture);
797*61046927SAndroid Build Coastguard Worker             if (!no_error && !texObj) {
798*61046927SAndroid Build Coastguard Worker                /* The ARB_multi_bind spec says:
799*61046927SAndroid Build Coastguard Worker                 *
800*61046927SAndroid Build Coastguard Worker                 *    "An INVALID_OPERATION error is generated if any value
801*61046927SAndroid Build Coastguard Worker                 *     in <textures> is not zero or the name of an existing
802*61046927SAndroid Build Coastguard Worker                 *     texture object (per binding)."
803*61046927SAndroid Build Coastguard Worker                 */
804*61046927SAndroid Build Coastguard Worker                _mesa_error(ctx, GL_INVALID_OPERATION,
805*61046927SAndroid Build Coastguard Worker                            "glBindImageTextures(textures[%d]=%u "
806*61046927SAndroid Build Coastguard Worker                            "is not zero or the name of an existing texture "
807*61046927SAndroid Build Coastguard Worker                            "object)", i, texture);
808*61046927SAndroid Build Coastguard Worker                continue;
809*61046927SAndroid Build Coastguard Worker             }
810*61046927SAndroid Build Coastguard Worker          }
811*61046927SAndroid Build Coastguard Worker 
812*61046927SAndroid Build Coastguard Worker          if (texObj->Target == GL_TEXTURE_BUFFER) {
813*61046927SAndroid Build Coastguard Worker             tex_format = texObj->BufferObjectFormat;
814*61046927SAndroid Build Coastguard Worker          } else {
815*61046927SAndroid Build Coastguard Worker             struct gl_texture_image *image = texObj->Image[0][0];
816*61046927SAndroid Build Coastguard Worker 
817*61046927SAndroid Build Coastguard Worker             if (!no_error && (!image || image->Width == 0 ||
818*61046927SAndroid Build Coastguard Worker                               image->Height == 0 || image->Depth == 0)) {
819*61046927SAndroid Build Coastguard Worker                /* The ARB_multi_bind spec says:
820*61046927SAndroid Build Coastguard Worker                 *
821*61046927SAndroid Build Coastguard Worker                 *    "An INVALID_OPERATION error is generated if the width,
822*61046927SAndroid Build Coastguard Worker                 *     height, or depth of the level zero texture image of
823*61046927SAndroid Build Coastguard Worker                 *     any texture in <textures> is zero (per binding)."
824*61046927SAndroid Build Coastguard Worker                 */
825*61046927SAndroid Build Coastguard Worker                _mesa_error(ctx, GL_INVALID_OPERATION,
826*61046927SAndroid Build Coastguard Worker                            "glBindImageTextures(the width, height or depth "
827*61046927SAndroid Build Coastguard Worker                            "of the level zero texture image of "
828*61046927SAndroid Build Coastguard Worker                            "textures[%d]=%u is zero)", i, texture);
829*61046927SAndroid Build Coastguard Worker                continue;
830*61046927SAndroid Build Coastguard Worker             }
831*61046927SAndroid Build Coastguard Worker 
832*61046927SAndroid Build Coastguard Worker             tex_format = image->InternalFormat;
833*61046927SAndroid Build Coastguard Worker          }
834*61046927SAndroid Build Coastguard Worker 
835*61046927SAndroid Build Coastguard Worker          if (!no_error &&
836*61046927SAndroid Build Coastguard Worker              !_mesa_is_shader_image_format_supported(ctx, tex_format)) {
837*61046927SAndroid Build Coastguard Worker             /* The ARB_multi_bind spec says:
838*61046927SAndroid Build Coastguard Worker              *
839*61046927SAndroid Build Coastguard Worker              *   "An INVALID_OPERATION error is generated if the internal
840*61046927SAndroid Build Coastguard Worker              *    format of the level zero texture image of any texture
841*61046927SAndroid Build Coastguard Worker              *    in <textures> is not found in table 8.33 (per binding)."
842*61046927SAndroid Build Coastguard Worker              */
843*61046927SAndroid Build Coastguard Worker             _mesa_error(ctx, GL_INVALID_OPERATION,
844*61046927SAndroid Build Coastguard Worker                         "glBindImageTextures(the internal format %s of "
845*61046927SAndroid Build Coastguard Worker                         "the level zero texture image of textures[%d]=%u "
846*61046927SAndroid Build Coastguard Worker                         "is not supported)",
847*61046927SAndroid Build Coastguard Worker                         _mesa_enum_to_string(tex_format),
848*61046927SAndroid Build Coastguard Worker                         i, texture);
849*61046927SAndroid Build Coastguard Worker             continue;
850*61046927SAndroid Build Coastguard Worker          }
851*61046927SAndroid Build Coastguard Worker 
852*61046927SAndroid Build Coastguard Worker          /* Update the texture binding */
853*61046927SAndroid Build Coastguard Worker          set_image_binding(u, texObj, 0,
854*61046927SAndroid Build Coastguard Worker                            _mesa_tex_target_is_layered(texObj->Target),
855*61046927SAndroid Build Coastguard Worker                            0, GL_READ_WRITE, tex_format);
856*61046927SAndroid Build Coastguard Worker       } else {
857*61046927SAndroid Build Coastguard Worker          /* Unbind the texture from the unit */
858*61046927SAndroid Build Coastguard Worker          set_image_binding(u, NULL, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8);
859*61046927SAndroid Build Coastguard Worker       }
860*61046927SAndroid Build Coastguard Worker    }
861*61046927SAndroid Build Coastguard Worker 
862*61046927SAndroid Build Coastguard Worker    _mesa_HashUnlockMutex(&ctx->Shared->TexObjects);
863*61046927SAndroid Build Coastguard Worker }
864*61046927SAndroid Build Coastguard Worker 
865*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindImageTextures_no_error(GLuint first,GLsizei count,const GLuint * textures)866*61046927SAndroid Build Coastguard Worker _mesa_BindImageTextures_no_error(GLuint first, GLsizei count,
867*61046927SAndroid Build Coastguard Worker                                  const GLuint *textures)
868*61046927SAndroid Build Coastguard Worker {
869*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
870*61046927SAndroid Build Coastguard Worker 
871*61046927SAndroid Build Coastguard Worker    bind_image_textures(ctx, first, count, textures, true);
872*61046927SAndroid Build Coastguard Worker }
873*61046927SAndroid Build Coastguard Worker 
874*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindImageTextures(GLuint first,GLsizei count,const GLuint * textures)875*61046927SAndroid Build Coastguard Worker _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
876*61046927SAndroid Build Coastguard Worker {
877*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
878*61046927SAndroid Build Coastguard Worker 
879*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.ARB_shader_image_load_store &&
880*61046927SAndroid Build Coastguard Worker        !_mesa_is_gles31(ctx)) {
881*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glBindImageTextures()");
882*61046927SAndroid Build Coastguard Worker       return;
883*61046927SAndroid Build Coastguard Worker    }
884*61046927SAndroid Build Coastguard Worker 
885*61046927SAndroid Build Coastguard Worker    if (first + count > ctx->Const.MaxImageUnits) {
886*61046927SAndroid Build Coastguard Worker       /* The ARB_multi_bind spec says:
887*61046927SAndroid Build Coastguard Worker        *
888*61046927SAndroid Build Coastguard Worker        *    "An INVALID_OPERATION error is generated if <first> + <count>
889*61046927SAndroid Build Coastguard Worker        *     is greater than the number of image units supported by
890*61046927SAndroid Build Coastguard Worker        *     the implementation."
891*61046927SAndroid Build Coastguard Worker        */
892*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
893*61046927SAndroid Build Coastguard Worker                   "glBindImageTextures(first=%u + count=%d > the value of "
894*61046927SAndroid Build Coastguard Worker                   "GL_MAX_IMAGE_UNITS=%u)",
895*61046927SAndroid Build Coastguard Worker                   first, count, ctx->Const.MaxImageUnits);
896*61046927SAndroid Build Coastguard Worker       return;
897*61046927SAndroid Build Coastguard Worker    }
898*61046927SAndroid Build Coastguard Worker 
899*61046927SAndroid Build Coastguard Worker    bind_image_textures(ctx, first, count, textures, false);
900*61046927SAndroid Build Coastguard Worker }
901