gfx/angle/extensions/EXT_texture_storage.txt

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 Name
     3     EXT_texture_storage
     5 Name Strings
     7     GL_EXT_texture_storage
     9 Contact
    11     Bruce Merry (bmerry 'at' gmail.com)
    12     Ian Romanick, Intel (ian.d.romanick 'at' intel.com)
    14 Contributors
    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
    27 Status
    29     Complete. 
    31 Version
    33     Last Modified Date: November 11, 2011
    34     Author Revision: 24
    36 Number
    38     OpenGL ES Extension #108
    40 Dependencies
    42     OpenGL ES 1.0, OpenGL ES 2.0 or OpenGL 1.2 is required.
    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.
    56     This extension is written against the OpenGL 3.2 Core Profile
    57     specification.
    59 Overview
    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.
    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.
    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).
    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).
    81 IP Status
    83     No known IP claims
    85 New Procedures and Functions
    87     void TexStorage1DEXT(enum target, sizei levels,
    88                          enum internalformat,
    89                          sizei width);
    91     void TexStorage2DEXT(enum target, sizei levels,
    92                          enum internalformat,
    93                          sizei width, sizei height);
    95     void TexStorage3DEXT(enum target, sizei levels,
    96                          enum internalformat,
    97                          sizei width, sizei height, sizei depth);
    99     void TextureStorage1DEXT(uint texture, enum target, sizei levels,
   100                          enum internalformat,
   101                          sizei width);
   103     void TextureStorage2DEXT(uint texture, enum target, sizei levels,
   104                          enum internalformat,
   105                          sizei width, sizei height);
   107     void TextureStorage3DEXT(uint texture, enum target, sizei levels,
   108                          enum internalformat,
   109                          sizei width, sizei height, sizei depth);
   111 New Types
   113     None
   115 New Tokens
   117     Accepted by the <value> parameter of GetTexParameter{if}v:
   119         TEXTURE_IMMUTABLE_FORMAT_EXT   0x912F
   121     Accepted by the <internalformat> parameter of TexStorage* when
   122     implemented on OpenGL ES:
   124         ALPHA8_EXT                     0x803C  /* reuse tokens from EXT_texture */
   125         LUMINANCE8_EXT                 0x8040
   126         LUMINANCE8_ALPHA8_EXT          0x8045
   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
   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
   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
   146       (if EXT_texture_format_BGRA8888 is supported)
   147         BGRA8_EXT                      0x93A1
   150 Additions to Chapter 2 of the OpenGL 3.2 Core Profile Specification
   151 (OpenGL Operation)
   153     None
   155 Additions to Chapter 3 of the OpenGL 3.2 Core Profile Specification
   156 (Rasterization)
   158     After section 3.8.1 (Texture Image Specification) add a new
   159     subsection called "Immutable-format texture images":
   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.
   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:
   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.]
   200     The command
   202         void TexStorage1DEXT(enum target, sizei levels,
   203                              enum internalformat,
   204                              sizei width);
   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:
   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         }
   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.
   220     The command
   222         void TexStorage2DEXT(enum target, sizei levels,
   223                              enum internalformat,
   224                              sizei width, sizei height);
   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>:
   230     [PROXY_]TEXTURE_2D, [PROXY_]TEXTURE_RECTANGLE or
   231     PROXY_TEXTURE_CUBE_MAP:
   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         }
   241     TEXTURE_CUBE_MAP:
   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         }
   254     [PROXY_]TEXTURE_1D_ARRAY:
   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         }
   263     If <target> is not one of those listed above, the error INVALID_ENUM
   264     is generated.
   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
   273     The command
   275         void TexStorage3DEXT(enum target, sizei levels, enum internalformat,
   276                              sizei width, sizei height, sizei depth);
   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>:
   282     [PROXY_]TEXTURE_3D:
   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         }
   293     [PROXY_]TEXTURE_2D_ARRAY, [PROXY_]TEXTURE_CUBE_MAP_ARRAY_ARB:
   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         }
   303     If <target> is not one of those listed above, the error INVALID_ENUM
   304     is generated.
   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
   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:
   323         - TexImage*
   324         - CompressedTexImage*
   325         - CopyTexImage*
   326         - TexStorage*
   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     "
   337     In section 3.8.6 (Texture Parameters), after the sentence
   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."
   344     add
   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.
   352     In section 3.8.9 (Rendering feedback loops) replace all references
   353     to TEXTURE_BASE_LEVEL by level_base.
   355     In section 3.8.9 (Mipmapping), replace the paragraph starting "Each
   356     array in a mipmap is defined..." by
   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."
   370     In section 3.8.12 (Texture Completeness), modify the last sentence
   371     to avoid refering to level_base and level_max:
   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."
   379     Modify section 3.8.13 (Texture State and Proxy State) to add the new
   380     state:
   382     "Each set consists of ..., and a boolean flag indicating whether the
   383     format and dimensions of the texture are immutable."
   385     Add
   386     "The initial value of TEXTURE_IMMUTABLE_FORMAT_EXT is FALSE."
   388 Additions to Chapter 4 of the OpenGL 3.2 Core Profile Specification
   389 (Per-Fragment Operations and the Frame Buffer)
   391     None
   393 Additions to Chapter 5 of the OpenGL 3.2 Compatibility Profile Specification
   394 (Special Functions)
   396     In section 5.4.1 (Commands Not Usable in Display Lists), add
   397     TexStorage* to the list of commands that cannot be used.
   399 Additions to Chapter 6 of the OpenGL 3.2 Core Profile Specification
   400 (State and State Requests)
   402     Replace the following statement in 6.1.3 (Enumerated Queries):
   404     "<value> must be one of the symbolic values in table 3.10."
   406     with
   408     "<value> must be TEXTURE_IMMUTABLE_FORMAT_EXT or one of the symbolic
   409     values in table 3.22."
   411 Additions to the AGL/EGL/GLX/WGL Specifications
   413     None
   415 Additions to OES_compressed_ETC1_RGB8_texture
   417     Add the following to the additions to Chapter 3:
   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:
   424         * <width> is not a multiple of four, and <width> plus <xoffset> is not
   425           equal to the texture width;
   427         * <height> is not a multiple of four, and <height> plus <yoffset> is
   428           not equal to the texture height; or
   430         * <xoffset> or <yoffset> is not a multiple of four.
   432     Remove CompressedTexSubImage2D from this error:
   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."
   438     Add the following error:
   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)."
   444 Additions to AMD_compressed_ATC_texture and AMD_compressed_3DC_texture:
   446     Apply the same changes as for OES_compressed_ETC1_RGB8_texture
   447     above, substituting the appropriate internal format tokens from
   448     these extensions.
   450 Dependencies on EXT_direct_state_access
   452     If EXT_direct_state_access is not present, references to
   453     TextureStorage* should be ignored.
   455 Dependencies on OpenGL ES
   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:
   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.
   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.
   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
   493     If OES_depth_texture is supported:
   495         <internalformat>       <format>           <type>
   496         ----------------       --------           ------
   497         DEPTH_COMPONENT16_OES  DEPTH_COMPONENT    UNSIGNED_SHORT
   498         DEPTH_COMPONENT32_OES  DEPTH_COMPONENT    UNSIGNED_INT
   500     If OES_packed_depth_stencil is supported:
   502         <internalformat>       <format>           <type>
   503         ----------------       --------           ------
   504         DEPTH24_STENCIL8_OES   DEPTH_STENCIL_OES  UNSIGNED_INT
   506     If OES_texture_float is supported:
   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
   516     If OES_texture_half_float is supported:
   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
   526     If EXT_texture_type_2_10_10_10_REV is supported:
   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
   533     If EXT_texture_format_BGRA8888 is supported:
   535         <internalformat>    <format>   <type>
   536         ----------------    --------   ------
   537         BGRA8_EXT           BGRA_EXT   UNSIGNED_BYTE
   540 Dependencies on texture targets
   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.
   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.
   553 Dependencies on OES_texture_npot
   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.
   561 Dependencies on WGL_ARB_render_texture, GLX_EXT_texture_from_pixmap, EGL
   562 1.4 and GL_OES_EGL_image
   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
   573 Dependencies on OES_compressed_paletted_texture
   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.
   580 Errors
   582     Note that dependencies above modify the errors.
   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.
   588     If the <target> parameter to TexStorage1DEXT is not
   589     [PROXY_]TEXTURE_1D, then the error INVALID_ENUM is generated.
   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.
   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.
   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
   613     If the default texture object is bound to the <target> passed to
   614     TexStorage*, then the error INVALID_OPERATION is generated.
   616     If the <target> parameter to TextureStorage* does not match the
   617     dimensionality of <texture>, then the error INVALID_OPERATION is
   618     generated.
   620     If the <texture> parameter to TextureStorage* is zero, then the
   621     INVALID_VALUE is generated.
   623     If any pseudo-code listed in this extension would generate an error,
   624     then that error is generated.
   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*
   633 New State
   635     Additions to Table 6.8 Textures (state per texture object)
   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
   642 New Implementation Dependent State
   644     None
   646 Issues
   648     1. What should this extension be called?
   650     RESOLVED: EXT_texture_storage is chosen for consistency with the
   651     glRenderbufferStorage entry point.
   653     2. Should TexStorage* accept a border parameter?
   655     RESOLVED: no.
   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.
   663     3. What is the correct error when <levels> specifies a partial
   664     mipmap pyramid for OpenGL ES?
   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.
   671     4. Should use of these entry-points make the metadata (format and
   672     dimensions) immutable?
   674     RESOLVED: Yes.
   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.
   681     5. Should it be legal to completely replace the texture using a new call
   682     to TexStorage*?
   684     RESOLVED. It will not be allowed.
   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)?
   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.
   699     6. Should it be legal to use TexImage* after TexStorage* if it doesn't
   700     affect the metadata?
   702     RESOLVED: No.
   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.
   708     7. How does this extension interact with APPLE_texture_2D_limited_npot?
   710     RESOLVED. APPLE_texture_2D_limited_npot is equivalent to the NPOT
   711     support in OpenGL ES 2.0.
   713     8. Should this extension be written to work with desktop OpenGL?
   715     RESOLVED: Yes.
   717     DISCUSSION: There has been been interest and it will future-proof it
   718     against further additions to OpenGL ES.
   720     9. Which texture targets should be supported?
   722     RESOLVED. All targets except multisample and buffer textures are
   723     supported.
   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.
   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.
   734     10. Should this extension support proxy textures?
   736     RESOLVED: Yes.
   738     DISCUSSION: It should be orthogonal.
   740     11. Are the <format> and <type> parameters necessary?
   742     RESOLVED. No, they will be removed.
   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).
   749     12. Should it be legal to make the default texture (id 0)
   750     immutable-format?
   752     RESOLVED: No.
   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.
   758     13. Should we try to guarantee that textures made through this path
   759     will always be complete?
   761     RESOLVED: It should be guaranteed that the texture will be mipmap
   762     complete.
   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.
   769     14. Should these functions use a EXT_direct_state_access approach to
   770     specifying the texture objects?
   772     UNRESOLVED.
   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.
   778     15. Should these functions accept generic compressed formats?
   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.
   785     16. How should completeness be forced when TEXTURE_MAX_LEVEL is not
   786     present?
   788     RESOLVED. The maximum level q will be redefined to clamp to the
   789     highest level available.
   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).
   796     Some options:
   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.
   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.
   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.
   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.
   824     17. How should completeness be forced when only ES2-style NPOT is
   825     available?
   827     RESOLVED. It is not worth trying to do this, in light of issue 13.
   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.
   834     18. For OpenGL ES, how do the new sized internal formats interact
   835     with OES_required_internal_format?
   837     RESOLVED.
   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*.
   846     19. Should there be some hinting mechanism to indicate whether data
   847     is coming immediately or later?
   849     RESOLVED. No parameter is needed. An extension can be added to provide
   850     a TexParameter value which is latched at TexStorage time.
   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.
   859     One option suggested was the <usage> parameter currently passed to
   860     BufferData. Another option was to set it with TexParameter.
   862     20. How should this extension interact with
   863     EGLImageTargetTexture2DOES, eglBindTexImage, glXBindTexImage and
   864     wglBindTexImage?
   866     RESOLVED. These functions will not be permitted after glTexStorage*.
   868     Several options are possible:
   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.
   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.
   880     21. Should there be a single function for specifying 1D, 2D and 3D
   881     targets?
   883     RESOLVED. No, we will stick with existing precedent.
   885     22. Is it possible to use GenerateMipmap with an incomplete mipmap
   886     pyramid?
   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.
   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.
   896     23. How should this extension interact with
   897     OES_compressed_paletted_texture?
   899     RESOLVED. Paletted textures will not be permitted, and will
   900     generate INVALID_ENUM.
   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.
   906     24. How can ETC1 textures be used with this extension?
   908     RESOLVED. Add language in this extension to allow subregion uploads
   909     for ETC1.
   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.
   917     25. Should any other compressed formats be similarly modified?
   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.
   928     26. Should these commands be permitted in display lists?
   930     RESOLVED. No.
   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.
   936     27. Should these commands accept unsized internal formats?
   938     RESOLVED: No, for both OpenGL and OpenGL ES.
   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.
   946 Revision History
   948     Revision 24, 2011/11/11 (dgkoch)
   949       - Mark complete. Clarify ES clarifications.
   951     Revision 23, 2011/11/10 (dgkoch)
   952       - Add GLES clarifcations and interactions with more GLES extensions
   954     Revision 22, 2011/11/10 (bmerry)
   955       - Update my contact details
   957     Revision 21, 2011/07/25 (bmerry)
   958       - Remove dangling references to MultiTexStorage in Errors section
   960     Revision 20, 2011/07/21 (bmerry)
   961       - Remove dangling reference to <samples> in Errors section
   963     Revision 19, 2011/05/02 (Jon Leech)
   964       - Assign enum value
   966     Revision 18, 2011/01/24 (bmerry)
   967       - Disallow unsized internal formats (oversight in revision 17).
   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).
   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).
   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.
   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.
  1001     Revision 13, 2010/09/19 (bmerry)
  1002       - Two typo fixes from Daniel Koch
  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
  1010     Revision 11, 2010/07/21 (bmerry)
  1011       - Resolved issue 16
  1012       - Reopen issue 20
  1013       - Fix some typos
  1015     Revision 10, 2010/07/15 (bmerry)
  1016       - Update some issues to match core text
  1017       - Resolved issue 17
  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
  1034     Revision 8, 2010/05/18 (bmerry)
  1035       - Added issue about EGLimage
  1036       - Marked issue 14 as resolved
  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
  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
  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
  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
  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
  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
  1089     Revision 1, 2009/05/06 (bmerry)
  1090       - First draft

mercurial