DirectX 9 get the Adapter info

本文介绍如何使用 DirectX9 API 获取计算机中安装的所有显卡适配器的信息,包括适配器的描述、驱动程序版本等,并通过示例代码展示了如何枚举这些适配器。

1. In DirectX 9,  the adpater means   One Display Card & One Moniter, the concept is difference with DirectX 10 's DXGI 


code:

     #include <d3d9.h>






LPDIRECT3D9             g_pD3D       = NULL; //Direct3D对象  


HRESULT InitD3D()  
{  
    //创建Direct3D对象, 该对象用来创建Direct3D设备对象  
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )  
        return E_FAIL;  

UINT cnt = g_pD3D->GetAdapterCount();


printf("Adapter Count %d\n", cnt);


for(UINT i = 0; i < cnt; ++i)
{
D3DADAPTER_IDENTIFIER9 adpInfo;
g_pD3D->GetAdapterIdentifier(i, 0, &adpInfo);


printf("info of adapter(%d):\n", i+1);
printf("\tDriver[%s]\n", adpInfo.Driver);
printf("\tDescription[%s]\n", adpInfo.Description);
printf("\tDevName[%s]\n", adpInfo.DeviceName);
printf("\tVendorId[%d]\n", adpInfo.VendorId);
printf("\tDriverVersion[%d]\n", adpInfo.DriverVersion);
//printf("\tDeviceIdentifier[%s]\n", adpInfo.DeviceIdentifier);

}
return S_OK;  
}  




#include <vector>
class AdapterInfo
{
public:
typedef  std::vector<D3DADAPTER_IDENTIFIER9> ADAPTER_INFO;




AdapterInfo(LPDIRECT3D9 pD3D)
:m_pD3D(pD3D)
{
this->Init();
}
~AdapterInfo(){}


int Init()
{
UINT cnt = m_pD3D->GetAdapterCount();


for(UINT i = 0; i < cnt; ++i)
{
D3DADAPTER_IDENTIFIER9 adpInfo;
if(D3D_OK == m_pD3D->GetAdapterIdentifier(i, 0, &adpInfo))
{
m_infos.push_back(adpInfo);
}
else
{
return -1;
}
}
return 0;
}


unsigned int GetAdapterCount()
{
return m_infos.size();
}

const AdapterInfo::ADAPTER_INFO & GetInfo()
{
return m_infos;
}


private:
LPDIRECT3D9 m_pD3D;

ADAPTER_INFO m_infos;
};


HRESULT TestGetInfo()  
{  
    //创建Direct3D对象, 该对象用来创建Direct3D设备对象  
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )  
        return E_FAIL;  

AdapterInfo info(g_pD3D);


unsigned int cnt = info.GetAdapterCount();
printf("Adapter Count %d\n", cnt);


for(unsigned int i = 0; i < cnt; ++i)
{
const D3DADAPTER_IDENTIFIER9 & adpInfo = info.GetInfo()[i];


printf("info of adapter(%d):\n", i+1);
printf("\tDriver[%s]\n", adpInfo.Driver);
printf("\tDescription[%s]\n", adpInfo.Description);
printf("\tDevName[%s]\n", adpInfo.DeviceName);
printf("\tVendorId[%d]\n", adpInfo.VendorId);
printf("\tDriverVersion[%d]\n", adpInfo.DriverVersion);
}
return S_OK;  
}  




int _tmain(int argc, _TCHAR* argv[])
{


TestGetInfo();


getchar();


return 0;
}

### DirectX 12简介 DirectX 12 是微软推出的一个低级图形和计算API,旨在提供更高的性能以及更好的硬件控制能力。该版本引入了许多新特性和改进之处,使得开发者能够更加精细地掌控GPU资源分配与利用效率[^1]。 ### 主要特性 #### 显存管理 不同于以往的DirectX版本,在D3D12中应用程序可以直接参与显存页面映射过程,从而减少了不必要的内存复制操作并提高了带宽利用率。这不仅有助于降低功耗,同时也增强了程序对于有限视频RAM空间的有效使用。 #### 多线程渲染支持 为了充分利用现代CPU架构的优势,D3D12允许命令列表创建分布在多个核心之上完成。这意味着即使在一个复杂的场景下也能保持较高的帧率和平滑度,因为各个部分的工作负载被均匀分散开来处理了。 #### 异步Draw Call执行 借助于新的异步提交机制,D3D12可以在不阻塞主线程的情况下发送绘制调用给GPU进行处理。这一功能特别适合用于构建高性能游戏引擎或其他实时交互应用软件开发环境之中。 ```cpp // 创建设备对象 ID3D12Device* device; ThrowIfFailed(D3D12CreateDevice( adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device) )); // 设置命令队列描述符 D3D12_COMMAND_QUEUE_DESC queueDesc = {}; queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; // 创建命令队列 ComPtr<ID3D12CommandQueue> commandQueue; ThrowIfFailed(device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue))); ``` 这段代码展示了如何初始化一个基本的 Direct3D 12 设备实例,并设置好相应的命令队列以便后续绘图指令的调度与执行[^4]。 ### 使用教程概览 当涉及到具体的编码实践时,建议先熟悉以下几个方面: - **资源状态转换**:由于D3D12采用了更为严格的资源生命周期管理模式,因此需要明确指定每次访问前后的预期状态变化情况; - **根签名设计**:这是连接着Shader参数传递路径的重要环节之一; - **Pipeline State Object (PSO)** 构建:它包含了所有固定函数阶段配置选项集合体,决定了最终呈现效果的具体表现形式; - **Fence同步原语运用**:用来协调不同上下文间的数据交换流程,确保数据一致性不受破坏。 以上只是入门指南的一部分内容概述,实际项目实施过程中还需要不断积累经验教训才能达到理想中的优化程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值