xJayLee / Turbo

Turbo is rendering engine base Vulkan

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Turbo

LICENSE repo size QQ Group WeChat 爱发电

Turbo是渲染引擎

Version

当前版本 0.0.0.12

State

  • 开发中

Sponsor

想赞助的小伙伴,欢迎使用爱发电赞助,请量力而为,如果赞助完真有困难可以退回,未成年人禁止投喂!!!
爱发电 爱发电Turbo引擎

赞助项目

Document

  • 使用MarkDown书写,使用docsify部署(之前是使用MkDocs)
  • 使用MarkDown书写文字和文档,使用drawio绘制设计图表
  • 详细设计文档请参考docs/TurboDesign.drawio(需要安装drawwio)
  • 目前存在的问题待解决,请查看docs/Issue.md
  • 开发记录录像请浏览 Turbo引擎开发记录

Build

  • 首先您需要知道的:

    • Turbo引擎被设计成各种模块,有Core核心模块, 有FrameGraph模块等。

    • 目前Turbo的核心模块基本完成(未完成部分和相关问题请参考下面的RoadMap章节和docs/Issue.md文档)

    • Turbo引擎的核心位于./engine/core,这是一个单独的模块,您可以直接将他拷贝出来放到自己的工程中

    • Turbo引擎会使用核心进行渲染,有关如何使用该核心,目前可以参考./main.cpp。该文件中有最新的核心实例代码,同时也是引擎的一部分。

    • 核心会用到的第三方库为:

      • glslang : 用于将Shader代码字符串编译成Spir-V
      • SPIRV-Cross : 用于解析Spir-V,获取Shader中相关声明
      • VulkanMemoryAllocator : 用于分配Vulkan资源内存
    • 本人对于CMake并不是非常精通,有关核心是如何寻找Vulkan库的,我直接配置的绝对路径,请修改engine/core/CMakeLists.txt中的此行代码:

      #已遗弃
      ##set_target_properties(vulkan PROPERTIES IMPORTED_LOCATION F:/VulkanSDK/1.3.204.1/Lib/vulkan-1.lib)

      请将该行修改成您电脑上的Vulkan库目录。 该问题将会在不远的未来通过动态加载库文件得到解决。

      ┗|`O′|┛oO 2022/7/27 该问题已修改完成,详情请参考下面的如何编译Turbo章节的

    • Turbo非核心模块,也就是目前除了./engine/core之外,基本上就是Turbo的非核心了,之后将在核心之外,基于核心开发高级模块,比如FrameGraph之类的,目前非核心模块已有核心模块使用案例,位于./main.cpp,就像前面说的,该用例使用如下第三方库:

      • glfw :窗口库
      • glm : 用于向量矩阵等运算
      • imgui : 用于绘制界面UI
      • KTX-Software : Khronos Texture通用纹理标准
      • tinygltf : 读取gltf文件库
  • 如何编译Turbo

    • 请安装Vulkan SDK
      • ( *:2022/7/27 对于Windows系统,目前Turbo已经完成了动态加载Vulkan函数,Vulkan SDK目前对于Turbo不是必需品(有些第三方依赖需要Vulkan SDK,比如VulkanMemoryAllocator),VulkanRuntimeTurbo的必须品,正常Windows都会自带该运行时库,如果没有请安装Vulkan Latest Runtime即可,Linux系统等有空适配一下)

        Vulkan Loader 文档有这么一句: In previous versions of the loader, it was possible to statically link the loader. This was removed and is no longer possible. The decision to remove static linking was because of changes to the driver which made older applications that statically linked unable to find newer drivers.

    • Turbo的核心可以单独编译,编译相关的CMakeLists.txt位于./engine/core/CMakeLists.txt。将会输出名为TCore的库文件。
    • 如果您想直接编译Turbo
      1. 首先请查看环境变量中是否已经加入了gitbin目录,KTX-Sofware编译依赖bash.exe,正常该程序位于gitbin目录下

      2. 请安装python。第三方库很多CMake使用Python脚本运行,安装完后请确保Python{Python的安装目录}/Python{版本号}/目录和{Python的安装目录}/Python{版本号}/Scripts目录加入到了环境变量中

      3. 请修改engine/core/CMakeLists.txt中的Vulkan库目录为您自己的目录

      4. 之后使用./CMakeLists.txt即可

      5. 设置相关CMake参数如下:

        KTX_FEATURE_LOADTEST_APPS=OFF//如果您想加载KTX测试,请设置ON
        KTX_FEATURE_DOC=OFF//如果您想生成KTX文档,请设置ON
        KTX_FEATURE_STATIC_LIBRARY=ON //目前Turbo按照静态库使用KTX
        
        //2022/7/30 关于解决Turbo核心库的依赖库问题解决,核心库对于VulkanMemoryAllocator使用动态加载Vulkan API方式,这也是Turbo引擎加载Vulkan API的方式
        VMA_STATIC_VULKAN_FUNCTIONS=0
        VMA_DYNAMIC_VULKAN_FUNCTIONS=1
  • 如何运行

    1. 由于每个用户输出的目录都不一样,所以./main.cpp的示例程序使用的资源文件使用的是相对路径,所有的资源文件都指向./asset/目录,请在./main.cpp中全局搜索asset字符,替换成自己的目录即可。

Trifles

  • 整理一下头文件,有点乱,去掉不必要的头文件

RoadMap

2022/5/15

  • Turbo 引擎对于 Vulkan 1.0 的相关核心功能已初步成型,由于Vulkan本身的复杂性还有很多特性没有实现,在此做一下记录,记录该引擎以实现的特性和未来计划实现特性,该特性记录将会和docs/Issue.md文档配合使用。
  • Core核心层将会作为单独完整的库发布,位于./engine/core中, 现在核心库已分离成单独的库,将会输出TCore.libTCore.a库文件
  • Turbo将使用该Core核心继续开发高级特性
  • 未来有时间录制Vulkan教程引擎开发教程视频

2022/5/28

  • 实现完Vulkaninput attachment也就是完成了延迟渲染相关工作,Turbo核心现在对于图形的核心封装设计基本上接近尾声,延迟渲染之后将会开展FrameGraph相关设计实现工作。有关几何着色器,细分着色器,光线追踪等将会在Turbo的核心继续展开
  • FrameGraph将会是Turbo引擎实现高级特性的重点,ECS(Entity Component System)或者EC(Entity Component)之类管理场景的相关技术不是Turbo引擎的重点,Turbo引擎目前的重点目标是不依赖任何窗口库(用户自定义),不依赖任何场景结构技术(用户自己实现自己的场景结构),Turbo可以很轻松的嵌入其中。

2022/5/30

  • Turbo核心基本实现完成,接下来开始FrameGraph的设计开发。敬请期待。

2022/6/7

  • 已开始写系列的使用示例。

2022/8/10

  • 开始设计实现engine

已完成示例

  • HelloTriangle - 将会使用核心绘制IMGUI和三角形
  • PureHelloTriangle - 将会使用核心绘制三角形
  • PureCombinedImageSampler - 将会使用核心绘制三角形,在此基础上使用纹理采样器一体式对纹理采样
  • PureSeparateImageSampler - 将会使用核心绘制三角形,在此基础上使用纹理采样器分离式对纹理采样
  • PureIndexDraw - 将会使用核心,基于索引渲染绘制一个方形面片,并在此基础上使用纹理采样器分离式对纹理采样
  • FrameGraphSample - FrameGraph的示例,目前该示例仅供测试(FrameGraph未实现完成),您可以通过该示例了解FrameGraph的基本流程

已完成特性

1.Vulkan核心特性的基本封装,包括:

  • Turbo::Core::TLayerInfo - Vulkan相关验证层信息
  • Turbo::Core::TExtensionInfo - Vulkan相关扩展信息
  • Turbo::Core::TVersion - 通用版本
  • Turbo::Core::TInstance - VkInstance的相关封装
  • Turbo::Core::TPhysicalDevice - VkPhysicalDevice相关封装
  • Turbo::Core::TDevice - VkDevice相关封装
  • Turbo::Core::TDeviceQueue - VkQueue相关封装
  • Turbo::Core::TImage - VkImage相关封装
  • Turbo::Core::TImageView - VkImageView相关封装
  • Turbo::Core::TCommandBufferPool - VkCommandPool相关封装
  • Turbo::Core::TCommandBuffer - VkCommandBuffer相关封装
  • Turbo::Core::TBuffer - VkBuffer相关封装
  • Turbo::Core::TShader - VkShaderModule相关封装
  • Turbo::Core::TDescriptorPool - VkDescriptorPool相关封装
  • Turbo::Core::TSampler - VkSampler相关封装
  • Turbo::Core::TSubpass - VulkanSubpass抽象
  • Turbo::Core::TAttachment - VulkanAttachment抽象
  • Turbo::Core::TRenderPass - VkRenderPass相关封装
  • Turbo::Core::TVertexBinding - Vulkan中顶点属性抽象
  • Turbo::Core::TViewport - VulkanViewport抽象
  • Turbo::Core::TScissor - VulkanScissor抽象
  • Turbo::Core::TDescriptor - Vulkan中各种描述符抽象
  • Turbo::Core::TDescriptorSetLayout - VkDescriptorSetLayout的相关封装
  • Turbo::Core::TPipelineLayout - VkPipelineLayout的相关封装
  • Turbo::Core::TPipeline - TPipelineLayout的相关封装,内部有VkPipeline vkPipeline成员变量,但创建是在其子类中创建
  • Turbo::Core::TGraphicsPipeline - 继承自Turbo::Core::TPipeline,图形渲染管线VkPipeline的相关封装,回去创建父类中的Turbo::Core::TPipeline::vkPipeline
  • Turbo::Core::TDescriptorSet - VkDescriptorSet的相关封装
  • Turbo::Core::TPipelineDescriptorSet - 管线所有有关描述符集的总和抽象,对应多个Turbo::Core::TDescriptorSet
  • Turbo::Core::TFramebuffer - VkFramebuffer相关封装
  • Turbo::Core::TSemaphore - VkSemaphore相关封装
  • Turbo::Core::TFence - VkFence相关封装
  • Turbo::Extension::TSurface - VkSurfaceKHR相关封装
  • Turbo::Extension::TSwapchain - VkSwapchainKHR相关封装

计划完成特性

  • Turbo引擎目前以Core核心层为主(优先级不分先后)

    • [ ✓ ] 生成mipmap
    • [ ✓ ] 混合渲染
    • [ ✓ ] 天空盒
    • HDR(应该算是延迟渲染的一部分)
    • [ ✓ ] 实例化渲染
    • 间接渲染
    • 细分着色器
    • 几何着色器
    • Vulkan光追标准
    • 多线程
    • [ ✓ ] 计算着色器
    • [ ✓ ] 计算管线
    • [ ✓ ] 延迟渲染
  • Core:跨平台窗口层抽象

  • CoreIMGUI

  • CoreKTXglTF

  • CoreFrameGraph

  • CoreFrameGraph层实现PBR

  • CoreECS

  • 2022/7/13 搞了个鸿蒙OS(Harmony OS)系统的手机,有时间适配一下鸿蒙设备。

Log

  • 2020/10/29

    • 完成TInstance TLayer TObject的文档,创建TExtension文档。目前跳转链接没有全部测试,有些页面还没有创建。
  • 2020/10/29

    • 完成TExtension文档。页内跳转还没写。TExtensionType值和描述还没写
  • 2022/3/17 基本调通了Turbo在VSCodes上的部署。

    • 注意TApplication::InitVulkan对于验证层的修改。
    • 搞清Turbo中一些函数返回局部变量,之后没有拷贝一份而直接传给Vulkan API后会卡住的问题
    • 将TApplication改成TEngine,作为Turbo最高层抽象
  • 2022/3/18

    • 继承自TInfo的类用于实现Vulkan相关Info功能,其中的GetVkXXXInfo等相关信息函数是返回局部变量,需要函数返回立刻保存数据,可能会有问题,先暂时这样。
  • 2022/3/19 设计架构

    • 重构TAllcator,创建TVulkanAllocator类专门用于Vulkan内存分配,并作为引擎的默认内存分配器
    • 重写TInstance::IsSupportVulkan()函数,原先有隐藏的Bug
    • Turbo::Core::TPhysicalDeviceProxy下的static VkResult EnumeratePhysicalDevices(TInstance *instance)改成私有
    • Turbo::Core::TEngine::InitVulkan()函数中不应开启任何layer或extension,该函数仅仅是为用户提供收集Vulkan相关信息功能。
    • TEngine中增加如下
      • uint32_t GetPhysicalDeviceCount();
      • std::vector\<TPhysicalDevice\> GetPhysicalDevices();
      • TPhysicalDevice GetBestPhysicalDevice();
    • TInfo下的TInfoType没用,去掉
    • TVendor修改成TVendorInfo
    • 创建TPhysicalDeviceInfo(完成,待完善)
    • TQueueFamily修改成TQueueFamilyInfo
    • 仍需修改,未完成如下:
      • TExtension
      • TLayer
      • TFormat
  • 2022/3/20 设计架构

    • 完成如下:

      • TExtension转成TExtensionInfo
      • TLayer转成TLayerInfos
      • TFormat转成TFormatInfo
      • TMemoryHeap转成TMemoryHeapInfo
      • TMemoryType转成TMemoryTypeInfo
      • 完成TPhysicalDeviceInfoTPhysicalDevice相结合
    • TPhysicalDeviceProxy::Instance(this->instance)的调用转移到了TInstance的构造函数中,TInstance中增加了TPhysicalDevice数组,接下来的所有对于TInstance用法都是指针连接(防止拷贝浪费内存)

    • 如下函数从TEngine转移到了Tinstance中,除了GetPhysicalDevice()函数如下函数将会从TPhysicalDeviceProxy中移除

      • uint32_t GetPhysicalDeviceCount();
      • TPhysicalDevice GetPhysicalDevice(uint32_t index);
      • std::vector<TPhysicalDevice> GetPhysicalDevices();
      • TPhysicalDevice GetBestPhysicalDevice();
  • 2022/3/21 设计架构

    • 完成如下:
      • TPhysicalDevice中增加std::map<TQueueFamilyInfo, uint32_t *> availableQueueCountMap,用于存储当前QueueFamily还有多少队列可用,用于DeviceQueue的创建,每成功创建一个DeviceQueue,相应的可用队列数减一,每销毁一个Queue相应的队列数加一。

      • TPhysicalDevice::availableQueueCountMapTPhysicalDevice::InitDeviceQueueParameter函数中分配动态内存,在TInstance的构造函数中释放动态内存

      • TPhysicalDevice中增加uint32_t GetAvailableQueueCount(TQueueFamilyInfo& queueFamily)函数,用于获取可用队列个数,如果返回0说明没有可用队列,如果大于0说明存在可用队列

      • 将TPhysicalDevice如下

        TQueueFamilyInfo* bestGraphysicsQueueFamily = nullptr;
        TQueueFamilyInfo* bestComputeQueueFamily = nullptr;
        TQueueFamilyInfo* bestTransferQueueFamily = nullptr;
        TQueueFamilyInfo* bestSparseQueueFamily = nullptr;
        TQueueFamilyInfo* bestProtectedQueueFamily = nullptr;

        修改成索引。指针指向成员vector变量是临时地址,会出现Bug

         uint32_t bestGraphysicsQueueFamilyIndex = UINT32_MAX;
         uint32_t bestComputeQueueFamilyIndex = UINT32_MAX;
         uint32_t bestTransferQueueFamilyIndex = UINT32_MAX;
         uint32_t bestSparseQueueFamilyIndex = UINT32_MAX;
         uint32_t bestProtectedQueueFamilyIndex = UINT32_MAX;

        并修改相关函数 TPhysicalDevice::GetBestXXX()对于这类函数,如果Turbo找到了性能最好的队列族将会正常返回,如果没找到,将会返回一个全0,索引为UINT32_MAX的无效TQueueFamilyInfo

      • 重构TDeviceTDeviceQueueTDeviceCreateInfoTDeviceQueueCreateInfo

        • std::vector<TDeviceQueueCreateInfo> deviceQueueCreateInfosTDeviceCreateInfo中移除
        • 移除TDeviceQueueCreateInfo::count默认为 1
  • 2022/3/22 设计架构

    • TResult增加RESOURCE_STARVATION,当发生可用资源匮乏,资源分配失败时会返回该结果
    • TPhysicalDevice中增加uint32_t Turbo::Core::TPhysicalDevice::GetAvailableQueueCount(uint32_t queueFamilyIndex)函数,用于快速获取特定队列族的可用队列数
    • TPhysicalDevice中增加void Turbo::Core::TPhysicalDevice::AvailableQueueCountMinusOneByQueueFamily(uint32_t queueFamilyIndex)私有函数,TDeviceQueue构造函数中使用,用于将对应可用队列族数量减一
    • TPhysicalDevice中增加void Turbo::Core::TPhysicalDevice::ResetQueueCountMap()私有函数,TDevice析构构函数中使用,用于将之前可用的队列数量还原。
    • TDeviceQueue基本完成,还要接下来的测试。
  • 2022/3/29 设计架构

    • 增加 TPool
    • 增加 TCommandBufferPool 继承自 TPool
    • 未增加需增加 TCommandBuffer 继承自 TObject
  • 2022/3/30 设计架构

    • TDeviceQueue增加 VkQueue GetVkQueue()函数
    • TDeviceQueue增加 TDevice *device成员变量
    • TDeviceQueue增加 TDevice *GetDevice()函数
    • 修改TPool实现至头文件 TCommandBufferPool编译通过
  • 2022/3/31 设计架构

    • TDevice增加 void Create() InternalCreate()函数(参考2022/4/1), 未完待续
    • TDevice增加 void Destroy() InternalDestroy()函数(参考2022/4/1), 未完待续
    • TDevice增加 std::vector<TQueueFamilyInfo> GetDeviceQueueFamilyInfos()函数
    • 增加TCommandBuffer类, 基本完完成
    • 修改TPool::Allocate()函数到template <typename... Args> T *Allocate(Args &&...args)
  • 2022/4/1 设计架构

    • TCommandBufferPool增加 VkCommandPool GetVkCommandPool()函数
    • TCommandBuffer构造函数实现完成
    • 增加TVulkanHandle类开始重构Vulkan句柄封装类,首先是TInstance
    • TVulkanHandle增加virtual void InternalDestroy() = 0函数
    • TVulkanHandle增加virtual void InternalCreate() = 0函数
    • TVulkanHandle增加virtual void InternalRebuild()函数 > * TVulkanHandle::InternalRebuild()内部会依次调用TVulkanHandle::InternalDestroy()TVulkanHandle::InternalCreate()
  • 2022/4/2 设计架构

    • TPhysicalDevice设计不合理,将值存储TPhysicalDevice改成指针存储。继承自TVulkanHandle。修改TInstanceTPhysicalDeviceTPhysicalDeviceProxy之间的关系,遗弃TPhysicalDeviceProxy 未完待续
    • 初步完成TInstance创建TPhysicalDevice,使用TPhysicalDevice::InternalRebuild()很方便的创建,遗弃TPhysicalDeviceProxy
    • TPhysicalDeviceProxy的功能转移到了TPhysicalDevice
  • 2022/4/3 设计架构

    • TInstanceTPhysicalDevice基于数据驱动,基本重构完成,遗弃TInstanceCreateInfoVkAllocationCallbacks,Turbo现在完全使用内置内存分配器TVulkanAllcator
  • 2022/4/4 设计架构

    • 优化了TInstanceTPhysicalDevice的重构
    • TDevice基本重构完成,遗弃了TDeviceCreateInfoVkAllocationCallbacks,Turbo现在完全使用内置内存分配器TVulkanAllcator
    • TDeviceQueue重构进行中
  • 2022/4/5 设计架构

    • TPhysicalDevice中增加void AvailableQueueCountPlussOneByQueueFamilyIndex(uint32_t queueFamilyIndex)函数
    • TDeviceQueue基于数据驱动,基本重构完成,遗弃了TDeviceQueueCreateInfoVkAllocationCallbacks,Turbo现在完全使用内置内存分配器TVulkanAllcator
    • TCommandBufferPool基于数据驱动,基本重构完成
    • TCommandBuffer基于数据驱动,基本重构完成
    • TurboTVulkanHandle派生类,现在拥有了内存自动回收能力,在delete掉某些TVulkanHandle派生类对现时,会自动回收与其有关的子对象(前提是所有对象均分布在堆上)。 也许Turbo不应该回收与其有关的对象内存,对于这部分内存回收应该由用户承担(除非是Turbo对象内部new出的内存,需要Turbo自己管理,Turboo只会负责回收Vulkan相关对象内存)。
  • 2022/4/6 设计架构

    • TVulkanHandle中增加(不允许拷贝或赋值)
      TVulkanHandle(TVulkanHandle const &) = delete;
      TVulkanHandle(TVulkanHandle &&) = delete;
      TVulkanHandle &operator=(TVulkanHandle const &) = delete;
      TVulkanHandle &operator=(TVulkanHandle &&) = delete;
    • 增加TVmaAllocator类,用于VulkanMemoryAllocator(VMA)内存分配 未完待续
    • TDevice中增加对TVmaAllocator对象的创建和销毁
  • 2022/4/7 设计架构

    • TVmaAllocator类,初步完成
    • TBuffer类,初步完成
    • 遗弃TDeviceMemory
    • 遗弃TBufferCreateInfo
    • 遗弃TImageCreateInfo
    • 遗弃TDeviceMemoryAllocateInfo
    • TImage类,初步完成
    • 遗弃TImageViewCreateInfo
    • TImageView类,初步完成
  • 2022/4/8 设计架构

    • 遗弃原先自定义创建TDeviceQueue类对象,现在该类对象由TDevice统一管理,用户只需要调用如下函数即可获得
    TDeviceQueue* GetBestGraphicsQueue();
    TDeviceQueue* GetBestComputeQueue();
    TDeviceQueue* GetBestTransferQueue();
    TDeviceQueue* GetBestSparseBindingQueue();
    TDeviceQueue* GetBestProtectedQueue();
    • 部分重构TDevice用于管理TDeviceQueue
  • 2022/4/9 设计架构

    • 创建TShader
    • 原本想在TShader类中使用glslang来动态编译字符串shaderspirv的,但是llvm-mingw32编译完的库,无论如何都找不到glslang的库函数,有可能是CMakeLists.txt库配置有问题,暂时先去除该动态编译功能~~(也许该功能不应位于Core层面,或许应该有个Shader编译器之类的)~~
    • TShader.h中提供std::vector<char> ReadSpirVFile(const std::string &file)函数用于读取spirv文件
  • 2022/4/10 设计架构

    • 解决glslang库找不到的问题,在Turbo根目录下创建thirdpart文件夹,用于存放第三方库文件项目
  • 2022/4/11 设计架构

    • 添加SPIRV-Cross库用于实现反射Shader描述符信息
    • 添加TDescriptor类,于TDescriptor.h中,用于描述VkDescriptorSetLayoutBinding
    • 添加TOutputTInput类,于TShader.h中,用于描述Shaderlayout (location=n) in/out [type](vec3...) name;
    • 未完待续
  • 2022/4/12 设计架构

    • TOutputTInput类,没有必要定义两份,修改成TInterface

    • TShader增加virtual void InternalParseSpirV()成员变量,用于内部构造解析SpirV用于Vulkan相应创建数据使用 未完待续

    • TShader增加std::vector<TInterface> outputs成员变量,表示layout (location=n) in [type](vec3...) name;

    • TShader增加std::vector<TInterface> inputs成员变量,表示layout (location=n) out [type](vec3...) name;

    • TDescriptor.h中增加TShaderDataType枚举,用于标明Shader中的数据类型

    • TInterface中增加如下:

      uint32_t location;//(location=n)
      TShaderDataType dataType;
      uint32_t size;//vec2 vec3 vec4
    • TShadervirtual void InternalParseSpirV()完成spirv_cross::SPIRTypeVkDescriptorType的映射

    • 未完待续

  • 2022/4/13 设计架构

    • 解决了TShader中使用spirv-cross运行时的崩溃
    • TShader 未完待续
  • 2022/4/14 设计架构

    • 继续TShader中使用spirv-cross对于Shader的解析,在TShader中应提供类似如下成员变量:
    //根据TDescriptorType中的定义声明不同类型的描述符成员变量
    std::vector<TUniformBufferDescriptor> uniforBuffers;
    std::vector<TSamplerDescriptor> samplers;
    std::vector<TImageSamplerDescriptor> imageSamplers;
    ...//等等描述符类型

    这需要Turbo中声明TUniformBufferDescriptor等类。

  • 2022/4/15 设计架构

    • 解决了TDescriptor.h中增加了TUniformBufferDescriptorTStructMember

      • TUniformBufferDescriptor中包含TStructMember
      • TUniformBufferDescriptor用于表示UniformBuffer描述符,
      • TStructMember用于表示TUniformBufferDescriptor中的数据结构
  • 2022/4/16 设计架构

    • 继续TUniformBufferDescriptor
  • 2022/4/17 设计架构

    • TShader.cpp中增加Turbo::Core::TShaderDataType SpirvCrossSPIRTypeBaseTypeToTShaderDataType(spirv_cross::SPIRType::BaseType baseType)函数,将spirv_cross::SPIRType::BaseType类型转换成Turbo::Core::TShaderDataType类型
    • TShader.cpp中对UniformBuffer的解析基本完成
    • TShader.cpp中对TInterface将改成继承自Turbo::Core::TStructMember
  • 2022/4/18 设计架构

    • TShader.cpp中对TInterfaceinputoutput的解析基本完成
    • Turbo::Core::TDescriptor代表VulkanVkDescriptorSetLayoutBinding
    • Turbo::Core::TUniformBufferDescriptor代表VulkanVkDescriptorSetLayoutBinding::descriptorType = VkDescriptorType::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
    • 需要创建TDescriptorSet类继承自Turbo::Core::TVulkanHandle用于涵盖多个Turbo::Core::TDescriptor并创建VkDescriptorSetLayout(考虑是否创建VkDescriptorSet
  • 2022/4/19 设计架构

    • 创建TDescriptorSet类,构造函数为Turbo::Core::TDescriptorSet::TDescriptorSet(TShader *shader, std::vector<TDescriptor *> &descriptors),其中的std::vector<TDescriptor *> &descriptors需要在外部new完传进来,该任务属于Turbo范畴(处理好TDescriptorSetTDescriptor之间的联系)

    • 对于throw Turbo::Core::TException(TResult,std::string);对于std::string变量,Turbo没有使用上,需补上

  • 2022/4/20 设计架构

    • 开始将std::vector<T[XXX]Descriptor *>std::vector<TDescriptorSet *> descriptorSets中写入,TShader维护std::vector<T[XXX]Descriptor *>中的内存,当TShader销毁时std::vector<T[XXX]Descriptor *>数组中T[XXX]Descriptor *所指向的指针也会销毁。 未完待续
    • TShader中增加void AddDescriptorToDescriptorSets(TDescriptor *descriptor)内部函数,当每次new一个TDescriptor之后,会将刚newTDescriptor通过AddDescriptorToDescriptorSets函数加入std::vector<TDescriptorSet *> descriptorSets中 未完待续 遗弃(不符合Turbo统一设计**)
  • 2022/4/21 设计架构

    *目前TShader中只实现了TUniformBufferDescriptor,将来待实现如下:

    TSamplerDescriptor;
    TCombinedImageSamplerDescriptor;
    TSampledImageDescriptor;
    TStorageBufferDescriptor;
    TInputAttachmentDescriptor;
    ...
    • 创建TPipeline类,内部完成了VkPipelineLayout的创建。 未完待续
    • Turbo中应该提供如下类 未完待续
    TGraphicsPipeline
    TComputePipeline
  • 2022/4/22 设计架构

    • 新增TViewport
    • 新增TScissor
    • 新增TAttachment
    • 新增TSubpass
    • 新增TRenderPass
    • 修改了TPipeline类,新增成员变量,内部的TScissorTViewport目前是按值存的,将来改成按照指针存,节省内存。
    • 以上只是初步完成,还有Bug需要修缮。 未完待续
  • 2022/4/23 设计架构

    • 修缮了TRenderPass中的Bug
    • TCommandBuffer中添加对于Vulkan中的VkCmd[...]的相关指令声明,未实现,待实现。
    • TCommandBuffer中已实现完成如下:
    bool Turbo::Core::TCommandBuffer::Begin()
    bool Turbo::Core::TCommandBuffer::End()
    bool Turbo::Core::TCommandBuffer::Reset()
    • TCommandBuffer中正在实现如下:
    void Turbo::Core::TCommandBuffer::BeginRenderPass(TRenderPass *renderPass)
    void Turbo::Core::TCommandBuffer::EndRenderPass()
    • 创建TFrameBuffer
    • TCommandBuffer中添加TFrameBuffer成员变量,当用户调用Turbo::Core::TCommandBuffer::BeginRenderPass()时会new出一个TFrameBuffer对象,当用户调用Turbo::Core::TCommandBuffer::EndRenderPass()时会delete销毁该对象。所以BeginRenderPass()EndRenderPass()两个函数必须配合使用
  • 2022/4/24 设计架构

    • TFrameBuffer修改成TFramebuffer
    • TShader,TDescriptor,TDescriptorSet,TPipeline,TSubpass,TAttachemt,TRenderPassTFramebuffer之间设计不合理,需要重构。尝试是否能够按照Vulkan标准规范设计
  • 2022/4/25 设计架构

    • 将原先TShader中的TDescriptorSet改成了TDescriptorSetLayout
    • 创建TDescriptorSet用于表示VkDescriptorSet,现在就不会出现TDescriptorSetLayoutTDescriptorSet命名歧义了
    • 遗弃老的TPipelineTSubpassTAttachemtTRenderPassTFramebuffer相关设计,回归到Vulkan标准规范设计思路
    • TPipeline,TSubpass,TAttachemt,TRenderPassTFramebuffer重构中
    • TAttachemtTSubpass重构完成
    • TSubpass新增TAttachmentReference
    • 创建TDescriptorPoolTDescriptorSize
  • 2022/4/26 设计架构

    • TSubpass移除TAttachmentReference类,用起来不方便
    • TPipeline,TSubpass,TAttachemt,TRenderPassTFramebuffer基本重构完成,但还不完善。需进一步完善
    • TCommandBuffer实现基础命令,还不完善。需进一步完善
    • TDescriptorSet::BindData(...)仅用于测试,须修改完善。
    • TBuffer新增void *Map()void Unmap();函数,用于映射内存
    • 新增TFence
    • TFence中新增TResult Wait()如果超时将返回TResult::TIMEOUT否则返回TResult::SUCCESS
    • TFence中新增void WaitUntil()将会一直等待,直到指令运行结束
    • 新增TSemaphore
    • TDeviceQueue中新增bool Submit(std::vector<TSemaphore *> &waitSemaphores, std::vector<TSemaphore *> &signalSemaphores, TCommandBuffer *commandBuffer, TFence *fence)函数,用于提交指令。
  • 2022/4/27 设计架构

    • 发布至GitHubGitee
    • 提炼issue
  • 2022/4/28 设计架构

    • TBuffer中增加typedef enum TBufferUsageBits枚举,与Vulkan标准一致
    • TBuffer中增加typedef VkFlags TBufferUsages声明,用于声明TBufferuage,与Vulkan标准一致
    • Turbo.h中增加typedef VkDeviceSize TDeviceSize用于TBuffer的构造函数中,与Vulkan标准一致
    • TImage中增加typedef enum TImageType枚举,用于声明TImagetype,与Vulkan标准一致
    • TImage中增加typedef enum TSampleCountBits枚举,与Vulkan标准一致
    • TImage中增加typedef VkFlags TSampleCounts声明,用于TImage的构造函数中,与Vulkan标准一致
    • TImage中增加typedef enum TImageTiling枚举,用于TImage的构造函数中,与Vulkan标准一致
    • TImage中增加typedef enum TImageUsageBits枚举,与Vulkan标准一致
    • TImage中增加typedef VkFlags TImageUsages声明,用于TImage的构造函数中,与Vulkan标准一致
    • TImage中增加typedef enum TImageLayout枚举,用于TImage的构造函数中,与Vulkan标准一致
    • TImageView中增加typedef enum TImageViewType枚举,用于TImageView的构造函数中,与Vulkan标准一致
    • TImageView中增加typedef enum TImageAspectBits枚举,与Vulkan标准一致
    • TImageView中增加typedef VkFlags TImageAspects声明,用于TImageView的构造函数中,与Vulkan标准一致
    • TAttachment中增加typedef enum TLoadOp声明,用于TAttachment的构造函数中,与Vulkan标准一致
    • TAttachment中增加typedef enum TStoreOp声明,用于TAttachment的构造函数中,与Vulkan标准一致
  • 2022/4/29 设计架构

    • TAttachment中重命名typedef enum TStoreOp声明,成typedef enum class TStoreOp,优化枚举内命名
    • TAttachment中重命名typedef enum TLoadOp声明,成typedef enum class TLoadOp,优化枚举内命名
    • TImageLayout中重命名typedef enum TImageLayout声明,成typedef enum class TImageLayout,优化枚举内命名
    • TFormatInfo进一步设计优化,完善了如下:
      • typedef enum TFormatContentType
      • typedef enum class TFormatDataType
      • typedef enum class TFormatCompression
      • typedef enum class TFormatReduceFactor
    • TFormatInfo实现了uint32_t GetTexelBlockSize()函数,用于返回该格式下数据占用的字节数
    • TAttachment构造函数中VKFormat替换成了TFormatInfo
    • TImage增加TSampleCountBits GetSampleCountBits()函数,用于获取采样数
    • VkVertexInputBindingDescriptionVkVertexInputAttributeDescription基本描述框图TurboDesign.drawwio整理完成
  • 2022/4/30 设计架构

    • TPipeline.h中增加TVertexAttributeTVertexBinding类,分别用于表示VkVertexInputAttributeDescriptionVkVertexInputBindingDescription
    • TPipeline.h中增加typedef enum class TVertexRate类,用于表示VkVertexInputRate
    • TPipeline.h中剔除VkVertexInputBindingDescriptionVkVertexInputAttributeDescription的使用,改为使用TVertexAttributeTVertexBinding
  • 2022/5/1 设计架构

    • TFormatInfo.h中,构造函数声明去掉explicit,使得可直接使用TFormatType进行隐示类型转换到TFormatInfo
    • TPipeline.h中增加typedef enum class TTopologyType用于对应VkPrimitiveTopology
    • TPipeline.h中对于VkPrimitiveTopology替换成使用TTopologyType
    • TPipeline.h中增加typedef enum class TPolygonMode用于对应VkPolygonMode
    • TPipeline.h中对于VkPolygonMode替换成使用TPolygonMode
    • TPipeline.h中增加typedef enum TCullModeBits用于对应VkCullModeFlagBits
    • TPipeline.h中增加typedef VkFlags TCullModes用于对应VkCullModeFlags
    • TPipeline.h中对于VkCullModeFlags替换成使用TCullModes
    • TPipeline.h中增加typedef enum class TFrontFace用于对应VkFrontFace
    • TPipeline.h中对于VkFrontFace替换成使用TFrontFace
    • 创建TGraphicsPipeline继承自TPipeline,将原先TPipeline中有关图形管线的内容搬到了TGraphicsPipeline
  • 2022/5/2 设计架构

    • TGraphicsPipeline中增加bool multisampleEnableTSampleCountBits sample的成员变量,提供对Multisample特性的支持
    • TCommandBuffer中增加TRenderPass *currentRenderPassTPipeline *currentPipeline的成员变量,提供对当前使用的RenderPassPipeline的引用
  • 2022/5/3 设计架构

    • TCommandBuffer中实现了void Turbo::Core::TCommandBuffer::NextSubpass()的成员函数,提供对vkCmdNextSubpass(...)特性的支持
    • Turbo核心现已支持多Subpass渲染
    • TRenderPassTPipelineType转移到了TSubpass中,符合Vulkan标准
    • TPipeline.h中新增typedef enum TPipelineStageBitstypedef VkFlags TPipelineStages,对应VulkanVkPipelineStageFlagBitsVkPipelineStageFlags
    • Turbo.h中新增typedef enum TAccessBitstypedef VkFlags TAccess,对应VulkanVkAccessFlagBitsVkAccessFlags
    • 新增TBarrier.hTBarrier.cpp,用于实现VkMemoryBarrierVkBufferMemoryBarrierVkImageMemoryBarrier 未完待续
  • 2022/5/4 设计架构

    • TBarrier.h中增加了TBarrierTMemoryBarrierTBufferMemoryBarrierTImageMemoryBarrier的成员函数,提供对VkMemoryBarrierVkBufferMemoryBarrierVkImageMemoryBarrier特性的支持
    • TImageView中增加了获取成员变量的方法
    • TCommandBuffer中增加并实现如下函数
    void PipelineBarrier(TPipelineStages srcStages, TPipelineStages dstStages, std::vector<TMemoryBarrier> &memoryBarriers, std::vector<TBufferMemoryBarrier> &bufferBarriers, std::vector<TImageMemoryBarrier> &imageBarriers);
    void PipelineMemoryBarrier(TPipelineStages srcStages, TPipelineStages dstStages, TMemoryBarrier &memoryBarrier);
    void PipelineBufferBarrier(TPipelineStages srcStages, TPipelineStages dstStages, TBufferMemoryBarrier &bufferBarrier);
    void PipelineImageBarrier(TPipelineStages srcStages, TPipelineStages dstStages, TImageMemoryBarrier &imageBarrier);
    void TransformImageLayout(TPipelineStages srcStages, TPipelineStages dstStages, TAccess srcAccess, TAccess dstAccess, TImageLayout oldLayout, TImageLayout newLayout, TImage *image, TImageAspects aspects, uint32_t baseMipLevel, uint32_t levelCount, uint32_t baseArrayLayer, uint32_t layerCount);
    void TransformImageLayout(TPipelineStages srcStages, TPipelineStages dstStages, TAccess srcAccess, TAccess dstAccess,TImageLayout oldLayout, TImageLayout newLayout, TImageView *imageView);
  • 2022/5/5 设计架构

    • TCommandBuffer中增加并实现如下
    void FillBuffer(TBuffer *buffer, TDeviceSize offset = 0, TDeviceSize size = VK_WHOLE_SIZE, uint32_t data = 0);
    void FillBuffer(TBuffer *buffer, TDeviceSize offset = 0, TDeviceSize size = VK_WHOLE_SIZE, float data = 0.0f);
    void UpdateBuffer(TBuffer *buffer, TDeviceSize offset, TDeviceSize size, const void *data);
    void CopyBuffer(TBuffer *srcBuffer, TBuffer *dstBuffer, TDeviceSize srcOffset, TDeviceSize dstOffset, TDeviceSize size);
    void ClearColorImage(TImage *image, TImageLayout layout, float r, float g, float b, float a, TImageAspects aspects, uint32_t baseMipLevel, uint32_t levelCount, uint32_t baseArrayLayer, uint32_t layerCount);
    void ClearColorImage(TImage *image, TImageLayout layout, float r, float g, float b, float a, TImageAspects aspects);
    void ClearColorImage(TImageView *imageView, TImageLayout layout, float r = 0, float g = 0, float b = 0, float a = 0);
    void ClearDepthStencilImage(TImage *image, TImageLayout layout, float depth, uint32_t stencil, TImageAspects aspects, uint32_t baseMipLevel, uint32_t levelCount, uint32_t baseArrayLayer, uint32_t layerCount);
    void ClearDepthStencilImage(TImage *image, TImageLayout layout, float depth, uint32_t stencil, TImageAspects aspects);
    void ClearDepthStencilImage(TImageView *imageView, TImageLayout layout, float depth = 0, uint32_t stencil = 0);
    void ClearImage(TImage *image, TImageLayout layout, float r, float g, float b, float a, float depth, uint32_t stencil, TImageAspects aspects, uint32_t baseMipLevel, uint32_t levelCount, uint32_t baseArrayLayer, uint32_t layerCount);
    void ClearImage(TImage *image, TImageLayout layout, float r, float g, float b, float a, float depth, uint32_t stencil, TImageAspects aspects);
    void ClearImage(TImageView *imageView, TImageLayout layout, float r = 0, float g = 0, float b = 0, float a = 0, float depth = 0, uint32_t stencil = 0);
    • TDeviceQueue增加void WaitIdle()成员函数
    • TDevice增加void WaitIdle()成员函数
    • TImage增加TImageUsages GetUsages()uint32_t GetMipLevels()uint32_t GetArrayLayers(); 成员函数
    • TFormatInfo.h中将typedef enum TFormatDataType修改成typedef enum TFormatDataTypeBits、增加typedef VkFlags TFormatDataTypes声明
    • TFormatInfo中增加TFormatDataTypes GetFormatDataType()成员函数,用于获取格式所对应的的数据类型(主要用于ClearColor中)
  • 2022/5/6 设计架构

    • TFormatInfo增加typedef enum TFormatFeatureBitstypedef VkFlags TFormatFeatures用于对应VkFormatFeatureFlagBitsVkFormatFeatureFlags
    • TFormatInfo增加如下函数:
    TFormatFeatures GetlLinearFeatures(TPhysicalDevice *physicalDevice);
    TFormatFeatures GetOptimalFeatures(TPhysicalDevice *physicalDevice);
    TFormatFeatures GetlBufferFeatures(TPhysicalDevice *physicalDevice);

    用于获取VkFormatProperties对应的数据

    • 解决了TCommandBuffer::BeginRenderPass(...)ClearColor不生效的问题(考虑ClearColor的颜色声明放到TAttachment中,或者BeginRenderPass(...)提供颜色设置接口)
    • TCommandBuffer中实现了如下指令函数:
    void CopyBufferToImage(TBuffer *srcBuffer, TImage *dstImage, TImageLayout layout, TDeviceSize bufferOffset, uint32_t bufferRowLength, uint32_t bufferImageHeight, TImageAspects aspects, uint32_t mipLevel, uint32_t baseArrayLayer, uint32_t layerCount, int32_t imageOffsetX, int32_t imageOffsetY, int32_t imageOffsetZ, uint32_t imageWidth, uint32_t imageHeight, uint32_t imageDepth);
    void CopyImageToBuffer(TImage *srcImage, TImageLayout layout, TBuffer *dstBuffer, TDeviceSize bufferOffset, uint32_t bufferRowLength, uint32_t bufferImageHeight, TImageAspects aspects, uint32_t mipLevel, uint32_t baseArrayLayer, uint32_t layerCount, int32_t imageOffsetX, int32_t imageOffsetY, int32_t imageOffsetZ, uint32_t imageWidth, uint32_t imageHeight, uint32_t imageDepth);
    void CopyImage(TImage *srcImage, TImageLayout srcLayout, TImage *dstImage, TImageLayout dstLayout, TImageAspects srcAspects, uint32_t srcMipLevel, uint32_t srcBaseArrayLayer, uint32_t srcLayerCount, int32_t srcImageOffsetX, int32_t srcImageOffsetY, int32_t srcImageOffsetZ, TImageAspects dstAspects, uint32_t dstMipLevel, uint32_t dstBaseArrayLayer, uint32_t dstLayerCount, int32_t dstImageOffsetX, int32_t dstImageOffsetY, int32_t dstImageOffsetZ, uint32_t width, uint32_t height, uint32_t depth);
    • Turbo.h中增加如下声明:
    #if defined(_WIN16) || defined(_WIN32) || defined(_WIN64)
    #define TURBO_PLATFORM_WINDOWS
    #elif defined(__APPLE__)
    #define TURBO_PLATFORM_APPLE
    #elif defined(ANDROID) || defined(__ANDROID__)
    #define TURBO_PLATFORM_ANDROID
    #elif defined(__linux) || defined(__linux__)
    #define TURBO_PLATFORM_LINUX
    #elif defined(__unix) || defined(__unix__)
    #define TURBO_PLATFORM_UNIX
    #else
    #define TURBO_PLATFORM_UNDEFINED
    #endif
    • TDescriptor.h中的typedef enum class TShaderDataType内容重命名。声明有冲突
    • Turbo中新增Turbo::Extension命名空间
    • 开始修缮TSurface.h将其加入Turbo::Extension命名空间中 未完待续
  • 2022/5/7 设计架构

    • TSurface.hTurbo::Core::TImageUsageFlags TSurface::GetSupportedUsageFlags()修改成Turbo::Core::TImageUsages GetSupportedUsages()
    • TSurface.h中增加如下:
    typedef enum TSurfaceTransformBits;
    typedef VkFlags TSurfaceTransforms;
    typedef enum TCompositeAlphaBits;
    typedef VkFlags TCompositeAlphas;
    typedef enum class TPresentMode;
    uint32_t GetCurrentWidth();
    uint32_t GetCurrentHeight();
    uint32_t GetMinWidth();
    uint32_t GetMinHeight();
    uint32_t GetMaxWidth();
    uint32_t GetMaxHeight();
    • TColorSpace类和TSurfaceFormat转移到TSurface.h中,并将TColorSpace.h/.cppTSurfaceFormat.h/.cpp移除

    • TSurface.h修缮完成

    • 开始修缮TSwapchain.h将其加入Turbo::Extension命名空间中 未完待续

    • TImage.h中加入void *Map()void Unmap()成员函数,用于映射host可访问内存

    • TImage.h中加入Turbo::Extension::TSwapchain的声明和TImage()默认无参构造函数,用于Turbo::Extension::TSwapchain构建TSwaphainImage,其为TImage的友元类

    • main.cpp中将GPU图片拷贝到CPU的纯Vulkan代码改成Turbo规范

    • 有些窗口库创建完窗口直接返回VkSurfaceKHR,所以TSwapchain需要对外提供一个接口构造函数TSwapchain(TDevice* device, VkSurfaceKHR)用于接收外部创建好的VkSurfaceKHR 未完待续

  • 2022/5/8 设计架构

    • 之前 TSwapchain对外部提供的VkSurfaceKHR的接口改成由TSurface提供,TSwapchain统一使用TSurface
    • TSwapchain修缮完毕
    • TSwapchain中增加VkSwapchainKHR GetVkSwapchainKHR()成员函数
    • TResult新增TResult::NOT_READYTResult::SUBOPTIMAL用于Turbo::Extension::TSwapchain::AcquireNextImage(...)的返回结果
    • ./thirdparty新增SDL2库用于创建窗口
    • TDeviceInternalCreate()中有Bug,已修复
    • TCommandBufferBeginRenderPass()中有Bug,已修复
    • TSemaphore中的VkPipelineStageFlags改成TPipelineStages,统一Turbo标准
    • TDeviceQueue中增加TResult Present(Turbo::Extension::TSwapchain *swapchain, uint32_t imageIndex)函数用于调用vkQueuePresentKHR
    • TDeviceQueue中增加bool IsSupportSurface(Turbo::Extension::TSurface *surface)判断该队列是否支持该TSurface
  • 2022/5/9 设计架构

    • 进入调整阶段
    • TCommandBuffer中有关VkCmd...的成员函数前面加上Cmd...的前缀,与CommandBuffer::Begin()CommandBuffer::End()等非命令成员函数分开,直接告诉用户哪些会是VkCmd...哪些不是
    • TFormatInfo中删除有关TFormatFeatureFlags的成员变量,没用
  • 2022/5/10 设计架构

    • TBuffer中增加typedef enum class TIndexType表明索引缓存的数据类型
    • TCommandBuffer中增加如下函数:
    void CmdBindIndexBuffer(TBuffer *buffer, TDeviceSize offset = 0, TIndexType indexType = TIndexType::UINT32);
    void CmdDrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);

    用于索引渲染

    • TAllocator平台相关使用Turbo.h中定义的宏
    • 开始整理TException的输出信息,和优化TException
    • TFormatInfo增加Get...Features(TDevice* device)版本成员函数
  • 2022/5/11 设计架构

    • 开始实现纹理特性
    • TDescriptor.h中增加TCombinedImageSamplerDescriptor类,用于表示VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
    • TShader.h中增加std::vector<TCombinedImageSamplerDescriptor *> combinedImageSamplerDescriptors成员变量
    • 新增TSampler.h中增加TSampler类并增加如下枚举定义:
    typedef enum class TFilter;//对应VkFilter
    typedef enum class TMipmapMode;//对应VkSamplerMipmapMode
    typedef enum class TAddressMode;//对应VkSamplerAddressMode
    typedef enum class TBorderColor;//对应VkBorderColor
    • 新增TDescriptorSet中增加void BindData(uint32_t binding, uint32_t arrayElement, TImageView *imageView, TSampler *sampler),仅用于测试
    • 将原先的SDL2窗口库换成GLFW窗口库,使用SDL2会有main入口函数重定向,并且终端的输出信息不显示等很奇怪的问题。
    • 纹理特性初步完成
    • Descriptor设计有重大逻辑漏洞,需要重构
  • 2022/5/12 设计架构

    • 开始重构Descriptor
    • TShader中移除有关TDescriptorSetLayout创建相关,相关任务转移到TPipeline中进行,TShader仅用于创建VkShaderModule和收集Descriptor数据
    • TDescriptorSetLayout中移除有关TShader成员
    • TDescriptorSetLayout中增加uint32_t GetSet()成员函数
    • TDescriptor中增加TShader*成员变量,用于指代该描述符所属哪个TShader
    • TShader中增加如下函数:
    const std::vector<TUniformBufferDescriptor *> &GetUniformBufferDescriptors;
    const std::vector<TCombinedImageSamplerDescriptor *> &GetCombinedImageSamplerDescriptors;

    目前Turbo只实现了这两个,更多待以后实现

    • (转移到TPipelineLayout中) 目前TPipeline中增加了std::vector<TDescriptorSetLayout *> descriptorSetLayouts成员变量,用于存储当前管线的描述符集合布局
    • 新增TPipelineLayout
    • 新增TPipeline中开始使用TPipelineLayout
    • 新增TPipelineDescriptorSet
    • TDescriptorPool适配TPipelineDescriptorSet
    • TDescriptorSet中增加uint32_t GetSet()成员函数
    • TCommandBuffer中增加void CmdBindPipelineDescriptorSet(TPipelineDescriptorSet* pipelineDescriptorSet)成员函数,用于适配TPipelineDescriptorSet
    • Descriptor目前初步重构完成
  • 2022/5/13 设计架构

    • TResult::SUBOPTIMAL更改成TResult::MISMATCH
    • TSurface中有关获取当前大小的函数可以动态获取当前大小了,不需要delete之后重新new
    • TSwapchain中增加TSwapchain(TSwapchain *oldSwapchain)构造函数,用于重新创建TSwapchain
  • 2022/5/14 设计架构

    • TDescriptor.h中的typedef enum class TShaderDataType更改成typedef enum class TDescriptorDataType
    • TDescriptor.h中增加class TSampledImageDescriptorTSamplerDescriptor,用于对应VkDescriptorType::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVkDescriptorType::VK_DESCRIPTOR_TYPE_SAMPLER
    • TShader中增加std::vector<TSampledImageDescriptor *> sampledImageDescriptorsstd::vector<TSamplerDescriptor *> samplerDescriptors
    • 开始修缮TDescriptorSet中的void BindData(...);使其规范化,TPipelineDescriptorSet同理:
    void BindData(uint32_t binding, uint32_t dstArrayElement, std::vector<TBuffer *> buffers);//for uniform buffer
    void BindData(uint32_t binding, uint32_t dstArrayElement, std::vector<std::pair<TImageView *, TSampler *>> &combinedImageSamplers);//combined image sampler
    void BindData(uint32_t binding, uint32_t dstArrayElement, std::vector<TImageView *> &imageViews);//sampled image
    void BindData(uint32_t binding, uint32_t dstArrayElement, std::vector<TSampler *> &sampler);//sampler
  • 2022/5/16 设计架构

    • TCommandBuffer实现CmdBlitImage等价于vkCmdBlitImage
    • engine/下新建core文件夹用于存放Turbo核心
    • engine/core/include/Turbo.h更改成TCore.h
    • engine/core/include/Turbo.cpp更改成TCore.cpp
    • 现在engine/core将会输出单独的库文件作为Turbo的核心
    • TFormatInfo中的TFormatFeatures Get...Features(TPhysicalDevice *physicalDevice)转移到了TPhysicalDevice
  • 2022/5/17 设计架构

    • TPhysicalDevice中增加如下函数(用于获取某一特定纹理格式的图片的限制属性):
    TExtent3D GetMaxImageExtent(TFormatType formatType, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    TExtent3D GetMaxImageExtent(TFormatInfo &format, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    uint32_t GetMaxImageMipLevels(TFormatType formatType, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    uint32_t GetMaxImageMipLevels(TFormatInfo &format, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    uint32_t GetMaxImageArrayLayers(TFormatType formatType, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    uint32_t GetMaxImageArrayLayers(TFormatInfo &format, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    TSampleCounts GetSupportImageSampleCounts(TFormatType formatType, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags); 
    TSampleCounts GetSupportImageSampleCounts(TFormatInfo &format, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    TDeviceSize GetMaxImageResourceSize(TFormatType formatType, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    TDeviceSize GetMaxImageResourceSize(TFormatInfo &format, TImageType imageType, TImageTiling tiling, TImageUsages usages, VkImageCreateFlags imageFlags);
    • TCommandBuffer实现如下函数
    void CmdResolveImage(TImage *srcImage, TImageLayout srcLayout, TImage*dstImage, TImageLayout dstLayout, TImageAspects srcAspects, uint32_t srcMipLevel, uint32_t srcBaseArrayLayer, uint32_t srcLayerCount, int32_t srcOffsetX, int32_t srcOffsety, int32_t srcOffsetZ, TImageAspects dstAspects, uint32_t dstMipLevel, uint32_t dstBaseArrayLayer, uint32_t dstLayerCount, int32_t dstOffsetX, int32_t dstOffsety, int32_t dstOffsetZ, uint32_t width, uint32_t height, uint32_t depth);
    void CmdSetLineWidth(float lineWidth);
    • TCommandBuffer中的void CmdBindPipelineDescriptorSet(uint32_t firstSet, TPipelineDescriptorSet *pipelineDescriptorSet);修改成void CmdBindPipelineDescriptorSet(TPipelineDescriptorSet *pipelineDescriptorSet);
  • 2022/5/18 设计架构

    • TDescriptor.h中增加class TNaNDescriptor,用于表示无效占位描述符。
    • TDeviceQueue.h:TDeviceQueue::Submit(...)函数中有关TSemaphore数组引用改成数组指针
    • tinygltf库中拷贝stb_image.h, stb_image_write.h, json.hpptiny_gltf.h./engine/include
  • 2022/5/19 设计架构

    • TGraphicsPipeline::InternalCreate()中增加对于多个fragment output interface state(片元着色器的输出)应该对应相同个数的VkPipelineColorBlendStateCreateInfo::attachmentCount的适配。(也许这不是最优解,blend目前未想好如何设计)
    • TShader中增加如下函数:
    std::vector<TInterface> GetInputs();
    std::vector<TInterface> GetOutputs();
    TShaderType GetType();
  • 2022/5/20 设计架构

    • TRenderPass中增加TSubpass GetSubpass(uint32_t subpass)成员函数
    • 增加glm第三方库
  • 2022/5/21 设计架构

    • 移除原先拷贝的tinygltf头文件,将tinygltf库加到./thirdparty文件夹下
    • 成功渲染Suzanne
  • 2022/5/22 设计架构

    • imgui库加到./thirdparty文件夹下
    • KTX-Software库加到./thirdparty文件夹下
    • TDescriptor增加TPushConstantDescriptor用于描述VulkanPush Constant
    • TShader增加std::vector<TPushConstantDescriptor *> pushConstantDescriptors和相应的获取函数。
    • TPipelineLayoutTPipeline中适配TPushConstantDescriptors
    • TUniformBufferDescriptorTPipeline中增加uint32_t size成员属性和相应的获取函数,用于表示数据块大小
    • TCommandBuffer中增加void CmdPushConstants(...)成员函数,对应vkCmdPushConstants(...)
  • 2022/5/23 设计架构

    • TBuffer中增加void Flush(...)成员函数,用于刷新数据到GPU domain
    • TSubpassGetDepthStencilAttachmentReference()Bug,现已修改完毕
  • 2022/5/24 设计架构

    • TGraphicsPipeline中移除std::vector<TViewport> &viewportsstd::vector<TScissor> &scissors成员,由于核心创建的PipelineViewportScissor都是动态状态,Vulkan会忽略VkPipelineViewportStateCreateInfo::pViewportsVkPipelineViewportStateCreateInfo::pScissors
    • TGraphicsPipeline中增加typedef enum class TCompareOp声明,对应VkCompareOp
    • TGraphicsPipeline中增加typedef enum class TStencilOp声明,对应VkStencilOp
    • TGraphicsPipeline中增加对深度测试和模板测试支持
    • 调整TGraphicsPipeline构造函数的参数顺序,填入默认值
  • 2022/5/25 设计架构

    • 成功渲染KTX纹理
  • 2022/5/27 设计架构

    • 成功渲染KTXCubemap纹理
    • 开始适配几何管线的Blend
    • TGraphicsPipeline中增加typedef enum class TLogicOp 声明,对应VkLogicOp
    • TGraphicsPipeline中增加typedef enum class TBlendFactor 声明,对应VkBlendFactor
    • TGraphicsPipeline中增加typedef enum class TBlendOp 声明,对应VkBlendOp
    • TGraphicsPipeline构造函数中增加混合相关参数
  • 2022/5/28 设计架构

    • 使用Turbo核心成功渲染IMGUI
  • 2022/5/29 设计架构

    • 开始适配input attachment
  • 2022/5/30 设计架构

    • TDescriptor中增加class TInputAttachmentDescriptor 对应VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
    • TShader中增加std::vector<TInputAttachmentDescriptor *> inputAttachmentDescriptors; 用于存input attachment,并增加const std::vector<TInputAttachmentDescriptor *> &GetInputAttachmentDescriptors();成员函数用于获取相关数据
    • TShader中增加对于input attachment的解析
    • TPipeline中增加对于input attachment的解析
    • TPipelineDescriptorSet::BindData(...)中增加对于input attachment的适配
    • TDescriptorSetLayout中增加TDescriptorType GetDescriptorType(uint32_t binding)成员函数,用于获取特性binding对应的描述符类型
    • input attachment基本适配完成
  • 2022/6/1 设计架构

    • 开始FrameGraph的设计,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
  • 2022/6/2 设计架构

    • 设计FrameGraph,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
  • 2022/6/3 设计架构

    • 设计FrameGraph,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
  • 2022/6/4 设计架构

    • 设计FrameGraph,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
  • 2022/6/5 设计架构

    • 设计FrameGraph,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
    • 最基本的FrameGraph初步设计完成,具体请参看./docs/TurboDesign.drawio:FrameGraph章节
  • 2022/6/6 设计架构

    • 开始实现FrameGraph,详细设计请参看./docs/TurboDesign.drawio:FrameGraph章节
    • FrameGraph,将会是一个独立的模块,不会依赖任何第三方库,甚至是Turbo,按照常见的标准容器实现。将会输出名为TFrameGraph的静态库文件
    • engine文件夹下创建/framegraph文件夹,FrameGraph相关代码将会在这里实现
    • FrameGraph将会在Turbo::FrameGraph命名空间下实现
    • 增加TFrameGraph.hTFrameGraph.cpp
  • 2022/6/7 设计架构

    • 将第三方库配置成Submodule,glm库好像有问题,MVP矩阵好像不对导致渲染结果有问题,应该不是核心的问题,该问题先忽略,等到FrameGraph写完,开始写例子的时候再统一解决,加入Issue
    • 创建./Turbo/samples文件夹,用于存放示例代码。
    • FrameGraphvoid Turbo::FrameGraph::TFrameGraph::Compile()未实现待实现
    • FrameGraphvoid Turbo::FrameGraph::TFrameGraph::Execute()未实现待实现
    • ./Turbo/samples种增加HelloTriangle示例
    • ./Turbo/samples种增加PureHelloTriangle示例
    • ./Turbo/samples种增加FrameGraph测试示例
  • 2022/6/13 设计架构

    • 适配Linux系统(基于Deepin
    • Turbo::Core::TAllocator::Allocate(...)中增加对于Linux的内存分配支持
    • TSurface中增加对于Linux的支持:
    //for wayland
    #include <wayland-client.h>
    #include <vulkan/vulkan_wayland.h>
    
    //for xcb
    #include <xcb/xcb.h>
    #include <vulkan/vulkan_xcb.h>
    
    //for xlib
    #include <X11/Xlib.h>
    #include <vulkan/vulkan_xlib.h>

    TSurface中增加TSurface(Turbo::Core::TDevice *device, wl_display *display, wl_surface *surface)构造函数,用于适配wayland TSurfaceInternalCreate()适配Linuxwayland TSurfaceGetSurfaceSupportQueueFamilys()适配Linuxwayland

  • 2022/6/15 设计架构

    • 适配TSurface基于xcb
    • TSurface中增加xcb_connection_t *connectionxcb_window_t window成员变量,用于适配xcb
    • TSurface中增加适配xcb相应的构造函数
    • TSurfaceInternalCreate(...)中通过vkCreateXcbSurfaceKHR(...)适配xcb
    • 适配TSurface基于xlib
    • TSurface中增加Display *xlibDpy = nullptrWindow xlibWindow成员变量,用于适配xlib
    • TSurface中增加适配xlib相应的构造函数
    • TSurfaceInternalCreate(...)中通过vkCreateXlibSurfaceKHR(...)适配xlib
    • TSwapchainInternalCreate(...)中会去判断当前给的图片数量是否合法(判断数量是否在[最小值,最大值]之间),但是有些显卡设备返回的最小值为有效数据,最大值为0,比如Intel(R) HD Graphics 6000 (BDW GT3)集显设备就是出现最小值为3,最大值为0的情况,由此适配修改Turbo::Extension::TSurface::GetSurfaceCapabilities()函数
    • 适配修改Turbo::Extension::TSurface::GetSurfaceCapabilities()函数,对应修改maxImageCount
    • 修改Turbo中对于物理设备的计分算法,最好的图形设备没有返回预计的显卡,而返回了一个CPU,void Turbo::Core::TPhysicalDevice::CalculatePerformanceScore()中对于CPU的分值给的太高了,减小
  • 2022/6/16 设计架构

    • 修改./samples下的示例,使其适配Linux
    • ./samples中增加PureCombinedImageSampler.cpp例子,用于演示带有纹理图片的采样器
  • 2022/6/29 设计架构

    • FrameGraph将会转至c++20标准,将会尝试使用conceptmetaTemplate方式编写
    • samples中添加PureSeparateImageSampler示例,用于展示分离式纹理采样器的使用
    • 对于资源的读写将会改用相对路径
    • samples中添加PureIndexDraw示例,用于展示索引渲染
  • 2022/6/30 设计架构

    • TFrameGraph中的拷贝构造/赋值移动构造/赋值的相关函数使用delete声明去掉
    • TFrameGraph::AdddPass(...)中对于模板形参Setup,Execute做出限制,限制为可调用实体,对Execute的大小作出限制,最大为EXECUTE_MAX_LOAD
    • TFrameGraph::TPassAgency(...)中对于形参和模板形参Execute,由于是右值万能引用,所以使用std::forward(...)来完美转发
    • TFrameGraph::CreatePassNode(...)TAgency*模板参数修改为std::unique_ptr<TAgency>&& agency
    • TPassNodeTAgency*相成员修改为std::unique_ptr<TAgency>
    • 去掉TPassNode中析构函数的实现,使用编译器默认生成的
    • TFrameGraph::AddPass(...)中增加如下代码,调用初始化入口函数:
    std::invoke(setup, builder, pass_agency->GetData())
    • 增加TAgency的构造/析构函数
  • 2022/7/4 设计架构

    • FrameGraph设计参考Filement做出的修改意见目前写在各行的注释中(//*...),考虑是否采纳,之后需要同步修改FrameGraph的设计文档
    • FilamentFrameGraph结构分析加入FrameGraph文档,作为参考,与c++新标准的模板元编程和concept结合设计
  • 2022/7/5 设计架构

    • 开始解析Filament 1.9.9FrameGraph(截止2022/7/5 filament的最新版本为1.24对于FrameGraph做了很多更新,但总体思路没变),请在./docs/TurboDesign.drawio::FrameGraph的右侧查看(注:重点过程被标注为橘黄色)
  • 2022/7/6 设计架构

    • 开始解析FilamentFrameGraph::compile()阶段,请在./docs/TurboDesign.drawio::FrameGraph的右侧查看
  • 2022/7/7 设计架构

    • 开始解析FilamentFrameGraph::execute()阶段,请在./docs/TurboDesign.drawio::FrameGraph的右侧查看
  • 2022/7/8 设计架构

    • 解析FilamentFrameGraph::execute()阶段,reset()函数调用位置标错了,修改回来。
    • 开始解析FilamentFrameGraph::execute()阶段的resources.get(data.rt);,请在./docs/TurboDesign.drawio::FrameGraph的右侧查看
    • 至此FilamentFrameGraph核心解析完毕,请在./docs/TurboDesign.drawio::FrameGraph的右侧查看
    • TFrameGraph.hpp中增加如下,用于表示无效ID,并用该值初始化所有ID:
    constexpr uint32_t TURBO_NVALID_ID = std::numeric_limits<uint32_t>::max();
    • TFrameGraph::AddPass(name, setup, execute)中的execute回调中TResources使用const声明,对应的TBuilder::Get(...)等函数需要适配,碰到再改
    • TFrameGraph::TBuilder::Create(...)中的Virtualizable模板形参改回T
    • TFrameGraph::Create(...)中的Virtualizable模板形参改回T
  • 2022/7/9 设计架构

    • 修缮TFrameGraph::TBuilder::Create(...)函数
    • TFrameGraph::TResourceAgency(...)中的Virtualizable模板形参改回T
    • TFrameGraph::TResourceAgency(...)中增加std::string name属性,用于存储资源名称
    • TFrameGraph::TResourceAgency中的T *resource改为T resource
    • 新增TVirtualResourceAgency类继承自TAgency,将TResourceAgency改为继承自T TVirtualResourceAgency
    • TFrameGraph::std::vector<TAgency *> *agencys成员变量改成TFrameGraph::std::vector<TVirtualResourceAgency *> *agencys
    • TNode中的name成员变量移动到TPassNode中,TResourceNoded的名称位于其资源代理中
    • TResourceNode中的TAgencyID agencyID成员变量换成TVirtualResourceAgency*指向对应的资源代理
    • TResourceNode中的TAgencyID agencyID成员变量换成TVirtualResourceAgency*指向对应的资源代理
    • TFrameGraph::TBuilder::Create(...)函数基本修缮完成
    • 修缮TFrameGraph::TBuilder::Write(...)函数
    • TFrameGraph中增加TResourceNode &GetResourceNode(TResource resource)函数
    • TVirtualResourceAgency中增加TVersion version成员变量,并增加相应的Set/Get函数
    • TResourceNode中增加TVirtualResourceAgency *GetResourceAgency()函数
    • 遗弃TFrameGraph中的CloneResourceNode(...)函数
    • 遗弃TFrameGraph中的GetResourceAgency(...)函数
    • TFrameGraph中增加bool IsValid(TPass pass)函数
    • TFrameGraph::TBuilder::Write(...)函数基本修缮完成
    • 修缮TResources::Get(TResource resource)函数
    • TResourceNode中增加TPass writer成员变量,用与表示资源的写入者
  • 2022/7/10 设计架构

    • TVirtualResourceAgency类中增加TPass firstUserTPass lastUser用于表示第一次和最后一次使用该资源的使用者
    • TVirtualResourceAgency类中增加如下,用于表示该PassNode运行时需要创建和销毁的资源:
    std::vector<TVirtualResourceAgency*> devirtualizes;
    std::vector<TVirtualResourceAgency*> destroies;
    • TVirtualResourceAgency增加如下成员函数:
    virtual void Create() = 0;
    virtual void Destroy() = 0;
    • TResourceAgency增加如下成员函数:
    virtual void Create() override;
    virtual void Destroy() override;
    • 增加class TPassExecutorAgency类,用于定义pass代理的Executor(...)的虚函数回调
    • 修改class TPassAgency类,继承自TPassExecutorAgency,并实现Executor(...)虚函数回调
    • TPassNode类中的std::unique_ptr<TAgency> agency修改成std::unique_ptr<TPassExecutorAgency> agency;
    • TFrameGraph类中的void Execute();成员函数修改成void Execute(void *context);
    • 修改TFrameGraph::CreatePassNode(...)适配新的TPassExecutorAgency
    • 修改TPassNode构造函数,适配新的TPassExecutorAgency
    • TFrameGraph大框架基本上写完了,剩下的就是ResourcePassNode等特化和引擎提供的特性资源类,比如PresentNode(PassNode的特化,有PresentData)Texture(纹理资源),DepthTexture(深度纹理),ColorTexture(颜色纹理)
    • 接下来需要实现TFrameGraphBlackboard特性
  • 2022/7/11 设计架构

    • 实现FrameGraphBlackboard特性
    • 实现TFrameGraph中增加TBlackboard
    • TFrameGraph中增加TBlackboard类成员变量
    • TFrameGraph中增加TBlackboard &GetBlackboard()成员函数
    • 需要特化PresentPassNode,显示节点一般作为结束节点,但是FrameGraph演讲中并没有显示的给出显示阶段往哪个资源身上写入,所以目前显示节点没有写入,也就是没有出度,没有出度在FrameGraph::Compile()阶段就会被剔除,这也许会造成一连串的剔除,所以需要专门特化一个PresentPassNode或是采用SideEffect解决(目前TFrameGraph并没有引入SideEffect特性) 当前的算法正常并不会剔除PresentPassFrameGraph目前的剔除算法首先基于资源引用数进行的剔除,目前显示节点不向任何资源写入,只是读取资源,正常不会发生递归性的一连串剔除
    • TFrameGraph还需要经过测试,目前还没有严格测试
  • 2022/7/12 设计架构

    • 修复Bug:TFrameGraph::Compile()中计算资源的创建者和销毁者时,FrameGraph的所有资源可能会被全部剔除,造成空图,这会导致资源的创建者和销毁者为无效节点(比如强制PresentPass往资源中写入,由于PresentPass为结束节点,正常不应该再写入资源,这时该写入的资源没有出度,也就是没有人使用该节点,这时Compile()阶段会发生资源剔除,导致一连串的资源剔除,最坏的情况会剔除成空图,这时资源的创建者和销毁者不会被赋值,从而导致创建者和销毁者的节点id无效非法)

    • 有关TFrameGraph如何使用和测试,请参考./samples/FrameGraphSample.cpp

    • TFrameGraph::Execute(...)中增加对PassNode的引用数的判断,如果引用数大于零,说明该节点有使用者,运行节点的Executor回调,否则没有使用,不去调用回调。(注意:这将会导致PresentNode的运行回调不会被调用,考虑使用SideEffect特性强制驱动,如果一个PassNodeSideEffect特性,说明在节点不会被剔除)

    • TPassNode中增加bool sideEffect成员变量

    • TFrameGraph::TBuilder中增加TBuilder &SideEffect();成员函数,用于设置PassNodesideEffect成员

    • TFrameGraph::Execute()中增加对于sideEffect的判断

  • 2022/7/13 设计架构

    • 修改SideEffect强制不剔除PassNode,应该修改其refCount
    • 移除TVirtualResourceAgency::SetVersion(...)函数,通过直接修改成员变量完成
    • 至此最基础的FrameGraph实现完成,接下来将会于./engine/include./engine/src中实现更高级的资源和特性(比如Surface,Material和各种Resource等)
  • 2022/7/16 设计架构

    • 修改./main.cpp中的绝对路径修改到相对路径
    • 开始尝试动态加载Vulkan库来获取函数
    • 核心中添加TVulkanLoader类用于实现VulkanLoader
    • 核心中添加TCore::TResult中增加UNIMPLEMENTED用于表示引擎未实现先关定义,请实现
  • 2022/7/17 设计架构

    • TVulkanLoader中增加如下私有函数,用于加载Vulkan API的函数:
    template <TLoaderType type, typename Function>
    Function LoadAll(void *context, const char*name);
    • TVulkanLoader中增加如下函数:
    void Load(TInstance *instance);
    void LoadAllInstanceFunctions(TInstance *instance);
    void LoadAllDeviceFunctions(TInstance *instance);
    
    template <typename Function>
    Function LoadInstanceFunction(TInstance *instance, const char *name);
    template <typename Function>
    Function LoadInstanceFunction(VkInstance instance, const char *name);
    template <typename Function>
    Function LoadDeviceFunction(TInstance*instance, const char*name);
    template <typename Function>
    Function LoadDeviceFunction(VkInstance instance, const char*name);
    TVersion GetVulkanVersion();
    • TInstance::InternalCreate()中增加对于TVulkanLoader的相关调用,用于加载Vulkan API函数
    • TInstance::InternalCreate()中对于vkCreateInstance的相关调用,更改成Turbo::Core::vkCreateInstance调用,并在之后调用TVulkanLoader::Instance()->LoadAll(this);用于获取所有Vulkan API函数
    • TInstance::IsSupportVulkan()中对于vkCreateInstance的相关调用,更改成使用TVulkanLoader调用
    • TInstance::GetVulkanInstanceVersion()中对于vkEnumerateInstanceVersion的相关调用,更改成使用TVulkanLoader调用
  • 2022/7/18 设计架构

    • TLayerInfo中使用TVulkanLoader调用相应函数
    • TExtensionInfo中使用TVulkanLoader调用相应函数
  • 2022/7/20 设计架构

    • TVulkanLoader加载vkEnumeratePhysicalDevices函数
    • TVulkanLoader加载vkGetPhysicalDeviceProperties函数
    • TVulkanLoader加载vkEnumerateDeviceLayerProperties函数
    • TVulkanLoader加载vkEnumerateDeviceExtensionProperties函数
    • TVulkanLoader加载vkGetPhysicalDeviceQueueFamilyProperties函数
    • TVulkanLoader加载vkGetPhysicalDeviceFeatures函数
    • TVulkanLoader加载vkGetPhysicalDeviceMemoryProperties函数
    • TPhysicalDevice::InternalCreate()使用Turbo::Core::vkEnumeratePhysicalDevices(...)函数
    • TFormatInfo::GetSupportFormats使用TVulkanLoader获取函数
    • TVulkanLoader加载vkCreateDevice函数
    • TVulkanLoader加载vkGetPhysicalDeviceFormatProperties函数
    • TVulkanLoader加载vkGetPhysicalDeviceImageFormatProperties函数
    • TDevice::InternalCreate()使用TVulkanLoader获取函数
    • TVulkanLoader增加如下成员函数:
    template <typename Function>
    Function LoadDeviceFunction(TDevice *device, const char *name);
    template <typename Function>
    Function LoadDeviceFunction(VkDevice device, const char *name);
    • TVulkanLoader提供专门TDevice/VkDevice设备的特定实现函数版本获取
    • TVulkanLoader加载vkDestroyDevice函数
    • TVulkanLoader加载vkGetPhysicalDeviceSparseImageFormatProperties函数
    • TVulkanLoader加载如下设备函数:
    extern VULKAN_DEVICE_API PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
    extern VULKAN_DEVICE_API PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
    extern VULKAN_DEVICE_API PFN_vkAllocateMemory vkAllocateMemory;
    extern VULKAN_DEVICE_API PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
    extern VULKAN_DEVICE_API PFN_vkBindBufferMemory vkBindBufferMemory;
    extern VULKAN_DEVICE_API PFN_vkBindImageMemory vkBindImageMemory;
    extern VULKAN_DEVICE_API PFN_vkCmdBeginQuery vkCmdBeginQuery;
    extern VULKAN_DEVICE_API PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
    extern VULKAN_DEVICE_API PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
    extern VULKAN_DEVICE_API PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
    extern VULKAN_DEVICE_API PFN_vkCmdBindPipeline vkCmdBindPipeline;
    extern VULKAN_DEVICE_API PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
    extern VULKAN_DEVICE_API PFN_vkCmdBlitImage vkCmdBlitImage;
    extern VULKAN_DEVICE_API PFN_vkCmdClearAttachments vkCmdClearAttachments;
    extern VULKAN_DEVICE_API PFN_vkCmdClearColorImage vkCmdClearColorImage;
    extern VULKAN_DEVICE_API PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
    extern VULKAN_DEVICE_API PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
    extern VULKAN_DEVICE_API PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
    extern VULKAN_DEVICE_API PFN_vkCmdCopyImage vkCmdCopyImage;
    extern VULKAN_DEVICE_API PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
    extern VULKAN_DEVICE_API PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
    extern VULKAN_DEVICE_API PFN_vkCmdDispatch vkCmdDispatch;
    extern VULKAN_DEVICE_API PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
    extern VULKAN_DEVICE_API PFN_vkCmdDraw vkCmdDraw;
    extern VULKAN_DEVICE_API PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
    extern VULKAN_DEVICE_API PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
    extern VULKAN_DEVICE_API PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
    extern VULKAN_DEVICE_API PFN_vkCmdEndQuery vkCmdEndQuery;
    extern VULKAN_DEVICE_API PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
    extern VULKAN_DEVICE_API PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
    extern VULKAN_DEVICE_API PFN_vkCmdFillBuffer vkCmdFillBuffer;
    extern VULKAN_DEVICE_API PFN_vkCmdNextSubpass vkCmdNextSubpass;
    extern VULKAN_DEVICE_API PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
    extern VULKAN_DEVICE_API PFN_vkCmdPushConstants vkCmdPushConstants;
    extern VULKAN_DEVICE_API PFN_vkCmdResetEvent vkCmdResetEvent;
    extern VULKAN_DEVICE_API PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
    extern VULKAN_DEVICE_API PFN_vkCmdResolveImage vkCmdResolveImage;
    extern VULKAN_DEVICE_API PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
    extern VULKAN_DEVICE_API PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
    extern VULKAN_DEVICE_API PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
    extern VULKAN_DEVICE_API PFN_vkCmdSetEvent vkCmdSetEvent;
    extern VULKAN_DEVICE_API PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
    extern VULKAN_DEVICE_API PFN_vkCmdSetScissor vkCmdSetScissor;
    extern VULKAN_DEVICE_API PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
    extern VULKAN_DEVICE_API PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
    extern VULKAN_DEVICE_API PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
    extern VULKAN_DEVICE_API PFN_vkCmdSetViewport vkCmdSetViewport;
    extern VULKAN_DEVICE_API PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
    extern VULKAN_DEVICE_API PFN_vkCmdWaitEvents vkCmdWaitEvents;
    extern VULKAN_DEVICE_API PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
    extern VULKAN_DEVICE_API PFN_vkCreateBuffer vkCreateBuffer;
    extern VULKAN_DEVICE_API PFN_vkCreateBufferView vkCreateBufferView;
    extern VULKAN_DEVICE_API PFN_vkCreateCommandPool vkCreateCommandPool;
    extern VULKAN_DEVICE_API PFN_vkCreateComputePipelines vkCreateComputePipelines;
    extern VULKAN_DEVICE_API PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
    extern VULKAN_DEVICE_API PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
    extern VULKAN_DEVICE_API PFN_vkCreateEvent vkCreateEvent;
    extern VULKAN_DEVICE_API PFN_vkCreateFence vkCreateFence;
    extern VULKAN_DEVICE_API PFN_vkCreateFramebuffer vkCreateFramebuffer;
    extern VULKAN_DEVICE_API PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
    extern VULKAN_DEVICE_API PFN_vkCreateImage vkCreateImage;
    extern VULKAN_DEVICE_API PFN_vkCreateImageView vkCreateImageView;
    extern VULKAN_DEVICE_API PFN_vkCreatePipelineCache vkCreatePipelineCache;
    extern VULKAN_DEVICE_API PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
    extern VULKAN_DEVICE_API PFN_vkCreateQueryPool vkCreateQueryPool;
    extern VULKAN_DEVICE_API PFN_vkCreateRenderPass vkCreateRenderPass;
    extern VULKAN_DEVICE_API PFN_vkCreateSampler vkCreateSampler;
    extern VULKAN_DEVICE_API PFN_vkCreateSemaphore vkCreateSemaphore;
    extern VULKAN_DEVICE_API PFN_vkCreateShaderModule vkCreateShaderModule;
    extern VULKAN_DEVICE_API PFN_vkDestroyBuffer vkDestroyBuffer;
    extern VULKAN_DEVICE_API PFN_vkDestroyBufferView vkDestroyBufferView;
    extern VULKAN_DEVICE_API PFN_vkDestroyCommandPool vkDestroyCommandPool;
    extern VULKAN_DEVICE_API PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
    extern VULKAN_DEVICE_API PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
    extern VULKAN_DEVICE_API PFN_vkDestroyDevice vkDestroyDevice;
    extern VULKAN_DEVICE_API PFN_vkDestroyEvent vkDestroyEvent;
    extern VULKAN_DEVICE_API PFN_vkDestroyFence vkDestroyFence;
    extern VULKAN_DEVICE_API PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
    extern VULKAN_DEVICE_API PFN_vkDestroyImage vkDestroyImage;
    extern VULKAN_DEVICE_API PFN_vkDestroyImageView vkDestroyImageView;
    extern VULKAN_DEVICE_API PFN_vkDestroyPipeline vkDestroyPipeline;
    extern VULKAN_DEVICE_API PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
    extern VULKAN_DEVICE_API PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
    extern VULKAN_DEVICE_API PFN_vkDestroyQueryPool vkDestroyQueryPool;
    extern VULKAN_DEVICE_API PFN_vkDestroyRenderPass vkDestroyRenderPass;
    extern VULKAN_DEVICE_API PFN_vkDestroySampler vkDestroySampler;
    extern VULKAN_DEVICE_API PFN_vkDestroySemaphore vkDestroySemaphore;
    extern VULKAN_DEVICE_API PFN_vkDestroyShaderModule vkDestroyShaderModule;
    extern VULKAN_DEVICE_API PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
    extern VULKAN_DEVICE_API PFN_vkEndCommandBuffer vkEndCommandBuffer;
    extern VULKAN_DEVICE_API PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
    extern VULKAN_DEVICE_API PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
    extern VULKAN_DEVICE_API PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
    extern VULKAN_DEVICE_API PFN_vkFreeMemory vkFreeMemory;
    extern VULKAN_DEVICE_API PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
    extern VULKAN_DEVICE_API PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
    extern VULKAN_DEVICE_API PFN_vkGetDeviceQueue vkGetDeviceQueue;
    extern VULKAN_DEVICE_API PFN_vkGetEventStatus vkGetEventStatus;
    extern VULKAN_DEVICE_API PFN_vkGetFenceStatus vkGetFenceStatus;
    extern VULKAN_DEVICE_API PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
    extern VULKAN_DEVICE_API PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
    extern VULKAN_DEVICE_API PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
    extern VULKAN_DEVICE_API PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;
    extern VULKAN_DEVICE_API PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
    extern VULKAN_DEVICE_API PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
    extern VULKAN_DEVICE_API PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
    extern VULKAN_DEVICE_API PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
    extern VULKAN_DEVICE_API PFN_vkMapMemory vkMapMemory;
    extern VULKAN_DEVICE_API PFN_vkMergePipelineCaches vkMergePipelineCaches;
    extern VULKAN_DEVICE_API PFN_vkQueueBindSparse vkQueueBindSparse;
    extern VULKAN_DEVICE_API PFN_vkQueueSubmit vkQueueSubmit;
    extern VULKAN_DEVICE_API PFN_vkQueueWaitIdle vkQueueWaitIdle;
    extern VULKAN_DEVICE_API PFN_vkResetCommandBuffer vkResetCommandBuffer;
    extern VULKAN_DEVICE_API PFN_vkResetCommandPool vkResetCommandPool;
    extern VULKAN_DEVICE_API PFN_vkResetDescriptorPool vkResetDescriptorPool;
    extern VULKAN_DEVICE_API PFN_vkResetEvent vkResetEvent;
    extern VULKAN_DEVICE_API PFN_vkResetFences vkResetFences;
    extern VULKAN_DEVICE_API PFN_vkSetEvent vkSetEvent;
    extern VULKAN_DEVICE_API PFN_vkUnmapMemory vkUnmapMemory;
    extern VULKAN_DEVICE_API PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
    extern VULKAN_DEVICE_API PFN_vkWaitForFences vkWaitForFences;
  • 2022/7/22 设计架构

    • TVulkanLoader中只提供Vulkan_Core的函数函数声明和获取,也就是说TVulkanLoader.h中只存在Vulkan核心函数声明和获取,有关Vulkan的属于扩展范围的函数,需要在相应的扩展模块使用TVulkanLoader自定义加载相应的函数
    • TVulkanLoader.h中增加如下声明用来标识函数是Vulkan的核心函数还是扩展函数
    #define VULKAN_CORE
    #define VULKAN_EXTENSION
  • 2022/7/23 设计架构

    • TVulkanLoader中增加struct TDeviceFunctionTable内部有设备相关函数声明,并用TDeviceDriver重命名
    • TVulkanLoader中增加TDeviceDriver LoadDeviceDriver(TDevice *device)用于返回特定设备函数实现版本
    • TDevice中增加TDeviceDriver *deviceDriver;用于创建设备函数表
    • TDevice::InternalCreate()中增加对TDeviceDriver *deviceDriver;的初始化
    • TDevice中增加const TDeviceDriver *GetDeviceDriver();函数,用于返回设备指定实现函数表(驱动)
    • ~TDevice中增加vkDeviceWaitIdle(...)调用使用driver替换调用
    • 开始将TVmaAllocator中使用TDeviceDriver调用使适配
  • 2022/7/24 设计架构

    • 开始将TDeviceQueue中使用TDeviceDriver调用使适配
    • 开始将TCommandBuffer中使用TDeviceDriver调用使适配
    • TPipeline中增加TDevice* GetDevice()成员函数
    • 开始将TCommandBufferPool中使用TDeviceDriver调用使适配
    • 开始将TDescriptorPool中使用TDeviceDriver调用使适配
    • 开始将TDescriptorSet中使用TDeviceDriver调用使适配
    • 开始将TDescriptorSetLayout中使用TDeviceDriver调用使适配
    • 开始将TFence中使用TDeviceDriver调用使适配
    • 开始将TFramebuffer中使用TDeviceDriver调用使适配
    • 开始将TGraphicsPipeline中使用TDeviceDriver调用使适配
    • 开始将TImageView中使用TDeviceDriver调用使适配
    • 开始将TPipelineLayout中使用TDeviceDriver调用使适配
    • 开始将TRenderPass中使用TDeviceDriver调用使适配
    • 开始将TSampler中使用TDeviceDriver调用使适配
    • 开始将TSemaphore中使用TDeviceDriver调用使适配
    • 开始将TShader中使用TDeviceDriver调用使适配
  • 2022/7/25 设计架构

    • TDeviceQueue::InternalCreate()中使用TVulkanLoader加载vkQueuePresentKHR函数
    • TDeviceQueue::Present(...)中使用TVulkanLoader加载的vkQueuePresentKHR函数进行调用
    • 将如下定义从TVulkanLoader.h中移动到TCore.h中:
    #define VULKAN_GLOBAL_API
    #define VULKAN_INSTANCE_API
    #define VULKAN_DEVICE_API
    #define VULKAN_CORE
    # efine VULKAN_EXTENSION
    • 开始将TSurface中使用TDeviceDriver调用使适配
  • 2022/7/27 设计架构

    • 开始将TSwapchain中使用TDeviceDriver调用使适配
    • 有小伙伴提出在单独使用TurboTCore核心库的时候,需要手动链接TCore库的依赖库,经过检验确实如此,这不是TCore库发布的初衷,有关该问题的细节请参阅./docs/issue.md::Turbo核心生成的TCore库...,由于本人CMake并不是很精通,目前正在研究中...
    • TCore中有关Vulkan函数的动态加载目前基本结束,接下来陆续撤走CMake中需要硬编码指定vulkan-1.lib目录的配置,计划将vulkan/vulkan.h头文件加入TCore
    • Vulkan SDK 1.3.204.1中的Include文件夹下的内容拷贝到了./engine/core/include/vulkan目录下
    • 修改TCore.h中对于#include <vulkan/vulkan.h>的引用,修改成#include "vulkan/vulkan.h"
    • 修改TSurface.h中对于Vulkan头文件的引用,修改成本地vulkan头文件
    • 移除TCoreCMake中对于Vulkan目录配置的硬编码
  • 2022/7/28 设计架构

    • 调整Turbo核心的CMakeLists.txt
    • 移除Turbo核心的vk_mem_alloc.h,使用第三方库中的头文件
    • 尝试解决TCore的依赖库问题
    • 修改PureIndexDraw例子中的IndexBuffer大小的bug,感谢会翔提供的反馈
  • 2022/7/30 设计架构

    • 调整./engine/core/CMakeLists.txt,尝试解决TCore的依赖库问题
    • 调整TShader.cpp中对于glslangGlslangToSpv.h头文件引用层级
    • 调整./main.cpp中对于vkGetImageSubresourceLayout(...)的调用,改成Turbo::Core::vkGetImageSubresourceLayout(...)
    • 调整./main.cpp中对于vkDestroySurfaceKHR(...)的调用,改成使用TVulkanLoader获取调用
    • ./CMakeLists.txt中对于imgui_impl_glfw.cppimgui_impl_vulkan.cpp的引用去掉,用不上
    • 同理将./samples/CMakeLists.txt中对于imgui_impl_glfw.cppimgui_impl_vulkan.cpp的引用去掉,用不上
    • ./samples中的示例将适配TVulkanLoader
    • 注:[VulkanMemoryAllocator]:If you fetch pointers to all Vulkan functions in a custom way, e.g. using some loader likeVolk
      • Define VMA_STATIC_VULKAN_FUNCTIONS and VMA_DYNAMIC_VULKAN_FUNCTIONS to 0.
      • Pass these pointers via structure #VmaVulkanFunctions.
    • 考虑是否将外部引入的VkSurfaceKHR中在TSurface析构时顺便销毁,目前外部引入的VkSurfaceKHR,需要在外部自己销毁
    • TVmaAllocator目前对于Vulkan API的获取,使用VulkanMemoryAllocator内部自动获取。
      • If you want VMA to fetch pointers to Vulkan functions dynamically using vkGetInstanceProcAddr, vkGetDeviceProcAddr (this is the option presented in the example below):
        1. Define VMA_STATIC_VULKAN_FUNCTIONS to 0, VMA_DYNAMIC_VULKAN_FUNCTIONS to 1.
        2. Provide pointers to these two functions via VmaVulkanFunctions::vkGetInstanceProcAddr, VmaVulkanFunctions::vkGetDeviceProcAddr.
        3. The library will fetch pointers to all other functions it needs internally.
    • 至此Turbo核心库TCore依赖库问题已解决,感谢会翔提供的问题反馈
  • 2022/8/4 设计架构

    • ./samples中增加PBRTest.cpp,用于physically based renderingBSDF研究
  • 2022/8/7 设计架构

    • ./samplesPBRTest.cpp,对于physically based renderingBSDF初步调试成功。看样子渲染结果应该是对的(○` 3′○)
  • 2022/8/10 设计架构

    • 开始engine层面的设计和实现,engine层的相关设计将会位于./docs/TurboDesign.drawio::Engine章节中,engine层的相关实现将会放入./engine/include./engine/src
  • 2022/8/11 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中创建纲要
    • 修正./docs/TurboDesign.drawio::Engine章节中Subapss的问题
  • 2022/8/13 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中创建概要设计
  • 2022/8/15 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中完善概要设计设计思路
  • 2022/8/16 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中概要设计设计增加对于FrameGraph结合的设计思路
  • 2022/8/17 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中概要设计设计增加对于CommandBuffer相关的设计思路
    • ./docs/TurboDesign.drawio::Engine章节中增加详细设计
    • Turbo核心TCommandBuffer中新增TSecondaryCommandBuffer类,用于表示二级指令缓冲
    • Turbo核心TCommandBuffer中新增TCommandBufferBase类,用于表示指令缓冲的基类,用于实现指令。该类为虚基类
    • Turbo核心TCommandBufferTCommandBufferBase类,增加TCommandBufferLevel GetLevel();函数,用于获取指令缓冲等级
    • Turbo核心TCommandBuffer中新增TCommandBufferLevel枚举,用于表示指令缓冲的的级别
    • Turbo核心TCommandBuffer中将TCommandBuffer修改成继承自TCommandBufferBase
    • Turbo核心修改TCommandBufferPool中将取消继承自Turbo::Core::TPool<TCommandBuffer>
    • Turbo核心TCommandBufferPool中增加void Free(TCommandBufferBase *commandBufferBase);用于统一回收一级、二级指令缓冲
    • Turbo核心TCommandBufferPool中增加TSecondaryCommandBuffer *AllocateSecondary();void Free(TSecondaryCommandBuffer *secondaryCommandBuffer);用于创建和回收二级指令缓冲
    • Turbo核心TCommandBuffer中应该实现void CmdExecuteCommand(...);函数,用于一级指令缓冲调度二级指令缓冲。今天太晚了,明天再弄。
  • 2022/8/18 设计架构

    • Turbo核心TCommandBuffer中增加TCommandBufferPool* GetCommandBufferPool();函数
    • Turbo核心TCommandBuffer中实现void CmdExecuteCommand(...);函数
    • Turbo核心TCommandBufferBase中增加VkCommandBufferInheritanceInfo *vkCommandBufferInheritanceInfo = nullptr成员变量,用于二级指令缓冲的继承信息
    • Turbo核心TCommandBufferBase中增加uint32_t currentSubpass = 0;成员变量,表示当前的Subpass
    • Turbo核心TCommandBufferBase中增加TFramebuffer *currentFramebuffer = nullptr;成员变量,表示当前的Framebuffer
    • Turbo核心TSecondaryCommandBuffer中删除void Begin() = delete成员函数调用,转而使用void Begin(TRenderPass *renderPass, TFramebuffer *framebuffer, uint32_t subpass);成员函数
    • Turbo核心TCommandBuffer.h中增加typedef enum class TSubpassContents枚举,用于对应VkSubpassContents
    • Turbo核心TCommandBufferBase中将void CmdBeginRenderPass(...)的形参增加一个TSubpassContents参数
    • Turbo核心TCommandBufferBase::Begin()中将vk_command_buffer_begin_info.flags设置成VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT为适应二级指令缓冲
    • ./samples中增加SecondaryCommandBufferTest例子,用于测试二级指令缓冲
  • 2022/8/18 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中详细设计设计,细化具体资源
  • 2022/8/19 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中系统设计中增加文件加载层相关
    • ./asset/models/增加material_sphere.gltf文件
    • ./samples/PBRTest.cpp例子中将读取的模型改为material_sphere.gltf文件
  • 2022/8/20 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中详细设计中增加Material设计思路
    • ./samples中增加MultiDrawTest.cpp文件,用于探究SubpassMutilDraw之间的联系
    • ./samples中增加SubpassTest.cpp文件,用于探究SubpassMutilDraw之间的联系
  • 2022/8/21 设计架构

    • ./docs/TurboDesign.drawio::Engine章节中详细设计::Material设计思路,有设计问题,进一步设计完善
  • 2022/8/25 知会

    • 现在Turbo::Engine层面的设计多少都有些问题,比如:如果用户想要调配使用FrameGraph就需要对渲染有过硬的理解,目前看了FilamentLegitEngine,FrameGraph-Example等相关引擎对于FrameGraph亦或是RenderGraph的封装设计,这些引擎都会提供一套固定的FrameGraph,用于一套已经定义好了的渲染流程,这些流程多是GBuffer流程,用户提供Renderable结构数据,引擎将其塞入特定的PassNode中,这个塞入工作并不是用户自定义的,而是引擎完成的,这就会导致用户(对图形学不是很熟悉)需要按照引擎先前定好的流程渲染,渲染出有限的效果(大部分情况下这个有限的效果是够用的),除非用户对于图形学和FrameGraph有比较深刻的理解,则可自己使用FrameGraph配置自定义渲染流程。
    • 从现在开始要全力备考了,再写代码我妈要打死我了,不管考得上,还是考不上,明年引擎都将继续,回见~
  • 2022/9/4 设计架构

    • 感谢会翔提供的反馈。修复TCommandBufferBase::CmdSetLineWidth(...)时程序报错的问题,原因是TGraphicsPipeline::InternalCreate()在创建管线时VkPipelineDynamicStateCreateInfo::dynamicStateCount给个固定数值2,导致VkDynamicState::VK_DYNAMIC_STATE_LINE_WIDTH并不会加入动态状态中。
  • 2022/10/16 设计架构

    • ./samples中增加InstancedDrawTest示例,用于示例实例化渲染
  • 2022/11/7 设计架构

    • ./samples中增加PerlinWorleyNoiseTest示例,用于尝试生成Perlin-Woley噪音
  • 2022/11/9 设计架构

    • core中创建TComputerPipeline
  • 2022/11/10 设计架构

    • TurboDesignCore章节增加Pipeline与Shader分支箭头(非常大的黄色箭头)
    • TShader中增加TVertexShaderTFragmentShaderTComputeShader并在TShader.cpp中实现(目前先实现这几个,剩下等有时间的)
    • TPipeline中增加图形管线的构造函数TPipeline(TDevice *device, TVertexShader* vertexShader,TFragmentShader* fragmentShader);和计算管线的构造函数TPipeline(TDevice *device, TComputeShader *computeShader);。老的构造函数将会声明置成弃用函数。
    • TGraphicsPipeline中增加使用TVertxShaderTFragmentShader的构造函数。老的构造函数将会声明置成弃用函数。
    • 实现TComputerPipeline中并在其中调用vkCreateComputePipelines创建计算管线的VkPipeline
    • ./samples中增加CineShaderLava示例,在ShaderToy上看到的,感觉挺有意思,想试试使用Turbo渲染,就搬过来了。
  • 2022/11/11 设计架构

    • ./samples中增加Octagrams示例,在ShaderToy上看到的,感觉挺有意思,就搬过来了。
    • ./samples中增加ProteanClouds示例,在ShaderToy上看到的,感觉挺有意思,就搬过来了。
    • 开始实现CoreTCommandBufferBase中的void CmdDispatch(...)函数,用于调用执行计算着色器的计算管线
    • ./samples中增加ComputePipelineTest测试示例,用于测试计算着色器和计算管线是否正确有效
    • 引擎中目前没有storage image相关的解析,现进行实现。
    • TDescriptor中增加TStorageImageDescriptor类,继承自TDescriptor,并实现
    • TShader中增加TStorageImageDescriptor类的数组使用:声明std::vector<TStorageImageDescriptor *> storageImageDescriptors成员变量。
    • TShader中增加const std::vector<TStorageImageDescriptor *> &GetStorageImageDescriptors()成员函数。
    • TShaderInternalParseSpirV()成员函数中对storage image进行解析构建,并在TShader析构时销毁。
    • TPipelineInternalCreate()成员函数中对storage image进行解析添加。
    • TDescriptorSetBindData(uint32_t binding, uint32_t dstArrayElement, std::vector<TImageView *> &imageViews)成员函数中增加对storage image的支持。
  • 2022/11/12 设计架构

    • 加了个爱发电赞助,感谢投喂。
    • ./samples中增加Auroras示例,在ShaderToy上看到的,太漂亮了没忍住,又搬过来了。
    • ./samplesProteanClouds示例中增加对应的鼠标位置数据
  • 2022/11/13 设计架构

    • ./samples中增加ComputerPipelineGeneratePerlinWorley示例。用于使用计算着色器生成128×128×128的3维PerlinWorley噪音,之后再使用图形管线显示。
    • ./samples中增加ComputerPipelineGenerateWorley示例。用于使用计算着色器生成32×32×32的3维Worley噪音,之后使用图形管线显示。
    • ./samples中增加IspGlassball11Mix示例。在ShaderToy上看到的,进行了一些魔改,没有进行降噪,原版代码好像是用的前一帧的数据进行降噪的,具体没咋看(主要是懒的写代码)。
    • 接下来计划重点实现Volumetric Cloud,之前一直想尝试实现体积云,该体积云将会写较为详细的实现文档,敬请期待。
  • 2022/11/14 设计架构

    • ./samples中增加VolumetricCloud示例。用于尝试实现体积云
    • ./asset/shaders中增加imgui.vert顶点着色器文件
    • ./asset/shaders中增加imgui.frag片元着色器文件
    • ./asset/shaders中增加perlin-worley.comp计算着色器文件
    • ./asset/shaders中增加worley.comp计算着色器文件
    • ./asset/shaders中增加post_processing.vert顶点着色器文件
    • ./asset/shaders中增加post_processing_voulmetric_cloud.frag片元着色器文件
    • ./docs中增加VolumetricCloud.md用于书写体积云的实现说明文档
    • TVulkanLoader中增加Linux平台的支持
    • Deepin环境好像不支持C++20c++17,现已退回到c++11版本
    • 由于退回到c++11版本,TFrameGraph中的一些c++新特性将会退回老版本,目前TFrameGraph不成熟,有待完善或重构,目前不是非常重要。
  • 2022/11/15 设计架构

    • 修改TVulkanLoader中增加Linux头文件dlfcn.h忘添加平台宏限制的Bug
    • 修改CppStandardTest.cpp中代码,由于退回到了C++11
    • PerlinWorleyNoiseTest.cpp中向着色器传递增加一个float h数据,用于控制噪音算法的赫斯特指数(Hurst Exponent)
    • README赞助栏目增加体积云项目
    • 修改TSwapchain.cppInternalCreate()vk_swapchain_create_info_khr.oldSwapchain=nullptr改成vk_swapchain_create_info_khr.oldSwapchain=VK_NULL_HANDLEVisual Studio 2017中赋nullptr报错
    • 修改TFrameGraph.hppExecute的相关声明,声明成TExecute,在使用Visual Studio 2017编译Turbo时会有报error C2244 无法将函数定义与现有的声明匹配,估计是名称和微软的库冲突了,换了名。TFrameGraph有时间要大修
    • 修改所有示例中有关寻找是否支持VK_LAYER_KHRONOS_VALIDATION验证层相关代码。如果设备支持将该验证层加入TInstance的激活数组中,有个Bug是当电脑不支持时或engine.GetInstance().GetSupportLayers()返回数据有问题,将会造成不应该添加Turbo::Core::TLayerInfo khronos_validation(此时khronos_validation还是未赋值状态,内部类型为TLayerType::UNDEFINED)到最后还是会调用enable_layer.push_back(khronos_validation)增加这个内部类型为TLayerType::UNDEFINED的验证层,导致在创建TInstance时不识别该验证层,返回异常。
    • 增加一个Issue:在Windows11下,英伟达驱动472.91,显卡型号RTX3070std::vector<Turbo::Core::TLayerInfo> Turbo::Core::TLayerInfo::GetInstanceLayers()将会返回空数组,Vulkan运行时此时找不到支持的验证层。
    • ./docs中增加images文件夹,用于存放文档图片
  • 2022/11/16 设计架构

    • ./doc/images增加Hurst_Exponent.gif文件,用于体积云说明
    • 更新./docs/VolumetricCloud.md文件
    • ./docs/images增加base_cloud.png文件和detail_cloud.png文件
    • ./samples增加RayMarchingTest示例,展示一个基本的光线步进示例,该示例未完成。
    • ./asset/shaders增加base_ray_marching.frag着色器,用于基本光线步进。
  • 2022/11/17 设计架构

    • 修改main.cpp使其输出的Turbo.exe。在当运行时按下键盘WASD后可以移动相机,按住鼠标右键可以俯仰相机。
    • 修改main.cpp中的eye变量名称,起错名了。
  • 2022/11/18 设计架构

    • 完成./sample下的RayMarchingTest示例
    • ./docs下增加compile_env.png,此为Windows环境下编译Turbo的环境对照表。KTX-Software很早之前的Issue,一直存在,可能GNU标准的clang/clang++不是这么用的吧。
    • 增加README.txt中第三方库的链接。glm有个历史遗留库,我下错好几次了。
    • 更新VolumetricCloud文章
  • 2022/11/19 设计架构

    • ./docs增加camera_coordinate.png。用于VolumetricCloud.md文章说明
    • ./docs增加camera_relative_pos.png。用于VolumetricCloud.md文章说明
    • ./docs增加camera_pixel_pos.png.png。用于VolumetricCloud.md文章说明
    • ./docs增加ndc.png。用于VolumetricCloud.md文章说明
    • ./docs增加base_ray_marching.gif。用于VolumetricCloud.md文章说明
    • 更新VolumetricCloud文章
    • ./asset/shaders增加volumetric_cloud.frag并对应修改VolumetricCloud示例。计划用于实现体积云,将会随着VolumetricCloud.md文章的进度完善
  • 2022/11/20 设计架构

    • ./samples增加RayMarchingBoundingBoxTest。用于VolumetricCloud的碰撞包围盒(为什么会有一圈圈的、类似摩尔纹的东西?光追噪音吗?)。
    • ./asset/shaders增加ray_marching_bounding_box.frag着色器。
    • RayMarchingTest实例增加界面文字操作提示。
  • 2022/11/21 设计架构

    • ./asset/shaders中将ray_marching_bounding_box.fragBoudingBoxOrthogonalBasis GetBoundingBoxForwardDir(...)函数修改成GetBoundingBoxOrthogonalBasis(...),之前名字起错了
    • ./asset/shaders中通过修改ray_marching_bounding_box.fragbool IsPointInBoundingBox(vec3 point, BoundingBox boundingBox)函数,增加一小点包围盒长宽高,用于补偿浮点数计算精度,进而改善了噪点,之前的精度太高了,导致生成了噪点
  • 2022/11/22 设计架构

    • ./asset/shaders增加compiler_env_version.png用于标识编译环境,Windows系统中,该环境在LLVM新版本下编译不了,需要导成Visual Studio能够顺利编译,Linux不变
    • ./docs增加raymarching.png。用于VolumetricCloud.md文章说明
    • ./docs增加ray_surface_intersect.png。用于VolumetricCloud.md文章说明
    • 更新VolumetricCloud文章
  • 2022/11/23 设计架构

    • 修改TFrameGraph.hpp中的Execute命名,在Visual Studio编译器下会冲突,改成TExecute
    • 修改TFrameGraph.hppC++17[[nodiscard]]目前Turbo使用C++11
    • /.gitignore中增加忽略install/文件夹
  • 2022/11/24 设计架构

    • 更新VolumetricCloud文章
    • 更改./samples下的VolumetricCloud,使其将ComputerPipelineGeneratePerlinWorleyRayMarchingBoundingBoxTest相结合
  • 2022/11/25 设计架构

    • ./docs/images增加intersect_case_out_box_forward.png用于VolumetricCloud.md文章说明
    • ./docs/images增加intersect_case_in_box.png用于VolumetricCloud.md文章说明
    • ./docs/images增加intersect_case_out_box_backward.png用于VolumetricCloud.md文章说明
    • ./docs/images增加ray_marching_bounding_box.gif用于VolumetricCloud.md文章说明
    • 更新VolumetricCloud文章
  • 2022/11/26 设计架构

    • ./docs/images增加bounding_box_sample_space.png用于VolumetricCloud.md文章说明
    • ./docs/images增加ray_marching_bounding_box_sample_space.gif用于VolumetricCloud.md文章说明
    • ./samples下的VolumetricCloud实例中增加delete my_computer_shader
    • 更新VolumetricCloud文章
    • ./samples下增加RayMarchingPerlinWorleyNoise实例,用于展示光线步进中基于包围盒对柏林沃利噪音的采样。
    • ./asset/shaders下增加ray_marching_perlin_worley_noise.frag片元着色器,并使用于RayMarchingPerlinWorleyNoise实例中
  • 2022/11/29 设计架构

    • ./samplesVolumetricCloud中增加powerabsorptionoutScattering传输变量,用于体积云渲染
    • ./samplesVolumetricCloud中增加对高频沃利纹理的采样
  • 2022/12/1 设计架构

    • 目前VolumetricCloud体积云渲染正在研究光照散射传输,研究周期可能会较长,先重构FrameGraph
    • 对于Deepin环境下C++17/20的支持一直没有很好的解决方式,有可能LLVM环境没有配对,研究研究。
    • TFrameGraph下的*Agency重命名成*Proxy
  • 2022/12/2 设计架构

    • TFrameGraph下的TURBO_NVALID_ID重命名成TURBO_INVALID_ID
    • TFrameGraph下的Data重命名成TData
    • TFrameGraph下的Setup重命名成TSetup
    • 修缮TFrameGraph
    • ./docs下增加Desgin文件夹
    • ./docs/Desgin/images下增加fg1~18文件,记录平日的FrameGraph的琐碎设计
    • ./docs下增加linux_env文件,记录linux上的依赖库(随便扯了张纸,有点脏,噗哈哈)
    • ./docs/Desgin下增加FrameGraphAdvance.md文件,用于整理位于Turbo教上层的FrameGraphTurbo引擎衔接设计,相关设计源头位于./docs/Desgin/images下的一些琐碎设计
  • 2022/12/4 设计架构

    • ./docs/DesginFrameGraphAdvance.md基本完成,之后新的设计都会在此文档中增加

About

Turbo is rendering engine base Vulkan

License:MIT License


Languages

Language:C++ 92.6%Language:C 6.8%Language:GLSL 0.6%Language:CMake 0.0%Language:Objective-C 0.0%