1Name 2 3 EXT_texture_storage 4 5Name Strings 6 7 GL_EXT_texture_storage 8 9Contact 10 11 Bruce Merry (bmerry 'at' gmail.com) 12 Ian Romanick, Intel (ian.d.romanick 'at' intel.com) 13 14Contributors 15 16 Jeremy Sandmel, Apple 17 Bruce Merry, ARM 18 Tom Olson, ARM 19 Benji Bowman, Imagination Technologies 20 Ian Romanick, Intel 21 Jeff Bolz, NVIDIA 22 Pat Brown, NVIDIA 23 Maurice Ribble, Qualcomm 24 Lingjun Chen, Qualcomm 25 Daniel Koch, Transgaming Inc 26 27Status 28 29 Complete. 30 31Version 32 33 Last Modified Date: November 11, 2011 34 Author Revision: 24 35 36Number 37 38 OpenGL ES Extension #108 39 40Dependencies 41 42 OpenGL ES 1.0, OpenGL ES 2.0 or OpenGL 1.2 is required. 43 44 OES_texture_npot, OES_texture_cube_map, OES_texture_3D, 45 OES_depth_texture, OES_packed_depth_stencil, 46 OES_compressed_paletted_texture, OES_texture_float, OES_texture_half_float 47 EXT_texture_type_2_10_10_10_REV, EXT_texture_format_BGRA8888, 48 EXT_texture3D, OES_texture_npot, APPLE_texture_2D_limited_npot, 49 ARB_texture_cube_map, ARB_texture_cube_map_array, 50 ARB_texture_rectangle, SGIS_generate_mipmap, 51 EXT_direct_state_access, OES_EGL_image, WGL_ARB_render_texture, 52 GLX_EXT_texture_from_pixmap, and core specifications that 53 incorporate these extensions affect the definition of this 54 extension. 55 56 This extension is written against the OpenGL 3.2 Core Profile 57 specification. 58 59Overview 60 61 The texture image specification commands in OpenGL allow each level 62 to be separately specified with different sizes, formats, types and 63 so on, and only imposes consistency checks at draw time. This adds 64 overhead for implementations. 65 66 This extension provides a mechanism for specifying the entire 67 structure of a texture in a single call, allowing certain 68 consistency checks and memory allocations to be done up front. Once 69 specified, the format and dimensions of the image array become 70 immutable, to simplify completeness checks in the implementation. 71 72 When using this extension, it is no longer possible to supply texture 73 data using TexImage*. Instead, data can be uploaded using TexSubImage*, 74 or produced by other means (such as render-to-texture, mipmap generation, 75 or rendering to a sibling EGLImage). 76 77 This extension has complicated interactions with other extensions. 78 The goal of most of these interactions is to ensure that a texture 79 is always mipmap complete (and cube complete for cubemap textures). 80 81IP Status 82 83 No known IP claims 84 85New Procedures and Functions 86 87 void TexStorage1DEXT(enum target, sizei levels, 88 enum internalformat, 89 sizei width); 90 91 void TexStorage2DEXT(enum target, sizei levels, 92 enum internalformat, 93 sizei width, sizei height); 94 95 void TexStorage3DEXT(enum target, sizei levels, 96 enum internalformat, 97 sizei width, sizei height, sizei depth); 98 99 void TextureStorage1DEXT(uint texture, enum target, sizei levels, 100 enum internalformat, 101 sizei width); 102 103 void TextureStorage2DEXT(uint texture, enum target, sizei levels, 104 enum internalformat, 105 sizei width, sizei height); 106 107 void TextureStorage3DEXT(uint texture, enum target, sizei levels, 108 enum internalformat, 109 sizei width, sizei height, sizei depth); 110 111New Types 112 113 None 114 115New Tokens 116 117 Accepted by the <value> parameter of GetTexParameter{if}v: 118 119 TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F 120 121 Accepted by the <internalformat> parameter of TexStorage* when 122 implemented on OpenGL ES: 123 124 ALPHA8_EXT 0x803C /* reuse tokens from EXT_texture */ 125 LUMINANCE8_EXT 0x8040 126 LUMINANCE8_ALPHA8_EXT 0x8045 127 128 (if OES_texture_float is supported) 129 RGBA32F_EXT 0x8814 /* reuse tokens from ARB_texture_float */ 130 RGB32F_EXT 0x8815 131 ALPHA32F_EXT 0x8816 132 LUMINANCE32F_EXT 0x8818 133 LUMINANCE_ALPHA32F_EXT 0x8819 134 135 (if OES_texture_half_float is supported) 136 RGBA16F_EXT 0x881A /* reuse tokens from ARB_texture_float */ 137 RGB16F_EXT 0x881B 138 ALPHA16F_EXT 0x881C 139 LUMINANCE16F_EXT 0x881E 140 LUMINANCE_ALPHA16F_EXT 0x881F 141 142 (if EXT_texture_type_2_10_10_10_REV is supported) 143 RGB10_A2_EXT 0x8059 /* reuse tokens from EXT_texture */ 144 RGB10_EXT 0x8052 145 146 (if EXT_texture_format_BGRA8888 is supported) 147 BGRA8_EXT 0x93A1 148 149 150Additions to Chapter 2 of the OpenGL 3.2 Core Profile Specification 151(OpenGL Operation) 152 153 None 154 155Additions to Chapter 3 of the OpenGL 3.2 Core Profile Specification 156(Rasterization) 157 158 After section 3.8.1 (Texture Image Specification) add a new 159 subsection called "Immutable-format texture images": 160 161 "An alterative set of commands is provided for specifying the 162 properties of all levels of a texture at once. Once a texture is 163 specified with such a command, the format and dimensions of all 164 levels becomes immutable, unless it is a proxy texture (since 165 otherwise it would no longer be possible to use the proxy). The 166 contents of the images and the parameters can still be modified. 167 Such a texture is referred to as an "immutable-format" texture. The 168 immutability status of a texture can be determined by calling 169 GetTexParameter with <pname> TEXTURE_IMMUTABLE_FORMAT_EXT. 170 171 Each of the commands below is described by pseudo-code which 172 indicates the effect on the dimensions and format of the texture. 173 For all of the commands, the following apply in addition to the 174 pseudo-code: 175 176 - If the default texture object is bound to <target>, an 177 INVALID_OPERATION error is generated. 178 - If executing the pseudo-code would lead to an error, the error is 179 generated and the command will have no effect. 180 - Any existing levels that are not replaced are reset to their 181 initial state. 182 - If <width>, <height>, <depth> or <levels> is less than 1, the 183 error INVALID_VALUE is generated. 184 - Since no pixel data are provided, the <format> and <type> values 185 used in the pseudo-code are irrelevant; they can be considered to 186 be any values that are legal to use with <internalformat>. 187 - If the command is successful, TEXTURE_IMMUTABLE_FORMAT_EXT becomes 188 TRUE. 189 - If <internalformat> is a specific compressed texture format, then 190 references to TexImage* should be replaced by CompressedTexImage*, 191 with <format>, <type> and <data> replaced by any valid <imageSize> and 192 <data>. If there is no <imageSize> for which this command would have 193 been valid, an INVALID_OPERATION error is generated [fn: This 194 condition is not required for OpenGL, but is necessary for OpenGL 195 ES which does not support on-the-fly compression.] 196 - If <internalformat> is one of the internal formats listed in table 197 3.11, an INVALID_ENUM error is generated. [fn: The corresponding table 198 in OpenGL ES 2.0 is table 3.8.] 199 200 The command 201 202 void TexStorage1DEXT(enum target, sizei levels, 203 enum internalformat, 204 sizei width); 205 206 specifies all the levels of a one-dimensional texture (or proxy) at 207 the same time. It is described by the pseudo-code below: 208 209 for (i = 0; i < levels; i++) 210 { 211 TexImage1D(target, i, internalformat, width, 0, 212 format, type, NULL); 213 width = max(1, floor(width / 2)); 214 } 215 216 If <target> is not TEXTURE_1D or PROXY_TEXTURE_1D then INVALID_ENUM 217 is generated. If <levels> is greater than floor(log_2(width)) + 1 218 then INVALID_OPERATION is generated. 219 220 The command 221 222 void TexStorage2DEXT(enum target, sizei levels, 223 enum internalformat, 224 sizei width, sizei height); 225 226 specifies all the levels of a two-dimensional, cube-map, 227 one-dimension array or rectangle texture (or proxy) at the same 228 time. The pseudo-code depends on the <target>: 229 230 [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_RECTANGLE or 231 PROXY_TEXTURE_CUBE_MAP: 232 233 for (i = 0; i < levels; i++) 234 { 235 TexImage2D(target, i, internalformat, width, height, 0, 236 format, type, NULL); 237 width = max(1, floor(width / 2)); 238 height = max(1, floor(height / 2)); 239 } 240 241 TEXTURE_CUBE_MAP: 242 243 for (i = 0; i < levels; i++) 244 { 245 for face in (+X, -X, +Y, -Y, +Z, -Z) 246 { 247 TexImage2D(face, i, internalformat, width, height, 0, 248 format, type, NULL); 249 } 250 width = max(1, floor(width / 2)); 251 height = max(1, floor(height / 2)); 252 } 253 254 [PROXY_]TEXTURE_1D_ARRAY: 255 256 for (i = 0; i < levels; i++) 257 { 258 TexImage2D(target, i, internalformat, width, height, 0, 259 format, type, NULL); 260 width = max(1, floor(width / 2)); 261 } 262 263 If <target> is not one of those listed above, the error INVALID_ENUM 264 is generated. 265 266 The error INVALID_OPERATION is generated if any of the following 267 conditions hold: 268 - <target> is [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater than 269 floor(log_2(width)) + 1 270 - <target> is not [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater 271 than floor(log_2(max(width, height))) + 1 272 273 The command 274 275 void TexStorage3DEXT(enum target, sizei levels, enum internalformat, 276 sizei width, sizei height, sizei depth); 277 278 specifies all the levels of a three-dimensional, two-dimensional 279 array texture, or cube-map array texture (or proxy). The pseudo-code 280 depends on <target>: 281 282 [PROXY_]TEXTURE_3D: 283 284 for (i = 0; i < levels; i++) 285 { 286 TexImage3D(target, i, internalformat, width, height, depth, 0, 287 format, type, NULL); 288 width = max(1, floor(width / 2)); 289 height = max(1, floor(height / 2)); 290 depth = max(1, floor(depth / 2)); 291 } 292 293 [PROXY_]TEXTURE_2D_ARRAY, [PROXY_]TEXTURE_CUBE_MAP_ARRAY_ARB: 294 295 for (i = 0; i < levels; i++) 296 { 297 TexImage3D(target, i, internalformat, width, height, depth, 0, 298 format, type, NULL); 299 width = max(1, floor(width / 2)); 300 height = max(1, floor(height / 2)); 301 } 302 303 If <target> is not one of those listed above, the error INVALID_ENUM 304 is generated. 305 306 The error INVALID_OPERATION is generated if any of the following 307 conditions hold: 308 - <target> is [PROXY_]TEXTURE_3D and <levels> is greater than 309 floor(log_2(max(width, height, depth))) + 1 310 - <target> is [PROXY_]TEXTURE_2D_ARRAY or 311 [PROXY_]TEXTURE_CUBE_MAP_ARRAY_EXT and <levels> is greater than 312 floor(log_2(max(width, height))) + 1 313 314 After a successful call to any TexStorage* command with a non-proxy 315 target, the value of TEXTURE_IMMUTABLE_FORMAT_EXT for this texture 316 object is set to TRUE, and no further changes to the dimensions or 317 format of the texture object may be made. Other commands may only 318 alter the texel values and texture parameters. Using any of the 319 following commands with the same texture will result in the error 320 INVALID_OPERATION being generated, even if it does not affect the 321 dimensions or format: 322 323 - TexImage* 324 - CompressedTexImage* 325 - CopyTexImage* 326 - TexStorage* 327 328 The TextureStorage* commands operate identically to the 329 corresponding command where "Texture" is substituted for "Tex" 330 except, rather than updating the current bound texture for the 331 texture unit indicated by the current active texture state and the 332 target parameter, these "Texture" commands update the texture object 333 named by the initial texture parameter. The error INVALID_VALUE 334 is generated if <texture> is zero. 335 " 336 337 In section 3.8.6 (Texture Parameters), after the sentence 338 339 "In the remainder of section 3.8, denote by lod_min, lod_max, 340 level_base, and level_max the values of the texture parameters 341 TEXTURE_MIN_LOD, TEXTURE_MAX_LOD, TEXTURE_BASE_LEVEL, and 342 TEXTURE_MAX_LEVEL respectively." 343 344 add 345 346 "However, if TEXTURE_IMMUTABLE_FORMAT_EXT is 347 TRUE, then level_base is clamped to the range [0, <levels> - 1] and 348 level_max is then clamped to the range [level_base, <levels> - 1], 349 where <levels> is the parameter passed the call to TexStorage* for 350 the texture object. 351 352 In section 3.8.9 (Rendering feedback loops) replace all references 353 to TEXTURE_BASE_LEVEL by level_base. 354 355 In section 3.8.9 (Mipmapping), replace the paragraph starting "Each 356 array in a mipmap is defined..." by 357 358 "Each array in a mipmap is defined using TexImage3D, TexImage2D, 359 CopyTexImage2D, TexImage1D, CopyTexImage1D, or by functions that are 360 defined in terms of these functions. Level-of-detail numbers proceed 361 from level_base for the original texel array through the maximum 362 level p, with each unit increase indicating an array of half the 363 dimensions of the previous one (rounded down to the next integer if 364 fractional) as already described. For immutable-format textures, 365 p is one less than the <levels> parameter passed to TexStorage*; 366 otherwise p = floor(log_2(maxsize)) + level_base. All arrays from 367 level_base through q = min(p, level_max) must be defined, as 368 discussed in section 3.8.12." 369 370 In section 3.8.12 (Texture Completeness), modify the last sentence 371 to avoid refering to level_base and level_max: 372 373 "An implementation may allow a texture image array of level 1 or 374 greater to be created only if a mipmap complete set of image arrays 375 consistent with the requested array can be supported where the 376 values of TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL are 0 and 1000 377 respectively." 378 379 Modify section 3.8.13 (Texture State and Proxy State) to add the new 380 state: 381 382 "Each set consists of ..., and a boolean flag indicating whether the 383 format and dimensions of the texture are immutable." 384 385 Add 386 "The initial value of TEXTURE_IMMUTABLE_FORMAT_EXT is FALSE." 387 388Additions to Chapter 4 of the OpenGL 3.2 Core Profile Specification 389(Per-Fragment Operations and the Frame Buffer) 390 391 None 392 393Additions to Chapter 5 of the OpenGL 3.2 Compatibility Profile Specification 394(Special Functions) 395 396 In section 5.4.1 (Commands Not Usable in Display Lists), add 397 TexStorage* to the list of commands that cannot be used. 398 399Additions to Chapter 6 of the OpenGL 3.2 Core Profile Specification 400(State and State Requests) 401 402 Replace the following statement in 6.1.3 (Enumerated Queries): 403 404 "<value> must be one of the symbolic values in table 3.10." 405 406 with 407 408 "<value> must be TEXTURE_IMMUTABLE_FORMAT_EXT or one of the symbolic 409 values in table 3.22." 410 411Additions to the AGL/EGL/GLX/WGL Specifications 412 413 None 414 415Additions to OES_compressed_ETC1_RGB8_texture 416 417 Add the following to the additions to Chapter 3: 418 419 "Since ETC1 images are easily edited along 4x4 texel boundaries, the 420 limitations on CompressedTexSubImage2D are relaxed. 421 CompressedTexSubImage2D will result in an INVALID_OPERATION error 422 only if one of the following conditions occurs: 423 424 * <width> is not a multiple of four, and <width> plus <xoffset> is not 425 equal to the texture width; 426 427 * <height> is not a multiple of four, and <height> plus <yoffset> is 428 not equal to the texture height; or 429 430 * <xoffset> or <yoffset> is not a multiple of four. 431 432 Remove CompressedTexSubImage2D from this error: 433 434 "INVALID_OPERATION is generated by CompressedTexSubImage2D, 435 TexSubImage2D, or CopyTexSubImage2D if the texture image <level> 436 bound to <target> has internal format ETC1_RGB8_OES." 437 438 Add the following error: 439 440 "INVALID_OPERATION is generated by CompressedTexSubImage2D 441 if the region to be modified is not aligned to block boundaries 442 (refer to the extension text for details)." 443 444Additions to AMD_compressed_ATC_texture and AMD_compressed_3DC_texture: 445 446 Apply the same changes as for OES_compressed_ETC1_RGB8_texture 447 above, substituting the appropriate internal format tokens from 448 these extensions. 449 450Dependencies on EXT_direct_state_access 451 452 If EXT_direct_state_access is not present, references to 453 TextureStorage* should be ignored. 454 455Dependencies on OpenGL ES 456 457 On OpenGL ES without extensions introducing TEXTURE_MAX_LEVEL, 458 mipmapped textures specified with TexStorage are required to have a 459 full set of mipmaps. If TEXTURE_MAX_LEVEL is not supported, this 460 extension is modified as follows: 461 462 - Where an upper bound is placed on <levels> in this extension (i.e. 463 the maximum number of mipmap levels for a texture of the given 464 target and dimensions), an INVALID_OPERATION error is generated if 465 <levels> is neither 1 nor this upper bound. 466 - q (the effective maximum number of levels) is redefined to clamp 467 to the number of levels present in immutable-format textures. 468 469 OpenGL ES does not accept sized internal formats (e.g., RGBA8) and 470 instead derives an internal format from the <format> and <type> 471 parameters of TexImage2D. Since TexStorage* does not specify texel 472 data, the API doesn't include <format> and <type> parameters. 473 On an OpenGL ES implementation, the values in the <internalformat> 474 column in the tables below are accepted as <internalformat> 475 parameters, and base internal formats are not accepted. The 476 TexImage* calls in the TexStorage* pseudocode are modified so that 477 the <internalformat>, <format> and <type> parameters are 478 taken from the <format>, <format> and <type> columns (respectively) 479 in the tables below, according to the <internalformat> 480 specified in the TexStorage* command. 481 482 <internalformat> <format> <type> 483 ---------------- -------- ------ 484 RGB565 RGB UNSIGNED_SHORT_5_6_5 485 RGBA4 RGBA UNSIGNED_SHORT_4_4_4_4 486 RGB5_A1 RGBA UNSIGNED_SHORT_5_5_5_1 487 RGB8_OES RGB UNSIGNED_BYTE 488 RGBA8_OES RGBA UNSIGNED_BYTE 489 LUMINANCE8_ALPHA8_EXT LUMINANCE_ALPHA UNSIGNED_BYTE 490 LUMINANCE8_EXT LUMINANCE UNSIGNED_BYTE 491 ALPHA8_EXT ALPHA UNSIGNED_BYTE 492 493 If OES_depth_texture is supported: 494 495 <internalformat> <format> <type> 496 ---------------- -------- ------ 497 DEPTH_COMPONENT16_OES DEPTH_COMPONENT UNSIGNED_SHORT 498 DEPTH_COMPONENT32_OES DEPTH_COMPONENT UNSIGNED_INT 499 500 If OES_packed_depth_stencil is supported: 501 502 <internalformat> <format> <type> 503 ---------------- -------- ------ 504 DEPTH24_STENCIL8_OES DEPTH_STENCIL_OES UNSIGNED_INT 505 506 If OES_texture_float is supported: 507 508 <internalformat> <format> <type> 509 ---------------- -------- ------ 510 RGBA32F_EXT RGBA FLOAT 511 RGB32F_EXT RGB FLOAT 512 LUMINANCE_ALPHA32F_EXT LUMINANCE_ALPHA FLOAT 513 LUMINANCE32F_EXT LUMINANCE FLOAT 514 ALPHA32F_EXT ALPHA FLOAT 515 516 If OES_texture_half_float is supported: 517 518 <internalformat> <format> <type> 519 ---------------- -------- ------ 520 RGBA16F_EXT RGBA HALF_FLOAT_OES 521 RGB16F_EXT RGB HALF_FLOAT_OES 522 LUMINANCE_ALPHA16F_EXT LUMINANCE_ALPHA HALF_FLOAT_OES 523 LUMINANCE16F_EXT LUMINANCE HALF_FLOAT_OES 524 ALPHA16F_EXT ALPHA HALF_FLOAT_OES 525 526 If EXT_texture_type_2_10_10_10_REV is supported: 527 528 <internalformat> <format> <type> 529 ---------------- -------- ------ 530 RGB10_A2_EXT RGBA UNSIGNED_INT_2_10_10_10_REV_EXT 531 RGB10_EXT RGB UNSIGNED_INT_2_10_10_10_REV_EXT 532 533 If EXT_texture_format_BGRA8888 is supported: 534 535 <internalformat> <format> <type> 536 ---------------- -------- ------ 537 BGRA8_EXT BGRA_EXT UNSIGNED_BYTE 538 539 540Dependencies on texture targets 541 542 If a particular texture target is not supported by the 543 implementation, passing it as a <target> to TexStorage* will 544 generate an INVALID_ENUM error. If as a result, any of the commands 545 defined in this extension would no longer have any valid <target>, 546 all references to the command should be ignored. 547 548 In particular, note that OpenGL ES 1.x/2.0 do not have proxy textures, 549 1D textures, or 3D textures, and thus only the TexStorage2DEXT 550 entry point is required. If OES_texture_3D is supported, the 551 TexStorage3DEXT entry point is also required. 552 553Dependencies on OES_texture_npot 554 555 If OpenGL ES 2.0 or APPLE_texture_2D_limited_npot is present but 556 OES_texture_npot is not present, then INVALID_OPERATION is 557 generated by TexStorage* and TexStorage3DEXT if <levels> is 558 not one and <width>, <height> or <depth> is not a power of 559 two. 560 561Dependencies on WGL_ARB_render_texture, GLX_EXT_texture_from_pixmap, EGL 5621.4 and GL_OES_EGL_image 563 564 The commands eglBindTexImage, wglBindTexImageARB, glXBindTexImageEXT or 565 EGLImageTargetTexture2DOES are not permitted on an immutable-format 566 texture. 567 They will generate the following errors: 568 - EGLImageTargetTexture2DOES: INVALID_OPERATION 569 - eglBindTexImage: EGL_BAD_MATCH 570 - wglBindTexImage: ERROR_INVALID_OPERATION 571 - glXBindTexImageEXT: BadMatch 572 573Dependencies on OES_compressed_paletted_texture 574 575 The compressed texture formats exposed by 576 OES_compressed_paletted_texture are not supported by TexStorage*. 577 Passing one of these tokens to TexStorage* will generate an 578 INVALID_ENUM error. 579 580Errors 581 582 Note that dependencies above modify the errors. 583 584 If TexStorage* is called with a <width>, <height>, <depth> or 585 <levels> parameter that is less than one, then the error 586 INVALID_VALUE is generated. 587 588 If the <target> parameter to TexStorage1DEXT is not 589 [PROXY_]TEXTURE_1D, then the error INVALID_ENUM is generated. 590 591 If the <target> parameter to TexStorage2DEXT is not 592 [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_CUBE_MAP, 593 [PROXY_]TEXTURE_RECTANGLE or [PROXY_]TEXTURE_1D_ARRAY, then the 594 error INVALID_ENUM is generated. 595 596 If the <target> parameter to TexStorage3DEXT is not 597 [PROXY_]TEXTURE_3D, [PROXY_]TEXTURE_2D_ARRAY or 598 [PROXY_]TEXTURE_CUBE_MAP_ARRAY then the error INVALID_ENUM is 599 generated. 600 601 If the <levels> parameter to TexStorage* is greater than the 602 <target>-specific value listed below then the error 603 INVALID_OPERATION is generated: 604 [PROXY_]TEXTURE_{1D,1D_ARRAY}: 605 floor(log_2(width)) + 1 606 [PROXY_]TEXTURE_{2D,2D_ARRAY,CUBE_MAP,CUBE_MAP_ARRAY}: 607 floor(log_2(max(width, height))) + 1 608 [PROXY_]TEXTURE_3D: 609 floor(log_2(max(width, height, depth))) + 1 610 [PROXY_]TEXTURE_RECTANGLE: 611 1 612 613 If the default texture object is bound to the <target> passed to 614 TexStorage*, then the error INVALID_OPERATION is generated. 615 616 If the <target> parameter to TextureStorage* does not match the 617 dimensionality of <texture>, then the error INVALID_OPERATION is 618 generated. 619 620 If the <texture> parameter to TextureStorage* is zero, then the 621 INVALID_VALUE is generated. 622 623 If any pseudo-code listed in this extension would generate an error, 624 then that error is generated. 625 626 Calling any of the following functions on a texture for which 627 TEXTURE_IMMUTABLE_FORMAT_EXT is TRUE will generate an 628 INVALID_OPERATION error: 629 - TexImage* 630 - CompressedTexImage* 631 - CopyTexImage* 632 633New State 634 635 Additions to Table 6.8 Textures (state per texture object) 636 637 Initial 638 Get Value Type Get Command Value Description Sec. 639 --------- ---- ----------- ------- ----------- ---- 640 TEXTURE_IMMUTABLE_FORMAT_EXT B GetTexParameter FALSE Size and format immutable 2.6 641 642New Implementation Dependent State 643 644 None 645 646Issues 647 648 1. What should this extension be called? 649 650 RESOLVED: EXT_texture_storage is chosen for consistency with the 651 glRenderbufferStorage entry point. 652 653 2. Should TexStorage* accept a border parameter? 654 655 RESOLVED: no. 656 657 DISCUSSION: Currently it does not, since borders are a deprecated 658 feature which is not supported by all hardware. Users of the 659 compatibility profile can continue to use the existing texture 660 specification functions, but there is an argument that users of 661 compatibility profile may also want to use this extension. 662 663 3. What is the correct error when <levels> specifies a partial 664 mipmap pyramid for OpenGL ES? 665 666 RESOLVED: INVALID_OPERATION, since it is an interaction between 667 parameters rather than a single value being invalid. It also makes 668 sense to relax this condition for desktop GL where it makes sense to 669 use a truncated pyramid with TEXTURE_MAX_LEVEL. 670 671 4. Should use of these entry-points make the metadata (format and 672 dimensions) immutable? 673 674 RESOLVED: Yes. 675 676 DISCUSSION: The benefits of knowing metadata can't change will 677 probably outweigh the extra cost of checking the 678 TEXTURE_IMMUTABLE_FORMAT_EXT flag on each texture specification 679 call. 680 681 5. Should it be legal to completely replace the texture using a new call 682 to TexStorage*? 683 684 RESOLVED. It will not be allowed. 685 686 DISCUSSION: This is useful to invalidate all levels of a texture. 687 Allowing the metadata to be changed here seems easier than trying to 688 define a portable definition of what it means to change the metadata 689 (e.g. what if you used an unsized internal format the first time and 690 the corresponding sized internal format the second time, or vice 691 versa)? 692 693 However, while this is largely similar to deleting the old texture 694 object and replacing it with a new one, it does lose some of the 695 advantages of immutability. Specifically, because doing so does not 696 reset bindings, it doesn't allow a migration path to an API that 697 validates the texture format at bind time. 698 699 6. Should it be legal to use TexImage* after TexStorage* if it doesn't 700 affect the metadata? 701 702 RESOLVED: No. 703 704 DISCUSSION: A potential use case is to allow a single level of a 705 texture to be invalidated using a NULL pointer. However, as noted 706 above it is non-trivial to determine what constitutes a change. 707 708 7. How does this extension interact with APPLE_texture_2D_limited_npot? 709 710 RESOLVED. APPLE_texture_2D_limited_npot is equivalent to the NPOT 711 support in OpenGL ES 2.0. 712 713 8. Should this extension be written to work with desktop OpenGL? 714 715 RESOLVED: Yes. 716 717 DISCUSSION: There has been been interest and it will future-proof it 718 against further additions to OpenGL ES. 719 720 9. Which texture targets should be supported? 721 722 RESOLVED. All targets except multisample and buffer textures are 723 supported. 724 725 Initially all targets except TEXTURE_BUFFER were supported. It was 726 noted that the entrypoints for multisample targets added no useful 727 functionality, since multisample textures have no completeness 728 checks beyond being non-empty. 729 730 Rectangle textures have completeness checks to prevent filtering of 731 integer textures. However, since we decided to only force mipmap 732 completeness, this becomes less useful. 733 734 10. Should this extension support proxy textures? 735 736 RESOLVED: Yes. 737 738 DISCUSSION: It should be orthogonal. 739 740 11. Are the <format> and <type> parameters necessary? 741 742 RESOLVED. No, they will be removed. 743 744 DISCUSSION: For OpenGL ES the type parameter was necessary to 745 determine the precision of the texture, but this can be solved by 746 having these functions accept sized internal formats (which are 747 already accepted by renderbuffers). 748 749 12. Should it be legal to make the default texture (id 0) 750 immutable-format? 751 752 RESOLVED: No. 753 754 DISCUSSION: This would make it impossible to restore the context to 755 it's default state, which is deemed undesirable. There is no good 756 reason not to use named texture objects. 757 758 13. Should we try to guarantee that textures made through this path 759 will always be complete? 760 761 RESOLVED: It should be guaranteed that the texture will be mipmap 762 complete. 763 764 DISCUSSION: Future separation between images and samplers will still 765 allow users to create combinations that are invalid, but 766 constraining the simple cases will make these APIs easier to use for 767 beginners. 768 769 14. Should these functions use a EXT_direct_state_access approach to 770 specifying the texture objects? 771 772 UNRESOLVED. 773 774 DISCUSSION: as a standalone extension, no DSA-like functions will be 775 added. However, interactions with EXT_direct_state_access and 776 ARB_direct_state_access need to be resolved. 777 778 15. Should these functions accept generic compressed formats? 779 780 RESOLVED: Yes. Note that the spec language will need to be modified 781 to allow this for ES, since the pseudocode is written in terms of 782 TexImage2D, which does not allow compressed texture formats in ES. 783 See also issues 23 and 27. 784 785 16. How should completeness be forced when TEXTURE_MAX_LEVEL is not 786 present? 787 788 RESOLVED. The maximum level q will be redefined to clamp to the 789 highest level available. 790 791 DISCUSSION: A single-level texture can be made complete either by 792 making it mipmap complete (by setting TEXTURE_MAX_LEVEL to 0) or by 793 turning off mipmapping (by choose an appropriate minification 794 filter). 795 796 Some options: 797 798 A: Specify that TexStorage* changes the default minification filter 799 for OpenGL ES. This makes it awkward to add TEXTURE_MAX_LEVEL 800 support to OpenGL ES later, since switching to match GL would break 801 compatibility. The two mechanisms also do not give identical 802 results, since the magnification threshold depends on the 803 minification filter. 804 805 B: Specify that the texture behaves as though TEXTURE_MAX_LEVEL were 806 zero. To specify this properly probably requires fairly intrusive 807 changes to the OpenGL ES full specification to add back all the 808 language relating to the max level. It also does not solve the 809 similar problem of what to do with NPOT textures; and it may have 810 hardware impacts due to the change in the min/mag crossover. 811 812 C: Specify that TexStorage* changes the default minification filter 813 for all implementations when a single-level texture is specified. 814 This may be slightly counter-intuitive to desktop GL users, but will 815 give consistent behaviour across variants of GL and avoids changing 816 the functional behaviour of this extension based on the presence or 817 absence of some other feature. 818 819 Currently B is specified. This has potential hardware implications 820 for OpenGL ES because of the effect of the minification filter on 821 the min/mag crossover. However, C has potential hardware implications 822 for OpenGL due to the separation of texture and sampler state. 823 824 17. How should completeness be forced when only ES2-style NPOT is 825 available? 826 827 RESOLVED. It is not worth trying to do this, in light of issue 13. 828 829 Previous revisions of this extension overrode the minification 830 filter and wrap modes, but that is no longer the case. Since 831 OES_texture_npot removes the caveats on NPOT textures anyway, it 832 might not be worth trying to "fix" this. 833 834 18. For OpenGL ES, how do the new sized internal formats interact 835 with OES_required_internal_format? 836 837 RESOLVED. 838 839 If OES_required_internal_format is not present, then the 840 <internalformat> parameter is intended merely to indicate what the 841 corresponding <format> and <type> would have been, had TexImage* 842 been used instead. If OES_required_internal_format is present, then 843 it is intended that the <internalformat> will be interpreted as if 844 it had been passed directly to TexImage*. 845 846 19. Should there be some hinting mechanism to indicate whether data 847 is coming immediately or later? 848 849 RESOLVED. No parameter is needed. An extension can be added to provide 850 a TexParameter value which is latched at TexStorage time. 851 852 DISCUSSION: Some members felt that this would be useful so that they 853 could defer allocation when suitable, particularly if higher- 854 resolution images will be streamed in later; or to choose a memory 855 type or layout appropriate to the usage. However, implementation 856 experience with BufferData is that developers frequently provide 857 wrong values and implementations have to guess anyway. 858 859 One option suggested was the <usage> parameter currently passed to 860 BufferData. Another option was to set it with TexParameter. 861 862 20. How should this extension interact with 863 EGLImageTargetTexture2DOES, eglBindTexImage, glXBindTexImage and 864 wglBindTexImage? 865 866 RESOLVED. These functions will not be permitted after glTexStorage*. 867 868 Several options are possible: 869 870 A) Disallow these functions. 871 B) Allow them, but have them reset the TEXTURE_IMMUTABLE_FORMAT_EXT 872 flag. 873 C) Allow them unconditionally. 874 875 C would violate the design principle that the dimensions and format 876 of the mipmap array are immutable. B does not so much modify the 877 dimension and formats as replace them with an entirely different 878 set. 879 880 21. Should there be a single function for specifying 1D, 2D and 3D 881 targets? 882 883 RESOLVED. No, we will stick with existing precedent. 884 885 22. Is it possible to use GenerateMipmap with an incomplete mipmap 886 pyramid? 887 888 RESOLVED. Yes, because the effective max level is limited to the 889 levels that were specified, and so GenerateMipmap does not generate 890 any new levels. 891 892 However, to make automatic mipmap generation work, it is necessary 893 to redefine p rather than q, since automatic mipmap generation 894 ignores the max level. 895 896 23. How should this extension interact with 897 OES_compressed_paletted_texture? 898 899 RESOLVED. Paletted textures will not be permitted, and will 900 generate INVALID_ENUM. 901 902 DISCUSSION: OES_compressed_paletted_texture supplies all the mipmaps 903 in a single function call, with the palette specified once. That's 904 incompatible with the upload model in this extension. 905 906 24. How can ETC1 textures be used with this extension? 907 908 RESOLVED. Add language in this extension to allow subregion uploads 909 for ETC1. 910 911 DISCUSSION: GL_OES_compressed_ETC1_RGB8_texture doesn't allow 912 CompressedTexSubImage*, so it would be impossible to use this 913 extension with ETC1. This is seen as an oversight in the ETC1 914 extension. While it cannot be fixed in that extension (since it is 915 already shipping), this extension can add that capability. 916 917 25. Should any other compressed formats be similarly modified? 918 919 RESOLVED. Yes, AMD_compressed_ATC_texture and 920 AMD_compressed_3DC_texture can be modified similarly to ETC1 921 (Maurice Ribble indicated that both formats use 4x4 blocks). Desktop 922 OpenGL requires that whole-image replacement is supported for any 923 compressed texture format, and the OpenGL ES extensions 924 EXT_texture_compression_dxt1 and IMG_texture_compression_pvrtc 925 already allow whole-image replacement, so it is not necessary to 926 modify them to be used with this extension. 927 928 26. Should these commands be permitted in display lists? 929 930 RESOLVED. No. 931 932 DISCUSSION: Display lists are most useful for repeating commands, 933 and TexStorage* commands cannot be repeated because the first call 934 makes the format immutable. 935 936 27. Should these commands accept unsized internal formats? 937 938 RESOLVED: No, for both OpenGL and OpenGL ES. 939 940 DISCUSSION: normally the <type> parameter to TexImage* can serve as 941 a hint to select a sized format (and in OpenGL ES, this is the only 942 mechanism available); since TexStorage* does not have a <type> 943 parameter, the implementation has no information on which to base a 944 decision. 945 946Revision History 947 948 Revision 24, 2011/11/11 (dgkoch) 949 - Mark complete. Clarify ES clarifications. 950 951 Revision 23, 2011/11/10 (dgkoch) 952 - Add GLES clarifcations and interactions with more GLES extensions 953 954 Revision 22, 2011/11/10 (bmerry) 955 - Update my contact details 956 957 Revision 21, 2011/07/25 (bmerry) 958 - Remove dangling references to MultiTexStorage in Errors section 959 960 Revision 20, 2011/07/21 (bmerry) 961 - Remove dangling reference to <samples> in Errors section 962 963 Revision 19, 2011/05/02 (Jon Leech) 964 - Assign enum value 965 966 Revision 18, 2011/01/24 (bmerry) 967 - Disallow unsized internal formats (oversight in revision 17). 968 969 Revision 17, 2011/01/24 (bmerry) 970 - Added and resolved issue 26. 971 - Split issue 27 out from issue 15. 972 - Disallow TexStorage* in display lists. 973 - Use the term "immutable-format" consistently (bug 7281). 974 975 Revision 16, 2010/11/23 (bmerry) 976 - Disallowed TexStorage on an immutable-format texture 977 (resolves issue 5). 978 - Deleted MultiTexStorage* commands (other DSA functions still 979 unresolved). 980 - Some minor wording changes suggested by Pat Brown (bug 7002). 981 982 Revision 15, 2010/11/09 (bmerry) 983 - Reopened issue 5. 984 - Reopened issue 14, pending stabilisation of 985 ARB_direct_state_access. 986 - Marked issue 9 resolved, pending any objections. 987 - Fix references to no object being bound (was meant to refer to 988 the default object). 989 - Adding missing pseudocode for TEXTURE_1D_ARRAY. 990 - Corrected TEXTURE_2D_ARRAY -> TEXTURE_1D_ARRAY in error checks. 991 - Changed "levels... are removed" to "levels... are reset to their 992 init state", since desktop GL has per-level state apart from the 993 texels. 994 - Miscellaneous wording fixes. 995 996 Revision 14, 2010/09/25 (bmerry) 997 - Add issues 24-25 and alterations to 998 OES_compressed_ETC1_RGB8_texture, AMD_compressed_ATC_texture and 999 AMD_compressed_3DC_texture. 1000 1001 Revision 13, 2010/09/19 (bmerry) 1002 - Two typo fixes from Daniel Koch 1003 1004 Revision 12, 2010/09/18 (bmerry) 1005 - Changed resolution to issue 20 1006 - Added and resolved issue 23 1007 - Added explanation of how to upload data (in overview) 1008 - Added spec language to implement resolution to issue 15 1009 1010 Revision 11, 2010/07/21 (bmerry) 1011 - Resolved issue 16 1012 - Reopen issue 20 1013 - Fix some typos 1014 1015 Revision 10, 2010/07/15 (bmerry) 1016 - Update some issues to match core text 1017 - Resolved issue 17 1018 1019 Revision 9, 2010/05/24 (bmerry) 1020 - Marked issue 2 as resolved 1021 - Resolved issue 19 (as no change) 1022 - Resolved issue 20 1023 - Add issues 21-22 1024 - Add in spec language to forbid use on default textures 1025 - Redefine level_base, level_max to be clamped forms of 1026 TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL when using immutable 1027 textures 1028 - Redefine p to also be clamped to the provided levels for 1029 immutable textures, to support automatic mipmap generation 1030 - Removed multisample functions 1031 - Removed language stating that texture parameters were reset to 1032 defaults 1033 1034 Revision 8, 2010/05/18 (bmerry) 1035 - Added issue about EGLimage 1036 - Marked issue 14 as resolved 1037 1038 Revision 7, 2010/05/04 (bmerry) 1039 - Removed some lingering <format>, <type> parameters to the new 1040 functions that should have been removed in revision 4 1041 - Trivial typo fixes 1042 1043 Revision 6, 2010/02/18 (bmerry) 1044 - Resolved issues 5, 6 and 18 1045 - Added MultiTexStorage* functions for DSA interaction 1046 - Added error for texture-target mismatch in DSA 1047 - Allowed TexStorage* to be called again 1048 1049 Revision 5, 2010/01/25 (bmerry) 1050 - Added to contributors list 1051 - Require OpenGL 1.2, to simplify interactions with 1052 TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL and CLAMP_TO_EDGE 1053 - Change default wrap modes to always be CLAMP_TO_EDGE 1054 - Change default filters to always be NEAREST 1055 - Moved language about generating new levels into an interaction, 1056 since it can only happen on OpenGL ES 1057 - Added interaction with EXT_direct_state_access 1058 - Added extra <internalformats> for GL ES when OES_depth_texture, 1059 OES_packed_depth_stencil and EXT_texture_type_2_10_10_10_REV are 1060 present. 1061 - Minor non-functional wording fixes and typos 1062 - Resolved issue 16 1063 - Added issues 17-19 1064 1065 Revision 4, 2010/01/13 (bmerry) 1066 - Changed suffix from ARM to EXT 1067 - Added list of contributors 1068 - Added language to force the texture to always be complete 1069 - Removed <format> and <type> arguments 1070 - Added issues 14-16 1071 - Reopened issue 2 1072 - Reformatted issues to separate resolution and discussion 1073 - Resolved issues 1, 9 and 11-13 1074 - Fixed the max number of levels in a cube map array 1075 1076 Revision 3, 2009/12/17 (bmerry) 1077 - Added missing vendor suffix to TEXTURE_IMMUTABLE_FORMAT_ARM 1078 - Rewritten to against desktop OpenGL 1079 - Added prototypes for 1D and multisample storage functions 1080 - Added issues 8-13 1081 1082 Revision 2, 2009/08/20 (bmerry) 1083 - Resolved issue 2 (no border parameter) 1084 - Resolved issue 4 (metadata becomes immutable) 1085 - Added interaction with OES_texture_cube_map 1086 - Added error if width != height in a cube map 1087 - Added issues 5-7 1088 1089 Revision 1, 2009/05/06 (bmerry) 1090 - First draft 1091