Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
Name
2
 
3
    MESA_texture_array
4
 
5
Name Strings
6
 
7
    GL_MESA_texture_array
8
 
9
Contact
10
 
11
    Ian Romanick, IBM (idr 'at' us.ibm.com)
12
 
13
IP Status
14
 
15
    No known IP issues.
16
 
17
Status
18
 
19
    DEPRECATED - Support removed in Mesa 10.1.
20
 
21
Version
22
 
23
 
24
Number
25
 
26
    TBD
27
 
28
Dependencies
29
 
30
    OpenGL 1.2 or GL_EXT_texture3D is required.
31
 
32
    Support for ARB_fragment_program is assumed, but not required.
33
 
34
    Support for ARB_fragment_program_shadow is assumed, but not required.
35
 
36
    Support for EXT_framebuffer_object is assumed, but not required.
37
 
38
    Written based on the wording of the OpenGL 2.0 specification and
39
    ARB_fragment_program_shadow but not dependent on them.
40
 
41
Overview
42
 
43
    There are a number of circumstances where an application may wish to
44
    blend two textures out of a larger set of textures.  Moreover, in some
45
    cases the selected textures may vary on a per-fragment basis within
46
    a polygon.  Several examples include:
47
 
48
       1. High dynamic range textures.  The application stores several
49
       different "exposures" of an image as different textures.  On a
50
       per-fragment basis, the application selects which exposures are
51
       used.
52
 
53
       2. A terrain engine where the altitude of a point determines the
54
       texture applied to it.  If the transition is from beach sand to
55
       grass to rocks to snow, the application will store each texture
56
       in a different texture map, and dynamically select which two
57
       textures to blend at run-time.
58
 
59
       3. Storing short video clips in textures.  Each depth slice is a
60
       single frame of video.
61
 
62
    Several solutions to this problem have been proposed, but they either
63
    involve using a separate texture unit for each texture map or using 3D
64
    textures without mipmaps.  Both of these options have major drawbacks.
65
 
66
    This extension provides a third alternative that eliminates the major
67
    drawbacks of both previous methods.  A new texture target,
68
    TEXTURE_2D_ARRAY, is added that functions identically to TEXTURE_3D in
69
    all aspects except the sizes of the non-base level images.  In
70
    traditional 3D texturing, the size of the N+1 LOD is half the size
71
    of the N LOD in all three dimensions.  For the TEXTURE_2D_ARRAY target,
72
    the height and width of the N+1 LOD is halved, but the depth is the
73
    same for all levels of detail. The texture then becomes an array of
74
    2D textures.  The per-fragment texel is selected by the R texture
75
    coordinate.
76
 
77
    References:
78
 
79
        http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011557
80
        http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=000516
81
        http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011903
82
        http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm
83
 
84
New Procedures and Functions
85
 
86
    All functions come directly from EXT_texture_array.
87
 
88
    void FramebufferTextureLayerEXT(enum target, enum attachment,
89
                                    uint texture, int level, int layer);
90
 
91
New Tokens
92
 
93
    All token names and values come directly from EXT_texture_array.
94
 
95
    Accepted by the  parameter of Enable, Disable, and IsEnabled, by
96
    the  parameter of GetBooleanv, GetIntegerv, GetFloatv, and
97
    GetDoublev, and by the  parameter of TexImage3D, GetTexImage,
98
    GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and
99
    GetTexParameterfv:
100
 
101
        TEXTURE_1D_ARRAY_EXT                            0x8C18
102
        TEXTURE_2D_ARRAY_EXT                            0x8C1A
103
 
104
    Accepted by the  parameter of TexImage2D, TexSubImage2D,
105
    CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D,
106
    CompressedTexSubImage2D, GetTexLevelParameteriv, and
107
    GetTexLevelParameterfv:
108
 
109
        TEXTURE_1D_ARRAY_EXT
110
        PROXY_TEXTURE_1D_ARRAY_EXT                      0x8C19
111
 
112
    Accepted by the  parameter of TexImage3D, TexSubImage3D,
113
    CopyTexSubImage3D, CompressedTexImage3D, CompressedTexSubImage3D,
114
    GetTexLevelParameteriv, and GetTexLevelParameterfv:
115
 
116
        TEXTURE_2D_ARRAY_EXT
117
        PROXY_TEXTURE_2D_ARRAY_EXT                      0x8C1B
118
 
119
    Accepted by the  parameter of GetBooleanv, GetIntegerv,
120
    GetFloatv, and GetDoublev
121
 
122
        TEXTURE_BINDING_1D_ARRAY_EXT                    0x8C1C
