Direct3D 11运行时由层构建,从核心的基本功能开始,在外层构建可选的和开发人员辅助的功能。本节描述每个层的功能。
一般来说,添加层能添加功能,但不修改现有的行为。例如,核心函数将返回相同的返回值,无论是否实例化调试层。调试层可以提供额外的输出。要在创建设备时创建层,请调用D3D11CreateDevice或D3D11CreateDeviceAndSwapChain,并提供一个或多个D3D11_CREATE_DEVICE_FLAG值。
Direct3D 11 提供一下运行时层:
- 核心层
- 调试层
核心层
核心层默认存在;在API和设备驱动之间提供一个映射关系,最小化高频调用。核心层主要关心的是性能,它仅仅执行验证。剩下的层是可选的。
调试层
调试层提供广泛的附加参数和一致性验证(例如验证着色器链接和资源绑定、验证参数一致性和报告错误描述)。
创建设备的时候要支持调试层,你必须安装DirectX SDK(获取D3D11SDKLayers.dll),然后调用D3D11CreateDevice或者D3D11CreateDeviceAndSwapChain函数时指定D3D11_CREATE_DEVICE_DEBUG标志。启用调试层将使你的程序变慢。
另外,您可以使用DirectX控制面板启用/禁用调试标志,该面板包含在DirectX SDK中。
当调试层列出内存泄漏时,它输出对象接口指针及其友好名称的列表。默认的友好名称是“<未命名的>”。您可以使用ID3D11DeviceChild::SetPrivateData方法和D3Dcommon.h中的WKPDID_D3DDebugObjectName GUID设置友好的名称。
例如,要使用mytexture.jpg的SDKLayer名称来命名pTexture,请使用以下代码:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );