• Home
Name Date Size #Lines LOC

..--

android/03-May-2024-958624

display/03-May-2024-222132

doc/03-May-2024-731559

fuchsia/03-May-2024-205120

ggp/03-May-2024-198119

headless/03-May-2024-201112

mac/03-May-2024-553412

null/03-May-2024-17599

shaders/03-May-2024-32,61630,614

win32/03-May-2024-315216

xcb/03-May-2024-290191

BUILD.gnD03-May-20246.9 KiB288264

BufferVk.cppD03-May-202436.1 KiB945681

BufferVk.hD03-May-20249.2 KiB228173

CLCommandQueueVk.cppD03-May-2024510 208

CLCommandQueueVk.hD03-May-2024745 2914

CLContextVk.cppD03-May-2024451 186

CLContextVk.hD03-May-2024677 2814

CLDeviceVk.cppD03-May-20241.4 KiB5939

CLDeviceVk.hD03-May-20241.3 KiB4124

CLEventVk.cppD03-May-2024429 186

CLEventVk.hD03-May-2024651 2814

CLKernelVk.cppD03-May-2024440 186

CLKernelVk.hD03-May-2024664 2814

CLMemoryVk.cppD03-May-2024440 186

CLMemoryVk.hD03-May-2024664 2814

CLPlatformVk.cppD03-May-20243.1 KiB10882

CLPlatformVk.hD03-May-20241.5 KiB5332

CLProgramVk.cppD03-May-2024451 186

CLProgramVk.hD03-May-2024677 2814

CLSamplerVk.cppD03-May-2024451 186

CLSamplerVk.hD03-May-2024677 2814

CommandGraph.cppD03-May-202450.7 KiB1,3791,097

CommandGraph.hD03-May-202431 KiB814507

CommandProcessor.cppD03-May-202446.6 KiB1,3651,093

CommandProcessor.hD03-May-202421.7 KiB569407

CompilerVk.cppD03-May-2024537 2711

CompilerVk.hD03-May-2024735 3114

ContextVk.cppD03-May-2024253.7 KiB6,3464,709

ContextVk.hD03-May-202457.4 KiB1,226843

DebugAnnotatorVk.cppD03-May-20245.2 KiB145125

DebugAnnotatorVk.hD03-May-20241.3 KiB4325

DeviceVk.cppD03-May-2024843 4526

DeviceVk.hD03-May-2024889 3519

DisplayVk.cppD03-May-202410.2 KiB325255

DisplayVk.hD03-May-20246.6 KiB168107

DisplayVk_api.hD03-May-20241.9 KiB5937

FenceNVVk.cppD03-May-20241.5 KiB5938

FenceNVVk.hD03-May-2024960 3520

FramebufferVk.cppD03-May-2024122.4 KiB2,8782,141

FramebufferVk.hD03-May-202412.7 KiB274203

GlslangWrapperVk.cppD03-May-20242.9 KiB7251

GlslangWrapperVk.hD03-May-20241.8 KiB4830

ImageVk.cppD03-May-20245.6 KiB165116

ImageVk.hD03-May-20241.6 KiB6237

MemoryObjectVk.cppD03-May-20249.3 KiB264198

MemoryObjectVk.hD03-May-20242.2 KiB6643

OWNERSD03-May-202461 43

OverlayVk.cppD03-May-202411.9 KiB290207

OverlayVk.hD03-May-20241.8 KiB6236

PersistentCommandPool.cppD03-May-20243.6 KiB11878

PersistentCommandPool.hD03-May-20241.2 KiB5328

ProgramExecutableVk.cppD03-May-202482.4 KiB1,9751,566

ProgramExecutableVk.hD03-May-202414.1 KiB329246

ProgramPipelineVk.cppD03-May-202411.2 KiB273209

ProgramPipelineVk.hD03-May-20242.3 KiB7045

ProgramVk.cppD03-May-202430.1 KiB830651

ProgramVk.hD03-May-202410 KiB230187

QueryVk.cppD03-May-202422.5 KiB675484

QueryVk.hD03-May-20243.3 KiB8751

README.mdD03-May-20244.3 KiB8864

