链接:百度网盘 请输入提取码 提取码:wm0h
整体定位
- SwiftShader:Google 的高性能软件渲染器,用 CPU 模拟 GPU。
- 支持的前端 API:
- Vulkan(现在的重点)
- OpenGL ES / EGL(老接口,正在逐步弱化但仍存在)
- 核心思想:把图形 API 调用 → 转成中间表示(Reactor/IR)→ JIT 编译成 CPU 指令 → 在 CPU 上执行。
源码总体结构(master 分支典型布局)
顶层常见目录/文件(名字略有版本差异,但整体类似):
- CMakeLists.txt:主构建脚本。
src/Common/:通用工具(数学、位操作、调试辅助、错误处理)。System/:平台抽象(线程、同步、内存、动态库加载、CPU 特性检测)。Reactor/:中间表示和 JIT 编译器,是 SwiftShader 的“虚拟 GPU ISA”。Vulkan/:Vulkan API 实现(vkCreateDevice等),设备/队列/命令缓冲区/管线/描述符等。OpenGL/、WSI/等:OpenGL ES/EGL 和窗口系统集成。
third_party/:内嵌依赖(如 SPIR-V 工具、LLVM/Capstone/xxhash 等)。tests/、samples/:测试和示例(不同版本略有差异)。docs/或README.md:使用与设计说明。
你可以用这个顺序看:
- 顶层
README.md/docs:了解支持的 API 与构建方式。 src/Reactor:理解 IR 与 JIT(最核心、但也最难的一块)。src/Vulkan:顺着 Vulkan 的对象生命周期看“上层 API 如何落到 Reactor”。
核心模块简要说明
- Reactor(中间表示 + JIT)
- 提供一个面向“向量/标量算术”的 C++ 风格 DSL,例如:
using namespace rr; // Reactor namespace
Function<Void(Int, Pointer<Float>)> foo;
{
Int index = foo.Arg<0>();
Pointer<Float> data = foo.Arg<1>();
data[index] = Float(42.0f);
}
- 这些操作不会立即执行,而是构建出一张 IR 图,最后交给后端(LLVM 或自研后端)生成机器码。
- 重要文件/概念:
Reactor.hpp/cpp:公共 API。CPUID.cpp:选择不同 CPU 特性(SSE/AVX)。LLVMReactor.cpp或x86_reactor.cpp:具体后端实现。
- 作用:所有着色器、光栅化、混合等 GPU 算子都用 Reactor 来描述,便于跨平台 JIT。
- Vulkan 实现(
src/Vulkan)
- SwiftShader 实现了一个纯软件 Vulkan 设备:
vk_device.cpp/Device.*:虚拟 GPU 设备,管理内存、队列、管线等。vk_queue.cpp/Queue.*:命令队列。vk_cmd_buffer.cpp/CommandBuffer.*:记录与提交命令。Pipeline,ShaderModule,DescriptorSet等类:映射 Vulkan 对象。
- 数据流典型路径:
- 应用调用
vkCreateGraphicsPipelines。 - SwiftShader 解析 SPIR-V 着色器 → 转成 Reactor IR。
- 构建“光栅化 + 片段处理 + 混合”等 pipeline 函数。
- 提交
vkCmdDraw时,将顶点数据/描述符/常量布局拼好,调用 JIT 函数在 CPU 上执行。
- 应用调用
- Common / System(基础设施)
Common:- 数学:向量/矩阵、颜色、深度等。
- 工具类:
BitSet、AlignedArray、日志与断言封装。
System:- 线程池/任务系统。
- 原子操作、锁、事件、内存对齐。
- 平台差异封装(Windows / Linux / macOS)。
- SwiftShader 大部分上层模块都依赖这些基础设施。
- OpenGL / WSI / Frontends
- OpenGL ES/EGL 前端:把 GL 调用转换为内部的“类似 Vulkan”命令或直接 Reactor 调用。
- WSI(Window System Integration):处理显示 Surface、Swapchain,与平台窗口系统(Win32、X11、Wayland 等)绑定。