Direct3D的Adapter显卡性能检测类
/*IDirect3D对象枚举Adapter的功能函数:
GetAdapterCount()
GetAdapterDisplayMode
GetAdapterIdentifier //得到适配器描述
CheckDeviceType
GetDeviceCaps //指定设备的性能,主要判断是否支持硬件顶点处理(T&L)
GetAdapterModeCount //得到适配器上指定缓冲格式所有可用的显示模式
EnumAdapterModes //枚举所有显示模式
CheckDeviceFormat
CheckDeviceMultiSampleType
本类是对上述函数的封装使得使用更方便,且提供了这些函数的使用例子。
author:Jesse Cen
date:2014.11.23
*/
//一、D3DCheckAdapter.h文件
#ifndef _D3DCHECKADAPTER_H_
#define _D3DCHECKDISPLAY_H_
#include"D3DUtility.h"
class D3DCheckAdapter
{
private:
D3DCheckAdapter(){};
public:
~D3DCheckAdapter(){};
// 单例
static D3DCheckAdapter* GetInstace();
// 1.检查指定的表面像素格式,是否在指定的适配器类型、适配器像素格式下可用。
// GetAdapterDisplayMode,CheckDeviceType的应用
bool GetBackBufferFormat(IDirect3D9 *pD3D, D3DDEVTYPE deviceType,bool bWindow, D3DFORMAT &fmt);
// 2.根据适配器类型,获取顶点运算(变换和光照运算)的格式
// D3DCAPS9结构体,GetDeviceCaps的应用
bool GetDisplayVertexType(IDirect3D9 *pD3D, D3DDEVTYPEdeviceType, int &nVertexType);
// 3.输出显卡信息,Description描述,厂商型号,Dircet3D的驱动Driver版本号,显卡的唯一标识号:DeviceIdentifier
// GetAdapterCount(),GetAdapterIdentifier的使用。
void PrintDisplayInfo(IDirect3D9 *pD3D);
// 4.输出指定Adapter,显卡像素模式(不会与缓存表面格式做兼容考虑)的显卡适配器模式信息
// GetAdapterModeCount,EnumAdapterModes的使用
void PrintDisplayModeInfo(IDirect3D9 *pD3D, D3DFORMAT fmt);
// 5.对于指定的资源类型,检查资源的使用方式,资源像素格式,在默认的显卡适配器下是否支持
// GetAdapterDisplayMode,CheckDeviceFormat的使用
bool CheckResourceFormat(IDirect3D9 *pD3D, DWORD nSrcUsage,D3DRESOURCETYPE srcType, D3DFORMAT srcFmt);
// 6.对指定的表面像素格式,窗口模式,和显卡像素模式;检查对指定的多重采样类型支持不,且返回质量水平等级
// CheckDeviceMultiSampleType的应用
bool CheckMultiSampleType(IDirect3D9 *pD3D, D3DFORMAT surfaceFmt,bool bWindow, D3DMULTISAMPLE_TYPE eSampleType, DWORD *pQualityLevel);
// 7.根据显卡适配器和目标缓存类型,检查指定深度缓存的格式是否支持
// CheckDepthStencilMatch的应用
bool CheckDepthBufferFormt(IDirect3D9 *pD3D, D3DFORMAT targetBufferFmt, D3DFORMAT depthFmt);
private:
static D3DCheckAdapter* m_pCheckDisplayObj;
};
#endif
//二、 D3DCheckAdapter.cpp文件
#include"D3DCheckAdapter.h"
D3DCheckAdapter*D3DCheckAdapter::m_pCheckDisplayObj = NULL;
D3DCheckAdapter*D3DCheckAdapter::GetInstace()
{
if(m_pCheckDisplayObj != NULL)
{
return m_pCheckDisplayObj;
}
m_pCheckDisplayObj = new D3DCheckAdapter();
return m_pCheckDisplayObj;
}
boolD3DCheckAdapter::GetBackBufferFormat(IDirect3D9 *pD3D, D3DDEVTYPE deviceType,bool bWindow, D3DFORMAT &fmt)
{
if(pD3D == NULL)
{
return false;
}
D3DDISPLAYMODE adapterMode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&adapterMode);
if(D3D_OK != pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,deviceType, adapterMode.Format, fmt, bWindow))
{
fmt = adapterMode.Format;
};
return true;
}
boolD3DCheckAdapter::GetDisplayVertexType(IDirect3D9 *pD3D, D3DDEVTYPE deviceType,int &nVertexType)
{
if(pD3D == NULL)
{
return false;
}
D3DCAPS9 caps;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType,&caps);
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
nVertexType = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
nVertexType = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
return true;
}
static char *print_guid(GUIDid) {
char * str = (char *)malloc(40);
sprintf( str, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
id.Data1, id.Data2, id.Data3,
id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7] );
return str;
}
voidD3DCheckAdapter::PrintDisplayInfo(IDirect3D9 *pD3D)
{
if(pD3D == NULL)
{
return;
}
D3DADAPTER_IDENTIFIER9 adapterID; // Used to store device info
char strBuffer[2048];
DWORD dwDisplayCount = pD3D->GetAdapterCount();
for(DWORD i = 0; i < dwDisplayCount; i++)
{
if( pD3D->GetAdapterIdentifier( i/*D3DADAPTER_DEFAULT*/, 0,&adapterID ) != D3D_OK )
{
return;
}
_stprintf(strBuffer,_T("Driver: %s\n, Description: %s\n, Device Name: %s\n, Vendor id:%4x\n,Device id: %4x\n, Product: %x\n,\
Version:%x\n, SubVersion: %x\n, Build: %x %d.%d.%d.%d\n,\
SubSysId: %x\n, Revision: %x\n,GUID %s\n, WHQLLevel:%d\n"),
adapterID.Driver, adapterID.Description,adapterID.DeviceName, adapterID.VendorId, adapterID.DeviceId,
HIWORD(adapterID.DriverVersion.HighPart),LOWORD(adapterID.DriverVersion.HighPart),
HIWORD(adapterID.DriverVersion.LowPart),LOWORD(adapterID.DriverVersion.LowPart),
HIWORD(adapterID.DriverVersion.HighPart),LOWORD(adapterID.DriverVersion.HighPart),
HIWORD(adapterID.DriverVersion.LowPart),LOWORD(adapterID.DriverVersion.LowPart),
adapterID.SubSysId, adapterID.Revision,print_guid(adapterID.DeviceIdentifier), adapterID.WHQLLevel);
MessageBox(NULL,strBuffer, "Identity", MB_OK);
}
}
voidD3DCheckAdapter::PrintDisplayModeInfo(IDirect3D9 *pD3D, D3DFORMAT fmt)
{
if(pD3D == NULL)
{
MessageBox(NULL,"GetAdapterModeCount", "GetAdapterModeCount", MB_OK);
return;
}
// 显卡适配器模式的个数,主要是分辨率的差异
DWORD nAdapterModeCount=pD3D->GetAdapterModeCount(D3DADAPTER_DEFAULT, fmt);
if(nAdapterModeCount == 0)
{
char strTips[516];
sprintf_s(strTips, "D3DFMT_格式:%x不支持", fmt);
MessageBox(NULL, strTips, "PrintDisplayModeInfo",MB_OK);
}
for(DWORD i = 0; i < nAdapterModeCount; i++)
{
D3DDISPLAYMODE mode;
if(D3D_OK == pD3D->EnumAdapterModes(D3DADAPTER_DEFAULT,fmt, i,&mode))
{
char strBuffer[1024];
sprintf_s(strBuffer, "D3DDISPLAYMODE info, width:%u,height:%u, freshRate:%u, Format:%d \n",\
mode.Width, mode.Height, mode.RefreshRate,mode.Format);
OutputDebugString(strBuffer);
}
}
}
boolD3DCheckAdapter::CheckResourceFormat(IDirect3D9 *pD3D, DWORD nSrcUsage,D3DRESOURCETYPE srcType, D3DFORMAT srcFmt)
{
if(pD3D == NULL)
{
return false;
}
D3DDISPLAYMODE displayMode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode);
if(D3D_OK == pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, displayMode.Format, nSrcUsage, srcType, srcFmt))
{
return true;
}
return false;
}
boolD3DCheckAdapter::CheckMultiSampleType(IDirect3D9 *pD3D, D3DFORMAT surfaceFmt,bool bWindow,
D3DMULTISAMPLE_TYPE eSampleType, DWORD *pQualityLevel)
{
//变量MultiSampleType的值设为D3DMULTISAMPLE_NONMASKABLE,就必须设定成员变量MultiSampleQuality的质量等级值
if( D3D_OK ==pD3D->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT/*caps.AdapterOrdinal*/,
D3DDEVTYPE_HAL/*caps.DeviceType*/,
surfaceFmt,
bWindow,
eSampleType,
pQualityLevel))
{
return true;
}
return false;
};
bool D3DCheckAdapter::CheckDepthBufferFormt(IDirect3D9 *pD3D, D3DFORMAT targetBufferFmt, D3DFORMAT depthFmt)
{
if(pD3D == NULL)
{
return false;
}
D3DDISPLAYMODE mode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
if(D3D_OK == pD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mode.Format, targetBufferFmt, depthFmt))
{
return true;
}
return false;
}
// 三、main.cpp中
IDirect3D9* d3d9 = 0;
d3d9 = ::Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, "Direct3DCreate9() - FAILED", 0,0);
return false;
}
// 1.CheckDeviceFormat,显卡模式和表面会做兼容处理
D3DFORMAT backBufferFormat = D3DFMT_A8R8G8B8;
if(!D3DCheckAdapter::GetInstace()->GetBackBufferFormat(d3d9,deviceType, windowed, backBufferFormat))
{
::MessageBox(0, "getBackBufferFormat - FAILED", 0,0);
return false;
}
// 2.Check Vertex Proccessing Type
int vp = 0;
if(!D3DCheckAdapter::GetInstace()->GetDisplayVertexType(d3d9,deviceType, vp))
{
::MessageBox(0, "getBackBufferFormat - FAILED", 0,0);
return false;
}
// 3.显示显卡的信息
D3DCheckAdapter::GetInstace()->PrintDisplayInfo(d3d9);
// 4.输出显卡适配器模式信息,不会与缓存表面格式做兼容考虑
D3DCheckAdapter::GetInstace()->PrintDisplayModeInfo(d3d9,D3DFMT_X8R8G8B8);
// 5.显卡模式和资源表面会做兼容处理
int nUsageTexture = D3DUSAGE_WRITEONLY;
D3DFORMAT fmtTexture = D3DFMT_A8R8G8B8;
if(!D3DCheckAdapter::GetInstace()->CheckResourceFormat(d3d9,nUsageTexture/*D3DUSAGE_DEPTHSTENCIL*/,
D3DRTYPE_TEXTURE/*D3DRTYPE_SURFACE*/,fmtTexture/*D3DFMT_D15S1*/))
{
::MessageBox(0, "D3DCheckAdapter::GetInstace()->CheckResourceFormatFail", "Texture Resource FMT", 0);
return false;
}
// 6.采样纹理
D3DMULTISAMPLE_TYPE eSampleType = D3DMULTISAMPLE_4_SAMPLES;// 测试结果本机只是支持4,2类型的采样纹理
DWORD dwQualityLevel = 0;
if(!D3DCheckAdapter::GetInstace()->CheckMultiSampleType(d3d9,D3DFMT_A8R8G8B8, windowed, eSampleType,&dwQualityLevel))
{
eSampleType = D3DMULTISAMPLE_NONE;
}
// 7.深度缓存检测
D3DFORMAT depthStencilFmt = D3DFMT_D16/*D3DFMT_D15S1*/;
if(!D3DCheckAdapter::GetInstace()->CheckDepthBufferFormt(d3d9, D3DFMT_A8R8G8B8, depthStencilFmt))
{
::MessageBox(0, "GetInstace()->CheckDepthBufferFormt Fail", "Texture Resource FMT", 0);
return false;
}
// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = backBufferFormat;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = eSampleType;//D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0; // 不能用dwQualityLevel
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
Direct3D的Adapter显卡性能检测类相关推荐
- ios APP性能检测
转载至:Bugly 首先,要明确性能检测都需要关注哪些指标,笔者列举了以下几个主要的,后面会详细说: 启动时间 内存占用量,内存告警次数 CPU使用率 页面渲染时间,刷新帧率 网络请求时间,流量消耗 ...
- Instruments性能检测
2019独角兽企业重金招聘Python工程师标准>>> 先来一发苹果官网上Instruments User Guide,其实没啥用,英语不好的也懒得去看.(反正我是看不懂) 关于In ...
- 《iOS APP 性能检测》
colawyeeqiu | 导语 最近组里在做性能优化,既然要优化,就首先要有指标来描述性能水平,并且可以检测到这些指标,通过指标值的变化来看优化效果,于是笔者调研了iOS APP性能检测的一些方法, ...
- 计算机硬件检测标准模板,计算机硬件性能检测相关实验模板.doc
文档介绍: 计算机硬件性能检测相关实验<计算机硬件性能检测>实验指导书实验目的:1.熟练掌握通过测试软件在不拆机情况下了解计算机硬件参数信息及性能检测方法;2.掌握常用CPU.内存.显卡. ...
- CVPR2020检测类论文最全汇总:136篇论文方向细分(附代码和论文打包下载)
为了方便大家进一步的学习,我们对这CVPR中的1467篇论文进行了整理,本次分享的是所有检测类论文,并将它们细分为3D目标检测.人脸检测.动作检测.视频目标检测.文本检测.行人检测等方向,同时附上了相 ...
- 前端动画优化及性能检测
前端动画优化及性能检测工具使用 前端使用动画可以分为两类: css 动画 js 动画 我们提倡能够使用 css 完成的动画尽量使用 css ( 即使用 animation 和 keyframes ). ...
- 计算机显卡敀主要性能参数,显卡性能看什么参数(新手必备的显卡性能知识全解)...
每台电脑上面都配置了电脑显卡,显卡重要性不言而喻.显卡是电脑内主要的板卡之一,它负责将CPU送来的信息处理为显示器可以识别的信息,送到显示器上形成影像.主机对显示屏幕的任何操作都要通过显卡.电脑显卡性 ...
- 计算机配置型号及主要技术指标,显卡性能看什么参数(新手必备的显卡性能知识全解)...
每台电脑上面都配置了电脑显卡,显卡重要性不言而喻.显卡是电脑内主要的板卡之一,它负责将CPU送来的信息处理为显示器可以识别的信息,送到显示器上形成影像.主机对显示屏幕的任何操作都要通过显卡.电脑显卡性 ...
- 台式电脑cpu排行榜_2020年台式电脑的CPU和显卡性能天梯图
本次CPU天梯图更新的型号有: INTEL平台:10代I9-10980XE I9-10940X I9-10920X I9-10900X 和 9代 I9 9900KS. AMD平台:锐龙Ryzen 线程 ...
最新文章
- js闭包循环原因_常见的三个 JS 面试题
- 专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发
- C#中Trim()、TrimStart()、TrimEnd()的错误认识
- ES5 getter setter
- Anaconda卸载与重装过程记录
- 微课|中学生可以这样学Python(例11.2):tkinter猜数游戏(1)
- 41 岁蚂蚁金服总裁助理去世; 华为首款 5G 手机欧洲上市;库克首谈 5G iPhone | 极客头条...
- Java多线程研究(八)使用Exchange在多个线程间交换数据
- 显示菜单栏_mac菜单栏不显示了,如何设置?
- designer pyqt5 界面切换_PyQT5堆叠布局:切换界面(QStackedLayout)
- 【游戏策划】Excel的使用技巧(一)
- 【英语四六级-必背单词】高中英语单词 (H)-MP3试听与下载
- 手机浏览器 html编辑器,vue移动端富文本编辑器vue-html5-editor
- 了解Xcelsius2008系统
- 欲练神功必先自宫,String 自宫后“不可变性”到底有啥好处?
- 【Bluetooth|蓝牙开发】二、蓝牙开发入门
- 教你用人工智能写文章写歌词写对联
- 游戏服务器框架概括分析
- C# 如何创建一个Windows服务(Windows Service)
- 跑了1135家制造企业 它们是怎么把自己玩死的了