zoukankan      html  css  js  c++  java
  • 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;
    }

     

     

    PS:cnblogs的文档编辑敢不敢再强大一点,至少从word中复制的大括号可以粘贴上吧,毕竟图片效果不好。

  • 相关阅读:
    观光奶牛Sightseeing Cows (二分+spfa(dfs))
    卢卡斯定理学习笔记
    分层图学习笔记
    热烈祝贺CRMEB运营中心乔迁新址
    CRMEB知识付费系统v1.2发布上线直播带课功能
    推荐一款超好用码云start超4.9k采用前后端分离开发的小程序商城源码
    crmeb打通版3.x小程序商城公众号重复无限刷新登陆解决
    如何利用CRMEB 3.2打通版小程序商城做直播带货
    crmeb打通版开源微信公众号小程序商城框架源码
    一文读懂知识付费平台的运营方向及平台选择
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/2074485.html
Copyright © 2011-2022 走看看