123
        TEXTURE_BINDING_2D_ARRAY_EXT                    0x8C1D
124
        MAX_ARRAY_TEXTURE_LAYERS_EXT                    0x88FF
125
 
126
    Accepted by the  parameter of TexParameterf, TexParameteri,
127
    TexParameterfv, and TexParameteriv when the  parameter is
128
    TEXTURE_COMPARE_MODE_ARB:
129
 
130
        COMPARE_REF_DEPTH_TO_TEXTURE_EXT                0x884E
131
 
132
    (Note:  COMPARE_REF_DEPTH_TO_TEXTURE_EXT is simply an alias for the
133
    existing COMPARE_R_TO_TEXTURE token in OpenGL 2.0; the alternate name
134
    reflects the fact that the R coordinate is not always used.)
135
 
136
    Accepted by the  parameter of TexImage3D and
137
    CompressedTexImage3D, and by the  parameter of
138
    CompressedTexSubImage3D:
139
 
140
        COMPRESSED_RGB_S3TC_DXT1_EXT
141
        COMPRESSED_RGBA_S3TC_DXT1_EXT
142
        COMPRESSED_RGBA_S3TC_DXT3_EXT
143
        COMPRESSED_RGBA_S3TC_DXT5_EXT
144
 
145
    Accepted by the  parameter of
146
    GetFramebufferAttachmentParameterivEXT:
147
 
148
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT          0x8CD4
149
 
150
    (Note:  FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is simply an alias for the
151
    FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT token provided in
152
    EXT_framebuffer_object.  This extension generalizes the notion of
153
    "" to include layers of an array texture.)
154
 
155
Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)
156
 
157
    None
158
 
159
Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
160
 
161
    -- Section 3.8.1 "Texture Image Specification"
162
 
163
       Change the first paragraph (page 150) to say (spec changes identical to
164
       EXT_texture_array):
165
 
166
       "The command
167
 
168
         void TexImage3D(enum target, int level, int internalformat,
169
                         sizei width, sizei height, sizei depth, int border,
170
                         enum format, enum type, void *data);
171
 
172
       is used to specify a three-dimensional texture image. target must be one
173
       one of TEXTURE_3D for a three-dimensional texture or
174
       TEXTURE_2D_ARRAY_EXT for an two-dimensional array texture.
175
       Additionally, target may be either PROXY_TEXTURE_3D for a
176
       three-dimensional proxy texture, or PROXY_TEXTURE_2D_ARRAY_EXT for a
177
       two-dimensional proxy array texture."
178
 
179
       Change the fourth paragraph on page 151 to say (spec changes identical
180
       to EXT_texture_array):
181
 
182
       "Textures with a base internal format of DEPTH_COMPONENT are supported
183
       by texture image specification commands only if target is TEXTURE_1D,
184
       TEXTURE_2D, TEXTURE_1D_ARRAY_EXT, TEXTURE_2D_ARRAY_EXT,
185
       PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_1D_ARRAY_EXT, or
186
       PROXY_TEXTURE_2D_ARRAY_EXT. Using this format in conjunction with any
187
       other target will result in an INVALID_OPERATION error."
188
 
189
 
190
       Change the fourth paragraph on page 156 to say (spec changes identical
191
       to EXT_texture_array):
192
 
193
       "The command
194
 
195
         void TexImage2D(enum target, int level,
196
                         int internalformat, sizei width, sizei height,
197
                         int border, enum format, enum type, void *data);
198
 
199
       is used to specify a two-dimensional texture image. target must be one
200
       of TEXTURE_2D for a two-dimensional texture, TEXTURE_1D_ARRAY_EXT for a
201
       one-dimensional array texture, or one of TEXTURE_CUBE_MAP_POSITIVE_X,
202
       TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
203
       TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, or
204
       TEXTURE_CUBE_MAP_NEGATIVE_Z for a cube map texture. Additionally,
205
       target may be either PROXY_TEXTURE_2D for a two-dimensional proxy
206
       texture, PROXY_TEXTURE_1D_ARRAY_EXT for a one-dimensional proxy array
207
       texture, or PROXY TEXTURE_CUBE_MAP for a cube map proxy texture in the
208
       special case discussed in section 3.8.11.  The other parameters match
209
       the corresponding parameters of TexImage3D.
210
 
211
       For the purposes of decoding the texture image, TexImage2D is
212
       equivalent to calling TexImage3D with corresponding arguments and depth
213
       of 1, except that
214
 
215
         * The border depth, d_b, is zero, and the depth of the image is
