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