Turbo是渲染引擎
当前版本 0.0.0.12
docs/TurboDesign.drawio
(需要安装drawwio
)docs/Issue.md
首先您需要知道的:
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
: 用于绘制界面UIKTX-Sofware
: Khronos Texture
通用纹理标准tinygltf
: 读取gltf
文件库如何编译Turbo
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
如何运行
./main.cpp
的示例程序使用的资源文件使用的是绝对路径,所有的资源文件都指向./asset/
目录,请在./main.cpp
中全局搜索:/
字符,替换成自己的目录即可。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
- 已开始写系列的使用示例。
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
- 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
Vulkan
光追标准非Core
:跨平台窗口层抽象
非Core
:IMGUI
非Core
:KTX
和 glTF
非Core
:FrameGraph
层
非Core
:FrameGraph
层实现PBR
非Core
:ECS
层
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
中的BugTCommandBuffer
中添加对于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
测试示例
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型