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;
}

D3D11中的设备介绍相关推荐

  1. 道路交通安全违法行为图像取证技术规范_海康移动取证方案中的设备介绍

    上节介绍了一下海康移动取证方案的大概组成,这节介绍一下方案中,数据采集所需的硬件设备. 移动取证系统方案拓扑 车载前端设备 车载智慧云台采集设备(两选一) 海康车载智慧云台采用1080P.30倍变倍的 ...

  2. linux卸载dev中的设备,Linux /dev 常见特殊设备介绍与应用

    linux是文件型系统,所有硬件如软件都会在对于的目录下面有相应的文件表示.对于dev这个目录,我们知道它下面的文件,表示的是linux的设备.在windows系统中,设备大家很好理解,象硬盘,磁盘指 ...

  3. Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍

    1 解决ls查看文件爱呢颜色为白色 方法一: 1.修改~/.bashrc文件,添加如下内容 alias ls='ls --color=auto' 2.source一下,让修改配置生效 source ~ ...

  4. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  5. linux内核中的 哈希表_Linux内核中的设备模型及SCSI示例解析

    关于硬件架构 想要了解Linux操作系统的内核设备和驱动模型,最好先了解一下现在计算机硬件的架构.对计算机硬件有一定了解之后,对理解Linux内核中的设备和驱动模型非常有帮助.如图1是常规计算机的硬件 ...

  6. Linux中 /boot 目录介绍 【转载】

    Linux中 /boot 目录介绍 转自:点击打开链接 一./boot/目录中的文件和目录 Linux系统在本地启动时,目录/boot/非常重要,其中的文件和目录有: (1)系统Kernel的配置文件 ...

  7. OpenGL和D3D11中的深度模版测试

    在OpenGL和D3D11的管线中,像素shader之后的操作就是深度模版测试,深度模版测试是以sample为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息.深度模版测试对每个采样 ...

  8. 什么叫pmt测试分析_圆偏振发光光谱仪——南方科技大学分析测试中心设备介绍第51期...

    51 南科大分析测试中心设备介绍 之 圆偏振发光光谱仪 51 设备简介 CPL-300圆偏振发光光谱仪由150W无臭氧Xe灯.两个单色仪系统(Mex和Mem).圆偏振调制单元,和PMT探测器组成.Me ...

  9. Cubase中MIDI设备的如何添加面板

    在Cubase(http://www.cubase.cc/) 软件的MIDI添加设备的窗口中,有一个主编辑窗口,分为设备和编辑面板窗口.而在编辑面板窗口中,有设备节点.面板.变量等,关于变量的设置可以 ...

最新文章

  1. 一文带你看懂Spring事务!
  2. 阿里的离职率真的是互联网大厂里最低的吗?
  3. 二进制编译安装mysql_MariaDB通用二进制编译安装详解
  4. mysql006添加外键约束
  5. YbtOJ#532-往事之树【广义SAM,线段树合并】
  6. ambari搭建注意事项
  7. 计算机网络:VLAN和VXLAN
  8. 求数组中每个数字第一次出现的位置
  9. android 右边抽屉,android – 抽屉在右侧抽屉中切换
  10. c语言宏定义数组_利用数组处理批量数据 C语言程序编写定义与利用数组技巧全归纳...
  11. 洛谷P1414 又是毕业季II 数论
  12. python3 open函数_Python3 open函数
  13. 爱老虎油和你探索flash中的对象
  14. 太阳系行星运行图-java多媒体实验
  15. NumPy 取消科学计数法:np.set_printoptions(suppress=True)
  16. 为什么微软是数字时代的领头羊?
  17. RGB24 To Yuv420 C语言 +汇编实现(windows平台)
  18. Linux下搭建第一个区块链网络(FISCO BCOS)
  19. 电脑端怎样具体操作图片文字识别?
  20. Pyside2,Pycharm中右键转py文件的时候,出来的结果总是c++代码

热门文章

  1. 20000字节的包算大吗_同样是真皮,200块和20000块的包包,到底有什么区别?
  2. excel表格怎么拆分为多个工作簿?
  3. 有源器件和无源器件的区别
  4. 【MES】MES与PLC握手的几种方式
  5. 自动化专业保研分享(六级没有通过)
  6. 结构化电子病历的特点及优势
  7. 内部方法调用,事务不起作用的原因及解决办法
  8. 扫脸支付,将开启下一个移动支付新时代
  9. 获取本机连接的wifi名
  10. wifi p2p本机设备名DeviceName设置