d3d11中如何枚举适配器(Enumerate Adapters)
2014-02-24 22:04
85 查看
DirectX 10和11使用DirectX图形基础结构(DXGI),枚举计算机上的可用图形适配器。你通常需要枚举适配器,原因如下:
1.确定有多少图形适配器安装在我们的计算机上
2.为了帮助我们选择使用哪个适配器来创建一个Direct3D设备
3.为了获取 IDXGIAdapter对象 ,它可以知道我们的设备能力(device capabilities)
那么如何来枚举计算机中的图形适配器呢?我们将遵循以下几个步骤:
1. 通过调用CreateDXGIFactory函数创建一个IDXGIFactory对象。下面的代码示例演示如何初始化一个IDXGIFactory对象
2. 通过调用IDXGIFactory:: EnumAdapters方法枚举每个适配器。该适配器的参数允许我们指定枚举适配器的从零开始的索引号。如果没有适配器可在指定的索引处,该方法将返回 DXGI_ERROR_NOT_FOUND。
下面的代码示例演示如何枚举计算机上的适配器。
是的,一共就只有这两步哦。记住这两步我们再来看一下完整的例子:
上面的代码示例就是演示如何枚举计算机上的所有适配器。
那么在实际中我们应该如何去应用,封装我们自己的适配器相关的类呢?我们来看看下面的例子。
DXGIAdapter.h
DXGIAdapter.h
注XIncludes头文件包含
1.确定有多少图形适配器安装在我们的计算机上
2.为了帮助我们选择使用哪个适配器来创建一个Direct3D设备
3.为了获取 IDXGIAdapter对象 ,它可以知道我们的设备能力(device capabilities)
那么如何来枚举计算机中的图形适配器呢?我们将遵循以下几个步骤:
1. 通过调用CreateDXGIFactory函数创建一个IDXGIFactory对象。下面的代码示例演示如何初始化一个IDXGIFactory对象
IDXGIFactory * pFactory = NULL; CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)
2. 通过调用IDXGIFactory:: EnumAdapters方法枚举每个适配器。该适配器的参数允许我们指定枚举适配器的从零开始的索引号。如果没有适配器可在指定的索引处,该方法将返回 DXGI_ERROR_NOT_FOUND。
下面的代码示例演示如何枚举计算机上的适配器。
for ( UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i) { ... }
是的,一共就只有这两步哦。记住这两步我们再来看一下完整的例子:
std::vector <IDXGIAdapter*> EnumerateAdapters(void) { IDXGIAdapter * pAdapter; std::vector <IDXGIAdapter*> vAdapters; IDXGIFactory* pFactory = NULL; // Create a DXGIFactory object. if(FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory))) { return vAdapters; } for ( UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i ) { vAdapters.push_back(pAdapter); } if(pFactory) { pFactory->Release(); } return vAdapters; }
上面的代码示例就是演示如何枚举计算机上的所有适配器。
那么在实际中我们应该如何去应用,封装我们自己的适配器相关的类呢?我们来看看下面的例子。
DXGIAdapter.h
/************************************************** * * 作者:钟凌霄 * 项目:D3D11 * **************************************************/ //************************************************* // // FileName:DXGIAdapter.h // //************************************************* #include "XIncludes.h" #ifndef DXGIAdapter_h #define DXGIAdapter_h namespace EngineX { class DXGIOutput; class DXGIAdapter { public: DXGIAdapter( IDXGIAdapter1* pAdapter ); virtual ~DXGIAdapter(); protected: IDXGIAdapter1* m_pAdapter; std::vector<IDXGIOutput*> m_vOutputs; }; }; #endif //DXGIAdapter_h
DXGIAdapter.h
/************************************************** * * 作者:钟凌霄 * 项目:D3D11 * **************************************************/ //************************************************* // // FileName:DXGIAdapter.cpp // //************************************************* #include "XIncludes.h" #include "DXGIAdapter.h" using namespace EngineX; //-------------------------------------------------------------------------------- DXGIAdapter::DXGIAdapter( IDXGIAdapter1* pAdapter ) { m_pAdapter = pAdapter; IDXGIOutput* pOutput = nullptr; while ( pAdapter->EnumOutputs( m_vOutputs.size(), &pOutput ) != DXGI_ERROR_NOT_FOUND ) { m_vOutputs.push_back( new DXGIOutput( pOutput ) ); } } //-------------------------------------------------------------------------------- //-------------------------------------------------------------------------------- DXGIAdapter::~DXGIAdapter() { for ( auto pOutput : m_vOutputs ) delete pOutput; SAFE_RELEASE( m_pAdapter ); } //--------------------------------------------------------------------------------
注XIncludes头文件包含
#include <vector> #include <d3d11_1.h> #include <d3dcompiler.h> //Some useful tools #define SAFE_DELETE( x ) { if(x) { delete (x); (x) = NULL; } } #define SAFE_DELETE_ARRAY( x ) { if(x) { delete[] (x); (x) = NULL; } } #define SAFE_RELEASE( x ) { if(x) { (x)->Release(); (x) = NULL; } }
相关文章推荐
- Android编写简单的手机通讯录,只是存到数据库里面,并没有显示出来,下次更新显示到自定义适配器的通讯录(这个只是教大家SQLite数据库如何使用)
- 如何打印Qt中的枚举所对应的字符串
- i2c--2.6.34文档:如何枚举产生i2c_client
- Android 中如何使用 enum / 枚举
- 如何枚举本地的连接
- 如何遍历枚举类型的对象、并获取枚举类型长度
- 枚举如何定义
- Java_Java中如何由枚举常量的ordin…
- 如何遍列 C# 枚举数的名称与值
- 如何在MyBatis中使用枚举
- 虚拟化 Hyper如何使用无线网络适配器
- Android学习笔记---19_采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器
- 如何将枚举绑定到DropDownList上
- 如何遍历枚举类型的对象、并获取枚举类型长度
- C# 如何避免异常”集合已修改;可能无法执行枚举操作。“
- scala 中如何 声明 枚举对象
- 如何将字符串或者数值转成枚举对象
- 如何用 Win32 APIs 枚举应用程序窗口和进程
- 如何枚举PCIE capability