| Name |
| |
| ATI_draw_buffers |
| |
| Name Strings |
| |
| GL_ATI_draw_buffers |
| |
| Contributors |
| |
| Benj Lipchak |
| |
| Contact |
| |
| Rob Mace, ATI Research (rob.mace 'at' amd.com) |
| |
| Status |
| |
| Complete. |
| |
| Version |
| |
| Last Modified Date: November 4, 2006 |
| Revision: 9 |
| |
| Number |
| |
| 277 |
| |
| Dependencies |
| |
| The extension is written against the OpenGL 1.3 Specification. |
| |
| OpenGL 1.3 is required. |
| |
| ARB_fragment_program affects the definition of this extension. |
| |
| |
| Overview |
| |
| This extension extends ARB_fragment_program to allow multiple output |
| colors, and provides a mechanism for directing those outputs to |
| multiple color buffers. |
| |
| |
| Issues |
| |
| (1) How many GL_DRAW_BUFFER#_ATI enums should be reserved? |
| |
| RESOLVED: We only need 4 currently, but for future expandability |
| it would be nice to keep the enums in sequence. We'll specify |
| 16 for now, which will be more than enough for a long time. |
| |
| |
| New Procedures and Functions |
| |
| void DrawBuffersATI(sizei n, const enum *bufs); |
| |
| |
| New Tokens |
| |
| Accepted by the <pname> parameters of GetIntegerv, GetFloatv, |
| and GetDoublev: |
| |
| MAX_DRAW_BUFFERS_ATI 0x8824 |
| DRAW_BUFFER0_ATI 0x8825 |
| DRAW_BUFFER1_ATI 0x8826 |
| DRAW_BUFFER2_ATI 0x8827 |
| DRAW_BUFFER3_ATI 0x8828 |
| DRAW_BUFFER4_ATI 0x8829 |
| DRAW_BUFFER5_ATI 0x882A |
| DRAW_BUFFER6_ATI 0x882B |
| DRAW_BUFFER7_ATI 0x882C |
| DRAW_BUFFER8_ATI 0x882D |
| DRAW_BUFFER9_ATI 0x882E |
| DRAW_BUFFER10_ATI 0x882F |
| DRAW_BUFFER11_ATI 0x8830 |
| DRAW_BUFFER12_ATI 0x8831 |
| DRAW_BUFFER13_ATI 0x8832 |
| DRAW_BUFFER14_ATI 0x8833 |
| DRAW_BUFFER15_ATI 0x8834 |
| |
| |
| Additions to Chapter 2 of the OpenGL 1.3 Specification (OpenGL |
| Operation) |
| |
| None |
| |
| |
| Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization) |
| |
| Modify Section 3.11.2, Fragment Program Grammar and Semantic |
| Restrictions |
| |
| (replace <resultBinding> grammar rule with these rules) |
| |
| <resultBinding> ::= "result" "." "color" <optOutputColorNum> |
| | "result" "." "depth" |
| |
| <optOutputColorNum> ::= "" |
| | "[" <outputColorNum> "]" |
| |
| <outputColorNum> ::= <integer> from 0 to MAX_DRAW_BUFFERS_ATI-1 |
| |
| |
| Modify Section 3.11.3.4, Fragment Program Results |
| |
| (modify Table X.3) |
| |
| Binding Components Description |
| ----------------------------- ---------- ---------------------------- |
| result.color[n] (r,g,b,a) color n |
| result.depth (*,*,*,d) depth coordinate |
| |
| Table X.3: Fragment Result Variable Bindings. Components labeled |
| "*" are unused. "[n]" is optional -- color <n> is used if |
| specified; color 0 is used otherwise. |
| |
| (modify third paragraph) If a result variable binding matches |
| "result.color[n]", updates to the "x", "y", "z", and "w" components |
| of the result variable modify the "r", "g", "b", and "a" components, |
| respectively, of the fragment's corresponding output color. If |
| "result.color[n]" is not both bound by the fragment program and |
| written by some instruction of the program, the output color <n> of |
| the fragment program is undefined. |
| |
| |
| Add a new Section 3.11.4.5.3 |
| |
| 3.11.4.5.3 Draw Buffers Program Option |
| |
| If a fragment program specifies the "ATI_draw_buffers" option, |
| it will generate multiple output colors, and the result binding |
| "result.color[n]" is allowed, as described in section 3.11.3.4, |
| and with modified grammar rules as set forth in section 3.11.2. |
| If this option is not specified, a fragment program that attempts |
| to bind "result.color[n]" will fail to load, and only "result.color" |
| will be allowed. |
| |
| |
| Additions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| Modify Section 4.2.1, Selecting a Buffer for Writing (p. 168) |
| |
| (modify the title and first paragraph, p. 168) |
| |
| 4.2.1 Selecting Color Buffers for Writing |
| |
| The first such operation is controlling the color buffers into |
| which each of the output colors are written. This is accomplished |
| with either DrawBuffer or DrawBuffersATI. DrawBuffer defines the |
| set of color buffers to which output color 0 is written. |
| |
| (insert paragraph between first and second paragraph, p. 168) |
| |
| DrawBuffer will set the draw buffer for output colors other than 0 |
| to NONE. DrawBuffersATI defines the draw buffers to which all |
| output colors are written. |
| |
| void DrawBuffersATI(sizei n, const enum *bufs); |
| |
| <n> specifies the number of buffers in <bufs>. <bufs> is a pointer |
| to an array of symbolic constants specifying the buffer to which |
| each output color is written. The constants may be NONE, |
| FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, and AUX0 through |
| AUXn, where n + 1 is the number of available auxiliary buffers. The |
| draw buffers being defined correspond in order to the respective |
| output colors. The draw buffer for output colors beyond <n> is set |
| to NONE. |
| |
| If the "ATI_draw_buffers" fragment program option, is not being used |
| then DrawBuffersATI specifies a set of draw buffers into which output |
| color 0 is written. |
| |
| The maximum number of draw buffers is implementation dependent and |
| must be at least 1. The number of draw buffers supported can |
| be queried with the state MAX_DRAW_BUFFERS_ATI. |
| |
| The constants FRONT, BACK, LEFT, RIGHT, and FRONT_AND_BACK that |
| refer to multiple buffers are not valid for use in DrawBuffersATI |
| and will result in the error INVALID_OPERATION. |
| |
| If DrawBuffersATI is supplied with a constant (other than NONE) |
| that does not indicate any of the color buffers allocated to |
| the GL context, the error INVALID_OPERATION will be generated. If |
| <n> is greater than MAX_DRAW_BUFFERS_ATI, the error |
| INVALID_OPERATION will be generated. |
| |
| (replace last paragraph, p. 169) |
| |
| The state required to handle color |
| buffer selection is an integer for each supported output color. In |
| the initial state, draw buffer for output color 0 is FRONT if there |
| are no back buffers; otherwise it is BACK. The initial state of |
| draw buffers for output colors other then 0 is NONE. |
| |
| |
| Additions to Chapter 5 of the OpenGL 1.3 Specification (Special |
| Functions) |
| |
| None |
| |
| |
| Additions to Chapter 6 of the OpenGL 1.3 Specification (State and |
| State Requests) |
| |
| None |
| |
| |
| Dependencies on ARB_fragment_program |
| |
| If ARB_fragment_program is not supported then all changes to |
| section 3.11 are removed. |
| |
| |
| Interactions with possible future extensions |
| |
| If there is some other future extension that defines multiple |
| color outputs then this extension and glDrawBuffersATI could be |
| used to define the destinations for those outputs. This extension |
| need not be used only with ARB_fragment_program. |
| |
| |
| Errors |
| |
| The error INVALID_OPERATION is generated by DrawBuffersATI if a |
| color buffer not currently allocated to the GL context is specified. |
| |
| The error INVALID_OPERATION is generated by DrawBuffersATI if <n> |
| is greater than the state MAX_DRAW_BUFFERS_ATI. |
| |
| The error INVALID_OPERATION is generated by DrawBuffersATI if value in |
| <bufs> does not correspond to one of the allowed buffers. |
| |
| |
| New State |
| |
| (table 6.19, p227) add the following entry: |
| |
| Get Value Type Get Command Initial Value Description Section Attribute |
| ------------------------------- ------ ------------- ------------- -------------------- ------------ ------------ |
| DRAW_BUFFERi_ATI Z10* GetIntegerv see 4.2.1 Draw buffer selected 4.2.1 color-buffer |
| for output color i |
| |
| |
| New Implementation Dependent State |
| |
| Get Value Type Get Command Minimum Value Description Sec. Attribute |
| --------- ---- ----------- ------------- ------------------- ----- --------- |
| MAX_DRAW_BUFFERS_ATI Z+ GetIntegerv 1 Maximum number of 4.2.1 - |
| active draw buffers |
| |
| |
| Revision History |
| |
| Date: 11/4/2006 |
| Revision: 9 |
| - Updated contact info after ATI/AMD merger. |
| |
| Date: 12/30/2002 |
| Revision: 8 |
| - Clarified that DrawBuffersATI will set the set of draw buffers to |
| write color output 0 to when the "ATI_draw_buffer" fragments |
| program option is not in use. |
| |
| Date: 9/27/2002 |
| Revision: 7 |
| - Fixed confusion between meaning of color buffer and draw buffer |
| in last revision. |
| - Fixed mistake in when an error is generated based on the <n> |
| argument of DrawBuffersATI. |
| |
| Date: 9/26/2002 |
| Revision: 6 |
| - Cleaned up and put in sync with latest ARB_fragment_program |
| revision (#22). Some meaningless changes made just in the name |
| of consistency. |
| |
| Date: 9/11/2002 |
| Revision: 5 |
| - Added section 3.11.4.5.3. |
| - Added enum numbers to New Tokens. |
| |
| Date: 9/9/2002 |
| Revision: 4 |
| - Changed error from MAX_OUTPUT_COLORS to MAX_DRAW_BUFFERS_ATI. |
| - Changed 3.10 section numbers to 3.11 to match change to |
| ARB_fragment_program spec. |
| - Changed ARB_fragment_program from required to affects, and |
| added section on interactions with it and future extensions |
| that define multiple color outputs. |
| |
| Date: 9/6/2002 |
| Revision: 3 |
| - Changed error to INVALID OPERATION. |
| - Cleaned up typos. |
| |
| Date: 8/19/2002 |
| Revision: 2 |
| - Added a paragraph that specifically points out that the |
| constants that refer to multiple buffers are not allowed with |
| DrawBuffersATI. |
| - Changed bufs to <bufs> in a couple of places. |
| |
| Date: 8/16/2002 |
| Revision: 1 |
| - First draft for circulation. |