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的上述特征。如:
创建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
void
)
{
IDXGIAdapter * pAdapter;
std::vector
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的上述特征。如:
创建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
void
)
{
IDXGIAdapter * pAdapter;
std::vector
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;
}
|