216
           always 1 regardless of the value of border.
217
 
218
         * The border height, h_b, is zero if  is
219
           TEXTURE_1D_ARRAY_EXT, and  otherwise.
220
 
221
         * Convolution will be performed on the image (possibly changing its
222
           width and height) if SEPARABLE 2D or CONVOLUTION 2D is enabled.
223
 
224
         * UNPACK SKIP IMAGES is ignored."
225
 
226
    -- Section 3.8.2 "Alternate Texture Image Specification Commands"
227
 
228
       Change the second paragraph (page 159) (spec changes identical
229
       to EXT_texture_array):
230
 
231
       "The command
232
 
233
         void CopyTexImage2D(enum target, int level,
234
                             enum internalformat, int x, int y, sizei width,
235
                             sizei height, int border);
236
 
237
       defines a two-dimensional texture image in exactly the manner of
238
       TexImage2D, except that the image data are taken from the framebuffer
239
       rather than from client memory. Currently, target must be one of
240
       TEXTURE_2D, TEXTURE_1D_ARRAY_EXT, TEXTURE_CUBE_MAP_POSITIVE_X,
241
       TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE MAP_POSITIVE_Y,
242
       TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, or
243
       TEXTURE_CUBE_MAP_NEGATIVE_Z.
244
 
245
 
246
       Change the last paragraph on page 160 to say (spec changes identical
247
       to EXT_texture_array):
248
 
249
       "Currently the target arguments of TexSubImage1D and CopyTexSubImage1D
250
       must be TEXTURE_1D, the target arguments of TexSubImage2D and
251
       CopyTexSubImage2D must be one of TEXTURE_2D, TEXTURE_1D_ARRAY_EXT,
252
       TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
253
       TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
254
       TEXTURE_CUBE_MAP_POSITIVE_Z, or TEXTURE_CUBE_MAP_NEGATIVE_Z, and the
255
       target arguments of TexSubImage3D and CopyTexSubImage3D must be
256
       TEXTURE_3D or TEXTURE_2D_ARRAY_EXT. ..."
257
 
258
 
259
    -- Section 3.8.4 "Texture Parameters"
260
 
261
       Change the first paragraph (page 166) to say:
262
 
263
       "Various parameters control how the texel array is treated when
264
       specified or changed, and when applied to a fragment. Each parameter is
265
       set by calling
266
 
267
         void TexParameter{if}(enum target, enum pname, T param);
268
         void TexParameter{if}v(enum target, enum pname, T params);
269
 
270
       target is the target, either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
271
       TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT."
272
 
273
 
274
    -- Section 3.8.8 "Texture Minification" in the section "Scale Factor and Level of Detail"
275
 
276
       Change the first paragraph (page 172) to say:
277
 
278
       "Let s(x,y) be the function that associates an s texture coordinate
279
       with each set of window coordinates (x,y) that lie within a primitive;
280
       define t(x,y) and r(x,y) analogously.  Let u(x,y) = w_t * s(x,y),
281
       v(x,y) = h_t * t(x,y), and w(x,y) = d_t * r(x,y), where w_t, h_t,
282
       and d_t are as defined by equations 3.15, 3.16, and 3.17 with
283
       w_s, h_s, and d_s equal to the width, height, and depth of the
284
       image array whose level is level_base.  For a one-dimensional
285
       texture or a one-dimensional array texture, define v(x,y) = 0 and
286
       w(x,y) = 0; for a two-dimensional texture or a two-dimensional array
287
       texture, define w(x,y) = 0..."
288
 
289
    -- Section 3.8.8 "Texture Minification" in the section "Mipmapping"
290
 
291
       Change the third paragraph (page 174) to say:
292
 
293
       "For a two-dimensional texture, two-dimensional array texture, or
294
       cube map texture,"
295
 
296
       Change the fourth paragraph (page 174) to say:
297
 
298
       "And for a one-dimensional texture or a one-dimensional array texture,"
299
 
300
       After the first paragraph (page 175) add:
301
 
302
       "For one-dimensional array textures, h_b and d_b are treated as 1,
303
       regardless of the actual values, when performing mipmap calculations.
304
       For two-dimensional array textures, d_b is always treated as one,
305
       regardless of the actual value, when performing mipmap calculations."
306
 
307
    -- Section 3.8.8 "Automatic Mipmap Generation" in the section "Mipmapping"
308
 
309
       Change the third paragraph (page 176) to say (spec changes identical
310
       to EXT_texture_array):
311
 
312
       "The contents of the derived arrays are computed by repeated, filtered
313
       reduction of the level_base array.  For one- and two-dimensional array
