• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "Image.hpp"
16 
17 #include "../libEGL/Texture.hpp"
18 #include "../common/debug.h"
19 #include "Common/Math.hpp"
20 #include "Common/Thread.hpp"
21 
22 #include <GLES3/gl3.h>
23 
24 #include <string.h>
25 #include <algorithm>
26 
27 #if defined(__APPLE__)
28 #include <CoreFoundation/CoreFoundation.h>
29 #include <IOSurface/IOSurface.h>
30 #endif
31 
32 namespace gl
33 {
IsUnsizedInternalFormat(GLint internalformat)34 	bool IsUnsizedInternalFormat(GLint internalformat)
35 	{
36 		switch(internalformat)
37 		{
38 		case GL_ALPHA:
39 		case GL_LUMINANCE:
40 		case GL_LUMINANCE_ALPHA:
41 		case GL_RED:
42 		case GL_RG:
43 		case GL_RGB:
44 		case GL_RGBA:
45 		case GL_RED_INTEGER:
46 		case GL_RG_INTEGER:
47 		case GL_RGB_INTEGER:
48 		case GL_RGBA_INTEGER:
49 		case GL_BGRA_EXT:
50 		case GL_DEPTH_COMPONENT:
51 		case GL_DEPTH_STENCIL:
52 		// GL_EXT_sRGB
53 	//	case GL_SRGB_EXT:
54 	//	case GL_SRGB_ALPHA_EXT:
55 			return true;
56 		default:
57 			return false;
58 		}
59 	}
60 
GetBaseInternalFormat(GLint internalformat)61 	GLenum GetBaseInternalFormat(GLint internalformat)
62 	{
63 		switch(internalformat)
64 		{
65 		// [OpenGL ES 3.0 Table 3.13]
66 		case GL_R8:       return GL_RED;
67 		case GL_R8_SNORM: return GL_RED;
68 		case GL_RG8:       return GL_RG;
69 		case GL_RG8_SNORM: return GL_RG;
70 		case GL_RGB8:       return GL_RGB;
71 		case GL_RGB8_SNORM: return GL_RGB;
72 		case GL_RGB565:     return GL_RGB;
73 		case GL_RGBA4:        return GL_RGBA;
74 		case GL_RGB5_A1:      return GL_RGBA;
75 		case GL_RGBA8:        return GL_RGBA;
76 		case GL_RGBA8_SNORM:  return GL_RGBA;
77 		case GL_RGB10_A2:     return GL_RGBA;
78 		case GL_RGB10_A2UI:   return GL_RGBA;
79 		case GL_SRGB8:        return GL_RGB;
80 		case GL_SRGB8_ALPHA8: return GL_RGBA;
81 		case GL_R16F:    return GL_RED;
82 		case GL_RG16F:   return GL_RG;
83 		case GL_RGB16F:  return GL_RGB;
84 		case GL_RGBA16F: return GL_RGBA;
85 		case GL_R32F:    return GL_RED;
86 		case GL_RG32F:   return GL_RG;
87 		case GL_RGB32F:  return GL_RGB;
88 		case GL_RGBA32F: return GL_RGBA;
89 		case GL_R11F_G11F_B10F: return GL_RGB;
90 		case GL_RGB9_E5:        return GL_RGB;
91 		case GL_R8I:      return GL_RED;
92 		case GL_R8UI:     return GL_RED;
93 		case GL_R16I:     return GL_RED;
94 		case GL_R16UI:    return GL_RED;
95 		case GL_R32I:     return GL_RED;
96 		case GL_R32UI:    return GL_RED;
97 		case GL_RG8I:     return GL_RG;
98 		case GL_RG8UI:    return GL_RG;
99 		case GL_RG16I:    return GL_RG;
100 		case GL_RG16UI:   return GL_RG;
101 		case GL_RG32I:    return GL_RG;
102 		case GL_RG32UI:   return GL_RG;
103 		case GL_RGB8I:    return GL_RGB;
104 		case GL_RGB8UI:   return GL_RGB;
105 		case GL_RGB16I:   return GL_RGB;
106 		case GL_RGB16UI:  return GL_RGB;
107 		case GL_RGB32I:   return GL_RGB;
108 		case GL_RGB32UI:  return GL_RGB;
109 		case GL_RGBA8I:   return GL_RGBA;
110 		case GL_RGBA8UI:  return GL_RGBA;
111 		case GL_RGBA16I:  return GL_RGBA;
112 		case GL_RGBA16UI: return GL_RGBA;
113 		case GL_RGBA32I:  return GL_RGBA;
114 		case GL_RGBA32UI: return GL_RGBA;
115 
116 		// GL_EXT_texture_storage
117 		case GL_ALPHA8_EXT:             return GL_ALPHA;
118 		case GL_LUMINANCE8_EXT:         return GL_LUMINANCE;
119 		case GL_LUMINANCE8_ALPHA8_EXT:  return GL_LUMINANCE_ALPHA;
120 		case GL_ALPHA32F_EXT:           return GL_ALPHA;
121 		case GL_LUMINANCE32F_EXT:       return GL_LUMINANCE;
122 		case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
123 		case GL_ALPHA16F_EXT:           return GL_ALPHA;
124 		case GL_LUMINANCE16F_EXT:       return GL_LUMINANCE;
125 		case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
126 
127 		case GL_BGRA8_EXT: return GL_BGRA_EXT;   // GL_APPLE_texture_format_BGRA8888
128 
129 		case GL_DEPTH_COMPONENT24:     return GL_DEPTH_COMPONENT;
130 		case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
131 		case GL_DEPTH_COMPONENT32F:    return GL_DEPTH_COMPONENT;
132 		case GL_DEPTH_COMPONENT16:     return GL_DEPTH_COMPONENT;
133 		case GL_DEPTH32F_STENCIL8:     return GL_DEPTH_STENCIL;
134 		case GL_DEPTH24_STENCIL8:      return GL_DEPTH_STENCIL;
135 		case GL_STENCIL_INDEX8:        return GL_STENCIL_INDEX_OES;
136 		default:
137 			UNREACHABLE(internalformat);
138 			break;
139 		}
140 
141 		return GL_NONE;
142 	}
143 
GetSizedInternalFormat(GLint internalformat,GLenum type)144 	GLint GetSizedInternalFormat(GLint internalformat, GLenum type)
145 	{
146 		if(!IsUnsizedInternalFormat(internalformat))
147 		{
148 			return internalformat;
149 		}
150 
151 		switch(internalformat)
152 		{
153 		case GL_RGBA:
154 			switch(type)
155 			{
156 			case GL_UNSIGNED_BYTE: return GL_RGBA8;
157 			case GL_BYTE:          return GL_RGBA8_SNORM;
158 			case GL_UNSIGNED_SHORT_4_4_4_4:      return GL_RGBA4;
159 			case GL_UNSIGNED_SHORT_5_5_5_1:      return GL_RGB5_A1;
160 			case GL_UNSIGNED_INT_2_10_10_10_REV: return GL_RGB10_A2;
161 			case GL_FLOAT:          return GL_RGBA32F;
162 			case GL_HALF_FLOAT:     return GL_RGBA16F;
163 			case GL_HALF_FLOAT_OES: return GL_RGBA16F;
164 			default: UNREACHABLE(type); return GL_NONE;
165 			}
166 		case GL_RGBA_INTEGER:
167 			switch(type)
168 			{
169 			case GL_UNSIGNED_BYTE:  return GL_RGBA8UI;
170 			case GL_BYTE:           return GL_RGBA8I;
171 			case GL_UNSIGNED_SHORT: return GL_RGBA16UI;
172 			case GL_SHORT:          return GL_RGBA16I;
173 			case GL_UNSIGNED_INT:   return GL_RGBA32UI;
174 			case GL_INT:            return GL_RGBA32I;
175 			case GL_UNSIGNED_INT_2_10_10_10_REV: return GL_RGB10_A2UI;
176 			default: UNREACHABLE(type); return GL_NONE;
177 			}
178 		case GL_RGB:
179 			switch(type)
180 			{
181 			case GL_UNSIGNED_BYTE:  return GL_RGB8;
182 			case GL_BYTE:           return GL_RGB8_SNORM;
183 			case GL_UNSIGNED_SHORT_5_6_5:         return GL_RGB565;
184 			case GL_UNSIGNED_INT_10F_11F_11F_REV: return GL_R11F_G11F_B10F;
185 			case GL_UNSIGNED_INT_5_9_9_9_REV:     return GL_RGB9_E5;
186 			case GL_FLOAT:          return GL_RGB32F;
187 			case GL_HALF_FLOAT:     return GL_RGB16F;
188 			case GL_HALF_FLOAT_OES: return GL_RGB16F;
189 			default: UNREACHABLE(type); return GL_NONE;
190 			}
191 		case GL_RGB_INTEGER:
192 			switch(type)
193 			{
194 			case GL_UNSIGNED_BYTE:  return GL_RGB8UI;
195 			case GL_BYTE:           return GL_RGB8I;
196 			case GL_UNSIGNED_SHORT: return GL_RGB16UI;
197 			case GL_SHORT:          return GL_RGB16I;
198 			case GL_UNSIGNED_INT:   return GL_RGB32UI;
199 			case GL_INT:            return GL_RGB32I;
200 			default: UNREACHABLE(type); return GL_NONE;
201 			}
202 		case GL_RG:
203 			switch(type)
204 			{
205 			case GL_UNSIGNED_BYTE:  return GL_RG8;
206 			case GL_BYTE:           return GL_RG8_SNORM;
207 			case GL_FLOAT:          return GL_RG32F;
208 			case GL_HALF_FLOAT:     return GL_RG16F;
209 			case GL_HALF_FLOAT_OES: return GL_RG16F;
210 			default: UNREACHABLE(type); return GL_NONE;
211 			}
212 		case GL_RG_INTEGER:
213 			switch(type)
214 			{
215 			case GL_UNSIGNED_BYTE:  return GL_RG8UI;
216 			case GL_BYTE:           return GL_RG8I;
217 			case GL_UNSIGNED_SHORT: return GL_RG16UI;
218 			case GL_SHORT:          return GL_RG16I;
219 			case GL_UNSIGNED_INT:   return GL_RG32UI;
220 			case GL_INT:            return GL_RG32I;
221 			default: UNREACHABLE(type); return GL_NONE;
222 			}
223 		case GL_RED:
224 			switch(type)
225 			{
226 			case GL_UNSIGNED_BYTE:  return GL_R8;
227 			case GL_BYTE:           return GL_R8_SNORM;
228 			case GL_FLOAT:          return GL_R32F;
229 			case GL_HALF_FLOAT:     return GL_R16F;
230 			case GL_HALF_FLOAT_OES: return GL_R16F;
231 			default: UNREACHABLE(type); return GL_NONE;
232 			}
233 		case GL_RED_INTEGER:
234 			switch(type)
235 			{
236 			case GL_UNSIGNED_BYTE:  return GL_R8UI;
237 			case GL_BYTE:           return GL_R8I;
238 			case GL_UNSIGNED_SHORT: return GL_R16UI;
239 			case GL_SHORT:          return GL_R16I;
240 			case GL_UNSIGNED_INT:   return GL_R32UI;
241 			case GL_INT:            return GL_R32I;
242 			default: UNREACHABLE(type); return GL_NONE;
243 			}
244 		case GL_LUMINANCE_ALPHA:
245 			switch(type)
246 			{
247 			case GL_UNSIGNED_BYTE:  return GL_LUMINANCE8_ALPHA8_EXT;
248 			case GL_FLOAT:          return GL_LUMINANCE_ALPHA32F_EXT;
249 			case GL_HALF_FLOAT:     return GL_LUMINANCE_ALPHA16F_EXT;
250 			case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
251 			default: UNREACHABLE(type); return GL_NONE;
252 			}
253 		case GL_LUMINANCE:
254 			switch(type)
255 			{
256 			case GL_UNSIGNED_BYTE:  return GL_LUMINANCE8_EXT;
257 			case GL_FLOAT:          return GL_LUMINANCE32F_EXT;
258 			case GL_HALF_FLOAT:     return GL_LUMINANCE16F_EXT;
259 			case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
260 			default: UNREACHABLE(type); return GL_NONE;
261 			}
262 		case GL_ALPHA:
263 			switch(type)
264 			{
265 			case GL_UNSIGNED_BYTE:  return GL_ALPHA8_EXT;
266 			case GL_FLOAT:          return GL_ALPHA32F_EXT;
267 			case GL_HALF_FLOAT:     return GL_ALPHA16F_EXT;
268 			case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
269 			default: UNREACHABLE(type); return GL_NONE;
270 			}
271 		case GL_BGRA_EXT:
272 			switch(type)
273 			{
274 			case GL_UNSIGNED_BYTE:                  return GL_BGRA8_EXT;
275 			case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: // Only valid for glReadPixels calls.
276 			case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: // Only valid for glReadPixels calls.
277 			default: UNREACHABLE(type); return GL_NONE;
278 			}
279 		case GL_DEPTH_COMPONENT:
280 			switch(type)
281 			{
282 			case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
283 			case GL_UNSIGNED_INT:   return GL_DEPTH_COMPONENT32_OES;
284 			case GL_FLOAT:          return GL_DEPTH_COMPONENT32F;
285 			default: UNREACHABLE(type); return GL_NONE;
286 			}
287 		case GL_DEPTH_STENCIL:
288 			switch(type)
289 			{
290 			case GL_UNSIGNED_INT_24_8:              return GL_DEPTH24_STENCIL8;
291 			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return GL_DEPTH32F_STENCIL8;
292 			default: UNREACHABLE(type); return GL_NONE;
293 			}
294 
295 		// GL_OES_texture_stencil8
296 	//	case GL_STENCIL_INDEX_OES / GL_UNSIGNED_BYTE: return GL_STENCIL_INDEX8;
297 
298 		// GL_EXT_sRGB
299 	//	case GL_SRGB_EXT / GL_UNSIGNED_BYTE: return GL_SRGB8;
300 	//	case GL_SRGB_ALPHA_EXT / GL_UNSIGNED_BYTE: return GL_SRGB8_ALPHA8;
301 
302 		default:
303 			UNREACHABLE(internalformat);
304 		}
305 
306 		return GL_NONE;
307 	}
308 
SelectInternalFormat(GLint format)309 	sw::Format SelectInternalFormat(GLint format)
310 	{
311 		switch(format)
312 		{
313 		case GL_RGBA4:   return sw::FORMAT_A8B8G8R8;
314 		case GL_RGB5_A1: return sw::FORMAT_A8B8G8R8;
315 		case GL_RGBA8:   return sw::FORMAT_A8B8G8R8;
316 		case GL_RGB565:  return sw::FORMAT_R5G6B5;
317 		case GL_RGB8:    return sw::FORMAT_X8B8G8R8;
318 
319 		case GL_DEPTH_COMPONENT32F:    return sw::FORMAT_D32F_LOCKABLE;
320 		case GL_DEPTH_COMPONENT16:     return sw::FORMAT_D32F_LOCKABLE;
321 		case GL_DEPTH_COMPONENT24:     return sw::FORMAT_D32F_LOCKABLE;
322 		case GL_DEPTH_COMPONENT32_OES: return sw::FORMAT_D32F_LOCKABLE;
323 		case GL_DEPTH24_STENCIL8:      return sw::FORMAT_D32FS8_TEXTURE;
324 		case GL_DEPTH32F_STENCIL8:     return sw::FORMAT_D32FS8_TEXTURE;
325 		case GL_STENCIL_INDEX8:        return sw::FORMAT_S8;
326 
327 		case GL_R8:             return sw::FORMAT_R8;
328 		case GL_RG8:            return sw::FORMAT_G8R8;
329 		case GL_R8I:            return sw::FORMAT_R8I;
330 		case GL_RG8I:           return sw::FORMAT_G8R8I;
331 		case GL_RGB8I:          return sw::FORMAT_X8B8G8R8I;
332 		case GL_RGBA8I:         return sw::FORMAT_A8B8G8R8I;
333 		case GL_R8UI:           return sw::FORMAT_R8UI;
334 		case GL_RG8UI:          return sw::FORMAT_G8R8UI;
335 		case GL_RGB8UI:         return sw::FORMAT_X8B8G8R8UI;
336 		case GL_RGBA8UI:        return sw::FORMAT_A8B8G8R8UI;
337 		case GL_R16I:           return sw::FORMAT_R16I;
338 		case GL_RG16I:          return sw::FORMAT_G16R16I;
339 		case GL_RGB16I:         return sw::FORMAT_X16B16G16R16I;
340 		case GL_RGBA16I:        return sw::FORMAT_A16B16G16R16I;
341 		case GL_R16UI:          return sw::FORMAT_R16UI;
342 		case GL_RG16UI:         return sw::FORMAT_G16R16UI;
343 		case GL_RGB16UI:        return sw::FORMAT_X16B16G16R16UI;
344 		case GL_RGBA16UI:       return sw::FORMAT_A16B16G16R16UI;
345 		case GL_R32I:           return sw::FORMAT_R32I;
346 		case GL_RG32I:          return sw::FORMAT_G32R32I;
347 		case GL_RGB32I:         return sw::FORMAT_X32B32G32R32I;
348 		case GL_RGBA32I:        return sw::FORMAT_A32B32G32R32I;
349 		case GL_R32UI:          return sw::FORMAT_R32UI;
350 		case GL_RG32UI:         return sw::FORMAT_G32R32UI;
351 		case GL_RGB32UI:        return sw::FORMAT_X32B32G32R32UI;
352 		case GL_RGBA32UI:       return sw::FORMAT_A32B32G32R32UI;
353 		case GL_R16F:           return sw::FORMAT_R16F;
354 		case GL_RG16F:          return sw::FORMAT_G16R16F;
355 		case GL_R11F_G11F_B10F: return sw::FORMAT_X16B16G16R16F_UNSIGNED;
356 		case GL_RGB16F:         return sw::FORMAT_X16B16G16R16F;
357 		case GL_RGBA16F:        return sw::FORMAT_A16B16G16R16F;
358 		case GL_R32F:           return sw::FORMAT_R32F;
359 		case GL_RG32F:          return sw::FORMAT_G32R32F;
360 		case GL_RGB32F:         return sw::FORMAT_X32B32G32R32F;
361 		case GL_RGBA32F:        return sw::FORMAT_A32B32G32R32F;
362 		case GL_RGB10_A2:       return sw::FORMAT_A2B10G10R10;
363 		case GL_RGB10_A2UI:     return sw::FORMAT_A2B10G10R10UI;
364 		case GL_SRGB8:          return sw::FORMAT_SRGB8_X8;
365 		case GL_SRGB8_ALPHA8:   return sw::FORMAT_SRGB8_A8;
366 
367 		case GL_ETC1_RGB8_OES:              return sw::FORMAT_ETC1;
368 		case GL_COMPRESSED_R11_EAC:         return sw::FORMAT_R11_EAC;
369 		case GL_COMPRESSED_SIGNED_R11_EAC:  return sw::FORMAT_SIGNED_R11_EAC;
370 		case GL_COMPRESSED_RG11_EAC:        return sw::FORMAT_RG11_EAC;
371 		case GL_COMPRESSED_SIGNED_RG11_EAC: return sw::FORMAT_SIGNED_RG11_EAC;
372 		case GL_COMPRESSED_RGB8_ETC2:       return sw::FORMAT_RGB8_ETC2;
373 		case GL_COMPRESSED_SRGB8_ETC2:      return sw::FORMAT_SRGB8_ETC2;
374 		case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  return sw::FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
375 		case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return sw::FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
376 		case GL_COMPRESSED_RGBA8_ETC2_EAC:        return sw::FORMAT_RGBA8_ETC2_EAC;
377 		case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return sw::FORMAT_SRGB8_ALPHA8_ETC2_EAC;
378 		case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:   return sw::FORMAT_RGBA_ASTC_4x4_KHR;
379 		case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:   return sw::FORMAT_RGBA_ASTC_5x4_KHR;
380 		case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:   return sw::FORMAT_RGBA_ASTC_5x5_KHR;
381 		case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:   return sw::FORMAT_RGBA_ASTC_6x5_KHR;
382 		case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:   return sw::FORMAT_RGBA_ASTC_6x6_KHR;
383 		case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:   return sw::FORMAT_RGBA_ASTC_8x5_KHR;
384 		case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:   return sw::FORMAT_RGBA_ASTC_8x6_KHR;
385 		case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:   return sw::FORMAT_RGBA_ASTC_8x8_KHR;
386 		case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:  return sw::FORMAT_RGBA_ASTC_10x5_KHR;
387 		case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:  return sw::FORMAT_RGBA_ASTC_10x6_KHR;
388 		case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:  return sw::FORMAT_RGBA_ASTC_10x8_KHR;
389 		case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return sw::FORMAT_RGBA_ASTC_10x10_KHR;
390 		case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return sw::FORMAT_RGBA_ASTC_12x10_KHR;
391 		case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return sw::FORMAT_RGBA_ASTC_12x12_KHR;
392 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR;
393 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR;
394 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR;
395 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR;
396 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR;
397 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR;
398 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR;
399 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:   return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR;
400 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:  return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR;
401 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:  return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR;
402 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:  return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR;
403 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR;
404 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR;
405 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR;
406 		case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:    return sw::FORMAT_DXT1;
407 		case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:   return sw::FORMAT_DXT1;
408 		case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return sw::FORMAT_DXT3;
409 		case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return sw::FORMAT_DXT5;
410 
411 		case GL_ALPHA32F_EXT:           return sw::FORMAT_A32F;
412 		case GL_LUMINANCE32F_EXT:       return sw::FORMAT_L32F;
413 		case GL_LUMINANCE_ALPHA32F_EXT: return sw::FORMAT_A32L32F;
414 		case GL_RGB9_E5:                return sw::FORMAT_X16B16G16R16F_UNSIGNED;
415 		case GL_ALPHA16F_EXT:           return sw::FORMAT_A16F;
416 		case GL_LUMINANCE16F_EXT:       return sw::FORMAT_L16F;
417 		case GL_LUMINANCE_ALPHA16F_EXT: return sw::FORMAT_A16L16F;
418 		case GL_R8_SNORM:    return sw::FORMAT_R8_SNORM;
419 		case GL_RG8_SNORM:   return sw::FORMAT_G8R8_SNORM;
420 		case GL_RGB8_SNORM:  return sw::FORMAT_X8B8G8R8_SNORM;
421 		case GL_RGBA8_SNORM: return sw::FORMAT_A8B8G8R8_SNORM;
422 		case GL_LUMINANCE8_EXT:        return sw::FORMAT_L8;
423 		case GL_LUMINANCE8_ALPHA8_EXT: return sw::FORMAT_A8L8;
424 		case GL_BGRA8_EXT:  return sw::FORMAT_A8R8G8B8;
425 		case GL_ALPHA8_EXT: return sw::FORMAT_A8;
426 
427 		case SW_YV12_BT601: return sw::FORMAT_YV12_BT601;
428 		case SW_YV12_BT709: return sw::FORMAT_YV12_BT709;
429 		case SW_YV12_JFIF:  return sw::FORMAT_YV12_JFIF;
430 
431 		default:
432 			UNREACHABLE(format);   // Not a sized internal format.
433 			return sw::FORMAT_NULL;
434 		}
435 	}
436 
437 	// Returns the size, in bytes, of a single client-side pixel.
438     // OpenGL ES 3.0.5 table 3.2.
ComputePixelSize(GLenum format,GLenum type)439 	static int ComputePixelSize(GLenum format, GLenum type)
440 	{
441 		switch(format)
442 		{
443 		case GL_RED:
444 		case GL_RED_INTEGER:
445 		case GL_ALPHA:
446 		case GL_LUMINANCE:
447 			switch(type)
448 			{
449 			case GL_BYTE:           return 1;
450 			case GL_UNSIGNED_BYTE:  return 1;
451 			case GL_FLOAT:          return 4;
452 			case GL_HALF_FLOAT:     return 2;
453 			case GL_HALF_FLOAT_OES: return 2;
454 			case GL_SHORT:          return 2;
455 			case GL_UNSIGNED_SHORT: return 2;
456 			case GL_INT:            return 4;
457 			case GL_UNSIGNED_INT:   return 4;
458 			default: UNREACHABLE(type);
459 			}
460 			break;
461 		case GL_RG:
462 		case GL_RG_INTEGER:
463 		case GL_LUMINANCE_ALPHA:
464 			switch(type)
465 			{
466 			case GL_BYTE:           return 2;
467 			case GL_UNSIGNED_BYTE:  return 2;
468 			case GL_FLOAT:          return 8;
469 			case GL_HALF_FLOAT:     return 4;
470 			case GL_HALF_FLOAT_OES: return 4;
471 			case GL_SHORT:          return 4;
472 			case GL_UNSIGNED_SHORT: return 4;
473 			case GL_INT:            return 8;
474 			case GL_UNSIGNED_INT:   return 8;
475 			default: UNREACHABLE(type);
476 			}
477 			break;
478 		case GL_RGB:
479 		case GL_RGB_INTEGER:
480 			switch(type)
481 			{
482 			case GL_BYTE:                         return 3;
483 			case GL_UNSIGNED_BYTE:                return 3;
484 			case GL_UNSIGNED_SHORT_5_6_5:         return 2;
485 			case GL_UNSIGNED_INT_10F_11F_11F_REV: return 4;
486 			case GL_UNSIGNED_INT_5_9_9_9_REV:     return 4;
487 			case GL_FLOAT:                        return 12;
488 			case GL_HALF_FLOAT:                   return 6;
489 			case GL_HALF_FLOAT_OES:               return 6;
490 			case GL_SHORT:                        return 6;
491 			case GL_UNSIGNED_SHORT:               return 6;
492 			case GL_INT:                          return 12;
493 			case GL_UNSIGNED_INT:                 return 12;
494 			default: UNREACHABLE(type);
495 			}
496 			break;
497 		case GL_RGBA:
498 		case GL_RGBA_INTEGER:
499 		case GL_BGRA_EXT:
500 			switch(type)
501 			{
502 			case GL_BYTE:                           return 4;
503 			case GL_UNSIGNED_BYTE:                  return 4;
504 			case GL_UNSIGNED_SHORT_4_4_4_4:         return 2;
505 			case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return 2;
506 			case GL_UNSIGNED_SHORT_5_5_5_1:         return 2;
507 			case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return 2;
508 			case GL_UNSIGNED_INT_2_10_10_10_REV:    return 4;
509 			case GL_FLOAT:                          return 16;
510 			case GL_HALF_FLOAT:                     return 8;
511 			case GL_HALF_FLOAT_OES:                 return 8;
512 			case GL_SHORT:                          return 8;
513 			case GL_UNSIGNED_SHORT:                 return 8;
514 			case GL_INT:                            return 16;
515 			case GL_UNSIGNED_INT:                   return 16;
516 			default: UNREACHABLE(type);
517 			}
518 			break;
519 		case GL_DEPTH_COMPONENT:
520 			switch(type)
521 			{
522 			case GL_FLOAT:          return 4;
523 			case GL_UNSIGNED_SHORT: return 2;
524 			case GL_UNSIGNED_INT:   return 4;
525 			default: UNREACHABLE(type);
526 			}
527 			break;
528 		case GL_DEPTH_STENCIL:
529 			switch(type)
530 			{
531 			case GL_UNSIGNED_INT_24_8:              return 4;
532 			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return 8;
533 			default: UNREACHABLE(type);
534 			}
535 			break;
536 		default:
537 			UNREACHABLE(format);
538 		}
539 
540 		return 0;
541 	}
542 
ComputePitch(GLsizei width,GLenum format,GLenum type,GLint alignment)543 	GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment)
544 	{
545 		ASSERT(alignment > 0 && sw::isPow2(alignment));
546 
547 		GLsizei rawPitch = ComputePixelSize(format, type) * width;
548 		return (rawPitch + alignment - 1) & ~(alignment - 1);
549 	}
550 
ComputePackingOffset(GLenum format,GLenum type,GLsizei width,GLsizei height,const gl::PixelStorageModes & storageModes)551 	size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, const gl::PixelStorageModes &storageModes)
552 	{
553 		GLsizei pitchB = ComputePitch(width, format, type, storageModes.alignment);
554 		return (storageModes.skipImages * height + storageModes.skipRows) * pitchB + storageModes.skipPixels * ComputePixelSize(format, type);
555 	}
556 
ComputeCompressedPitch(GLsizei width,GLenum format)557 	inline GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
558 	{
559 		return ComputeCompressedSize(width, 1, format);
560 	}
561 
GetNumCompressedBlocks(int w,int h,int blockSizeX,int blockSizeY)562 	inline int GetNumCompressedBlocks(int w, int h, int blockSizeX, int blockSizeY)
563 	{
564 		return ((w + blockSizeX - 1) / blockSizeX) * ((h + blockSizeY - 1) / blockSizeY);
565 	}
566 
ComputeCompressedSize(GLsizei width,GLsizei height,GLenum format)567 	GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format)
568 	{
569 		switch(format)
570 		{
571 		case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
572 		case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
573 		case GL_ETC1_RGB8_OES:
574 		case GL_COMPRESSED_R11_EAC:
575 		case GL_COMPRESSED_SIGNED_R11_EAC:
576 		case GL_COMPRESSED_RGB8_ETC2:
577 		case GL_COMPRESSED_SRGB8_ETC2:
578 		case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
579 		case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
580 			return 8 * GetNumCompressedBlocks(width, height, 4, 4);
581 		case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
582 		case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
583 		case GL_COMPRESSED_RG11_EAC:
584 		case GL_COMPRESSED_SIGNED_RG11_EAC:
585 		case GL_COMPRESSED_RGBA8_ETC2_EAC:
586 		case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
587 		case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
588 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
589 			return 16 * GetNumCompressedBlocks(width, height, 4, 4);
590 		case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
591 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
592 			return 16 * GetNumCompressedBlocks(width, height, 5, 4);
593 		case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
594 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
595 			return 16 * GetNumCompressedBlocks(width, height, 5, 5);
596 		case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
597 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
598 			return 16 * GetNumCompressedBlocks(width, height, 6, 5);
599 		case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
600 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
601 			return 16 * GetNumCompressedBlocks(width, height, 6, 6);
602 		case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
603 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
604 			return 16 * GetNumCompressedBlocks(width, height, 8, 5);
605 		case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
606 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
607 			return 16 * GetNumCompressedBlocks(width, height, 8, 6);
608 		case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
609 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
610 			return 16 * GetNumCompressedBlocks(width, height, 8, 8);
611 		case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
612 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
613 			return 16 * GetNumCompressedBlocks(width, height, 10, 5);
614 		case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
615 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
616 			return 16 * GetNumCompressedBlocks(width, height, 10, 6);
617 		case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
618 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
619 			return 16 * GetNumCompressedBlocks(width, height, 10, 8);
620 		case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
621 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
622 			return 16 * GetNumCompressedBlocks(width, height, 10, 10);
623 		case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
624 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
625 			return 16 * GetNumCompressedBlocks(width, height, 12, 10);
626 		case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
627 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
628 			return 16 * GetNumCompressedBlocks(width, height, 12, 12);
629 		default:
630 			UNREACHABLE(format);
631 			return 0;
632 		}
633 	}
634 }
635 
636 namespace egl
637 {
638 	// We assume the data can be indexed with a signed 32-bit offset, including any padding,
639 	// so we must keep the image size reasonable. 1 GiB ought to be enough for anybody.
640 	enum { IMPLEMENTATION_MAX_IMAGE_SIZE_BYTES = 0x40000000 };
641 
642 	enum TransferType
643 	{
644 		Bytes,
645 		RGB8toRGBX8,
646 		RGB16toRGBX16,
647 		RGB32toRGBX32,
648 		RGB32FtoRGBX32F,
649 		RGB16FtoRGBX16F,
650 		RGBA4toRGBA8,
651 		RGBA5_A1toRGBA8,
652 		R11G11B10FtoRGBX16F,
653 		RGB9_E5FtoRGBX16F,
654 		D16toD32F,
655 		D24X8toD32F,
656 		D32toD32F,
657 		D32FtoD32F_CLAMPED,
658 		D32FX32toD32F,
659 		X24S8toS8,
660 		X56S8toS8,
661 		RGBA1010102toRGBA8,
662 		RGB8toRGB565,
663 		R32FtoR16F,
664 		RG32FtoRG16F,
665 		RGB32FtoRGB16F,
666 		RGB32FtoRGB16F_UNSIGNED,
667 		RGBA32FtoRGBA16F
668 	};
669 
670 	template<TransferType transferType>
671 	void TransferRow(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes);
672 
673 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)674 	void TransferRow<Bytes>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
675 	{
676 		memcpy(dest, source, width * bytes);
677 	}
678 
679 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)680 	void TransferRow<RGB8toRGBX8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
681 	{
682 		unsigned char *destB = dest;
683 
684 		for(int x = 0; x < width; x++)
685 		{
686 			destB[4 * x + 0] = source[x * 3 + 0];
687 			destB[4 * x + 1] = source[x * 3 + 1];
688 			destB[4 * x + 2] = source[x * 3 + 2];
689 			destB[4 * x + 3] = 0xFF;
690 		}
691 	}
692 
693 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)694 	void TransferRow<RGB16toRGBX16>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
695 	{
696 		const unsigned short *sourceS = reinterpret_cast<const unsigned short*>(source);
697 		unsigned short *destS = reinterpret_cast<unsigned short*>(dest);
698 
699 		for(int x = 0; x < width; x++)
700 		{
701 			destS[4 * x + 0] = sourceS[x * 3 + 0];
702 			destS[4 * x + 1] = sourceS[x * 3 + 1];
703 			destS[4 * x + 2] = sourceS[x * 3 + 2];
704 			destS[4 * x + 3] = 0xFFFF;
705 		}
706 	}
707 
708 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)709 	void TransferRow<RGB32toRGBX32>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
710 	{
711 		const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
712 		unsigned int *destI = reinterpret_cast<unsigned int*>(dest);
713 
714 		for(int x = 0; x < width; x++)
715 		{
716 			destI[4 * x + 0] = sourceI[x * 3 + 0];
717 			destI[4 * x + 1] = sourceI[x * 3 + 1];
718 			destI[4 * x + 2] = sourceI[x * 3 + 2];
719 			destI[4 * x + 3] = 0xFFFFFFFF;
720 		}
721 	}
722 
723 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)724 	void TransferRow<RGB32FtoRGBX32F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
725 	{
726 		const float *sourceF = reinterpret_cast<const float*>(source);
727 		float *destF = reinterpret_cast<float*>(dest);
728 
729 		for(int x = 0; x < width; x++)
730 		{
731 			destF[4 * x + 0] = sourceF[x * 3 + 0];
732 			destF[4 * x + 1] = sourceF[x * 3 + 1];
733 			destF[4 * x + 2] = sourceF[x * 3 + 2];
734 			destF[4 * x + 3] = 1.0f;
735 		}
736 	}
737 
738 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)739 	void TransferRow<RGB16FtoRGBX16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
740 	{
741 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
742 		unsigned short *destH = reinterpret_cast<unsigned short*>(dest);
743 
744 		for(int x = 0; x < width; x++)
745 		{
746 			destH[4 * x + 0] = sourceH[x * 3 + 0];
747 			destH[4 * x + 1] = sourceH[x * 3 + 1];
748 			destH[4 * x + 2] = sourceH[x * 3 + 2];
749 			destH[4 * x + 3] = 0x3C00;   // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16-bit floating-point representation of 1.0
750 		}
751 	}
752 
753 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)754 	void TransferRow<RGBA4toRGBA8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
755 	{
756 		const unsigned short *source4444 = reinterpret_cast<const unsigned short*>(source);
757 		unsigned char *dest4444 = dest;
758 
759 		for(int x = 0; x < width; x++)
760 		{
761 			unsigned short rgba = source4444[x];
762 			dest4444[4 * x + 0] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12);
763 			dest4444[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8);
764 			dest4444[4 * x + 2] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4);
765 			dest4444[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0);
766 		}
767 	}
768 
769 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)770 	void TransferRow<RGBA5_A1toRGBA8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
771 	{
772 		const unsigned short *source5551 = reinterpret_cast<const unsigned short*>(source);
773 		unsigned char *dest8888 = dest;
774 
775 		for(int x = 0; x < width; x++)
776 		{
777 			unsigned short rgba = source5551[x];
778 			dest8888[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
779 			dest8888[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8);
780 			dest8888[4 * x + 2] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3);
781 			dest8888[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0;
782 		}
783 	}
784 
785 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)786 	void TransferRow<RGBA1010102toRGBA8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
787 	{
788 		const unsigned int *source1010102 = reinterpret_cast<const unsigned int*>(source);
789 		unsigned char *dest8888 = dest;
790 
791 		for(int x = 0; x < width; x++)
792 		{
793 			unsigned int rgba = source1010102[x];
794 			dest8888[4 * x + 0] = sw::unorm<8>((rgba & 0x000003FF) * (1.0f / 0x000003FF));
795 			dest8888[4 * x + 1] = sw::unorm<8>((rgba & 0x000FFC00) * (1.0f / 0x000FFC00));
796 			dest8888[4 * x + 2] = sw::unorm<8>((rgba & 0x3FF00000) * (1.0f / 0x3FF00000));
797 			dest8888[4 * x + 3] = sw::unorm<8>((rgba & 0xC0000000) * (1.0f / 0xC0000000));
798 		}
799 	}
800 
801 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)802 	void TransferRow<RGB8toRGB565>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
803 	{
804 		unsigned short *dest565 = reinterpret_cast<unsigned short*>(dest);
805 
806 		for(int x = 0; x < width; x++)
807 		{
808 			float r = source[3 * x + 0] * (1.0f / 0xFF);
809 			float g = source[3 * x + 1] * (1.0f / 0xFF);
810 			float b = source[3 * x + 2] * (1.0f / 0xFF);
811 			dest565[x] = (sw::unorm<5>(r) << 11) | (sw::unorm<6>(g) << 5) | (sw::unorm<5>(b) << 0);
812 		}
813 	}
814 
815 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)816 	void TransferRow<R11G11B10FtoRGBX16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
817 	{
818 		const sw::R11G11B10F *sourceRGB = reinterpret_cast<const sw::R11G11B10F*>(source);
819 		sw::half *destF = reinterpret_cast<sw::half*>(dest);
820 
821 		for(int x = 0; x < width; x++, sourceRGB++, destF += 4)
822 		{
823 			sourceRGB->toRGB16F(destF);
824 			destF[3] = 1.0f;
825 		}
826 	}
827 
828 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)829 	void TransferRow<RGB9_E5FtoRGBX16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
830 	{
831 		const sw::RGB9E5 *sourceRGB = reinterpret_cast<const sw::RGB9E5*>(source);
832 		sw::half *destF = reinterpret_cast<sw::half*>(dest);
833 
834 		for(int x = 0; x < width; x++, sourceRGB++, destF += 4)
835 		{
836 			sourceRGB->toRGB16F(destF);
837 			destF[3] = 1.0f;
838 		}
839 	}
840 
841 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)842 	void TransferRow<R32FtoR16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
843 	{
844 		const float *source32F = reinterpret_cast<const float*>(source);
845 		sw::half *dest16F = reinterpret_cast<sw::half*>(dest);
846 
847 		for(int x = 0; x < width; x++)
848 		{
849 			dest16F[x] = source32F[x];
850 		}
851 	}
852 
853 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)854 	void TransferRow<RG32FtoRG16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
855 	{
856 		const float *source32F = reinterpret_cast<const float*>(source);
857 		sw::half *dest16F = reinterpret_cast<sw::half*>(dest);
858 
859 		for(int x = 0; x < width; x++)
860 		{
861 			dest16F[2 * x + 0] = source32F[2 * x + 0];
862 			dest16F[2 * x + 1] = source32F[2 * x + 1];
863 		}
864 	}
865 
866 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)867 	void TransferRow<RGB32FtoRGB16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
868 	{
869 		const float *source32F = reinterpret_cast<const float*>(source);
870 		sw::half *dest16F = reinterpret_cast<sw::half*>(dest);
871 
872 		for(int x = 0; x < width; x++)
873 		{
874 			dest16F[4 * x + 0] = source32F[3 * x + 0];
875 			dest16F[4 * x + 1] = source32F[3 * x + 1];
876 			dest16F[4 * x + 2] = source32F[3 * x + 2];
877 			dest16F[4 * x + 3] = 1.0f;
878 		}
879 	}
880 
881 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)882 	void TransferRow<RGB32FtoRGB16F_UNSIGNED>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
883 	{
884 		const float *source32F = reinterpret_cast<const float*>(source);
885 		sw::half *dest16F = reinterpret_cast<sw::half*>(dest);
886 
887 		for(int x = 0; x < width; x++)
888 		{
889 			dest16F[4 * x + 0] = std::max(source32F[3 * x + 0], 0.0f);
890 			dest16F[4 * x + 1] = std::max(source32F[3 * x + 1], 0.0f);
891 			dest16F[4 * x + 2] = std::max(source32F[3 * x + 2], 0.0f);
892 			dest16F[4 * x + 3] = 1.0f;
893 		}
894 	}
895 
896 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)897 	void TransferRow<RGBA32FtoRGBA16F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
898 	{
899 		const float *source32F = reinterpret_cast<const float*>(source);
900 		sw::half *dest16F = reinterpret_cast<sw::half*>(dest);
901 
902 		for(int x = 0; x < width; x++)
903 		{
904 			dest16F[4 * x + 0] = source32F[4 * x + 0];
905 			dest16F[4 * x + 1] = source32F[4 * x + 1];
906 			dest16F[4 * x + 2] = source32F[4 * x + 2];
907 			dest16F[4 * x + 3] = source32F[4 * x + 3];
908 		}
909 	}
910 
911 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)912 	void TransferRow<D16toD32F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
913 	{
914 		const unsigned short *sourceD16 = reinterpret_cast<const unsigned short*>(source);
915 		float *destF = reinterpret_cast<float*>(dest);
916 
917 		for(int x = 0; x < width; x++)
918 		{
919 			destF[x] = (float)sourceD16[x] / 0xFFFF;
920 		}
921 	}
922 
923 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)924 	void TransferRow<D24X8toD32F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
925 	{
926 		const unsigned int *sourceD24 = reinterpret_cast<const unsigned int*>(source);
927 		float *destF = reinterpret_cast<float*>(dest);
928 
929 		for(int x = 0; x < width; x++)
930 		{
931 			destF[x] = (float)(sourceD24[x] & 0xFFFFFF00) / 0xFFFFFF00;
932 		}
933 	}
934 
935 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)936 	void TransferRow<D32toD32F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
937 	{
938 		const unsigned int *sourceD32 = reinterpret_cast<const unsigned int*>(source);
939 		float *destF = reinterpret_cast<float*>(dest);
940 
941 		for(int x = 0; x < width; x++)
942 		{
943 			destF[x] = (float)sourceD32[x] / 0xFFFFFFFF;
944 		}
945 	}
946 
947 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)948 	void TransferRow<D32FtoD32F_CLAMPED>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
949 	{
950 		const float *sourceF = reinterpret_cast<const float*>(source);
951 		float *destF = reinterpret_cast<float*>(dest);
952 
953 		for(int x = 0; x < width; x++)
954 		{
955 			destF[x] = sw::clamp(sourceF[x], 0.0f, 1.0f);
956 		}
957 	}
958 
959 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)960 	void TransferRow<D32FX32toD32F>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
961 	{
962 		struct D32FS8 { float depth32f; unsigned int stencil24_8; };
963 		const D32FS8 *sourceD32FS8 = reinterpret_cast<const D32FS8*>(source);
964 		float *destF = reinterpret_cast<float*>(dest);
965 
966 		for(int x = 0; x < width; x++)
967 		{
968 			destF[x] = sw::clamp(sourceD32FS8[x].depth32f, 0.0f, 1.0f);
969 		}
970 	}
971 
972 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)973 	void TransferRow<X24S8toS8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
974 	{
975 		const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
976 		unsigned char *destI = dest;
977 
978 		for(int x = 0; x < width; x++)
979 		{
980 			destI[x] = static_cast<unsigned char>(sourceI[x] & 0x000000FF);   // FIXME: Quad layout
981 		}
982 	}
983 
984 	template<>
TransferRow(unsigned char * dest,const unsigned char * source,GLsizei width,GLsizei bytes)985 	void TransferRow<X56S8toS8>(unsigned char *dest, const unsigned char *source, GLsizei width, GLsizei bytes)
986 	{
987 		struct D32FS8 { float depth32f; unsigned int stencil24_8; };
988 		const D32FS8 *sourceD32FS8 = reinterpret_cast<const D32FS8*>(source);
989 		unsigned char *destI = dest;
990 
991 		for(int x = 0; x < width; x++)
992 		{
993 			destI[x] = static_cast<unsigned char>(sourceD32FS8[x].stencil24_8 & 0x000000FF);   // FIXME: Quad layout
994 		}
995 	}
996 
997 	struct Rectangle
998 	{
999 		GLsizei bytes;
1000 		GLsizei width;
1001 		GLsizei height;
1002 		GLsizei depth;
1003 		int inputPitch;
1004 		int inputHeight;
1005 		int destPitch;
1006 		GLsizei destSlice;
1007 	};
1008 
1009 	template<TransferType transferType>
Transfer(void * buffer,const void * input,const Rectangle & rect)1010 	void Transfer(void *buffer, const void *input, const Rectangle &rect)
1011 	{
1012 		for(int z = 0; z < rect.depth; z++)
1013 		{
1014 			const unsigned char *inputStart = static_cast<const unsigned char*>(input) + (z * rect.inputPitch * rect.inputHeight);
1015 			unsigned char *destStart = static_cast<unsigned char*>(buffer) + (z * rect.destSlice);
1016 			for(int y = 0; y < rect.height; y++)
1017 			{
1018 				const unsigned char *source = inputStart + y * rect.inputPitch;
1019 				unsigned char *dest = destStart + y * rect.destPitch;
1020 
1021 				TransferRow<transferType>(dest, source, rect.width, rect.bytes);
1022 			}
1023 		}
1024 	}
1025 
1026 	class ImageImplementation : public Image
1027 	{
1028 	public:
ImageImplementation(Texture * parentTexture,GLsizei width,GLsizei height,GLint internalformat)1029 		ImageImplementation(Texture *parentTexture, GLsizei width, GLsizei height, GLint internalformat)
1030 			: Image(parentTexture, width, height, internalformat) {}
ImageImplementation(Texture * parentTexture,GLsizei width,GLsizei height,GLsizei depth,int border,GLint internalformat)1031 		ImageImplementation(Texture *parentTexture, GLsizei width, GLsizei height, GLsizei depth, int border, GLint internalformat)
1032 			: Image(parentTexture, width, height, depth, border, internalformat) {}
ImageImplementation(GLsizei width,GLsizei height,GLint internalformat,int pitchP)1033 		ImageImplementation(GLsizei width, GLsizei height, GLint internalformat, int pitchP)
1034 			: Image(width, height, internalformat, pitchP) {}
ImageImplementation(GLsizei width,GLsizei height,GLint internalformat,int multiSampleDepth,bool lockable)1035 		ImageImplementation(GLsizei width, GLsizei height, GLint internalformat, int multiSampleDepth, bool lockable)
1036 			: Image(width, height, internalformat, multiSampleDepth, lockable) {}
1037 
~ImageImplementation()1038 		~ImageImplementation() override
1039 		{
1040 			sync();   // Wait for any threads that use this image to finish.
1041 		}
1042 
lockInternal(int x,int y,int z,sw::Lock lock,sw::Accessor client)1043 		void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client) override
1044 		{
1045 			return Image::lockInternal(x, y, z, lock, client);
1046 		}
1047 
unlockInternal()1048 		void unlockInternal() override
1049 		{
1050 			return Image::unlockInternal();
1051 		}
1052 
release()1053 		void release() override
1054 		{
1055 			return Image::release();
1056 		}
1057 	};
1058 
create(Texture * parentTexture,GLsizei width,GLsizei height,GLint internalformat)1059 	Image *Image::create(Texture *parentTexture, GLsizei width, GLsizei height, GLint internalformat)
1060 	{
1061 		if(size(width, height, 1, 0, 1, internalformat) > IMPLEMENTATION_MAX_IMAGE_SIZE_BYTES)
1062 		{
1063 			return nullptr;
1064 		}
1065 
1066 		return new ImageImplementation(parentTexture, width, height, internalformat);
1067 	}
1068 
create(Texture * parentTexture,GLsizei width,GLsizei height,GLsizei depth,int border,GLint internalformat)1069 	Image *Image::create(Texture *parentTexture, GLsizei width, GLsizei height, GLsizei depth, int border, GLint internalformat)
1070 	{
1071 		if(size(width, height, depth, border, 1, internalformat) > IMPLEMENTATION_MAX_IMAGE_SIZE_BYTES)
1072 		{
1073 			return nullptr;
1074 		}
1075 
1076 		return new ImageImplementation(parentTexture, width, height, depth, border, internalformat);
1077 	}
1078 
create(GLsizei width,GLsizei height,GLint internalformat,int pitchP)1079 	Image *Image::create(GLsizei width, GLsizei height, GLint internalformat, int pitchP)
1080 	{
1081 		if(size(pitchP, height, 1, 0, 1, internalformat) > IMPLEMENTATION_MAX_IMAGE_SIZE_BYTES)
1082 		{
1083 			return nullptr;
1084 		}
1085 
1086 		return new ImageImplementation(width, height, internalformat, pitchP);
1087 	}
1088 
create(GLsizei width,GLsizei height,GLint internalformat,int multiSampleDepth,bool lockable)1089 	Image *Image::create(GLsizei width, GLsizei height, GLint internalformat, int multiSampleDepth, bool lockable)
1090 	{
1091 		if(size(width, height, 1, 0, multiSampleDepth, internalformat) > IMPLEMENTATION_MAX_IMAGE_SIZE_BYTES)
1092 		{
1093 			return nullptr;
1094 		}
1095 
1096 		return new ImageImplementation(width, height, internalformat, multiSampleDepth, lockable);
1097 	}
1098 
size(int width,int height,int depth,int border,int samples,GLint internalformat)1099 	size_t Image::size(int width, int height, int depth, int border, int samples, GLint internalformat)
1100 	{
1101 		return sw::Surface::size(width, height, depth, border, samples, gl::SelectInternalFormat(internalformat));
1102 	}
1103 
getWidth() const1104 	int ClientBuffer::getWidth() const
1105 	{
1106 		return width;
1107 	}
1108 
getHeight() const1109 	int ClientBuffer::getHeight() const
1110 	{
1111 		return height;
1112 	}
1113 
getFormat() const1114 	sw::Format ClientBuffer::getFormat() const
1115 	{
1116 		return format;
1117 	}
1118 
getPlane() const1119 	size_t ClientBuffer::getPlane() const
1120 	{
1121 		return plane;
1122 	}
1123 
pitchP() const1124 	int ClientBuffer::pitchP() const
1125 	{
1126 #if defined(__APPLE__)
1127 		if(buffer)
1128 		{
1129 			IOSurfaceRef ioSurface = reinterpret_cast<IOSurfaceRef>(buffer);
1130 			int pitchB = static_cast<int>(IOSurfaceGetBytesPerRowOfPlane(ioSurface, plane));
1131 			int bytesPerPixel = sw::Surface::bytes(format);
1132 			ASSERT((pitchB % bytesPerPixel) == 0);
1133 			return pitchB / bytesPerPixel;
1134 		}
1135 
1136 		return 0;
1137 #else
1138 		return sw::Surface::pitchP(width, 0, format, false);
1139 #endif
1140 	}
1141 
retain()1142 	void ClientBuffer::retain()
1143 	{
1144 #if defined(__APPLE__)
1145 		if(buffer)
1146 		{
1147 			CFRetain(reinterpret_cast<IOSurfaceRef>(buffer));
1148 		}
1149 #endif
1150 	}
1151 
release()1152 	void ClientBuffer::release()
1153 	{
1154 #if defined(__APPLE__)
1155 		if(buffer)
1156 		{
1157 			CFRelease(reinterpret_cast<IOSurfaceRef>(buffer));
1158 			buffer = nullptr;
1159 		}
1160 #endif
1161 	}
1162 
lock(int x,int y,int z)1163 	void* ClientBuffer::lock(int x, int y, int z)
1164 	{
1165 #if defined(__APPLE__)
1166 		if(buffer)
1167 		{
1168 			IOSurfaceRef ioSurface = reinterpret_cast<IOSurfaceRef>(buffer);
1169 			IOSurfaceLock(ioSurface, 0, nullptr);
1170 			void* pixels = IOSurfaceGetBaseAddressOfPlane(ioSurface, plane);
1171 			int bytes = sw::Surface::bytes(format);
1172 			int pitchB = static_cast<int>(IOSurfaceGetBytesPerRowOfPlane(ioSurface, plane));
1173 			int sliceB = static_cast<int>(IOSurfaceGetHeightOfPlane(ioSurface, plane)) * pitchB;
1174 			return (unsigned char*)pixels + x * bytes + y * pitchB + z * sliceB;
1175 		}
1176 
1177 		return nullptr;
1178 #else
1179 		int bytes = sw::Surface::bytes(format);
1180 		int pitchB = sw::Surface::pitchB(width, 0, format, false);
1181 		int sliceB = height * pitchB;
1182 		return (unsigned char*)buffer + x * bytes + y * pitchB + z * sliceB;
1183 #endif
1184 	}
1185 
unlock()1186 	void ClientBuffer::unlock()
1187 	{
1188 #if defined(__APPLE__)
1189 		if(buffer)
1190 		{
1191 			IOSurfaceRef ioSurface = reinterpret_cast<IOSurfaceRef>(buffer);
1192 			IOSurfaceUnlock(ioSurface, 0, nullptr);
1193 		}
1194 #endif
1195 	}
1196 
requiresSync() const1197 	bool ClientBuffer::requiresSync() const
1198 	{
1199 #if defined(__APPLE__)
1200 		return true;
1201 #else
1202 		return false;
1203 #endif
1204 	}
1205 
1206 	class ClientBufferImage : public egl::Image
1207 	{
1208 	public:
ClientBufferImage(const ClientBuffer & clientBuffer)1209 		explicit ClientBufferImage(const ClientBuffer& clientBuffer) :
1210 			egl::Image(clientBuffer.getWidth(),
1211 				clientBuffer.getHeight(),
1212 				getClientBufferInternalFormat(clientBuffer.getFormat()),
1213 				clientBuffer.pitchP()),
1214 			clientBuffer(clientBuffer)
1215 		{
1216 			shared = false;
1217 			this->clientBuffer.retain();
1218 		}
1219 
1220 	private:
1221 		ClientBuffer clientBuffer;
1222 
~ClientBufferImage()1223 		~ClientBufferImage() override
1224 		{
1225 			sync();   // Wait for any threads that use this image to finish.
1226 
1227 			clientBuffer.release();
1228 		}
1229 
getClientBufferInternalFormat(sw::Format format)1230 		static GLint getClientBufferInternalFormat(sw::Format format)
1231 		{
1232 			switch(format)
1233 			{
1234 			case sw::FORMAT_R8:            return GL_R8;
1235 			case sw::FORMAT_G8R8:          return GL_RG8;
1236 			case sw::FORMAT_A8R8G8B8:      return GL_BGRA8_EXT;
1237 			case sw::FORMAT_R16UI:         return GL_R16UI;
1238 			case sw::FORMAT_A16B16G16R16F: return GL_RGBA16F;
1239 			default:                       return GL_NONE;
1240 			}
1241 		}
1242 
lockInternal(int x,int y,int z,sw::Lock lock,sw::Accessor client)1243 		void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client) override
1244 		{
1245 			LOGLOCK("image=%p op=%s.swsurface lock=%d", this, __FUNCTION__, lock);
1246 
1247 			// Always do this for reference counting.
1248 			void *data = sw::Surface::lockInternal(x, y, z, lock, client);
1249 
1250 			if(x != 0 || y != 0 || z != 0)
1251 			{
1252 				LOGLOCK("badness: %s called with unsupported parms: image=%p x=%d y=%d z=%d", __FUNCTION__, this, x, y, z);
1253 			}
1254 
1255 			LOGLOCK("image=%p op=%s.ani lock=%d", this, __FUNCTION__, lock);
1256 
1257 			// Lock the ClientBuffer and use its address.
1258 			data = clientBuffer.lock(x, y, z);
1259 
1260 			if(lock == sw::LOCK_UNLOCKED)
1261 			{
1262 				// We're never going to get a corresponding unlock, so unlock
1263 				// immediately. This keeps the reference counts sane.
1264 				clientBuffer.unlock();
1265 			}
1266 
1267 			return data;
1268 		}
1269 
unlockInternal()1270 		void unlockInternal() override
1271 		{
1272 			LOGLOCK("image=%p op=%s.ani", this, __FUNCTION__);
1273 			clientBuffer.unlock();
1274 
1275 			LOGLOCK("image=%p op=%s.swsurface", this, __FUNCTION__);
1276 			sw::Surface::unlockInternal();
1277 		}
1278 
lock(int x,int y,int z,sw::Lock lock)1279 		void *lock(int x, int y, int z, sw::Lock lock) override
1280 		{
1281 			LOGLOCK("image=%p op=%s lock=%d", this, __FUNCTION__, lock);
1282 			(void)sw::Surface::lockExternal(x, y, z, lock, sw::PUBLIC);
1283 
1284 			return clientBuffer.lock(x, y, z);
1285 		}
1286 
unlock()1287 		void unlock() override
1288 		{
1289 			LOGLOCK("image=%p op=%s.ani", this, __FUNCTION__);
1290 			clientBuffer.unlock();
1291 
1292 			LOGLOCK("image=%p op=%s.swsurface", this, __FUNCTION__);
1293 			sw::Surface::unlockExternal();
1294 		}
1295 
requiresSync() const1296 		bool requiresSync() const override
1297 		{
1298 			return clientBuffer.requiresSync();
1299 		}
1300 
release()1301 		void release() override
1302 		{
1303 			Image::release();
1304 		}
1305 	};
1306 
create(const egl::ClientBuffer & clientBuffer)1307 	Image *Image::create(const egl::ClientBuffer& clientBuffer)
1308 	{
1309 		return new ClientBufferImage(clientBuffer);
1310 	}
1311 
~Image()1312 	Image::~Image()
1313 	{
1314 		// sync() must be called in the destructor of the most derived class to ensure their vtable isn't destroyed
1315 		// before all threads are done using this image. Image itself is abstract so it can't be the most derived.
1316 		ASSERT(isUnlocked());
1317 
1318 		if(parentTexture)
1319 		{
1320 			parentTexture->release();
1321 		}
1322 
1323 		ASSERT(!shared);
1324 	}
1325 
lockInternal(int x,int y,int z,sw::Lock lock,sw::Accessor client)1326 	void *Image::lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client)
1327 	{
1328 		return Surface::lockInternal(x, y, z, lock, client);
1329 	}
1330 
unlockInternal()1331 	void Image::unlockInternal()
1332 	{
1333 		Surface::unlockInternal();
1334 	}
1335 
release()1336 	void Image::release()
1337 	{
1338 		int refs = dereference();
1339 
1340 		if(refs > 0)
1341 		{
1342 			if(parentTexture)
1343 			{
1344 				parentTexture->sweep();
1345 			}
1346 		}
1347 		else
1348 		{
1349 			delete this;
1350 		}
1351 	}
1352 
unbind(const egl::Texture * parent)1353 	void Image::unbind(const egl::Texture *parent)
1354 	{
1355 		if(parentTexture == parent)
1356 		{
1357 			parentTexture = nullptr;
1358 		}
1359 
1360 		release();
1361 	}
1362 
isChildOf(const egl::Texture * parent) const1363 	bool Image::isChildOf(const egl::Texture *parent) const
1364 	{
1365 		return parentTexture == parent;
1366 	}
1367 
loadImageData(GLsizei width,GLsizei height,GLsizei depth,int inputPitch,int inputHeight,GLenum format,GLenum type,const void * input,void * buffer)1368 	void Image::loadImageData(GLsizei width, GLsizei height, GLsizei depth, int inputPitch, int inputHeight, GLenum format, GLenum type, const void *input, void *buffer)
1369 	{
1370 		Rectangle rect;
1371 		rect.bytes = gl::ComputePixelSize(format, type);
1372 		rect.width = width;
1373 		rect.height = height;
1374 		rect.depth = depth;
1375 		rect.inputPitch = inputPitch;
1376 		rect.inputHeight = inputHeight;
1377 		rect.destPitch = getPitch();
1378 		rect.destSlice = getSlice();
1379 
1380 		// [OpenGL ES 3.0.5] table 3.2 and 3.3.
1381 		switch(format)
1382 		{
1383 		case GL_RGBA:
1384 			switch(type)
1385 			{
1386 			case GL_UNSIGNED_BYTE:
1387 				switch(internalformat)
1388 				{
1389 				case GL_RGBA8:
1390 				case GL_SRGB8_ALPHA8:
1391 					return Transfer<Bytes>(buffer, input, rect);
1392 				case GL_RGB5_A1:
1393 				case GL_RGBA4:
1394 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_A8B8G8R8);
1395 					return Transfer<Bytes>(buffer, input, rect);
1396 				default:
1397 					UNREACHABLE(internalformat);
1398 				}
1399 			case GL_BYTE:
1400 				ASSERT_OR_RETURN(internalformat == GL_RGBA8_SNORM && getExternalFormat() == sw::FORMAT_A8B8G8R8_SNORM);
1401 				return Transfer<Bytes>(buffer, input, rect);
1402 			case GL_UNSIGNED_SHORT_4_4_4_4:
1403 				ASSERT_OR_RETURN(internalformat == GL_RGBA4 && getExternalFormat() == sw::FORMAT_A8B8G8R8);
1404 				return Transfer<RGBA4toRGBA8>(buffer, input, rect);
1405 			case GL_UNSIGNED_SHORT_5_5_5_1:
1406 				ASSERT_OR_RETURN(internalformat == GL_RGB5_A1 && getExternalFormat() == sw::FORMAT_A8B8G8R8);
1407 				return Transfer<RGBA5_A1toRGBA8>(buffer, input, rect);
1408 			case GL_UNSIGNED_INT_2_10_10_10_REV:
1409 				switch(internalformat)
1410 				{
1411 				case GL_RGB10_A2:
1412 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_A2B10G10R10);
1413 					return Transfer<Bytes>(buffer, input, rect);
1414 				case GL_RGB5_A1:
1415 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_A8B8G8R8);
1416 					return Transfer<RGBA1010102toRGBA8>(buffer, input, rect);
1417 				default:
1418 					UNREACHABLE(internalformat);
1419 				}
1420 			case GL_HALF_FLOAT:
1421 			case GL_HALF_FLOAT_OES:
1422 				ASSERT_OR_RETURN(internalformat == GL_RGBA16F && getExternalFormat() == sw::FORMAT_A16B16G16R16F);
1423 				return Transfer<Bytes>(buffer, input, rect);
1424 			case GL_FLOAT:
1425 				switch(internalformat)
1426 				{
1427 				case GL_RGBA32F: return Transfer<Bytes>(buffer, input, rect);
1428 				case GL_RGBA16F: return Transfer<RGBA32FtoRGBA16F>(buffer, input, rect);
1429 				default: UNREACHABLE(internalformat);
1430 				}
1431 			default:
1432 				UNREACHABLE(type);
1433 			}
1434 		case GL_RGBA_INTEGER:
1435 			switch(type)
1436 			{
1437 			case GL_UNSIGNED_BYTE:
1438 				ASSERT_OR_RETURN(internalformat == GL_RGBA8UI && getExternalFormat() == sw::FORMAT_A8B8G8R8UI);
1439 				return Transfer<Bytes>(buffer, input, rect);
1440 			case GL_BYTE:
1441 				ASSERT_OR_RETURN(internalformat == GL_RGBA8I && getExternalFormat() == sw::FORMAT_A8B8G8R8I);
1442 				return Transfer<Bytes>(buffer, input, rect);
1443 			case GL_UNSIGNED_SHORT:
1444 				ASSERT_OR_RETURN(internalformat == GL_RGBA16UI && getExternalFormat() == sw::FORMAT_A16B16G16R16UI);
1445 				return Transfer<Bytes>(buffer, input, rect);
1446 			case GL_SHORT:
1447 				ASSERT_OR_RETURN(internalformat == GL_RGBA16I && getExternalFormat() == sw::FORMAT_A16B16G16R16I);
1448 				return Transfer<Bytes>(buffer, input, rect);
1449 			case GL_UNSIGNED_INT:
1450 				ASSERT_OR_RETURN(internalformat == GL_RGBA32UI && getExternalFormat() == sw::FORMAT_A32B32G32R32UI);
1451 				return Transfer<Bytes>(buffer, input, rect);
1452 			case GL_INT:
1453 				ASSERT_OR_RETURN(internalformat == GL_RGBA32I && getExternalFormat() == sw::FORMAT_A32B32G32R32I);
1454 				return Transfer<Bytes>(buffer, input, rect);
1455 			case GL_UNSIGNED_INT_2_10_10_10_REV:
1456 				ASSERT_OR_RETURN(internalformat == GL_RGB10_A2UI && getExternalFormat() == sw::FORMAT_A2B10G10R10UI);
1457 				return Transfer<Bytes>(buffer, input, rect);
1458 			default:
1459 				UNREACHABLE(type);
1460 			}
1461 		case GL_BGRA_EXT:
1462 			switch(type)
1463 			{
1464 			case GL_UNSIGNED_BYTE:
1465 				ASSERT_OR_RETURN(internalformat == GL_BGRA8_EXT && getExternalFormat() == sw::FORMAT_A8R8G8B8);
1466 				return Transfer<Bytes>(buffer, input, rect);
1467 			case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:   // Only valid for glReadPixels calls.
1468 			case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:   // Only valid for glReadPixels calls.
1469 			default:
1470 				UNREACHABLE(type);
1471 			}
1472 		case GL_RGB:
1473 			switch(type)
1474 			{
1475 			case GL_UNSIGNED_BYTE:
1476 				switch(internalformat)
1477 				{
1478 				case GL_RGB8:   return Transfer<RGB8toRGBX8>(buffer, input, rect);
1479 				case GL_SRGB8:  return Transfer<RGB8toRGBX8>(buffer, input, rect);
1480 				case GL_RGB565: return Transfer<RGB8toRGB565>(buffer, input, rect);
1481 				default: UNREACHABLE(internalformat);
1482 				}
1483 			case GL_BYTE:
1484 				ASSERT_OR_RETURN(internalformat == GL_RGB8_SNORM && getExternalFormat() == sw::FORMAT_X8B8G8R8_SNORM);
1485 				return Transfer<RGB8toRGBX8>(buffer, input, rect);
1486 			case GL_UNSIGNED_SHORT_5_6_5:
1487 				ASSERT_OR_RETURN(internalformat == GL_RGB565 && getExternalFormat() == sw::FORMAT_R5G6B5);
1488 				return Transfer<Bytes>(buffer, input, rect);
1489 			case GL_UNSIGNED_INT_10F_11F_11F_REV:
1490 				ASSERT_OR_RETURN(internalformat == GL_R11F_G11F_B10F && getExternalFormat() == sw::FORMAT_X16B16G16R16F_UNSIGNED);
1491 				return Transfer<R11G11B10FtoRGBX16F>(buffer, input, rect);
1492 			case GL_UNSIGNED_INT_5_9_9_9_REV:
1493 				ASSERT_OR_RETURN(internalformat == GL_RGB9_E5 && getExternalFormat() == sw::FORMAT_X16B16G16R16F_UNSIGNED);
1494 				return Transfer<RGB9_E5FtoRGBX16F>(buffer, input, rect);
1495 			case GL_HALF_FLOAT:
1496 			case GL_HALF_FLOAT_OES:
1497 				switch(internalformat)
1498 				{
1499 				case GL_RGB16F:
1500 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_X16B16G16R16F);
1501 					return Transfer<RGB16FtoRGBX16F>(buffer, input, rect);
1502 				case GL_R11F_G11F_B10F:
1503 				case GL_RGB9_E5:
1504 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_X16B16G16R16F_UNSIGNED);
1505 					return Transfer<RGB16FtoRGBX16F>(buffer, input, rect);
1506 				default:
1507 					UNREACHABLE(internalformat);
1508 				}
1509 			case GL_FLOAT:
1510 				switch(internalformat)
1511 				{
1512 				case GL_RGB32F:
1513 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_X32B32G32R32F);
1514 					return Transfer<RGB32FtoRGBX32F>(buffer, input, rect);
1515 				case GL_RGB16F:
1516 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_X16B16G16R16F);
1517 					return Transfer<RGB32FtoRGB16F>(buffer, input, rect);
1518 				case GL_R11F_G11F_B10F:
1519 				case GL_RGB9_E5:
1520 					ASSERT_OR_RETURN(getExternalFormat() == sw::FORMAT_X16B16G16R16F_UNSIGNED);
1521 					return Transfer<RGB32FtoRGB16F_UNSIGNED>(buffer, input, rect);
1522 				default:
1523 					UNREACHABLE(internalformat);
1524 				}
1525 			default:
1526 				UNREACHABLE(type);
1527 			}
1528 		case GL_RGB_INTEGER:
1529 			switch(type)
1530 			{
1531 			case GL_UNSIGNED_BYTE:
1532 				ASSERT_OR_RETURN(internalformat == GL_RGB8UI && getExternalFormat() == sw::FORMAT_X8B8G8R8UI);
1533 				return Transfer<RGB8toRGBX8>(buffer, input, rect);
1534 			case GL_BYTE:
1535 				ASSERT_OR_RETURN(internalformat == GL_RGB8I && getExternalFormat() == sw::FORMAT_X8B8G8R8I);
1536 				return Transfer<RGB8toRGBX8>(buffer, input, rect);
1537 			case GL_UNSIGNED_SHORT:
1538 				ASSERT_OR_RETURN(internalformat == GL_RGB16UI && getExternalFormat() == sw::FORMAT_X16B16G16R16UI);
1539 				return Transfer<RGB16toRGBX16>(buffer, input, rect);
1540 			case GL_SHORT:
1541 				ASSERT_OR_RETURN(internalformat == GL_RGB16I && getExternalFormat() == sw::FORMAT_X16B16G16R16I);
1542 				return Transfer<RGB16toRGBX16>(buffer, input, rect);
1543 			case GL_UNSIGNED_INT:
1544 				ASSERT_OR_RETURN(internalformat == GL_RGB32UI && getExternalFormat() == sw::FORMAT_X32B32G32R32UI);
1545 				return Transfer<RGB32toRGBX32>(buffer, input, rect);
1546 			case GL_INT:
1547 				ASSERT_OR_RETURN(internalformat == GL_RGB32I && getExternalFormat() == sw::FORMAT_X32B32G32R32I);
1548 				return Transfer<RGB32toRGBX32>(buffer, input, rect);
1549 			default:
1550 				UNREACHABLE(type);
1551 			}
1552 		case GL_RG:
1553 			switch(type)
1554 			{
1555 			case GL_UNSIGNED_BYTE:
1556 			case GL_BYTE:
1557 			case GL_HALF_FLOAT:
1558 			case GL_HALF_FLOAT_OES:
1559 				return Transfer<Bytes>(buffer, input, rect);
1560 			case GL_FLOAT:
1561 				switch(internalformat)
1562 				{
1563 				case GL_RG32F: return Transfer<Bytes>(buffer, input, rect);
1564 				case GL_RG16F: return Transfer<RG32FtoRG16F>(buffer, input, rect);
1565 				default: UNREACHABLE(internalformat);
1566 				}
1567 			default:
1568 				UNREACHABLE(type);
1569 			}
1570 		case GL_RG_INTEGER:
1571 			switch(type)
1572 			{
1573 			case GL_UNSIGNED_BYTE:
1574 				ASSERT_OR_RETURN(internalformat == GL_RG8UI && getExternalFormat() == sw::FORMAT_G8R8UI);
1575 				return Transfer<Bytes>(buffer, input, rect);
1576 			case GL_BYTE:
1577 				ASSERT_OR_RETURN(internalformat == GL_RG8I && getExternalFormat() == sw::FORMAT_G8R8I);
1578 				return Transfer<Bytes>(buffer, input, rect);
1579 			case GL_UNSIGNED_SHORT:
1580 				ASSERT_OR_RETURN(internalformat == GL_RG16UI && getExternalFormat() == sw::FORMAT_G16R16UI);
1581 				return Transfer<Bytes>(buffer, input, rect);
1582 			case GL_SHORT:
1583 				ASSERT_OR_RETURN(internalformat == GL_RG16I && getExternalFormat() == sw::FORMAT_G16R16I);
1584 				return Transfer<Bytes>(buffer, input, rect);
1585 			case GL_UNSIGNED_INT:
1586 				ASSERT_OR_RETURN(internalformat == GL_RG32UI && getExternalFormat() == sw::FORMAT_G32R32UI);
1587 				return Transfer<Bytes>(buffer, input, rect);
1588 			case GL_INT:
1589 				ASSERT_OR_RETURN(internalformat == GL_RG32I && getExternalFormat() == sw::FORMAT_G32R32I);
1590 				return Transfer<Bytes>(buffer, input, rect);
1591 			default:
1592 				UNREACHABLE(type);
1593 			}
1594 		case GL_RED:
1595 			switch(type)
1596 			{
1597 			case GL_UNSIGNED_BYTE:
1598 			case GL_BYTE:
1599 			case GL_HALF_FLOAT:
1600 			case GL_HALF_FLOAT_OES:
1601 				return Transfer<Bytes>(buffer, input, rect);
1602 			case GL_FLOAT:
1603 				switch(internalformat)
1604 				{
1605 				case GL_R32F: return Transfer<Bytes>(buffer, input, rect);
1606 				case GL_R16F: return Transfer<R32FtoR16F>(buffer, input, rect);
1607 				default: UNREACHABLE(internalformat);
1608 				}
1609 			default:
1610 				UNREACHABLE(type);
1611 			}
1612 		case GL_RED_INTEGER:
1613 			switch(type)
1614 			{
1615 			case GL_UNSIGNED_BYTE:
1616 				ASSERT_OR_RETURN(internalformat == GL_R8UI && getExternalFormat() == sw::FORMAT_R8UI);
1617 				return Transfer<Bytes>(buffer, input, rect);
1618 			case GL_BYTE:
1619 				ASSERT_OR_RETURN(internalformat == GL_R8I && getExternalFormat() == sw::FORMAT_R8I);
1620 				return Transfer<Bytes>(buffer, input, rect);
1621 			case GL_UNSIGNED_SHORT:
1622 				ASSERT_OR_RETURN(internalformat == GL_R16UI && getExternalFormat() == sw::FORMAT_R16UI);
1623 				return Transfer<Bytes>(buffer, input, rect);
1624 			case GL_SHORT:
1625 				ASSERT_OR_RETURN(internalformat == GL_R16I && getExternalFormat() == sw::FORMAT_R16I);
1626 				return Transfer<Bytes>(buffer, input, rect);
1627 			case GL_UNSIGNED_INT:
1628 				ASSERT_OR_RETURN(internalformat == GL_R32UI && getExternalFormat() == sw::FORMAT_R32UI);
1629 				return Transfer<Bytes>(buffer, input, rect);
1630 			case GL_INT:
1631 				ASSERT_OR_RETURN(internalformat == GL_R32I && getExternalFormat() == sw::FORMAT_R32I);
1632 				return Transfer<Bytes>(buffer, input, rect);
1633 			default:
1634 				UNREACHABLE(type);
1635 			}
1636 		case GL_DEPTH_COMPONENT:
1637 			switch(type)
1638 			{
1639 			case GL_UNSIGNED_SHORT: return Transfer<D16toD32F>(buffer, input, rect);
1640 			case GL_UNSIGNED_INT:   return Transfer<D32toD32F>(buffer, input, rect);
1641 			case GL_FLOAT:          return Transfer<D32FtoD32F_CLAMPED>(buffer, input, rect);
1642 			case GL_DEPTH_COMPONENT24:       // Only valid for glRenderbufferStorage calls.
1643 			case GL_DEPTH_COMPONENT32_OES:   // Only valid for glRenderbufferStorage calls.
1644 			default: UNREACHABLE(type);
1645 			}
1646 		case GL_DEPTH_STENCIL:
1647 			switch(type)
1648 			{
1649 			case GL_UNSIGNED_INT_24_8:              return Transfer<D24X8toD32F>(buffer, input, rect);
1650 			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return Transfer<D32FX32toD32F>(buffer, input, rect);
1651 			default: UNREACHABLE(type);
1652 			}
1653 		case GL_LUMINANCE_ALPHA:
1654 			switch(type)
1655 			{
1656 			case GL_UNSIGNED_BYTE:
1657 				return Transfer<Bytes>(buffer, input, rect);
1658 			case GL_FLOAT:
1659 				switch(internalformat)
1660 				{
1661 				case GL_LUMINANCE_ALPHA32F_EXT: return Transfer<Bytes>(buffer, input, rect);
1662 				case GL_LUMINANCE_ALPHA16F_EXT: return Transfer<RG32FtoRG16F>(buffer, input, rect);
1663 				default: UNREACHABLE(internalformat);
1664 				}
1665 			case GL_HALF_FLOAT:
1666 			case GL_HALF_FLOAT_OES:
1667 				ASSERT_OR_RETURN(internalformat == GL_LUMINANCE_ALPHA16F_EXT);
1668 				return Transfer<Bytes>(buffer, input, rect);
1669 			default:
1670 				UNREACHABLE(type);
1671 			}
1672 		case GL_LUMINANCE:
1673 		case GL_ALPHA:
1674 			switch(type)
1675 			{
1676 			case GL_UNSIGNED_BYTE:
1677 				return Transfer<Bytes>(buffer, input, rect);
1678 			case GL_FLOAT:
1679 				switch(internalformat)
1680 				{
1681 				case GL_LUMINANCE32F_EXT: return Transfer<Bytes>(buffer, input, rect);
1682 				case GL_LUMINANCE16F_EXT: return Transfer<R32FtoR16F>(buffer, input, rect);
1683 				case GL_ALPHA32F_EXT:     return Transfer<Bytes>(buffer, input, rect);
1684 				case GL_ALPHA16F_EXT:     return Transfer<R32FtoR16F>(buffer, input, rect);
1685 				default: UNREACHABLE(internalformat);
1686 				}
1687 			case GL_HALF_FLOAT:
1688 			case GL_HALF_FLOAT_OES:
1689 				ASSERT_OR_RETURN(internalformat == GL_LUMINANCE16F_EXT || internalformat == GL_ALPHA16F_EXT);
1690 				return Transfer<Bytes>(buffer, input, rect);
1691 			default:
1692 				UNREACHABLE(type);
1693 			}
1694 		default:
1695 			UNREACHABLE(format);
1696 		}
1697 	}
1698 
loadStencilData(GLsizei width,GLsizei height,GLsizei depth,int inputPitch,int inputHeight,GLenum format,GLenum type,const void * input,void * buffer)1699 	void Image::loadStencilData(GLsizei width, GLsizei height, GLsizei depth, int inputPitch, int inputHeight, GLenum format, GLenum type, const void *input, void *buffer)
1700 	{
1701 		Rectangle rect;
1702 		rect.bytes = gl::ComputePixelSize(format, type);
1703 		rect.width = width;
1704 		rect.height = height;
1705 		rect.depth = depth;
1706 		rect.inputPitch = inputPitch;
1707 		rect.inputHeight = inputHeight;
1708 		rect.destPitch = getStencilPitchB();
1709 		rect.destSlice = getStencilSliceB();
1710 
1711 		switch(type)
1712 		{
1713 		case GL_UNSIGNED_INT_24_8:              return Transfer<X24S8toS8>(buffer, input, rect);
1714 		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return Transfer<X56S8toS8>(buffer, input, rect);
1715 		default: UNREACHABLE(format);
1716 		}
1717 	}
1718 
loadImageData(GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,const gl::PixelStorageModes & unpackParameters,const void * pixels)1719 	void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelStorageModes &unpackParameters, const void *pixels)
1720 	{
1721 		GLsizei inputWidth = (unpackParameters.rowLength == 0) ? width : unpackParameters.rowLength;
1722 		GLsizei inputPitch = gl::ComputePitch(inputWidth, format, type, unpackParameters.alignment);
1723 		GLsizei inputHeight = (unpackParameters.imageHeight == 0) ? height : unpackParameters.imageHeight;
1724 		char *input = ((char*)pixels) + gl::ComputePackingOffset(format, type, inputWidth, inputHeight, unpackParameters);
1725 
1726 		void *buffer = lock(xoffset, yoffset, zoffset, sw::LOCK_WRITEONLY);
1727 
1728 		if(buffer)
1729 		{
1730 			loadImageData(width, height, depth, inputPitch, inputHeight, format, type, input, buffer);
1731 		}
1732 
1733 		unlock();
1734 
1735 		if(hasStencil())
1736 		{
1737 			unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(xoffset, yoffset, zoffset, sw::PUBLIC));
1738 
1739 			if(stencil)
1740 			{
1741 				loadStencilData(width, height, depth, inputPitch, inputHeight, format, type, input, stencil);
1742 			}
1743 
1744 			unlockStencil();
1745 		}
1746 	}
1747 
loadCompressedData(GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLsizei imageSize,const void * pixels)1748 	void Image::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels)
1749 	{
1750 		int inputPitch = gl::ComputeCompressedPitch(width, internalformat);
1751 		int inputSlice = imageSize / depth;
1752 		int rows = inputSlice / inputPitch;
1753 
1754 		void *buffer = lock(xoffset, yoffset, zoffset, sw::LOCK_WRITEONLY);
1755 
1756 		if(buffer)
1757 		{
1758 			for(int z = 0; z < depth; z++)
1759 			{
1760 				for(int y = 0; y < rows; y++)
1761 				{
1762 					GLbyte *dest = (GLbyte*)buffer + y * getPitch() + z * getSlice();
1763 					GLbyte *source = (GLbyte*)pixels + y * inputPitch + z * inputSlice;
1764 					memcpy(dest, source, inputPitch);
1765 				}
1766 			}
1767 		}
1768 
1769 		unlock();
1770 	}
1771 }
1772