D3D11中的设备介绍



Device Context可以被用于任何线程中,但一次只能在一个线程中使用。

所有的ID3D11Device接口都是free-threaded(线程无关的)的,也就是说可以在多个线程中同时调用其接口函数。

ID3D11DeviceContext的方法(除了那些在ID3D11DeviceChild中的方法)是线程相关的,也就是说只能一次在一个线程中使用其方法。

创建WARP和Reference设备的限制:

(1)在D3D 11中

D3D_DRIVER_TYPE_WARP支持feature level从D3D_FEATURE_LEVEL_9_1 through D3D_FEATURE_LEVEL_10_1。

D3D_DRIVER_TYPE_REFERENCE支持所有的feature level。

也就是说当你使用D3D11CreateDevice创建一个Direct3D 11 device时,可以并且只能使用上面的任意一种组合。

(2)在D3D 10.1中

D3D10_DRIVER_TYPE_WARP和D3D10_DRIVER_TYPE_REFERENCE支持feture level从D3D10_FEATURE_LEVEL_10_0到D3D10_FEATURE_LEVEL_10_1

也就是说当你使用D3D10CreateDevice1创建一个Direct3D 10.1 device时,可以并且只能使用上面的任意一种组合。

Swap Chain(交换链)

一个swap chain包含2个或多个buffers,用来render和display。它通常包含一个front buffer用来提交到显示设备,和一个back buffer用来作为render target。在immediate context完成render到后缓存后,swap chain并通过交换2个缓存来提交back buffer。

Swap chain包含了几个渲染特征:

render区域的大小、display刷新率、display模式、surface格式

通过填充一个DXGI_SWAP_CHAIN_DESC结构来定义swap chain的上述特征。如:

  1.     DXGI_SWAP_CHAIN_DESC sd;
  2.     ZeroMemory( &sd, sizeof( sd ) );
  3.     sd.BufferCount = 1;
  4.     sd.BufferDesc.Width = 640;
  5.     sd.BufferDesc.Height = 480;
  6.     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  7.     sd.BufferDesc.RefreshRate.Numerator = 60;
  8.     sd.BufferDesc.RefreshRate.Denominator = 1;
  9.     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  10.     sd.OutputWindow = g_hWnd;
  11.     sd.SampleDesc.Count = 1;
  12.     sd.SampleDesc.Quality = 0;
  13.     sd.Windowed = TRUE;

创建Device和Swap Chain:

         使用D3D11CreateDeviceAndSwapChain,同时初始化Device和Swap Chain

         使用IDXGIFactory::CreateSwapChain,然后通过D3D11CreateDevice创建Device

枚举GPU设备

DX10、DX11使用DXGI枚举一台机器上可获得的图形适配器。枚举图形设备可以做以下事情:

(1)       查看机器上安装了多少显卡

(2)       可以帮助你选择特定的显卡来创建D3D设备

(3)       返回一个IDXGIAdapter对象,用来查询设备能力

枚举过程:

(1)   调用CreateDXGIFactory函数创建IDXGIFactory对象

  IDXGIFactory * pFactory = NULL;

  CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)

(2)   通过IDXGIFactory::EnumAdapters函数查询每个设备

  for (UINT i = 0;

     pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND;

     ++i)

  { ... }

(3)   调用IDXGIAdapter::EnumOutputs枚举图形设备的输出对象设备

  IDXGIOutput* pOutput = NULL;

  HRESULT hr;

  //枚举pAdapter的主输出对象(显示器)

  hr = pAdapter->EnumOutputs(0,&pOutput);

(4)   调用IDXGIOutput::GetDisplayModeList返回一组DXGI_MODE_DESC对象。一个DXGI_MODE_DESC记录了一个合法的显示模式。 

  UINT numModes = 0;

  DXGI_MODE_DESC* displayModes = NULL;

  DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_FLOAT;

  // Get the number of elements

  hr = pOutput->GetDisplayModeList( format, 0, &numModes, NULL);

  displayModes = new DXGI_MODE_DESC[numModes];

  // Get the list

  hr = pOutput->GetDisplayModeList( format, 0, &numModes, displayModes);


下面的代码枚举机器上的所有显卡设备:
 
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;
}



