Name ARB_texture_multisample Name Strings GL_ARB_texture_multisample Contact Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) Notice Copyright (c) 2009-2014 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Complete. Approved by the ARB on July 3, 2009. Version Last Modified Date: February 28, 2014 Revision: 12 Number ARB Extension #67 Dependencies This extension is written against the OpenGL 3.1 specification. Overview This extension provides support for two new types of "multisample textures" - two-dimensional and two-dimensional array - as well as mechanisms to fetch a specific sample from such a texture in a shader, and to attach such textures to FBOs for rendering. This extension also includes the following functionality, first described in NV_explicit_multisample: * A query in the API to query the location of samples within the pixel * An explicit control for the multisample sample mask to augment the control provided by SampleCoverage New Procedures and Functions void TexImage2DMultisample(enum target, sizei samples, enum internalformat, sizei width, sizei height, boolean fixedsamplelocations); void TexImage3DMultisample(enum target, sizei samples, enum internalformat, sizei width, sizei height, sizei depth, boolean fixedsamplelocations); void GetMultisamplefv(enum pname, uint index, float *val); void SampleMaski(uint index, bitfield mask); New Tokens Accepted by the parameter of GetMultisamplefv: SAMPLE_POSITION 0x8E50 Accepted by the parameter of Enable, Disable, and IsEnabled, and by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: SAMPLE_MASK 0x8E51 Accepted by the parameter of GetBooleani_v and GetIntegeri_v: SAMPLE_MASK_VALUE 0x8E52 Accepted by the parameter of BindTexture and TexImage2DMultisample: TEXTURE_2D_MULTISAMPLE 0x9100 Accepted by the parameter of TexImage2DMultisample: PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 Accepted by the parameter of BindTexture and TexImage3DMultisample: TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 Accepted by the parameter of TexImage3DMultisample: PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 Accepted by the parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv: MAX_SAMPLE_MASK_WORDS 0x8E59 MAX_COLOR_TEXTURE_SAMPLES 0x910E MAX_DEPTH_TEXTURE_SAMPLES 0x910F MAX_INTEGER_SAMPLES 0x9110 TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 Accepted by the parameter of GetTexLevelParameter TEXTURE_SAMPLES 0x9106 TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 Returned by the parameter of GetActiveUniform: SAMPLER_2D_MULTISAMPLE 0x9108 INT_SAMPLER_2D_MULTISAMPLE 0x9109 UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D Additions to Chapter 2 of the OpenGL 3.1 Specification (OpenGL Operation) Add to table 2.9 "OpenGL Shading Language type tokens" page 56: Type Name Token Keyword ----------------------------------------- ------------ SAMPLER_2D_MULTISAMPLE sampler2DMS SAMPLER_2D_MULTISAMPLE_ARRAY sampler2DMSArray INT_SAMPLER_2D_MULTISAMPLE_ARRAY isampler2DMSArray UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE usampler2DMS UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY usampler2DMSArray Add to section 2.11.7, after subsection "Texel Fetches" Multisample Texel Fetches Multisample texel fetches are similar to standard texel fetches. Since multisample buffers can't have mipmaps, there is no LOD parameter. Instead, there is an integer parameter which selects the sample number to be fetched from the buffer. The number identifying the sample is the same as the value used to query the sample location using GetMultisamplefv. Multisample textures support only NEAREST filtering. Additionally, this fetch may only be performed on a multisample texture sampler. No other sample or fetch commands may be performed on a multisample texture sampler. Additions to Chapter 3 of the OpenGL 3.1 Specification (Rasterization) (Insert into section 3.3.1, Multisampling after the discussion of the query for SAMPLES) The location of a given sample is queried with the command void GetMultisamplefv(enum pname, uint index, float *val); must be SAMPLE_POSITION and corresponds to the sample for which the location should be returned. The sample location is returned as two floating point values in and , each between 0 and 1, corresponding to the and locations respectively in GL pixel space of that sample. (0.5, 0.5) thus corresponds to the pixel center. An INVALID_ENUM error is generated if is not SAMPLE_POSITION. An INVALID_VALUE error is generated if is greater than or equal to the value of SAMPLES. If the multisample mode does not have fixed sample locations, the returned values may only reflect the locations of samples within some pixels. Modify Section 3.8.1, Texture Image Specification (p. 143) Add the two new targets to MAX_TEXTURE_SIZE description: In a similar fashion, the maximum allowable width of a texel array for a one or two-dimensional, one- or two-dimensional array, two-dimensional multisample, or two-dimensional multisample array texture, and the maximum allowable height of a two-dimensional, two-dimensional array, two- dimensional multisample, or two-dimensional multisample array texture, must be at least 2^(k-lod)+2*b_t for image arrays of level 0 through k, where k is the log base 2 of MAX_TEXTURE_SIZE. (Insert new Section 3.8.4, Multisample Textures. Renumber subsequent sections.) In addition to the texture types described in previous sections, two additional types of textures are supported. A multisample texture is similar to a two-dimensional or two-dimensional array texture, except it contains multiple samples per texel. Multisample textures do not have multiple image levels. The commands void TexImage2DMultisample(enum target, sizei samples, enum internalformat, sizei width, sizei height, boolean fixedsamplelocations); void TexImage3DMultisample(enum target, sizei samples, enum internalformat, sizei width, sizei height, sizei depth, boolean fixedsamplelocations); establish the data storage, format, dimensions, and number of samples of a multisample texture's image. For TexImage2DMultisample, must be TEXTURE_2D_MULTISAMPLE or PROXY_TEXTURE_2D_MULTISAMPLE and for TexImage3DMultisample must be TEXTURE_2D_MULTISAMPLE_ARRAY or PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY. and are the dimensions in texels of the texture. must be color-renderable, depth-renderable, or stencil- renderable (as defined in section 4.4.4). The error INVALID_OPERATION may be generated if any of the following are true: * is a depth/stencil-renderable format and is greater than the value of MAX_DEPTH_TEXTURE_SAMPLES * is a color-renderable format and is greater than the value of MAX_COLOR_TEXTURE_SAMPLES * is a signed or unsigned integer format and is greater than the value of MAX_INTEGER_SAMPLES. If is TRUE, the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not depend on the internalformat or size of the image. An INVALID_VALUE error is generated by TexImage2DMultisample if or is greater than the value of MAX_TEXTURE_SIZE. An INVALID_VALUE error is generated by TexImage3DMultisample if , , or is greater than the value of MAX_3DTEXTURE_SIZE; An INVALID_VALUE error is generated if is greater than the value of MAX_SAMPLES. An OUT_OF_MEMORY error is generated if the GL is unable to create a texture level of the requested size. When a multisample texture is accessed in a shader, the access takes one vector of integers describing which texel to fetch and an integer corresponding to the sample numbers described in section 3.3.1 describing which sample within the texel to fetch. No standard sampling instructions are allowed on the multisample texture targets. Modify Section 3.8.11, Texture Completeness (p. 154) (insert after first paragraph of section, p. 154) For multisample textures, a texture is complete if each dimension of the texture's level is positive. Modify Section 3.8.12, Texture State and Proxy State (p. 155) (insert into the first paragraph of the section, p. 155) ... the compressed flag set to FALSE, and a zero compressed size). Multisample textures contain an integer identifying the number of samples in each texel. The buffer texture target has associated an integer containing ... (add a new paragraph after the paragraph starting with "Proxy Arrays...") Proxy array for two-dimensional multisample and two-dimensional multisample array textures are operated on in the same way when TexImage2DMultisample is called with specified as PROXY_TEXTURE_2D_MULTISAMPLE, or TexImage3DMultisample is called with specified as PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY. Modify Section 3.8.13, Texture Objects (p. 157) (modify first paragraphs of section, p. 157, simply adding references to multisample textures) In addition to the default textures TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE, TEXTURE_BUFFER, TEXTURE_CUBE_MAP, TEXTURE_2D_MULTISAMPLE, and TEXTURE_2D_MULTISAMPLE_ARRAY, named one-, two-, and three-dimensional, one- and two-dimensional array, rectangular, buffer, cube map, two-dimensional multisample, and two- dimensional multisample array texture objects can be created and operated upon. The name space for texture objects is the unsigned integers, with zero reserved by the GL. ... In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE, TEXTURE_BUFFER, TEXTURE_CUBE_MAP, TEXTURE_2D_MULTISAMPLE, and TEXTURE_2D_MULTISAMPLE_ARRAY have one-, two-, and three-dimensional, one- and two-dimensional array, rectangular, buffer, cube map, two-dimensional multisample, and two-dimensional multisample array texture state vectors respectively associated with them. In order that access to these initial textures not be lost, they are treated as texture objects all of whose names are 0. The initial one-, two-, three- dimensional, one- and two-dimensional array, rectangular, buffer, cube map, two-dimensional multisample, and two-dimensional multisample array texture is therefore operated upon, queried, and applied as TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE, TEXTURE_BUFFER, TEXTURE_CUBE_MAP, TEXTURE_2D_MULTISAMPLE, and TEXTURE_2D_MULTISAMPLE_ARRAY respectively while 0 is bound to the corresponding targets. (modify second paragraph, p. 158) The texture object name space, including the initial one-, two-, and three-dimensional, one- and two-dimensional array, rectangular, buffer, cube map, two-dimensional multisample, and two-dimensional multisample array texture objects, is shared among all texture units. A texture object may be bound to more than one texture unit simultaneously. After a texture object is bound, any GL operations on that target object affect any other texture units to which the same texture object is bound. Additions to Chapter 4 of the OpenGL 3.1 Specification (Per-Fragment Operations and the Frame Buffer) Modify Section 4.1.3, Multisample Fragment Operations Modify the first paragraph to include SAMPLE_MASK and SAMPLE_MASK_VALUE on the list of values the coverage value is modified based on. Modify the discussion of SAMPLE_COVERAGE to start with "Next" instead of "Finally" Add after the discussion of SAMPLE_COVERAGE: Finally, if SAMPLE_MASK is enabled, the fragment coverage is ANDed with the coverage value SAMPLE_MASK_VALUE. The value of SAMPLE_MASK_VALUE is specified using void SampleMaski(GLuint index, GLbitfield mask); with set to the desired mask for . SAMPLE_MASK_VALUE is queried by calling GetIntegeri_v with set to SAMPLE_MASK_VALUE and the index set to . Bit B of mask M corresponds to sample 32*M+B as described in Section 3.3.1. The error INVALID_VALUE is generated if the mask word indexed is greater than or equal to MAX_SAMPLE_MASK_WORDS. Modify Section 4.4.2, Attaching Images to Framebuffer Objects, p. 203 (the first paragraph of RenderbufferStorageMultisample p. 205) ... If either or is greater than the value of MAX_RENDERBUFFER_SIZE, or if is greater than the value of MAX_SAMPLES, then the error INVALID_VALUE is generated. If is a signed or unsigned integer format and is greater than the value of MAX_INTEGER_SAMPLES, then the error INVALID_OPERATION is generated. (see ``Required Renderbuffer Formats'' below). ... (The second paragraph of "Required Renderbuffer Formats" p. 206): Implementations must support creation of renderbuffers in these required formats with up to the value of MAX_SAMPLES multisamples, with the exception that the signed and unsigned integer formats are required only to support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES multisamples, which must be at least one. Modify the description of FrameBufferTextureARB in ARB_geometry_shader4, to allow multisample array textures with FramebufferTextureARB: If is the name of a three-dimensional texture, cube map texture, one- or two-dimensional array texture, or two-dimensional multisample array texture, the texture level attached to the framebuffer attachment point is an array of images, and the framebuffer attachment is considered layered. (At the end of p. 208, describing FrameBufferTexture*D) If is TEXTURE_RECTANGLE, TEXTURE_2D_MULTISAMPLE, or TEXTURE_2D_MULTISAMPLE_ARRAY, then must be zero. ... For FramebufferTexture2D, if is not zero, then must be one of of TEXTURE_2D, TEXTURE_RECTANGLE, TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Z, or TEXTURE_2D_MULTISAMPLE. ... The command void FramebufferTextureLayer(enum target, enum attachment, uint texture, int level, int layer); operates identically to FramebufferTexture3D, except that it attaches a single layer of a three-dimensional, one- or two-dimensional array, or two-dimensional multisample array texture layer is an integer indicating the layer sample number, and is treated identically to the layer parameter in FramebufferTexture3D. The error INVALID_VALUE is generated if texture is non-zero and layer is negative. The error INVALID_OPERATION is generated if texture is non-zero and is not the name of a three dimensional, two- dimensional multisample array, or one-or two-dimensional array texture. Unlike FramebufferTexture3D, no textarget parameter is accepted. ... Modify Section 4.4.4, Framebuffer Completeness, p. 212 (Modify the last bullet at the top of p. 215) - The value of RENDERBUFFER_SAMPLES is the same for all attached renderbuffers; the value of TEXTURE_SAMPLES is the same for all attached textures; and, if the attached images are a mix of renderbuffers and textures, the value of RENDERBUFFER_SAMPLES matches the value of TEXTURE_SAMPLES. { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE } - The value of TEXTURE_FIXED_SAMPLE_LOCATIONS is the same for all attached textures; if the attached images are a mix of renderbuffers and textures, the value of TEXTURE_FIXED_SAMPLE_LOCATIONS must be TRUE for all attached textures. { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE } Additions to Chapter 6 of the OpenGL 3.1 Specification (State and State Requests) Edit Section 6.1.3, p. 223 (Enumerated Queries) Add TEXTURE_2D_MULTISAMPLE, PROXY_TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY, and PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY to the list of valid targets for GetTexLevelParameter{if}v. Additions to the AGL/GLX/WGL Specifications None GLX Protocol TBD Errors The error INVALID_VALUE is generated by GetBooleani_v and GetIntegeri_v if is SAMPLE_MASK_VALUE and is greater than or equal to MAX_SAMPLE_MASK_WORDS. The error INVALID_VALUE is generated by SampleMaski if is greater than or equal to MAX_SAMPLE_MASK_WORDS. The error INVALID_ENUM is generated by GetMultisamplefv if is not SAMPLE_POSITION. The error INVALID_VALUE is generated by GetMultisamplefv if is greater than or equal to the value of SAMPLES. The error INVALID_OPERATION is generated by TexImage2DMultisample and TexImage3DMultisample if the number of samples exceeds the implementation dependent maximum for the given internal format. The error INVALID_VALUE is generated by TexImage2DMultisample TexImage3DMultisample if either or is greater than the value of MAX_TEXTURE_SIZE, or if is greater than the value of MAX_SAMPLES. The error INVALID_VALUE is generated by TexImage3DMultisample if , , or is greater than the value of MAX_3D_TEXTURE_SIZE, or if is greater than the value of MAX_SAMPLES. The error OUT_OF_MEMORY is generated by TexImage2DMultisample and TexImage3DMultisample if the GL is unable to create a texture level of the requested size. The error INVALID_OPERATION is generated by RenderbufferStorageMultisample if is a signed or unsigned integer format and is greater than the value of MAX_INTEGER_SAMPLES. New State Get Value Get Command Type Initial Value --------- ----------- ---- ------------- SAMPLE_MASK IsEnabled B FALSE SAMPLE_MASK_VALUE GetIntegeri_v nxZ+ ~0 Where n is the number of sample mask words (the value of MAX_SAMPLE_MASK_WORDS) the implementation supports. (add to table 6.12, Texture State Per Texture Unit/Binding Point p. 250) Initial Get Value Type Get Command Value Description Sec. ------------------------------------ ---- ----------- ------- --------------------------- ------ TEXTURE_BINDING_2D_MULTISAMPLE 32*xZ+ GetIntegerv 0 Texture object bound to 3.8.13 TEXTURE_2D_MULTISAMPLE TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 32*xZ+ GetIntegerv 0 Texture object bound to 3.8.13 TEXTURE_2D_MULTISAMPLE_ARRAY (add to table 6.14, Textures (state per texture image p. 252) Initial Get Value Type Get Command Value Description Sec. ---------------------- ---- ------------------- ------- --------------------------- ------ TEXTURE_SAMPLES Z+ GetTexLevelParameter 0 Number of samples per texel 3.8.4 TEXTURE_FIXED_SAMPLE_LOCATIONS B GetTexLevelParameter TRUE Whether the image uses a 3.8.4 fixed sample pattern (add to table 6.41, Framebuffer dependent Values, p. 279) Initial Get Value Type Get Command Value Description Sec. ------------------ ---------- ------------------ -------------- --------------- ------ SAMPLE_POSITION N*2*R[0,1] GetMultisamplefv implementation Explicit sample 3.2.1 dependent positions Where N is the number of samples (the value of SAMPLES) the framebuffer supports. New Implementation Dependent State Minimum Get Value Type Get Command Value Description Sec. --------- ------- ----------- ------- ------------------------ ------ MAX_SAMPLE_MASK_WORDS Z+ GetIntegerv 1 maximum number of sample 4.1.3 mask words MAX_COLOR_TEXTURE_SAMPLES Z+ GetIntegerv 1 maximum number of samples 4.1.3 in a color multisample texture MAX_DEPTH_TEXTURE_SAMPLES Z+ GetIntegerv 1 maximum number of samples 4.1.3 in a depth/stencil multisample texture MAX_INTEGER_SAMPLES Z+ GetIntegerv 1 Maximum number of samples 4.4.2 in integer format multisample buffers Modifications to the OpenGL Shading Language Specification, Version 1.40 Including the following line in a shader can be used to control the language featured described in this extension: #extension GL_ARB_texture_multisample : where is as specified in section 3.3. A new preprocessor #define is added to the OpenGL Shading Language: #define GL_ARB_texture_multisample 1 Add to section 3.6 "Keywords" The following new sampler types are added: sampler2DMS, isampler2DMS, usampler2DMS, sampler2DMSArray, isampler2DMSArray, usampler2DMSArray Add to section 4.1 "Basic Types" Add the following sampler type to the "Floating Point Sampler Types" table: sampler2DMS handle for accessing a 2D multisample texture sampler2DMSArray handle for accessing a 2D multisample array texture Add the following sampler type to the "Unsigned Integer Sampler Types" table: usampler2DMS handle for accessing an unsigned integer 2D multisample texture usampler2DMSArray handle for accessing an unsigned integer 2D multisample array texture Add the following sampler type to the "Integer Sampler Types" table: isampler2DMS handle for accessing an integer 2D multisample texture isampler2DMSArray handle for accessing an integer 2D multisample array texture Add to section 8.7 "Texture Lookup Functions" Add new functions to the set of allowed texture lookup functions: Syntax: gvec4 texelFetch(gsampler2DMS sampler, ivec2 P, int sample) gvec4 texelFetch(gsampler2DMSArray sampler, ivec3 P, int sample) Description: Use integer texture coordinate