RenderTargetVk.cppD03-May-202414.4 KiB390301

RenderTargetVk.hD03-May-20249.4 KiB219111

RenderbufferVk.cppD03-May-202414.8 KiB367283

RenderbufferVk.hD03-May-20245.8 KiB13289

RendererVk.cppD03-May-2024135.4 KiB3,4362,587

RendererVk.hD03-May-202421.7 KiB571420

ResourceVk.cppD03-May-20243.1 KiB142101

ResourceVk.hD03-May-20245.7 KiB210142

SamplerVk.cppD03-May-20241.1 KiB4929

SamplerVk.hD03-May-20241 KiB4224

SecondaryCommandBuffer.cppD03-May-202429.8 KiB634609

SecondaryCommandBuffer.hD03-May-202455.9 KiB1,4791,240

SemaphoreVk.cppD03-May-202410.7 KiB280198

SemaphoreVk.hD03-May-20241.6 KiB5030

ShaderVk.cppD03-May-20243.9 KiB12381

ShaderVk.hD03-May-2024912 3417

SurfaceVk.cppD03-May-202477.6 KiB1,9951,432

SurfaceVk.hD03-May-202415.3 KiB357242

SyncVk.cppD03-May-202419.2 KiB609444

SyncVk.hD03-May-20244.6 KiB14199

TextureVk.cppD03-May-2024133.2 KiB3,1082,252

TextureVk.hD03-May-202428 KiB572407

TransformFeedbackVk.cppD03-May-202414.2 KiB366283

TransformFeedbackVk.hD03-May-20245 KiB13895

UtilsVk.cppD03-May-2024147 KiB3,5172,559

UtilsVk.hD03-May-202423.5 KiB583442

VertexArrayVk.cppD03-May-202443.6 KiB948746

VertexArrayVk.hD03-May-20247.2 KiB165124

cl_types.hD03-May-2024518 2310

gen_vk_format_table.pyD03-May-20249.1 KiB289215

gen_vk_internal_shaders.pyD03-May-202429.3 KiB815562

gen_vk_mandatory_format_support_table.pyD03-May-20245.2 KiB147109

vk_cache_utils.cppD03-May-2024165.1 KiB3,9403,025

vk_cache_utils.hD03-May-202467.4 KiB1,7561,235

vk_caps_utils.cppD03-May-202461.1 KiB1,266787

vk_caps_utils.hD03-May-20242.5 KiB8251

vk_format_map.jsonD03-May-202419 KiB505502

vk_format_table_autogen.cppD03-May-2024136.7 KiB2,8272,519

vk_format_utils.cppD03-May-202417.8 KiB452342

vk_format_utils.hD03-May-20247.9 KiB209129

vk_helpers.cppD03-May-2024319.4 KiB8,1106,380

vk_helpers.hD03-May-2024113.2 KiB2,6961,926

vk_internal_shaders_autogen.cppD03-May-202430.1 KiB549508

vk_internal_shaders_autogen.gniD03-May-20246.8 KiB151149

vk_internal_shaders_autogen.hD03-May-20248.2 KiB267237

vk_mandatory_format_support_data.jsonD03-May-202417.7 KiB439439

vk_mandatory_format_support_table_autogen.cppD03-May-202414 KiB300282

vk_mem_alloc_wrapper.cppD03-May-20246.7 KiB162131

vk_mem_alloc_wrapper.hD03-May-20242.7 KiB7146

vk_utils.cppD03-May-202454 KiB1,4911,204

vk_utils.hD03-May-202434.1 KiB1,058792

vk_wrapper.hD03-May-202468.3 KiB1,9091,577

README.md