Device Context可以被用于任何线程中,但一次只能在一个线程中使用。

所有的ID3D11Device接口都是free-threaded(线程无关的)的,也就是说可以在多个线程中同时调用其接口函数。

ID3D11DeviceContext的方法(除了那些在ID3D11DeviceChild中的方法)是线程相关的,也就是说只能一次在一个线程中使用其方法。

创建WARP和Reference设备的限制:

(1)在D3D 11中

D3D_DRIVER_TYPE_WARP支持feature level从D3D_FEATURE_LEVEL_9_1 through D3D_FEATURE_LEVEL_10_1。

D3D_DRIVER_TYPE_REFERENCE支持所有的feature level。

也就是说当你使用D3D11CreateDevice创建一个Direct3D 11 device时,可以并且只能使用上面的任意一种组合。

(2)在D3D 10.1中

D3D10_DRIVER_TYPE_WARP和D3D10_DRIVER_TYPE_REFERENCE支持feture level从D3D10_FEATURE_LEVEL_10_0到D3D10_FEATURE_LEVEL_10_1

也就是说当你使用D3D10CreateDevice1创建一个Direct3D 10.1 device时,可以并且只能使用上面的任意一种组合。

Swap Chain(交换链)

一个swap chain包含2个或多个buffers,用来render和display。它通常包含一个front buffer用来提交到显示设备,和一个back buffer用来作为render target。在immediate context完成render到后缓存后,swap chain并通过交换2个缓存来提交back buffer。

Swap chain包含了几个渲染特征:

render区域的大小、display刷新率、display模式、surface格式

通过填充一个DXGI_SWAP_CHAIN_DESC结构来定义swap chain的上述特征。如:

  1.     DXGI_SWAP_CHAIN_DESC sd;
  2.     ZeroMemory( &sd, sizeof( sd ) );
  3.     sd.BufferCount = 1;
  4.     sd.BufferDesc.Width = 640;
  5.     sd.BufferDesc.Height = 480;
  6.     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  7.     sd.BufferDesc.RefreshRate.Numerator = 60;
  8.     sd.BufferDesc.RefreshRate.Denominator = 1;
  9.     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  10.     sd.OutputWindow = g_hWnd;
  11.     sd.SampleDesc.Count = 1;
  12.     sd.SampleDesc.Quality = 0;
  13.     sd.Windowed = TRUE;

创建Device和Swap Chain:

         使用D3D11CreateDeviceAndSwapChain,同时初始化Device和Swap Chain

         使用IDXGIFactory::CreateSwapChain,然后通过D3D11CreateDevice创建Device

枚举GPU设备

DX10、DX11使用DXGI枚举一台机器上可获得的图形适配器。枚举图形设备可以做以下事情:

(1)       查看机器上安装了多少显卡

(2)       可以帮助你选择特定的显卡来创建D3D设备

(3)       返回一个IDXGIAdapter对象,用来查询设备能力

枚举过程:

(1)   调用CreateDXGIFactory函数创建IDXGIFactory对象

  IDXGIFactory * pFactory = NULL;

  CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)

(2)   通过IDXGIFactory::EnumAdapters函数查询每个设备

  for (UINT i = 0;

     pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND;

     ++i)

  { ... }

(3)   调用IDXGIAdapter::EnumOutputs枚举图形设备的输出对象设备

  IDXGIOutput* pOutput = NULL;

  HRESULT hr;

  //枚举pAdapter的主输出对象(显示器)

  hr = pAdapter->EnumOutputs(0,&pOutput);

(4)   调用IDXGIOutput::GetDisplayModeList返回一组DXGI_MODE_DESC对象。一个DXGI_MODE_DESC记录了一个合法的显示模式。 

  UINT numModes = 0;

  DXGI_MODE_DESC* displayModes = NULL;

  DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_FLOAT;

  // Get the number of elements

  hr = pOutput->GetDisplayModeList( format, 0, &numModes, NULL);

  displayModes = new DXGI_MODE_DESC[numModes];

  // Get the list

  hr = pOutput->GetDisplayModeList( format, 0, &numModes, displayModes);


下面的代码枚举机器上的所有显卡设备:
 
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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值