e2d37c2a07
Also removes a reference to GrBackendTextureDesc in a comment and updates markdown docs. Docs-Preview: https://skia.org/?cl=24861 Bug: skia: Change-Id: Ic6490d5ef46953450e6dee69271397bb2b94d0d6 Reviewed-on: https://skia-review.googlesource.com/24861 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
57 lines
2.6 KiB
Markdown
57 lines
2.6 KiB
Markdown
Vulkan
|
|
======
|
|
|
|
Skis 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_vulkan_sdk` to the path to your Vulkan SDK in `args.gn`.
|
|
This defaults to the environment variable `VULKAN_SDK`.
|
|
|
|
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::Create:
|
|
|
|
<!--?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::Create(kVulkan_GrBackend, (GrBackendContext) 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.
|