314
       textures, each layer is filtered independently.  ..."
315
 
316
    -- Section 3.8.8 "Manual Mipmap Generation" in the section "Mipmapping"
317
 
318
       Change first paragraph to say (spec changes identical to
319
       EXT_texture_array):
320
 
321
       "Mipmaps can be generated manually with the command
322
 
323
         void GenerateMipmapEXT(enum target);
324
 
325
       where  is one of TEXTURE_1D, TEXTURE_2D, TEXTURE_CUBE_MAP,
326
       TEXTURE_3D, TEXTURE_1D_ARRAY, or TEXTURE_2D_ARRAY.  Mipmap generation
327
       affects the texture image attached to .  ..."
328
 
329
    -- Section 3.8.10 "Texture Completeness"
330
 
331
       Change the second paragraph (page 177) to say (spec changes identical
332
       to EXT_texture_array):
333
 
334
       "For one-, two-, or three-dimensional textures and one- or
335
       two-dimensional array textures, a texture is complete if the following
336
       conditions all hold true:"
337
 
338
    -- Section 3.8.11 "Texture State and Proxy State"
339
 
340
       Change the second and third paragraphs (page 179) to say (spec changes
341
       identical to EXT_texture_array):
342
 
343
       "In addition to image arrays for one-, two-, and three-dimensional
344
       textures, one- and two-dimensional array textures, and the six image
345
       arrays for the cube map texture, partially instantiated image arrays
346
       are maintained for one-, two-, and three-dimensional textures and one-
347
       and two-dimensional array textures.  Additionally, a single proxy image
348
       array is maintained for the cube map texture.  Each proxy image array
349
       includes width, height, depth, border width, and internal format state
350
       values, as well as state for the red, green, blue, alpha, luminance,
351
       and intensity component resolutions. Proxy image arrays do not include
352
       image data, nor do they include texture properties. When TexImage3D is
353
       executed with target specified as PROXY_TEXTURE_3D, the
354
       three-dimensional proxy state values of the specified level-of-detail
355
       are recomputed and updated. If the image array would not be supported
356
       by TexImage3D called with target set to TEXTURE 3D, no error is
357
       generated, but the proxy width, height, depth, border width, and
358
       component resolutions are set to zero. If the image array would be
359
       supported by such a call to TexImage3D, the proxy state values are set
360
       exactly as though the actual image array were being specified. No pixel
361
       data are transferred or processed in either case.
362
 
363
       Proxy arrays for one- and two-dimensional textures and one- and
364
       two-dimensional array textures are operated on in the same way when
365
       TexImage1D is executed with target specified as PROXY_TEXTURE_1D,
366
       TexImage2D is executed with target specified as PROXY_TEXTURE_2D or
367
       PROXY_TEXTURE_1D_ARRAY_EXT, or TexImage3D is executed with target
368
       specified as PROXY_TETXURE_2D_ARRAY_EXT."
369
 
370
    -- Section 3.8.12 "Texture Objects"
371
 
372
       Change section (page 180) to say (spec changes identical to
373
       EXT_texture_array):
374
 
375
       "In addition to the default textures TEXTURE_1D, TEXTURE_2D,
376
       TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and TEXTURE_2D_EXT,
377
       named one-, two-, and three-dimensional, cube map, and one- and
378
       two-dimensional array texture objects can be created and operated upon.
379
       The name space for texture objects is the unsigned integers, with zero
380
       reserved by the GL.
381
 
382
       A texture object is created by binding an unused name to TEXTURE_1D,
383
       TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
384
       TEXTURE_2D_ARRAY_EXT. The binding is effected by calling
385
 
386
         void BindTexture(enum target, uint texture);
387
 
388
       with  set to the desired texture target and  set to
389
       the unused name.  The resulting texture object is a new state vector,
390
       comprising all the state values listed in section 3.8.11, set to the
391
       same initial values. If the new texture object is bound to TEXTURE_1D,
392
       TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
393
       TEXTURE_2D_ARRAY_EXT, it is and remains a one-, two-,
394
       three-dimensional, cube map, one- or two-dimensional array texture
395
       respectively until it is deleted.
396
 
397
       BindTexture may also be used to bind an existing texture object to
398
       either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
399
       TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT. The error
400
       INVALID_OPERATION is generated if an attempt is made to bind a texture
401
       object of different dimensionality than the specified target. If the
402
       bind is successful no change is made to the state of the bound texture
403
       object, and any previous binding to target is broken.
404
 
405
       While a texture object is bound, GL operations on the target to which
