您的位置:首页 > 其它

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对象

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; } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: