完美获取N卡A卡的显存大小(使用OpenGL)
2013-11-04 09:14
302 查看
// 基于扩展NVX_gpu_memory_info extension
UINT QueryNVidiaCardMemory()
{
__try
{
int iVal = 0;
glGetIntegerv( GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &iVal );
return (UINT)iVal/1024;
}
__except(1)
{
}
return 0;
}
// 基于扩展WGL_AMD_gpu_association
UINT QueryAmdCardMemory()
{
__try
{
typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);
typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);
PFNWGLGETGPUIDSAMDPROC wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)wglGetProcAddress("wglGetGPUIDsAMD");
PFNWGLGETGPUINFOAMDPROC wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)wglGetProcAddress("wglGetGPUInfoAMD");
if( !wglGetGPUIDsAMD || !wglGetGPUInfoAMD )
{
return 0;
}
UINT n = wglGetGPUIDsAMD(0, 0);
UINT ids[24];
#define WGL_GPU_RAM_AMD 0x21A3
size_t TotalMemSize = 0;
wglGetGPUIDsAMD(n, ids);
wglGetGPUInfoAMD(
ids[0],
WGL_GPU_RAM_AMD,
GL_UNSIGNED_INT,
sizeof(size_t),
&TotalMemSize
);
return (UINT)TotalMemSize;
}
__except(1)
{
}
return 0;
}
UINT QueryDedicatedVideoCardMemory( bool bNvidiaCard, bool bAmdAtiCard )
{
__try
{
HWND hWnd = (HWND)你可以用的HWND;
HDC hdc = ::GetDC( hWnd );
if( hdc == NULL )
{
return 0;
}
PIXELFORMATDESCRIPTOR FormatDesc;
memset(&FormatDesc, 0, sizeof(PIXELFORMATDESCRIPTOR));
FormatDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
FormatDesc.nVersion = 1;
FormatDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | /*PFD_SUPPORT_GDI|*/ PFD_DOUBLEBUFFER;
FormatDesc.iPixelType = PFD_TYPE_RGBA;
FormatDesc.cColorBits = 32;
FormatDesc.cDepthBits = 32;
// FormatDesc.cStencilBits = 0;
FormatDesc.iLayerType = PFD_MAIN_PLANE;
GLuint PixelFormat = ChoosePixelFormat( hdc, &FormatDesc );
if( PixelFormat == NULL )
{
return 0;
}
SetPixelFormat( hdc, PixelFormat, &FormatDesc );
HGLRC hContext = wglCreateContext( hdc );
if( hContext == NULL )
{
return 0;
}
__try
{
if( wglMakeCurrent( hdc, hContext ) )
{
if( bNvidiaCard )
{
return QueryNVidiaCardMemory();
}
else if( bAmdAtiCard )
{
return QueryAmdCardMemory();
}
}
else
{
return 0;
}
}
__finally
{
wglMakeCurrent( NULL, NULL );
::DeleteDC( hdc );
wglDeleteContext( hContext );
}
}
__except(1)
{
}
return 0;
}
UINT QueryNVidiaCardMemory()
{
__try
{
int iVal = 0;
glGetIntegerv( GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &iVal );
return (UINT)iVal/1024;
}
__except(1)
{
}
return 0;
}
// 基于扩展WGL_AMD_gpu_association
UINT QueryAmdCardMemory()
{
__try
{
typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);
typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);
PFNWGLGETGPUIDSAMDPROC wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)wglGetProcAddress("wglGetGPUIDsAMD");
PFNWGLGETGPUINFOAMDPROC wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)wglGetProcAddress("wglGetGPUInfoAMD");
if( !wglGetGPUIDsAMD || !wglGetGPUInfoAMD )
{
return 0;
}
UINT n = wglGetGPUIDsAMD(0, 0);
UINT ids[24];
#define WGL_GPU_RAM_AMD 0x21A3
size_t TotalMemSize = 0;
wglGetGPUIDsAMD(n, ids);
wglGetGPUInfoAMD(
ids[0],
WGL_GPU_RAM_AMD,
GL_UNSIGNED_INT,
sizeof(size_t),
&TotalMemSize
);
return (UINT)TotalMemSize;
}
__except(1)
{
}
return 0;
}
UINT QueryDedicatedVideoCardMemory( bool bNvidiaCard, bool bAmdAtiCard )
{
__try
{
HWND hWnd = (HWND)你可以用的HWND;
HDC hdc = ::GetDC( hWnd );
if( hdc == NULL )
{
return 0;
}
PIXELFORMATDESCRIPTOR FormatDesc;
memset(&FormatDesc, 0, sizeof(PIXELFORMATDESCRIPTOR));
FormatDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
FormatDesc.nVersion = 1;
FormatDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | /*PFD_SUPPORT_GDI|*/ PFD_DOUBLEBUFFER;
FormatDesc.iPixelType = PFD_TYPE_RGBA;
FormatDesc.cColorBits = 32;
FormatDesc.cDepthBits = 32;
// FormatDesc.cStencilBits = 0;
FormatDesc.iLayerType = PFD_MAIN_PLANE;
GLuint PixelFormat = ChoosePixelFormat( hdc, &FormatDesc );
if( PixelFormat == NULL )
{
return 0;
}
SetPixelFormat( hdc, PixelFormat, &FormatDesc );
HGLRC hContext = wglCreateContext( hdc );
if( hContext == NULL )
{
return 0;
}
__try
{
if( wglMakeCurrent( hdc, hContext ) )
{
if( bNvidiaCard )
{
return QueryNVidiaCardMemory();
}
else if( bAmdAtiCard )
{
return QueryAmdCardMemory();
}
}
else
{
return 0;
}
}
__finally
{
wglMakeCurrent( NULL, NULL );
::DeleteDC( hdc );
wglDeleteContext( hContext );
}
}
__except(1)
{
}
return 0;
}
相关文章推荐
- 6410移植linux3.3.5
- linux内核移植(6410)
- Documentation\block\ioprio.txt
- WEB架构师成长之路之一-走正确的路
- linux 怎么完全卸载mysql数据库
- 关于vim的一些使用以及Dos文件到Linux、Mac下问题
- Linux下C语言的调试--转
- 说说大型高并发高负载网站的系统架构
- Nginx 0.5.33 + PHP 5.2.5(FastCGI)搭建胜过Apache 10倍的Web服务器(第2版)
- Mosix:强大的集群Linux方案
- 基于Linux的集群系统的文件系统介绍
- LBS系统架构分析
- Linux进程间通信方式之管道(pipe)
- hibernate之openSession()与getCurrentSession()的区别
- Linux网站架构系列之Apache----部署篇
- Linux网站架构系列之Apache----部署篇
- shell 并发测试
- linux磁盘分区fdisk命令详解
- centos关机与重启命令详解
- linux 内核配置 make menuconfig