1# ANGLE: Vulkan Back-end
2
3ANGLE's Vulkan back-end implementation lives in this folder.
4
5[Vulkan](https://www.khronos.org/vulkan/) is an explicit graphics API. It has a lot in common with
6other explicit APIs such as Microsoft's [D3D12][D3D12 Guide] and Apple's
7[Metal](https://developer.apple.com/metal/). Compared to APIs like OpenGL or D3D11 explicit APIs can
8offer a number of significant benefits:
9
10 * Lower API call CPU overhead.
11 * A smaller API surface with more direct hardware control.
12 * Better support for multi-core programming.
13 * Vulkan in particular has open-source tooling and tests.
14
15[D3D12 Guide]: https://docs.microsoft.com/en-us/windows/desktop/direct3d12/directx-12-programming-guide
16
17## Back-end Design
18
19The [`RendererVk`](RendererVk.cpp) class represents an `EGLDisplay`. `RendererVk` owns shared global
20resources like the [VkDevice][VkDevice], [VkQueue][VkQueue], the [Vulkan format tables](vk_format_utils.h)
21and [internal Vulkan shaders](shaders). The [ContextVk](ContextVk.cpp) class implements the back-end
22of a front-end OpenGL Context. ContextVk processes state changes and handles action commands like
23`glDrawArrays` and `glDrawElements`.
24
25## Command recording
26
27The back-end records commands into command buffers via the following `ContextVk` APIs:
28
29 * `beginNewRenderPass`: Writes out (aka flushes) prior pending commands into a primary command
30   buffer, then starts a new render pass. Returns a secondary command buffer *inside* a render pass
31   instance.
32 * `getOutsideRenderPassCommandBuffer`: May flush prior command buffers and close the render pass if
33   necessary, in addition to issuing the appropriate barriers. Returns a secondary command buffer
34   *outside* a render pass instance.
35 * `getStartedRenderPassCommands`: Returns a reference to the currently open render pass' commands
36   buffer.
37
38The back-end (mostly) records Image and Buffer barriers through additional `CommandBufferAccess`
39APIs, the result of which is passed to `getOutsideRenderPassCommandBuffer`.  Note that the
40barriers are not actually recorded until `getOutsideRenderPassCommandBuffer` is called:
41
42 * `onBufferTransferRead` and `onBufferComputeShaderRead` accumulate `VkBuffer` read barriers.
43 * `onBufferTransferWrite` and `onBufferComputeShaderWrite` accumulate `VkBuffer` write barriers.
44 * `onBuffferSelfCopy` is a special case for `VkBuffer` self copies. It behaves the same as write.
45 * `onImageTransferRead` and `onImageComputerShadeRead` accumulate `VkImage` read barriers.
46 * `onImageTransferWrite` and `onImageComputerShadeWrite` accumulate `VkImage` write barriers.
47 * `onImageRenderPassRead` and `onImageRenderPassWrite` accumulate `VkImage` barriers inside a
48   started RenderPass.
49
50After the back-end records commands to the primary buffer and we flush (e.g. on swap) or when we call
51`ContextVk::finishToSerial`, ANGLE submits the primary command buffer to a `VkQueue`.
52
53See the [code][CommandAPIs] for more details.
54
55### Simple command recording example
56
57In this example we'll be recording a buffer copy command:
58
59```
60    // Ensure that ANGLE sets proper read and write barriers for the Buffers.
61    vk::CommandBufferAccess access;
62    access.onBufferTransferWrite(destBuffer);
63    access.onBufferTransferRead(srcBuffer);
64
65    // Get a pointer to a secondary command buffer for command recording.
66    vk::CommandBuffer *commandBuffer;
67    ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
68
69    // Record the copy command into the secondary buffer. We're done!
70    commandBuffer->copyBuffer(srcBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies);
71```
72
73## Additional Reading
74
75More implementation details can be found in the `doc` directory:
76
77- [Fast OpenGL State Transitions](doc/FastOpenGLStateTransitions.md)
78- [Shader Module Compilation](doc/ShaderModuleCompilation.md)
79- [OpenGL Line Segment Rasterization](doc/OpenGLLineSegmentRasterization.md)
80- [Format Tables and Emulation](doc/FormatTablesAndEmulation.md)
81- [Deferred Clears](doc/DeferredClears.md)
82- [Queries](doc/Queries.md)
83
84[VkDevice]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDevice.html
85[VkQueue]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkQueue.html
86[CommandAPIs]: https://chromium.googlesource.com/angle/angle/+/df31624eaf3df986a0bdf3f58a87b79b0cc8db5c/src/libANGLE/renderer/vulkan/ContextVk.h#620
87
88