406
       it is bound affect the bound object, and queries of the target to which
407
       it is bound return state from the bound object. If texture mapping of
408
       the dimensionality of the target to which a texture object is bound is
409
       enabled, the state of the bound texture object directs the texturing
410
       operation.
411
 
412
       In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
413
       TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and TEXTURE_2D_ARRAY_EXT have
414
       one-, two-, three-dimensional, cube map, and one- and two-dimensional
415
       array texture state vectors respectively associated with them. In order
416
       that access to these initial textures not be lost, they are treated as
417
       texture objects all of whose names are 0. The initial one-, two-,
418
       three-dimensional, cube map, one- and two-dimensional array textures
419
       are therefore operated upon, queried, and applied as TEXTURE_1D,
420
       TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and
421
       TEXTURE_2D_ARRAY_EXT respectively while 0 is bound to the corresponding
422
       targets.
423
 
424
       Change second paragraph on page 181 to say (spec changes identical to
425
       EXT_texture_array):
426
 
427
       "...  If a texture that is currently bound to one of the targets
428
       TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
429
       TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT is deleted, it is as
430
       though BindTexture had been executed with the same target and texture
431
       zero. ..."
432
 
433
       Change second paragraph on page 182 to say (spec changes identical to
434
       EXT_texture_array):
435
 
436
       "The texture object name space, including the initial one-, two-, and
437
       three dimensional, cube map, and one- and two-dimensional array texture
438
       objects, is shared among all texture units. ..."
439
 
440
 
441
    -- Section 3.8.14 "Depth Texture Comparison Modes" in "Texture Comparison Modes"
442
 
443
       Change second through fourth paragraphs (page 188) to say:
444
 
445
       "Let D_t be the depth texture value, in the range [0, 1].  For
446
       texture lookups from one- and two-dimensional, rectangle, and
447
       one-dimensional array targets, let R be the interpolated 
448
       texture coordinate, clamped to the range [0, 1].  For texture lookups
449
       from two-dimensional array texture targets, let R be the interpolated
450
        texture coordinate, clamped to the range [0, 1].  Then the
451
       effective texture value L_t, I_t, or A_t is computed as follows:
452
 
453
       If the value of TEXTURE_COMPARE_MODE is NONE, then
454
 
455
          r = Dt
456
 
457
       If the value of TEXTURE_COMPARE_MODE is
458
       COMPARE_REF_DEPTH_TO_TEXTURE_EXT), then r depends on the texture
459
       comparison function as shown in table 3.27."
460
 
461
    -- Section 3.8.15 "Texture Application"
462
 
463
       Change the first paragraph (page 189) to say:
464
 
465
       "Texturing is enabled or disabled using the generic Enable and Disable
466
       commands, respectively, with the symbolic constants TEXTURE_1D,
467
       TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
468
       TEXTURE_2D_ARRAY_EXT to enable one-, two-, three-dimensional, cube
469
       map, one-dimensional array, or two-dimensional array texture,
470
       respectively.  If both two- and one-dimensional textures are enabled,
471
       the two-dimensional texture is used.  If the three-dimensional and
472
       either of the two- or one-dimensional textures is enabled, the
473
       three-dimensional texture is used.  If the cube map texture and any of
474
       the three-, two-, or one-dimensional textures is enabled, then cube map
475
       texturing is used.  If one-dimensional array texture is enabled and any
476
       of cube map, three-, two-, or one-dimensional textures is enabled,
477
       one-dimensional array texturing is used.  If two-dimensional array
478
       texture is enabled and any of cube map, three-, two-, one-dimensional
479
       textures or one-dimensional array texture is enabled, two-dimensional
480
       array texturing is used..."
481
 
482
    -- Section 3.11.2 of ARB_fragment_program (Fragment Program Grammar and Restrictions):
483
 
484
       (mostly add to existing grammar rules)
485
 
486
                  ::= "MESA_texture_array"
487
 
488
                   ::= "1D"
489
                               | "2D"
490
                               | "3D"
491
                               | "CUBE"
492
                               | "RECT"
493
                               |  (if program option is present)
494
                               |  (if program option is present)
495
 
496
                 ::= "ARRAY1D"
497
                               | "ARRAY2D"
498
 
499
                ::= "SHADOW1D"
500
                               | "SHADOW2D"
501
                               | "SHADOWRECT"
502
                               |  (if program option is present)
503
 
504
           ::= "SHADOWARRAY1D"
505
                               | "SHADOWARRAY2D"
506
 
507
 
508
    -- Add Section 3.11.4.5.4 "Texture Stack Option"