to lookup a single sample on the texture bound to as described in section 2.11.7.1 of the OpenGL specification "Multisample Texel Fetches". Syntax: ivec2 textureSize(gsampler2DMS sampler) ivec3 textureSize(gsampler2DMSArray sampler) Description: Returns the dimensions, width and height of level 0 for the texture bound to , as described in section 2.11.7.1 of the OpenGL specification section "Texture Size Query". Examples Issues (1) Do we need new "max size" queries for the new targets? RESOLVED: No. The existing MAX_TEXTURE_SIZE applies to 2D multisample textures, and MAX_3D_TEXTURE_SIZE to 3D multisample textures. (2) What commands may be used on multisample textures? RESOLVED: Multisample textures can be bound for rendering and texturing, but they cannot be loaded/read with SubImage commands (TexSubImage, CopyTexSubImage, GetTexImage), they don't support compressed formats, and they don't need TexParameters since they can only be fetched with texelFetchMultisample. (3) Should the new TexImage commands take an "int level" argument? RESOLVED: No. We can add new commands if/when we ever add mipmapped multisample textures. (4) GetMultisamplefv takes an index to support >32 samples, but NV_gpu_shader4_1's gl_SampleMask is only 32 bits. What gives? RESOLVED: This is gpu_shader4_1's problem, not ARB_texture_multisample's problem. (5) Should GLSL include a query to return the sample count of a texture, either as part of textureSizeMultisample or stand-alone? RESOLVED: No, there hasn't been a demand for it. (6) How does SAMPLE_POSITION interact with EXT_fragment_coord_conventions? RESOLVED: The SAMPLE_POSITION query is not in any way affected by the shader state added in EXT_fragment_coord_conventions. It is expected that the returned values will not actually be used within the shader, but rather to compute filter weights on the CPU, so whether the fragment coord is inverted or translated by 0.5 doesn't matter. (7) Should we use "TexImage3DMultisample" to make things look like regular 2D arrays, or just have TexImage2DArrayMultisample? RESOLVED: Leave it as is. (8) How should we deal with varying sample locations? RESOLVED: Allow the application to explicitly request fixed sample locations for when a texture will be used to do custom downsamples. When this is requested, the values returned by GetMultisamplefv will be valid for all texels in the image and can be used to construct elaborate filter kernels that can safely be used across the entire image. (9) Are depth multisample textures supported? RESOLVED: Some implementations may not support texturing from a multisample depth/stencil texture. In that case, they would export MAX_DEPTH_TEXTURE_SAMPLES = 1. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------------- 12 2/28/14 Jon Leech Add missing error for invalid to GetMultisamplefv, and change texture size limits for TexImage3DMultisample to the value of MAX_3D_TEXTURE_SIZE (Bugs 11134, 11135). 11 9/23/13 Jon Leech Change type of argument to enum (Bug 10496). 10 8/02/09 Jon Leech Reformat to 80 columns and assign ARB extension number. 9 7/23/09 groth Update return of textureSize(gsampler2DMSarray) 8 7/20/09 Jon Leech Assign enum values. 7 6/26/09 groth Update some language to correspond to gl3.2 6 6/11/09 groth Add new max queries to token section 5 5/28/09 groth Add MAX_INTEGER_SAMPLES query. 4 5/22/09 jbolz Add max sample queries. 3 5/14/09 jbolz Add allowance for not supporting multisample depth textures. 2 5/08/09 jbolz Add allowance for varying sample locations, and a mechanism to request fixed locations. Resolve some issues. 1 4/30/09 jbolz First revision.