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