3 Star 3 Fork 0

FuXii / Turbo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

Turbo

Turbo是渲染引擎

Version

当前版本 0.0.0.12

State

  • 开发中

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′|┛ 嗷~~

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

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

    • 请安装Vulkan SDK
    • 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
  • 如何运行

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

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

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

已完成示例

  • HelloTriangle - 将会使用核心绘制IMGUI和三角形
  • PureHelloTriangle - 将会使用核心绘制三角形

已完成特性

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

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测试示例
MIT License Copyright (c) 2022 画卦伏羲 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Turbo is rendering engine base Vulkan 主要推到github上,gitee上已经不推了,请浏览 https://github.com/FuXiii/Turbo 展开 收起
C++ 等 4 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/fuxii/turbo.git
git@gitee.com:fuxii/turbo.git
fuxii
turbo
Turbo
master

搜索帮助