509
 
510
       "If a fragment program specifies the "MESA_texture_array" program
511
       option, the  rule is modified to add the texture targets
512
       ARRAY1D and ARRAY2D (See Section 3.11.2)."
513
 
514
    -- Section 3.11.6 "Fragment Program Texture Instruction Set"
515
 
516
       (replace 1st and 2nd paragraphs with the following paragraphs)
517
 
518
       "The first three texture instructions described below specify the
519
       mapping of 4-tuple input vectors to 4-tuple output vectors.
520
       The sampling of the texture works as described in section 3.8,
521
       except that texture environments and texture functions are not
522
       applicable, and the texture enables hierarchy is replaced by explicit
523
       references to the desired texture target (i.e., 1D, 2D, 3D, cube map,
524
       rectangle, ARRAY1D, ARRAY2D).  These texture instructions specify
525
       how the 4-tuple is mapped into the coordinates used for sampling.  The
526
       following function is used to describe the texture sampling in the
527
       descriptions below:
528
 
529
         vec4 TextureSample(vec4 coord, float lodBias, int texImageUnit,
530
                            enum texTarget);
531
 
532
       Note that not all four components of the texture coordinates 
533
       are used by all texture targets.  Component usage for each 
534
       is defined in table X.
535
 
536
                                                        coordinates used
537
         texTarget          Texture Type               s t r  layer  shadow
538
         ----------------   ---------------------      -----  -----  ------
539
         1D                 TEXTURE_1D                 x - -    -      -
540
         2D                 TEXTURE_2D                 x y -    -      -
541
         3D                 TEXTURE_3D                 x y z    -      -
542
         CUBE               TEXTURE_CUBE_MAP           x y z    -      -
543
         RECT               TEXTURE_RECTANGLE_ARB      x y -    -      -
544
         ARRAY1D            TEXTURE_1D_ARRAY_EXT       x - -    y      -
545
         ARRAY2D            TEXTURE_2D_ARRAY_EXT       x y -    z      -
546
         SHADOW1D           TEXTURE_1D                 x - -    -      z
547
         SHADOW2D           TEXTURE_2D                 x y -    -      z
548
         SHADOWRECT         TEXTURE_RECTANGLE_ARB      x y -    -      z
549
         SHADOWARRAY1D      TEXTURE_1D_ARRAY_EXT       x - -    y      z
550
         SHADOWARRAY2D      TEXTURE_2D_ARRAY_EXT       x y -    z      w
551
 
552
         Table X:  Texture types accessed for each of the , and
553
         coordinate mappings.  The "coordinates used" column indicate the
554
         input values used for each coordinate of the texture lookup, the
555
         layer selector for array textures, and the reference value for
556
         texture comparisons."
557
 
558
    -- Section 3.11.6.2 "TXP: Project coordinate and map to color"
559
 
560
       Add to the end of the section:
561
 
562
       "A program will fail to load if the TXP instruction is used in
563
       conjunction with the SHADOWARRAY2D target."
564
 
565
Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment Operations)
566
 
567
    -- Section 4.4.2.3 "Attaching Texture Images to a Framebuffer"
568
 
569
       Add to the end of the section (spec changes identical to
570
       EXT_texture_array):
571
 
572
       "The command
573
 
574
         void FramebufferTextureLayerEXT(enum target, enum attachment,
575
                                         uint texture, int level, int layer);
576
 
577
       operates identically to FramebufferTexture3DEXT, except that it
578
       attaches a single layer of a three-dimensional texture or a one- or
579
       two-dimensional array texture.   is an integer indicating the
580
       layer number, and is treated identically to the  parameter in
581
       FramebufferTexture3DEXT.  The error INVALID_VALUE is generated if
582
        is negative.  The error INVALID_OPERATION is generated if
583
        is non-zero and is not the name of a three dimensional
584
       texture or one- or two-dimensional array texture.  Unlike
585
       FramebufferTexture3D, no  parameter is accepted.
586
 
587
       If  is non-zero and the command does not result in an error,
588
       the framebuffer attachment state corresponding to  is
589
       updated as in the other FramebufferTexture commands, except that
590
       FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT is set to ."
591
 
592
    -- Section 4.4.4.1 "Framebuffer Attachment Completeness"
593
 
594
      Add to the end of the list of completeness rules (spec changes
595
      identical to EXT_texture_array):
596
 
597
        "* If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE and
598
           FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT names a one- or
599
           two-dimensional array texture, then
600
           FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT must be smaller than the
601
           number of layers in the texture."
602
 
603
Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)
604
 
