| Name |
| |
| AMD_sample_positions |
| |
| Name Strings |
| |
| GL_AMD_sample_positions |
| |
| Contact |
| |
| Mais Alnasser, AMD (mais.alnasser 'at' amd.com) |
| |
| Contributors |
| |
| Mais Alnasser, AMD |
| Graham Sellers, AMD |
| Nick Haemel, AMD |
| |
| Status |
| |
| Complete, shipping. |
| |
| Version |
| |
| Last Modified Date: 04/06/11 |
| Revision: 7 |
| |
| Number |
| |
| 405 |
| |
| Dependencies |
| |
| OpenGL 1.1 is required. |
| |
| EXT_framebuffer_multisample or OpenGL 3.2 is required. |
| |
| This extension interacts with the ARB_texture_multisample extension. |
| |
| This extension is written against the OpenGL 3.2 (Core) specification. |
| |
| Overview |
| |
| This extension provides a mechanism to explicitly set sample positions for a |
| FBO with multi-sampled attachments. The FBO will use identical sample locations |
| for all pixels in each attachment. This forces TEXTURE_FIXED_SAMPLE_LOCATIONS |
| to TRUE if a multi-sampled texture is specified using TexImage2DMultisample |
| or TexImage3DMultisample. That is, using GetTexLevelParameter to query |
| TEXTURE_FIXED_SAMPLE_LOCATIONS will always return TRUE if the mechanism is |
| explicitly used to set the sample positions. |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetFloatv: |
| |
| SUBSAMPLE_DISTANCE_AMD 0x883F |
| |
| New Procedures and Functions |
| |
| void SetMultisamplefvAMD(enum pname, uint index, const float *val); |
| |
| Modifications to Chapter 2 of the OpenGL 3.2 (Core) Specification (OpenGL |
| Operation) |
| |
| None. |
| |
| Modifications to Chapter 3 of the OpenGL 3.2 Specification (Rasterization) |
| |
| None. |
| |
| Additions to Chapter 4 of the OpenGL 3.2 (Core) Specification |
| (Per-Fragment Operations and the Frame Buffer) |
| |
| Modify Section 4.1.3, Multisample Fragment Operations |
| |
| Modify the discussion of SampleMaski to start with "Next" instead |
| of "Finally". |
| |
| Add after the discussion of SampleMaski: |
| |
| Finally, a single sample location can be modified for all pixels in |
| a multi-sampled framebuffer using the following call: |
| |
| void SetMultisamplefvAMD(enum pname, uint index, clampf *val); |
| |
| <pname> must be SAMPLE_POSITION. <index> corresponds to the |
| sample for which the location should be set. The sample location |
| is set by passing two floating point values in <val[0]> and |
| <val[1]>, each between 0.0 and 1.0, inclusive, corresponding to the <x> |
| and <y> locations in pixel space of that sample, respectively . (0.5, 0.5) |
| thus corresponds to the pixel center. The error INVALID_VALUE is generated |
| if <index> is greater than or equal to the value of SAMPLES. |
| |
| SetMultisamplefvAMD generates an INVALID_OPERATION error if the currently |
| bound framebuffer is incomplete or is the default framebuffer. |
| |
| Using SetMultisamplefvAMD will cause any multisampled texture attached |
| to the currently bound FBO to use identical sample locations for all |
| of its pixels forcing <fixedsamplelocations> to TRUE. That is, using |
| GetTexLevelParameter to query TEXTURE_FIXED_SAMPLE_LOCATIONS will |
| always return TRUE if the new mechanism is used to explicitly set |
| the sample positions. |
| |
| If <val> is NULL, <index> is ignored and all sample positions are returned |
| to their default values. |
| |
| The subpixel range [0,1] is discretized based on the implementation- |
| dependent value of SUBSAMPLE_DISTANCE_AMD. GetFloatv can be used with |
| SUBSAMPLE_DISTANCE_AMD as the pname parameter to query the subpixel |
| precision, which is the same for both the vertical and horizontal |
| directions. Given two sample positions (x0, y0) and (x1, y1), one can make |
| sure they don't fall in the same subpixel if |
| |
| abs(x0-x1) >= ssd and abs(y0-y1) >= ssd, |
| |
| where ssd is the float value returned when querying SUBSAMPLE_DISTANCE_AMD. |
| |
| The quantized sample positions may be queried by calling GetMultisamplefv. |
| |
| Additions to Chapter 5 of the OpenGL 3.2 (Core) Specification (Special Functions) |
| |
| None. |
| |
| Additions to Chapter 6 of the OpenGL 3.2 (Core) Specification (State and |
| State Requests) |
| |
| None. |
| |
| GLX Protocol |
| |
| None. |
| |
| Errors |
| |
| The error INVALID_VALUE is generated by SetMultisamplefvAMD if index |
| is greater than or equal to the value of SAMPLES. |
| |
| The error INVALID_OPERATION is generated by SetMultisamplefvAMD if |
| the currently bound framebuffer is the default framebuffer. |
| |
| The error INVALID_OPERATION is generated by SetMultisamplefvAMD if |
| the currently bound framebuffer is incomplete. |
| |
| New State |
| |
| None. |
| |
| New Implementation Dependent State |
| |
| Add to Table 6.12, Multisampling, p.277: |
| |
| Get Value Type Get Command Value Description Sec. |
| --------- ------- ----------- ------- ------------------------ ------ |
| SUBSAMPLE_DISTANCE_AMD R+ GetFloatv - precision step between 4.1.3 |
| subsamples |
| |
| Interaction with ARB_texture_multisample |
| |
| If ARB_texture_multisample is not supported, remove all references to |
| TEXTURE_FIXED_SAMPLE_LOCATIONS and to <fixedsamplelocations>. Also, should |
| ARB_texture_multisample not be supported, the GetMultisamplefv entry point |
| must be added as described in the specification of ARB_texture_multisample |
| for the sake of completeness. |
| |
| Issues |
| |
| (1) What happens if an app just sets one sample position, |
| index 3 for example? |
| |
| RESOLVED: Any attachment to the bound FBO will have the index 3 |
| position updated. All the rest of the positions will keep their |
| original values. Any other fbos will not be affected by this change. |
| |
| (2) How does an app get back to the default state after setting |
| sample positions? |
| |
| RESOLVED: SetMultisamplefvAMD(SAMPLE_POSITION, 0, NULL) will restore |
| all the sample positions to their default state. |
| |
| (3) Should we also expose the precision? An app can use it in setting |
| sample positions? |
| |
| RESOLVED: SUBSAMPLE_DISTANCE_AMD is added as a new token. It can be used |
| by GetFloatv to query the precision step, which will be the same for |
| both the vertical and horizontal directions. The subpixel range [0,1] |
| is discretized based on the value of SUBSAMPLE_DISTANCE_AMD. Let ssd be the |
| float value returned when SUBSAMPLE_DISTANCE_AMD is queried, then one can |
| infer the subpixilization to be 1/ssd+1. For example, if ssd = 0.06667 |
| then the pixel is subdivided into 1/0.0667+1=16 subpixels in each |
| dimension. |
| |
| One can also avoid using sample positions that would map to the same |
| subpixel. A coordinate c will map to the greatest multiple of ssd that |
| is less or equal to c. For example, given two sample positions, (x0, y0) |
| and (x1, y1), if abs(x1-x0) < ssd and abs(y1-y0) < ssd, then both points |
| will map to the same subpixel, which means the application might want to |
| substitute one of these positions with another that is not redundant. |
| Using numerical values as an example, let a=(0.201, 0.0) and b=(0.25, 0.5) |
| be sample positions and ssd = 0.06667. Both the x-coordinate values 0.201 |
| and 0.25 fall between 0.06667*3=0.2 and 0.06667*4=0.26667 and would |
| therefore map to the same value of 0.2. The y-coordinates also map to the |
| same value of 0 because they both belong in the range [0, 0.06667). This |
| means the two points are redundant. Therefore, the application should |
| choose a different point c=(0.3, 0.45) for example. c would be a good |
| choice because the distance between its x-coordinate and a's x-coordinate |
| is greater than ssd, that is 0.3-0.201 > 0.06667. |
| |
| (4) Aside from evaluating the above equations, how can an application tell |
| what subsample positions the hardware is using? |
| |
| RESOLVED: GetMultisamplefv will return the quantized sample positions, |
| not the original positions sent to SetMultisamplefvAMD. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ----------------------------------------- |
| 7 4/06/11 gsellers Clean up for posting on public registry. |
| 6 6/30/10 gsellers Assign enumerant value for SUBSAMPLE_DISTANCE_AMD. |
| 5 3/18/10 malnasse Generate INVALID_OPERATION error if attempting |
| to set sample positions for an incomplete framebuffer |
| 4 2/23/10 malnasse Generate INVALID_OPERATION error if attempting |
| to set sample positions for the default framebuffer |
| 3 2/05/10 gsellers Minor cleanup. Submission to AMD repository. |
| 2 2/02/10 malnasse - Added a mechanism to restore the sample |
| positions to their default state. |
| - Added the issues section. |
| - Added new token to help query the subsample precision |
| 1 1/27/10 malnasse First revision. |
| |
| |