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