605
    -- Section 5.4 "Display Lists"
606
 
607
       Change the first paragraph on page 242 to say (spec changes
608
       identical to EXT_texture_array):
609
 
610
       "TexImage3D, TexImage2D, TexImage1D, Histogram, and ColorTable are
611
       executed immediately when called with the corresponding proxy arguments
612
       PROXY_TEXTURE_3D or PROXY_TEXTURE_2D_ARRAY_EXT; PROXY_TEXTURE_2D,
613
       PROXY_TEXTURE_CUBE_MAP, or PROXY_TEXTURE_1D_ARRAY_EXT;
614
       PROXY_TEXTURE_1D; PROXY_HISTOGRAM; and PROXY_COLOR_TABLE,
615
       PROXY_POST_CONVOLUTION_COLOR_TABLE, or
616
       PROXY_POST_COLOR_MATRIX_COLOR_TABLE."
617
 
618
Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State Requests)
619
 
620
    -- Section 6.1.3 "Enumerated Queries"
621
 
622
       Add after the line beginning "If the value of
623
       FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE" (spec changes
624
       identical to EXT_texture_array):
625
 
626
       "If  is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT and the
627
       texture object named FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT is a
628
       three-dimensional texture or a one- or two-dimensional array texture,
629
       then  will contain the number of texture layer attached to the
630
       attachment point.  Otherwise,  will contain the value zero."
631
 
632
    -- Section 6.1.4 "Texture Queries"
633
 
634
       Change the first three paragraphs (page 248) to say (spec changes
635
       identical to EXT_texture_array):
636
 
637
       "The command
638
 
639
         void GetTexImage(enum tex, int lod, enum format,
640
                          enum type, void *img);
641
 
642
       is used to obtain texture images. It is somewhat different from the
643
       other get commands; tex is a symbolic value indicating which texture
644
       (or texture face in the case of a cube map texture target name) is to
645
       be obtained.  TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY_EXT,
646
       and TEXTURE_2D_ARRAY_EXT indicate a one-, two-, or three-dimensional
647
       texture, or one- or two-dimensional array texture, respectively.
648
       TEXTURE_CUBE_MAP_POSITIVE_X, ...
649
 
650
       GetTexImage obtains... from the first image to the last for
651
       three-dimensional textures.  One- and two-dimensional array textures
652
       are treated as two- and three-dimensional images, respectively, where
653
       the layers are treated as rows or images.  These groups are then...
654
 
655
       For three-dimensional and two-dimensional array textures, pixel storage
656
       operations are applied as if the image were two-dimensional, except
657
       that the additional pixel storage state values PACK_IMAGE_HEIGHT and
658
       PACK_SKIP_IMAGES are applied. ..."
659
 
660
Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)
661
 
662
    None
663
 
664
Additions to the AGL/GLX/WGL Specifications
665
 
666
    None
667
 
668
GLX Protocol
669
 
670
    None
671
 
672
Dependencies on ARB_fragment_program
673
 
674
    If ARB_fragment_program is not supported, the changes to section 3.11
675
    should be ignored.
676
 
677
Dependencies on EXT_framebuffer_object
678
 
679
    If EXT_framebuffer_object is not supported, the changes to section
680
    3.8.8 ("Manual Mipmap Generation"), 4.4.2.3, and 6.1.3 should be ignored.
681
 
682
Dependencies on EXT_texture_compression_s3tc and NV_texture_compression_vtc
683
 
684
    (Identical dependency as EXT_texture_array.)
685
 
686
    S3TC texture compression is supported for two-dimensional array textures.
687
    When  is TEXTURE_2D_ARRAY_EXT, each layer is stored independently
688
    as a compressed two-dimensional textures.  When specifying or querying
689
    compressed images using one of the S3TC formats, the images are provided
690
    and/or returned as a series of two-dimensional textures stored
691
    consecutively in memory, with the layer closest to zero specified first.
692
    For array textures, images are not arranged in 4x4x4 or 4x4x2 blocks as in
693
    the three-dimensional compression format provided in the
694
    EXT_texture_compression_vtc extension.  Pixel store parameters, including
695
    those specific to three-dimensional images, are ignored when compressed
696
    image data are provided or returned, as in the
697
    EXT_texture_compression_s3tc extension.
698
 
699
    S3TC compression is not supported for one-dimensional texture targets in
700
    EXT_texture_compression_s3tc, and is not supported for one-dimensional
701
    array textures in this extension.  If compressed one-dimensional arrays
702
    are needed, use a two-dimensional texture with a height of one.
703
 
