Turbo
Turbo是渲染引擎
Version
当前版本 0.0.0.12
State
- 开发中
Sponsor
想赞助的小伙伴,欢迎使用爱发电
赞助,请量力而为,如果赞助完真有困难可以退回,未成年人禁止投喂!!!
赞助项目
- 体积云教程:详情请阅览
./docs/VolumetricCloud.md
(进行中)<研究光照散射中>
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
: 用于绘制界面UIKTX-Software
:Khronos Texture
通用纹理标准tinygltf
: 读取gltf
文件库
-
-
如何编译
Turbo
- 请安装Vulkan SDK
- ( *注:2022/7/27 对于
Windows
系统,目前Turbo
已经完成了动态加载Vulkan
函数,(有些第三方依赖需要Vulkan SDK
目前对于Turbo
不是必需品Vulkan SDK
,比如VulkanMemoryAllocator
),Vulkan
的Runtime
是Turbo
的必须品,正常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.
- ( *注:2022/7/27 对于
Turbo
的核心可以单独编译,编译相关的CMakeLists.txt
位于./engine/core/CMakeLists.txt
。将会输出名为TCore
的库文件。- 如果您想直接编译
Turbo
-
首先请查看环境变量中是否已经加入了
git
的bin
目录,KTX-Sofware
编译依赖bash.exe
,正常该程序位于git
的bin
目录下 -
请安装
python
。第三方库很多CMake
使用Python
脚本运行,安装完后请确保Python
的{Python的安装目录}/Python{版本号}/
目录和{Python的安装目录}/Python{版本号}/Scripts
目录加入到了环境变量中 -
请修改engine/core/CMakeLists.txt
中的Vulkan
库目录为您自己的目录 -
之后使用
./CMakeLists.txt
即可 -
设置相关
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
-
- 请安装Vulkan SDK
-
如何运行
- 由于每个用户输出的目录都不一样,所以
./main.cpp
的示例程序使用的资源文件使用的是相对路径,所有的资源文件都指向./asset/
目录,请在./main.cpp
中全局搜索asset
字符,替换成自己的目录即可。
- 由于每个用户输出的目录都不一样,所以
Trifles
- 整理一下头文件,有点乱,去掉不必要的头文件
RoadMap
2022/5/15
Turbo
引擎对于Vulkan 1.0
的相关核心功能已初步成型,由于Vulkan
本身的复杂性还有很多特性没有实现,在此做一下记录,记录该引擎以实现的特性和未来计划实现特性,该特性记录将会和docs/Issue.md
文档配合使用。Core
核心层将会作为单独完整的库发布,位于./engine/core
中, 现在核心库已分离成单独的库,将会输出TCore.lib
或TCore.a
库文件Turbo
将使用该Core
核心继续开发高级特性- 未来有时间录制
Vulkan教程
和引擎开发教程
视频
2022/5/28
- 实现完
Vulkan
的input 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
-Vulkan
中Subpass
抽象Turbo::Core::TAttachment
-Vulkan
中Attachment
抽象Turbo::Core::TRenderPass
-VkRenderPass
相关封装Turbo::Core::TVertexBinding
-Vulkan
中顶点属性抽象Turbo::Core::TViewport
-Vulkan
中Viewport
抽象Turbo::Core::TScissor
-Vulkan
中Scissor
抽象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
:跨平台窗口层抽象 -
非
Core
:IMGUI
-
非
Core
:KTX
和glTF
-
非
Core
:FrameGraph
层 -
非
Core
:FrameGraph
层实现PBR
-
非
Core
:ECS
层 -
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
- 完成
TPhysicalDeviceInfo
与TPhysicalDevice
相结合
-
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::availableQueueCountMap
在TPhysicalDevice::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
-
重构
TDevice
、TDeviceQueue
、TDeviceCreateInfo
、TDeviceQueueCreateInfo
:- 将
std::vector<TDeviceQueueCreateInfo> deviceQueueCreateInfos
从TDeviceCreateInfo
中移除 - 移除
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
。修改TInstance
、TPhysicalDevice
和TPhysicalDeviceProxy
之间的关系,遗弃TPhysicalDeviceProxy
未完待续- 初步完成
TInstance
创建TPhysicalDevice
,使用TPhysicalDevice::InternalRebuild()
很方便的创建,遗弃TPhysicalDeviceProxy
TPhysicalDeviceProxy
的功能转移到了TPhysicalDevice
中
-
2022/4/3 设计架构
TInstance
和TPhysicalDevice
基于数据驱动,基本重构完成,遗弃TInstanceCreateInfo
和VkAllocationCallbacks
,Turbo现在完全使用内置内存分配器TVulkanAllcator
-
2022/4/4 设计架构
- 优化了
TInstance
和TPhysicalDevice
的重构 TDevice
基本重构完成,遗弃了TDeviceCreateInfo
和VkAllocationCallbacks
,Turbo现在完全使用内置内存分配器TVulkanAllcator
TDeviceQueue
重构进行中
- 优化了
-
2022/4/5 设计架构
TPhysicalDevice
中增加void AvailableQueueCountPlussOneByQueueFamilyIndex(uint32_t queueFamilyIndex)
函数TDeviceQueue
基于数据驱动,基本重构完成,遗弃了TDeviceQueueCreateInfo
和VkAllocationCallbacks
,Turbo现在完全使用内置内存分配器TVulkanAllcator
TCommandBufferPool
基于数据驱动,基本重构完成TCommandBuffer
基于数据驱动,基本重构完成Turbo
的TVulkanHandle
派生类,现在拥有了内存自动回收能力,在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
来动态编译字符串shader
到spirv
的,但是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
- 添加
TOutput
和TInput
类,于TShader.h
中,用于描述Shader
的layout (location=n) in/out [type](vec3...) name;
- 未完待续
- 添加
-
2022/4/12 设计架构
-
TOutput
和TInput
类,没有必要定义两份,修改成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
-
TShader
中virtual void InternalParseSpirV()
完成spirv_cross::SPIRType
到VkDescriptorType
的映射 -
未完待续
-
-
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
中增加了TUniformBufferDescriptor
和TStructMember
类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
中对TInterface
的input
和output
的解析基本完成Turbo::Core::TDescriptor
代表Vulkan
的VkDescriptorSetLayoutBinding
Turbo::Core::TUniformBufferDescriptor
代表Vulkan
的VkDescriptorSetLayoutBinding::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
范畴(处理好TDescriptorSet
和TDescriptor
之间的联系) -
对于
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
之后,会将刚new
的TDescriptor
通过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
类,新增成员变量,内部的TScissor
和TViewport
目前是按值存的,将来改成按照指针存,节省内存。 - 以上只是初步完成,还有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
,TRenderPass
,TFramebuffer
之间设计不合理,需要重构。尝试是否能够按照Vulkan
标准规范设计
- 将
-
2022/4/25 设计架构
- 将原先
TShader
中的TDescriptorSet
改成了TDescriptorSetLayout
- 创建
TDescriptorSet
用于表示VkDescriptorSet
,现在就不会出现TDescriptorSetLayout
和TDescriptorSet
命名歧义了 - 遗弃老的
TPipeline
,TSubpass
,TAttachemt
,TRenderPass
,TFramebuffer
相关设计,回归到Vulkan
标准规范设计思路 TPipeline
,TSubpass
,TAttachemt
,TRenderPass
,TFramebuffer
重构中TAttachemt
、TSubpass
重构完成TSubpass
新增TAttachmentReference
类- 创建
TDescriptorPool
、TDescriptorSize
类
- 将原先
-
2022/4/26 设计架构
TSubpass
移除TAttachmentReference
类,用起来不方便TPipeline
,TSubpass
,TAttachemt
,TRenderPass
,TFramebuffer
基本重构完成,但还不完善。需进一步完善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 设计架构
- 发布至
GitHub
和Gitee
上 - 提炼
issue
- 发布至
-
2022/4/28 设计架构
TBuffer
中增加typedef enum TBufferUsageBits
枚举,与Vulkan
标准一致TBuffer
中增加typedef VkFlags TBufferUsages
声明,用于声明TBuffer
的uage
,与Vulkan
标准一致Turbo.h
中增加typedef VkDeviceSize TDeviceSize
用于TBuffer
的构造函数中,与Vulkan
标准一致TImage
中增加typedef enum TImageType
枚举,用于声明TImage
的type
,与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()
函数,用于获取采样数VkVertexInputBindingDescription
和VkVertexInputAttributeDescription
基本描述框图TurboDesign.drawwio
整理完成
-
2022/4/30 设计架构
TPipeline.h
中增加TVertexAttribute
,TVertexBinding
类,分别用于表示VkVertexInputAttributeDescription
和VkVertexInputBindingDescription
TPipeline.h
中增加typedef enum class TVertexRate
类,用于表示VkVertexInputRate
TPipeline.h
中剔除VkVertexInputBindingDescription
和VkVertexInputAttributeDescription
的使用,改为使用TVertexAttribute
,TVertexBinding
-
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 multisampleEnable
和TSampleCountBits sample
的成员变量,提供对Multisample
特性的支持TCommandBuffer
中增加TRenderPass *currentRenderPass
和TPipeline *currentPipeline
的成员变量,提供对当前使用的RenderPass
和Pipeline
的引用
-
2022/5/3 设计架构
TCommandBuffer
中实现了void Turbo::Core::TCommandBuffer::NextSubpass()
的成员函数,提供对vkCmdNextSubpass(...)
特性的支持Turbo
核心现已支持多Subpass
渲染- 将
TRenderPass
的TPipelineType
转移到了TSubpass
中,符合Vulkan
标准 TPipeline.h
中新增typedef enum TPipelineStageBits
和typedef VkFlags TPipelineStages
,对应Vulkan
的VkPipelineStageFlagBits
和VkPipelineStageFlags
Turbo.h
中新增typedef enum TAccessBits
和typedef VkFlags TAccess
,对应Vulkan
的VkAccessFlagBits
和VkAccessFlags
- 新增
TBarrier.h
和TBarrier.cpp
,用于实现VkMemoryBarrier
、VkBufferMemoryBarrier
、VkImageMemoryBarrier
未完待续
-
2022/5/4 设计架构
TBarrier.h
中增加了TBarrier
、TMemoryBarrier
、TBufferMemoryBarrier
、TImageMemoryBarrier
的成员函数,提供对VkMemoryBarrier
、VkBufferMemoryBarrier
、VkImageMemoryBarrier
特性的支持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 TFormatFeatureBits
和typedef VkFlags TFormatFeatures
用于对应VkFormatFeatureFlagBits
和VkFormatFeatureFlags
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.h
中Turbo::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/.cpp
和TSurfaceFormat.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_READY
和TResult::SUBOPTIMAL
用于Turbo::Extension::TSwapchain::AcquireNextImage(...)
的返回结果./thirdparty
新增SDL2
库用于创建窗口TDevice
的InternalCreate()
中有Bug
,已修复TCommandBuffer
的BeginRenderPass()
中有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 TSampledImageDescriptor
和TSamplerDescriptor
,用于对应VkDescriptorType::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
和VkDescriptorType::VK_DESCRIPTOR_TYPE_SAMPLER
TShader
中增加std::vector<TSampledImageDescriptor *> sampledImageDescriptors
和std::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.hpp
和tiny_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
用于描述Vulkan
的Push Constant
TShader
增加std::vector<TPushConstantDescriptor *> pushConstantDescriptors
和相应的获取函数。TPipelineLayout
和TPipeline
中适配TPushConstantDescriptors
TUniformBufferDescriptor
和TPipeline
中增加uint32_t size
成员属性和相应的获取函数,用于表示数据块大小TCommandBuffer
中增加void CmdPushConstants(...)
成员函数,对应vkCmdPushConstants(...)
- 将
-
2022/5/23 设计架构
TBuffer
中增加void Flush(...)
成员函数,用于刷新数据到GPU domain
TSubpass
中GetDepthStencilAttachmentReference()
有Bug
,现已修改完毕
-
2022/5/24 设计架构
TGraphicsPipeline
中移除std::vector<TViewport> &viewports
和std::vector<TScissor> &scissors
成员,由于核心创建的Pipeline
的Viewport
和Scissor
都是动态状态,Vulkan
会忽略VkPipelineViewportStateCreateInfo::pViewports
和VkPipelineViewportStateCreateInfo::pScissors
TGraphicsPipeline
中增加typedef enum class TCompareOp
声明,对应VkCompareOp
TGraphicsPipeline
中增加typedef enum class TStencilOp
声明,对应VkStencilOp
TGraphicsPipeline
中增加对深度测试和模板测试支持- 调整
TGraphicsPipeline
构造函数的参数顺序,填入默认值
-
2022/5/25 设计架构
- 成功渲染
KTX
纹理
- 成功渲染
-
2022/5/27 设计架构
- 成功渲染
KTX
的Cubemap
纹理 - 开始适配几何管线的
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.h
和TFrameGraph.cpp
- 开始实现
-
2022/6/7 设计架构
- 将第三方库配置成
Submodule
,glm
库好像有问题,MVP
矩阵好像不对导致渲染结果有问题,应该不是核心的问题,该问题先忽略,等到FrameGraph
写完,开始写例子的时候再统一解决,加入Issue
中 - 创建
./Turbo/samples
文件夹,用于存放示例代码。 FrameGraph
的void Turbo::FrameGraph::TFrameGraph::Compile()
未实现待实现FrameGraph
的void 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
TSurface
中InternalCreate()
适配Linux
的wayland
TSurface
中GetSurfaceSupportQueueFamilys()
适配Linux
的wayland
- 适配
-
2022/6/15 设计架构
- 适配
TSurface
基于xcb
TSurface
中增加xcb_connection_t *connection
和xcb_window_t window
成员变量,用于适配xcb
TSurface
中增加适配xcb
相应的构造函数TSurface
的InternalCreate(...)
中通过vkCreateXcbSurfaceKHR(...)
适配xcb
- 适配
TSurface
基于xlib
TSurface
中增加Display *xlibDpy = nullptr
和Window xlibWindow
成员变量,用于适配xlib
TSurface
中增加适配xlib
相应的构造函数TSurface
的InternalCreate(...)
中通过vkCreateXlibSurfaceKHR(...)
适配xlib
TSwapchain
的InternalCreate(...)
中会去判断当前给的图片数量是否合法(判断数量是否在[最小值,最大值]之间),但是有些显卡设备返回的最小值为有效数据,最大值为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
标准,将会尝试使用concept
和metaTemplate
方式编写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
TPassNode
中TAgency*
相成员修改为std::unique_ptr<TAgency>
- 去掉
TPassNode
中析构函数的实现,使用编译器默认生成的 TFrameGraph::AddPass(...)
中增加如下代码,调用初始化入口函数:
std::invoke(setup, builder, pass_agency->GetData())
- 增加
TAgency
的构造/析构函数
-
2022/7/4 设计架构
FrameGraph
设计参考Filement
做出的修改意见目前写在各行的注释中(//*...
),考虑是否采纳,之后需要同步修改FrameGraph
的设计文档- 将
Filament
的FrameGraph
结构分析加入FrameGraph
文档,作为参考,与c++
新标准的模板元编程和concept
结合设计
-
2022/7/5 设计架构
- 开始解析
Filament 1.9.9
的FrameGraph
(截止2022/7/5filament
的最新版本为1.24
对于FrameGraph
做了很多更新,但总体思路没变),请在./docs/TurboDesign.drawio::FrameGraph
的右侧查看(注:重点过程被标注为橘黄色)
- 开始解析
-
2022/7/6 设计架构
- 开始解析
Filament
的FrameGraph::compile()
阶段,请在./docs/TurboDesign.drawio::FrameGraph
的右侧查看
- 开始解析
-
2022/7/7 设计架构
- 开始解析
Filament
的FrameGraph::execute()
阶段,请在./docs/TurboDesign.drawio::FrameGraph
的右侧查看
- 开始解析
-
2022/7/8 设计架构
- 解析
Filament
的FrameGraph::execute()
阶段,reset()
函数调用位置标错了,修改回来。 - 开始解析
Filament
的FrameGraph::execute()
阶段的resources.get(data.rt);
,请在./docs/TurboDesign.drawio::FrameGraph
的右侧查看 - 至此
Filament
的FrameGraph
核心解析完毕,请在./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 firstUser
和TPass 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
大框架基本上写完了,剩下的就是Resource
和PassNode
等特化和引擎提供的特性资源类,比如PresentNode(PassNode的特化,有PresentData)
和Texture(纹理资源),DepthTexture(深度纹理),ColorTexture(颜色纹理)
等- 接下来需要实现
TFrameGraph
的Blackboard
特性
-
2022/7/11 设计架构
- 实现
FrameGraph
的Blackboard
特性 - 实现
TFrameGraph
中增加TBlackboard
类 TFrameGraph
中增加TBlackboard
类成员变量TFrameGraph
中增加TBlackboard &GetBlackboard()
成员函数需要特化当前的算法正常并不会剔除PresentPassNode
,显示节点一般作为结束节点,但是FrameGraph
演讲中并没有显示的给出显示阶段往哪个资源身上写入,所以目前显示节点没有写入,也就是没有出度,没有出度在FrameGraph::Compile()
阶段就会被剔除,这也许会造成一连串的剔除,所以需要专门特化一个PresentPassNode
或是采用SideEffect
解决(目前TFrameGraph
并没有引入SideEffect
特性)PresentPass
,FrameGraph
目前的剔除算法首先基于资源引用数进行的剔除,目前显示节点不向任何资源写入,只是读取资源,正常不会发生递归性的一连串剔除TFrameGraph
还需要经过测试,目前还没有严格测试
- 实现
-
2022/7/12 设计架构
-
修复Bug:
TFrameGraph::Compile()
中计算资源的创建者和销毁者时,FrameGraph
的所有资源可能会被全部剔除,造成空图,这会导致资源的创建者和销毁者为无效节点(比如强制PresentPass
往资源中写入,由于PresentPass
为结束节点,正常不应该再写入资源,这时该写入的资源没有出度,也就是没有人使用该节点,这时Compile()
阶段会发生资源剔除,导致一连串的资源剔除,最坏的情况会剔除成空图,这时资源的创建者和销毁者不会被赋值,从而导致创建者和销毁者的节点id
无效非法) -
有关
TFrameGraph
如何使用和测试,请参考./samples/FrameGraphSample.cpp
-
TFrameGraph::Execute(...)
中增加对PassNode
的引用数的判断,如果引用数大于零,说明该节点有使用者,运行节点的Executor
回调,否则没有使用,不去调用回调。(注意:这将会导致PresentNode
的运行回调不会被调用,考虑使用SideEffect
特性强制驱动,如果一个PassNode
有SideEffect
特性,说明在节点不会被剔除) -
TPassNode
中增加bool sideEffect
成员变量 -
TFrameGraph::TBuilder
中增加TBuilder &SideEffect();
成员函数,用于设置PassNode
的sideEffect
成员 -
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
类用于实现Vulkan
的Loader
- 核心中添加
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
调用使适配 - 有小伙伴提出在单独使用
Turbo
的TCore
核心库的时候,需要手动链接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
头文件 - 移除
TCore
的CMake
中对于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
中对于glslang
中GlslangToSpv.h
头文件引用层级 - 调整
./main.cpp
中对于vkGetImageSubresourceLayout(...)
的调用,改成Turbo::Core::vkGetImageSubresourceLayout(...)
- 调整
./main.cpp
中对于vkDestroySurfaceKHR(...)
的调用,改成使用TVulkanLoader
获取调用 - 将
./CMakeLists.txt
中对于imgui_impl_glfw.cpp
和imgui_impl_vulkan.cpp
的引用去掉,用不上 - 同理将
./samples/CMakeLists.txt
中对于imgui_impl_glfw.cpp
和imgui_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
andVMA_DYNAMIC_VULKAN_FUNCTIONS
to 0. - Pass these pointers via structure #VmaVulkanFunctions.
- Define
- 考虑是否将外部引入的
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):
- Define VMA_STATIC_VULKAN_FUNCTIONS to 0, VMA_DYNAMIC_VULKAN_FUNCTIONS to 1.
- Provide pointers to these two functions via VmaVulkanFunctions::vkGetInstanceProcAddr, VmaVulkanFunctions::vkGetDeviceProcAddr.
- The library will fetch pointers to all other functions it needs internally.
- If you want VMA to fetch pointers to Vulkan functions dynamically using vkGetInstanceProcAddr, vkGetDeviceProcAddr (this is the option presented in the example below):
- 至此
Turbo
核心库TCore
依赖库问题已解决,感谢会翔
提供的问题反馈
- 调整
-
2022/8/4 设计架构
./samples
中增加PBRTest.cpp
,用于physically based rendering
与BSDF
研究
-
2022/8/7 设计架构
./samples
中PBRTest.cpp
,对于physically based rendering
与BSDF
初步调试成功。看样子渲染结果应该是对的(○` 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
核心TCommandBuffer
中TCommandBufferBase
类,增加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
文件,用于探究Subpass
和MutilDraw
之间的联系./samples
中增加SubpassTest.cpp
文件,用于探究Subpass
和MutilDraw
之间的联系
-
2022/8/21 设计架构
./docs/TurboDesign.drawio::Engine
章节中详细设计::Material
设计思路,有设计问题,进一步设计完善
-
2022/8/25 知会
- 现在
Turbo::Engine
层面的设计多少都有些问题,比如:如果用户想要调配使用FrameGraph
就需要对渲染有过硬的理解,目前看了Filament
,LegitEngine
,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 设计架构
TurboDesign
中Core
章节增加Pipeline与Shader分支箭头(非常大的黄色箭头)
TShader
中增加TVertexShader
、TFragmentShader
、TComputeShader
并在TShader.cpp
中实现(目前先实现这几个,剩下等有时间的)TPipeline
中增加图形管线的构造函数TPipeline(TDevice *device, TVertexShader* vertexShader,TFragmentShader* fragmentShader);
和计算管线的构造函数TPipeline(TDevice *device, TComputeShader *computeShader);
。老的构造函数将会声明置成弃用函数。TGraphicsPipeline
中增加使用TVertxShader
和TFragmentShader
的构造函数。老的构造函数将会声明置成弃用函数。- 实现
TComputerPipeline
中并在其中调用vkCreateComputePipelines
创建计算管线的VkPipeline
./samples
中增加CineShaderLava
示例,在ShaderToy
上看到的,感觉挺有意思,想试试使用Turbo
渲染,就搬过来了。
-
2022/11/11 设计架构
./samples
中增加Octagrams
示例,在ShaderToy
上看到的,感觉挺有意思,就搬过来了。./samples
中增加ProteanClouds
示例,在ShaderToy
上看到的,感觉挺有意思,就搬过来了。- 开始实现
Core
中TCommandBufferBase
中的void CmdDispatch(...)
函数,用于调用执行计算着色器的计算管线 ./samples
中增加ComputePipelineTest
测试示例,用于测试计算着色器和计算管线是否正确有效- 引擎中目前没有
storage image
相关的解析,现进行实现。 TDescriptor
中增加TStorageImageDescriptor
类,继承自TDescriptor
,并实现TShader
中增加TStorageImageDescriptor
类的数组使用:声明std::vector<TStorageImageDescriptor *> storageImageDescriptors
成员变量。TShader
中增加const std::vector<TStorageImageDescriptor *> &GetStorageImageDescriptors()
成员函数。TShader
的InternalParseSpirV()
成员函数中对storage image
进行解析构建,并在TShader
析构时销毁。TPipeline
的InternalCreate()
成员函数中对storage image
进行解析添加。- 在
TDescriptorSet
的BindData(uint32_t binding, uint32_t dstArrayElement, std::vector<TImageView *> &imageViews)
成员函数中增加对storage image
的支持。
-
2022/11/12 设计架构
- 加了个
爱发电
赞助,感谢投喂。 ./samples
中增加Auroras
示例,在ShaderToy
上看到的,太漂亮了没忍住,又搬过来了。./samples
中ProteanClouds
示例中增加对应的鼠标位置数据
- 加了个
-
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++20
和c++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.cpp
中InternalCreate()
中vk_swapchain_create_info_khr.oldSwapchain=nullptr
改成vk_swapchain_create_info_khr.oldSwapchain=VK_NULL_HANDLE
,Visual Studio 2017
中赋nullptr
报错 - 修改
TFrameGraph.hpp
中Execute
的相关声明,声明成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
,显卡型号RTX3070
下std::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
。在当运行时按下键盘W
、A
、S
、D
后可以移动相机,按住鼠标右键
可以俯仰相机。 - 修改
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.frag
的BoudingBoxOrthogonalBasis GetBoundingBoxForwardDir(...)
函数修改成GetBoundingBoxOrthogonalBasis(...)
,之前名字起错了./asset/shaders
中通过修改ray_marching_bounding_box.frag
的bool 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.hpp
中C++17
的[[nodiscard]]
目前Turbo
使用C++11
/.gitignore
中增加忽略install/
文件夹
- 修改
-
2022/11/24 设计架构
- 更新
VolumetricCloud
文章 - 更改
./samples
下的VolumetricCloud
,使其将ComputerPipelineGeneratePerlinWorley
和RayMarchingBoundingBoxTest
相结合
- 更新
-
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 设计架构
./samples
中VolumetricCloud
中增加power
、absorption
、outScattering
传输变量,用于体积云渲染./samples
中VolumetricCloud
中增加对高频沃利纹理的采样
-
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
教上层的FrameGraph
和Turbo
引擎衔接设计,相关设计源头位于./docs/Desgin/images
下的一些琐碎设计
- 将
-
2022/12/4 设计架构
./docs/Desgin
下FrameGraphAdvance.md
基本完成,之后新的设计都会在此文档中增加