本系列文章是笔者研究mantle的一些心得;其目的是为了学习新的图形API标准Vulkan。因为Vulkan还没有正式发布,而它事实上是基于mantle的,所以研究mantle可以让我们对新一代图形标准(Vulkan和D3D12)有一个提前认识。在Vulkan正式发布后,笔者也会写一系列的文章来介绍Vulkan。事实上,mantle的API函数都是以gr开头的;而Vulkan很多API只是简单的替换为vk开头而已。这进一步说明学习mantle的价值。
要学习一个新的API,最好就是用它来写个简单的demo。国外有位牛人已经写了个mantle版的Hello World:Implementing Hello Triangle with Mantle。这个例子的代码在:MantleHelloTriangle。笔者接下来的文章都是基于这个例子,试着把mantle的一系列基本概念剖析一下。
初始化Mantle
使用mantle首先要初始化;主要是调用“grInitAndEnumerateGpus()”来获取系统中所有GPU的handle,然后调用”grGetGpuInfo()”得到每个物理GPU的属性。另外还可以获取GPU_PERFORMANCE的特性,这样Apps可以根据这些信息来选择使用哪个GPU。
Device和Queue
选取GPU后就可以在此GPU上创建Device了。Device代表了一个在某GPU上运行的上下文(execution context);这个概念与D3D里的ID3DDevice对象类似。
在这里我们在默认gpu0上创建了一个device;其主要需要的参数是要支持的extension,需要的queue以及validation的级别。
在此我们有必要理一下物理显卡(adaptor),GPU,Screen/Display,Device和Queue之间的关系;这种基本概念之间的联系在以后的标准Vulkan里也是适用的。
这里我们只用到了一个extension:WSI_WINDOWS。这是为了获取相应的Display对象,从而将渲染结果Swap到屏幕上去显示。
有了Device后,我们就可以得到Queue了。Mantle的设计模式是应用程序生成并填写Cmd Buffers;然后再将Cmd Buffers submit到相应的Queue中去(Queue和Engine对应)。后面笔者将专门写一编关于Queue的文章。目前我们只要关心大致上Mantle支持三种Queue:Universal(Gfx和Compute)、Compute(通用计算,可以异步与渲染Queue)和DMA。
到此为止,mantle初始化完成,device和queue也都准备好了。