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