You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.5 KiB
62 lines
2.5 KiB
7 months ago
|
|
||
|
---
|
||
|
title: "Vulkan"
|
||
|
linkTitle: "Vulkan"
|
||
|
|
||
|
---
|
||
|
|
||
|
|
||
|
Skia has a Vulkan implementation of its GPU backend. The Vulkan backend can be
|
||
|
built alongside the OpenGL backend. The client can select between the OpenGL
|
||
|
and Vulkan implementation at runtime. The Vulkan backend has reached feature
|
||
|
parity with the OpenGL backend. At this time we find that many Vulkan drivers
|
||
|
have bugs that Skia triggers for which we have no workaround. We are reporting
|
||
|
bugs to vendors as we find them.
|
||
|
|
||
|
Windows and Linux
|
||
|
-----------------
|
||
|
To build the Vulkan backend, set `skia_use_vulkan=true` in `args.gn`.
|
||
|
|
||
|
Android
|
||
|
-------
|
||
|
The Vulkan backend can run on any device with Vulkan drivers, including all Android N+ devices.
|
||
|
To build the Vulkan backend, set `ndk_api = 24` in `args.gn` to target Android N.
|
||
|
|
||
|
Using the Vulkan Backend
|
||
|
------------------------
|
||
|
|
||
|
To create a GrContext that is backed by Vulkan the client creates a Vulkan device and queue, initializes a GrVkBackendContext to describe the context, and then calls GrContext::MakeVulkan:
|
||
|
|
||
|
<!--?prettify lang=c++?-->
|
||
|
sk_sp<GrVkBackendContext> vkContext = new GrVkBackendContext;
|
||
|
vkBackendContext.fInstance = vkInstance;
|
||
|
vkBackendContext.fPhysicalDevice = vkPhysDevice;
|
||
|
...
|
||
|
vkBackendContext.fInterface.reset(GrVkCreateInterface(instance, vkPhysDevice, extensionFlags);
|
||
|
...
|
||
|
|
||
|
sk_sp<GrContext> context = GrContext::MakeVulkan(vkBackendContext);
|
||
|
|
||
|
When using the Vulkan backend, GrVkImageInfo is used to construct GrBackendTexture
|
||
|
and GrBackendRenderTarget objects that in turn are used to create SkSurface and SkImage
|
||
|
objects that refer to VkImages created by the Skia client.
|
||
|
|
||
|
The GrBackendObject returned by SkImage::getTextureHandle(),
|
||
|
SkSurface::getTextureHandle(), and SkSurface::getRenderTargetHandle() should be
|
||
|
interpreted as a GrVkImageInfo*. This allows a client to get the backing VkImage
|
||
|
of a SkImage or SkSurface.
|
||
|
|
||
|
GrVkImageInfo specifies a VkImage and associated state (tiling, layout, format, etc).
|
||
|
After getting a GrVkImageInfo* via getTextureHandle() or
|
||
|
getRenderTargetHandle(), the client should check the fImageLayout field to know
|
||
|
what layout Skia left the VkImage in before using the VkImage. If the client
|
||
|
changes the layout of the VkImage,
|
||
|
GrVkImageInfo::updateImageLayout(VkImageLayout layout) should be called before
|
||
|
resuming Skia rendering.
|
||
|
|
||
|
The client is responsible for any synchronization or barriers needed before
|
||
|
Skia performs I/O on a VkImage imported into Skia via GrVkImageInfo. Skia will
|
||
|
assume it can start issuing commands referencing the VkImage without the need
|
||
|
for additional synchronization.
|
||
|
|