Name ARB_transform_feedback_overflow_query Name Strings GL_ARB_transform_feedback_overflow_query Contact Brian Paul, VMware Inc. (brianp 'at' vmware.com) Contributors Brian Paul, VMware Daniel Rakos, AMD Daniel Koch, NVIDIA Notice Copyright (c) 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 June 26, 2014. Ratified by the Khronos Board of Promoters on August 7, 2014. Version Date: May 29, 2017 Revision: 5 Number ARB Extension #173 Dependencies OpenGL 3.0 is required. The extension is written against the OpenGL 4.4 Specification, Core Profile, March 19, 2014. OpenGL 4.0 and ARB_transform_feedback3 affect the definition of this extension. Overview This extension adds new query types which can be used to detect overflow of transform feedback buffers. The new query types are also accepted by conditional rendering commands. IP Status No known IP claims. New Procedures and Functions None. New Tokens Accepted by the parameter of BeginQuery, EndQuery, BeginQueryIndexed, EndQueryIndexed, GetQueryiv, and GetQueryIndexediv: TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED Additions to Chapter 4 of the OpenGL 4.4 (Core Profile) Specification (Event Model) Modify Section 4.2, Query Objects and Asynchronous Queries (add new bullet after second bullet on p. 39) * Transform feedback overflow queries return information on whether or not transform feedback overflow happened for one or more streams (see section 13.x). (modify errors section for BeginQueryIndexed on p. 40) An INVALID_ENUM error is generated if is not SAMPLES_PASSED, ... for a primitives written query; or TRANSFORM_FEEDBACK_OVERFLOW_ARB or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB for a transform feedback overflow query. An INVALID_VALUE error is generated if is SAMPLES_PASSED ... TIME_ELAPSED, or TRANSFORM_FEEDBACK_OVERFLOW_ARB, and is not zero. An INVALID_VALUE error is generated if is PRIMITIVES_GENERATED, TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB, and is not in the range zero to the value of MAX_VERTEX_STREAMS minus one. (modify errors section for EndQueryIndexed on p. 41-42) An INVALID_ENUM error is generated if is not SAMPLES_PASSED, ... TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, TRANSFORM_FEEDBACK_OVERFLOW_ARB, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB. An INVALID_VALUE error is generated if is SAMPLES_PASSED, ... TIME_ELAPSED, or TRANSFORM_FEEDBACK_OVERFLOW_ARB, and is not zero. An INVALID_VALUE error is generated if is PRIMITIVES_GENERATED, TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB, and is not in the range zero to the value of MAX_VERTEX_STREAMS minus one. Modify Section 4.2.1, Query Object Queries (add new paragraph after fourth paragraph on p. 43) For transform feedback overflow queries (TRANSFORM_FEEDBACK_OVERFLOW_ARB and TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB) if the number of bits is non-zero, the minimum number of bits is 1. (modify errors section for GetQueryIndexediv on p 43) An INVALID_ENUM error is generated if is not ..., TRANSFORM_FEEDBACK_OVERFLOW_ARB, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB. An INVALID_VALUE error is generated if is ..., or TRANSFORM_FEEDBACK_OVERFLOW_ARB, and is not zero. An INVALID_VALUE error is generated if is ..., or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB, and is not in the range zero to the value of MAX_VERTEX_STREAMS minus one. Additions to Chapter 10 of the OpenGL 4.4 (Core Profile) Specification (Vertex Specification and Drawing Commands) Modify Section 10.10, Conditional Rendering (modify first paragraph on p. 338) Conditional rendering can be used to discard rendering commands based on the result of a query. Conditional rendering is started and stopped using the commands ... specifies the name of a query whose results are used to determine if the rendering commands are discarded. If the result (SAMPLES_PASSED) of the query is zero, or if the result (ANY_SAMPLES_PASSED, ANY_SAMPLES_PASSED_CONSERVATIVE, TRANSFORM_FEEDBACK_OVERFLOW_ARB, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB) is false, ... (modify second sentence of second paragraph on p. 338) If the result (SAMPLES_PASSED) of the query is non-zero, or if the result (ANY_SAMPLES_PASSED, ANY_SAMPLES_PASSED_CONSERVATIVE, TRANSFORM_FEEDBACK_OVERFLOW_ARB, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB) is true, such commands are not discarded. (modify errors section for BeginConditionalRender on p. 339) An INVALID_OPERATION error is generated if is the named of a query object with a target other than ..., TRANSFORM_FEEDBACK_OVERFLOW_ARB, or TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB, or if is the name of a query currently in progress. Additions to Chapter 13 of the OpenGL 4.4 (Core Profile) Specification (Fixed-Function Vertex Post-Processing) Add new Section after 13.3, Primitive Queries 13.x Transform Feedback Overflow Queries Transform feedback overflow queries use query objects to track whether or not all stream vertices were written to buffer objects in transform feedback mode. When BeginQueryIndexed is called with a of TRANSFORM_FEEDBACK_OVERFLOW_ARB, the transform feedback overflow state maintained by the GL is set to false. If transform feedback is active and a primitive to be recorded on any stream does not fit in one of the buffer objects used for capture, the overflow state is set to true. When BeginQueryIndexed is called with a of TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB, the transform feedback stream overflow state maintained by the GL for vertex stream is set to false. There is a separate overflow state for each vertex stream. If transform feedback is active and a primitive to be recorded on stream does not fit in one of the buffer objects used for capture, the overflow state for vertex stream is set to true. Additions to the AGL/EGL/GLX/WGL Specifications None. New State Modify Table 23.74, Miscellaneous (update the state table to cover the new query types on p. 599) Get Value Type Get Command Initial Value Description Sec. ------------- ---- ----------- ------------- ------------------------- ----- CURRENT_QUERY 9xZ+ GetQueryiv 0 Active query object names 4.2.1 New Implementation Dependent State Modify Table 23.69, Implementation Dependent Values (update the state table to cover the new query types on p. 594) Get Value Type Get Command Minimum Value Description Sec. ------------------ ---- ----------- -------------- ------------------ ----- QUERY_COUNTER_BITS 9xZ+ GetQueryiv see sec. 4.2.1 Asynchronous query 4.1.1 counter bits Dependencies on OpenGL 4.0 and ARB_transform_feedback3 If OpenGL 4.0 and ARB_transform_feedback3 are not support then remove all references to TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB. Issues (1) Why is this extension necessary? RESOLVED: An application can query the number of vertices written to a transform feedback buffer and compare that to the size of the buffer (or number of vertices drawn) to try to detect overflow but that is ineffective if subsequent rendering is to be predicated on that condition. Basically, the whole point is to have a queries which can be used by BeginConditionalRender. Note that this feature is present in another, competing graphics API. This extension will allow one to better implement that API's features on top of OpenGL. (2) For conditional rendering do we want to discard or not discard drawing if the query indicates transform feedback buffer overflow? RESOLVED: Some apps probably want one way while others want the other. This can be solved by the GL_ARB_conditional_render_inverted extension which allows one to specify predication either on the normal or inverted query result. (3) Is the overflow condition determined per transform feedback buffer or per vertex stream? DISCUSSION: There may be multiple buffers used to capture primitives of the same vertex stream and while the buffers themselves are the ones that overflow, the overflow condition itself is determined per vertex stream, as no data is written to any of the buffers used to capture primitives of a particular vertex stream if not all of them are able to capture the whole primitive. RESOLVED: Overflow is determined per vertex stream. (4) What do queries with target TRANSFORM_FEEDBACK_OVERFLOW_ARB track? RESOLVED: Tracks overflow condition for all vertex streams. If OpenGL 4.0 and ARB_transform_feedback3 are not supported this trivially simplifies to tracking overflow condition for the first and only vertex stream. Revision History Revision 5, 2017/05/29 (Daniel Koch) - fix typo Revision 4, 2014/06/17 (Jon Leech) - Add missing error condition for BeginQueryIndexed / EndQueryIndexed and TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB (Bug 12376). Revision 3, 2014/04/25 (Daniel Rakos) - Renamed to ARB_transform_feedback_overflow_query. - Replaced EXT suffixes with ARB ones. Revision 2, 2014/04/16 (Daniel Rakos) - Renamed extension to EXT_transform_feedback_overflow_query. - Renamed new query targets to TRANSFORM_FEEDBACK_OVERFLOW_EXT and TRANSFORM_FEEDBACK_STREAM_OVERFLOW_EXT. - Added issues (3) and (4). - Moved transform feedback overflow queries to have their own section instead of introducing them as part of primitive queries. - Added state table changes. - Clarified language and error conditions. Revision 1, 2014/01/27 (Brian Paul) - Initial revision.