ANGLE's Vulkan back-end implementation lives in this folder.
Vulkan is an explicit graphics API. It has a lot in common with other explicit APIs such as Microsoft‘s D3D12 and Apple’s Metal. Compared to APIs like OpenGL or D3D11 explicit APIs can offer a number of significant benefits:
RendererVk class represents an
RendererVk owns shared global resources like the VkDevice, VkQueue, the Vulkan format tables and internal Vulkan shaders. The ContextVk class implements the back-end of a front-end OpenGL Context. ContextVk processes state changes and handles action commands like
The back-end records commands into command buffers via the the following
getOutsideRenderPassCommandBuffer: returns a secondary command buffer outside a RenderPass instance.
flushAndBeginRenderPass: returns a secondary command buffer inside a RenderPass instance.
Note: All of these commands may write out (aka flush) prior pending commands into a primary command buffer. When a RenderPass is open
getOutsideRenderPassCommandBuffer will flush the pending RenderPass commands.
flushAndBeginRenderPass will flush out pending commands outside a RenderPass to a primary buffer. On submit ANGLE submits the primary command buffer to a
If you need to record inside a RenderPass, use
flushAndBeginRenderPass. Otherwise, use
The back-end (mostly) records Image and Buffer barriers through additional
onBuffferSelfCopyis a special case for
VkBufferself copies. It behaves the same as write.
VkImagebarriers inside a started RenderPass.
After the back-end records commands to the primary buffer we flush (e.g. on swap) or when we call
See the code for more details.
In this example we'll be recording a buffer copy command:
# Ensure that ANGLE sets proper read and write barriers for the Buffers. ANGLE_TRY(contextVk->onBufferTransferWrite(destBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer)); # Get a pointer to a secondary command buffer for command recording. May "flush" the RP. vk::CommandBuffer *commandBuffer; ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); # Record the copy command into the secondary buffer. We're done! commandBuffer->copyBuffer(srcBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies);
More implementation details can be found in the