704
    This extension allows the use of the four S3TC internal format types in
705
    TexImage3D, CompressedTexImage3D, and CompressedTexSubImage3D calls.
706
 
707
Errors
708
 
709
    None
710
 
711
New State
712
 
713
    (add to table 6.15, p. 276)
714
 
715
                                                     Initial
716
    Get Value                     Type   Get Command  Value Description           Sec.    Attribute
717
    ----------------------------  -----  -----------  ----- --------------------  ------  ---------
718
    TEXTURE_BINDING_1D_ARRAY_EXT  2*xZ+  GetIntegerv    0   texture object bound  3.8.12  texture
719
                                                            to TEXTURE_1D_ARRAY
720
    TEXTURE_BINDING_2D_ARRAY_EXT  2*xZ+  GetIntegerv    0   texture object bound  3.8.12  texture
721
                                                            to TEXTURE_2D_ARRAY
722
 
723
 
724
New Implementation Dependent State
725
 
726
    (add to Table 6.32, p. 293)
727
 
728
                                                    Minimum
729
    Get Value                     Type  Get Command  Value  Description         Sec.  Attribute
730
    ----------------------------  ----  ----------- ------- ------------------  ----- ---------
731
    MAX_TEXTURE_ARRAY_LAYERS_EXT   Z+   GetIntegerv   64    maximum number of   3.8.1     -
732
                                                            layers for texture
733
                                                            arrays
734
 
735
Issues
736
 
737
    (1) Is "texture stack" a good name for this functionality?
738
 
739
        NO.  The name is changed to "array texture" to match the
740
        nomenclature used by GL_EXT_texture_array.
741
 
742
    (2) Should the R texture coordinate be treated as normalized or
743
    un-normalized?  If it were un-normalized, floor(R) could be thought
744
    of as a direct index into the array texture.  This may be more
745
    convenient for applications.
746
 
747
        RESOLVED.  All texture coordinates are normalized.  The issue of
748
        un-normalized texture coordinates has been discussed in the ARB
749
        before and should be left for a layered extension.
750
 
751
        RE-RESOLVED.  The R coordinate is un-normalized.  Accessing an array
752
        using [0, layers-1] coordinates is much more natural.
753
 
754
    (3) How does LOD selection work for stacked textures?
755
 
756
        RESOLVED.  For 2D array textures the R coordinate is ignored, and
757
        the LOD selection equations for 2D textures are used.  For 1D
758
        array textures the T coordinate is ignored, and the LOD selection
759
        equations for 1D textures are used.  The expected usage is in a
760
        fragment program with an explicit LOD selection.
761
 
762
    (4) What is the maximum size of a 2D array texture?  Is it the same
763
    as for a 3D texture, or should a new query be added?  How about for 1D
764
    array textures?
765
 
766
        RESOLVED.  A new query is added.
767
 
768
    (5) How are array textures exposed in GLSL?
769
 
770
        RESOLVED.  Use GL_EXT_texture_array.
771
 
772
    (6) Should a 1D array texture also be exposed?
773
 
774
        RESOLVED.  For orthogonality, yes.
775
 
776
    (7) How are stacked textures attached to framebuffer objects?
777
 
778
        RESOLVED.  Layers of both one- and two-dimensional array textures
779
        are attached using FreambufferTextureLayerEXT.  Once attached, the
780
        array texture layer behaves exactly as either a one- or
781
        two-dimensional texture.
782
 
783
    (8) How is this extension related to GL_EXT_texture_array?
784
 
785
        This extension adapats GL_MESAX_texture_stack to the notation,
786
        indexing, and FBO access of GL_EXT_texture_array.  This extension
787
        replaces the GLSL support of GL_EXT_texture_array with
788
        GL_ARB_fragment_program support.
789
 
790
        Assembly program support is also provided by GL_NV_gpu_program4.
791
        GL_NV_gpu_program4 also adds support for other features that are
792
        specific to Nvidia hardware, while this extension adds only support
793
        for array textures.
794
 
795
        Much of text of this extension that has changed since
796
        GL_MESAX_texture_stack comes directly from either
797
        GL_EXT_texture_array or GL_NV_gpu_program4.
798
 
799
Revision History
800
 
801
    ||2005/11/15||0.1||idr||Initial draft MESAX version.||
802
    ||2005/12/07||0.2||idr||Added framebuffer object interactions.||
803
    ||2005/12/12||0.3||idr||Updated fragment program interactions.||
804
    ||2007/05/16||0.4||idr||Converted to MESA_texture_array.  Brought in line with EXT_texture_array and NV_gpu_program4.||