1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Mesa 3-D graphics library 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5bf215546Sopenharmony_ci * Copyright (c) 2008-2009 VMware, Inc. 6bf215546Sopenharmony_ci * Copyright (c) 2012 Intel Corporation 7bf215546Sopenharmony_ci * 8bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 9bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 10bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 11bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 13bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 14bf215546Sopenharmony_ci * 15bf215546Sopenharmony_ci * The above copyright notice and this permission notice shall be included 16bf215546Sopenharmony_ci * in all copies or substantial portions of the Software. 17bf215546Sopenharmony_ci * 18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22bf215546Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23bf215546Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24bf215546Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 25bf215546Sopenharmony_ci */ 26bf215546Sopenharmony_ci 27bf215546Sopenharmony_ci 28bf215546Sopenharmony_ci#include "context.h" 29bf215546Sopenharmony_ci#include "glformats.h" 30bf215546Sopenharmony_ci#include "formats.h" 31bf215546Sopenharmony_ci#include "texcompress.h" 32bf215546Sopenharmony_ci#include "enums.h" 33bf215546Sopenharmony_ci 34bf215546Sopenharmony_cienum { 35bf215546Sopenharmony_ci ZERO = 4, 36bf215546Sopenharmony_ci ONE = 5 37bf215546Sopenharmony_ci}; 38bf215546Sopenharmony_ci 39bf215546Sopenharmony_cienum { 40bf215546Sopenharmony_ci IDX_LUMINANCE = 0, 41bf215546Sopenharmony_ci IDX_ALPHA, 42bf215546Sopenharmony_ci IDX_INTENSITY, 43bf215546Sopenharmony_ci IDX_LUMINANCE_ALPHA, 44bf215546Sopenharmony_ci IDX_RGB, 45bf215546Sopenharmony_ci IDX_RGBA, 46bf215546Sopenharmony_ci IDX_RED, 47bf215546Sopenharmony_ci IDX_GREEN, 48bf215546Sopenharmony_ci IDX_BLUE, 49bf215546Sopenharmony_ci IDX_BGR, 50bf215546Sopenharmony_ci IDX_BGRA, 51bf215546Sopenharmony_ci IDX_ABGR, 52bf215546Sopenharmony_ci IDX_RG, 53bf215546Sopenharmony_ci MAX_IDX 54bf215546Sopenharmony_ci}; 55bf215546Sopenharmony_ci 56bf215546Sopenharmony_ci#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 57bf215546Sopenharmony_ci#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 58bf215546Sopenharmony_ci#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 59bf215546Sopenharmony_ci#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 60bf215546Sopenharmony_ci 61bf215546Sopenharmony_cistatic const struct { 62bf215546Sopenharmony_ci GLubyte format_idx; 63bf215546Sopenharmony_ci GLubyte to_rgba[6]; 64bf215546Sopenharmony_ci GLubyte from_rgba[6]; 65bf215546Sopenharmony_ci} mappings[MAX_IDX] = 66bf215546Sopenharmony_ci{ 67bf215546Sopenharmony_ci { 68bf215546Sopenharmony_ci IDX_LUMINANCE, 69bf215546Sopenharmony_ci MAP4(0,0,0,ONE), 70bf215546Sopenharmony_ci MAP1(0) 71bf215546Sopenharmony_ci }, 72bf215546Sopenharmony_ci 73bf215546Sopenharmony_ci { 74bf215546Sopenharmony_ci IDX_ALPHA, 75bf215546Sopenharmony_ci MAP4(ZERO, ZERO, ZERO, 0), 76bf215546Sopenharmony_ci MAP1(3) 77bf215546Sopenharmony_ci }, 78bf215546Sopenharmony_ci 79bf215546Sopenharmony_ci { 80bf215546Sopenharmony_ci IDX_INTENSITY, 81bf215546Sopenharmony_ci MAP4(0, 0, 0, 0), 82bf215546Sopenharmony_ci MAP1(0), 83bf215546Sopenharmony_ci }, 84bf215546Sopenharmony_ci 85bf215546Sopenharmony_ci { 86bf215546Sopenharmony_ci IDX_LUMINANCE_ALPHA, 87bf215546Sopenharmony_ci MAP4(0,0,0,1), 88bf215546Sopenharmony_ci MAP2(0,3) 89bf215546Sopenharmony_ci }, 90bf215546Sopenharmony_ci 91bf215546Sopenharmony_ci { 92bf215546Sopenharmony_ci IDX_RGB, 93bf215546Sopenharmony_ci MAP4(0,1,2,ONE), 94bf215546Sopenharmony_ci MAP3(0,1,2) 95bf215546Sopenharmony_ci }, 96bf215546Sopenharmony_ci 97bf215546Sopenharmony_ci { 98bf215546Sopenharmony_ci IDX_RGBA, 99bf215546Sopenharmony_ci MAP4(0,1,2,3), 100bf215546Sopenharmony_ci MAP4(0,1,2,3), 101bf215546Sopenharmony_ci }, 102bf215546Sopenharmony_ci 103bf215546Sopenharmony_ci { 104bf215546Sopenharmony_ci IDX_RED, 105bf215546Sopenharmony_ci MAP4(0, ZERO, ZERO, ONE), 106bf215546Sopenharmony_ci MAP1(0), 107bf215546Sopenharmony_ci }, 108bf215546Sopenharmony_ci 109bf215546Sopenharmony_ci { 110bf215546Sopenharmony_ci IDX_GREEN, 111bf215546Sopenharmony_ci MAP4(ZERO, 0, ZERO, ONE), 112bf215546Sopenharmony_ci MAP1(1), 113bf215546Sopenharmony_ci }, 114bf215546Sopenharmony_ci 115bf215546Sopenharmony_ci { 116bf215546Sopenharmony_ci IDX_BLUE, 117bf215546Sopenharmony_ci MAP4(ZERO, ZERO, 0, ONE), 118bf215546Sopenharmony_ci MAP1(2), 119bf215546Sopenharmony_ci }, 120bf215546Sopenharmony_ci 121bf215546Sopenharmony_ci { 122bf215546Sopenharmony_ci IDX_BGR, 123bf215546Sopenharmony_ci MAP4(2,1,0,ONE), 124bf215546Sopenharmony_ci MAP3(2,1,0) 125bf215546Sopenharmony_ci }, 126bf215546Sopenharmony_ci 127bf215546Sopenharmony_ci { 128bf215546Sopenharmony_ci IDX_BGRA, 129bf215546Sopenharmony_ci MAP4(2,1,0,3), 130bf215546Sopenharmony_ci MAP4(2,1,0,3) 131bf215546Sopenharmony_ci }, 132bf215546Sopenharmony_ci 133bf215546Sopenharmony_ci { 134bf215546Sopenharmony_ci IDX_ABGR, 135bf215546Sopenharmony_ci MAP4(3,2,1,0), 136bf215546Sopenharmony_ci MAP4(3,2,1,0) 137bf215546Sopenharmony_ci }, 138bf215546Sopenharmony_ci 139bf215546Sopenharmony_ci { 140bf215546Sopenharmony_ci IDX_RG, 141bf215546Sopenharmony_ci MAP4(0, 1, ZERO, ONE), 142bf215546Sopenharmony_ci MAP2(0, 1) 143bf215546Sopenharmony_ci }, 144bf215546Sopenharmony_ci}; 145bf215546Sopenharmony_ci 146bf215546Sopenharmony_ci/** 147bf215546Sopenharmony_ci * Convert a GL image format enum to an IDX_* value (see above). 148bf215546Sopenharmony_ci */ 149bf215546Sopenharmony_cistatic int 150bf215546Sopenharmony_ciget_map_idx(GLenum value) 151bf215546Sopenharmony_ci{ 152bf215546Sopenharmony_ci switch (value) { 153bf215546Sopenharmony_ci case GL_LUMINANCE: 154bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 155bf215546Sopenharmony_ci return IDX_LUMINANCE; 156bf215546Sopenharmony_ci case GL_ALPHA: 157bf215546Sopenharmony_ci case GL_ALPHA_INTEGER: 158bf215546Sopenharmony_ci return IDX_ALPHA; 159bf215546Sopenharmony_ci case GL_INTENSITY: 160bf215546Sopenharmony_ci return IDX_INTENSITY; 161bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 162bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 163bf215546Sopenharmony_ci return IDX_LUMINANCE_ALPHA; 164bf215546Sopenharmony_ci case GL_RGB: 165bf215546Sopenharmony_ci case GL_RGB_INTEGER: 166bf215546Sopenharmony_ci return IDX_RGB; 167bf215546Sopenharmony_ci case GL_RGBA: 168bf215546Sopenharmony_ci case GL_RGBA_INTEGER: 169bf215546Sopenharmony_ci return IDX_RGBA; 170bf215546Sopenharmony_ci case GL_RED: 171bf215546Sopenharmony_ci case GL_RED_INTEGER: 172bf215546Sopenharmony_ci return IDX_RED; 173bf215546Sopenharmony_ci case GL_GREEN: 174bf215546Sopenharmony_ci return IDX_GREEN; 175bf215546Sopenharmony_ci case GL_BLUE: 176bf215546Sopenharmony_ci return IDX_BLUE; 177bf215546Sopenharmony_ci case GL_BGR: 178bf215546Sopenharmony_ci case GL_BGR_INTEGER: 179bf215546Sopenharmony_ci return IDX_BGR; 180bf215546Sopenharmony_ci case GL_BGRA: 181bf215546Sopenharmony_ci case GL_BGRA_INTEGER: 182bf215546Sopenharmony_ci return IDX_BGRA; 183bf215546Sopenharmony_ci case GL_ABGR_EXT: 184bf215546Sopenharmony_ci return IDX_ABGR; 185bf215546Sopenharmony_ci case GL_RG: 186bf215546Sopenharmony_ci case GL_RG_INTEGER: 187bf215546Sopenharmony_ci return IDX_RG; 188bf215546Sopenharmony_ci default: 189bf215546Sopenharmony_ci _mesa_problem(NULL, "Unexpected inFormat %s", 190bf215546Sopenharmony_ci _mesa_enum_to_string(value)); 191bf215546Sopenharmony_ci return 0; 192bf215546Sopenharmony_ci } 193bf215546Sopenharmony_ci} 194bf215546Sopenharmony_ci 195bf215546Sopenharmony_ci/** 196bf215546Sopenharmony_ci * When promoting texture formats (see below) we need to compute the 197bf215546Sopenharmony_ci * mapping of dest components back to source components. 198bf215546Sopenharmony_ci * This function does that. 199bf215546Sopenharmony_ci * \param inFormat the incoming format of the texture 200bf215546Sopenharmony_ci * \param outFormat the final texture format 201bf215546Sopenharmony_ci * \return map[6] a full 6-component map 202bf215546Sopenharmony_ci */ 203bf215546Sopenharmony_civoid 204bf215546Sopenharmony_ci_mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat, GLubyte *map) 205bf215546Sopenharmony_ci{ 206bf215546Sopenharmony_ci const int inFmt = get_map_idx(inFormat); 207bf215546Sopenharmony_ci const int outFmt = get_map_idx(outFormat); 208bf215546Sopenharmony_ci const GLubyte *in2rgba = mappings[inFmt].to_rgba; 209bf215546Sopenharmony_ci const GLubyte *rgba2out = mappings[outFmt].from_rgba; 210bf215546Sopenharmony_ci int i; 211bf215546Sopenharmony_ci 212bf215546Sopenharmony_ci for (i = 0; i < 4; i++) 213bf215546Sopenharmony_ci map[i] = in2rgba[rgba2out[i]]; 214bf215546Sopenharmony_ci 215bf215546Sopenharmony_ci map[ZERO] = ZERO; 216bf215546Sopenharmony_ci map[ONE] = ONE; 217bf215546Sopenharmony_ci 218bf215546Sopenharmony_ci#if 0 219bf215546Sopenharmony_ci printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 220bf215546Sopenharmony_ci inFormat, _mesa_enum_to_string(inFormat), 221bf215546Sopenharmony_ci outFormat, _mesa_enum_to_string(outFormat), 222bf215546Sopenharmony_ci map[0], 223bf215546Sopenharmony_ci map[1], 224bf215546Sopenharmony_ci map[2], 225bf215546Sopenharmony_ci map[3], 226bf215546Sopenharmony_ci map[4], 227bf215546Sopenharmony_ci map[5]); 228bf215546Sopenharmony_ci#endif 229bf215546Sopenharmony_ci} 230bf215546Sopenharmony_ci 231bf215546Sopenharmony_ci/** 232bf215546Sopenharmony_ci * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 233bf215546Sopenharmony_ci */ 234bf215546Sopenharmony_ciGLboolean 235bf215546Sopenharmony_ci_mesa_type_is_packed(GLenum type) 236bf215546Sopenharmony_ci{ 237bf215546Sopenharmony_ci switch (type) { 238bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 239bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 240bf215546Sopenharmony_ci case MESA_UNSIGNED_BYTE_4_4: 241bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 242bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 243bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 244bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 245bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 246bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 247bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 248bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 249bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 250bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 251bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 252bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 253bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8_EXT: 254bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 255bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 256bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 257bf215546Sopenharmony_ci return GL_TRUE; 258bf215546Sopenharmony_ci } 259bf215546Sopenharmony_ci 260bf215546Sopenharmony_ci return GL_FALSE; 261bf215546Sopenharmony_ci} 262bf215546Sopenharmony_ci 263bf215546Sopenharmony_ci 264bf215546Sopenharmony_ci/** 265bf215546Sopenharmony_ci * Get the size of a GL data type. 266bf215546Sopenharmony_ci * 267bf215546Sopenharmony_ci * \param type GL data type. 268bf215546Sopenharmony_ci * 269bf215546Sopenharmony_ci * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 270bf215546Sopenharmony_ci * if an invalid type enum. 271bf215546Sopenharmony_ci */ 272bf215546Sopenharmony_ciGLint 273bf215546Sopenharmony_ci_mesa_sizeof_type(GLenum type) 274bf215546Sopenharmony_ci{ 275bf215546Sopenharmony_ci switch (type) { 276bf215546Sopenharmony_ci case GL_BITMAP: 277bf215546Sopenharmony_ci return 0; 278bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 279bf215546Sopenharmony_ci return sizeof(GLubyte); 280bf215546Sopenharmony_ci case GL_BYTE: 281bf215546Sopenharmony_ci return sizeof(GLbyte); 282bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 283bf215546Sopenharmony_ci return sizeof(GLushort); 284bf215546Sopenharmony_ci case GL_SHORT: 285bf215546Sopenharmony_ci return sizeof(GLshort); 286bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 287bf215546Sopenharmony_ci return sizeof(GLuint); 288bf215546Sopenharmony_ci case GL_INT: 289bf215546Sopenharmony_ci return sizeof(GLint); 290bf215546Sopenharmony_ci case GL_FLOAT: 291bf215546Sopenharmony_ci return sizeof(GLfloat); 292bf215546Sopenharmony_ci case GL_DOUBLE: 293bf215546Sopenharmony_ci return sizeof(GLdouble); 294bf215546Sopenharmony_ci case GL_HALF_FLOAT_ARB: 295bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 296bf215546Sopenharmony_ci return sizeof(GLhalfARB); 297bf215546Sopenharmony_ci case GL_FIXED: 298bf215546Sopenharmony_ci return sizeof(GLfixed); 299bf215546Sopenharmony_ci default: 300bf215546Sopenharmony_ci return -1; 301bf215546Sopenharmony_ci } 302bf215546Sopenharmony_ci} 303bf215546Sopenharmony_ci 304bf215546Sopenharmony_ci 305bf215546Sopenharmony_ci/** 306bf215546Sopenharmony_ci * Same as _mesa_sizeof_type() but also accepting the packed pixel 307bf215546Sopenharmony_ci * format data types. 308bf215546Sopenharmony_ci */ 309bf215546Sopenharmony_ciGLint 310bf215546Sopenharmony_ci_mesa_sizeof_packed_type(GLenum type) 311bf215546Sopenharmony_ci{ 312bf215546Sopenharmony_ci switch (type) { 313bf215546Sopenharmony_ci case GL_BITMAP: 314bf215546Sopenharmony_ci return 0; 315bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 316bf215546Sopenharmony_ci return sizeof(GLubyte); 317bf215546Sopenharmony_ci case GL_BYTE: 318bf215546Sopenharmony_ci return sizeof(GLbyte); 319bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 320bf215546Sopenharmony_ci return sizeof(GLushort); 321bf215546Sopenharmony_ci case GL_SHORT: 322bf215546Sopenharmony_ci return sizeof(GLshort); 323bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 324bf215546Sopenharmony_ci return sizeof(GLuint); 325bf215546Sopenharmony_ci case GL_INT: 326bf215546Sopenharmony_ci return sizeof(GLint); 327bf215546Sopenharmony_ci case GL_HALF_FLOAT_ARB: 328bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 329bf215546Sopenharmony_ci return sizeof(GLhalfARB); 330bf215546Sopenharmony_ci case GL_FLOAT: 331bf215546Sopenharmony_ci return sizeof(GLfloat); 332bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 333bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 334bf215546Sopenharmony_ci case MESA_UNSIGNED_BYTE_4_4: 335bf215546Sopenharmony_ci return sizeof(GLubyte); 336bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 337bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 338bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 339bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 340bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 341bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 342bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 343bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 344bf215546Sopenharmony_ci return sizeof(GLushort); 345bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 346bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 347bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 348bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 349bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8_EXT: 350bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 351bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 352bf215546Sopenharmony_ci return sizeof(GLuint); 353bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 354bf215546Sopenharmony_ci return 8; 355bf215546Sopenharmony_ci default: 356bf215546Sopenharmony_ci return -1; 357bf215546Sopenharmony_ci } 358bf215546Sopenharmony_ci} 359bf215546Sopenharmony_ci 360bf215546Sopenharmony_ci 361bf215546Sopenharmony_ci/** 362bf215546Sopenharmony_ci * Get the number of components in a pixel format. 363bf215546Sopenharmony_ci * 364bf215546Sopenharmony_ci * \param format pixel format. 365bf215546Sopenharmony_ci * 366bf215546Sopenharmony_ci * \return the number of components in the given format, or -1 if a bad format. 367bf215546Sopenharmony_ci */ 368bf215546Sopenharmony_ciGLint 369bf215546Sopenharmony_ci_mesa_components_in_format(GLenum format) 370bf215546Sopenharmony_ci{ 371bf215546Sopenharmony_ci switch (format) { 372bf215546Sopenharmony_ci case GL_COLOR_INDEX: 373bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 374bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 375bf215546Sopenharmony_ci case GL_RED: 376bf215546Sopenharmony_ci case GL_RED_INTEGER_EXT: 377bf215546Sopenharmony_ci case GL_GREEN: 378bf215546Sopenharmony_ci case GL_GREEN_INTEGER_EXT: 379bf215546Sopenharmony_ci case GL_BLUE: 380bf215546Sopenharmony_ci case GL_BLUE_INTEGER_EXT: 381bf215546Sopenharmony_ci case GL_ALPHA: 382bf215546Sopenharmony_ci case GL_ALPHA_INTEGER_EXT: 383bf215546Sopenharmony_ci case GL_LUMINANCE: 384bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 385bf215546Sopenharmony_ci case GL_INTENSITY: 386bf215546Sopenharmony_ci return 1; 387bf215546Sopenharmony_ci 388bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 389bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 390bf215546Sopenharmony_ci case GL_RG: 391bf215546Sopenharmony_ci case GL_YCBCR_MESA: 392bf215546Sopenharmony_ci case GL_DEPTH_STENCIL_EXT: 393bf215546Sopenharmony_ci case GL_RG_INTEGER: 394bf215546Sopenharmony_ci return 2; 395bf215546Sopenharmony_ci 396bf215546Sopenharmony_ci case GL_RGB: 397bf215546Sopenharmony_ci case GL_BGR: 398bf215546Sopenharmony_ci case GL_RGB_INTEGER_EXT: 399bf215546Sopenharmony_ci case GL_BGR_INTEGER_EXT: 400bf215546Sopenharmony_ci return 3; 401bf215546Sopenharmony_ci 402bf215546Sopenharmony_ci case GL_RGBA: 403bf215546Sopenharmony_ci case GL_BGRA: 404bf215546Sopenharmony_ci case GL_ABGR_EXT: 405bf215546Sopenharmony_ci case GL_RGBA_INTEGER_EXT: 406bf215546Sopenharmony_ci case GL_BGRA_INTEGER_EXT: 407bf215546Sopenharmony_ci return 4; 408bf215546Sopenharmony_ci 409bf215546Sopenharmony_ci default: 410bf215546Sopenharmony_ci return -1; 411bf215546Sopenharmony_ci } 412bf215546Sopenharmony_ci} 413bf215546Sopenharmony_ci 414bf215546Sopenharmony_ci 415bf215546Sopenharmony_ci/** 416bf215546Sopenharmony_ci * Get the bytes per pixel of pixel format type pair. 417bf215546Sopenharmony_ci * 418bf215546Sopenharmony_ci * \param format pixel format. 419bf215546Sopenharmony_ci * \param type pixel type. 420bf215546Sopenharmony_ci * 421bf215546Sopenharmony_ci * \return bytes per pixel, or -1 if a bad format or type was given. 422bf215546Sopenharmony_ci */ 423bf215546Sopenharmony_ciGLint 424bf215546Sopenharmony_ci_mesa_bytes_per_pixel(GLenum format, GLenum type) 425bf215546Sopenharmony_ci{ 426bf215546Sopenharmony_ci GLint comps = _mesa_components_in_format(format); 427bf215546Sopenharmony_ci if (comps < 0) 428bf215546Sopenharmony_ci return -1; 429bf215546Sopenharmony_ci 430bf215546Sopenharmony_ci switch (type) { 431bf215546Sopenharmony_ci case GL_BITMAP: 432bf215546Sopenharmony_ci return 0; /* special case */ 433bf215546Sopenharmony_ci case GL_BYTE: 434bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 435bf215546Sopenharmony_ci return comps * sizeof(GLubyte); 436bf215546Sopenharmony_ci case GL_SHORT: 437bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 438bf215546Sopenharmony_ci return comps * sizeof(GLshort); 439bf215546Sopenharmony_ci case GL_INT: 440bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 441bf215546Sopenharmony_ci return comps * sizeof(GLint); 442bf215546Sopenharmony_ci case GL_FLOAT: 443bf215546Sopenharmony_ci return comps * sizeof(GLfloat); 444bf215546Sopenharmony_ci case GL_HALF_FLOAT_ARB: 445bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 446bf215546Sopenharmony_ci return comps * sizeof(GLhalfARB); 447bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 448bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 449bf215546Sopenharmony_ci if (format == GL_RGB || format == GL_BGR || 450bf215546Sopenharmony_ci format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 451bf215546Sopenharmony_ci return sizeof(GLubyte); 452bf215546Sopenharmony_ci else 453bf215546Sopenharmony_ci return -1; /* error */ 454bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 455bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 456bf215546Sopenharmony_ci if (format == GL_RGB || format == GL_BGR || 457bf215546Sopenharmony_ci format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 458bf215546Sopenharmony_ci return sizeof(GLushort); 459bf215546Sopenharmony_ci else 460bf215546Sopenharmony_ci return -1; /* error */ 461bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 462bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 463bf215546Sopenharmony_ci if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 464bf215546Sopenharmony_ci format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 465bf215546Sopenharmony_ci return sizeof(GLushort); 466bf215546Sopenharmony_ci else 467bf215546Sopenharmony_ci return -1; 468bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 469bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 470bf215546Sopenharmony_ci if (format == GL_RGBA || format == GL_BGRA || 471bf215546Sopenharmony_ci format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 472bf215546Sopenharmony_ci return sizeof(GLushort); 473bf215546Sopenharmony_ci else 474bf215546Sopenharmony_ci return -1; 475bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 476bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 477bf215546Sopenharmony_ci if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 478bf215546Sopenharmony_ci format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT || 479bf215546Sopenharmony_ci format == GL_RGB) 480bf215546Sopenharmony_ci return sizeof(GLuint); 481bf215546Sopenharmony_ci else 482bf215546Sopenharmony_ci return -1; 483bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 484bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 485bf215546Sopenharmony_ci if (format == GL_RGBA || format == GL_BGRA || 486bf215546Sopenharmony_ci format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT || 487bf215546Sopenharmony_ci format == GL_RGB) 488bf215546Sopenharmony_ci return sizeof(GLuint); 489bf215546Sopenharmony_ci else 490bf215546Sopenharmony_ci return -1; 491bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 492bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 493bf215546Sopenharmony_ci if (format == GL_YCBCR_MESA) 494bf215546Sopenharmony_ci return sizeof(GLushort); 495bf215546Sopenharmony_ci else 496bf215546Sopenharmony_ci return -1; 497bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8_EXT: 498bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT || 499bf215546Sopenharmony_ci format == GL_DEPTH_STENCIL_EXT) 500bf215546Sopenharmony_ci return sizeof(GLuint); 501bf215546Sopenharmony_ci else 502bf215546Sopenharmony_ci return -1; 503bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 504bf215546Sopenharmony_ci if (format == GL_RGB) 505bf215546Sopenharmony_ci return sizeof(GLuint); 506bf215546Sopenharmony_ci else 507bf215546Sopenharmony_ci return -1; 508bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 509bf215546Sopenharmony_ci if (format == GL_RGB) 510bf215546Sopenharmony_ci return sizeof(GLuint); 511bf215546Sopenharmony_ci else 512bf215546Sopenharmony_ci return -1; 513bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 514bf215546Sopenharmony_ci if (format == GL_DEPTH_STENCIL) 515bf215546Sopenharmony_ci return 8; 516bf215546Sopenharmony_ci else 517bf215546Sopenharmony_ci return -1; 518bf215546Sopenharmony_ci default: 519bf215546Sopenharmony_ci return -1; 520bf215546Sopenharmony_ci } 521bf215546Sopenharmony_ci} 522bf215546Sopenharmony_ci 523bf215546Sopenharmony_ci 524bf215546Sopenharmony_ci/** 525bf215546Sopenharmony_ci * Get the number of bytes for a vertex attrib with the given number of 526bf215546Sopenharmony_ci * components and type. 527bf215546Sopenharmony_ci * 528bf215546Sopenharmony_ci * \param comps number of components. 529bf215546Sopenharmony_ci * \param type data type. 530bf215546Sopenharmony_ci * 531bf215546Sopenharmony_ci * \return bytes per attribute, or -1 if a bad comps/type combination was given. 532bf215546Sopenharmony_ci */ 533bf215546Sopenharmony_ciGLint 534bf215546Sopenharmony_ci_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type) 535bf215546Sopenharmony_ci{ 536bf215546Sopenharmony_ci switch (type) { 537bf215546Sopenharmony_ci case GL_BYTE: 538bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 539bf215546Sopenharmony_ci return comps * sizeof(GLubyte); 540bf215546Sopenharmony_ci case GL_SHORT: 541bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 542bf215546Sopenharmony_ci return comps * sizeof(GLshort); 543bf215546Sopenharmony_ci case GL_INT: 544bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 545bf215546Sopenharmony_ci return comps * sizeof(GLint); 546bf215546Sopenharmony_ci case GL_FLOAT: 547bf215546Sopenharmony_ci return comps * sizeof(GLfloat); 548bf215546Sopenharmony_ci case GL_HALF_FLOAT_ARB: 549bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 550bf215546Sopenharmony_ci return comps * sizeof(GLhalfARB); 551bf215546Sopenharmony_ci case GL_DOUBLE: 552bf215546Sopenharmony_ci return comps * sizeof(GLdouble); 553bf215546Sopenharmony_ci case GL_FIXED: 554bf215546Sopenharmony_ci return comps * sizeof(GLfixed); 555bf215546Sopenharmony_ci case GL_INT_2_10_10_10_REV: 556bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 557bf215546Sopenharmony_ci if (comps == 4) 558bf215546Sopenharmony_ci return sizeof(GLuint); 559bf215546Sopenharmony_ci else 560bf215546Sopenharmony_ci return -1; 561bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 562bf215546Sopenharmony_ci if (comps == 3) 563bf215546Sopenharmony_ci return sizeof(GLuint); 564bf215546Sopenharmony_ci else 565bf215546Sopenharmony_ci return -1; 566bf215546Sopenharmony_ci case GL_UNSIGNED_INT64_ARB: 567bf215546Sopenharmony_ci return comps * 8; 568bf215546Sopenharmony_ci default: 569bf215546Sopenharmony_ci return -1; 570bf215546Sopenharmony_ci } 571bf215546Sopenharmony_ci} 572bf215546Sopenharmony_ci 573bf215546Sopenharmony_ci/** 574bf215546Sopenharmony_ci * Test if the given format is unsized. 575bf215546Sopenharmony_ci */ 576bf215546Sopenharmony_ciGLboolean 577bf215546Sopenharmony_ci_mesa_is_enum_format_unsized(GLenum format) 578bf215546Sopenharmony_ci{ 579bf215546Sopenharmony_ci switch (format) { 580bf215546Sopenharmony_ci case GL_RGBA: 581bf215546Sopenharmony_ci case GL_BGRA: 582bf215546Sopenharmony_ci case GL_ABGR_EXT: 583bf215546Sopenharmony_ci case GL_RGB: 584bf215546Sopenharmony_ci case GL_BGR: 585bf215546Sopenharmony_ci case GL_RG: 586bf215546Sopenharmony_ci case GL_RED: 587bf215546Sopenharmony_ci case GL_GREEN: 588bf215546Sopenharmony_ci case GL_BLUE: 589bf215546Sopenharmony_ci case GL_ALPHA: 590bf215546Sopenharmony_ci case GL_INTENSITY: 591bf215546Sopenharmony_ci case GL_LUMINANCE: 592bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 593bf215546Sopenharmony_ci 594bf215546Sopenharmony_ci case GL_SRGB: 595bf215546Sopenharmony_ci case GL_SRGB_ALPHA: 596bf215546Sopenharmony_ci case GL_SLUMINANCE: 597bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA: 598bf215546Sopenharmony_ci 599bf215546Sopenharmony_ci case GL_RGBA_SNORM: 600bf215546Sopenharmony_ci case GL_RGB_SNORM: 601bf215546Sopenharmony_ci case GL_RG_SNORM: 602bf215546Sopenharmony_ci case GL_RED_SNORM: 603bf215546Sopenharmony_ci case GL_ALPHA_SNORM: 604bf215546Sopenharmony_ci case GL_INTENSITY_SNORM: 605bf215546Sopenharmony_ci case GL_LUMINANCE_SNORM: 606bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_SNORM: 607bf215546Sopenharmony_ci 608bf215546Sopenharmony_ci case GL_RED_INTEGER: 609bf215546Sopenharmony_ci case GL_GREEN_INTEGER: 610bf215546Sopenharmony_ci case GL_BLUE_INTEGER: 611bf215546Sopenharmony_ci case GL_ALPHA_INTEGER: 612bf215546Sopenharmony_ci case GL_RGB_INTEGER: 613bf215546Sopenharmony_ci case GL_RGBA_INTEGER: 614bf215546Sopenharmony_ci case GL_BGR_INTEGER: 615bf215546Sopenharmony_ci case GL_BGRA_INTEGER: 616bf215546Sopenharmony_ci case GL_RG_INTEGER: 617bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 618bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 619bf215546Sopenharmony_ci 620bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 621bf215546Sopenharmony_ci case GL_DEPTH_STENCIL: 622bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 623bf215546Sopenharmony_ci return GL_TRUE; 624bf215546Sopenharmony_ci default: 625bf215546Sopenharmony_ci return GL_FALSE; 626bf215546Sopenharmony_ci } 627bf215546Sopenharmony_ci} 628bf215546Sopenharmony_ci 629bf215546Sopenharmony_ci/** 630bf215546Sopenharmony_ci * Test if the given format is a UNORM (unsigned-normalized) format. 631bf215546Sopenharmony_ci */ 632bf215546Sopenharmony_ciGLboolean 633bf215546Sopenharmony_ci_mesa_is_enum_format_unorm(GLenum format) 634bf215546Sopenharmony_ci{ 635bf215546Sopenharmony_ci switch(format) { 636bf215546Sopenharmony_ci case GL_RED: 637bf215546Sopenharmony_ci case GL_GREEN: 638bf215546Sopenharmony_ci case GL_BLUE: 639bf215546Sopenharmony_ci case GL_ALPHA: 640bf215546Sopenharmony_ci case GL_ALPHA4: 641bf215546Sopenharmony_ci case GL_ALPHA8: 642bf215546Sopenharmony_ci case GL_ALPHA12: 643bf215546Sopenharmony_ci case GL_ALPHA16: 644bf215546Sopenharmony_ci case 1: 645bf215546Sopenharmony_ci case GL_LUMINANCE: 646bf215546Sopenharmony_ci case GL_SLUMINANCE: 647bf215546Sopenharmony_ci case GL_LUMINANCE4: 648bf215546Sopenharmony_ci case GL_LUMINANCE8: 649bf215546Sopenharmony_ci case GL_LUMINANCE12: 650bf215546Sopenharmony_ci case GL_LUMINANCE16: 651bf215546Sopenharmony_ci case 2: 652bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 653bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA: 654bf215546Sopenharmony_ci case GL_LUMINANCE4_ALPHA4: 655bf215546Sopenharmony_ci case GL_LUMINANCE6_ALPHA2: 656bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8: 657bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA4: 658bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA12: 659bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16: 660bf215546Sopenharmony_ci case GL_INTENSITY: 661bf215546Sopenharmony_ci case GL_INTENSITY4: 662bf215546Sopenharmony_ci case GL_INTENSITY8: 663bf215546Sopenharmony_ci case GL_INTENSITY12: 664bf215546Sopenharmony_ci case GL_INTENSITY16: 665bf215546Sopenharmony_ci case GL_R8: 666bf215546Sopenharmony_ci case GL_R16: 667bf215546Sopenharmony_ci case GL_RG: 668bf215546Sopenharmony_ci case GL_RG8: 669bf215546Sopenharmony_ci case GL_RG16: 670bf215546Sopenharmony_ci case 3: 671bf215546Sopenharmony_ci case GL_RGB: 672bf215546Sopenharmony_ci case GL_BGR: 673bf215546Sopenharmony_ci case GL_SRGB: 674bf215546Sopenharmony_ci case GL_R3_G3_B2: 675bf215546Sopenharmony_ci case GL_RGB4: 676bf215546Sopenharmony_ci case GL_RGB5: 677bf215546Sopenharmony_ci case GL_RGB565: 678bf215546Sopenharmony_ci case GL_RGB8: 679bf215546Sopenharmony_ci case GL_RGB10: 680bf215546Sopenharmony_ci case GL_RGB12: 681bf215546Sopenharmony_ci case GL_RGB16: 682bf215546Sopenharmony_ci case 4: 683bf215546Sopenharmony_ci case GL_ABGR_EXT: 684bf215546Sopenharmony_ci case GL_RGBA: 685bf215546Sopenharmony_ci case GL_BGRA: 686bf215546Sopenharmony_ci case GL_SRGB_ALPHA: 687bf215546Sopenharmony_ci case GL_RGBA2: 688bf215546Sopenharmony_ci case GL_RGBA4: 689bf215546Sopenharmony_ci case GL_RGB5_A1: 690bf215546Sopenharmony_ci case GL_RGBA8: 691bf215546Sopenharmony_ci case GL_RGB10_A2: 692bf215546Sopenharmony_ci case GL_RGBA12: 693bf215546Sopenharmony_ci case GL_RGBA16: 694bf215546Sopenharmony_ci return GL_TRUE; 695bf215546Sopenharmony_ci default: 696bf215546Sopenharmony_ci return GL_FALSE; 697bf215546Sopenharmony_ci } 698bf215546Sopenharmony_ci} 699bf215546Sopenharmony_ci 700bf215546Sopenharmony_ci/** 701bf215546Sopenharmony_ci * Test if the given format is a SNORM (signed-normalized) format. 702bf215546Sopenharmony_ci */ 703bf215546Sopenharmony_ciGLboolean 704bf215546Sopenharmony_ci_mesa_is_enum_format_snorm(GLenum format) 705bf215546Sopenharmony_ci{ 706bf215546Sopenharmony_ci switch (format) { 707bf215546Sopenharmony_ci /* signed, normalized texture formats */ 708bf215546Sopenharmony_ci case GL_RED_SNORM: 709bf215546Sopenharmony_ci case GL_R8_SNORM: 710bf215546Sopenharmony_ci case GL_R16_SNORM: 711bf215546Sopenharmony_ci case GL_RG_SNORM: 712bf215546Sopenharmony_ci case GL_RG8_SNORM: 713bf215546Sopenharmony_ci case GL_RG16_SNORM: 714bf215546Sopenharmony_ci case GL_RGB_SNORM: 715bf215546Sopenharmony_ci case GL_RGB8_SNORM: 716bf215546Sopenharmony_ci case GL_RGB16_SNORM: 717bf215546Sopenharmony_ci case GL_RGBA_SNORM: 718bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 719bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 720bf215546Sopenharmony_ci case GL_ALPHA_SNORM: 721bf215546Sopenharmony_ci case GL_ALPHA8_SNORM: 722bf215546Sopenharmony_ci case GL_ALPHA16_SNORM: 723bf215546Sopenharmony_ci case GL_LUMINANCE_SNORM: 724bf215546Sopenharmony_ci case GL_LUMINANCE8_SNORM: 725bf215546Sopenharmony_ci case GL_LUMINANCE16_SNORM: 726bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_SNORM: 727bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8_SNORM: 728bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16_SNORM: 729bf215546Sopenharmony_ci case GL_INTENSITY_SNORM: 730bf215546Sopenharmony_ci case GL_INTENSITY8_SNORM: 731bf215546Sopenharmony_ci case GL_INTENSITY16_SNORM: 732bf215546Sopenharmony_ci return GL_TRUE; 733bf215546Sopenharmony_ci default: 734bf215546Sopenharmony_ci return GL_FALSE; 735bf215546Sopenharmony_ci } 736bf215546Sopenharmony_ci} 737bf215546Sopenharmony_ci 738bf215546Sopenharmony_ci/** 739bf215546Sopenharmony_ci * Test if the given format is an integer (non-normalized) format. 740bf215546Sopenharmony_ci */ 741bf215546Sopenharmony_ciGLboolean 742bf215546Sopenharmony_ci_mesa_is_enum_format_unsigned_int(GLenum format) 743bf215546Sopenharmony_ci{ 744bf215546Sopenharmony_ci switch (format) { 745bf215546Sopenharmony_ci /* specific integer formats */ 746bf215546Sopenharmony_ci case GL_RGBA32UI_EXT: 747bf215546Sopenharmony_ci case GL_RGB32UI_EXT: 748bf215546Sopenharmony_ci case GL_RG32UI: 749bf215546Sopenharmony_ci case GL_R32UI: 750bf215546Sopenharmony_ci case GL_ALPHA32UI_EXT: 751bf215546Sopenharmony_ci case GL_INTENSITY32UI_EXT: 752bf215546Sopenharmony_ci case GL_LUMINANCE32UI_EXT: 753bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32UI_EXT: 754bf215546Sopenharmony_ci case GL_RGBA16UI_EXT: 755bf215546Sopenharmony_ci case GL_RGB16UI_EXT: 756bf215546Sopenharmony_ci case GL_RG16UI: 757bf215546Sopenharmony_ci case GL_R16UI: 758bf215546Sopenharmony_ci case GL_ALPHA16UI_EXT: 759bf215546Sopenharmony_ci case GL_INTENSITY16UI_EXT: 760bf215546Sopenharmony_ci case GL_LUMINANCE16UI_EXT: 761bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16UI_EXT: 762bf215546Sopenharmony_ci case GL_RGBA8UI_EXT: 763bf215546Sopenharmony_ci case GL_RGB8UI_EXT: 764bf215546Sopenharmony_ci case GL_RG8UI: 765bf215546Sopenharmony_ci case GL_R8UI: 766bf215546Sopenharmony_ci case GL_ALPHA8UI_EXT: 767bf215546Sopenharmony_ci case GL_INTENSITY8UI_EXT: 768bf215546Sopenharmony_ci case GL_LUMINANCE8UI_EXT: 769bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8UI_EXT: 770bf215546Sopenharmony_ci case GL_RGB10_A2UI: 771bf215546Sopenharmony_ci return GL_TRUE; 772bf215546Sopenharmony_ci default: 773bf215546Sopenharmony_ci return GL_FALSE; 774bf215546Sopenharmony_ci } 775bf215546Sopenharmony_ci} 776bf215546Sopenharmony_ci 777bf215546Sopenharmony_ci 778bf215546Sopenharmony_ci/** 779bf215546Sopenharmony_ci * Test if the given format is an integer (non-normalized) format. 780bf215546Sopenharmony_ci */ 781bf215546Sopenharmony_ciGLboolean 782bf215546Sopenharmony_ci_mesa_is_enum_format_signed_int(GLenum format) 783bf215546Sopenharmony_ci{ 784bf215546Sopenharmony_ci switch (format) { 785bf215546Sopenharmony_ci /* generic integer formats */ 786bf215546Sopenharmony_ci case GL_RED_INTEGER_EXT: 787bf215546Sopenharmony_ci case GL_GREEN_INTEGER_EXT: 788bf215546Sopenharmony_ci case GL_BLUE_INTEGER_EXT: 789bf215546Sopenharmony_ci case GL_ALPHA_INTEGER_EXT: 790bf215546Sopenharmony_ci case GL_RGB_INTEGER_EXT: 791bf215546Sopenharmony_ci case GL_RGBA_INTEGER_EXT: 792bf215546Sopenharmony_ci case GL_BGR_INTEGER_EXT: 793bf215546Sopenharmony_ci case GL_BGRA_INTEGER_EXT: 794bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 795bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 796bf215546Sopenharmony_ci case GL_RG_INTEGER: 797bf215546Sopenharmony_ci /* specific integer formats */ 798bf215546Sopenharmony_ci case GL_RGBA32I_EXT: 799bf215546Sopenharmony_ci case GL_RGB32I_EXT: 800bf215546Sopenharmony_ci case GL_RG32I: 801bf215546Sopenharmony_ci case GL_R32I: 802bf215546Sopenharmony_ci case GL_ALPHA32I_EXT: 803bf215546Sopenharmony_ci case GL_INTENSITY32I_EXT: 804bf215546Sopenharmony_ci case GL_LUMINANCE32I_EXT: 805bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32I_EXT: 806bf215546Sopenharmony_ci case GL_RGBA16I_EXT: 807bf215546Sopenharmony_ci case GL_RGB16I_EXT: 808bf215546Sopenharmony_ci case GL_RG16I: 809bf215546Sopenharmony_ci case GL_R16I: 810bf215546Sopenharmony_ci case GL_ALPHA16I_EXT: 811bf215546Sopenharmony_ci case GL_INTENSITY16I_EXT: 812bf215546Sopenharmony_ci case GL_LUMINANCE16I_EXT: 813bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16I_EXT: 814bf215546Sopenharmony_ci case GL_RGBA8I_EXT: 815bf215546Sopenharmony_ci case GL_RGB8I_EXT: 816bf215546Sopenharmony_ci case GL_RG8I: 817bf215546Sopenharmony_ci case GL_R8I: 818bf215546Sopenharmony_ci case GL_ALPHA8I_EXT: 819bf215546Sopenharmony_ci case GL_INTENSITY8I_EXT: 820bf215546Sopenharmony_ci case GL_LUMINANCE8I_EXT: 821bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8I_EXT: 822bf215546Sopenharmony_ci return GL_TRUE; 823bf215546Sopenharmony_ci default: 824bf215546Sopenharmony_ci return GL_FALSE; 825bf215546Sopenharmony_ci } 826bf215546Sopenharmony_ci} 827bf215546Sopenharmony_ci 828bf215546Sopenharmony_ci/** 829bf215546Sopenharmony_ci * Test if the given format is an ASTC 2D format. 830bf215546Sopenharmony_ci */ 831bf215546Sopenharmony_cistatic bool 832bf215546Sopenharmony_ciis_astc_2d_format(GLenum internalFormat) 833bf215546Sopenharmony_ci{ 834bf215546Sopenharmony_ci switch (internalFormat) { 835bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 836bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 837bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 838bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 839bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 840bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 841bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 842bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 843bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 844bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 845bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 846bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 847bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 848bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 849bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 850bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 851bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 852bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 853bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 854bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 855bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 856bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 857bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 858bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 859bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 860bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 861bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 862bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 863bf215546Sopenharmony_ci return true; 864bf215546Sopenharmony_ci default: 865bf215546Sopenharmony_ci return false; 866bf215546Sopenharmony_ci } 867bf215546Sopenharmony_ci} 868bf215546Sopenharmony_ci 869bf215546Sopenharmony_ci/** 870bf215546Sopenharmony_ci * Test if the given format is an ASTC 3D format. 871bf215546Sopenharmony_ci */ 872bf215546Sopenharmony_cistatic bool 873bf215546Sopenharmony_ciis_astc_3d_format(GLenum internalFormat) 874bf215546Sopenharmony_ci{ 875bf215546Sopenharmony_ci switch (internalFormat) { 876bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: 877bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: 878bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: 879bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: 880bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: 881bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: 882bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: 883bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: 884bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: 885bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: 886bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: 887bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: 888bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: 889bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: 890bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: 891bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: 892bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: 893bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: 894bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: 895bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: 896bf215546Sopenharmony_ci return true; 897bf215546Sopenharmony_ci default: 898bf215546Sopenharmony_ci return false; 899bf215546Sopenharmony_ci } 900bf215546Sopenharmony_ci} 901bf215546Sopenharmony_ci 902bf215546Sopenharmony_ci/** 903bf215546Sopenharmony_ci * Test if the given format is an ASTC format. 904bf215546Sopenharmony_ci */ 905bf215546Sopenharmony_ciGLboolean 906bf215546Sopenharmony_ci_mesa_is_astc_format(GLenum internalFormat) 907bf215546Sopenharmony_ci{ 908bf215546Sopenharmony_ci return is_astc_2d_format(internalFormat) || 909bf215546Sopenharmony_ci is_astc_3d_format(internalFormat); 910bf215546Sopenharmony_ci} 911bf215546Sopenharmony_ci 912bf215546Sopenharmony_ci/** 913bf215546Sopenharmony_ci * Test if the given format is an ETC2 format. 914bf215546Sopenharmony_ci */ 915bf215546Sopenharmony_ciGLboolean 916bf215546Sopenharmony_ci_mesa_is_etc2_format(GLenum internalFormat) 917bf215546Sopenharmony_ci{ 918bf215546Sopenharmony_ci switch (internalFormat) { 919bf215546Sopenharmony_ci case GL_COMPRESSED_RGB8_ETC2: 920bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ETC2: 921bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA8_ETC2_EAC: 922bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 923bf215546Sopenharmony_ci case GL_COMPRESSED_R11_EAC: 924bf215546Sopenharmony_ci case GL_COMPRESSED_RG11_EAC: 925bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_R11_EAC: 926bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RG11_EAC: 927bf215546Sopenharmony_ci case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 928bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 929bf215546Sopenharmony_ci return true; 930bf215546Sopenharmony_ci default: 931bf215546Sopenharmony_ci return false; 932bf215546Sopenharmony_ci } 933bf215546Sopenharmony_ci} 934bf215546Sopenharmony_ci 935bf215546Sopenharmony_ci/** 936bf215546Sopenharmony_ci * Test if the given format is an integer (non-normalized) format. 937bf215546Sopenharmony_ci */ 938bf215546Sopenharmony_ciGLboolean 939bf215546Sopenharmony_ci_mesa_is_enum_format_integer(GLenum format) 940bf215546Sopenharmony_ci{ 941bf215546Sopenharmony_ci return _mesa_is_enum_format_unsigned_int(format) || 942bf215546Sopenharmony_ci _mesa_is_enum_format_signed_int(format); 943bf215546Sopenharmony_ci} 944bf215546Sopenharmony_ci 945bf215546Sopenharmony_ci 946bf215546Sopenharmony_ciGLboolean 947bf215546Sopenharmony_ci_mesa_is_type_unsigned(GLenum type) 948bf215546Sopenharmony_ci{ 949bf215546Sopenharmony_ci switch (type) { 950bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 951bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 952bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 953bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 954bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 955bf215546Sopenharmony_ci 956bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 957bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 958bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 959bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 960bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 961bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 962bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 963bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 964bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 965bf215546Sopenharmony_ci 966bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 967bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 968bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 969bf215546Sopenharmony_ci return GL_TRUE; 970bf215546Sopenharmony_ci 971bf215546Sopenharmony_ci default: 972bf215546Sopenharmony_ci return GL_FALSE; 973bf215546Sopenharmony_ci } 974bf215546Sopenharmony_ci} 975bf215546Sopenharmony_ci 976bf215546Sopenharmony_ci 977bf215546Sopenharmony_ci/** 978bf215546Sopenharmony_ci * Test if the given image format is a color/RGBA format (i.e., not color 979bf215546Sopenharmony_ci * index, depth, stencil, etc). 980bf215546Sopenharmony_ci * \param format the image format value (may by an internal texture format) 981bf215546Sopenharmony_ci * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 982bf215546Sopenharmony_ci */ 983bf215546Sopenharmony_ciGLboolean 984bf215546Sopenharmony_ci_mesa_is_color_format(GLenum format) 985bf215546Sopenharmony_ci{ 986bf215546Sopenharmony_ci switch (format) { 987bf215546Sopenharmony_ci case GL_RED: 988bf215546Sopenharmony_ci case GL_GREEN: 989bf215546Sopenharmony_ci case GL_BLUE: 990bf215546Sopenharmony_ci case GL_ALPHA: 991bf215546Sopenharmony_ci case GL_ALPHA4: 992bf215546Sopenharmony_ci case GL_ALPHA8: 993bf215546Sopenharmony_ci case GL_ALPHA12: 994bf215546Sopenharmony_ci case GL_ALPHA16: 995bf215546Sopenharmony_ci case 1: 996bf215546Sopenharmony_ci case GL_LUMINANCE: 997bf215546Sopenharmony_ci case GL_LUMINANCE4: 998bf215546Sopenharmony_ci case GL_LUMINANCE8: 999bf215546Sopenharmony_ci case GL_LUMINANCE12: 1000bf215546Sopenharmony_ci case GL_LUMINANCE16: 1001bf215546Sopenharmony_ci case 2: 1002bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1003bf215546Sopenharmony_ci case GL_LUMINANCE4_ALPHA4: 1004bf215546Sopenharmony_ci case GL_LUMINANCE6_ALPHA2: 1005bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8: 1006bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA4: 1007bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA12: 1008bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16: 1009bf215546Sopenharmony_ci case GL_INTENSITY: 1010bf215546Sopenharmony_ci case GL_INTENSITY4: 1011bf215546Sopenharmony_ci case GL_INTENSITY8: 1012bf215546Sopenharmony_ci case GL_INTENSITY12: 1013bf215546Sopenharmony_ci case GL_INTENSITY16: 1014bf215546Sopenharmony_ci case GL_R8: 1015bf215546Sopenharmony_ci case GL_R16: 1016bf215546Sopenharmony_ci case GL_RG: 1017bf215546Sopenharmony_ci case GL_RG8: 1018bf215546Sopenharmony_ci case GL_RG16: 1019bf215546Sopenharmony_ci case 3: 1020bf215546Sopenharmony_ci case GL_RGB: 1021bf215546Sopenharmony_ci case GL_BGR: 1022bf215546Sopenharmony_ci case GL_R3_G3_B2: 1023bf215546Sopenharmony_ci case GL_RGB4: 1024bf215546Sopenharmony_ci case GL_RGB5: 1025bf215546Sopenharmony_ci case GL_RGB565: 1026bf215546Sopenharmony_ci case GL_RGB8: 1027bf215546Sopenharmony_ci case GL_RGB10: 1028bf215546Sopenharmony_ci case GL_RGB12: 1029bf215546Sopenharmony_ci case GL_RGB16: 1030bf215546Sopenharmony_ci case 4: 1031bf215546Sopenharmony_ci case GL_ABGR_EXT: 1032bf215546Sopenharmony_ci case GL_RGBA: 1033bf215546Sopenharmony_ci case GL_BGRA: 1034bf215546Sopenharmony_ci case GL_RGBA2: 1035bf215546Sopenharmony_ci case GL_RGBA4: 1036bf215546Sopenharmony_ci case GL_RGB5_A1: 1037bf215546Sopenharmony_ci case GL_RGBA8: 1038bf215546Sopenharmony_ci case GL_RGB10_A2: 1039bf215546Sopenharmony_ci case GL_RGBA12: 1040bf215546Sopenharmony_ci case GL_RGBA16: 1041bf215546Sopenharmony_ci /* float texture formats */ 1042bf215546Sopenharmony_ci case GL_ALPHA16F_ARB: 1043bf215546Sopenharmony_ci case GL_ALPHA32F_ARB: 1044bf215546Sopenharmony_ci case GL_LUMINANCE16F_ARB: 1045bf215546Sopenharmony_ci case GL_LUMINANCE32F_ARB: 1046bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16F_ARB: 1047bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32F_ARB: 1048bf215546Sopenharmony_ci case GL_INTENSITY16F_ARB: 1049bf215546Sopenharmony_ci case GL_INTENSITY32F_ARB: 1050bf215546Sopenharmony_ci case GL_R16F: 1051bf215546Sopenharmony_ci case GL_R32F: 1052bf215546Sopenharmony_ci case GL_RG16F: 1053bf215546Sopenharmony_ci case GL_RG32F: 1054bf215546Sopenharmony_ci case GL_RGB16F_ARB: 1055bf215546Sopenharmony_ci case GL_RGB32F_ARB: 1056bf215546Sopenharmony_ci case GL_RGBA16F_ARB: 1057bf215546Sopenharmony_ci case GL_RGBA32F_ARB: 1058bf215546Sopenharmony_ci /* compressed formats */ 1059bf215546Sopenharmony_ci case GL_COMPRESSED_ALPHA: 1060bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE: 1061bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA: 1062bf215546Sopenharmony_ci case GL_COMPRESSED_INTENSITY: 1063bf215546Sopenharmony_ci case GL_COMPRESSED_RED: 1064bf215546Sopenharmony_ci case GL_COMPRESSED_RG: 1065bf215546Sopenharmony_ci case GL_COMPRESSED_RGB: 1066bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA: 1067bf215546Sopenharmony_ci case GL_RGB_S3TC: 1068bf215546Sopenharmony_ci case GL_RGB4_S3TC: 1069bf215546Sopenharmony_ci case GL_RGBA_S3TC: 1070bf215546Sopenharmony_ci case GL_RGBA4_S3TC: 1071bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1072bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1073bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1074bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1075bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_FXT1_3DFX: 1076bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_FXT1_3DFX: 1077bf215546Sopenharmony_ci case GL_SR8_EXT: 1078bf215546Sopenharmony_ci case GL_SRG8_EXT: 1079bf215546Sopenharmony_ci case GL_SRGB_EXT: 1080bf215546Sopenharmony_ci case GL_SRGB8_EXT: 1081bf215546Sopenharmony_ci case GL_SRGB_ALPHA_EXT: 1082bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8_EXT: 1083bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA_EXT: 1084bf215546Sopenharmony_ci case GL_SLUMINANCE8_ALPHA8_EXT: 1085bf215546Sopenharmony_ci case GL_SLUMINANCE_EXT: 1086bf215546Sopenharmony_ci case GL_SLUMINANCE8_EXT: 1087bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_EXT: 1088bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1089bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_EXT: 1090bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1091bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1092bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1093bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE_EXT: 1094bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 1095bf215546Sopenharmony_ci case GL_COMPRESSED_RED_RGTC1: 1096bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RED_RGTC1: 1097bf215546Sopenharmony_ci case GL_COMPRESSED_RG_RGTC2: 1098bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RG_RGTC2: 1099bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 1100bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 1101bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 1102bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 1103bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1104bf215546Sopenharmony_ci case GL_ETC1_RGB8_OES: 1105bf215546Sopenharmony_ci case GL_COMPRESSED_RGB8_ETC2: 1106bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ETC2: 1107bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA8_ETC2_EAC: 1108bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1109bf215546Sopenharmony_ci case GL_COMPRESSED_R11_EAC: 1110bf215546Sopenharmony_ci case GL_COMPRESSED_RG11_EAC: 1111bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_R11_EAC: 1112bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RG11_EAC: 1113bf215546Sopenharmony_ci case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1114bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1115bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_BPTC_UNORM: 1116bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1117bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 1118bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 1119bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 1120bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 1121bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 1122bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 1123bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 1124bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 1125bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 1126bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 1127bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 1128bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 1129bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 1130bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 1131bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 1132bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 1133bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1134bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1135bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1136bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1137bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1138bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1139bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1140bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1141bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1142bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1143bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1144bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1145bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1146bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1147bf215546Sopenharmony_ci case GL_ATC_RGB_AMD: 1148bf215546Sopenharmony_ci case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: 1149bf215546Sopenharmony_ci case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: 1150bf215546Sopenharmony_ci /* generic integer formats */ 1151bf215546Sopenharmony_ci case GL_RED_INTEGER_EXT: 1152bf215546Sopenharmony_ci case GL_GREEN_INTEGER_EXT: 1153bf215546Sopenharmony_ci case GL_BLUE_INTEGER_EXT: 1154bf215546Sopenharmony_ci case GL_ALPHA_INTEGER_EXT: 1155bf215546Sopenharmony_ci case GL_RGB_INTEGER_EXT: 1156bf215546Sopenharmony_ci case GL_RGBA_INTEGER_EXT: 1157bf215546Sopenharmony_ci case GL_BGR_INTEGER_EXT: 1158bf215546Sopenharmony_ci case GL_BGRA_INTEGER_EXT: 1159bf215546Sopenharmony_ci case GL_RG_INTEGER: 1160bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 1161bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1162bf215546Sopenharmony_ci /* sized integer formats */ 1163bf215546Sopenharmony_ci case GL_RGBA32UI_EXT: 1164bf215546Sopenharmony_ci case GL_RGB32UI_EXT: 1165bf215546Sopenharmony_ci case GL_RG32UI: 1166bf215546Sopenharmony_ci case GL_R32UI: 1167bf215546Sopenharmony_ci case GL_ALPHA32UI_EXT: 1168bf215546Sopenharmony_ci case GL_INTENSITY32UI_EXT: 1169bf215546Sopenharmony_ci case GL_LUMINANCE32UI_EXT: 1170bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32UI_EXT: 1171bf215546Sopenharmony_ci case GL_RGBA16UI_EXT: 1172bf215546Sopenharmony_ci case GL_RGB16UI_EXT: 1173bf215546Sopenharmony_ci case GL_RG16UI: 1174bf215546Sopenharmony_ci case GL_R16UI: 1175bf215546Sopenharmony_ci case GL_ALPHA16UI_EXT: 1176bf215546Sopenharmony_ci case GL_INTENSITY16UI_EXT: 1177bf215546Sopenharmony_ci case GL_LUMINANCE16UI_EXT: 1178bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16UI_EXT: 1179bf215546Sopenharmony_ci case GL_RGBA8UI_EXT: 1180bf215546Sopenharmony_ci case GL_RGB8UI_EXT: 1181bf215546Sopenharmony_ci case GL_RG8UI: 1182bf215546Sopenharmony_ci case GL_R8UI: 1183bf215546Sopenharmony_ci case GL_ALPHA8UI_EXT: 1184bf215546Sopenharmony_ci case GL_INTENSITY8UI_EXT: 1185bf215546Sopenharmony_ci case GL_LUMINANCE8UI_EXT: 1186bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8UI_EXT: 1187bf215546Sopenharmony_ci case GL_RGBA32I_EXT: 1188bf215546Sopenharmony_ci case GL_RGB32I_EXT: 1189bf215546Sopenharmony_ci case GL_RG32I: 1190bf215546Sopenharmony_ci case GL_R32I: 1191bf215546Sopenharmony_ci case GL_ALPHA32I_EXT: 1192bf215546Sopenharmony_ci case GL_INTENSITY32I_EXT: 1193bf215546Sopenharmony_ci case GL_LUMINANCE32I_EXT: 1194bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32I_EXT: 1195bf215546Sopenharmony_ci case GL_RGBA16I_EXT: 1196bf215546Sopenharmony_ci case GL_RGB16I_EXT: 1197bf215546Sopenharmony_ci case GL_RG16I: 1198bf215546Sopenharmony_ci case GL_R16I: 1199bf215546Sopenharmony_ci case GL_ALPHA16I_EXT: 1200bf215546Sopenharmony_ci case GL_INTENSITY16I_EXT: 1201bf215546Sopenharmony_ci case GL_LUMINANCE16I_EXT: 1202bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16I_EXT: 1203bf215546Sopenharmony_ci case GL_RGBA8I_EXT: 1204bf215546Sopenharmony_ci case GL_RGB8I_EXT: 1205bf215546Sopenharmony_ci case GL_RG8I: 1206bf215546Sopenharmony_ci case GL_R8I: 1207bf215546Sopenharmony_ci case GL_ALPHA8I_EXT: 1208bf215546Sopenharmony_ci case GL_INTENSITY8I_EXT: 1209bf215546Sopenharmony_ci case GL_LUMINANCE8I_EXT: 1210bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8I_EXT: 1211bf215546Sopenharmony_ci /* signed, normalized texture formats */ 1212bf215546Sopenharmony_ci case GL_RED_SNORM: 1213bf215546Sopenharmony_ci case GL_R8_SNORM: 1214bf215546Sopenharmony_ci case GL_R16_SNORM: 1215bf215546Sopenharmony_ci case GL_RG_SNORM: 1216bf215546Sopenharmony_ci case GL_RG8_SNORM: 1217bf215546Sopenharmony_ci case GL_RG16_SNORM: 1218bf215546Sopenharmony_ci case GL_RGB_SNORM: 1219bf215546Sopenharmony_ci case GL_RGB8_SNORM: 1220bf215546Sopenharmony_ci case GL_RGB16_SNORM: 1221bf215546Sopenharmony_ci case GL_RGBA_SNORM: 1222bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 1223bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 1224bf215546Sopenharmony_ci case GL_ALPHA_SNORM: 1225bf215546Sopenharmony_ci case GL_ALPHA8_SNORM: 1226bf215546Sopenharmony_ci case GL_ALPHA16_SNORM: 1227bf215546Sopenharmony_ci case GL_LUMINANCE_SNORM: 1228bf215546Sopenharmony_ci case GL_LUMINANCE8_SNORM: 1229bf215546Sopenharmony_ci case GL_LUMINANCE16_SNORM: 1230bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_SNORM: 1231bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8_SNORM: 1232bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16_SNORM: 1233bf215546Sopenharmony_ci case GL_INTENSITY_SNORM: 1234bf215546Sopenharmony_ci case GL_INTENSITY8_SNORM: 1235bf215546Sopenharmony_ci case GL_INTENSITY16_SNORM: 1236bf215546Sopenharmony_ci case GL_RGB9_E5: 1237bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 1238bf215546Sopenharmony_ci case GL_RGB10_A2UI: 1239bf215546Sopenharmony_ci return GL_TRUE; 1240bf215546Sopenharmony_ci case GL_YCBCR_MESA: /* not considered to be RGB */ 1241bf215546Sopenharmony_ci FALLTHROUGH; 1242bf215546Sopenharmony_ci default: 1243bf215546Sopenharmony_ci return GL_FALSE; 1244bf215546Sopenharmony_ci } 1245bf215546Sopenharmony_ci} 1246bf215546Sopenharmony_ci 1247bf215546Sopenharmony_ci 1248bf215546Sopenharmony_ci/** 1249bf215546Sopenharmony_ci * Test if the given image format is a depth component format. 1250bf215546Sopenharmony_ci */ 1251bf215546Sopenharmony_ciGLboolean 1252bf215546Sopenharmony_ci_mesa_is_depth_format(GLenum format) 1253bf215546Sopenharmony_ci{ 1254bf215546Sopenharmony_ci switch (format) { 1255bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 1256bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT16: 1257bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT24: 1258bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32: 1259bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32F: 1260bf215546Sopenharmony_ci return GL_TRUE; 1261bf215546Sopenharmony_ci default: 1262bf215546Sopenharmony_ci return GL_FALSE; 1263bf215546Sopenharmony_ci } 1264bf215546Sopenharmony_ci} 1265bf215546Sopenharmony_ci 1266bf215546Sopenharmony_ci 1267bf215546Sopenharmony_ci/** 1268bf215546Sopenharmony_ci * Test if the given image format is a stencil format. 1269bf215546Sopenharmony_ci */ 1270bf215546Sopenharmony_ciGLboolean 1271bf215546Sopenharmony_ci_mesa_is_stencil_format(GLenum format) 1272bf215546Sopenharmony_ci{ 1273bf215546Sopenharmony_ci switch (format) { 1274bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 1275bf215546Sopenharmony_ci return GL_TRUE; 1276bf215546Sopenharmony_ci default: 1277bf215546Sopenharmony_ci return GL_FALSE; 1278bf215546Sopenharmony_ci } 1279bf215546Sopenharmony_ci} 1280bf215546Sopenharmony_ci 1281bf215546Sopenharmony_ci 1282bf215546Sopenharmony_ci/** 1283bf215546Sopenharmony_ci * Test if the given image format is a YCbCr format. 1284bf215546Sopenharmony_ci */ 1285bf215546Sopenharmony_ciGLboolean 1286bf215546Sopenharmony_ci_mesa_is_ycbcr_format(GLenum format) 1287bf215546Sopenharmony_ci{ 1288bf215546Sopenharmony_ci switch (format) { 1289bf215546Sopenharmony_ci case GL_YCBCR_MESA: 1290bf215546Sopenharmony_ci return GL_TRUE; 1291bf215546Sopenharmony_ci default: 1292bf215546Sopenharmony_ci return GL_FALSE; 1293bf215546Sopenharmony_ci } 1294bf215546Sopenharmony_ci} 1295bf215546Sopenharmony_ci 1296bf215546Sopenharmony_ci 1297bf215546Sopenharmony_ci/** 1298bf215546Sopenharmony_ci * Test if the given image format is a depth+stencil format. 1299bf215546Sopenharmony_ci */ 1300bf215546Sopenharmony_ciGLboolean 1301bf215546Sopenharmony_ci_mesa_is_depthstencil_format(GLenum format) 1302bf215546Sopenharmony_ci{ 1303bf215546Sopenharmony_ci switch (format) { 1304bf215546Sopenharmony_ci case GL_DEPTH24_STENCIL8_EXT: 1305bf215546Sopenharmony_ci case GL_DEPTH_STENCIL_EXT: 1306bf215546Sopenharmony_ci case GL_DEPTH32F_STENCIL8: 1307bf215546Sopenharmony_ci return GL_TRUE; 1308bf215546Sopenharmony_ci default: 1309bf215546Sopenharmony_ci return GL_FALSE; 1310bf215546Sopenharmony_ci } 1311bf215546Sopenharmony_ci} 1312bf215546Sopenharmony_ci 1313bf215546Sopenharmony_ci 1314bf215546Sopenharmony_ci/** 1315bf215546Sopenharmony_ci * Test if the given image format is a depth or stencil format. 1316bf215546Sopenharmony_ci */ 1317bf215546Sopenharmony_ciGLboolean 1318bf215546Sopenharmony_ci_mesa_is_depth_or_stencil_format(GLenum format) 1319bf215546Sopenharmony_ci{ 1320bf215546Sopenharmony_ci switch (format) { 1321bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 1322bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT16: 1323bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT24: 1324bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32: 1325bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 1326bf215546Sopenharmony_ci case GL_STENCIL_INDEX1_EXT: 1327bf215546Sopenharmony_ci case GL_STENCIL_INDEX4_EXT: 1328bf215546Sopenharmony_ci case GL_STENCIL_INDEX8_EXT: 1329bf215546Sopenharmony_ci case GL_STENCIL_INDEX16_EXT: 1330bf215546Sopenharmony_ci case GL_DEPTH_STENCIL_EXT: 1331bf215546Sopenharmony_ci case GL_DEPTH24_STENCIL8_EXT: 1332bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32F: 1333bf215546Sopenharmony_ci case GL_DEPTH32F_STENCIL8: 1334bf215546Sopenharmony_ci return GL_TRUE; 1335bf215546Sopenharmony_ci default: 1336bf215546Sopenharmony_ci return GL_FALSE; 1337bf215546Sopenharmony_ci } 1338bf215546Sopenharmony_ci} 1339bf215546Sopenharmony_ci 1340bf215546Sopenharmony_ci/** 1341bf215546Sopenharmony_ci * Test if the given image format has a floating-point depth component. 1342bf215546Sopenharmony_ci */ 1343bf215546Sopenharmony_ciGLboolean 1344bf215546Sopenharmony_ci_mesa_has_depth_float_channel(GLenum internalFormat) 1345bf215546Sopenharmony_ci{ 1346bf215546Sopenharmony_ci return internalFormat == GL_DEPTH32F_STENCIL8 || 1347bf215546Sopenharmony_ci internalFormat == GL_DEPTH_COMPONENT32F; 1348bf215546Sopenharmony_ci} 1349bf215546Sopenharmony_ci 1350bf215546Sopenharmony_ci/** 1351bf215546Sopenharmony_ci * Test if an image format is a supported compressed format. 1352bf215546Sopenharmony_ci * \param format the internal format token provided by the user. 1353bf215546Sopenharmony_ci * \return GL_TRUE if compressed, GL_FALSE if uncompressed 1354bf215546Sopenharmony_ci */ 1355bf215546Sopenharmony_ciGLboolean 1356bf215546Sopenharmony_ci_mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) 1357bf215546Sopenharmony_ci{ 1358bf215546Sopenharmony_ci mesa_format m_format = _mesa_glenum_to_compressed_format(format); 1359bf215546Sopenharmony_ci 1360bf215546Sopenharmony_ci /* Some formats in this switch have an equivalent mesa_format_layout 1361bf215546Sopenharmony_ci * to the compressed formats in the layout switch below and thus 1362bf215546Sopenharmony_ci * must be handled first. 1363bf215546Sopenharmony_ci */ 1364bf215546Sopenharmony_ci switch (format) { 1365bf215546Sopenharmony_ci case GL_RGB_S3TC: 1366bf215546Sopenharmony_ci case GL_RGB4_S3TC: 1367bf215546Sopenharmony_ci case GL_RGBA_S3TC: 1368bf215546Sopenharmony_ci case GL_RGBA4_S3TC: 1369bf215546Sopenharmony_ci return _mesa_has_S3_s3tc(ctx); 1370bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1371bf215546Sopenharmony_ci return _mesa_has_ATI_texture_compression_3dc(ctx); 1372bf215546Sopenharmony_ci case GL_PALETTE4_RGB8_OES: 1373bf215546Sopenharmony_ci case GL_PALETTE4_RGBA8_OES: 1374bf215546Sopenharmony_ci case GL_PALETTE4_R5_G6_B5_OES: 1375bf215546Sopenharmony_ci case GL_PALETTE4_RGBA4_OES: 1376bf215546Sopenharmony_ci case GL_PALETTE4_RGB5_A1_OES: 1377bf215546Sopenharmony_ci case GL_PALETTE8_RGB8_OES: 1378bf215546Sopenharmony_ci case GL_PALETTE8_RGBA8_OES: 1379bf215546Sopenharmony_ci case GL_PALETTE8_R5_G6_B5_OES: 1380bf215546Sopenharmony_ci case GL_PALETTE8_RGBA4_OES: 1381bf215546Sopenharmony_ci case GL_PALETTE8_RGB5_A1_OES: 1382bf215546Sopenharmony_ci return ctx->API == API_OPENGLES; 1383bf215546Sopenharmony_ci } 1384bf215546Sopenharmony_ci 1385bf215546Sopenharmony_ci switch (_mesa_get_format_layout(m_format)) { 1386bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_S3TC: 1387bf215546Sopenharmony_ci if (!_mesa_is_format_srgb(m_format)) { 1388bf215546Sopenharmony_ci return _mesa_has_EXT_texture_compression_s3tc(ctx); 1389bf215546Sopenharmony_ci } else { 1390bf215546Sopenharmony_ci return (_mesa_has_EXT_texture_sRGB(ctx) || 1391bf215546Sopenharmony_ci _mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) && 1392bf215546Sopenharmony_ci _mesa_has_EXT_texture_compression_s3tc(ctx); 1393bf215546Sopenharmony_ci } 1394bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_FXT1: 1395bf215546Sopenharmony_ci return _mesa_has_3DFX_texture_compression_FXT1(ctx); 1396bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_RGTC: 1397bf215546Sopenharmony_ci return _mesa_has_ARB_texture_compression_rgtc(ctx) || 1398bf215546Sopenharmony_ci _mesa_has_EXT_texture_compression_rgtc(ctx); 1399bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_LATC: 1400bf215546Sopenharmony_ci return _mesa_has_EXT_texture_compression_latc(ctx); 1401bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_ETC1: 1402bf215546Sopenharmony_ci return _mesa_has_OES_compressed_ETC1_RGB8_texture(ctx); 1403bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_ETC2: 1404bf215546Sopenharmony_ci return _mesa_is_gles3(ctx) || _mesa_has_ARB_ES3_compatibility(ctx); 1405bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_BPTC: 1406bf215546Sopenharmony_ci return _mesa_has_ARB_texture_compression_bptc(ctx) || 1407bf215546Sopenharmony_ci _mesa_has_EXT_texture_compression_bptc(ctx); 1408bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_ASTC: 1409bf215546Sopenharmony_ci return _mesa_has_KHR_texture_compression_astc_ldr(ctx); 1410bf215546Sopenharmony_ci case MESA_FORMAT_LAYOUT_ATC: 1411bf215546Sopenharmony_ci return _mesa_has_AMD_compressed_ATC_texture(ctx); 1412bf215546Sopenharmony_ci default: 1413bf215546Sopenharmony_ci return GL_FALSE; 1414bf215546Sopenharmony_ci } 1415bf215546Sopenharmony_ci} 1416bf215546Sopenharmony_ci 1417bf215546Sopenharmony_ci/** 1418bf215546Sopenharmony_ci * Test if the given format represents an sRGB format. 1419bf215546Sopenharmony_ci * \param format the GL format (can be an internal format) 1420bf215546Sopenharmony_ci * \return GL_TRUE if format is sRGB, GL_FALSE otherwise 1421bf215546Sopenharmony_ci */ 1422bf215546Sopenharmony_ciGLboolean 1423bf215546Sopenharmony_ci_mesa_is_srgb_format(GLenum format) 1424bf215546Sopenharmony_ci{ 1425bf215546Sopenharmony_ci switch (format) { 1426bf215546Sopenharmony_ci case GL_SR8_EXT: 1427bf215546Sopenharmony_ci case GL_SRG8_EXT: 1428bf215546Sopenharmony_ci case GL_SRGB: 1429bf215546Sopenharmony_ci case GL_SRGB8: 1430bf215546Sopenharmony_ci case GL_SRGB_ALPHA: 1431bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8: 1432bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB: 1433bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA: 1434bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1435bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1436bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1437bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1438bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ETC2: 1439bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1440bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1441bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1442bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1443bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1444bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1445bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1446bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1447bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1448bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1449bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1450bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1451bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1452bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1453bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1454bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1455bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1456bf215546Sopenharmony_ci return GL_TRUE; 1457bf215546Sopenharmony_ci default: 1458bf215546Sopenharmony_ci break; 1459bf215546Sopenharmony_ci } 1460bf215546Sopenharmony_ci 1461bf215546Sopenharmony_ci return GL_FALSE; 1462bf215546Sopenharmony_ci} 1463bf215546Sopenharmony_ci 1464bf215546Sopenharmony_ci/** 1465bf215546Sopenharmony_ci * Convert various unpack formats to the corresponding base format. 1466bf215546Sopenharmony_ci */ 1467bf215546Sopenharmony_ciGLenum 1468bf215546Sopenharmony_ci_mesa_unpack_format_to_base_format(GLenum format) 1469bf215546Sopenharmony_ci{ 1470bf215546Sopenharmony_ci switch(format) { 1471bf215546Sopenharmony_ci case GL_RED_INTEGER: 1472bf215546Sopenharmony_ci return GL_RED; 1473bf215546Sopenharmony_ci case GL_GREEN_INTEGER: 1474bf215546Sopenharmony_ci return GL_GREEN; 1475bf215546Sopenharmony_ci case GL_BLUE_INTEGER: 1476bf215546Sopenharmony_ci return GL_BLUE; 1477bf215546Sopenharmony_ci case GL_ALPHA_INTEGER: 1478bf215546Sopenharmony_ci return GL_ALPHA; 1479bf215546Sopenharmony_ci case GL_RG_INTEGER: 1480bf215546Sopenharmony_ci return GL_RG; 1481bf215546Sopenharmony_ci case GL_RGB_INTEGER: 1482bf215546Sopenharmony_ci return GL_RGB; 1483bf215546Sopenharmony_ci case GL_RGBA_INTEGER: 1484bf215546Sopenharmony_ci return GL_RGBA; 1485bf215546Sopenharmony_ci case GL_BGR_INTEGER: 1486bf215546Sopenharmony_ci return GL_BGR; 1487bf215546Sopenharmony_ci case GL_BGRA_INTEGER: 1488bf215546Sopenharmony_ci return GL_BGRA; 1489bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 1490bf215546Sopenharmony_ci return GL_LUMINANCE; 1491bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1492bf215546Sopenharmony_ci return GL_LUMINANCE_ALPHA; 1493bf215546Sopenharmony_ci case GL_RED: 1494bf215546Sopenharmony_ci case GL_GREEN: 1495bf215546Sopenharmony_ci case GL_BLUE: 1496bf215546Sopenharmony_ci case GL_RG: 1497bf215546Sopenharmony_ci case GL_RGB: 1498bf215546Sopenharmony_ci case GL_RGBA: 1499bf215546Sopenharmony_ci case GL_BGR: 1500bf215546Sopenharmony_ci case GL_BGRA: 1501bf215546Sopenharmony_ci case GL_ALPHA: 1502bf215546Sopenharmony_ci case GL_LUMINANCE: 1503bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1504bf215546Sopenharmony_ci default: 1505bf215546Sopenharmony_ci return format; 1506bf215546Sopenharmony_ci } 1507bf215546Sopenharmony_ci} 1508bf215546Sopenharmony_ci 1509bf215546Sopenharmony_ci/** 1510bf215546Sopenharmony_ci * Convert various base formats to the corresponding integer format. 1511bf215546Sopenharmony_ci */ 1512bf215546Sopenharmony_ciGLenum 1513bf215546Sopenharmony_ci_mesa_base_format_to_integer_format(GLenum format) 1514bf215546Sopenharmony_ci{ 1515bf215546Sopenharmony_ci switch(format) { 1516bf215546Sopenharmony_ci case GL_RED: 1517bf215546Sopenharmony_ci return GL_RED_INTEGER; 1518bf215546Sopenharmony_ci case GL_GREEN: 1519bf215546Sopenharmony_ci return GL_GREEN_INTEGER; 1520bf215546Sopenharmony_ci case GL_BLUE: 1521bf215546Sopenharmony_ci return GL_BLUE_INTEGER; 1522bf215546Sopenharmony_ci case GL_RG: 1523bf215546Sopenharmony_ci return GL_RG_INTEGER; 1524bf215546Sopenharmony_ci case GL_RGB: 1525bf215546Sopenharmony_ci return GL_RGB_INTEGER; 1526bf215546Sopenharmony_ci case GL_RGBA: 1527bf215546Sopenharmony_ci return GL_RGBA_INTEGER; 1528bf215546Sopenharmony_ci case GL_BGR: 1529bf215546Sopenharmony_ci return GL_BGR_INTEGER; 1530bf215546Sopenharmony_ci case GL_BGRA: 1531bf215546Sopenharmony_ci return GL_BGRA_INTEGER; 1532bf215546Sopenharmony_ci case GL_ALPHA: 1533bf215546Sopenharmony_ci return GL_ALPHA_INTEGER; 1534bf215546Sopenharmony_ci case GL_LUMINANCE: 1535bf215546Sopenharmony_ci return GL_LUMINANCE_INTEGER_EXT; 1536bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1537bf215546Sopenharmony_ci return GL_LUMINANCE_ALPHA_INTEGER_EXT; 1538bf215546Sopenharmony_ci } 1539bf215546Sopenharmony_ci 1540bf215546Sopenharmony_ci return format; 1541bf215546Sopenharmony_ci} 1542bf215546Sopenharmony_ci 1543bf215546Sopenharmony_ci 1544bf215546Sopenharmony_ci/** 1545bf215546Sopenharmony_ci * Does the given base texture/renderbuffer format have the channel 1546bf215546Sopenharmony_ci * named by 'pname'? 1547bf215546Sopenharmony_ci */ 1548bf215546Sopenharmony_ciGLboolean 1549bf215546Sopenharmony_ci_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 1550bf215546Sopenharmony_ci{ 1551bf215546Sopenharmony_ci switch (pname) { 1552bf215546Sopenharmony_ci case GL_TEXTURE_RED_SIZE: 1553bf215546Sopenharmony_ci case GL_TEXTURE_RED_TYPE: 1554bf215546Sopenharmony_ci case GL_RENDERBUFFER_RED_SIZE_EXT: 1555bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 1556bf215546Sopenharmony_ci case GL_INTERNALFORMAT_RED_SIZE: 1557bf215546Sopenharmony_ci case GL_INTERNALFORMAT_RED_TYPE: 1558bf215546Sopenharmony_ci if (base_format == GL_RED || 1559bf215546Sopenharmony_ci base_format == GL_RG || 1560bf215546Sopenharmony_ci base_format == GL_RGB || 1561bf215546Sopenharmony_ci base_format == GL_RGBA) { 1562bf215546Sopenharmony_ci return GL_TRUE; 1563bf215546Sopenharmony_ci } 1564bf215546Sopenharmony_ci return GL_FALSE; 1565bf215546Sopenharmony_ci case GL_TEXTURE_GREEN_SIZE: 1566bf215546Sopenharmony_ci case GL_TEXTURE_GREEN_TYPE: 1567bf215546Sopenharmony_ci case GL_RENDERBUFFER_GREEN_SIZE_EXT: 1568bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 1569bf215546Sopenharmony_ci case GL_INTERNALFORMAT_GREEN_SIZE: 1570bf215546Sopenharmony_ci case GL_INTERNALFORMAT_GREEN_TYPE: 1571bf215546Sopenharmony_ci if (base_format == GL_RG || 1572bf215546Sopenharmony_ci base_format == GL_RGB || 1573bf215546Sopenharmony_ci base_format == GL_RGBA) { 1574bf215546Sopenharmony_ci return GL_TRUE; 1575bf215546Sopenharmony_ci } 1576bf215546Sopenharmony_ci return GL_FALSE; 1577bf215546Sopenharmony_ci case GL_TEXTURE_BLUE_SIZE: 1578bf215546Sopenharmony_ci case GL_TEXTURE_BLUE_TYPE: 1579bf215546Sopenharmony_ci case GL_RENDERBUFFER_BLUE_SIZE_EXT: 1580bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 1581bf215546Sopenharmony_ci case GL_INTERNALFORMAT_BLUE_SIZE: 1582bf215546Sopenharmony_ci case GL_INTERNALFORMAT_BLUE_TYPE: 1583bf215546Sopenharmony_ci if (base_format == GL_RGB || 1584bf215546Sopenharmony_ci base_format == GL_RGBA) { 1585bf215546Sopenharmony_ci return GL_TRUE; 1586bf215546Sopenharmony_ci } 1587bf215546Sopenharmony_ci return GL_FALSE; 1588bf215546Sopenharmony_ci case GL_TEXTURE_ALPHA_SIZE: 1589bf215546Sopenharmony_ci case GL_TEXTURE_ALPHA_TYPE: 1590bf215546Sopenharmony_ci case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 1591bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 1592bf215546Sopenharmony_ci case GL_INTERNALFORMAT_ALPHA_SIZE: 1593bf215546Sopenharmony_ci case GL_INTERNALFORMAT_ALPHA_TYPE: 1594bf215546Sopenharmony_ci if (base_format == GL_RGBA || 1595bf215546Sopenharmony_ci base_format == GL_ALPHA || 1596bf215546Sopenharmony_ci base_format == GL_LUMINANCE_ALPHA) { 1597bf215546Sopenharmony_ci return GL_TRUE; 1598bf215546Sopenharmony_ci } 1599bf215546Sopenharmony_ci return GL_FALSE; 1600bf215546Sopenharmony_ci case GL_TEXTURE_LUMINANCE_SIZE: 1601bf215546Sopenharmony_ci case GL_TEXTURE_LUMINANCE_TYPE: 1602bf215546Sopenharmony_ci if (base_format == GL_LUMINANCE || 1603bf215546Sopenharmony_ci base_format == GL_LUMINANCE_ALPHA) { 1604bf215546Sopenharmony_ci return GL_TRUE; 1605bf215546Sopenharmony_ci } 1606bf215546Sopenharmony_ci return GL_FALSE; 1607bf215546Sopenharmony_ci case GL_TEXTURE_INTENSITY_SIZE: 1608bf215546Sopenharmony_ci case GL_TEXTURE_INTENSITY_TYPE: 1609bf215546Sopenharmony_ci if (base_format == GL_INTENSITY) { 1610bf215546Sopenharmony_ci return GL_TRUE; 1611bf215546Sopenharmony_ci } 1612bf215546Sopenharmony_ci return GL_FALSE; 1613bf215546Sopenharmony_ci case GL_TEXTURE_DEPTH_SIZE: 1614bf215546Sopenharmony_ci case GL_TEXTURE_DEPTH_TYPE: 1615bf215546Sopenharmony_ci case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 1616bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 1617bf215546Sopenharmony_ci case GL_INTERNALFORMAT_DEPTH_SIZE: 1618bf215546Sopenharmony_ci case GL_INTERNALFORMAT_DEPTH_TYPE: 1619bf215546Sopenharmony_ci if (base_format == GL_DEPTH_STENCIL || 1620bf215546Sopenharmony_ci base_format == GL_DEPTH_COMPONENT) { 1621bf215546Sopenharmony_ci return GL_TRUE; 1622bf215546Sopenharmony_ci } 1623bf215546Sopenharmony_ci return GL_FALSE; 1624bf215546Sopenharmony_ci case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 1625bf215546Sopenharmony_ci case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 1626bf215546Sopenharmony_ci case GL_INTERNALFORMAT_STENCIL_SIZE: 1627bf215546Sopenharmony_ci case GL_INTERNALFORMAT_STENCIL_TYPE: 1628bf215546Sopenharmony_ci if (base_format == GL_DEPTH_STENCIL || 1629bf215546Sopenharmony_ci base_format == GL_STENCIL_INDEX) { 1630bf215546Sopenharmony_ci return GL_TRUE; 1631bf215546Sopenharmony_ci } 1632bf215546Sopenharmony_ci return GL_FALSE; 1633bf215546Sopenharmony_ci default: 1634bf215546Sopenharmony_ci _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 1635bf215546Sopenharmony_ci __func__, pname); 1636bf215546Sopenharmony_ci return GL_FALSE; 1637bf215546Sopenharmony_ci } 1638bf215546Sopenharmony_ci 1639bf215546Sopenharmony_ci return GL_FALSE; 1640bf215546Sopenharmony_ci} 1641bf215546Sopenharmony_ci 1642bf215546Sopenharmony_ci 1643bf215546Sopenharmony_ci/** 1644bf215546Sopenharmony_ci * If format is a generic compressed format, return the corresponding 1645bf215546Sopenharmony_ci * non-compressed format. For other formats, return the format as-is. 1646bf215546Sopenharmony_ci */ 1647bf215546Sopenharmony_ciGLenum 1648bf215546Sopenharmony_ci_mesa_generic_compressed_format_to_uncompressed_format(GLenum format) 1649bf215546Sopenharmony_ci{ 1650bf215546Sopenharmony_ci switch (format) { 1651bf215546Sopenharmony_ci case GL_COMPRESSED_RED: 1652bf215546Sopenharmony_ci return GL_RED; 1653bf215546Sopenharmony_ci case GL_COMPRESSED_RG: 1654bf215546Sopenharmony_ci return GL_RG; 1655bf215546Sopenharmony_ci case GL_COMPRESSED_RGB: 1656bf215546Sopenharmony_ci return GL_RGB; 1657bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA: 1658bf215546Sopenharmony_ci return GL_RGBA; 1659bf215546Sopenharmony_ci case GL_COMPRESSED_ALPHA: 1660bf215546Sopenharmony_ci return GL_ALPHA; 1661bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE: 1662bf215546Sopenharmony_ci return GL_LUMINANCE; 1663bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA: 1664bf215546Sopenharmony_ci return GL_LUMINANCE_ALPHA; 1665bf215546Sopenharmony_ci case GL_COMPRESSED_INTENSITY: 1666bf215546Sopenharmony_ci return GL_INTENSITY; 1667bf215546Sopenharmony_ci /* sRGB formats */ 1668bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB: 1669bf215546Sopenharmony_ci return GL_SRGB; 1670bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA: 1671bf215546Sopenharmony_ci return GL_SRGB_ALPHA; 1672bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE: 1673bf215546Sopenharmony_ci return GL_SLUMINANCE; 1674bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE_ALPHA: 1675bf215546Sopenharmony_ci return GL_SLUMINANCE_ALPHA; 1676bf215546Sopenharmony_ci default: 1677bf215546Sopenharmony_ci return format; 1678bf215546Sopenharmony_ci } 1679bf215546Sopenharmony_ci} 1680bf215546Sopenharmony_ci 1681bf215546Sopenharmony_ci 1682bf215546Sopenharmony_ci/** 1683bf215546Sopenharmony_ci * Return the equivalent non-generic internal format. 1684bf215546Sopenharmony_ci * This is useful for comparing whether two internal formats are equivalent. 1685bf215546Sopenharmony_ci */ 1686bf215546Sopenharmony_ciGLenum 1687bf215546Sopenharmony_ci_mesa_get_nongeneric_internalformat(GLenum format) 1688bf215546Sopenharmony_ci{ 1689bf215546Sopenharmony_ci switch (format) { 1690bf215546Sopenharmony_ci /* GL 1.1 formats. */ 1691bf215546Sopenharmony_ci case 4: 1692bf215546Sopenharmony_ci case GL_RGBA: 1693bf215546Sopenharmony_ci return GL_RGBA8; 1694bf215546Sopenharmony_ci case 3: 1695bf215546Sopenharmony_ci case GL_RGB: 1696bf215546Sopenharmony_ci return GL_RGB8; 1697bf215546Sopenharmony_ci case 2: 1698bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1699bf215546Sopenharmony_ci return GL_LUMINANCE8_ALPHA8; 1700bf215546Sopenharmony_ci case 1: 1701bf215546Sopenharmony_ci case GL_LUMINANCE: 1702bf215546Sopenharmony_ci return GL_LUMINANCE8; 1703bf215546Sopenharmony_ci case GL_ALPHA: 1704bf215546Sopenharmony_ci return GL_ALPHA8; 1705bf215546Sopenharmony_ci case GL_INTENSITY: 1706bf215546Sopenharmony_ci return GL_INTENSITY8; 1707bf215546Sopenharmony_ci 1708bf215546Sopenharmony_ci /* GL_ARB_texture_rg */ 1709bf215546Sopenharmony_ci case GL_RED: 1710bf215546Sopenharmony_ci return GL_R8; 1711bf215546Sopenharmony_ci case GL_RG: 1712bf215546Sopenharmony_ci return GL_RG8; 1713bf215546Sopenharmony_ci 1714bf215546Sopenharmony_ci /* GL_EXT_texture_sRGB */ 1715bf215546Sopenharmony_ci case GL_SRGB: 1716bf215546Sopenharmony_ci return GL_SRGB8; 1717bf215546Sopenharmony_ci case GL_SRGB_ALPHA: 1718bf215546Sopenharmony_ci return GL_SRGB8_ALPHA8; 1719bf215546Sopenharmony_ci case GL_SLUMINANCE: 1720bf215546Sopenharmony_ci return GL_SLUMINANCE8; 1721bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA: 1722bf215546Sopenharmony_ci return GL_SLUMINANCE8_ALPHA8; 1723bf215546Sopenharmony_ci 1724bf215546Sopenharmony_ci /* GL_EXT_texture_snorm */ 1725bf215546Sopenharmony_ci case GL_RGBA_SNORM: 1726bf215546Sopenharmony_ci return GL_RGBA8_SNORM; 1727bf215546Sopenharmony_ci case GL_RGB_SNORM: 1728bf215546Sopenharmony_ci return GL_RGB8_SNORM; 1729bf215546Sopenharmony_ci case GL_RG_SNORM: 1730bf215546Sopenharmony_ci return GL_RG8_SNORM; 1731bf215546Sopenharmony_ci case GL_RED_SNORM: 1732bf215546Sopenharmony_ci return GL_R8_SNORM; 1733bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_SNORM: 1734bf215546Sopenharmony_ci return GL_LUMINANCE8_ALPHA8_SNORM; 1735bf215546Sopenharmony_ci case GL_LUMINANCE_SNORM: 1736bf215546Sopenharmony_ci return GL_LUMINANCE8_SNORM; 1737bf215546Sopenharmony_ci case GL_ALPHA_SNORM: 1738bf215546Sopenharmony_ci return GL_ALPHA8_SNORM; 1739bf215546Sopenharmony_ci case GL_INTENSITY_SNORM: 1740bf215546Sopenharmony_ci return GL_INTENSITY8_SNORM; 1741bf215546Sopenharmony_ci 1742bf215546Sopenharmony_ci default: 1743bf215546Sopenharmony_ci return format; 1744bf215546Sopenharmony_ci } 1745bf215546Sopenharmony_ci} 1746bf215546Sopenharmony_ci 1747bf215546Sopenharmony_ci 1748bf215546Sopenharmony_ci/** 1749bf215546Sopenharmony_ci * Convert an sRGB internal format to linear. 1750bf215546Sopenharmony_ci */ 1751bf215546Sopenharmony_ciGLenum 1752bf215546Sopenharmony_ci_mesa_get_linear_internalformat(GLenum format) 1753bf215546Sopenharmony_ci{ 1754bf215546Sopenharmony_ci switch (format) { 1755bf215546Sopenharmony_ci case GL_SRGB: 1756bf215546Sopenharmony_ci return GL_RGB; 1757bf215546Sopenharmony_ci case GL_SRGB_ALPHA: 1758bf215546Sopenharmony_ci return GL_RGBA; 1759bf215546Sopenharmony_ci case GL_SRGB8: 1760bf215546Sopenharmony_ci return GL_RGB8; 1761bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8: 1762bf215546Sopenharmony_ci return GL_RGBA8; 1763bf215546Sopenharmony_ci case GL_SLUMINANCE8: 1764bf215546Sopenharmony_ci return GL_LUMINANCE8; 1765bf215546Sopenharmony_ci case GL_SLUMINANCE: 1766bf215546Sopenharmony_ci return GL_LUMINANCE; 1767bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA: 1768bf215546Sopenharmony_ci return GL_LUMINANCE_ALPHA; 1769bf215546Sopenharmony_ci case GL_SLUMINANCE8_ALPHA8: 1770bf215546Sopenharmony_ci return GL_LUMINANCE8_ALPHA8; 1771bf215546Sopenharmony_ci default: 1772bf215546Sopenharmony_ci return format; 1773bf215546Sopenharmony_ci } 1774bf215546Sopenharmony_ci} 1775bf215546Sopenharmony_ci 1776bf215546Sopenharmony_ci 1777bf215546Sopenharmony_ci/** 1778bf215546Sopenharmony_ci * Do error checking of format/type combinations for glReadPixels, 1779bf215546Sopenharmony_ci * glDrawPixels and glTex[Sub]Image. Note that depending on the format 1780bf215546Sopenharmony_ci * and type values, we may either generate GL_INVALID_OPERATION or 1781bf215546Sopenharmony_ci * GL_INVALID_ENUM. 1782bf215546Sopenharmony_ci * 1783bf215546Sopenharmony_ci * \param format pixel format. 1784bf215546Sopenharmony_ci * \param type pixel type. 1785bf215546Sopenharmony_ci * 1786bf215546Sopenharmony_ci * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR 1787bf215546Sopenharmony_ci */ 1788bf215546Sopenharmony_ciGLenum 1789bf215546Sopenharmony_ci_mesa_error_check_format_and_type(const struct gl_context *ctx, 1790bf215546Sopenharmony_ci GLenum format, GLenum type) 1791bf215546Sopenharmony_ci{ 1792bf215546Sopenharmony_ci /* From OpenGL 3.3 spec, page 220: 1793bf215546Sopenharmony_ci * "If the format is DEPTH_STENCIL, then values are taken from 1794bf215546Sopenharmony_ci * both the depth buffer and the stencil buffer. If there is no 1795bf215546Sopenharmony_ci * depth buffer or if there is no stencil buffer, then the error 1796bf215546Sopenharmony_ci * INVALID_OPERATION occurs. If the type parameter is not 1797bf215546Sopenharmony_ci * UNSIGNED_INT_24_8 or FLOAT_32_UNSIGNED_INT_24_8_REV, then the 1798bf215546Sopenharmony_ci * error INVALID_ENUM occurs." 1799bf215546Sopenharmony_ci * 1800bf215546Sopenharmony_ci * OpenGL ES still generates GL_INVALID_OPERATION because glReadPixels 1801bf215546Sopenharmony_ci * cannot be used to read depth or stencil in that API. 1802bf215546Sopenharmony_ci */ 1803bf215546Sopenharmony_ci if (_mesa_is_desktop_gl(ctx) && format == GL_DEPTH_STENCIL 1804bf215546Sopenharmony_ci && type != GL_UNSIGNED_INT_24_8 1805bf215546Sopenharmony_ci && type != GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 1806bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1807bf215546Sopenharmony_ci 1808bf215546Sopenharmony_ci /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ 1809bf215546Sopenharmony_ci switch (type) { 1810bf215546Sopenharmony_ci case GL_BITMAP: 1811bf215546Sopenharmony_ci if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1812bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1813bf215546Sopenharmony_ci } 1814bf215546Sopenharmony_ci break; 1815bf215546Sopenharmony_ci 1816bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 1817bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 1818bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 1819bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 1820bf215546Sopenharmony_ci if (format == GL_RGB) { 1821bf215546Sopenharmony_ci break; /* OK */ 1822bf215546Sopenharmony_ci } 1823bf215546Sopenharmony_ci if (format == GL_RGB_INTEGER_EXT && 1824bf215546Sopenharmony_ci _mesa_has_texture_rgb10_a2ui(ctx)) { 1825bf215546Sopenharmony_ci break; /* OK */ 1826bf215546Sopenharmony_ci } 1827bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1828bf215546Sopenharmony_ci 1829bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 1830bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1831bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 1832bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 1833bf215546Sopenharmony_ci if (format == GL_RGBA || 1834bf215546Sopenharmony_ci format == GL_BGRA || 1835bf215546Sopenharmony_ci format == GL_ABGR_EXT) { 1836bf215546Sopenharmony_ci break; /* OK */ 1837bf215546Sopenharmony_ci } 1838bf215546Sopenharmony_ci if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1839bf215546Sopenharmony_ci _mesa_has_texture_rgb10_a2ui(ctx)) { 1840bf215546Sopenharmony_ci break; /* OK */ 1841bf215546Sopenharmony_ci } 1842bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1843bf215546Sopenharmony_ci 1844bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 1845bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1846bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 1847bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 1848bf215546Sopenharmony_ci if (format == GL_RGBA || 1849bf215546Sopenharmony_ci format == GL_BGRA) { 1850bf215546Sopenharmony_ci break; /* OK */ 1851bf215546Sopenharmony_ci } 1852bf215546Sopenharmony_ci if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1853bf215546Sopenharmony_ci _mesa_has_texture_rgb10_a2ui(ctx)) { 1854bf215546Sopenharmony_ci break; /* OK */ 1855bf215546Sopenharmony_ci } 1856bf215546Sopenharmony_ci if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB && 1857bf215546Sopenharmony_ci ctx->API == API_OPENGLES2) { 1858bf215546Sopenharmony_ci break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1859bf215546Sopenharmony_ci } 1860bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1861bf215546Sopenharmony_ci 1862bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8: 1863bf215546Sopenharmony_ci /* Depth buffer OK to read in OpenGL ES (NV_read_depth). */ 1864bf215546Sopenharmony_ci if (ctx->API == API_OPENGLES2 && format == GL_DEPTH_COMPONENT) 1865bf215546Sopenharmony_ci return GL_NO_ERROR; 1866bf215546Sopenharmony_ci 1867bf215546Sopenharmony_ci if (format != GL_DEPTH_STENCIL) { 1868bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1869bf215546Sopenharmony_ci } 1870bf215546Sopenharmony_ci return GL_NO_ERROR; 1871bf215546Sopenharmony_ci 1872bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 1873bf215546Sopenharmony_ci if (!_mesa_has_float_depth_buffer(ctx)) { 1874bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1875bf215546Sopenharmony_ci } 1876bf215546Sopenharmony_ci if (format != GL_DEPTH_STENCIL) { 1877bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1878bf215546Sopenharmony_ci } 1879bf215546Sopenharmony_ci return GL_NO_ERROR; 1880bf215546Sopenharmony_ci 1881bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 1882bf215546Sopenharmony_ci if (!_mesa_has_packed_float(ctx)) { 1883bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1884bf215546Sopenharmony_ci } 1885bf215546Sopenharmony_ci if (format != GL_RGB) { 1886bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1887bf215546Sopenharmony_ci } 1888bf215546Sopenharmony_ci return GL_NO_ERROR; 1889bf215546Sopenharmony_ci 1890bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 1891bf215546Sopenharmony_ci switch (format) { 1892bf215546Sopenharmony_ci case GL_RGBA: 1893bf215546Sopenharmony_ci case GL_RGB: 1894bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1895bf215546Sopenharmony_ci case GL_LUMINANCE: 1896bf215546Sopenharmony_ci case GL_ALPHA: 1897bf215546Sopenharmony_ci return GL_NO_ERROR; 1898bf215546Sopenharmony_ci case GL_RG: 1899bf215546Sopenharmony_ci case GL_RED: 1900bf215546Sopenharmony_ci if (_mesa_has_rg_textures(ctx)) 1901bf215546Sopenharmony_ci return GL_NO_ERROR; 1902bf215546Sopenharmony_ci FALLTHROUGH; 1903bf215546Sopenharmony_ci default: 1904bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 1905bf215546Sopenharmony_ci } 1906bf215546Sopenharmony_ci 1907bf215546Sopenharmony_ci default: 1908bf215546Sopenharmony_ci ; /* fall-through */ 1909bf215546Sopenharmony_ci } 1910bf215546Sopenharmony_ci 1911bf215546Sopenharmony_ci /* now, for each format, check the type for compatibility */ 1912bf215546Sopenharmony_ci switch (format) { 1913bf215546Sopenharmony_ci case GL_COLOR_INDEX: 1914bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 1915bf215546Sopenharmony_ci switch (type) { 1916bf215546Sopenharmony_ci case GL_BITMAP: 1917bf215546Sopenharmony_ci case GL_BYTE: 1918bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 1919bf215546Sopenharmony_ci case GL_SHORT: 1920bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 1921bf215546Sopenharmony_ci case GL_INT: 1922bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 1923bf215546Sopenharmony_ci case GL_FLOAT: 1924bf215546Sopenharmony_ci case GL_HALF_FLOAT: 1925bf215546Sopenharmony_ci return GL_NO_ERROR; 1926bf215546Sopenharmony_ci default: 1927bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1928bf215546Sopenharmony_ci } 1929bf215546Sopenharmony_ci 1930bf215546Sopenharmony_ci case GL_RED: 1931bf215546Sopenharmony_ci case GL_GREEN: 1932bf215546Sopenharmony_ci case GL_BLUE: 1933bf215546Sopenharmony_ci case GL_ALPHA: 1934bf215546Sopenharmony_ci#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 1935bf215546Sopenharmony_ci case GL_INTENSITY: 1936bf215546Sopenharmony_ci#endif 1937bf215546Sopenharmony_ci case GL_LUMINANCE: 1938bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 1939bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 1940bf215546Sopenharmony_ci switch (type) { 1941bf215546Sopenharmony_ci case GL_BYTE: 1942bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 1943bf215546Sopenharmony_ci case GL_SHORT: 1944bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 1945bf215546Sopenharmony_ci case GL_INT: 1946bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 1947bf215546Sopenharmony_ci case GL_FLOAT: 1948bf215546Sopenharmony_ci case GL_HALF_FLOAT: 1949bf215546Sopenharmony_ci return GL_NO_ERROR; 1950bf215546Sopenharmony_ci default: 1951bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1952bf215546Sopenharmony_ci } 1953bf215546Sopenharmony_ci 1954bf215546Sopenharmony_ci case GL_RG: 1955bf215546Sopenharmony_ci if (!_mesa_has_rg_textures(ctx)) 1956bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1957bf215546Sopenharmony_ci switch (type) { 1958bf215546Sopenharmony_ci case GL_BYTE: 1959bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 1960bf215546Sopenharmony_ci case GL_SHORT: 1961bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 1962bf215546Sopenharmony_ci case GL_INT: 1963bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 1964bf215546Sopenharmony_ci case GL_FLOAT: 1965bf215546Sopenharmony_ci case GL_HALF_FLOAT: 1966bf215546Sopenharmony_ci return GL_NO_ERROR; 1967bf215546Sopenharmony_ci default: 1968bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1969bf215546Sopenharmony_ci } 1970bf215546Sopenharmony_ci 1971bf215546Sopenharmony_ci case GL_RGB: 1972bf215546Sopenharmony_ci switch (type) { 1973bf215546Sopenharmony_ci case GL_BYTE: 1974bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 1975bf215546Sopenharmony_ci case GL_SHORT: 1976bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 1977bf215546Sopenharmony_ci case GL_INT: 1978bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 1979bf215546Sopenharmony_ci case GL_FLOAT: 1980bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 1981bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 1982bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 1983bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 1984bf215546Sopenharmony_ci case GL_HALF_FLOAT: 1985bf215546Sopenharmony_ci return GL_NO_ERROR; 1986bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 1987bf215546Sopenharmony_ci /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1988bf215546Sopenharmony_ci return (ctx->API == API_OPENGLES2) 1989bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 1990bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 1991bf215546Sopenharmony_ci return _mesa_has_texture_shared_exponent(ctx) 1992bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 1993bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 1994bf215546Sopenharmony_ci return _mesa_has_packed_float(ctx) 1995bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 1996bf215546Sopenharmony_ci default: 1997bf215546Sopenharmony_ci return GL_INVALID_ENUM; 1998bf215546Sopenharmony_ci } 1999bf215546Sopenharmony_ci 2000bf215546Sopenharmony_ci case GL_BGR: 2001bf215546Sopenharmony_ci switch (type) { 2002bf215546Sopenharmony_ci /* NOTE: no packed types are supported with BGR. That's 2003bf215546Sopenharmony_ci * intentional, according to the GL spec. 2004bf215546Sopenharmony_ci */ 2005bf215546Sopenharmony_ci case GL_BYTE: 2006bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2007bf215546Sopenharmony_ci case GL_SHORT: 2008bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2009bf215546Sopenharmony_ci case GL_INT: 2010bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2011bf215546Sopenharmony_ci case GL_FLOAT: 2012bf215546Sopenharmony_ci case GL_HALF_FLOAT: 2013bf215546Sopenharmony_ci return GL_NO_ERROR; 2014bf215546Sopenharmony_ci default: 2015bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2016bf215546Sopenharmony_ci } 2017bf215546Sopenharmony_ci 2018bf215546Sopenharmony_ci case GL_RGBA: 2019bf215546Sopenharmony_ci case GL_BGRA: 2020bf215546Sopenharmony_ci switch (type) { 2021bf215546Sopenharmony_ci case GL_BYTE: 2022bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2023bf215546Sopenharmony_ci case GL_SHORT: 2024bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2025bf215546Sopenharmony_ci case GL_INT: 2026bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2027bf215546Sopenharmony_ci case GL_FLOAT: 2028bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 2029bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2030bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 2031bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2032bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 2033bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 2034bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 2035bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 2036bf215546Sopenharmony_ci case GL_HALF_FLOAT: 2037bf215546Sopenharmony_ci return GL_NO_ERROR; 2038bf215546Sopenharmony_ci default: 2039bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2040bf215546Sopenharmony_ci } 2041bf215546Sopenharmony_ci 2042bf215546Sopenharmony_ci case GL_ABGR_EXT: 2043bf215546Sopenharmony_ci switch (type) { 2044bf215546Sopenharmony_ci case GL_BYTE: 2045bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2046bf215546Sopenharmony_ci case GL_SHORT: 2047bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2048bf215546Sopenharmony_ci case GL_INT: 2049bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2050bf215546Sopenharmony_ci case GL_FLOAT: 2051bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 2052bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2053bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 2054bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 2055bf215546Sopenharmony_ci case GL_HALF_FLOAT: 2056bf215546Sopenharmony_ci return GL_NO_ERROR; 2057bf215546Sopenharmony_ci default: 2058bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2059bf215546Sopenharmony_ci } 2060bf215546Sopenharmony_ci 2061bf215546Sopenharmony_ci case GL_YCBCR_MESA: 2062bf215546Sopenharmony_ci if (!_mesa_has_MESA_ycbcr_texture(ctx)) 2063bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2064bf215546Sopenharmony_ci if (type == GL_UNSIGNED_SHORT_8_8_MESA || 2065bf215546Sopenharmony_ci type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 2066bf215546Sopenharmony_ci return GL_NO_ERROR; 2067bf215546Sopenharmony_ci else 2068bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 2069bf215546Sopenharmony_ci 2070bf215546Sopenharmony_ci case GL_DEPTH_STENCIL: 2071bf215546Sopenharmony_ci if (type == GL_UNSIGNED_INT_24_8) 2072bf215546Sopenharmony_ci return GL_NO_ERROR; 2073bf215546Sopenharmony_ci else if (_mesa_has_float_depth_buffer(ctx) && 2074bf215546Sopenharmony_ci type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 2075bf215546Sopenharmony_ci return GL_NO_ERROR; 2076bf215546Sopenharmony_ci else 2077bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2078bf215546Sopenharmony_ci 2079bf215546Sopenharmony_ci /* integer-valued formats */ 2080bf215546Sopenharmony_ci case GL_RED_INTEGER_EXT: 2081bf215546Sopenharmony_ci case GL_GREEN_INTEGER_EXT: 2082bf215546Sopenharmony_ci case GL_BLUE_INTEGER_EXT: 2083bf215546Sopenharmony_ci case GL_ALPHA_INTEGER_EXT: 2084bf215546Sopenharmony_ci case GL_RG_INTEGER: 2085bf215546Sopenharmony_ci switch (type) { 2086bf215546Sopenharmony_ci case GL_BYTE: 2087bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2088bf215546Sopenharmony_ci case GL_SHORT: 2089bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2090bf215546Sopenharmony_ci case GL_INT: 2091bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2092bf215546Sopenharmony_ci return _mesa_has_integer_textures(ctx) 2093bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2094bf215546Sopenharmony_ci default: 2095bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2096bf215546Sopenharmony_ci } 2097bf215546Sopenharmony_ci 2098bf215546Sopenharmony_ci case GL_RGB_INTEGER_EXT: 2099bf215546Sopenharmony_ci switch (type) { 2100bf215546Sopenharmony_ci case GL_BYTE: 2101bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2102bf215546Sopenharmony_ci case GL_SHORT: 2103bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2104bf215546Sopenharmony_ci case GL_INT: 2105bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2106bf215546Sopenharmony_ci return _mesa_has_integer_textures(ctx) 2107bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2108bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 2109bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 2110bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 2111bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 2112bf215546Sopenharmony_ci return _mesa_has_texture_rgb10_a2ui(ctx) 2113bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2114bf215546Sopenharmony_ci default: 2115bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2116bf215546Sopenharmony_ci } 2117bf215546Sopenharmony_ci 2118bf215546Sopenharmony_ci case GL_BGR_INTEGER_EXT: 2119bf215546Sopenharmony_ci switch (type) { 2120bf215546Sopenharmony_ci case GL_BYTE: 2121bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2122bf215546Sopenharmony_ci case GL_SHORT: 2123bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2124bf215546Sopenharmony_ci case GL_INT: 2125bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2126bf215546Sopenharmony_ci /* NOTE: no packed formats w/ BGR format */ 2127bf215546Sopenharmony_ci return _mesa_has_integer_textures(ctx) 2128bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2129bf215546Sopenharmony_ci default: 2130bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2131bf215546Sopenharmony_ci } 2132bf215546Sopenharmony_ci 2133bf215546Sopenharmony_ci case GL_RGBA_INTEGER_EXT: 2134bf215546Sopenharmony_ci case GL_BGRA_INTEGER_EXT: 2135bf215546Sopenharmony_ci switch (type) { 2136bf215546Sopenharmony_ci case GL_BYTE: 2137bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2138bf215546Sopenharmony_ci case GL_SHORT: 2139bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2140bf215546Sopenharmony_ci case GL_INT: 2141bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2142bf215546Sopenharmony_ci return _mesa_has_integer_textures(ctx) 2143bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2144bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 2145bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2146bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 2147bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2148bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 2149bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 2150bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 2151bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 2152bf215546Sopenharmony_ci return _mesa_has_texture_rgb10_a2ui(ctx) 2153bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2154bf215546Sopenharmony_ci default: 2155bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2156bf215546Sopenharmony_ci } 2157bf215546Sopenharmony_ci 2158bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 2159bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2160bf215546Sopenharmony_ci switch (type) { 2161bf215546Sopenharmony_ci case GL_BYTE: 2162bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2163bf215546Sopenharmony_ci case GL_SHORT: 2164bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2165bf215546Sopenharmony_ci case GL_INT: 2166bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2167bf215546Sopenharmony_ci return _mesa_has_integer_textures(ctx) 2168bf215546Sopenharmony_ci ? GL_NO_ERROR : GL_INVALID_ENUM; 2169bf215546Sopenharmony_ci default: 2170bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2171bf215546Sopenharmony_ci } 2172bf215546Sopenharmony_ci 2173bf215546Sopenharmony_ci default: 2174bf215546Sopenharmony_ci return GL_INVALID_ENUM; 2175bf215546Sopenharmony_ci } 2176bf215546Sopenharmony_ci return GL_NO_ERROR; 2177bf215546Sopenharmony_ci} 2178bf215546Sopenharmony_ci 2179bf215546Sopenharmony_ci 2180bf215546Sopenharmony_ci/** 2181bf215546Sopenharmony_ci * Do error checking of format/type combinations for OpenGL ES glReadPixels 2182bf215546Sopenharmony_ci * and glTex[Sub]Image. 2183bf215546Sopenharmony_ci * \return error code, or GL_NO_ERROR. 2184bf215546Sopenharmony_ci */ 2185bf215546Sopenharmony_ciGLenum 2186bf215546Sopenharmony_ci_mesa_es_error_check_format_and_type(const struct gl_context *ctx, 2187bf215546Sopenharmony_ci GLenum format, GLenum type, 2188bf215546Sopenharmony_ci unsigned dimensions) 2189bf215546Sopenharmony_ci{ 2190bf215546Sopenharmony_ci GLboolean type_valid = GL_TRUE; 2191bf215546Sopenharmony_ci 2192bf215546Sopenharmony_ci switch (format) { 2193bf215546Sopenharmony_ci case GL_RED: 2194bf215546Sopenharmony_ci case GL_RG: 2195bf215546Sopenharmony_ci if (!_mesa_has_rg_textures(ctx)) 2196bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2197bf215546Sopenharmony_ci FALLTHROUGH; 2198bf215546Sopenharmony_ci case GL_ALPHA: 2199bf215546Sopenharmony_ci case GL_LUMINANCE: 2200bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 2201bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_BYTE 2202bf215546Sopenharmony_ci || type == GL_FLOAT 2203bf215546Sopenharmony_ci || type == GL_HALF_FLOAT_OES); 2204bf215546Sopenharmony_ci break; 2205bf215546Sopenharmony_ci 2206bf215546Sopenharmony_ci case GL_RGB: 2207bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_BYTE 2208bf215546Sopenharmony_ci || type == GL_UNSIGNED_SHORT_5_6_5 2209bf215546Sopenharmony_ci || type == GL_FLOAT 2210bf215546Sopenharmony_ci || type == GL_HALF_FLOAT_OES); 2211bf215546Sopenharmony_ci break; 2212bf215546Sopenharmony_ci 2213bf215546Sopenharmony_ci case GL_RGBA: 2214bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_BYTE 2215bf215546Sopenharmony_ci || type == GL_UNSIGNED_SHORT_4_4_4_4 2216bf215546Sopenharmony_ci || type == GL_UNSIGNED_SHORT_5_5_5_1 2217bf215546Sopenharmony_ci || type == GL_FLOAT 2218bf215546Sopenharmony_ci || type == GL_HALF_FLOAT_OES 2219bf215546Sopenharmony_ci || (_mesa_has_texture_type_2_10_10_10_REV(ctx) && 2220bf215546Sopenharmony_ci type == GL_UNSIGNED_INT_2_10_10_10_REV)); 2221bf215546Sopenharmony_ci break; 2222bf215546Sopenharmony_ci 2223bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 2224bf215546Sopenharmony_ci /* This format is filtered against invalid dimensionalities elsewhere. 2225bf215546Sopenharmony_ci */ 2226bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_SHORT 2227bf215546Sopenharmony_ci || type == GL_UNSIGNED_INT); 2228bf215546Sopenharmony_ci break; 2229bf215546Sopenharmony_ci 2230bf215546Sopenharmony_ci case GL_DEPTH_STENCIL: 2231bf215546Sopenharmony_ci /* This format is filtered against invalid dimensionalities elsewhere. 2232bf215546Sopenharmony_ci */ 2233bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_INT_24_8); 2234bf215546Sopenharmony_ci break; 2235bf215546Sopenharmony_ci 2236bf215546Sopenharmony_ci case GL_BGRA_EXT: 2237bf215546Sopenharmony_ci type_valid = (type == GL_UNSIGNED_BYTE); 2238bf215546Sopenharmony_ci 2239bf215546Sopenharmony_ci /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but 2240bf215546Sopenharmony_ci * the format does not appear to be allowed for 3D textures in OpenGL 2241bf215546Sopenharmony_ci * ES. 2242bf215546Sopenharmony_ci */ 2243bf215546Sopenharmony_ci if (dimensions != 2) 2244bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2245bf215546Sopenharmony_ci 2246bf215546Sopenharmony_ci break; 2247bf215546Sopenharmony_ci 2248bf215546Sopenharmony_ci default: 2249bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2250bf215546Sopenharmony_ci } 2251bf215546Sopenharmony_ci 2252bf215546Sopenharmony_ci return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 2253bf215546Sopenharmony_ci} 2254bf215546Sopenharmony_ci 2255bf215546Sopenharmony_ci/** 2256bf215546Sopenharmony_ci * Return the simple base format for a given internal texture format. 2257bf215546Sopenharmony_ci * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 2258bf215546Sopenharmony_ci * 2259bf215546Sopenharmony_ci * \param ctx GL context. 2260bf215546Sopenharmony_ci * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 2261bf215546Sopenharmony_ci * 2262bf215546Sopenharmony_ci * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 2263bf215546Sopenharmony_ci * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 2264bf215546Sopenharmony_ci * 2265bf215546Sopenharmony_ci * This is the format which is used during texture application (i.e. the 2266bf215546Sopenharmony_ci * texture format and env mode determine the arithmetic used. 2267bf215546Sopenharmony_ci */ 2268bf215546Sopenharmony_ciGLint 2269bf215546Sopenharmony_ci_mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) 2270bf215546Sopenharmony_ci{ 2271bf215546Sopenharmony_ci switch (internalFormat) { 2272bf215546Sopenharmony_ci case GL_ALPHA: 2273bf215546Sopenharmony_ci case GL_ALPHA4: 2274bf215546Sopenharmony_ci case GL_ALPHA8: 2275bf215546Sopenharmony_ci case GL_ALPHA12: 2276bf215546Sopenharmony_ci case GL_ALPHA16: 2277bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2278bf215546Sopenharmony_ci case 1: 2279bf215546Sopenharmony_ci case GL_LUMINANCE: 2280bf215546Sopenharmony_ci case GL_LUMINANCE4: 2281bf215546Sopenharmony_ci case GL_LUMINANCE8: 2282bf215546Sopenharmony_ci case GL_LUMINANCE12: 2283bf215546Sopenharmony_ci case GL_LUMINANCE16: 2284bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2285bf215546Sopenharmony_ci case 2: 2286bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 2287bf215546Sopenharmony_ci case GL_LUMINANCE4_ALPHA4: 2288bf215546Sopenharmony_ci case GL_LUMINANCE6_ALPHA2: 2289bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8: 2290bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA4: 2291bf215546Sopenharmony_ci case GL_LUMINANCE12_ALPHA12: 2292bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16: 2293bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2294bf215546Sopenharmony_ci case GL_INTENSITY: 2295bf215546Sopenharmony_ci case GL_INTENSITY4: 2296bf215546Sopenharmony_ci case GL_INTENSITY8: 2297bf215546Sopenharmony_ci case GL_INTENSITY12: 2298bf215546Sopenharmony_ci case GL_INTENSITY16: 2299bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2300bf215546Sopenharmony_ci case 3: 2301bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1; 2302bf215546Sopenharmony_ci case GL_RGB: 2303bf215546Sopenharmony_ci case GL_R3_G3_B2: 2304bf215546Sopenharmony_ci case GL_RGB4: 2305bf215546Sopenharmony_ci case GL_RGB5: 2306bf215546Sopenharmony_ci case GL_RGB8: 2307bf215546Sopenharmony_ci case GL_RGB10: 2308bf215546Sopenharmony_ci case GL_RGB12: 2309bf215546Sopenharmony_ci case GL_RGB16: 2310bf215546Sopenharmony_ci return GL_RGB; 2311bf215546Sopenharmony_ci case 4: 2312bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1; 2313bf215546Sopenharmony_ci case GL_RGBA: 2314bf215546Sopenharmony_ci case GL_RGBA2: 2315bf215546Sopenharmony_ci case GL_RGBA4: 2316bf215546Sopenharmony_ci case GL_RGB5_A1: 2317bf215546Sopenharmony_ci case GL_RGBA8: 2318bf215546Sopenharmony_ci case GL_RGB10_A2: 2319bf215546Sopenharmony_ci case GL_RGBA12: 2320bf215546Sopenharmony_ci case GL_RGBA16: 2321bf215546Sopenharmony_ci return GL_RGBA; 2322bf215546Sopenharmony_ci default: 2323bf215546Sopenharmony_ci ; /* fallthrough */ 2324bf215546Sopenharmony_ci } 2325bf215546Sopenharmony_ci 2326bf215546Sopenharmony_ci /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 2327bf215546Sopenharmony_ci */ 2328bf215546Sopenharmony_ci if (_mesa_is_gles(ctx)) { 2329bf215546Sopenharmony_ci switch (internalFormat) { 2330bf215546Sopenharmony_ci case GL_BGRA: 2331bf215546Sopenharmony_ci return GL_RGBA; 2332bf215546Sopenharmony_ci default: 2333bf215546Sopenharmony_ci ; /* fallthrough */ 2334bf215546Sopenharmony_ci } 2335bf215546Sopenharmony_ci } 2336bf215546Sopenharmony_ci 2337bf215546Sopenharmony_ci if (_mesa_has_ARB_ES2_compatibility(ctx) || 2338bf215546Sopenharmony_ci _mesa_has_OES_framebuffer_object(ctx) || 2339bf215546Sopenharmony_ci ctx->API == API_OPENGLES2) { 2340bf215546Sopenharmony_ci switch (internalFormat) { 2341bf215546Sopenharmony_ci case GL_RGB565: 2342bf215546Sopenharmony_ci return GL_RGB; 2343bf215546Sopenharmony_ci default: 2344bf215546Sopenharmony_ci ; /* fallthrough */ 2345bf215546Sopenharmony_ci } 2346bf215546Sopenharmony_ci } 2347bf215546Sopenharmony_ci 2348bf215546Sopenharmony_ci if (ctx->API != API_OPENGLES) { 2349bf215546Sopenharmony_ci switch (internalFormat) { 2350bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 2351bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT16: 2352bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT24: 2353bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32: 2354bf215546Sopenharmony_ci return GL_DEPTH_COMPONENT; 2355bf215546Sopenharmony_ci case GL_DEPTH_STENCIL: 2356bf215546Sopenharmony_ci case GL_DEPTH24_STENCIL8: 2357bf215546Sopenharmony_ci return GL_DEPTH_STENCIL; 2358bf215546Sopenharmony_ci default: 2359bf215546Sopenharmony_ci ; /* fallthrough */ 2360bf215546Sopenharmony_ci } 2361bf215546Sopenharmony_ci } 2362bf215546Sopenharmony_ci 2363bf215546Sopenharmony_ci if (_mesa_has_ARB_texture_stencil8(ctx) || 2364bf215546Sopenharmony_ci _mesa_has_OES_texture_stencil8(ctx)) { 2365bf215546Sopenharmony_ci switch (internalFormat) { 2366bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 2367bf215546Sopenharmony_ci case GL_STENCIL_INDEX1: 2368bf215546Sopenharmony_ci case GL_STENCIL_INDEX4: 2369bf215546Sopenharmony_ci case GL_STENCIL_INDEX8: 2370bf215546Sopenharmony_ci case GL_STENCIL_INDEX16: 2371bf215546Sopenharmony_ci return GL_STENCIL_INDEX; 2372bf215546Sopenharmony_ci default: 2373bf215546Sopenharmony_ci ; /* fallthrough */ 2374bf215546Sopenharmony_ci } 2375bf215546Sopenharmony_ci } 2376bf215546Sopenharmony_ci 2377bf215546Sopenharmony_ci switch (internalFormat) { 2378bf215546Sopenharmony_ci case GL_COMPRESSED_ALPHA: 2379bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2380bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE: 2381bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2382bf215546Sopenharmony_ci case GL_COMPRESSED_LUMINANCE_ALPHA: 2383bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2384bf215546Sopenharmony_ci case GL_COMPRESSED_INTENSITY: 2385bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2386bf215546Sopenharmony_ci case GL_COMPRESSED_RGB: 2387bf215546Sopenharmony_ci return GL_RGB; 2388bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA: 2389bf215546Sopenharmony_ci return GL_RGBA; 2390bf215546Sopenharmony_ci default: 2391bf215546Sopenharmony_ci ; /* fallthrough */ 2392bf215546Sopenharmony_ci } 2393bf215546Sopenharmony_ci 2394bf215546Sopenharmony_ci if (_mesa_is_compressed_format(ctx, internalFormat)) { 2395bf215546Sopenharmony_ci GLenum base_compressed = 2396bf215546Sopenharmony_ci _mesa_gl_compressed_format_base_format(internalFormat); 2397bf215546Sopenharmony_ci if (base_compressed) 2398bf215546Sopenharmony_ci return base_compressed; 2399bf215546Sopenharmony_ci } 2400bf215546Sopenharmony_ci 2401bf215546Sopenharmony_ci if ((_mesa_has_KHR_texture_compression_astc_ldr(ctx) && 2402bf215546Sopenharmony_ci is_astc_2d_format(internalFormat)) || 2403bf215546Sopenharmony_ci (_mesa_has_OES_texture_compression_astc(ctx) && 2404bf215546Sopenharmony_ci is_astc_3d_format(internalFormat))) 2405bf215546Sopenharmony_ci return GL_RGBA; 2406bf215546Sopenharmony_ci 2407bf215546Sopenharmony_ci if (_mesa_has_MESA_ycbcr_texture(ctx)) { 2408bf215546Sopenharmony_ci if (internalFormat == GL_YCBCR_MESA) 2409bf215546Sopenharmony_ci return GL_YCBCR_MESA; 2410bf215546Sopenharmony_ci } 2411bf215546Sopenharmony_ci 2412bf215546Sopenharmony_ci if (_mesa_has_half_float_textures(ctx)) { 2413bf215546Sopenharmony_ci switch (internalFormat) { 2414bf215546Sopenharmony_ci case GL_ALPHA16F_ARB: 2415bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2416bf215546Sopenharmony_ci case GL_RGBA16F_ARB: 2417bf215546Sopenharmony_ci return GL_RGBA; 2418bf215546Sopenharmony_ci case GL_RGB16F_ARB: 2419bf215546Sopenharmony_ci return GL_RGB; 2420bf215546Sopenharmony_ci case GL_INTENSITY16F_ARB: 2421bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2422bf215546Sopenharmony_ci case GL_LUMINANCE16F_ARB: 2423bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2424bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16F_ARB: 2425bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2426bf215546Sopenharmony_ci } 2427bf215546Sopenharmony_ci } 2428bf215546Sopenharmony_ci 2429bf215546Sopenharmony_ci if (_mesa_has_float_textures(ctx)) { 2430bf215546Sopenharmony_ci switch (internalFormat) { 2431bf215546Sopenharmony_ci case GL_ALPHA32F_ARB: 2432bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2433bf215546Sopenharmony_ci case GL_RGBA32F_ARB: 2434bf215546Sopenharmony_ci return GL_RGBA; 2435bf215546Sopenharmony_ci case GL_RGB32F_ARB: 2436bf215546Sopenharmony_ci return GL_RGB; 2437bf215546Sopenharmony_ci case GL_INTENSITY32F_ARB: 2438bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2439bf215546Sopenharmony_ci case GL_LUMINANCE32F_ARB: 2440bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2441bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32F_ARB: 2442bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2443bf215546Sopenharmony_ci } 2444bf215546Sopenharmony_ci } 2445bf215546Sopenharmony_ci 2446bf215546Sopenharmony_ci if (_mesa_has_EXT_texture_snorm(ctx) || _mesa_is_gles3(ctx)) { 2447bf215546Sopenharmony_ci switch (internalFormat) { 2448bf215546Sopenharmony_ci case GL_RED_SNORM: 2449bf215546Sopenharmony_ci case GL_R8_SNORM: 2450bf215546Sopenharmony_ci case GL_R16_SNORM: 2451bf215546Sopenharmony_ci return GL_RED; 2452bf215546Sopenharmony_ci case GL_RG_SNORM: 2453bf215546Sopenharmony_ci case GL_RG8_SNORM: 2454bf215546Sopenharmony_ci case GL_RG16_SNORM: 2455bf215546Sopenharmony_ci return GL_RG; 2456bf215546Sopenharmony_ci case GL_RGB_SNORM: 2457bf215546Sopenharmony_ci case GL_RGB8_SNORM: 2458bf215546Sopenharmony_ci case GL_RGB16_SNORM: 2459bf215546Sopenharmony_ci return GL_RGB; 2460bf215546Sopenharmony_ci case GL_RGBA_SNORM: 2461bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 2462bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 2463bf215546Sopenharmony_ci return GL_RGBA; 2464bf215546Sopenharmony_ci case GL_ALPHA_SNORM: 2465bf215546Sopenharmony_ci case GL_ALPHA8_SNORM: 2466bf215546Sopenharmony_ci case GL_ALPHA16_SNORM: 2467bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2468bf215546Sopenharmony_ci case GL_LUMINANCE_SNORM: 2469bf215546Sopenharmony_ci case GL_LUMINANCE8_SNORM: 2470bf215546Sopenharmony_ci case GL_LUMINANCE16_SNORM: 2471bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2472bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_SNORM: 2473bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8_SNORM: 2474bf215546Sopenharmony_ci case GL_LUMINANCE16_ALPHA16_SNORM: 2475bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2476bf215546Sopenharmony_ci case GL_INTENSITY_SNORM: 2477bf215546Sopenharmony_ci case GL_INTENSITY8_SNORM: 2478bf215546Sopenharmony_ci case GL_INTENSITY16_SNORM: 2479bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2480bf215546Sopenharmony_ci default: 2481bf215546Sopenharmony_ci ; /* fallthrough */ 2482bf215546Sopenharmony_ci } 2483bf215546Sopenharmony_ci } 2484bf215546Sopenharmony_ci 2485bf215546Sopenharmony_ci if (_mesa_has_EXT_texture_sRGB(ctx) || _mesa_is_gles3(ctx)) { 2486bf215546Sopenharmony_ci switch (internalFormat) { 2487bf215546Sopenharmony_ci case GL_SRGB_EXT: 2488bf215546Sopenharmony_ci case GL_SRGB8_EXT: 2489bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_EXT: 2490bf215546Sopenharmony_ci return GL_RGB; 2491bf215546Sopenharmony_ci case GL_SRGB_ALPHA_EXT: 2492bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8_EXT: 2493bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_EXT: 2494bf215546Sopenharmony_ci return GL_RGBA; 2495bf215546Sopenharmony_ci case GL_SLUMINANCE_ALPHA_EXT: 2496bf215546Sopenharmony_ci case GL_SLUMINANCE8_ALPHA8_EXT: 2497bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 2498bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2499bf215546Sopenharmony_ci case GL_SLUMINANCE_EXT: 2500bf215546Sopenharmony_ci case GL_SLUMINANCE8_EXT: 2501bf215546Sopenharmony_ci case GL_COMPRESSED_SLUMINANCE_EXT: 2502bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2503bf215546Sopenharmony_ci default: 2504bf215546Sopenharmony_ci ; /* fallthrough */ 2505bf215546Sopenharmony_ci } 2506bf215546Sopenharmony_ci } 2507bf215546Sopenharmony_ci 2508bf215546Sopenharmony_ci if (_mesa_has_EXT_texture_sRGB_R8(ctx)) { 2509bf215546Sopenharmony_ci switch (internalFormat) { 2510bf215546Sopenharmony_ci case GL_SR8_EXT: 2511bf215546Sopenharmony_ci return GL_RED; 2512bf215546Sopenharmony_ci default: 2513bf215546Sopenharmony_ci ; /* fallthrough */ 2514bf215546Sopenharmony_ci } 2515bf215546Sopenharmony_ci } 2516bf215546Sopenharmony_ci 2517bf215546Sopenharmony_ci if (_mesa_has_EXT_texture_sRGB_RG8(ctx)) { 2518bf215546Sopenharmony_ci switch (internalFormat) { 2519bf215546Sopenharmony_ci case GL_SRG8_EXT: 2520bf215546Sopenharmony_ci return GL_RG; 2521bf215546Sopenharmony_ci default: 2522bf215546Sopenharmony_ci ; /* fallthrough */ 2523bf215546Sopenharmony_ci } 2524bf215546Sopenharmony_ci } 2525bf215546Sopenharmony_ci 2526bf215546Sopenharmony_ci if (_mesa_has_integer_textures(ctx)) { 2527bf215546Sopenharmony_ci switch (internalFormat) { 2528bf215546Sopenharmony_ci case GL_RGBA8UI_EXT: 2529bf215546Sopenharmony_ci case GL_RGBA16UI_EXT: 2530bf215546Sopenharmony_ci case GL_RGBA32UI_EXT: 2531bf215546Sopenharmony_ci case GL_RGBA8I_EXT: 2532bf215546Sopenharmony_ci case GL_RGBA16I_EXT: 2533bf215546Sopenharmony_ci case GL_RGBA32I_EXT: 2534bf215546Sopenharmony_ci return GL_RGBA; 2535bf215546Sopenharmony_ci case GL_RGB8UI_EXT: 2536bf215546Sopenharmony_ci case GL_RGB16UI_EXT: 2537bf215546Sopenharmony_ci case GL_RGB32UI_EXT: 2538bf215546Sopenharmony_ci case GL_RGB8I_EXT: 2539bf215546Sopenharmony_ci case GL_RGB16I_EXT: 2540bf215546Sopenharmony_ci case GL_RGB32I_EXT: 2541bf215546Sopenharmony_ci return GL_RGB; 2542bf215546Sopenharmony_ci } 2543bf215546Sopenharmony_ci } 2544bf215546Sopenharmony_ci 2545bf215546Sopenharmony_ci if (_mesa_has_texture_rgb10_a2ui(ctx)) { 2546bf215546Sopenharmony_ci switch (internalFormat) { 2547bf215546Sopenharmony_ci case GL_RGB10_A2UI: 2548bf215546Sopenharmony_ci return GL_RGBA; 2549bf215546Sopenharmony_ci } 2550bf215546Sopenharmony_ci } 2551bf215546Sopenharmony_ci 2552bf215546Sopenharmony_ci if (_mesa_has_integer_textures(ctx)) { 2553bf215546Sopenharmony_ci switch (internalFormat) { 2554bf215546Sopenharmony_ci case GL_ALPHA8UI_EXT: 2555bf215546Sopenharmony_ci case GL_ALPHA16UI_EXT: 2556bf215546Sopenharmony_ci case GL_ALPHA32UI_EXT: 2557bf215546Sopenharmony_ci case GL_ALPHA8I_EXT: 2558bf215546Sopenharmony_ci case GL_ALPHA16I_EXT: 2559bf215546Sopenharmony_ci case GL_ALPHA32I_EXT: 2560bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2561bf215546Sopenharmony_ci case GL_INTENSITY8UI_EXT: 2562bf215546Sopenharmony_ci case GL_INTENSITY16UI_EXT: 2563bf215546Sopenharmony_ci case GL_INTENSITY32UI_EXT: 2564bf215546Sopenharmony_ci case GL_INTENSITY8I_EXT: 2565bf215546Sopenharmony_ci case GL_INTENSITY16I_EXT: 2566bf215546Sopenharmony_ci case GL_INTENSITY32I_EXT: 2567bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2568bf215546Sopenharmony_ci case GL_LUMINANCE8UI_EXT: 2569bf215546Sopenharmony_ci case GL_LUMINANCE16UI_EXT: 2570bf215546Sopenharmony_ci case GL_LUMINANCE32UI_EXT: 2571bf215546Sopenharmony_ci case GL_LUMINANCE8I_EXT: 2572bf215546Sopenharmony_ci case GL_LUMINANCE16I_EXT: 2573bf215546Sopenharmony_ci case GL_LUMINANCE32I_EXT: 2574bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2575bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8UI_EXT: 2576bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16UI_EXT: 2577bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32UI_EXT: 2578bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA8I_EXT: 2579bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA16I_EXT: 2580bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA32I_EXT: 2581bf215546Sopenharmony_ci return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2582bf215546Sopenharmony_ci default: 2583bf215546Sopenharmony_ci ; /* fallthrough */ 2584bf215546Sopenharmony_ci } 2585bf215546Sopenharmony_ci } 2586bf215546Sopenharmony_ci 2587bf215546Sopenharmony_ci if (_mesa_has_rg_textures(ctx)) { 2588bf215546Sopenharmony_ci switch (internalFormat) { 2589bf215546Sopenharmony_ci case GL_R16F: 2590bf215546Sopenharmony_ci if (!_mesa_has_half_float_textures(ctx)) 2591bf215546Sopenharmony_ci break; 2592bf215546Sopenharmony_ci return GL_RED; 2593bf215546Sopenharmony_ci case GL_R32F: 2594bf215546Sopenharmony_ci if (!_mesa_has_float_textures(ctx)) 2595bf215546Sopenharmony_ci break; 2596bf215546Sopenharmony_ci return GL_RED; 2597bf215546Sopenharmony_ci case GL_R8I: 2598bf215546Sopenharmony_ci case GL_R8UI: 2599bf215546Sopenharmony_ci case GL_R16I: 2600bf215546Sopenharmony_ci case GL_R16UI: 2601bf215546Sopenharmony_ci case GL_R32I: 2602bf215546Sopenharmony_ci case GL_R32UI: 2603bf215546Sopenharmony_ci if (!_mesa_has_integer_textures(ctx)) 2604bf215546Sopenharmony_ci break; 2605bf215546Sopenharmony_ci FALLTHROUGH; 2606bf215546Sopenharmony_ci case GL_R8: 2607bf215546Sopenharmony_ci case GL_R16: 2608bf215546Sopenharmony_ci case GL_RED: 2609bf215546Sopenharmony_ci case GL_COMPRESSED_RED: 2610bf215546Sopenharmony_ci return GL_RED; 2611bf215546Sopenharmony_ci 2612bf215546Sopenharmony_ci case GL_RG16F: 2613bf215546Sopenharmony_ci if (!_mesa_has_half_float_textures(ctx)) 2614bf215546Sopenharmony_ci break; 2615bf215546Sopenharmony_ci return GL_RG; 2616bf215546Sopenharmony_ci case GL_RG32F: 2617bf215546Sopenharmony_ci if (!_mesa_has_float_textures(ctx)) 2618bf215546Sopenharmony_ci break; 2619bf215546Sopenharmony_ci return GL_RG; 2620bf215546Sopenharmony_ci case GL_RG8I: 2621bf215546Sopenharmony_ci case GL_RG8UI: 2622bf215546Sopenharmony_ci case GL_RG16I: 2623bf215546Sopenharmony_ci case GL_RG16UI: 2624bf215546Sopenharmony_ci case GL_RG32I: 2625bf215546Sopenharmony_ci case GL_RG32UI: 2626bf215546Sopenharmony_ci if (!_mesa_has_integer_textures(ctx)) 2627bf215546Sopenharmony_ci break; 2628bf215546Sopenharmony_ci FALLTHROUGH; 2629bf215546Sopenharmony_ci case GL_RG: 2630bf215546Sopenharmony_ci case GL_RG8: 2631bf215546Sopenharmony_ci case GL_RG16: 2632bf215546Sopenharmony_ci case GL_COMPRESSED_RG: 2633bf215546Sopenharmony_ci return GL_RG; 2634bf215546Sopenharmony_ci default: 2635bf215546Sopenharmony_ci ; /* fallthrough */ 2636bf215546Sopenharmony_ci } 2637bf215546Sopenharmony_ci } 2638bf215546Sopenharmony_ci 2639bf215546Sopenharmony_ci if (_mesa_has_texture_shared_exponent(ctx)) { 2640bf215546Sopenharmony_ci switch (internalFormat) { 2641bf215546Sopenharmony_ci case GL_RGB9_E5_EXT: 2642bf215546Sopenharmony_ci return GL_RGB; 2643bf215546Sopenharmony_ci default: 2644bf215546Sopenharmony_ci ; /* fallthrough */ 2645bf215546Sopenharmony_ci } 2646bf215546Sopenharmony_ci } 2647bf215546Sopenharmony_ci 2648bf215546Sopenharmony_ci if (_mesa_has_packed_float(ctx)) { 2649bf215546Sopenharmony_ci switch (internalFormat) { 2650bf215546Sopenharmony_ci case GL_R11F_G11F_B10F_EXT: 2651bf215546Sopenharmony_ci return GL_RGB; 2652bf215546Sopenharmony_ci default: 2653bf215546Sopenharmony_ci ; /* fallthrough */ 2654bf215546Sopenharmony_ci } 2655bf215546Sopenharmony_ci } 2656bf215546Sopenharmony_ci 2657bf215546Sopenharmony_ci if (_mesa_has_float_depth_buffer(ctx)) { 2658bf215546Sopenharmony_ci switch (internalFormat) { 2659bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32F: 2660bf215546Sopenharmony_ci return GL_DEPTH_COMPONENT; 2661bf215546Sopenharmony_ci case GL_DEPTH32F_STENCIL8: 2662bf215546Sopenharmony_ci return GL_DEPTH_STENCIL; 2663bf215546Sopenharmony_ci default: 2664bf215546Sopenharmony_ci ; /* fallthrough */ 2665bf215546Sopenharmony_ci } 2666bf215546Sopenharmony_ci } 2667bf215546Sopenharmony_ci 2668bf215546Sopenharmony_ci return -1; /* error */ 2669bf215546Sopenharmony_ci} 2670bf215546Sopenharmony_ci 2671bf215546Sopenharmony_ci/** 2672bf215546Sopenharmony_ci * Returns the effective internal format from a texture format and type. 2673bf215546Sopenharmony_ci * This is used by texture image operations internally for validation, when 2674bf215546Sopenharmony_ci * the specified internal format is a base (unsized) format. 2675bf215546Sopenharmony_ci * 2676bf215546Sopenharmony_ci * This method will only return a valid effective internal format if the 2677bf215546Sopenharmony_ci * combination of format, type and internal format in base form, is acceptable. 2678bf215546Sopenharmony_ci * 2679bf215546Sopenharmony_ci * If a single sized internal format is defined in the spec (OpenGL-ES 3.0.4) or 2680bf215546Sopenharmony_ci * in extensions, to unambiguously correspond to the given base format, then 2681bf215546Sopenharmony_ci * that internal format is returned as the effective. Otherwise, if the 2682bf215546Sopenharmony_ci * combination is accepted but a single effective format is not defined, the 2683bf215546Sopenharmony_ci * passed base format will be returned instead. 2684bf215546Sopenharmony_ci * 2685bf215546Sopenharmony_ci * \param format the texture format 2686bf215546Sopenharmony_ci * \param type the texture type 2687bf215546Sopenharmony_ci */ 2688bf215546Sopenharmony_cistatic GLenum 2689bf215546Sopenharmony_cigles_effective_internal_format_for_format_and_type(GLenum format, 2690bf215546Sopenharmony_ci GLenum type) 2691bf215546Sopenharmony_ci{ 2692bf215546Sopenharmony_ci switch (type) { 2693bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 2694bf215546Sopenharmony_ci switch (format) { 2695bf215546Sopenharmony_ci case GL_RGBA: 2696bf215546Sopenharmony_ci return GL_RGBA8; 2697bf215546Sopenharmony_ci case GL_RGB: 2698bf215546Sopenharmony_ci return GL_RGB8; 2699bf215546Sopenharmony_ci case GL_RG: 2700bf215546Sopenharmony_ci return GL_RG8; 2701bf215546Sopenharmony_ci case GL_RED: 2702bf215546Sopenharmony_ci return GL_R8; 2703bf215546Sopenharmony_ci /* Although LUMINANCE_ALPHA, LUMINANCE and ALPHA appear in table 3.12, 2704bf215546Sopenharmony_ci * (section 3.8 Texturing, page 128 of the OpenGL-ES 3.0.4) as effective 2705bf215546Sopenharmony_ci * internal formats, they do not correspond to GL constants, so the base 2706bf215546Sopenharmony_ci * format is returned instead. 2707bf215546Sopenharmony_ci */ 2708bf215546Sopenharmony_ci case GL_BGRA_EXT: 2709bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 2710bf215546Sopenharmony_ci case GL_LUMINANCE: 2711bf215546Sopenharmony_ci case GL_ALPHA: 2712bf215546Sopenharmony_ci return format; 2713bf215546Sopenharmony_ci } 2714bf215546Sopenharmony_ci break; 2715bf215546Sopenharmony_ci 2716bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 2717bf215546Sopenharmony_ci if (format == GL_RGBA) 2718bf215546Sopenharmony_ci return GL_RGBA4; 2719bf215546Sopenharmony_ci break; 2720bf215546Sopenharmony_ci 2721bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 2722bf215546Sopenharmony_ci if (format == GL_RGBA) 2723bf215546Sopenharmony_ci return GL_RGB5_A1; 2724bf215546Sopenharmony_ci break; 2725bf215546Sopenharmony_ci 2726bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 2727bf215546Sopenharmony_ci if (format == GL_RGB) 2728bf215546Sopenharmony_ci return GL_RGB565; 2729bf215546Sopenharmony_ci break; 2730bf215546Sopenharmony_ci 2731bf215546Sopenharmony_ci /* OES_packed_depth_stencil */ 2732bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8: 2733bf215546Sopenharmony_ci if (format == GL_DEPTH_STENCIL) 2734bf215546Sopenharmony_ci return GL_DEPTH24_STENCIL8; 2735bf215546Sopenharmony_ci break; 2736bf215546Sopenharmony_ci 2737bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2738bf215546Sopenharmony_ci if (format == GL_DEPTH_STENCIL) 2739bf215546Sopenharmony_ci return GL_DEPTH32F_STENCIL8; 2740bf215546Sopenharmony_ci break; 2741bf215546Sopenharmony_ci 2742bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 2743bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 2744bf215546Sopenharmony_ci return GL_DEPTH_COMPONENT16; 2745bf215546Sopenharmony_ci break; 2746bf215546Sopenharmony_ci 2747bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 2748bf215546Sopenharmony_ci /* It can be DEPTH_COMPONENT16 or DEPTH_COMPONENT24, so just return 2749bf215546Sopenharmony_ci * the format. 2750bf215546Sopenharmony_ci */ 2751bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 2752bf215546Sopenharmony_ci return format; 2753bf215546Sopenharmony_ci break; 2754bf215546Sopenharmony_ci 2755bf215546Sopenharmony_ci /* OES_texture_float and OES_texture_half_float */ 2756bf215546Sopenharmony_ci case GL_FLOAT: 2757bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 2758bf215546Sopenharmony_ci return GL_DEPTH_COMPONENT32F; 2759bf215546Sopenharmony_ci FALLTHROUGH; 2760bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 2761bf215546Sopenharmony_ci switch (format) { 2762bf215546Sopenharmony_ci case GL_RGBA: 2763bf215546Sopenharmony_ci case GL_RGB: 2764bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 2765bf215546Sopenharmony_ci case GL_LUMINANCE: 2766bf215546Sopenharmony_ci case GL_ALPHA: 2767bf215546Sopenharmony_ci case GL_RED: 2768bf215546Sopenharmony_ci case GL_RG: 2769bf215546Sopenharmony_ci return format; 2770bf215546Sopenharmony_ci } 2771bf215546Sopenharmony_ci break; 2772bf215546Sopenharmony_ci case GL_HALF_FLOAT: 2773bf215546Sopenharmony_ci switch (format) { 2774bf215546Sopenharmony_ci case GL_RG: 2775bf215546Sopenharmony_ci case GL_RED: 2776bf215546Sopenharmony_ci return format; 2777bf215546Sopenharmony_ci } 2778bf215546Sopenharmony_ci break; 2779bf215546Sopenharmony_ci 2780bf215546Sopenharmony_ci /* GL_EXT_texture_type_2_10_10_10_REV */ 2781bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 2782bf215546Sopenharmony_ci switch (format) { 2783bf215546Sopenharmony_ci case GL_RGBA: 2784bf215546Sopenharmony_ci case GL_RGB: 2785bf215546Sopenharmony_ci return format; 2786bf215546Sopenharmony_ci } 2787bf215546Sopenharmony_ci break; 2788bf215546Sopenharmony_ci 2789bf215546Sopenharmony_ci default: 2790bf215546Sopenharmony_ci /* fall through and return NONE */ 2791bf215546Sopenharmony_ci break; 2792bf215546Sopenharmony_ci } 2793bf215546Sopenharmony_ci 2794bf215546Sopenharmony_ci return GL_NONE; 2795bf215546Sopenharmony_ci} 2796bf215546Sopenharmony_ci 2797bf215546Sopenharmony_ci/** 2798bf215546Sopenharmony_ci * Error checking if internalformat for glTex[Sub]Image is valid 2799bf215546Sopenharmony_ci * within OpenGL ES 3.2 (or introduced by an ES extension). 2800bf215546Sopenharmony_ci * 2801bf215546Sopenharmony_ci * Note, further checks in _mesa_gles_error_check_format_and_type 2802bf215546Sopenharmony_ci * are required for complete checking between format and type. 2803bf215546Sopenharmony_ci */ 2804bf215546Sopenharmony_cistatic GLenum 2805bf215546Sopenharmony_ci_mesa_gles_check_internalformat(const struct gl_context *ctx, 2806bf215546Sopenharmony_ci GLenum internalFormat) 2807bf215546Sopenharmony_ci{ 2808bf215546Sopenharmony_ci switch (internalFormat) { 2809bf215546Sopenharmony_ci /* OpenGL ES 2.0 */ 2810bf215546Sopenharmony_ci case GL_ALPHA: 2811bf215546Sopenharmony_ci case GL_LUMINANCE: 2812bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 2813bf215546Sopenharmony_ci case GL_RGB: 2814bf215546Sopenharmony_ci case GL_RGBA: 2815bf215546Sopenharmony_ci 2816bf215546Sopenharmony_ci /* GL_OES_depth_texture */ 2817bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 2818bf215546Sopenharmony_ci 2819bf215546Sopenharmony_ci /* GL_EXT_texture_format_BGRA8888 */ 2820bf215546Sopenharmony_ci case GL_BGRA: 2821bf215546Sopenharmony_ci 2822bf215546Sopenharmony_ci /* GL_OES_required_internalformat */ 2823bf215546Sopenharmony_ci case GL_RGB565: 2824bf215546Sopenharmony_ci case GL_RGB8: 2825bf215546Sopenharmony_ci case GL_RGBA4: 2826bf215546Sopenharmony_ci case GL_RGB5_A1: 2827bf215546Sopenharmony_ci case GL_RGBA8: 2828bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT16: 2829bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT24: 2830bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32: 2831bf215546Sopenharmony_ci case GL_DEPTH24_STENCIL8: 2832bf215546Sopenharmony_ci case GL_RGB10_EXT: 2833bf215546Sopenharmony_ci case GL_RGB10_A2_EXT: 2834bf215546Sopenharmony_ci case GL_ALPHA8: 2835bf215546Sopenharmony_ci case GL_LUMINANCE8: 2836bf215546Sopenharmony_ci case GL_LUMINANCE8_ALPHA8: 2837bf215546Sopenharmony_ci case GL_LUMINANCE4_ALPHA4: 2838bf215546Sopenharmony_ci return GL_NO_ERROR; 2839bf215546Sopenharmony_ci 2840bf215546Sopenharmony_ci case GL_R8: 2841bf215546Sopenharmony_ci case GL_RG8: 2842bf215546Sopenharmony_ci case GL_RED: 2843bf215546Sopenharmony_ci case GL_RG: 2844bf215546Sopenharmony_ci if (!_mesa_has_rg_textures(ctx)) 2845bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2846bf215546Sopenharmony_ci return GL_NO_ERROR; 2847bf215546Sopenharmony_ci 2848bf215546Sopenharmony_ci /* GL_OES_texture_stencil8 */ 2849bf215546Sopenharmony_ci case GL_STENCIL_INDEX8: 2850bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_stencil8(ctx)) 2851bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2852bf215546Sopenharmony_ci return GL_NO_ERROR; 2853bf215546Sopenharmony_ci 2854bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_BPTC_UNORM: 2855bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 2856bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 2857bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 2858bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_compression_bptc(ctx)) 2859bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2860bf215546Sopenharmony_ci return GL_NO_ERROR; 2861bf215546Sopenharmony_ci 2862bf215546Sopenharmony_ci case GL_COMPRESSED_RED_RGTC1: 2863bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RED_RGTC1: 2864bf215546Sopenharmony_ci case GL_COMPRESSED_RED_GREEN_RGTC2_EXT: 2865bf215546Sopenharmony_ci case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 2866bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_compression_rgtc(ctx)) 2867bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2868bf215546Sopenharmony_ci return GL_NO_ERROR; 2869bf215546Sopenharmony_ci 2870bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 2871bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 2872bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 2873bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 2874bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_compression_s3tc(ctx)) 2875bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2876bf215546Sopenharmony_ci return GL_NO_ERROR; 2877bf215546Sopenharmony_ci 2878bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 2879bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 2880bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 2881bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 2882bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) 2883bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2884bf215546Sopenharmony_ci return GL_NO_ERROR; 2885bf215546Sopenharmony_ci 2886bf215546Sopenharmony_ci case GL_R16: 2887bf215546Sopenharmony_ci case GL_RG16: 2888bf215546Sopenharmony_ci case GL_RGB16: 2889bf215546Sopenharmony_ci case GL_RGBA16: 2890bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_norm16(ctx)) 2891bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2892bf215546Sopenharmony_ci return GL_NO_ERROR; 2893bf215546Sopenharmony_ci 2894bf215546Sopenharmony_ci case GL_R16_SNORM: 2895bf215546Sopenharmony_ci case GL_RG16_SNORM: 2896bf215546Sopenharmony_ci case GL_RGB16_SNORM: 2897bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 2898bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_norm16(ctx) && 2899bf215546Sopenharmony_ci !_mesa_has_EXT_texture_snorm(ctx)) 2900bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2901bf215546Sopenharmony_ci return GL_NO_ERROR; 2902bf215546Sopenharmony_ci 2903bf215546Sopenharmony_ci case GL_SR8_EXT: 2904bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_sRGB_R8(ctx)) 2905bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2906bf215546Sopenharmony_ci return GL_NO_ERROR; 2907bf215546Sopenharmony_ci 2908bf215546Sopenharmony_ci case GL_SRG8_EXT: 2909bf215546Sopenharmony_ci if (!_mesa_has_EXT_texture_sRGB_RG8(ctx)) 2910bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2911bf215546Sopenharmony_ci return GL_NO_ERROR; 2912bf215546Sopenharmony_ci 2913bf215546Sopenharmony_ci /* OpenGL ES 3.0 */ 2914bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8: 2915bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 2916bf215546Sopenharmony_ci case GL_RGBA16F: 2917bf215546Sopenharmony_ci case GL_RGBA32F: 2918bf215546Sopenharmony_ci case GL_RGBA8UI: 2919bf215546Sopenharmony_ci case GL_RGBA8I: 2920bf215546Sopenharmony_ci case GL_RGBA16UI: 2921bf215546Sopenharmony_ci case GL_RGBA16I: 2922bf215546Sopenharmony_ci case GL_RGBA32UI: 2923bf215546Sopenharmony_ci case GL_RGBA32I: 2924bf215546Sopenharmony_ci case GL_RGB10_A2UI: 2925bf215546Sopenharmony_ci case GL_SRGB8: 2926bf215546Sopenharmony_ci case GL_RGB8_SNORM: 2927bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 2928bf215546Sopenharmony_ci case GL_RGB9_E5: 2929bf215546Sopenharmony_ci case GL_RGB16F: 2930bf215546Sopenharmony_ci case GL_RGB32F: 2931bf215546Sopenharmony_ci case GL_RGB8UI: 2932bf215546Sopenharmony_ci case GL_RGB8I: 2933bf215546Sopenharmony_ci case GL_RGB16UI: 2934bf215546Sopenharmony_ci case GL_RGB16I: 2935bf215546Sopenharmony_ci case GL_RGB32UI: 2936bf215546Sopenharmony_ci case GL_RGB32I: 2937bf215546Sopenharmony_ci case GL_RG8_SNORM: 2938bf215546Sopenharmony_ci case GL_RG16F: 2939bf215546Sopenharmony_ci case GL_RG32F: 2940bf215546Sopenharmony_ci case GL_RG8UI: 2941bf215546Sopenharmony_ci case GL_RG8I: 2942bf215546Sopenharmony_ci case GL_RG16UI: 2943bf215546Sopenharmony_ci case GL_RG16I: 2944bf215546Sopenharmony_ci case GL_RG32UI: 2945bf215546Sopenharmony_ci case GL_RG32I: 2946bf215546Sopenharmony_ci case GL_R8_SNORM: 2947bf215546Sopenharmony_ci case GL_R16F: 2948bf215546Sopenharmony_ci case GL_R32F: 2949bf215546Sopenharmony_ci case GL_R8UI: 2950bf215546Sopenharmony_ci case GL_R8I: 2951bf215546Sopenharmony_ci case GL_R16UI: 2952bf215546Sopenharmony_ci case GL_R16I: 2953bf215546Sopenharmony_ci case GL_R32UI: 2954bf215546Sopenharmony_ci case GL_R32I: 2955bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT32F: 2956bf215546Sopenharmony_ci case GL_DEPTH32F_STENCIL8: 2957bf215546Sopenharmony_ci if (!_mesa_is_gles3(ctx)) 2958bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2959bf215546Sopenharmony_ci return GL_NO_ERROR; 2960bf215546Sopenharmony_ci default: 2961bf215546Sopenharmony_ci return GL_INVALID_VALUE; 2962bf215546Sopenharmony_ci } 2963bf215546Sopenharmony_ci} 2964bf215546Sopenharmony_ci 2965bf215546Sopenharmony_ci/** 2966bf215546Sopenharmony_ci * Do error checking of format/type combinations for OpenGL ES 3 2967bf215546Sopenharmony_ci * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat. 2968bf215546Sopenharmony_ci * \return error code, or GL_NO_ERROR. 2969bf215546Sopenharmony_ci */ 2970bf215546Sopenharmony_ciGLenum 2971bf215546Sopenharmony_ci_mesa_gles_error_check_format_and_type(const struct gl_context *ctx, 2972bf215546Sopenharmony_ci GLenum format, GLenum type, 2973bf215546Sopenharmony_ci GLenum internalFormat) 2974bf215546Sopenharmony_ci{ 2975bf215546Sopenharmony_ci /* If internalFormat is an unsized format, then the effective internal 2976bf215546Sopenharmony_ci * format derived from format and type should be used instead. Page 127, 2977bf215546Sopenharmony_ci * section "3.8 Texturing" of the GLES 3.0.4 spec states: 2978bf215546Sopenharmony_ci * 2979bf215546Sopenharmony_ci * "if internalformat is a base internal format, the effective 2980bf215546Sopenharmony_ci * internal format is a sized internal format that is derived 2981bf215546Sopenharmony_ci * from the format and type for internal use by the GL. 2982bf215546Sopenharmony_ci * Table 3.12 specifies the mapping of format and type to effective 2983bf215546Sopenharmony_ci * internal formats. The effective internal format is used by the GL 2984bf215546Sopenharmony_ci * for purposes such as texture completeness or type checks for 2985bf215546Sopenharmony_ci * CopyTex* commands. In these cases, the GL is required to operate 2986bf215546Sopenharmony_ci * as if the effective internal format was used as the internalformat 2987bf215546Sopenharmony_ci * when specifying the texture data." 2988bf215546Sopenharmony_ci */ 2989bf215546Sopenharmony_ci if (_mesa_is_enum_format_unsized(internalFormat)) { 2990bf215546Sopenharmony_ci GLenum effectiveInternalFormat = 2991bf215546Sopenharmony_ci gles_effective_internal_format_for_format_and_type(format, type); 2992bf215546Sopenharmony_ci 2993bf215546Sopenharmony_ci if (effectiveInternalFormat == GL_NONE) 2994bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 2995bf215546Sopenharmony_ci 2996bf215546Sopenharmony_ci GLenum baseInternalFormat; 2997bf215546Sopenharmony_ci if (internalFormat == GL_BGRA_EXT) { 2998bf215546Sopenharmony_ci /* Unfortunately, _mesa_base_tex_format returns a base format of 2999bf215546Sopenharmony_ci * GL_RGBA for GL_BGRA_EXT. This makes perfect sense if you're 3000bf215546Sopenharmony_ci * asking the question, "what channels does this format have?" 3001bf215546Sopenharmony_ci * However, if we're trying to determine if two internal formats 3002bf215546Sopenharmony_ci * match in the ES3 sense, we actually want GL_BGRA. 3003bf215546Sopenharmony_ci */ 3004bf215546Sopenharmony_ci baseInternalFormat = GL_BGRA_EXT; 3005bf215546Sopenharmony_ci } else { 3006bf215546Sopenharmony_ci baseInternalFormat = 3007bf215546Sopenharmony_ci _mesa_base_tex_format(ctx, effectiveInternalFormat); 3008bf215546Sopenharmony_ci } 3009bf215546Sopenharmony_ci 3010bf215546Sopenharmony_ci if (internalFormat != baseInternalFormat) 3011bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3012bf215546Sopenharmony_ci 3013bf215546Sopenharmony_ci internalFormat = effectiveInternalFormat; 3014bf215546Sopenharmony_ci } 3015bf215546Sopenharmony_ci 3016bf215546Sopenharmony_ci /* The GLES variant of EXT_texture_compression_s3tc is very vague and 3017bf215546Sopenharmony_ci * doesn't list valid types. Just do exactly what the spec says. 3018bf215546Sopenharmony_ci */ 3019bf215546Sopenharmony_ci if (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || 3020bf215546Sopenharmony_ci internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || 3021bf215546Sopenharmony_ci internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT || 3022bf215546Sopenharmony_ci internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) 3023bf215546Sopenharmony_ci return format == GL_RGB || format == GL_RGBA ? GL_NO_ERROR : 3024bf215546Sopenharmony_ci GL_INVALID_OPERATION; 3025bf215546Sopenharmony_ci 3026bf215546Sopenharmony_ci /* Before checking for the combination, verify that 3027bf215546Sopenharmony_ci * given internalformat is legal for OpenGL ES. 3028bf215546Sopenharmony_ci */ 3029bf215546Sopenharmony_ci GLenum internal_format_error = 3030bf215546Sopenharmony_ci _mesa_gles_check_internalformat(ctx, internalFormat); 3031bf215546Sopenharmony_ci 3032bf215546Sopenharmony_ci if (internal_format_error != GL_NO_ERROR) 3033bf215546Sopenharmony_ci return internal_format_error; 3034bf215546Sopenharmony_ci 3035bf215546Sopenharmony_ci switch (format) { 3036bf215546Sopenharmony_ci case GL_BGRA_EXT: 3037bf215546Sopenharmony_ci if (type != GL_UNSIGNED_BYTE || 3038bf215546Sopenharmony_ci (internalFormat != GL_BGRA && 3039bf215546Sopenharmony_ci internalFormat != GL_RGBA8 && 3040bf215546Sopenharmony_ci internalFormat != GL_SRGB8_ALPHA8)) 3041bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3042bf215546Sopenharmony_ci break; 3043bf215546Sopenharmony_ci 3044bf215546Sopenharmony_ci case GL_BGR_EXT: 3045bf215546Sopenharmony_ci if (type != GL_UNSIGNED_BYTE || 3046bf215546Sopenharmony_ci (internalFormat != GL_RGB8 && 3047bf215546Sopenharmony_ci internalFormat != GL_SRGB8)) 3048bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3049bf215546Sopenharmony_ci break; 3050bf215546Sopenharmony_ci 3051bf215546Sopenharmony_ci case GL_RGBA: 3052bf215546Sopenharmony_ci switch (type) { 3053bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3054bf215546Sopenharmony_ci switch (internalFormat) { 3055bf215546Sopenharmony_ci case GL_RGBA: 3056bf215546Sopenharmony_ci case GL_RGBA8: 3057bf215546Sopenharmony_ci case GL_RGB5_A1: 3058bf215546Sopenharmony_ci case GL_RGBA4: 3059bf215546Sopenharmony_ci break; 3060bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8_EXT: 3061bf215546Sopenharmony_ci if (ctx->Version <= 20) 3062bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3063bf215546Sopenharmony_ci break; 3064bf215546Sopenharmony_ci case GL_COMPRESSED_RGBA_BPTC_UNORM: 3065bf215546Sopenharmony_ci case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 3066bf215546Sopenharmony_ci break; 3067bf215546Sopenharmony_ci default: 3068bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3069bf215546Sopenharmony_ci } 3070bf215546Sopenharmony_ci break; 3071bf215546Sopenharmony_ci 3072bf215546Sopenharmony_ci case GL_BYTE: 3073bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM) 3074bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3075bf215546Sopenharmony_ci break; 3076bf215546Sopenharmony_ci 3077bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3078bf215546Sopenharmony_ci if (internalFormat != GL_RGBA16) 3079bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3080bf215546Sopenharmony_ci break; 3081bf215546Sopenharmony_ci 3082bf215546Sopenharmony_ci case GL_SHORT: 3083bf215546Sopenharmony_ci if (internalFormat != GL_RGBA16_SNORM) 3084bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3085bf215546Sopenharmony_ci break; 3086bf215546Sopenharmony_ci 3087bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 3088bf215546Sopenharmony_ci switch (internalFormat) { 3089bf215546Sopenharmony_ci case GL_RGBA: 3090bf215546Sopenharmony_ci case GL_RGBA4: 3091bf215546Sopenharmony_ci break; 3092bf215546Sopenharmony_ci default: 3093bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3094bf215546Sopenharmony_ci } 3095bf215546Sopenharmony_ci break; 3096bf215546Sopenharmony_ci 3097bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 3098bf215546Sopenharmony_ci switch (internalFormat) { 3099bf215546Sopenharmony_ci case GL_RGBA: 3100bf215546Sopenharmony_ci case GL_RGB5_A1: 3101bf215546Sopenharmony_ci break; 3102bf215546Sopenharmony_ci default: 3103bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3104bf215546Sopenharmony_ci } 3105bf215546Sopenharmony_ci break; 3106bf215546Sopenharmony_ci 3107bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 3108bf215546Sopenharmony_ci switch (internalFormat) { 3109bf215546Sopenharmony_ci case GL_RGBA: 3110bf215546Sopenharmony_ci case GL_RGB10_A2: 3111bf215546Sopenharmony_ci case GL_RGB5_A1: 3112bf215546Sopenharmony_ci if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 3113bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3114bf215546Sopenharmony_ci break; 3115bf215546Sopenharmony_ci default: 3116bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3117bf215546Sopenharmony_ci } 3118bf215546Sopenharmony_ci break; 3119bf215546Sopenharmony_ci 3120bf215546Sopenharmony_ci case GL_HALF_FLOAT: 3121bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_RGBA16F) 3122bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3123bf215546Sopenharmony_ci break; 3124bf215546Sopenharmony_ci 3125bf215546Sopenharmony_ci case GL_FLOAT: 3126bf215546Sopenharmony_ci switch (internalFormat) { 3127bf215546Sopenharmony_ci case GL_RGBA16F: 3128bf215546Sopenharmony_ci case GL_RGBA32F: 3129bf215546Sopenharmony_ci if (ctx->Version <= 20) 3130bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3131bf215546Sopenharmony_ci break; 3132bf215546Sopenharmony_ci case GL_RGBA: 3133bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3134bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3135bf215546Sopenharmony_ci break; 3136bf215546Sopenharmony_ci default: 3137bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3138bf215546Sopenharmony_ci } 3139bf215546Sopenharmony_ci break; 3140bf215546Sopenharmony_ci 3141bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3142bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3143bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3144bf215546Sopenharmony_ci break; 3145bf215546Sopenharmony_ci default: 3146bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3147bf215546Sopenharmony_ci } 3148bf215546Sopenharmony_ci break; 3149bf215546Sopenharmony_ci 3150bf215546Sopenharmony_ci case GL_RGBA_INTEGER: 3151bf215546Sopenharmony_ci if (ctx->Version <= 20) 3152bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3153bf215546Sopenharmony_ci switch (type) { 3154bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3155bf215546Sopenharmony_ci if (internalFormat != GL_RGBA8UI) 3156bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3157bf215546Sopenharmony_ci break; 3158bf215546Sopenharmony_ci 3159bf215546Sopenharmony_ci case GL_BYTE: 3160bf215546Sopenharmony_ci if (internalFormat != GL_RGBA8I) 3161bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3162bf215546Sopenharmony_ci break; 3163bf215546Sopenharmony_ci 3164bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3165bf215546Sopenharmony_ci if (internalFormat != GL_RGBA16UI) 3166bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3167bf215546Sopenharmony_ci break; 3168bf215546Sopenharmony_ci 3169bf215546Sopenharmony_ci case GL_SHORT: 3170bf215546Sopenharmony_ci if (internalFormat != GL_RGBA16I) 3171bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3172bf215546Sopenharmony_ci break; 3173bf215546Sopenharmony_ci 3174bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3175bf215546Sopenharmony_ci if (internalFormat != GL_RGBA32UI) 3176bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3177bf215546Sopenharmony_ci break; 3178bf215546Sopenharmony_ci 3179bf215546Sopenharmony_ci case GL_INT: 3180bf215546Sopenharmony_ci if (internalFormat != GL_RGBA32I) 3181bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3182bf215546Sopenharmony_ci break; 3183bf215546Sopenharmony_ci 3184bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 3185bf215546Sopenharmony_ci if (internalFormat != GL_RGB10_A2UI) 3186bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3187bf215546Sopenharmony_ci break; 3188bf215546Sopenharmony_ci 3189bf215546Sopenharmony_ci default: 3190bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3191bf215546Sopenharmony_ci } 3192bf215546Sopenharmony_ci break; 3193bf215546Sopenharmony_ci 3194bf215546Sopenharmony_ci case GL_RGB: 3195bf215546Sopenharmony_ci switch (type) { 3196bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3197bf215546Sopenharmony_ci switch (internalFormat) { 3198bf215546Sopenharmony_ci case GL_RGB: 3199bf215546Sopenharmony_ci case GL_RGB8: 3200bf215546Sopenharmony_ci case GL_RGB565: 3201bf215546Sopenharmony_ci break; 3202bf215546Sopenharmony_ci case GL_SRGB8: 3203bf215546Sopenharmony_ci if (ctx->Version <= 20) 3204bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3205bf215546Sopenharmony_ci break; 3206bf215546Sopenharmony_ci default: 3207bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3208bf215546Sopenharmony_ci } 3209bf215546Sopenharmony_ci break; 3210bf215546Sopenharmony_ci 3211bf215546Sopenharmony_ci case GL_BYTE: 3212bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM) 3213bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3214bf215546Sopenharmony_ci break; 3215bf215546Sopenharmony_ci 3216bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3217bf215546Sopenharmony_ci if (internalFormat != GL_RGB16) 3218bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3219bf215546Sopenharmony_ci break; 3220bf215546Sopenharmony_ci 3221bf215546Sopenharmony_ci case GL_SHORT: 3222bf215546Sopenharmony_ci if (internalFormat != GL_RGB16_SNORM) 3223bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3224bf215546Sopenharmony_ci break; 3225bf215546Sopenharmony_ci 3226bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 3227bf215546Sopenharmony_ci switch (internalFormat) { 3228bf215546Sopenharmony_ci case GL_RGB: 3229bf215546Sopenharmony_ci case GL_RGB565: 3230bf215546Sopenharmony_ci break; 3231bf215546Sopenharmony_ci default: 3232bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3233bf215546Sopenharmony_ci } 3234bf215546Sopenharmony_ci break; 3235bf215546Sopenharmony_ci 3236bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 3237bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F) 3238bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3239bf215546Sopenharmony_ci break; 3240bf215546Sopenharmony_ci 3241bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 3242bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5) 3243bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3244bf215546Sopenharmony_ci break; 3245bf215546Sopenharmony_ci 3246bf215546Sopenharmony_ci case GL_HALF_FLOAT: 3247bf215546Sopenharmony_ci if (ctx->Version <= 20) 3248bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3249bf215546Sopenharmony_ci switch (internalFormat) { 3250bf215546Sopenharmony_ci case GL_RGB16F: 3251bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 3252bf215546Sopenharmony_ci case GL_RGB9_E5: 3253bf215546Sopenharmony_ci break; 3254bf215546Sopenharmony_ci default: 3255bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3256bf215546Sopenharmony_ci } 3257bf215546Sopenharmony_ci break; 3258bf215546Sopenharmony_ci 3259bf215546Sopenharmony_ci case GL_FLOAT: 3260bf215546Sopenharmony_ci switch (internalFormat) { 3261bf215546Sopenharmony_ci case GL_RGB16F: 3262bf215546Sopenharmony_ci case GL_RGB32F: 3263bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 3264bf215546Sopenharmony_ci case GL_RGB9_E5: 3265bf215546Sopenharmony_ci if (ctx->Version <= 20) 3266bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3267bf215546Sopenharmony_ci break; 3268bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 3269bf215546Sopenharmony_ci case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 3270bf215546Sopenharmony_ci break; 3271bf215546Sopenharmony_ci case GL_RGB: 3272bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3273bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3274bf215546Sopenharmony_ci break; 3275bf215546Sopenharmony_ci default: 3276bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3277bf215546Sopenharmony_ci } 3278bf215546Sopenharmony_ci break; 3279bf215546Sopenharmony_ci 3280bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3281bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3282bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3283bf215546Sopenharmony_ci break; 3284bf215546Sopenharmony_ci 3285bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 3286bf215546Sopenharmony_ci switch (internalFormat) { 3287bf215546Sopenharmony_ci case GL_RGB: 3288bf215546Sopenharmony_ci case GL_RGB10: 3289bf215546Sopenharmony_ci case GL_RGB8: 3290bf215546Sopenharmony_ci case GL_RGB565: 3291bf215546Sopenharmony_ci /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though 3292bf215546Sopenharmony_ci * GLES3 doesn't, and GL_OES_required_internalformat extends that 3293bf215546Sopenharmony_ci * to allow the sized RGB internalformats as well. 3294bf215546Sopenharmony_ci */ 3295bf215546Sopenharmony_ci if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 3296bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3297bf215546Sopenharmony_ci break; 3298bf215546Sopenharmony_ci default: 3299bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3300bf215546Sopenharmony_ci } 3301bf215546Sopenharmony_ci break; 3302bf215546Sopenharmony_ci 3303bf215546Sopenharmony_ci default: 3304bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3305bf215546Sopenharmony_ci } 3306bf215546Sopenharmony_ci break; 3307bf215546Sopenharmony_ci 3308bf215546Sopenharmony_ci case GL_RGB_INTEGER: 3309bf215546Sopenharmony_ci if (ctx->Version <= 20) 3310bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3311bf215546Sopenharmony_ci switch (type) { 3312bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3313bf215546Sopenharmony_ci if (internalFormat != GL_RGB8UI) 3314bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3315bf215546Sopenharmony_ci break; 3316bf215546Sopenharmony_ci 3317bf215546Sopenharmony_ci case GL_BYTE: 3318bf215546Sopenharmony_ci if (internalFormat != GL_RGB8I) 3319bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3320bf215546Sopenharmony_ci break; 3321bf215546Sopenharmony_ci 3322bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3323bf215546Sopenharmony_ci if (internalFormat != GL_RGB16UI) 3324bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3325bf215546Sopenharmony_ci break; 3326bf215546Sopenharmony_ci 3327bf215546Sopenharmony_ci case GL_SHORT: 3328bf215546Sopenharmony_ci if (internalFormat != GL_RGB16I) 3329bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3330bf215546Sopenharmony_ci break; 3331bf215546Sopenharmony_ci 3332bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3333bf215546Sopenharmony_ci if (internalFormat != GL_RGB32UI) 3334bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3335bf215546Sopenharmony_ci break; 3336bf215546Sopenharmony_ci 3337bf215546Sopenharmony_ci case GL_INT: 3338bf215546Sopenharmony_ci if (internalFormat != GL_RGB32I) 3339bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3340bf215546Sopenharmony_ci break; 3341bf215546Sopenharmony_ci 3342bf215546Sopenharmony_ci default: 3343bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3344bf215546Sopenharmony_ci } 3345bf215546Sopenharmony_ci break; 3346bf215546Sopenharmony_ci 3347bf215546Sopenharmony_ci case GL_RG: 3348bf215546Sopenharmony_ci if (!_mesa_has_rg_textures(ctx)) 3349bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3350bf215546Sopenharmony_ci switch (type) { 3351bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3352bf215546Sopenharmony_ci if (internalFormat != GL_RG8 && 3353bf215546Sopenharmony_ci internalFormat != GL_COMPRESSED_RED_GREEN_RGTC2_EXT && 3354bf215546Sopenharmony_ci internalFormat != GL_SRG8_EXT) 3355bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3356bf215546Sopenharmony_ci break; 3357bf215546Sopenharmony_ci 3358bf215546Sopenharmony_ci case GL_BYTE: 3359bf215546Sopenharmony_ci if (internalFormat != GL_RG8_SNORM && 3360bf215546Sopenharmony_ci internalFormat != GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT) 3361bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3362bf215546Sopenharmony_ci break; 3363bf215546Sopenharmony_ci 3364bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3365bf215546Sopenharmony_ci if (internalFormat != GL_RG16) 3366bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3367bf215546Sopenharmony_ci break; 3368bf215546Sopenharmony_ci 3369bf215546Sopenharmony_ci case GL_SHORT: 3370bf215546Sopenharmony_ci if (internalFormat != GL_RG16_SNORM) 3371bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3372bf215546Sopenharmony_ci break; 3373bf215546Sopenharmony_ci 3374bf215546Sopenharmony_ci case GL_HALF_FLOAT: 3375bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3376bf215546Sopenharmony_ci switch (internalFormat) { 3377bf215546Sopenharmony_ci case GL_RG16F: 3378bf215546Sopenharmony_ci if (ctx->Version <= 20) 3379bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3380bf215546Sopenharmony_ci break; 3381bf215546Sopenharmony_ci case GL_RG: 3382bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_half_float(ctx)) 3383bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3384bf215546Sopenharmony_ci break; 3385bf215546Sopenharmony_ci default: 3386bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3387bf215546Sopenharmony_ci } 3388bf215546Sopenharmony_ci break; 3389bf215546Sopenharmony_ci 3390bf215546Sopenharmony_ci case GL_FLOAT: 3391bf215546Sopenharmony_ci switch (internalFormat) { 3392bf215546Sopenharmony_ci case GL_RG16F: 3393bf215546Sopenharmony_ci case GL_RG32F: 3394bf215546Sopenharmony_ci break; 3395bf215546Sopenharmony_ci case GL_RG: 3396bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_float(ctx)) 3397bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3398bf215546Sopenharmony_ci break; 3399bf215546Sopenharmony_ci default: 3400bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3401bf215546Sopenharmony_ci } 3402bf215546Sopenharmony_ci break; 3403bf215546Sopenharmony_ci 3404bf215546Sopenharmony_ci default: 3405bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3406bf215546Sopenharmony_ci } 3407bf215546Sopenharmony_ci break; 3408bf215546Sopenharmony_ci 3409bf215546Sopenharmony_ci case GL_RG_INTEGER: 3410bf215546Sopenharmony_ci if (ctx->Version <= 20) 3411bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3412bf215546Sopenharmony_ci switch (type) { 3413bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3414bf215546Sopenharmony_ci if (internalFormat != GL_RG8UI) 3415bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3416bf215546Sopenharmony_ci break; 3417bf215546Sopenharmony_ci 3418bf215546Sopenharmony_ci case GL_BYTE: 3419bf215546Sopenharmony_ci if (internalFormat != GL_RG8I) 3420bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3421bf215546Sopenharmony_ci break; 3422bf215546Sopenharmony_ci 3423bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3424bf215546Sopenharmony_ci if (internalFormat != GL_RG16UI) 3425bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3426bf215546Sopenharmony_ci break; 3427bf215546Sopenharmony_ci 3428bf215546Sopenharmony_ci case GL_SHORT: 3429bf215546Sopenharmony_ci if (internalFormat != GL_RG16I) 3430bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3431bf215546Sopenharmony_ci break; 3432bf215546Sopenharmony_ci 3433bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3434bf215546Sopenharmony_ci if (internalFormat != GL_RG32UI) 3435bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3436bf215546Sopenharmony_ci break; 3437bf215546Sopenharmony_ci 3438bf215546Sopenharmony_ci case GL_INT: 3439bf215546Sopenharmony_ci if (internalFormat != GL_RG32I) 3440bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3441bf215546Sopenharmony_ci break; 3442bf215546Sopenharmony_ci 3443bf215546Sopenharmony_ci default: 3444bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3445bf215546Sopenharmony_ci } 3446bf215546Sopenharmony_ci break; 3447bf215546Sopenharmony_ci 3448bf215546Sopenharmony_ci case GL_RED: 3449bf215546Sopenharmony_ci if (!_mesa_has_rg_textures(ctx)) 3450bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3451bf215546Sopenharmony_ci switch (type) { 3452bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3453bf215546Sopenharmony_ci if (internalFormat != GL_R8 && 3454bf215546Sopenharmony_ci internalFormat != GL_SR8_EXT && 3455bf215546Sopenharmony_ci internalFormat != GL_COMPRESSED_RED_RGTC1_EXT) { 3456bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3457bf215546Sopenharmony_ci } 3458bf215546Sopenharmony_ci break; 3459bf215546Sopenharmony_ci 3460bf215546Sopenharmony_ci case GL_BYTE: 3461bf215546Sopenharmony_ci if (internalFormat != GL_R8_SNORM && 3462bf215546Sopenharmony_ci internalFormat != GL_COMPRESSED_SIGNED_RED_RGTC1_EXT) 3463bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3464bf215546Sopenharmony_ci break; 3465bf215546Sopenharmony_ci 3466bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3467bf215546Sopenharmony_ci if (internalFormat != GL_R16) 3468bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3469bf215546Sopenharmony_ci break; 3470bf215546Sopenharmony_ci 3471bf215546Sopenharmony_ci case GL_SHORT: 3472bf215546Sopenharmony_ci if (internalFormat != GL_R16_SNORM) 3473bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3474bf215546Sopenharmony_ci break; 3475bf215546Sopenharmony_ci 3476bf215546Sopenharmony_ci case GL_HALF_FLOAT: 3477bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3478bf215546Sopenharmony_ci switch (internalFormat) { 3479bf215546Sopenharmony_ci case GL_R16F: 3480bf215546Sopenharmony_ci if (ctx->Version <= 20) 3481bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3482bf215546Sopenharmony_ci break; 3483bf215546Sopenharmony_ci case GL_RG: 3484bf215546Sopenharmony_ci case GL_RED: 3485bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_half_float(ctx)) 3486bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3487bf215546Sopenharmony_ci break; 3488bf215546Sopenharmony_ci default: 3489bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3490bf215546Sopenharmony_ci } 3491bf215546Sopenharmony_ci break; 3492bf215546Sopenharmony_ci 3493bf215546Sopenharmony_ci case GL_FLOAT: 3494bf215546Sopenharmony_ci switch (internalFormat) { 3495bf215546Sopenharmony_ci case GL_R16F: 3496bf215546Sopenharmony_ci case GL_R32F: 3497bf215546Sopenharmony_ci break; 3498bf215546Sopenharmony_ci case GL_RED: 3499bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_float(ctx)) 3500bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3501bf215546Sopenharmony_ci break; 3502bf215546Sopenharmony_ci default: 3503bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3504bf215546Sopenharmony_ci } 3505bf215546Sopenharmony_ci break; 3506bf215546Sopenharmony_ci 3507bf215546Sopenharmony_ci default: 3508bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3509bf215546Sopenharmony_ci } 3510bf215546Sopenharmony_ci break; 3511bf215546Sopenharmony_ci 3512bf215546Sopenharmony_ci case GL_RED_INTEGER: 3513bf215546Sopenharmony_ci if (ctx->Version <= 20) 3514bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3515bf215546Sopenharmony_ci switch (type) { 3516bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3517bf215546Sopenharmony_ci if (internalFormat != GL_R8UI) 3518bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3519bf215546Sopenharmony_ci break; 3520bf215546Sopenharmony_ci 3521bf215546Sopenharmony_ci case GL_BYTE: 3522bf215546Sopenharmony_ci if (internalFormat != GL_R8I) 3523bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3524bf215546Sopenharmony_ci break; 3525bf215546Sopenharmony_ci 3526bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3527bf215546Sopenharmony_ci if (internalFormat != GL_R16UI) 3528bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3529bf215546Sopenharmony_ci break; 3530bf215546Sopenharmony_ci 3531bf215546Sopenharmony_ci case GL_SHORT: 3532bf215546Sopenharmony_ci if (internalFormat != GL_R16I) 3533bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3534bf215546Sopenharmony_ci break; 3535bf215546Sopenharmony_ci 3536bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3537bf215546Sopenharmony_ci if (internalFormat != GL_R32UI) 3538bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3539bf215546Sopenharmony_ci break; 3540bf215546Sopenharmony_ci 3541bf215546Sopenharmony_ci case GL_INT: 3542bf215546Sopenharmony_ci if (internalFormat != GL_R32I) 3543bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3544bf215546Sopenharmony_ci break; 3545bf215546Sopenharmony_ci 3546bf215546Sopenharmony_ci default: 3547bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3548bf215546Sopenharmony_ci } 3549bf215546Sopenharmony_ci break; 3550bf215546Sopenharmony_ci 3551bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 3552bf215546Sopenharmony_ci switch (type) { 3553bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3554bf215546Sopenharmony_ci if (internalFormat != GL_DEPTH_COMPONENT && 3555bf215546Sopenharmony_ci internalFormat != GL_DEPTH_COMPONENT16) 3556bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3557bf215546Sopenharmony_ci break; 3558bf215546Sopenharmony_ci 3559bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3560bf215546Sopenharmony_ci switch (internalFormat) { 3561bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 3562bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT16: 3563bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT24: 3564bf215546Sopenharmony_ci break; 3565bf215546Sopenharmony_ci default: 3566bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3567bf215546Sopenharmony_ci } 3568bf215546Sopenharmony_ci break; 3569bf215546Sopenharmony_ci 3570bf215546Sopenharmony_ci case GL_FLOAT: 3571bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F) 3572bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3573bf215546Sopenharmony_ci break; 3574bf215546Sopenharmony_ci 3575bf215546Sopenharmony_ci default: 3576bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3577bf215546Sopenharmony_ci } 3578bf215546Sopenharmony_ci break; 3579bf215546Sopenharmony_ci 3580bf215546Sopenharmony_ci case GL_DEPTH_STENCIL: 3581bf215546Sopenharmony_ci switch (type) { 3582bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8: 3583bf215546Sopenharmony_ci if (internalFormat != GL_DEPTH_STENCIL && 3584bf215546Sopenharmony_ci internalFormat != GL_DEPTH24_STENCIL8) 3585bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3586bf215546Sopenharmony_ci break; 3587bf215546Sopenharmony_ci 3588bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3589bf215546Sopenharmony_ci if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8) 3590bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3591bf215546Sopenharmony_ci break; 3592bf215546Sopenharmony_ci 3593bf215546Sopenharmony_ci default: 3594bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3595bf215546Sopenharmony_ci } 3596bf215546Sopenharmony_ci break; 3597bf215546Sopenharmony_ci 3598bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 3599bf215546Sopenharmony_ci if (type != GL_UNSIGNED_BYTE || 3600bf215546Sopenharmony_ci internalFormat != GL_STENCIL_INDEX8) { 3601bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3602bf215546Sopenharmony_ci } 3603bf215546Sopenharmony_ci break; 3604bf215546Sopenharmony_ci 3605bf215546Sopenharmony_ci case GL_ALPHA: 3606bf215546Sopenharmony_ci case GL_LUMINANCE: 3607bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 3608bf215546Sopenharmony_ci switch (type) { 3609bf215546Sopenharmony_ci case GL_FLOAT: 3610bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3611bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3612bf215546Sopenharmony_ci break; 3613bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3614bf215546Sopenharmony_ci if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3615bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3616bf215546Sopenharmony_ci break; 3617bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3618bf215546Sopenharmony_ci if (!(format == internalFormat || 3619bf215546Sopenharmony_ci (format == GL_ALPHA && internalFormat == GL_ALPHA8) || 3620bf215546Sopenharmony_ci (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) || 3621bf215546Sopenharmony_ci (format == GL_LUMINANCE_ALPHA && 3622bf215546Sopenharmony_ci ((internalFormat == GL_LUMINANCE8_ALPHA8) || 3623bf215546Sopenharmony_ci (internalFormat == GL_LUMINANCE4_ALPHA4))))) { 3624bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3625bf215546Sopenharmony_ci } 3626bf215546Sopenharmony_ci break; 3627bf215546Sopenharmony_ci default: 3628bf215546Sopenharmony_ci return GL_INVALID_OPERATION; 3629bf215546Sopenharmony_ci } 3630bf215546Sopenharmony_ci break; 3631bf215546Sopenharmony_ci } 3632bf215546Sopenharmony_ci 3633bf215546Sopenharmony_ci return GL_NO_ERROR; 3634bf215546Sopenharmony_ci} 3635bf215546Sopenharmony_ci 3636bf215546Sopenharmony_cistatic void 3637bf215546Sopenharmony_ciset_swizzle(uint8_t *swizzle, int x, int y, int z, int w) 3638bf215546Sopenharmony_ci{ 3639bf215546Sopenharmony_ci swizzle[MESA_FORMAT_SWIZZLE_X] = x; 3640bf215546Sopenharmony_ci swizzle[MESA_FORMAT_SWIZZLE_Y] = y; 3641bf215546Sopenharmony_ci swizzle[MESA_FORMAT_SWIZZLE_Z] = z; 3642bf215546Sopenharmony_ci swizzle[MESA_FORMAT_SWIZZLE_W] = w; 3643bf215546Sopenharmony_ci} 3644bf215546Sopenharmony_ci 3645bf215546Sopenharmony_cistatic bool 3646bf215546Sopenharmony_ciget_swizzle_from_gl_format(GLenum format, uint8_t *swizzle) 3647bf215546Sopenharmony_ci{ 3648bf215546Sopenharmony_ci switch (format) { 3649bf215546Sopenharmony_ci case GL_RGBA: 3650bf215546Sopenharmony_ci case GL_RGBA_INTEGER_EXT: 3651bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 1, 2, 3); 3652bf215546Sopenharmony_ci return true; 3653bf215546Sopenharmony_ci case GL_BGRA: 3654bf215546Sopenharmony_ci case GL_BGRA_INTEGER_EXT: 3655bf215546Sopenharmony_ci set_swizzle(swizzle, 2, 1, 0, 3); 3656bf215546Sopenharmony_ci return true; 3657bf215546Sopenharmony_ci case GL_ABGR_EXT: 3658bf215546Sopenharmony_ci set_swizzle(swizzle, 3, 2, 1, 0); 3659bf215546Sopenharmony_ci return true; 3660bf215546Sopenharmony_ci case GL_RGB: 3661bf215546Sopenharmony_ci case GL_RGB_INTEGER_EXT: 3662bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 1, 2, 5); 3663bf215546Sopenharmony_ci return true; 3664bf215546Sopenharmony_ci case GL_BGR: 3665bf215546Sopenharmony_ci case GL_BGR_INTEGER_EXT: 3666bf215546Sopenharmony_ci set_swizzle(swizzle, 2, 1, 0, 5); 3667bf215546Sopenharmony_ci return true; 3668bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA: 3669bf215546Sopenharmony_ci case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3670bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 0, 0, 1); 3671bf215546Sopenharmony_ci return true; 3672bf215546Sopenharmony_ci case GL_RG: 3673bf215546Sopenharmony_ci case GL_RG_INTEGER: 3674bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 1, 4, 5); 3675bf215546Sopenharmony_ci return true; 3676bf215546Sopenharmony_ci case GL_RED: 3677bf215546Sopenharmony_ci case GL_RED_INTEGER_EXT: 3678bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 4, 4, 5); 3679bf215546Sopenharmony_ci return true; 3680bf215546Sopenharmony_ci case GL_GREEN: 3681bf215546Sopenharmony_ci case GL_GREEN_INTEGER_EXT: 3682bf215546Sopenharmony_ci set_swizzle(swizzle, 4, 0, 4, 5); 3683bf215546Sopenharmony_ci return true; 3684bf215546Sopenharmony_ci case GL_BLUE: 3685bf215546Sopenharmony_ci case GL_BLUE_INTEGER_EXT: 3686bf215546Sopenharmony_ci set_swizzle(swizzle, 4, 4, 0, 5); 3687bf215546Sopenharmony_ci return true; 3688bf215546Sopenharmony_ci case GL_ALPHA: 3689bf215546Sopenharmony_ci case GL_ALPHA_INTEGER_EXT: 3690bf215546Sopenharmony_ci set_swizzle(swizzle, 4, 4, 4, 0); 3691bf215546Sopenharmony_ci return true; 3692bf215546Sopenharmony_ci case GL_LUMINANCE: 3693bf215546Sopenharmony_ci case GL_LUMINANCE_INTEGER_EXT: 3694bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 0, 0, 5); 3695bf215546Sopenharmony_ci return true; 3696bf215546Sopenharmony_ci case GL_INTENSITY: 3697bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 0, 0, 0); 3698bf215546Sopenharmony_ci return true; 3699bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 3700bf215546Sopenharmony_ci set_swizzle(swizzle, 0, 6, 6, 6); 3701bf215546Sopenharmony_ci return true; 3702bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 3703bf215546Sopenharmony_ci set_swizzle(swizzle, 6, 0, 6, 6); 3704bf215546Sopenharmony_ci return true; 3705bf215546Sopenharmony_ci default: 3706bf215546Sopenharmony_ci return false; 3707bf215546Sopenharmony_ci } 3708bf215546Sopenharmony_ci} 3709bf215546Sopenharmony_ci 3710bf215546Sopenharmony_cibool 3711bf215546Sopenharmony_ci_mesa_swap_bytes_in_type_enum(GLenum *type) 3712bf215546Sopenharmony_ci{ 3713bf215546Sopenharmony_ci switch (*type) { 3714bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 3715bf215546Sopenharmony_ci *type = GL_UNSIGNED_INT_8_8_8_8_REV; 3716bf215546Sopenharmony_ci return true; 3717bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 3718bf215546Sopenharmony_ci *type = GL_UNSIGNED_INT_8_8_8_8; 3719bf215546Sopenharmony_ci return true; 3720bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 3721bf215546Sopenharmony_ci *type = GL_UNSIGNED_SHORT_8_8_REV_MESA; 3722bf215546Sopenharmony_ci return true; 3723bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 3724bf215546Sopenharmony_ci *type = GL_UNSIGNED_SHORT_8_8_MESA; 3725bf215546Sopenharmony_ci return true; 3726bf215546Sopenharmony_ci case GL_BYTE: 3727bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3728bf215546Sopenharmony_ci /* format/types that are arrays of 8-bit values are unaffected by 3729bf215546Sopenharmony_ci * swapBytes. 3730bf215546Sopenharmony_ci */ 3731bf215546Sopenharmony_ci return true; 3732bf215546Sopenharmony_ci default: 3733bf215546Sopenharmony_ci /* swapping bytes on 4444, 1555, or >8 bit per channel types etc. will 3734bf215546Sopenharmony_ci * never match a Mesa format. 3735bf215546Sopenharmony_ci */ 3736bf215546Sopenharmony_ci return false; 3737bf215546Sopenharmony_ci } 3738bf215546Sopenharmony_ci} 3739bf215546Sopenharmony_ci 3740bf215546Sopenharmony_ci/** 3741bf215546Sopenharmony_ci* Take an OpenGL format (GL_RGB, GL_RGBA, etc), OpenGL data type (GL_INT, 3742bf215546Sopenharmony_ci* GL_FOAT, etc) and return a matching mesa_array_format or a mesa_format 3743bf215546Sopenharmony_ci* otherwise (for non-array formats). 3744bf215546Sopenharmony_ci* 3745bf215546Sopenharmony_ci* This function will typically be used to compute a mesa format from a GL type 3746bf215546Sopenharmony_ci* so we can then call _mesa_format_convert. This function does 3747bf215546Sopenharmony_ci* not consider byte swapping, so it returns types assuming that no byte 3748bf215546Sopenharmony_ci* swapping is involved. If byte swapping is involved then clients are supposed 3749bf215546Sopenharmony_ci* to handle that on their side before calling _mesa_format_convert. 3750bf215546Sopenharmony_ci* 3751bf215546Sopenharmony_ci* This function returns an uint32_t that can pack a mesa_format or a 3752bf215546Sopenharmony_ci* mesa_array_format. Clients must check the mesa array format bit 3753bf215546Sopenharmony_ci* (MESA_ARRAY_FORMAT_BIT) on the return value to know if the returned 3754bf215546Sopenharmony_ci* format is a mesa_array_format or a mesa_format. 3755bf215546Sopenharmony_ci*/ 3756bf215546Sopenharmony_ciuint32_t 3757bf215546Sopenharmony_ci_mesa_format_from_format_and_type(GLenum format, GLenum type) 3758bf215546Sopenharmony_ci{ 3759bf215546Sopenharmony_ci bool is_array_format = true; 3760bf215546Sopenharmony_ci uint8_t swizzle[4]; 3761bf215546Sopenharmony_ci bool normalized = false, is_float = false, is_signed = false; 3762bf215546Sopenharmony_ci int num_channels = 0, type_size = 0; 3763bf215546Sopenharmony_ci 3764bf215546Sopenharmony_ci if (format == GL_COLOR_INDEX) 3765bf215546Sopenharmony_ci return MESA_FORMAT_NONE; 3766bf215546Sopenharmony_ci 3767bf215546Sopenharmony_ci /* Extract array format type information from the OpenGL data type */ 3768bf215546Sopenharmony_ci switch (type) { 3769bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE: 3770bf215546Sopenharmony_ci type_size = 1; 3771bf215546Sopenharmony_ci break; 3772bf215546Sopenharmony_ci case GL_BYTE: 3773bf215546Sopenharmony_ci type_size = 1; 3774bf215546Sopenharmony_ci is_signed = true; 3775bf215546Sopenharmony_ci break; 3776bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3777bf215546Sopenharmony_ci type_size = 2; 3778bf215546Sopenharmony_ci break; 3779bf215546Sopenharmony_ci case GL_SHORT: 3780bf215546Sopenharmony_ci type_size = 2; 3781bf215546Sopenharmony_ci is_signed = true; 3782bf215546Sopenharmony_ci break; 3783bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3784bf215546Sopenharmony_ci type_size = 4; 3785bf215546Sopenharmony_ci break; 3786bf215546Sopenharmony_ci case GL_INT: 3787bf215546Sopenharmony_ci type_size = 4; 3788bf215546Sopenharmony_ci is_signed = true; 3789bf215546Sopenharmony_ci break; 3790bf215546Sopenharmony_ci case GL_HALF_FLOAT: 3791bf215546Sopenharmony_ci case GL_HALF_FLOAT_OES: 3792bf215546Sopenharmony_ci type_size = 2; 3793bf215546Sopenharmony_ci is_signed = true; 3794bf215546Sopenharmony_ci is_float = true; 3795bf215546Sopenharmony_ci break; 3796bf215546Sopenharmony_ci case GL_FLOAT: 3797bf215546Sopenharmony_ci type_size = 4; 3798bf215546Sopenharmony_ci is_signed = true; 3799bf215546Sopenharmony_ci is_float = true; 3800bf215546Sopenharmony_ci break; 3801bf215546Sopenharmony_ci default: 3802bf215546Sopenharmony_ci is_array_format = false; 3803bf215546Sopenharmony_ci break; 3804bf215546Sopenharmony_ci } 3805bf215546Sopenharmony_ci 3806bf215546Sopenharmony_ci /* Extract array format swizzle information from the OpenGL format */ 3807bf215546Sopenharmony_ci if (is_array_format) 3808bf215546Sopenharmony_ci is_array_format = get_swizzle_from_gl_format(format, swizzle); 3809bf215546Sopenharmony_ci 3810bf215546Sopenharmony_ci /* If this is an array format type after checking data type and format, 3811bf215546Sopenharmony_ci * create the array format 3812bf215546Sopenharmony_ci */ 3813bf215546Sopenharmony_ci if (is_array_format) { 3814bf215546Sopenharmony_ci enum mesa_array_format_base_format bf; 3815bf215546Sopenharmony_ci switch (format) { 3816bf215546Sopenharmony_ci case GL_DEPTH_COMPONENT: 3817bf215546Sopenharmony_ci bf = MESA_ARRAY_FORMAT_BASE_FORMAT_DEPTH; 3818bf215546Sopenharmony_ci break; 3819bf215546Sopenharmony_ci case GL_STENCIL_INDEX: 3820bf215546Sopenharmony_ci bf = MESA_ARRAY_FORMAT_BASE_FORMAT_STENCIL; 3821bf215546Sopenharmony_ci break; 3822bf215546Sopenharmony_ci default: 3823bf215546Sopenharmony_ci bf = MESA_ARRAY_FORMAT_BASE_FORMAT_RGBA_VARIANTS; 3824bf215546Sopenharmony_ci break; 3825bf215546Sopenharmony_ci } 3826bf215546Sopenharmony_ci 3827bf215546Sopenharmony_ci normalized = !(_mesa_is_enum_format_integer(format) || 3828bf215546Sopenharmony_ci format == GL_STENCIL_INDEX); 3829bf215546Sopenharmony_ci num_channels = _mesa_components_in_format(format); 3830bf215546Sopenharmony_ci 3831bf215546Sopenharmony_ci return MESA_ARRAY_FORMAT(bf, type_size, is_signed, is_float, 3832bf215546Sopenharmony_ci normalized, num_channels, 3833bf215546Sopenharmony_ci swizzle[0], swizzle[1], swizzle[2], swizzle[3]); 3834bf215546Sopenharmony_ci } 3835bf215546Sopenharmony_ci 3836bf215546Sopenharmony_ci /* Otherwise this is not an array format, so return the mesa_format 3837bf215546Sopenharmony_ci * matching the OpenGL format and data type 3838bf215546Sopenharmony_ci */ 3839bf215546Sopenharmony_ci switch (type) { 3840bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5: 3841bf215546Sopenharmony_ci if (format == GL_RGB) 3842bf215546Sopenharmony_ci return MESA_FORMAT_B5G6R5_UNORM; 3843bf215546Sopenharmony_ci else if (format == GL_BGR) 3844bf215546Sopenharmony_ci return MESA_FORMAT_R5G6B5_UNORM; 3845bf215546Sopenharmony_ci else if (format == GL_RGB_INTEGER) 3846bf215546Sopenharmony_ci return MESA_FORMAT_B5G6R5_UINT; 3847bf215546Sopenharmony_ci break; 3848bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_6_5_REV: 3849bf215546Sopenharmony_ci if (format == GL_RGB) 3850bf215546Sopenharmony_ci return MESA_FORMAT_R5G6B5_UNORM; 3851bf215546Sopenharmony_ci else if (format == GL_BGR) 3852bf215546Sopenharmony_ci return MESA_FORMAT_B5G6R5_UNORM; 3853bf215546Sopenharmony_ci else if (format == GL_RGB_INTEGER) 3854bf215546Sopenharmony_ci return MESA_FORMAT_R5G6B5_UINT; 3855bf215546Sopenharmony_ci break; 3856bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4: 3857bf215546Sopenharmony_ci if (format == GL_RGBA) 3858bf215546Sopenharmony_ci return MESA_FORMAT_A4B4G4R4_UNORM; 3859bf215546Sopenharmony_ci else if (format == GL_BGRA) 3860bf215546Sopenharmony_ci return MESA_FORMAT_A4R4G4B4_UNORM; 3861bf215546Sopenharmony_ci else if (format == GL_ABGR_EXT) 3862bf215546Sopenharmony_ci return MESA_FORMAT_R4G4B4A4_UNORM; 3863bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3864bf215546Sopenharmony_ci return MESA_FORMAT_A4B4G4R4_UINT; 3865bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3866bf215546Sopenharmony_ci return MESA_FORMAT_A4R4G4B4_UINT; 3867bf215546Sopenharmony_ci break; 3868bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3869bf215546Sopenharmony_ci if (format == GL_RGBA) 3870bf215546Sopenharmony_ci return MESA_FORMAT_R4G4B4A4_UNORM; 3871bf215546Sopenharmony_ci else if (format == GL_BGRA) 3872bf215546Sopenharmony_ci return MESA_FORMAT_B4G4R4A4_UNORM; 3873bf215546Sopenharmony_ci else if (format == GL_ABGR_EXT) 3874bf215546Sopenharmony_ci return MESA_FORMAT_A4B4G4R4_UNORM; 3875bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3876bf215546Sopenharmony_ci return MESA_FORMAT_R4G4B4A4_UINT; 3877bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3878bf215546Sopenharmony_ci return MESA_FORMAT_B4G4R4A4_UINT; 3879bf215546Sopenharmony_ci break; 3880bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_5_5_5_1: 3881bf215546Sopenharmony_ci if (format == GL_RGBA) 3882bf215546Sopenharmony_ci return MESA_FORMAT_A1B5G5R5_UNORM; 3883bf215546Sopenharmony_ci else if (format == GL_BGRA) 3884bf215546Sopenharmony_ci return MESA_FORMAT_A1R5G5B5_UNORM; 3885bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3886bf215546Sopenharmony_ci return MESA_FORMAT_A1B5G5R5_UINT; 3887bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3888bf215546Sopenharmony_ci return MESA_FORMAT_A1R5G5B5_UINT; 3889bf215546Sopenharmony_ci break; 3890bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3891bf215546Sopenharmony_ci if (format == GL_RGBA) 3892bf215546Sopenharmony_ci return MESA_FORMAT_R5G5B5A1_UNORM; 3893bf215546Sopenharmony_ci else if (format == GL_BGRA) 3894bf215546Sopenharmony_ci return MESA_FORMAT_B5G5R5A1_UNORM; 3895bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3896bf215546Sopenharmony_ci return MESA_FORMAT_R5G5B5A1_UINT; 3897bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3898bf215546Sopenharmony_ci return MESA_FORMAT_B5G5R5A1_UINT; 3899bf215546Sopenharmony_ci break; 3900bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_3_3_2: 3901bf215546Sopenharmony_ci if (format == GL_RGB) 3902bf215546Sopenharmony_ci return MESA_FORMAT_B2G3R3_UNORM; 3903bf215546Sopenharmony_ci else if (format == GL_RGB_INTEGER) 3904bf215546Sopenharmony_ci return MESA_FORMAT_B2G3R3_UINT; 3905bf215546Sopenharmony_ci break; 3906bf215546Sopenharmony_ci case GL_UNSIGNED_BYTE_2_3_3_REV: 3907bf215546Sopenharmony_ci if (format == GL_RGB) 3908bf215546Sopenharmony_ci return MESA_FORMAT_R3G3B2_UNORM; 3909bf215546Sopenharmony_ci else if (format == GL_RGB_INTEGER) 3910bf215546Sopenharmony_ci return MESA_FORMAT_R3G3B2_UINT; 3911bf215546Sopenharmony_ci break; 3912bf215546Sopenharmony_ci case GL_UNSIGNED_INT_5_9_9_9_REV: 3913bf215546Sopenharmony_ci if (format == GL_RGB) 3914bf215546Sopenharmony_ci return MESA_FORMAT_R9G9B9E5_FLOAT; 3915bf215546Sopenharmony_ci break; 3916bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10_10_10_2: 3917bf215546Sopenharmony_ci if (format == GL_RGBA) 3918bf215546Sopenharmony_ci return MESA_FORMAT_A2B10G10R10_UNORM; 3919bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3920bf215546Sopenharmony_ci return MESA_FORMAT_A2B10G10R10_UINT; 3921bf215546Sopenharmony_ci else if (format == GL_BGRA) 3922bf215546Sopenharmony_ci return MESA_FORMAT_A2R10G10B10_UNORM; 3923bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3924bf215546Sopenharmony_ci return MESA_FORMAT_A2R10G10B10_UINT; 3925bf215546Sopenharmony_ci break; 3926bf215546Sopenharmony_ci case GL_UNSIGNED_INT_2_10_10_10_REV: 3927bf215546Sopenharmony_ci if (format == GL_RGB) 3928bf215546Sopenharmony_ci return MESA_FORMAT_R10G10B10X2_UNORM; 3929bf215546Sopenharmony_ci if (format == GL_RGBA) 3930bf215546Sopenharmony_ci return MESA_FORMAT_R10G10B10A2_UNORM; 3931bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3932bf215546Sopenharmony_ci return MESA_FORMAT_R10G10B10A2_UINT; 3933bf215546Sopenharmony_ci else if (format == GL_BGRA) 3934bf215546Sopenharmony_ci return MESA_FORMAT_B10G10R10A2_UNORM; 3935bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3936bf215546Sopenharmony_ci return MESA_FORMAT_B10G10R10A2_UINT; 3937bf215546Sopenharmony_ci break; 3938bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8: 3939bf215546Sopenharmony_ci if (format == GL_RGBA) 3940bf215546Sopenharmony_ci return MESA_FORMAT_A8B8G8R8_UNORM; 3941bf215546Sopenharmony_ci else if (format == GL_BGRA) 3942bf215546Sopenharmony_ci return MESA_FORMAT_A8R8G8B8_UNORM; 3943bf215546Sopenharmony_ci else if (format == GL_ABGR_EXT) 3944bf215546Sopenharmony_ci return MESA_FORMAT_R8G8B8A8_UNORM; 3945bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3946bf215546Sopenharmony_ci return MESA_FORMAT_A8B8G8R8_UINT; 3947bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3948bf215546Sopenharmony_ci return MESA_FORMAT_A8R8G8B8_UINT; 3949bf215546Sopenharmony_ci break; 3950bf215546Sopenharmony_ci case GL_UNSIGNED_INT_8_8_8_8_REV: 3951bf215546Sopenharmony_ci if (format == GL_RGBA) 3952bf215546Sopenharmony_ci return MESA_FORMAT_R8G8B8A8_UNORM; 3953bf215546Sopenharmony_ci else if (format == GL_BGRA) 3954bf215546Sopenharmony_ci return MESA_FORMAT_B8G8R8A8_UNORM; 3955bf215546Sopenharmony_ci else if (format == GL_ABGR_EXT) 3956bf215546Sopenharmony_ci return MESA_FORMAT_A8B8G8R8_UNORM; 3957bf215546Sopenharmony_ci else if (format == GL_RGBA_INTEGER) 3958bf215546Sopenharmony_ci return MESA_FORMAT_R8G8B8A8_UINT; 3959bf215546Sopenharmony_ci else if (format == GL_BGRA_INTEGER) 3960bf215546Sopenharmony_ci return MESA_FORMAT_B8G8R8A8_UINT; 3961bf215546Sopenharmony_ci break; 3962bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_MESA: 3963bf215546Sopenharmony_ci if (format == GL_YCBCR_MESA) 3964bf215546Sopenharmony_ci return MESA_FORMAT_YCBCR; 3965bf215546Sopenharmony_ci break; 3966bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT_8_8_REV_MESA: 3967bf215546Sopenharmony_ci if (format == GL_YCBCR_MESA) 3968bf215546Sopenharmony_ci return MESA_FORMAT_YCBCR_REV; 3969bf215546Sopenharmony_ci break; 3970bf215546Sopenharmony_ci case GL_UNSIGNED_INT_10F_11F_11F_REV: 3971bf215546Sopenharmony_ci if (format == GL_RGB) 3972bf215546Sopenharmony_ci return MESA_FORMAT_R11G11B10_FLOAT; 3973bf215546Sopenharmony_ci break; 3974bf215546Sopenharmony_ci case GL_FLOAT: 3975bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 3976bf215546Sopenharmony_ci return MESA_FORMAT_Z_FLOAT32; 3977bf215546Sopenharmony_ci break; 3978bf215546Sopenharmony_ci case GL_UNSIGNED_INT: 3979bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 3980bf215546Sopenharmony_ci return MESA_FORMAT_Z_UNORM32; 3981bf215546Sopenharmony_ci break; 3982bf215546Sopenharmony_ci case GL_UNSIGNED_SHORT: 3983bf215546Sopenharmony_ci if (format == GL_DEPTH_COMPONENT) 3984bf215546Sopenharmony_ci return MESA_FORMAT_Z_UNORM16; 3985bf215546Sopenharmony_ci break; 3986bf215546Sopenharmony_ci case GL_UNSIGNED_INT_24_8: 3987bf215546Sopenharmony_ci if (format == GL_DEPTH_STENCIL) 3988bf215546Sopenharmony_ci return MESA_FORMAT_S8_UINT_Z24_UNORM; 3989bf215546Sopenharmony_ci else if (format == GL_DEPTH_COMPONENT) 3990bf215546Sopenharmony_ci return MESA_FORMAT_X8_UINT_Z24_UNORM; 3991bf215546Sopenharmony_ci break; 3992bf215546Sopenharmony_ci case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3993bf215546Sopenharmony_ci if (format == GL_DEPTH_STENCIL) 3994bf215546Sopenharmony_ci return MESA_FORMAT_Z32_FLOAT_S8X24_UINT; 3995bf215546Sopenharmony_ci break; 3996bf215546Sopenharmony_ci default: 3997bf215546Sopenharmony_ci break; 3998bf215546Sopenharmony_ci } 3999bf215546Sopenharmony_ci 4000bf215546Sopenharmony_ci fprintf(stderr, "Unsupported format/type: %s/%s\n", 4001bf215546Sopenharmony_ci _mesa_enum_to_string(format), 4002bf215546Sopenharmony_ci _mesa_enum_to_string(type)); 4003bf215546Sopenharmony_ci 4004bf215546Sopenharmony_ci /* If we got here it means that we could not find a Mesa format that 4005bf215546Sopenharmony_ci * matches the GL format/type provided. We may need to add a new Mesa 4006bf215546Sopenharmony_ci * format in that case. 4007bf215546Sopenharmony_ci */ 4008bf215546Sopenharmony_ci unreachable("Unsupported format"); 4009bf215546Sopenharmony_ci} 4010bf215546Sopenharmony_ci 4011bf215546Sopenharmony_ciuint32_t 4012bf215546Sopenharmony_ci_mesa_tex_format_from_format_and_type(const struct gl_context *ctx, 4013bf215546Sopenharmony_ci GLenum gl_format, GLenum type) 4014bf215546Sopenharmony_ci{ 4015bf215546Sopenharmony_ci mesa_format format = _mesa_format_from_format_and_type(gl_format, type); 4016bf215546Sopenharmony_ci 4017bf215546Sopenharmony_ci if (_mesa_format_is_mesa_array_format(format)) 4018bf215546Sopenharmony_ci format = _mesa_format_from_array_format(format); 4019bf215546Sopenharmony_ci 4020bf215546Sopenharmony_ci if (format == MESA_FORMAT_NONE || !ctx->TextureFormatSupported[format]) 4021bf215546Sopenharmony_ci return MESA_FORMAT_NONE; 4022bf215546Sopenharmony_ci 4023bf215546Sopenharmony_ci return format; 4024bf215546Sopenharmony_ci} 4025bf215546Sopenharmony_ci 4026bf215546Sopenharmony_ci/** 4027bf215546Sopenharmony_ci * Returns true if \p internal_format is a sized internal format that 4028bf215546Sopenharmony_ci * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification. 4029bf215546Sopenharmony_ci */ 4030bf215546Sopenharmony_cibool 4031bf215546Sopenharmony_ci_mesa_is_es3_color_renderable(const struct gl_context *ctx, 4032bf215546Sopenharmony_ci GLenum internal_format) 4033bf215546Sopenharmony_ci{ 4034bf215546Sopenharmony_ci switch (internal_format) { 4035bf215546Sopenharmony_ci case GL_R8: 4036bf215546Sopenharmony_ci case GL_RG8: 4037bf215546Sopenharmony_ci case GL_RGB8: 4038bf215546Sopenharmony_ci case GL_RGB565: 4039bf215546Sopenharmony_ci case GL_RGBA4: 4040bf215546Sopenharmony_ci case GL_RGB5_A1: 4041bf215546Sopenharmony_ci case GL_RGBA8: 4042bf215546Sopenharmony_ci case GL_RGB10_A2: 4043bf215546Sopenharmony_ci case GL_RGB10_A2UI: 4044bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8: 4045bf215546Sopenharmony_ci case GL_R16F: 4046bf215546Sopenharmony_ci case GL_RG16F: 4047bf215546Sopenharmony_ci case GL_RGBA16F: 4048bf215546Sopenharmony_ci case GL_R32F: 4049bf215546Sopenharmony_ci case GL_RG32F: 4050bf215546Sopenharmony_ci case GL_RGBA32F: 4051bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 4052bf215546Sopenharmony_ci case GL_R8I: 4053bf215546Sopenharmony_ci case GL_R8UI: 4054bf215546Sopenharmony_ci case GL_R16I: 4055bf215546Sopenharmony_ci case GL_R16UI: 4056bf215546Sopenharmony_ci case GL_R32I: 4057bf215546Sopenharmony_ci case GL_R32UI: 4058bf215546Sopenharmony_ci case GL_RG8I: 4059bf215546Sopenharmony_ci case GL_RG8UI: 4060bf215546Sopenharmony_ci case GL_RG16I: 4061bf215546Sopenharmony_ci case GL_RG16UI: 4062bf215546Sopenharmony_ci case GL_RG32I: 4063bf215546Sopenharmony_ci case GL_RG32UI: 4064bf215546Sopenharmony_ci case GL_RGBA8I: 4065bf215546Sopenharmony_ci case GL_RGBA8UI: 4066bf215546Sopenharmony_ci case GL_RGBA16I: 4067bf215546Sopenharmony_ci case GL_RGBA16UI: 4068bf215546Sopenharmony_ci case GL_RGBA32I: 4069bf215546Sopenharmony_ci case GL_RGBA32UI: 4070bf215546Sopenharmony_ci return true; 4071bf215546Sopenharmony_ci case GL_R16: 4072bf215546Sopenharmony_ci case GL_RG16: 4073bf215546Sopenharmony_ci case GL_RGBA16: 4074bf215546Sopenharmony_ci return _mesa_has_EXT_texture_norm16(ctx); 4075bf215546Sopenharmony_ci case GL_R8_SNORM: 4076bf215546Sopenharmony_ci case GL_RG8_SNORM: 4077bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 4078bf215546Sopenharmony_ci return _mesa_has_EXT_render_snorm(ctx); 4079bf215546Sopenharmony_ci case GL_R16_SNORM: 4080bf215546Sopenharmony_ci case GL_RG16_SNORM: 4081bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 4082bf215546Sopenharmony_ci return _mesa_has_EXT_texture_norm16(ctx) && 4083bf215546Sopenharmony_ci _mesa_has_EXT_render_snorm(ctx); 4084bf215546Sopenharmony_ci default: 4085bf215546Sopenharmony_ci return false; 4086bf215546Sopenharmony_ci } 4087bf215546Sopenharmony_ci} 4088bf215546Sopenharmony_ci 4089bf215546Sopenharmony_ci/** 4090bf215546Sopenharmony_ci * Returns true if \p internal_format is a sized internal format that 4091bf215546Sopenharmony_ci * is marked "Texture Filterable" in Table 8.10 of the ES 3.2 specification. 4092bf215546Sopenharmony_ci */ 4093bf215546Sopenharmony_cibool 4094bf215546Sopenharmony_ci_mesa_is_es3_texture_filterable(const struct gl_context *ctx, 4095bf215546Sopenharmony_ci GLenum internal_format) 4096bf215546Sopenharmony_ci{ 4097bf215546Sopenharmony_ci switch (internal_format) { 4098bf215546Sopenharmony_ci case GL_R8: 4099bf215546Sopenharmony_ci case GL_R8_SNORM: 4100bf215546Sopenharmony_ci case GL_RG8: 4101bf215546Sopenharmony_ci case GL_RG8_SNORM: 4102bf215546Sopenharmony_ci case GL_RGB8: 4103bf215546Sopenharmony_ci case GL_RGB8_SNORM: 4104bf215546Sopenharmony_ci case GL_RGB565: 4105bf215546Sopenharmony_ci case GL_RGBA4: 4106bf215546Sopenharmony_ci case GL_RGB5_A1: 4107bf215546Sopenharmony_ci case GL_RGBA8: 4108bf215546Sopenharmony_ci case GL_RGBA8_SNORM: 4109bf215546Sopenharmony_ci case GL_RGB10_A2: 4110bf215546Sopenharmony_ci case GL_SRGB8: 4111bf215546Sopenharmony_ci case GL_SRGB8_ALPHA8: 4112bf215546Sopenharmony_ci case GL_R16F: 4113bf215546Sopenharmony_ci case GL_RG16F: 4114bf215546Sopenharmony_ci case GL_RGB16F: 4115bf215546Sopenharmony_ci case GL_RGBA16F: 4116bf215546Sopenharmony_ci case GL_R11F_G11F_B10F: 4117bf215546Sopenharmony_ci case GL_RGB9_E5: 4118bf215546Sopenharmony_ci return true; 4119bf215546Sopenharmony_ci case GL_R16: 4120bf215546Sopenharmony_ci case GL_R16_SNORM: 4121bf215546Sopenharmony_ci case GL_RG16: 4122bf215546Sopenharmony_ci case GL_RG16_SNORM: 4123bf215546Sopenharmony_ci case GL_RGB16: 4124bf215546Sopenharmony_ci case GL_RGB16_SNORM: 4125bf215546Sopenharmony_ci case GL_RGBA16: 4126bf215546Sopenharmony_ci case GL_RGBA16_SNORM: 4127bf215546Sopenharmony_ci return _mesa_has_EXT_texture_norm16(ctx); 4128bf215546Sopenharmony_ci case GL_R32F: 4129bf215546Sopenharmony_ci case GL_RG32F: 4130bf215546Sopenharmony_ci case GL_RGB32F: 4131bf215546Sopenharmony_ci case GL_RGBA32F: 4132bf215546Sopenharmony_ci /* The OES_texture_float_linear spec says: 4133bf215546Sopenharmony_ci * 4134bf215546Sopenharmony_ci * "When implemented against OpenGL ES 3.0 or later versions, sized 4135bf215546Sopenharmony_ci * 32-bit floating-point formats become texture-filterable. This 4136bf215546Sopenharmony_ci * should be noted by, for example, checking the ``TF'' column of 4137bf215546Sopenharmony_ci * table 8.13 in the ES 3.1 Specification (``Correspondence of sized 4138bf215546Sopenharmony_ci * internal formats to base internal formats ... and use cases ...'') 4139bf215546Sopenharmony_ci * for the R32F, RG32F, RGB32F, and RGBA32F formats." 4140bf215546Sopenharmony_ci */ 4141bf215546Sopenharmony_ci return _mesa_has_OES_texture_float_linear(ctx); 4142bf215546Sopenharmony_ci default: 4143bf215546Sopenharmony_ci return false; 4144bf215546Sopenharmony_ci } 4145bf215546Sopenharmony_ci} 4146