| Name |
| |
| EXT_texture_storage |
| |
| Name Strings |
| |
| GL_EXT_texture_storage |
| |
| Contact |
| |
| Bruce Merry (bmerry 'at' gmail.com) |
| Ian Romanick, Intel (ian.d.romanick 'at' intel.com) |
| |
| Contributors |
| |
| Jeremy Sandmel, Apple |
| Bruce Merry, ARM |
| Tom Olson, ARM |
| Benji Bowman, Imagination Technologies |
| Ian Romanick, Intel |
| Jeff Bolz, NVIDIA |
| Pat Brown, NVIDIA |
| Maurice Ribble, Qualcomm |
| Lingjun Chen, Qualcomm |
| Daniel Koch, Transgaming Inc |
| |
| Status |
| |
| Complete. |
| |
| Version |
| |
| Last Modified Date: November 11, 2011 |
| Author Revision: 24 |
| |
| Number |
| |
| OpenGL ES Extension #108 |
| |
| Dependencies |
| |
| OpenGL ES 1.0, OpenGL ES 2.0 or OpenGL 1.2 is required. |
| |
| OES_texture_npot, OES_texture_cube_map, OES_texture_3D, |
| OES_depth_texture, OES_packed_depth_stencil, |
| OES_compressed_paletted_texture, OES_texture_float, OES_texture_half_float |
| EXT_texture_type_2_10_10_10_REV, EXT_texture_format_BGRA8888, |
| EXT_texture3D, OES_texture_npot, APPLE_texture_2D_limited_npot, |
| ARB_texture_cube_map, ARB_texture_cube_map_array, |
| ARB_texture_rectangle, SGIS_generate_mipmap, |
| EXT_direct_state_access, OES_EGL_image, WGL_ARB_render_texture, |
| GLX_EXT_texture_from_pixmap, and core specifications that |
| incorporate these extensions affect the definition of this |
| extension. |
| |
| This extension is written against the OpenGL 3.2 Core Profile |
| specification. |
| |
| Overview |
| |
| The texture image specification commands in OpenGL allow each level |
| to be separately specified with different sizes, formats, types and |
| so on, and only imposes consistency checks at draw time. This adds |
| overhead for implementations. |
| |
| This extension provides a mechanism for specifying the entire |
| structure of a texture in a single call, allowing certain |
| consistency checks and memory allocations to be done up front. Once |
| specified, the format and dimensions of the image array become |
| immutable, to simplify completeness checks in the implementation. |
| |
| When using this extension, it is no longer possible to supply texture |
| data using TexImage*. Instead, data can be uploaded using TexSubImage*, |
| or produced by other means (such as render-to-texture, mipmap generation, |
| or rendering to a sibling EGLImage). |
| |
| This extension has complicated interactions with other extensions. |
| The goal of most of these interactions is to ensure that a texture |
| is always mipmap complete (and cube complete for cubemap textures). |
| |
| IP Status |
| |
| No known IP claims |
| |
| New Procedures and Functions |
| |
| void TexStorage1DEXT(enum target, sizei levels, |
| enum internalformat, |
| sizei width); |
| |
| void TexStorage2DEXT(enum target, sizei levels, |
| enum internalformat, |
| sizei width, sizei height); |
| |
| void TexStorage3DEXT(enum target, sizei levels, |
| enum internalformat, |
| sizei width, sizei height, sizei depth); |
| |
| void TextureStorage1DEXT(uint texture, enum target, sizei levels, |
| enum internalformat, |
| sizei width); |
| |
| void TextureStorage2DEXT(uint texture, enum target, sizei levels, |
| enum internalformat, |
| sizei width, sizei height); |
| |
| void TextureStorage3DEXT(uint texture, enum target, sizei levels, |
| enum internalformat, |
| sizei width, sizei height, sizei depth); |
| |
| New Types |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <value> parameter of GetTexParameter{if}v: |
| |
| TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F |
| |
| Accepted by the <internalformat> parameter of TexStorage* when |
| implemented on OpenGL ES: |
| |
| ALPHA8_EXT 0x803C /* reuse tokens from EXT_texture */ |
| LUMINANCE8_EXT 0x8040 |
| LUMINANCE8_ALPHA8_EXT 0x8045 |
| |
| (if OES_texture_float is supported) |
| RGBA32F_EXT 0x8814 /* reuse tokens from ARB_texture_float */ |
| RGB32F_EXT 0x8815 |
| ALPHA32F_EXT 0x8816 |
| LUMINANCE32F_EXT 0x8818 |
| LUMINANCE_ALPHA32F_EXT 0x8819 |
| |
| (if OES_texture_half_float is supported) |
| RGBA16F_EXT 0x881A /* reuse tokens from ARB_texture_float */ |
| RGB16F_EXT 0x881B |
| ALPHA16F_EXT 0x881C |
| LUMINANCE16F_EXT 0x881E |
| LUMINANCE_ALPHA16F_EXT 0x881F |
| |
| (if EXT_texture_type_2_10_10_10_REV is supported) |
| RGB10_A2_EXT 0x8059 /* reuse tokens from EXT_texture */ |
| RGB10_EXT 0x8052 |
| |
| (if EXT_texture_format_BGRA8888 is supported) |
| BGRA8_EXT 0x93A1 |
| |
| |
| Additions to Chapter 2 of the OpenGL 3.2 Core Profile Specification |
| (OpenGL Operation) |
| |
| None |
| |
| Additions to Chapter 3 of the OpenGL 3.2 Core Profile Specification |
| (Rasterization) |
| |
| After section 3.8.1 (Texture Image Specification) add a new |
| subsection called "Immutable-format texture images": |
| |
| "An alterative set of commands is provided for specifying the |
| properties of all levels of a texture at once. Once a texture is |
| specified with such a command, the format and dimensions of all |
| levels becomes immutable, unless it is a proxy texture (since |
| otherwise it would no longer be possible to use the proxy). The |
| contents of the images and the parameters can still be modified. |
| Such a texture is referred to as an "immutable-format" texture. The |
| immutability status of a texture can be determined by calling |
| GetTexParameter with <pname> TEXTURE_IMMUTABLE_FORMAT_EXT. |
| |
| Each of the commands below is described by pseudo-code which |
| indicates the effect on the dimensions and format of the texture. |
| For all of the commands, the following apply in addition to the |
| pseudo-code: |
| |
| - If the default texture object is bound to <target>, an |
| INVALID_OPERATION error is generated. |
| - If executing the pseudo-code would lead to an error, the error is |
| generated and the command will have no effect. |
| - Any existing levels that are not replaced are reset to their |
| initial state. |
| - If <width>, <height>, <depth> or <levels> is less than 1, the |
| error INVALID_VALUE is generated. |
| - Since no pixel data are provided, the <format> and <type> values |
| used in the pseudo-code are irrelevant; they can be considered to |
| be any values that are legal to use with <internalformat>. |
| - If the command is successful, TEXTURE_IMMUTABLE_FORMAT_EXT becomes |
| TRUE. |
| - If <internalformat> is a specific compressed texture format, then |
| references to TexImage* should be replaced by CompressedTexImage*, |
| with <format>, <type> and <data> replaced by any valid <imageSize> and |
| <data>. If there is no <imageSize> for which this command would have |
| been valid, an INVALID_OPERATION error is generated [fn: This |
| condition is not required for OpenGL, but is necessary for OpenGL |
| ES which does not support on-the-fly compression.] |
| - If <internalformat> is one of the internal formats listed in table |
| 3.11, an INVALID_ENUM error is generated. [fn: The corresponding table |
| in OpenGL ES 2.0 is table 3.8.] |
| |
| The command |
| |
| void TexStorage1DEXT(enum target, sizei levels, |
| enum internalformat, |
| sizei width); |
| |
| specifies all the levels of a one-dimensional texture (or proxy) at |
| the same time. It is described by the pseudo-code below: |
| |
| for (i = 0; i < levels; i++) |
| { |
| TexImage1D(target, i, internalformat, width, 0, |
| format, type, NULL); |
| width = max(1, floor(width / 2)); |
| } |
| |
| If <target> is not TEXTURE_1D or PROXY_TEXTURE_1D then INVALID_ENUM |
| is generated. If <levels> is greater than floor(log_2(width)) + 1 |
| then INVALID_OPERATION is generated. |
| |
| The command |
| |
| void TexStorage2DEXT(enum target, sizei levels, |
| enum internalformat, |
| sizei width, sizei height); |
| |
| specifies all the levels of a two-dimensional, cube-map, |
| one-dimension array or rectangle texture (or proxy) at the same |
| time. The pseudo-code depends on the <target>: |
| |
| [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_RECTANGLE or |
| PROXY_TEXTURE_CUBE_MAP: |
| |
| for (i = 0; i < levels; i++) |
| { |
| TexImage2D(target, i, internalformat, width, height, 0, |
| format, type, NULL); |
| width = max(1, floor(width / 2)); |
| height = max(1, floor(height / 2)); |
| } |
| |
| TEXTURE_CUBE_MAP: |
| |
| for (i = 0; i < levels; i++) |
| { |
| for face in (+X, -X, +Y, -Y, +Z, -Z) |
| { |
| TexImage2D(face, i, internalformat, width, height, 0, |
| format, type, NULL); |
| } |
| width = max(1, floor(width / 2)); |
| height = max(1, floor(height / 2)); |
| } |
| |
| [PROXY_]TEXTURE_1D_ARRAY: |
| |
| for (i = 0; i < levels; i++) |
| { |
| TexImage2D(target, i, internalformat, width, height, 0, |
| format, type, NULL); |
| width = max(1, floor(width / 2)); |
| } |
| |
| If <target> is not one of those listed above, the error INVALID_ENUM |
| is generated. |
| |
| The error INVALID_OPERATION is generated if any of the following |
| conditions hold: |
| - <target> is [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater than |
| floor(log_2(width)) + 1 |
| - <target> is not [PROXY_]TEXTURE_1D_ARRAY and <levels> is greater |
| than floor(log_2(max(width, height))) + 1 |
| |
| The command |
| |
| void TexStorage3DEXT(enum target, sizei levels, enum internalformat, |
| sizei width, sizei height, sizei depth); |
| |
| specifies all the levels of a three-dimensional, two-dimensional |
| array texture, or cube-map array texture (or proxy). The pseudo-code |
| depends on <target>: |
| |
| [PROXY_]TEXTURE_3D: |
| |
| for (i = 0; i < levels; i++) |
| { |
| TexImage3D(target, i, internalformat, width, height, depth, 0, |
| format, type, NULL); |
| width = max(1, floor(width / 2)); |
| height = max(1, floor(height / 2)); |
| depth = max(1, floor(depth / 2)); |
| } |
| |
| [PROXY_]TEXTURE_2D_ARRAY, [PROXY_]TEXTURE_CUBE_MAP_ARRAY_ARB: |
| |
| for (i = 0; i < levels; i++) |
| { |
| TexImage3D(target, i, internalformat, width, height, depth, 0, |
| format, type, NULL); |
| width = max(1, floor(width / 2)); |
| height = max(1, floor(height / 2)); |
| } |
| |
| If <target> is not one of those listed above, the error INVALID_ENUM |
| is generated. |
| |
| The error INVALID_OPERATION is generated if any of the following |
| conditions hold: |
| - <target> is [PROXY_]TEXTURE_3D and <levels> is greater than |
| floor(log_2(max(width, height, depth))) + 1 |
| - <target> is [PROXY_]TEXTURE_2D_ARRAY or |
| [PROXY_]TEXTURE_CUBE_MAP_ARRAY_EXT and <levels> is greater than |
| floor(log_2(max(width, height))) + 1 |
| |
| After a successful call to any TexStorage* command with a non-proxy |
| target, the value of TEXTURE_IMMUTABLE_FORMAT_EXT for this texture |
| object is set to TRUE, and no further changes to the dimensions or |
| format of the texture object may be made. Other commands may only |
| alter the texel values and texture parameters. Using any of the |
| following commands with the same texture will result in the error |
| INVALID_OPERATION being generated, even if it does not affect the |
| dimensions or format: |
| |
| - TexImage* |
| - CompressedTexImage* |
| - CopyTexImage* |
| - TexStorage* |
| |
| The TextureStorage* commands operate identically to the |
| corresponding command where "Texture" is substituted for "Tex" |
| except, rather than updating the current bound texture for the |
| texture unit indicated by the current active texture state and the |
| target parameter, these "Texture" commands update the texture object |
| named by the initial texture parameter. The error INVALID_VALUE |
| is generated if <texture> is zero. |
| " |
| |
| In section 3.8.6 (Texture Parameters), after the sentence |
| |
| "In the remainder of section 3.8, denote by lod_min, lod_max, |
| level_base, and level_max the values of the texture parameters |
| TEXTURE_MIN_LOD, TEXTURE_MAX_LOD, TEXTURE_BASE_LEVEL, and |
| TEXTURE_MAX_LEVEL respectively." |
| |
| add |
| |
| "However, if TEXTURE_IMMUTABLE_FORMAT_EXT is |
| TRUE, then level_base is clamped to the range [0, <levels> - 1] and |
| level_max is then clamped to the range [level_base, <levels> - 1], |
| where <levels> is the parameter passed the call to TexStorage* for |
| the texture object. |
| |
| In section 3.8.9 (Rendering feedback loops) replace all references |
| to TEXTURE_BASE_LEVEL by level_base. |
| |
| In section 3.8.9 (Mipmapping), replace the paragraph starting "Each |
| array in a mipmap is defined..." by |
| |
| "Each array in a mipmap is defined using TexImage3D, TexImage2D, |
| CopyTexImage2D, TexImage1D, CopyTexImage1D, or by functions that are |
| defined in terms of these functions. Level-of-detail numbers proceed |
| from level_base for the original texel array through the maximum |
| level p, with each unit increase indicating an array of half the |
| dimensions of the previous one (rounded down to the next integer if |
| fractional) as already described. For immutable-format textures, |
| p is one less than the <levels> parameter passed to TexStorage*; |
| otherwise p = floor(log_2(maxsize)) + level_base. All arrays from |
| level_base through q = min(p, level_max) must be defined, as |
| discussed in section 3.8.12." |
| |
| In section 3.8.12 (Texture Completeness), modify the last sentence |
| to avoid refering to level_base and level_max: |
| |
| "An implementation may allow a texture image array of level 1 or |
| greater to be created only if a mipmap complete set of image arrays |
| consistent with the requested array can be supported where the |
| values of TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL are 0 and 1000 |
| respectively." |
| |
| Modify section 3.8.13 (Texture State and Proxy State) to add the new |
| state: |
| |
| "Each set consists of ..., and a boolean flag indicating whether the |
| format and dimensions of the texture are immutable." |
| |
| Add |
| "The initial value of TEXTURE_IMMUTABLE_FORMAT_EXT is FALSE." |
| |
| Additions to Chapter 4 of the OpenGL 3.2 Core Profile Specification |
| (Per-Fragment Operations and the Frame Buffer) |
| |
| None |
| |
| Additions to Chapter 5 of the OpenGL 3.2 Compatibility Profile Specification |
| (Special Functions) |
| |
| In section 5.4.1 (Commands Not Usable in Display Lists), add |
| TexStorage* to the list of commands that cannot be used. |
| |
| Additions to Chapter 6 of the OpenGL 3.2 Core Profile Specification |
| (State and State Requests) |
| |
| Replace the following statement in 6.1.3 (Enumerated Queries): |
| |
| "<value> must be one of the symbolic values in table 3.10." |
| |
| with |
| |
| "<value> must be TEXTURE_IMMUTABLE_FORMAT_EXT or one of the symbolic |
| values in table 3.22." |
| |
| Additions to the AGL/EGL/GLX/WGL Specifications |
| |
| None |
| |
| Additions to OES_compressed_ETC1_RGB8_texture |
| |
| Add the following to the additions to Chapter 3: |
| |
| "Since ETC1 images are easily edited along 4x4 texel boundaries, the |
| limitations on CompressedTexSubImage2D are relaxed. |
| CompressedTexSubImage2D will result in an INVALID_OPERATION error |
| only if one of the following conditions occurs: |
| |
| * <width> is not a multiple of four, and <width> plus <xoffset> is not |
| equal to the texture width; |
| |
| * <height> is not a multiple of four, and <height> plus <yoffset> is |
| not equal to the texture height; or |
| |
| * <xoffset> or <yoffset> is not a multiple of four. |
| |
| Remove CompressedTexSubImage2D from this error: |
| |
| "INVALID_OPERATION is generated by CompressedTexSubImage2D, |
| TexSubImage2D, or CopyTexSubImage2D if the texture image <level> |
| bound to <target> has internal format ETC1_RGB8_OES." |
| |
| Add the following error: |
| |
| "INVALID_OPERATION is generated by CompressedTexSubImage2D |
| if the region to be modified is not aligned to block boundaries |
| (refer to the extension text for details)." |
| |
| Additions to AMD_compressed_ATC_texture and AMD_compressed_3DC_texture: |
| |
| Apply the same changes as for OES_compressed_ETC1_RGB8_texture |
| above, substituting the appropriate internal format tokens from |
| these extensions. |
| |
| Dependencies on EXT_direct_state_access |
| |
| If EXT_direct_state_access is not present, references to |
| TextureStorage* should be ignored. |
| |
| Dependencies on OpenGL ES |
| |
| On OpenGL ES without extensions introducing TEXTURE_MAX_LEVEL, |
| mipmapped textures specified with TexStorage are required to have a |
| full set of mipmaps. If TEXTURE_MAX_LEVEL is not supported, this |
| extension is modified as follows: |
| |
| - Where an upper bound is placed on <levels> in this extension (i.e. |
| the maximum number of mipmap levels for a texture of the given |
| target and dimensions), an INVALID_OPERATION error is generated if |
| <levels> is neither 1 nor this upper bound. |
| - q (the effective maximum number of levels) is redefined to clamp |
| to the number of levels present in immutable-format textures. |
| |
| OpenGL ES does not accept sized internal formats (e.g., RGBA8) and |
| instead derives an internal format from the <format> and <type> |
| parameters of TexImage2D. Since TexStorage* does not specify texel |
| data, the API doesn't include <format> and <type> parameters. |
| On an OpenGL ES implementation, the values in the <internalformat> |
| column in the tables below are accepted as <internalformat> |
| parameters, and base internal formats are not accepted. The |
| TexImage* calls in the TexStorage* pseudocode are modified so that |
| the <internalformat>, <format> and <type> parameters are |
| taken from the <format>, <format> and <type> columns (respectively) |
| in the tables below, according to the <internalformat> |
| specified in the TexStorage* command. |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| RGB565 RGB UNSIGNED_SHORT_5_6_5 |
| RGBA4 RGBA UNSIGNED_SHORT_4_4_4_4 |
| RGB5_A1 RGBA UNSIGNED_SHORT_5_5_5_1 |
| RGB8_OES RGB UNSIGNED_BYTE |
| RGBA8_OES RGBA UNSIGNED_BYTE |
| LUMINANCE8_ALPHA8_EXT LUMINANCE_ALPHA UNSIGNED_BYTE |
| LUMINANCE8_EXT LUMINANCE UNSIGNED_BYTE |
| ALPHA8_EXT ALPHA UNSIGNED_BYTE |
| |
| If OES_depth_texture is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| DEPTH_COMPONENT16_OES DEPTH_COMPONENT UNSIGNED_SHORT |
| DEPTH_COMPONENT32_OES DEPTH_COMPONENT UNSIGNED_INT |
| |
| If OES_packed_depth_stencil is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| DEPTH24_STENCIL8_OES DEPTH_STENCIL_OES UNSIGNED_INT |
| |
| If OES_texture_float is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| RGBA32F_EXT RGBA FLOAT |
| RGB32F_EXT RGB FLOAT |
| LUMINANCE_ALPHA32F_EXT LUMINANCE_ALPHA FLOAT |
| LUMINANCE32F_EXT LUMINANCE FLOAT |
| ALPHA32F_EXT ALPHA FLOAT |
| |
| If OES_texture_half_float is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| RGBA16F_EXT RGBA HALF_FLOAT_OES |
| RGB16F_EXT RGB HALF_FLOAT_OES |
| LUMINANCE_ALPHA16F_EXT LUMINANCE_ALPHA HALF_FLOAT_OES |
| LUMINANCE16F_EXT LUMINANCE HALF_FLOAT_OES |
| ALPHA16F_EXT ALPHA HALF_FLOAT_OES |
| |
| If EXT_texture_type_2_10_10_10_REV is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| RGB10_A2_EXT RGBA UNSIGNED_INT_2_10_10_10_REV_EXT |
| RGB10_EXT RGB UNSIGNED_INT_2_10_10_10_REV_EXT |
| |
| If EXT_texture_format_BGRA8888 is supported: |
| |
| <internalformat> <format> <type> |
| ---------------- -------- ------ |
| BGRA8_EXT BGRA_EXT UNSIGNED_BYTE |
| |
| |
| Dependencies on texture targets |
| |
| If a particular texture target is not supported by the |
| implementation, passing it as a <target> to TexStorage* will |
| generate an INVALID_ENUM error. If as a result, any of the commands |
| defined in this extension would no longer have any valid <target>, |
| all references to the command should be ignored. |
| |
| In particular, note that OpenGL ES 1.x/2.0 do not have proxy textures, |
| 1D textures, or 3D textures, and thus only the TexStorage2DEXT |
| entry point is required. If OES_texture_3D is supported, the |
| TexStorage3DEXT entry point is also required. |
| |
| Dependencies on OES_texture_npot |
| |
| If OpenGL ES 2.0 or APPLE_texture_2D_limited_npot is present but |
| OES_texture_npot is not present, then INVALID_OPERATION is |
| generated by TexStorage* and TexStorage3DEXT if <levels> is |
| not one and <width>, <height> or <depth> is not a power of |
| two. |
| |
| Dependencies on WGL_ARB_render_texture, GLX_EXT_texture_from_pixmap, EGL |
| 1.4 and GL_OES_EGL_image |
| |
| The commands eglBindTexImage, wglBindTexImageARB, glXBindTexImageEXT or |
| EGLImageTargetTexture2DOES are not permitted on an immutable-format |
| texture. |
| They will generate the following errors: |
| - EGLImageTargetTexture2DOES: INVALID_OPERATION |
| - eglBindTexImage: EGL_BAD_MATCH |
| - wglBindTexImage: ERROR_INVALID_OPERATION |
| - glXBindTexImageEXT: BadMatch |
| |
| Dependencies on OES_compressed_paletted_texture |
| |
| The compressed texture formats exposed by |
| OES_compressed_paletted_texture are not supported by TexStorage*. |
| Passing one of these tokens to TexStorage* will generate an |
| INVALID_ENUM error. |
| |
| Errors |
| |
| Note that dependencies above modify the errors. |
| |
| If TexStorage* is called with a <width>, <height>, <depth> or |
| <levels> parameter that is less than one, then the error |
| INVALID_VALUE is generated. |
| |
| If the <target> parameter to TexStorage1DEXT is not |
| [PROXY_]TEXTURE_1D, then the error INVALID_ENUM is generated. |
| |
| If the <target> parameter to TexStorage2DEXT is not |
| [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_CUBE_MAP, |
| [PROXY_]TEXTURE_RECTANGLE or [PROXY_]TEXTURE_1D_ARRAY, then the |
| error INVALID_ENUM is generated. |
| |
| If the <target> parameter to TexStorage3DEXT is not |
| [PROXY_]TEXTURE_3D, [PROXY_]TEXTURE_2D_ARRAY or |
| [PROXY_]TEXTURE_CUBE_MAP_ARRAY then the error INVALID_ENUM is |
| generated. |
| |
| If the <levels> parameter to TexStorage* is greater than the |
| <target>-specific value listed below then the error |
| INVALID_OPERATION is generated: |
| [PROXY_]TEXTURE_{1D,1D_ARRAY}: |
| floor(log_2(width)) + 1 |
| [PROXY_]TEXTURE_{2D,2D_ARRAY,CUBE_MAP,CUBE_MAP_ARRAY}: |
| floor(log_2(max(width, height))) + 1 |
| [PROXY_]TEXTURE_3D: |
| floor(log_2(max(width, height, depth))) + 1 |
| [PROXY_]TEXTURE_RECTANGLE: |
| 1 |
| |
| If the default texture object is bound to the <target> passed to |
| TexStorage*, then the error INVALID_OPERATION is generated. |
| |
| If the <target> parameter to TextureStorage* does not match the |
| dimensionality of <texture>, then the error INVALID_OPERATION is |
| generated. |
| |
| If the <texture> parameter to TextureStorage* is zero, then the |
| INVALID_VALUE is generated. |
| |
| If any pseudo-code listed in this extension would generate an error, |
| then that error is generated. |
| |
| Calling any of the following functions on a texture for which |
| TEXTURE_IMMUTABLE_FORMAT_EXT is TRUE will generate an |
| INVALID_OPERATION error: |
| - TexImage* |
| - CompressedTexImage* |
| - CopyTexImage* |
| |
| New State |
| |
| Additions to Table 6.8 Textures (state per texture object) |
| |
| Initial |
| Get Value Type Get Command Value Description Sec. |
| --------- ---- ----------- ------- ----------- ---- |
| TEXTURE_IMMUTABLE_FORMAT_EXT B GetTexParameter FALSE Size and format immutable 2.6 |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| 1. What should this extension be called? |
| |
| RESOLVED: EXT_texture_storage is chosen for consistency with the |
| glRenderbufferStorage entry point. |
| |
| 2. Should TexStorage* accept a border parameter? |
| |
| RESOLVED: no. |
| |
| DISCUSSION: Currently it does not, since borders are a deprecated |
| feature which is not supported by all hardware. Users of the |
| compatibility profile can continue to use the existing texture |
| specification functions, but there is an argument that users of |
| compatibility profile may also want to use this extension. |
| |
| 3. What is the correct error when <levels> specifies a partial |
| mipmap pyramid for OpenGL ES? |
| |
| RESOLVED: INVALID_OPERATION, since it is an interaction between |
| parameters rather than a single value being invalid. It also makes |
| sense to relax this condition for desktop GL where it makes sense to |
| use a truncated pyramid with TEXTURE_MAX_LEVEL. |
| |
| 4. Should use of these entry-points make the metadata (format and |
| dimensions) immutable? |
| |
| RESOLVED: Yes. |
| |
| DISCUSSION: The benefits of knowing metadata can't change will |
| probably outweigh the extra cost of checking the |
| TEXTURE_IMMUTABLE_FORMAT_EXT flag on each texture specification |
| call. |
| |
| 5. Should it be legal to completely replace the texture using a new call |
| to TexStorage*? |
| |
| RESOLVED. It will not be allowed. |
| |
| DISCUSSION: This is useful to invalidate all levels of a texture. |
| Allowing the metadata to be changed here seems easier than trying to |
| define a portable definition of what it means to change the metadata |
| (e.g. what if you used an unsized internal format the first time and |
| the corresponding sized internal format the second time, or vice |
| versa)? |
| |
| However, while this is largely similar to deleting the old texture |
| object and replacing it with a new one, it does lose some of the |
| advantages of immutability. Specifically, because doing so does not |
| reset bindings, it doesn't allow a migration path to an API that |
| validates the texture format at bind time. |
| |
| 6. Should it be legal to use TexImage* after TexStorage* if it doesn't |
| affect the metadata? |
| |
| RESOLVED: No. |
| |
| DISCUSSION: A potential use case is to allow a single level of a |
| texture to be invalidated using a NULL pointer. However, as noted |
| above it is non-trivial to determine what constitutes a change. |
| |
| 7. How does this extension interact with APPLE_texture_2D_limited_npot? |
| |
| RESOLVED. APPLE_texture_2D_limited_npot is equivalent to the NPOT |
| support in OpenGL ES 2.0. |
| |
| 8. Should this extension be written to work with desktop OpenGL? |
| |
| RESOLVED: Yes. |
| |
| DISCUSSION: There has been been interest and it will future-proof it |
| against further additions to OpenGL ES. |
| |
| 9. Which texture targets should be supported? |
| |
| RESOLVED. All targets except multisample and buffer textures are |
| supported. |
| |
| Initially all targets except TEXTURE_BUFFER were supported. It was |
| noted that the entrypoints for multisample targets added no useful |
| functionality, since multisample textures have no completeness |
| checks beyond being non-empty. |
| |
| Rectangle textures have completeness checks to prevent filtering of |
| integer textures. However, since we decided to only force mipmap |
| completeness, this becomes less useful. |
| |
| 10. Should this extension support proxy textures? |
| |
| RESOLVED: Yes. |
| |
| DISCUSSION: It should be orthogonal. |
| |
| 11. Are the <format> and <type> parameters necessary? |
| |
| RESOLVED. No, they will be removed. |
| |
| DISCUSSION: For OpenGL ES the type parameter was necessary to |
| determine the precision of the texture, but this can be solved by |
| having these functions accept sized internal formats (which are |
| already accepted by renderbuffers). |
| |
| 12. Should it be legal to make the default texture (id 0) |
| immutable-format? |
| |
| RESOLVED: No. |
| |
| DISCUSSION: This would make it impossible to restore the context to |
| it's default state, which is deemed undesirable. There is no good |
| reason not to use named texture objects. |
| |
| 13. Should we try to guarantee that textures made through this path |
| will always be complete? |
| |
| RESOLVED: It should be guaranteed that the texture will be mipmap |
| complete. |
| |
| DISCUSSION: Future separation between images and samplers will still |
| allow users to create combinations that are invalid, but |
| constraining the simple cases will make these APIs easier to use for |
| beginners. |
| |
| 14. Should these functions use a EXT_direct_state_access approach to |
| specifying the texture objects? |
| |
| UNRESOLVED. |
| |
| DISCUSSION: as a standalone extension, no DSA-like functions will be |
| added. However, interactions with EXT_direct_state_access and |
| ARB_direct_state_access need to be resolved. |
| |
| 15. Should these functions accept generic compressed formats? |
| |
| RESOLVED: Yes. Note that the spec language will need to be modified |
| to allow this for ES, since the pseudocode is written in terms of |
| TexImage2D, which does not allow compressed texture formats in ES. |
| See also issues 23 and 27. |
| |
| 16. How should completeness be forced when TEXTURE_MAX_LEVEL is not |
| present? |
| |
| RESOLVED. The maximum level q will be redefined to clamp to the |
| highest level available. |
| |
| DISCUSSION: A single-level texture can be made complete either by |
| making it mipmap complete (by setting TEXTURE_MAX_LEVEL to 0) or by |
| turning off mipmapping (by choose an appropriate minification |
| filter). |
| |
| Some options: |
| |
| A: Specify that TexStorage* changes the default minification filter |
| for OpenGL ES. This makes it awkward to add TEXTURE_MAX_LEVEL |
| support to OpenGL ES later, since switching to match GL would break |
| compatibility. The two mechanisms also do not give identical |
| results, since the magnification threshold depends on the |
| minification filter. |
| |
| B: Specify that the texture behaves as though TEXTURE_MAX_LEVEL were |
| zero. To specify this properly probably requires fairly intrusive |
| changes to the OpenGL ES full specification to add back all the |
| language relating to the max level. It also does not solve the |
| similar problem of what to do with NPOT textures; and it may have |
| hardware impacts due to the change in the min/mag crossover. |
| |
| C: Specify that TexStorage* changes the default minification filter |
| for all implementations when a single-level texture is specified. |
| This may be slightly counter-intuitive to desktop GL users, but will |
| give consistent behaviour across variants of GL and avoids changing |
| the functional behaviour of this extension based on the presence or |
| absence of some other feature. |
| |
| Currently B is specified. This has potential hardware implications |
| for OpenGL ES because of the effect of the minification filter on |
| the min/mag crossover. However, C has potential hardware implications |
| for OpenGL due to the separation of texture and sampler state. |
| |
| 17. How should completeness be forced when only ES2-style NPOT is |
| available? |
| |
| RESOLVED. It is not worth trying to do this, in light of issue 13. |
| |
| Previous revisions of this extension overrode the minification |
| filter and wrap modes, but that is no longer the case. Since |
| OES_texture_npot removes the caveats on NPOT textures anyway, it |
| might not be worth trying to "fix" this. |
| |
| 18. For OpenGL ES, how do the new sized internal formats interact |
| with OES_required_internal_format? |
| |
| RESOLVED. |
| |
| If OES_required_internal_format is not present, then the |
| <internalformat> parameter is intended merely to indicate what the |
| corresponding <format> and <type> would have been, had TexImage* |
| been used instead. If OES_required_internal_format is present, then |
| it is intended that the <internalformat> will be interpreted as if |
| it had been passed directly to TexImage*. |
| |
| 19. Should there be some hinting mechanism to indicate whether data |
| is coming immediately or later? |
| |
| RESOLVED. No parameter is needed. An extension can be added to provide |
| a TexParameter value which is latched at TexStorage time. |
| |
| DISCUSSION: Some members felt that this would be useful so that they |
| could defer allocation when suitable, particularly if higher- |
| resolution images will be streamed in later; or to choose a memory |
| type or layout appropriate to the usage. However, implementation |
| experience with BufferData is that developers frequently provide |
| wrong values and implementations have to guess anyway. |
| |
| One option suggested was the <usage> parameter currently passed to |
| BufferData. Another option was to set it with TexParameter. |
| |
| 20. How should this extension interact with |
| EGLImageTargetTexture2DOES, eglBindTexImage, glXBindTexImage and |
| wglBindTexImage? |
| |
| RESOLVED. These functions will not be permitted after glTexStorage*. |
| |
| Several options are possible: |
| |
| A) Disallow these functions. |
| B) Allow them, but have them reset the TEXTURE_IMMUTABLE_FORMAT_EXT |
| flag. |
| C) Allow them unconditionally. |
| |
| C would violate the design principle that the dimensions and format |
| of the mipmap array are immutable. B does not so much modify the |
| dimension and formats as replace them with an entirely different |
| set. |
| |
| 21. Should there be a single function for specifying 1D, 2D and 3D |
| targets? |
| |
| RESOLVED. No, we will stick with existing precedent. |
| |
| 22. Is it possible to use GenerateMipmap with an incomplete mipmap |
| pyramid? |
| |
| RESOLVED. Yes, because the effective max level is limited to the |
| levels that were specified, and so GenerateMipmap does not generate |
| any new levels. |
| |
| However, to make automatic mipmap generation work, it is necessary |
| to redefine p rather than q, since automatic mipmap generation |
| ignores the max level. |
| |
| 23. How should this extension interact with |
| OES_compressed_paletted_texture? |
| |
| RESOLVED. Paletted textures will not be permitted, and will |
| generate INVALID_ENUM. |
| |
| DISCUSSION: OES_compressed_paletted_texture supplies all the mipmaps |
| in a single function call, with the palette specified once. That's |
| incompatible with the upload model in this extension. |
| |
| 24. How can ETC1 textures be used with this extension? |
| |
| RESOLVED. Add language in this extension to allow subregion uploads |
| for ETC1. |
| |
| DISCUSSION: GL_OES_compressed_ETC1_RGB8_texture doesn't allow |
| CompressedTexSubImage*, so it would be impossible to use this |
| extension with ETC1. This is seen as an oversight in the ETC1 |
| extension. While it cannot be fixed in that extension (since it is |
| already shipping), this extension can add that capability. |
| |
| 25. Should any other compressed formats be similarly modified? |
| |
| RESOLVED. Yes, AMD_compressed_ATC_texture and |
| AMD_compressed_3DC_texture can be modified similarly to ETC1 |
| (Maurice Ribble indicated that both formats use 4x4 blocks). Desktop |
| OpenGL requires that whole-image replacement is supported for any |
| compressed texture format, and the OpenGL ES extensions |
| EXT_texture_compression_dxt1 and IMG_texture_compression_pvrtc |
| already allow whole-image replacement, so it is not necessary to |
| modify them to be used with this extension. |
| |
| 26. Should these commands be permitted in display lists? |
| |
| RESOLVED. No. |
| |
| DISCUSSION: Display lists are most useful for repeating commands, |
| and TexStorage* commands cannot be repeated because the first call |
| makes the format immutable. |
| |
| 27. Should these commands accept unsized internal formats? |
| |
| RESOLVED: No, for both OpenGL and OpenGL ES. |
| |
| DISCUSSION: normally the <type> parameter to TexImage* can serve as |
| a hint to select a sized format (and in OpenGL ES, this is the only |
| mechanism available); since TexStorage* does not have a <type> |
| parameter, the implementation has no information on which to base a |
| decision. |
| |
| Revision History |
| |
| Revision 24, 2011/11/11 (dgkoch) |
| - Mark complete. Clarify ES clarifications. |
| |
| Revision 23, 2011/11/10 (dgkoch) |
| - Add GLES clarifcations and interactions with more GLES extensions |
| |
| Revision 22, 2011/11/10 (bmerry) |
| - Update my contact details |
| |
| Revision 21, 2011/07/25 (bmerry) |
| - Remove dangling references to MultiTexStorage in Errors section |
| |
| Revision 20, 2011/07/21 (bmerry) |
| - Remove dangling reference to <samples> in Errors section |
| |
| Revision 19, 2011/05/02 (Jon Leech) |
| - Assign enum value |
| |
| Revision 18, 2011/01/24 (bmerry) |
| - Disallow unsized internal formats (oversight in revision 17). |
| |
| Revision 17, 2011/01/24 (bmerry) |
| - Added and resolved issue 26. |
| - Split issue 27 out from issue 15. |
| - Disallow TexStorage* in display lists. |
| - Use the term "immutable-format" consistently (bug 7281). |
| |
| Revision 16, 2010/11/23 (bmerry) |
| - Disallowed TexStorage on an immutable-format texture |
| (resolves issue 5). |
| - Deleted MultiTexStorage* commands (other DSA functions still |
| unresolved). |
| - Some minor wording changes suggested by Pat Brown (bug 7002). |
| |
| Revision 15, 2010/11/09 (bmerry) |
| - Reopened issue 5. |
| - Reopened issue 14, pending stabilisation of |
| ARB_direct_state_access. |
| - Marked issue 9 resolved, pending any objections. |
| - Fix references to no object being bound (was meant to refer to |
| the default object). |
| - Adding missing pseudocode for TEXTURE_1D_ARRAY. |
| - Corrected TEXTURE_2D_ARRAY -> TEXTURE_1D_ARRAY in error checks. |
| - Changed "levels... are removed" to "levels... are reset to their |
| init state", since desktop GL has per-level state apart from the |
| texels. |
| - Miscellaneous wording fixes. |
| |
| Revision 14, 2010/09/25 (bmerry) |
| - Add issues 24-25 and alterations to |
| OES_compressed_ETC1_RGB8_texture, AMD_compressed_ATC_texture and |
| AMD_compressed_3DC_texture. |
| |
| Revision 13, 2010/09/19 (bmerry) |
| - Two typo fixes from Daniel Koch |
| |
| Revision 12, 2010/09/18 (bmerry) |
| - Changed resolution to issue 20 |
| - Added and resolved issue 23 |
| - Added explanation of how to upload data (in overview) |
| - Added spec language to implement resolution to issue 15 |
| |
| Revision 11, 2010/07/21 (bmerry) |
| - Resolved issue 16 |
| - Reopen issue 20 |
| - Fix some typos |
| |
| Revision 10, 2010/07/15 (bmerry) |
| - Update some issues to match core text |
| - Resolved issue 17 |
| |
| Revision 9, 2010/05/24 (bmerry) |
| - Marked issue 2 as resolved |
| - Resolved issue 19 (as no change) |
| - Resolved issue 20 |
| - Add issues 21-22 |
| - Add in spec language to forbid use on default textures |
| - Redefine level_base, level_max to be clamped forms of |
| TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL when using immutable |
| textures |
| - Redefine p to also be clamped to the provided levels for |
| immutable textures, to support automatic mipmap generation |
| - Removed multisample functions |
| - Removed language stating that texture parameters were reset to |
| defaults |
| |
| Revision 8, 2010/05/18 (bmerry) |
| - Added issue about EGLimage |
| - Marked issue 14 as resolved |
| |
| Revision 7, 2010/05/04 (bmerry) |
| - Removed some lingering <format>, <type> parameters to the new |
| functions that should have been removed in revision 4 |
| - Trivial typo fixes |
| |
| Revision 6, 2010/02/18 (bmerry) |
| - Resolved issues 5, 6 and 18 |
| - Added MultiTexStorage* functions for DSA interaction |
| - Added error for texture-target mismatch in DSA |
| - Allowed TexStorage* to be called again |
| |
| Revision 5, 2010/01/25 (bmerry) |
| - Added to contributors list |
| - Require OpenGL 1.2, to simplify interactions with |
| TEXTURE_BASE_LEVEL/TEXTURE_MAX_LEVEL and CLAMP_TO_EDGE |
| - Change default wrap modes to always be CLAMP_TO_EDGE |
| - Change default filters to always be NEAREST |
| - Moved language about generating new levels into an interaction, |
| since it can only happen on OpenGL ES |
| - Added interaction with EXT_direct_state_access |
| - Added extra <internalformats> for GL ES when OES_depth_texture, |
| OES_packed_depth_stencil and EXT_texture_type_2_10_10_10_REV are |
| present. |
| - Minor non-functional wording fixes and typos |
| - Resolved issue 16 |
| - Added issues 17-19 |
| |
| Revision 4, 2010/01/13 (bmerry) |
| - Changed suffix from ARM to EXT |
| - Added list of contributors |
| - Added language to force the texture to always be complete |
| - Removed <format> and <type> arguments |
| - Added issues 14-16 |
| - Reopened issue 2 |
| - Reformatted issues to separate resolution and discussion |
| - Resolved issues 1, 9 and 11-13 |
| - Fixed the max number of levels in a cube map array |
| |
| Revision 3, 2009/12/17 (bmerry) |
| - Added missing vendor suffix to TEXTURE_IMMUTABLE_FORMAT_ARM |
| - Rewritten to against desktop OpenGL |
| - Added prototypes for 1D and multisample storage functions |
| - Added issues 8-13 |
| |
| Revision 2, 2009/08/20 (bmerry) |
| - Resolved issue 2 (no border parameter) |
| - Resolved issue 4 (metadata becomes immutable) |
| - Added interaction with OES_texture_cube_map |
| - Added error if width != height in a cube map |
| - Added issues 5-7 |
| |
| Revision 1, 2009/05/06 (bmerry) |
| - First draft |