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:
The RendererVk
class represents an EGLDisplay
. 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
glDrawArrays
and glDrawElements
.
The back-end records commands into command buffers via the the following ContextVk
APIs:
endRenderPassAndGetCommandBuffer
: returns a secondary command buffer outside a RenderPass instance.flushAndBeginRenderPass
: returns a secondary command buffer inside a RenderPass instance.flushAndGetPrimaryCommandBuffer
: returns the primary command buffer. You should rarely need this API.Note: All of these commands may write out (aka flush) prior pending commands into a primary
command buffer. When a RenderPass is open endRenderPassAndGetCommandBuffer
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 VkQueue
.
If you need to record inside a RenderPass, use flushAndBeginRenderPass
. Otherwise, use
endRenderPassAndGetCommandBuffer
. You should rarely need to call flushAndGetPrimaryCommandBuffer
.
It's there for commands like debug labels, barriers and queries that need to be recorded serially on
the primary command buffer.
The back-end usually records Image and Buffer barriers through additional ContextVk
APIs:
onBufferTransferRead/onBufferComputeShaderRead
and onBufferTransferWrite/onBufferComputeShaderWrite
accumulate VkBuffer
barriers.onImageRead
and onImageWrite
accumulate VkImage
barriers.onRenderPassImageWrite
is a special API for write barriers inside a RenderPass instance.After the back-end records commands to the primary buffer we flush (e.g. on swap) or when we call
ContextVk::finishToSerial
.
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->endRenderPassAndGetCommandBuffer(&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 doc
directory:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。