blob: f254bca4ab3b09328e0ce2197a897142c2a5b189 [file] [log] [blame]
Name
AMD_draw_buffers_blend
Name Strings
GL_AMD_draw_buffers_blend
Contributors
Mark Young
Graham Sellers
Timothy Lamb
Pierre Boudier
Nick Haemel
Contact
Mark Young, AMD (mark.young 'at' amd.com)
Status
In progress
Version
Last Modified Date: July 10, 2009
Author Revision: 3
Number
366
Dependencies
The extension is written against the OpenGL 2.0 Specification.
OpenGL 2.0 is required.
EXT_draw_buffers2 is required.
Overview
This extension builds upon the ARB_draw_buffers and EXT_draw_buffers2
extensions. In ARB_draw_buffers (part of OpenGL 2.0), separate values
could be written to each color buffer. This was further enhanced by
EXT_draw_buffers2 by adding in the ability to enable blending and to set
color write masks independently per color output.
This extension provides the ability to set individual blend equations and
blend functions for each color output.
New Procedures and Functions
void BlendFuncIndexedAMD(uint buf, enum src, enum dst);
void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB, enum dstRGB,
enum srcAlpha, enum dstAlpha);
void BlendEquationIndexedAMD(uint buf, enum mode);
void BlendEquationSeparateIndexedAMD(uint buf, enum modeRGB,
enum modeAlpha);
New Tokens
None.
Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)
None.
Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
None.
Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)
Modify the first two paragraphs of section 4.1.8 (Blending - Blending
Equation), p206, to read as follows:
"Blending is controlled by the blend equation. This equation can be
simultaneously set to the same value for all draw buffers using the
commands:
void BlendEquation(enum mode);
void BlendEquationSeparate(enum modeRGB, enum modeAlpha);
or for an individual draw buffer using the indexed versions of the
same commands:
void BlendEquationIndexedAMD(uint buf, enum mode);
void BlendEquationSeparateIndexedAMD(uint buf
enum modeRGB,
enum modeAlpha);
BlendEquationSeparate and BlendEquationSeparateIndexedAMD separate
out the blend equations into an RGB argument and an Alpha argument.
<modeRGB> determine the RGB blend function while <modeAlpha>
determines the alpha equation. BlendEquation and
BlendEquationIndexedAMD control both the RGB and Alpha blend
equations with a single argument <mode>. <modeRGB> and <modeAlpha>
must each be one of FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT,
MIN_MAX, or LOGIC_OP. BlendEquationIndexedAMD and
BlendEquationSeparateIndexedAMD argument <buf> sets the blend
equations for an individual draw buffer. The blend equations for
DRAW_BUFFERi are modified by passing i as the parameter <buf>."
Modify the first two paragraphs of section 4.1.8 (Blending - Blending
Functions), p207, to read as follows:
"The weighting factors used by the blend equation are determined by
the blend functions. Blend functions are simultaneously specified for
all draw buffers using the commands:
void BlendFunc(enum src, enum dst);
void BlendFuncSeparate(enum srcRGB, enum dstRGB,
enum srcAlpha, enum dstAlpha);
or for an individual draw buffer using the indexed versions of the
same commands:
void BlendFuncIndexedAMD(uint buf, enum src, enum dst);
void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB,
enum dstRGB, enum srcAlpha,
enum dstAlpha);
BlendFuncSeparate and BlendFuncSeparateIndexedAMD arguments <srcRGB>
and <dstRGB> determine the source and destination RGB blend functions,
respectively, while <srcAlpha> and <dstAlpha> determine the source and
destination alpha blend functions. BlendFunc and BlendFuncIndexedAMD
arguments <src> determines both RGB and alpha source functions, while
<dst> determines both RGB and alpha destination functions.
BlendFuncSeparateIndexedAMD and BlendFuncIndexedAMD argument <buf>
sets the blend functions for an indivual draw buffer. The blend
functions for DRAW_BUFFERi are modified by passing i as the parameter
<buf>."
Modify the first paragraph of section 4.1.8 (Blending - Blending
State), p209, to read as follows:
"For each of n draw buffers, the state required for blending is two
integers for the RGB and alpha blend equations, four integers
indicating the source and destination RGB and alpha blending functions,
four floating-point values to store the RGBA constant blend color, and
a bit indicating whether blending is enabled or disabled. For all draw
buffers, the initial blend equations for RGB and alpha are both
FUNC_ADD. The initial blending functions for all draw buffers are ONE
for the source RGB and alpha functions, and ZERO for the destination
RGB and alpha functions. For all draw buffers initial constant blend
color is (R, G, B, A) = (0, 0, 0, 0). Initially, blending is disabled
for all draw buffers."
Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)
None.
Additions to Chapter 6 of the OpenGL 2.0 Specification (State and
State Requests)
None.
Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)
None.
Additions to the AGL/GLX/WGL Specifications
None.
Errors
The error INVALID_ENUM is generated if the <buf> parameter of
BlendFuncIndexedAMD, BlendFuncSeparateIndexedAMD, BlendEquationIndexedAMD,
or BlendEquatioSeparateIndexedAMD is outside the range
[0, MAX_DRAW_BUFFERS-1].
The error INVALID_ENUM is generated by BlendFuncIndexedAMD
if either <src>, or <dst> is not an accepted value.
The error INVALID_ENUM is generated by BlendFuncSeparateIndexedAMD
if either <srcRGB>, <dstRGB>, <srcAlpha>, or <dstAlpha> is not
an accepted value.
The error INVALID_ENUM is generated if the <mode> parameter of
BlendEquationIndexedAMD is not one of FUNC_ADD, FUNC_SUBTRACT,
FUNC_REVERSE_SUBTRACT, MAX, or MIN.
The error INVALID_ENUM is generated if either the <modeRGB> or <modeAlpha>
parameter of BlendEquationSeparateIndexedAMD is not one of
FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MAX, or MIN.
The error INVALID_OPERATION is generated if any of these new entry-points
are executed between the execution of glBegin and the corresponding
execution of glEnd.
New State
Modify (table 6.20, p281), modifying the entries for BLEND_SRC_RGB,
BLEND_SRC_ALPHA, BLEND_DST_RGB, BLEND_DST_ALPHA, BLEND_EQUATION_RGB,
and BLEND_EQUATION_ALPHA and adding new indexed versions as well.
Get Target Type Get Command Initial Value Description Section Attribute
---------- ---- --------------------- -------------- ----------------------------------------------- ------- -------------------
BLEND_SRC_RGB Z15 GetIntegerv ONE Blending source RGB function for draw buffer 0 4.1.8 color-buffer
(v1.3:BLEND_SRC)
BLEND_SRC_RGB Z15 GetIntegerIndexedvEXT ONE Blending source RGB function for draw buffer i 4.1.8 color-buffer
(v1.3:BLEND_SRC) where i is specified as <buf>
BLEND_SRC_ALPHA Z15 GetIntegerv ONE Blending source A function for draw buffer 0 4.1.8 color-buffer
BLEND_SRC_ALPHA Z15 GetIntegerIndexedvEXT ONE Blending source A function for draw buffer i 4.1.8 color-buffer
where i is specified as <buf>
BLEND_DST_RGB Z14 GetIntegerv ZERO Blending dest. RGB function for draw buffer 0 4.1.8 color-buffer
(v1.3:BLEND DST)
BLEND_DST_RGB Z14 GetIntegerIndexedvEXT ZERO Blending dest. RGB function for draw buffer i 4.1.8 color-buffer
(v1.3:BLEND DST) where i is specified as <buf>
BLEND_DST_ALPHA Z14 GetIntegerv ZERO Blending dest. A function for draw buffer 0 4.1.8 color-buffer
BLEND_DST_ALPHA Z14 GetIntegerIndexedvEXT ZERO Blending dest. A function for draw buffer i 4.1.8 color-buffer
where i is specified as <buf>
BLEND_EQUATION_RGB Z5 GetIntegerv FUNC_ADD RGB blending equation for draw buffer 0 4.1.8 color-buffer
(v1.5: BLEND EQUATION)
BLEND_EQUATION_RGB Z5 GetIntegerIndexedvEXT FUNC_ADD RGB blending equation for draw buffer i 4.1.8 color-buffer
(v1.5: BLEND EQUATION) where i is specified as <buf>
BLEND_EQUATION_ALPHA Z5 GetIntegerv FUNC_ADD Alpha blending equation for draw buffer 0 4.1.8 color-buffer
BLEND_EQUATION_ALPHA Z5 GetIntegerIndexedvEXT FUNC_ADD Alpha blending equation for draw buffer i 4.1.8 color-buffer
where i is specified as <buf>
Issues
1. What should we call this?
PROPOSED: Suggestions currently are
AMD_draw_buffers_blend
AMD_drawbuffers_blend
AMD_mrt_blend
2. Should this be an AMDX extension or just AMD?
PROPOSED: We propose AMD since the functionality currently exists in
DX 10.1 and is used by developers in that API.
3. What effect does using the non-indexed versions of the blend function
or equation entry-points have upon the new indexed per draw buffer
versions?
RESOLVED: Similar to the way EXT_draw_buffers2 handles the indexed
and non-indexed ColorMask interaction in issue 3. The non-indexed
versions of the functions will set all buffers to the passed in
parameters.
For example, BlendFunc will set all color buffer blend functions to
the values passed in.
4. Should the new functions be ---Indexed (as in EXT_draw_buffers2) or
---i (as in OpenGL 3.0 core)?
RESOLVED: For consistency with EXT_draw_buffers2, leave them as
---Indexed. If this functionality is promoted to core in a later
version of OpenGL, they can be changed to ---i.
Revision History
#3, July 10, 2009: Jon Leech
Assign extension number, minor formatting cleanup for registry.
#2, March 26, 2009: myoung
Tightened up language. Resolved some issues.
#1, March 25, 2009: myoung
Internal spec development.