SwiftShader-refs_heads_master.tar

链接:百度网盘 请输入提取码 提取码: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:使用与设计说明。

你可以用这个顺序看:

  1. 顶层 README.md / docs:了解支持的 API 与构建方式。
  2. src/Reactor:理解 IR 与 JIT(最核心、但也最难的一块)。
  3. src/Vulkan:顺着 Vulkan 的对象生命周期看“上层 API 如何落到 Reactor”。

核心模块简要说明

  1. 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.cppx86_reactor.cpp:具体后端实现。
  • 作用:所有着色器、光栅化、混合等 GPU 算子都用 Reactor 来描述,便于跨平台 JIT。
  1. Vulkan 实现(src/Vulkan
  • SwiftShader 实现了一个纯软件 Vulkan 设备:
    • vk_device.cpp / Device.*:虚拟 GPU 设备,管理内存、队列、管线等。
    • vk_queue.cpp / Queue.*:命令队列。
    • vk_cmd_buffer.cpp / CommandBuffer.*:记录与提交命令。
    • Pipeline, ShaderModule, DescriptorSet 等类:映射 Vulkan 对象。
  • 数据流典型路径:
    1. 应用调用 vkCreateGraphicsPipelines
    2. SwiftShader 解析 SPIR-V 着色器 → 转成 Reactor IR。
    3. 构建“光栅化 + 片段处理 + 混合”等 pipeline 函数。
    4. 提交 vkCmdDraw 时,将顶点数据/描述符/常量布局拼好,调用 JIT 函数在 CPU 上执行。
  1. Common / System(基础设施)
  • Common
    • 数学:向量/矩阵、颜色、深度等。
    • 工具类:BitSetAlignedArray、日志与断言封装。
  • System
    • 线程池/任务系统。
    • 原子操作、锁、事件、内存对齐。
    • 平台差异封装(Windows / Linux / macOS)。
  • SwiftShader 大部分上层模块都依赖这些基础设施。
  1. OpenGL / WSI / Frontends
  • OpenGL ES/EGL 前端:把 GL 调用转换为内部的“类似 Vulkan”命令或直接 Reactor 调用。
  • WSI(Window System Integration):处理显示 Surface、Swapchain,与平台窗口系统(Win32、X11、Wayland 等)绑定。