| // Copyright 2018-2021 The Khronos Group Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_EXT_transform_feedback.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2018-10-09 |
| *Contributors*:: |
| - Baldur Karlsson, Valve |
| - Boris Zanin, Mobica |
| - Daniel Rakos, AMD |
| - Donald Scorgie, Imagination |
| - Henri Verbeet, CodeWeavers |
| - Jan-Harald Fredriksen, Arm |
| - Jason Ekstrand, Intel |
| - Jeff Bolz, NVIDIA |
| - Jesse Barker, Unity |
| - Jesse Hall, Google |
| - Pierre-Loup Griffais, Valve |
| - Philip Rebohle, DXVK |
| - Ruihao Zhang, Qualcomm |
| - Samuel Pitoiset, Valve |
| - Slawomir Grajewski, Intel |
| - Stu Smith, Imagination Technologies |
| |
| === Description |
| |
| This extension adds transform feedback to the Vulkan API by exposing the |
| SPIR-V code:TransformFeedback and code:GeometryStreams capabilities to |
| capture vertex, tessellation or geometry shader outputs to one or more |
| buffers. |
| It adds API functionality to bind transform feedback buffers to capture the |
| primitives emitted by the graphics pipeline from SPIR-V outputs decorated |
| for transform feedback. |
| The transform feedback capture can be paused and resumed by way of storing |
| and retrieving a byte counter. |
| The captured data can be drawn again where the vertex count is derived from |
| the byte counter without CPU intervention. |
| If the implementation is capable, a vertex stream other than zero can be |
| rasterized. |
| |
| All these features are designed to match the full capabilities of OpenGL |
| core transform feedback functionality and beyond. |
| Many of the features are optional to allow base OpenGL ES GPUs to also |
| implement this extension. |
| |
| The primary purpose of the functionality exposed by this extension is to |
| support translation layers from other 3D APIs. |
| This functionality is not considered forward looking, and is not expected to |
| be promoted to a KHR extension or to core Vulkan. |
| Unless this is needed for translation, it is recommended that developers use |
| alternative techniques of using the GPU to process and capture vertex data. |
| |
| include::{generated}/interfaces/VK_EXT_transform_feedback.txt[] |
| |
| === Issues |
| |
| 1) Should we include pause/resume functionality? |
| |
| *RESOLVED*: Yes, this is needed to ease layering other APIs which have this |
| functionality. |
| To pause use fname:vkCmdEndTransformFeedbackEXT and provide valid buffer |
| handles in the pname:pCounterBuffers array and offsets in the |
| pname:pCounterBufferOffsets array for the implementation to save the resume |
| points. |
| Then to resume use fname:vkCmdBeginTransformFeedbackEXT with the previous |
| pname:pCounterBuffers and pname:pCounterBufferOffsets values. |
| Between the pause and resume there needs to be a memory barrier for the |
| counter buffers with a source access of |
| ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT at pipeline stage |
| ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT to a destination access |
| of ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT at pipeline stage |
| ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT. |
| |
| 2) How does this interact with multiview? |
| |
| *RESOLVED*: Transform feedback cannot be made active in a render pass with |
| multiview enabled. |
| |
| 3) How should queries be done? |
| |
| *RESOLVED*: There is a new query type |
| ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT. |
| A query pool created with this type will capture 2 integers - |
| numPrimitivesWritten and numPrimitivesNeeded - for the specified vertex |
| stream output from the last |
| <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader |
| stage>>. |
| The vertex stream output queried is zero by default, but can be specified |
| with the new fname:vkCmdBeginQueryIndexedEXT and |
| fname:vkCmdEndQueryIndexedEXT commands. |
| |
| === Version History |
| |
| * Revision 1, 2018-10-09 (Piers Daniell) |
| - Internal revisions |