2312skia,15vulkan及技巧
ANGLE介绍
ANGLE
,把OpenGLES2
或3
调用转换为DirectX9,11
或OpenGL
调用.这些说明记录了如何在Windows
或Linux
上使用ANGLE
而不是本地OpenGL
后端.
细节
gclient sync
下载ANGLE
的源码及Skia
的其他仅测试依赖项.
要针对ANGLE
构建Skia
测试工具,请添加skia_use_angle=true
到args.gn
文件中(或运行gn args
来编辑).
运行工具时,请使用--config angle_<backend>_<frontend>
,如
out/Debug/dm --src gm --config angle_d3d11_es2
out/Release/nanobench --config angle_gl_es2
Vulkan
Skia
的GPU
后端有一个Vulkan
实现.可与OpenGL
后端一起构建Vulkan
后端.客户可在运行时在OpenGL
和Vulkan
实现间选择.
Vulkan
后端已达到与OpenGL
后端的功能等价.目前,许多Vulkan
驱动都存在没有解决方法的触发Skia
的错误.
会在发现
错误时向供应商报告错误.
Windows
和Linux
要构建Vulkan
后端,请在args.gn
中设置skia_use_vulkan=true
.
Android
可在装有Vulkan
驱动的设备
上运行包括所有AndroidN+
设备的Vulkan
后端.要构建Vulkan
后端,请在args.gn
中设置ndk_api=24
来指定AndroidN
目标.
Mac
可用SwiftShader
在软件仿真中运行Vulkan
后端.这允许通过dm
测试和调试,在查看器等交互式应用中不支持Vulkan
.
Skia
已按外部依赖项包含SwiftShader
库.要构建
它,先要安装CMake
.
准备好CMake
后,需要编译SwiftShader
.请按以下步骤操作,替换你的实际Skia
目录,而不是下面的$(SKIA_DIR)
:
$ cd $(SKIA_DIR)/third_party/externals/swiftshader/build
$ cmake ..
$ cmake --build . --parallel
构建完成后,SwiftShader
的构建目录,应包含包含libvk_swiftshader.dylib
的Darwin
子目录.为了让Skia
看到该库,需要在args.gn
中如下引用它:
skia_use_vulkan = true
extra_cflags = [ "-D", "SK_GPU_TOOLS_VK_LIBRARY_NAME=$(SKIA_DIR)/third_party/externals/swiftshader/build/Darwin/libvk_swiftshader.dylib" ]
使用Vulkan
后端
要创建由Vulkan
支持的GrContext
,客户会创建
一个Vulkan
设备和队列,初化GrVkBackendContext
来描述环境,然后调用GrContext::MakeVulkan
:
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);
使用Vulkan
后端时,用GrVkImageInfo
来构造,创建引用Skia
客户创建的VkImages
的SkSurface
和SkImage
对象的GrBackendTexture
和GrBackendRenderTarget
对象.
应按GrVkImageInfo*
解释SkImage::getTextureHandle(),SkSurface::getTextureHandle()
和SkSurface::getRenderTargetHandle()
返回的GrBackendObject
.这允许客户取SkImage
或SkSurface
的支持VkImage
.
GrVkImageInfo
指定VkImage
和关联的状态(平铺,布局,格式
等).通过getTextureHandle()
或getRenderTargetHandle()
取GrVkImageInfo*
后,客户应检查fImageLayout
字段,以了解Skia
在使用VkImage
之前,将VkImage
保留在哪个布局
中.
如果客户更改了VkImage
的布局,则应在恢复Skia
渲染前,调用GrVkImageInfo::updateImageLayout(VkImageLayoutlayout)
.
在Skia
对通过GrVkImageInfo
导入Skia
的VkImage
执行I/O
之前,客户负责期望的同步
或阻塞
.Skia
假定无需额外
同步,就可开始发出引用VkImage
的命令.
提示
在Chromium
中网页上抓.skp
文件
使用experimental/tools/web_to_skp
脚本,或会如下:
1,使用--no-sandbox --enable-gpu-benchmarking
启动Chrome
或Chromium
.
2,打开JS
控制台(Ctrl+Shift+J(Windows/Linux)
或Cmd+Opt+J(MacOS))
3.执行:chrome.gpuBenchmarking.printToSkPicture('/tmp')
,会在成功时返回"undefined"
.
在Skia
调试器中打开生成
文件,用dm
栅格化它,或使用Skia
查看器查看:
out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \
--config 8888 gpu pdf --verbose
ls -l /tmp/(*)/skp/layer_0.skp.*
out/Release/viewer --skps /tmp --slide layer_0.skp
在Chromium
中的网页上抓.mskp
文件
多页Skia
图片文件抓捕
为生成PDF
和打印文档
而发送
的命令.
使用experimental/tools/web_to_mskp
脚本,或会如下:
前2同上,第3步执行
chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp')
在Skia
调试器中打开生成
文件,用dm
栅格化它,或使用Skia
查看器查看:
experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skp
ls -l /tmp/filename.mskp.skp
# open filename.mskp.skp in the debugger.
out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \
--config pdf --verbose
ls -l /tmp/pdf/mskp/filename.mskp.pdf
如何在Skia
中添加硬件加速
Skia
可通过两个方式利用指定硬件.
1,自定义瓶颈例程
Skia
的blit
中有一组瓶颈例程
,可在平台上替换这些例程,以利用指定的CPU
功能.一个此例
是ARMv7
设备上的NEONSIMD
指令.见src/opts/
这里
Skia
是否支持字体提示
Skia
有个内置
字体缓存,但它不知道如何把实际TrueType
等字体文件渲染
到其缓存中.为此,它依赖平台
来提供SkScalerContext
的实例.
这是Skia
与字体缩放器
引擎通信的抽象接口
.在src/ports
中,可见FreeType,macOS
和WindowsGDI
字体引擎
的支持文件.
其他字体引擎
也可轻松
类似支持.
Skia
是否调整字距
变形
是用适当字体
转换Unicode
文本跨度
为固定
字形跨度的过程.
Skia
不改变文本.Skia
提供了来绘画
字形的接口,但不实现
文本变形器.Skia
的客户经常使用HarfBuzz
来生成包括调整字距的字形
及其位置
.
这里是如何结合使用Skia
和HarfBuzz
的示例.此例中,使用相同的mmap()
的.ttf
字体文件创建SkTypeface
和hb_face_t
.
用HarfBuzz
面来变形Unicode
文本为一系列字形和位置
,然后可用SkTypeface
绘画这些字形
.
如何在文本上添加阴影
混合模式
描述如何替换目标像素
为自身
像素和源像素
的组合.Blend_Mode
可用源和/或目标
.Blend_Mode
可独立地操作每个Color
组件,也可允许所有源像素组件为一个目标像素组件.
Blend_Mode
不使用相邻像素
来确定结果.
Blend_Mode
使用源
及读取目标α
来确定写入的目标α
;源和目标α
也可能影响写入
的目标Color
组件.
在源像素和目标像素中,无论是如何编码的α
,几乎所有Color_Types
都将其视为从0到1
的区间.而且,几乎所有Blend_Mode
算法都限制了输出
,因此所有结果也是零到一
.
两个例外是SkBlendMode::kPlus
和kRGBA_F16_SkColorType
.
SkBlendMode::kPlus
允许计算大于1
的α
和Color
分量值.对除kRGBA_F16_SkColorType
以外的Color_Types
,生成的α
和分量值
被限制为1
.
kRGBA_F16_SkColorType
允许值超出0到1
的区间.由客户决定确保
结果在0到1
的区间内,因此良好
定义.
组合
数字图像通过SkBlendMode::kXor
,描述了Porter_Duff
模式的SkBlendMode::kClear
.
使用Porter_Duff
合成,绘画
带透明度的位图
可自由
清理目标.
用Porter_Duff
合成,绘画有透明度的几何图形
不会组合
透明源像素
,从而保持几何体
外部的目标位置
不变.
SkBlendMode::kPlus
和SkBlendMode::kScreen
模式使用简单算术
来使目标
变亮或变暗.:SkBlendMode::kOverlay
到SkBlendMode::kMultiply
模式,使用更复杂的算法
来变亮或变暗
;
有时如混合模式
,会同时执行
这两个操作.
SkBlendMode::kModulate
是SkBlendMode::kSrcATop
和SkBlendMode::kMultiply
的混搭.它乘以包括α
的所有组件
;
与SkBlendMode::kMultiply
不同,如果源或目标
为透明
,则结果为透明
.SkBlendMode::kModulate
使用预乘值
来计算乘积;
SkBlendMode::kMultiply
使用非预乘值
值来计算乘积
.
SkBlendMode::kHue,SkBlendMode::kSaturation,SkBlendMode::kColor
和SkBlendMode::kLuminosity
模式用所有分量
颜色信息,用不可分离
混合模式,转换源和目标
像素.