上一篇我们讲了如何建立D3D12的设备,并在其之上建立出11on12的设备。接下去就要开始一步一步转移到纯D3D12下了。
第一个应该转的是相对独立的资源,包括buffer和texture。建立D3D12的资源,之后用前文说的CreateWrappedResource转成D3D11的资源,继续交给D3D11on12渲染就可以了。这样仍然可以往前走一小步,保证引擎还能工作。
Buffer
Buffer包括vertex buffer、index buffer和constant buffer。
D3D12_HEAP_PROPERTIES heap_prop;
heap_prop.Type = D3D12_HEAP_TYPE_UPLOAD;
heap_prop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heap_prop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
heap_prop.CreationNode ...
这几年Intel和AMD都推出了集成GPU的消费级CPU,并强调它们的内存是共享的架构,也就是UMA(Unified Memory Architeture)。最近AMD和NVIDIA的独立显卡也加入战团,开始逐步支持UMA。最新的D3D12直接内置了UMA的支持,开发者可以让自己的程序充分利用上UMA所带来的优势。那么UMA能带来什么好处?它的限制在哪里?
各种平台的状况
自从PC上第一块GPU,NVIDIA Geforce 256问世以来,GPU一直都是自带一块显存的。当年的AGP总线是非对称的设计,数据传到GPU要远快于从GPU读回。CPU和GPU的访存是完全分开的。后来的PCIE总线让两端传输的速度相等了,并提供了一些相互访问的能力。在驱动里,system memory的区域可以映射成可以被GPU访问的,反过来 ...
自从去年GDC释出了一些消息以来,D3D12 SDK终于在上个月底随着VS2015RC公开了。除了API的更新,D3D12还包含了一个称为11on12的库,让移植前所未有的快捷。目前KlayGE的D3D12插件正在开发中,本系列文章将会把一些方法和经验总结出来。简单起见,后续的代码省略了错误检查等细节。同时,阅读本系列的前提是对D3D11有基本的了解。
D3D移植的过去
纵观D3D的历史,几乎每个版本都是从新开发,和旧版本没有接口上的继承关系。也就是说,和一般COM组件的概念不同,不能从新版本的接口QueryInterface出老版本的接口。结果就是,每次需要移植到新的D3D版本,都会需要拷贝代码、修改代码,甚至重写。在整个渲染部分都换到新API之前,系统完全无法工 ...
BUILD 2014上有个D3D12相关的讲座,向开发者预览了D3D12的API。比之前的简介详细了许多。这里我谈谈我对这个东西的理解。
Context
这里先对比一下D3D11和12的context,能对它们的API有个大致的印象。
D3D11的context
这张图表达了在D3D11中,context的组成。
其中,最左边的双向箭头表示状态可以Get和Set。橙色方块表示各个stage的资源slot。它们会bind上显存里的各种资源。
D3D12的context
D3D12里面,context变成了这样:
首先,各种状态被合并成了一个,叫pipeline state object(PSO)。这么一来,只需要调用一次API就能设置所有stage的状态。同时,Get接口被去掉了,就剩下Set。不过反正也从来不会去用Get。另外,s ...
[上周GDC,微软正式宣布了DX12和一些细节,这里放个中文翻译的版本]
有什么神奇之处?
这次的DirectX 12引入了新版本的Direct3D:位于DirectX核心地位的图形API。Direct3D是游戏或游戏引擎中最重要的组成部分之一,我们对其进行了重新设计使其比以前更快更高效。由此,Direct3D 12可以渲染更丰富的场景、更多物体,并能更好地利用当前的GPU硬件。而且Direct3D 12不但能用于高端游戏PC,也可以在所有微软的设备上运行。从手机和平板,到笔记本和台式机,当然,还有Xbox One。Direct3D 12就是你期待已久的API。
是什么让Direct3D 12独树一帜?首先,也是最重要的,它提供了一个比以前更底层的硬件抽象,让游戏可以明显改善多线程能力和CPU ...
[zh]三年前,我就曾经计划过一个KlayGE的长期研发子项目,D3D11 HLSL字节码到GLSL的编译器。两年前,在d3d1x for linux代码的帮助下,基本的字节码解析和反汇编工具已经实现。如今,这个子项目被正式命名为DXBC2GLSL,在库和工具两个层面上提供HLSL字节码(DXBC)到GLSL的转换。2013年底,DXBC2GLSL支持VS和PS初始版本已经由团队新成员林胜华完成,并提交到开发版本中。GS的支持也已经在上个月加入。当前所有KlayGE中的shader已经全部通过测试。[/zh]
[en]Three years ago, I've planned a long-term R&D sub-project of KlayGE, D3D11 HLSL bytecode to GLSL complier. Two years ago, derived from d3d1x for linux, a simple bytec ...
最近突然出现很多DirectX 12的消息,这里稍微整理一下,对可以确认的消息给个汇总。
DirectX 12将于3月20号在GDC 2014宣布。(来自这里)
有4家GPU厂商将会第一批支持DirectX 12,NVIDIA、AMD、Intel和高通。
和DirectX 11一样,移动平台和桌面平台的接口统一。
XBox ONE也可能会升级到DirectX 12。见入口网页左下角的图标。
驱动开销会减少很多,和Mantle一样的思路。
如果驱动层变薄了,驱动开销变少,性能就有机会和Mantle一样得到不少性能提升。而且驱动的开发也会变容易。但比Mantle更好的是,DirectX 12可以用于各厂商的显卡,不限于AMD。
D3D11.1和OpenGL ES都提供了discard frame buffer的方法,分别成为DiscardView和GL_EXT_discard_frame_buffer。虽有文档,但却很少有例子来表达这功能在什么情况下使用。这里我只能根据我的理解做一些探讨。希望有更了解的朋友可以一起讨论。
从tile-based说起
移动平台上最常见的GPU架构是tiled-based。它把frame buffer划分成许多大小相同的tile。每个rasterizer一次处理一个tile,把这个tile中包含的三角形光栅化到那个区域。为了提高性能、减少功耗,tile-based硬件会有一个片上空间,真正的光栅化仅仅发生在这个片上空间,当一个tile的所有三角形都渲染完成之后,才写入位于video memory的frame buffer。可以认为,那个片上空间是个ca ...
几个月前我提到过如果通过IE10或单独装补丁的方法,可以在Win7上获得部分D3D 11.1和DXGI 1.2的能力。代价是,由于debug layer的不同,那么做的话无法用D3D11_CREATE_DEVICE_DEBUG标志建立设备,所以就不能使用调试模式的D3D。Win8.1再次修改了debug layer的名字,使得这个现象在Win8.1上也会出现。如果在Win8.1上使用VS2012及以前的Win SDK,就无法建立debug设备。
Win7上的D3D11.1
从文件日期可以看出,安装了D3D11.1后的Win7,d3d11.dll已经被升级了。原先的debug layer叫做d3d11sdklayers.dll,而在Win8 SDK里有了个d3d11_1sdklayers.dll。新的d3d11.dll会去找那个文件,而不是原先的。如果把Win8 SDK或者VS2012里的d3d11_1sdklayers.dl ...
在2010年,曾经有个d3d1x for linux的项目短暂地轰动过。它通过Gallium的state tracker,原生地支持了d3d10和11的API,能运行一些简单的demo。遗憾的是,由于Wine的人对d3d1x不是很感兴趣(d3d9还支持不过来呢),在2013年3月份,d3d1x for linux因为无法使用和无人维护,被从mesa的repository里删除了。
(题外话:尚在开发中的HLSL bytecode to GLSL编译器也用了d3d1x for linux的bytecode解析代码,里面bug不少,而且都是下标写错之类不执行到肉眼很难看出来的bug。)
与此同时,d3d9 for linux诞生了。和之前一样,它也是个state tracker,也是原生支持。更好的是,它已经可以执行d3d9的游戏,并且性能高于Wine的转换成OpenGL的方 ...