| Name |
| |
| NV_explicit_multisample |
| |
| Name Strings |
| |
| NV_explicit_multisample |
| |
| Contributors |
| |
| Eric Werness, NVIDIA Corporation |
| Pat Brown, NVIDIA Corporation |
| Jamie Gennis, NVIDIA Corporation |
| Nacho Sanz-Pastor, Aechelon |
| Mark Kilgard, NVIDIA Corporation |
| |
| Contact |
| |
| Eric Werness, NVIDIA Corporation (ewerness 'at' nvidia.com) |
| Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) |
| |
| Status |
| |
| Shipping in NVIDIA's Release 180 drivers (October 2008) |
| |
| Version |
| |
| Last Modified Date: 10/27/08 |
| Revision: 1 |
| |
| Number |
| |
| 357 |
| |
| Dependencies |
| |
| OpenGL 2.0 is required. |
| |
| ARB_multisample is required. |
| |
| EXT_framebuffer_multisample affects the definition of this extension. |
| |
| NV_gpu_program4 affects the definition of this extension. |
| |
| EXT_gpu_shader4 affects the definition of this extension. |
| |
| EXT_timer_query affects the definition of this extension. |
| |
| This extension is written against the OpenGL 2.0 specification. |
| |
| Overview |
| |
| In traditional multisample specs, the API only allows access to the samples |
| indirectly through methods such as coverage values and downsampled |
| readbacks. NV_explicit_multisample adds a set of new capabilities to allow |
| more precise control over the use of multisamples. Specifically, it adds: |
| |
| * 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 |
| |
| * A new texture target to wrap a renderbuffer and allow a restricted class |
| of accesses to the samples |
| |
| * The ability to fetch a specific sample from a multisampled texture from |
| within a shader |
| |
| * A program option to enable the new behavior |
| |
| New Procedures and Functions |
| |
| void GetBooleanIndexedvEXT(enum value, uint index, boolean *data); |
| |
| void GetIntegerIndexedvEXT(enum value, uint index, int *data); |
| |
| void GetMultisamplefvNV(enum pname, uint index, float *val); |
| |
| void SampleMaskIndexedNV(uint index, bitfield mask); |
| |
| void TexRenderbufferNV(enum target, uint renderbuffer); |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetMultisamplefvNV: |
| |
| SAMPLE_POSITION_NV 0x8E50 |
| |
| Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and by |
| the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and |
| GetDoublev: |
| |
| SAMPLE_MASK_NV 0x8E51 |
| |
| Accepted by the <pname> parameter of GetBooleanIndexedvEXT and |
| GetIntegerIndexedvEXT: |
| |
| SAMPLE_MASK_VALUE_NV 0x8E52 |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetDoublev, GetIntegerv, |
| and GetFloatv: |
| |
| TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 |
| TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 |
| MAX_SAMPLE_MASK_WORDS_NV 0x8E59 |
| |
| Accepted by the <target> parameter of BindTexture, and TexRenderbufferNV: |
| |
| TEXTURE_RENDERBUFFER_NV 0x8E55 |
| |
| Returned by the <type> parameter of GetActiveUniform: |
| |
| SAMPLER_RENDERBUFFER_NV 0x8E56 |
| INT_SAMPLER_RENDERBUFFER_NV 0x8E57 |
| UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 |
| |
| Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) |
| |
| Modify Section 2.X.2, Program Grammar |
| |
| If a program specifies the NV_explicit_multisample program option, the |
| <texTarget> rule is modified to add the texture target RENDERBUFFER and the |
| <TEXop> rule is modified to add the instruction TXFMS. |
| |
| Add to section 2.15.4.1, Shader Only Texturing |
| |
| Multisample Texel Fetches |
| |
| Multisample texel fetches are very 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 GetMultisamplefvNV. |
| |
| Additionally, this fetch may only be performed on a texture renderbuffer |
| sampler. No other sample or fetch commands may be performed on a texture |
| renderbuffer sampler. |
| |
| Add to section 2.X.4.4, Program Texture Access |
| |
| Add row to table X.17 |
| |
| coordinates used |
| texTarget Texture Type s t r layer shadow |
| ---------------- --------------------- ----- ----- ------ |
| RENDERBUFFER TEXTURE_RENDERBUFFER_NV <not supported> |
| |
| |
| Add row to table X.18 |
| |
| coordinates used |
| texTarget supported i j k layer lod |
| ---------------- --------- ----- ----- --- |
| RENDERBUFFER no - - - - - |
| |
| Add after the discussion of TexelFetch |
| |
| The TXFMS instruction provides the ability to extract a single sample from a |
| specified RENDERBUFFER texture image using the function |
| |
| result_t_vec TexelFetchMultisample(int_vec coord, int_vec offset); |
| |
| The extracted texel is converted to an (R,G,B,A) vector according to Table |
| 3.21. The result vector is interpreted as floating-point, signed integer, |
| or unsigned integer, according to the data type modifier of the |
| instruction. If the internal format of the texture is not compatible with |
| the instruction's data type modifier, the extracted texel value is |
| undefined. |
| |
| <coord> is a four-component signed integer vector used to identify the |
| single sample accessed. Since a renderbuffer must be 2D with no mipmaps, the |
| x and y components are always used to select the pixel and the fourth |
| component is used to select the sample. All of the restrictions of |
| TexelFetch apply to TexelFetchMultisample, with the additional requirement |
| that it must be called on a RENDERBUFFER texture target. If the sample number |
| is greater than or equal to the value of SAMPLES for the render buffer |
| associated with the renderbuffer texture, the results are undefined. |
| |
| Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) |
| |
| (Insert into section 3.2.1, Multisampling after the discussion of the query |
| for SAMPLES) |
| |
| To query the location of a given sample, the function |
| |
| void GetMultisamplefvNV(enum pname, uint index, float *val); |
| |
| is used with a pname of SAMPLE_POSITION_NV and an index corresponding to the |
| sample for which the location should be returned. The sample location is |
| returned as two floating point values each between 0 and 1 corresponding to |
| the x and y locations respectively in GL pixel space of that sample. The |
| error INVALID_OPERATION is generated if <index> is greater than or equal to |
| the value of SAMPLES. |
| |
| (Insert new Section 3.8.4, Renderbuffer Textures. Renumber subsequent |
| sections.) |
| |
| In addition to one-, two-, and three-dimensional and cube map textures |
| described in previous sections, one additional type of texture is supported. |
| A renderbuffer texture is similar to a two-dimensional texture. However, |
| unlike other texture types, the texel array is not stored as part of the |
| texture. Instead, a renderbuffer object is attached to a renderbuffer |
| texture and the texel array is taken from the data store of the attached |
| renderbuffer object. When the contents of a renderbuffer are modified, |
| those changes are reflected in the contents of any renderbuffer texture to |
| which the buffer object is attached. Also unlike other textures, |
| renderbuffer textures do not have multiple image levels; only a single data |
| store is available. |
| |
| The command |
| |
| void TexRenderbufferNV(enum target, uint renderbuffer); |
| |
| attaches the renderbuffer object named <renderbuffer> to the active |
| renderbuffer texture. If <renderbuffer> is zero, any renderbuffer object |
| attached to the buffer texture is detached, and no new renderbuffer object |
| is attached. If <renderbuffer> is non-zero, but is not the name of an |
| existing renderbuffer object, the error INVALID_OPERATION is generated. |
| <target> must be TEXTURE_RENDERBUFFER_NV. The name of the renderbuffer |
| object that is bound as the data store of the active renderbuffer texture |
| can be queried by calling GetIntegerv with <value> set to |
| TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV. |
| |
| When a renderbuffer texture is accessed in a shader, the access takes one |
| vector of integers describing which pixel to fetch and an integer |
| corresponding to the sample numbers described in section 3.2.1 describing |
| which sample within the pixel to fetch. No standard sampling instructions |
| are allowed to the renderbuffer texture target. |
| |
| Modify Section 3.8.10, Texture Completeness (p. 177) |
| |
| (insert after second paragraph of section, p.177) |
| |
| For renderbuffer textures, a texture is <complete> if a renderbuffer object |
| is attached to it, and each dimension of that renderbuffer is positive. |
| |
| Modify Section 3.8.11, Texture State and Proxy State (p. 178) |
| |
| (insert into the first paragraph of the section, p. 178) ... a zero |
| compressed size, and zero-sized components). The renderbuffer texture |
| target contains an integer identifying the renderbuffer object that |
| provides the data store for the texture, initially zero. Next, there are |
| the two sets of texture properties; ... |
| |
| Modify Section 3.8.12, Texture Objects (p. 180) |
| |
| (modify first paragraphs of section, p. 180, simply adding references to |
| renderbuffer textures, which are treated as texture objects) |
| |
| In addition to the default textures TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_CUBE_MAP, and TEXTURE_RENDERBUFFER_NV, named one-, two-, and |
| three-dimensional, cube map, and renderbuffer texture objects can be created |
| and operated upon. The name space for texture objects is the unsigned |
| integers, with zero reserved by the GL. |
| |
| A texture object is created by binding an unused name to TEXTURE_1D, |
| TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or TEXTURE_RENDERBUFFER_NV. The |
| binding is effected by calling |
| |
| void BindTexture( enum target, uint texture ); |
| |
| with target set to the desired texture target and texture set to the unused |
| name. The resulting texture object is a new state vector, comprising all |
| the state values listed in section 3.8.11, set to the same initial |
| values. If the new texture object is bound to TEXTURE_1D, TEXTURE_2D, |
| TEXTURE_3D, TEXTURE_CUBE_MAP, or TEXTURE_RENDERBUFFER_NV, it is and remains |
| a one-, two-, three-dimensional, cube map, or renderbuffer texture |
| respectively until it is deleted. |
| |
| BindTexture may also be used to bind an existing texture object to either |
| TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or |
| TEXTURE_RENDERBUFFER_NV. The error INVALID_OPERATION is generated if an |
| attempt is made to bind a texture object of different dimensionality than |
| the specified target. If the bind is successful no change is made to the |
| state of the bound texture object, and any previous binding to target is |
| broken. |
| |
| ... |
| |
| In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, |
| and TEXTURE_RENDERBUFFER_NV have one-, two-, three-dimensional, cube map, |
| and renderbuffer 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, cube map, and renderbuffer texture is therefore operated |
| upon, queried, and applied as TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, |
| TEXTURE_CUBE_MAP, or TEXTURE_RENDERBUFFER_NV respectively while 0 is bound |
| to the corresponding targets. |
| |
| Texture objects are deleted by calling |
| |
| void DeleteTextures( sizei n, uint *textures ); |
| |
| textures contains n names of texture objects to be deleted. After a texture |
| object is deleted, it has no contents or dimensionality, and its name is |
| again unused. If a texture that is currently bound to one of the targets |
| TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or |
| TEXTURE_RENDERBUFFER_NV is deleted, it is as though BindTexture had been |
| executed with the same target and texture zero. Unused names in textures are |
| silently ignored, as is the value zero. |
| |
| (modify second paragraph, p. 182, adding buffer textures, plus cube map |
| textures, which is an oversight in the core specification) |
| |
| The texture object name space, including the initial one-, two-, and |
| three-dimensional, cube map, and renderbuffer 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 2.0 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 SampleMaskIndexedNV(GLuint index, GLbitfield mask); |
| |
| with <mask> set to the desired mask for <maskNumber>. SAMPLE_MASK_VALUE is |
| queried by calling GetIntegerIndexedv with <pname> set to SAMPLE_MASK_VALUE |
| and the index set to <maskNumber>. Bit B of mask M corresponds to sample |
| 32*M+B as described in Section 3.2.1. The error INVALID_OPERATION is |
| generated if the mask word indexed is greater than or equal to |
| MAX_SAMPLE_MASK_WORDS. |
| |
| |
| Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) |
| |
| On p. 241, add the following to the list of commands not compiled into a |
| display list: GetMultisamplefvNV, TexRenderbufferNV. |
| |
| Additions to Chapter 6 of the OpenGL 2.0 Specification (State and |
| State Requests) |
| |
| Modify the second paragraph of section 6.1.1 (Simple Queries) |
| p244 to read as follows: |
| |
| ...<data> is a pointer to a scalar or array of the indicated |
| type in which to place the returned data. |
| |
| void GetBooleanIndexedvEXT(enum target, uint index, boolean *data); |
| void GetIntegerIndexedvEXT(enum target, uint index, int *data); |
| |
| are used to query indexed state. <target> is the name of |
| the indexed state and <index> is the index of the particular |
| element being queried. <data> is a pointer to a scalar or array |
| of the indicated type in which to place the returned data. In addition ... |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| GLX Protocol |
| |
| The following rendering command is sent to the server as part of |
| a glXRender request: |
| |
| SampleMaskIndexedNV |
| |
| 2 12 rendering command length |
| 2 XXXX rendering command opcode |
| 4 CARD32 index |
| 4 BITFIELD mask |
| |
| TexRenderbufferNV |
| |
| 2 12 rendering command length |
| 2 XXXX rendering command opcode |
| 4 ENUM target |
| 4 CARD32 renderbuffer |
| |
| |
| The following new non-rendering commands are added: |
| |
| GetMultisamplefvNV |
| |
| 1 CARD8 opcode(X assigned) |
| 1 XXX GLX opcode |
| 2 4 request length |
| 4 GLX_CONTEXT_TAG context tag |
| 4 ENUM pname |
| 4 CARD32 index |
| => |
| 1 1 reply |
| 1 unused |
| 2 CARD16 sequence number |
| 4 0 reply length |
| 8 unused |
| 4 FLOAT32 val[0] |
| 4 FLOAT32 val[1] |
| 8 unused |
| |
| |
| |
| Dependencies on EXT_framebuffer_multisample |
| |
| If EXT_framebuffer_multisample is not available, all discussion involving |
| textures and renderbuffers is deleted. This only leaves the ability to query |
| the sample parameters of the current framebuffer. |
| |
| Dependencies on EXT_timer_query |
| |
| If EXT_timer_query is not available, include its discussion of int64EXT and |
| uint64EXT. |
| |
| Dependencies on NV_gpu_program4 and EXT_gpu_shader4 |
| |
| If NV_gpu_program4 and EXT_gpu_shader4 are not supported, and no other |
| mechanism is provided to perform texture lookups into renderbuffer textures, |
| this extension is pointless, given that it provides no fixed-function |
| mechanism to access renderbuffer textures. |
| |
| If EXT_gpu_shader4 is supported, the language below describes the |
| modifications to the shading language to support renderbuffer textures. If |
| not, the language below and in Chapter 2 should be removed. |
| |
| Errors |
| |
| The error INVALID_VALUE is generated by GetBooleanIndexedvEXT and |
| GetIntegerIndexedvEXT if target is SAMPLE_MASK_VALUE_NV and index is greater |
| than or equal to MAX_SAMPLE_MASK_WORDS_NV. |
| |
| The error INVALID_VALUE is generated by SampleMaskIndexedNV if index is greater |
| than or equal to MAX_SAMPLE_MASK_WORDS_NV. |
| |
| |
| New State |
| |
| Get Value Get Command Type Initial Value Attribute |
| --------- ----------- ---- ------------- --------- |
| SAMPLE_MASK_NV IsEnabled B FALSE multisample/enable |
| SAMPLE_MASK_VALUE_NV GetInteger- nxZ+ ~0 multisample |
| IndexedvEXT |
| |
| Where n is the number of sample mask words (the value of |
| MAX_SAMPLE_MASK_WORDS_NV) the implementation supports. |
| |
| (add to table 6.15, Texture State Per Texture Unit/Binding Point p. 276) |
| |
| Initial |
| Get Value Type Get Command Value Description Sec. Attribute |
| --------------------------------- ---- ----------- ------- --------------------------- ------ --------- |
| TEXTURE_BINDING_RENDERBUFFER_NV 2*xZ+ GetIntegerv 0 Texture object bound to 3.8.12 texture |
| TEXTURE_RENDERBUFFER_EXT |
| |
| (add to table 6.16, Texture State Per Texture Object, p. 276) |
| |
| Initial |
| Get Value Type Get Command Value Description Sec. Attribute |
| --------------------------------- ---- ----------- ------- --------------------------- ------ --------- |
| TEXTURE_RENDERBUFFER_DATA_STORE_ nxZ+ GetIntegerv 0 Renderbuffer object bound 3.8.4 texture |
| BINDING_NV as the data store for the |
| active image unit's |
| renderbuffer texture |
| |
| (add to table 9.nnn "Framebuffer dependent Values" introduced by |
| the EXT_framebuffer_object specification) |
| |
| Initial |
| Get Value Type Get Command Value Description Sec. Attribute |
| ------------------ ---------- ------------------ -------------- --------------- ------ --------- |
| SAMPLE_POSITION_NV N*2*R[0,1] GetMultisamplefvNV 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. Attribute |
| --------- ------- ----------- ------- ---------------- ------ --------- |
| MAX_SAMPLE_MASK_WORDS_NV Z GetIntegerv 1 maximum number x.x.x - |
| of sample mask |
| words |
| |
| Modifications to the OpenGL Shading Language Specification, Version 1.10.59 |
| |
| Including the following line in a shader can be used to control the language |
| featured described in this extension: |
| |
| #extension GL_NV_explicit_multisample : <behavior> |
| |
| where <behavior> is as specified in section 3.3. |
| |
| A new preprocessor #define is added to the OpenGL Shading Language: |
| |
| #define GL_NV_explicit_multisample 1 |
| |
| Add to section 3.6 "Keywords" |
| |
| The following new sampler types are added: |
| |
| samplerRenderbuffer, isamplerRenderbuffer, usamplerRenderbuffer |
| |
| Add to section 4.1 "Basic Types" |
| |
| Add the following sampler type to the "default sampler types" table: |
| |
| samplerRenderbuffer handle for accessing a renderbuffer texture |
| |
| Add the following sampler type to the "unsigned integer sampler types" |
| table: |
| |
| isamplerRenderbuffer handle for accessing an integer renderbuffer texture |
| |
| Add the following sampler type to the "integer sampler types" table: |
| |
| usamplerRenderbuffer handle for accessing an unsigned integer renderbuffer texture |
| |
| Add to section 8.7 "Texture Lookup Functions" |
| |
| Add new functions to the set of allowed texture lookup functions: |
| |
| Syntax: |
| |
| vec4 texelFetchRenderbuffer(samplerRenderbuffer sampler, ivec2 coord, int sample) |
| |
| Description: |
| |
| Use integer texture coordinate <coord> to lookup a single sample <sample> |
| on the texture bound to <sampler> as described in section 2.15.4.1 of the |
| OpenGL specification "Multisample Texel Fetches". |
| |
| Syntax: |
| |
| ivec2 textureSizeRenderbuffer(samplerRenderbuffer sampler) |
| ivec2 textureSizeRenderbuffer(isamplerRenderbuffer sampler) |
| ivec2 textureSizeRenderbuffer(usamplerRenderbuffer sampler) |
| |
| Description: |
| |
| Returns the dimensions, width and height of level 0 for the texture bound |
| to <sampler>, as described in section 2.15.4.1 of the OpenGL specification |
| section "Texture Size Query". |
| |
| Examples |
| |
| Issues |
| |
| (1) Should the NUMBER_OF_SAMPLES parameter reuse an existing enum? |
| |
| RESOLVED. Just use SAMPLES_ARB. |
| |
| (2) How should we deal with sample patterns of more than |
| sizeof(GLbitfield)*8 bits for the sample mask? |
| |
| RESOLVED. The API uses indexed calls to allow indefinite extension of the |
| number of samples exposed. |
| |
| (3) What's the interaction between sample mask, sample coverage, and alpha |
| to coverage? |
| |
| UNRESOLVED. In the hardware there's just one method for doing overall |
| coverage, so we can combine the two API states into the methods as we see |
| fit. The more interesting question is the interaction between the shader |
| sample mask from GPU_program4_1 and the API-level masks, which we should |
| try to keep similar to the API-level interface. |
| |
| (4) Should we expose the CSAA weights in this API? |
| |
| RESOLVED. Not in this extension. For now, only maskable samples can be |
| queried. A future extension can allow this functionality. |
| |
| (5) What should the default value of SAMPLE_MASK be? 0? ~0? |
| |
| RESOLVED. ~0 to match with other state like stencil mask. |
| |
| (6) Should the sample position query work for non-multisample? |
| |
| RESOLVED. The value of SAMPLES for non-multisample is zero, so the sample |
| position query will return an error for all index values in this case. |
| |
| (7) Integer/unsigned integer renderbuffer sampler types? |
| |
| RESOLVED. There are integer/unsigned integer renderbuffer sampler types. |
| |
| (8) Do we need a program option to enable the new behavior? |
| |
| RESOLVED. Yes. |
| |
| (9) What should TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV be if the |
| renderbuffer object it refers to has been deleted? |
| |
| RESOLVED. TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV remains unchanged |
| when the renderbuffer is deleted. |
| |
| (10) Do renderbuffer textures support texture parameters |
| (TexParameter) or queries (GetTexParameter, |
| GetTexLevelParameter, GetTexImage)? |
| |
| RESOLVED: No. None of the existing parameters apply to renderbuffer |
| textures, and this extension doesn't introduce the need for any new ones. |
| Renderbuffer textures have no levels, and the size in texels is implicit |
| (based on the data store). Given that the texels themselves are obtained |
| from a renderbuffer object, it seems more appropriate to retrieve such |
| data with renderbuffer queries. |
| |
| Note that the spec edits above don't add explicit error language for any |
| of these cases. That is because each of the functions enumerate the set |
| of valid <target> parameters. Not editing the spec to allow |
| TEXTURE_RENDERBUFFER_NV in these cases means that target is not legal, and |
| an INVALID_ENUM error should be generated. |
| |
| (11) What is the behavior of TexelFetchMultisample when given an |
| out-of-bounds value? |
| |
| RESOLVED: Undefined. This spec explicitly lists the behavior as undefined |
| when given a sample number greater than SAMPLES-1 and inherits the |
| undefined behavior specified for TexelFetch when the normal |
| two-dimensional coordinate is outside the range of the texture. |
| |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ----------------------------------------- |
| |
| 1 7/22/08 ewerness First revision. |