Determine Intel HD Graphics Card Version Via WinAPI

前端 未结 2 842
南旧
南旧 2020-12-02 02:51

So I am trying to get information on graphics cards via WinAPI functions, but have a question regarding how to get my exact card information. I have written code to call Enu

相关标签:
2条回答
  • 2020-12-02 03:01

    The primary problem with "driver version" is that video driver consists of multiple components which might be marker differently and the versions you obtain via different APIs might also vary.

    Perhaps straightforward way is to use SetupDiGetClassDevs(&GUID_DEVCLASS_DISPLAY, ... API and enumerate the items. This is going to give you the data close to what you see in device manager, with versions - DEVPKEY_Device_DriverVersion obtained with SetupDiGetDeviceRegistryProperty value specifically.

    If you run this utility, if includes a section "Display Devices" with enumeration as mentioned, and it does mention driver version:

    Display Devices

    • Intel(R) HD Graphics 4600
      • Instance: PCI\VEN_8086&DEV_0412&SUBSYS_85341043&REV_06\3&11583659&0&10
      • DEVPKEY_Device_Manufacturer: Intel Corporation
      • DEVPKEY_Device_DriverVersion: 20.19.15.4835 <<-----------------------
    • NVIDIA GeForce GTX 750
      • Instance: PCI\VEN_10DE&DEV_1381&SUBSYS_288B19DA&REV_A2\4&3834D97&0&0008
      • DEVPKEY_Device_Manufacturer: NVIDIA
      • DEVPKEY_Device_DriverVersion: 23.21.13.8813
    0 讨论(0)
  • 2020-12-02 03:11

    I would use OpenGL instead WinAPI for this because I do not know if WinAPI even has some feature like this and too lazy to research. Yes you can search registry keys for this info but that is not safe in the future due to possible location/name change. The OpenGL way is straight forward:

    1. create OpenGL rendering context
    2. obtain the appropriate vendor and device strings.
    3. release OpenGL rendering context

    It will work for any OpenGL capable graphic card/driver supporting OpenGL 1.0 which are all of the nowadays cards.

    • see: C++ example of OpenGL context initialization
    • or: complete GL+VAO/VBO+GLSL+shaders example in C++

    You can use OpenGL function glGetString to obtain this info:

    GL_VENDOR Returns the company responsible for this OpenGL implementation. This name does not change from release to release.  
    GL_RENDERER Returns the name of the renderer. This name is typically specific to a particular configuration of a hardware platform. It does not change from release to release.  
    GL_VERSION Returns a version or release number (of supported OpenGL and gfx driver version)
    GL_EXTENSIONS Returns a space-separated list of supported extensions to OpenGL (all capabilities of your card)
    

    The rest is easy (using gl_init,gl_exit from second link):

    gl_init(Your_App_Window_Handle);
    char *vendor =(char*)glGetString(GL_VENDOR);
    char *device =(char*)glGetString(GL_RENDERER);
    char *version=(char*)glGetString(GL_VERSION);
    char *ext    =(char*)glGetString(GL_EXTENSIONS);
    gl_exit();
    

    Mine setup returns:

    vendor ="NVIDIA Corporation"
    device ="GeForce GTX 550 Ti/PCIe/SSE2"
    version="4.5.0 NVIDIA 347.25"
    ext    ="GL_AMD_multi_draw_indirect GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage GL_ARB_conservative_depth GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_indirect GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_enhanced_layouts GL_ARB_ES2_compatibility GL_ARB_ES3_compatibility GL_ARB_ES3_1_compatibility GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_no_attachments GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_NV_internalformat_sample_query GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counters GL_ARB_shader_bit_encoding GL_ARB_shader_draw_parameters GL
    

    [Notes]

    you need to include only gl.h for this no need for glu,glew or anything else (except wglext.h which should be included on its own inside gl.h). It is usually located in separate include subdirectory like:

    #include <gl\gl.h>
    

    [Edit1]

    As Intel OpenGL implementation does not expose the version too I see only one other option. You need to acquire PCI ID VID/PID of the card and cross check against known values:

    Model               CPU arch.       Release date    PCI ID      Execution units
    HD Graphics         Arrandale               2010    8086:0046   6
    HD Graphics         Sandy Bridge    January 2011    8086:0106   6
    HD Graphics 2000    Sandy Bridge    January 2011    8086:0102   6
    HD Graphics 3000    Sandy Bridge    January 2011    8086:0116   16
    HD Graphics 2500    Ivy Bridge      April 2012      8086:016A   6
    HD Graphics 4000    Ivy Bridge      April 2012      8086:0166   16
    HD Graphics 4400    Haswell               2013                  20
    HD Graphics 4600    Haswell               2013      8086:0416   20
    HD Graphics 5500    Broadwell             2015                  24
    

    taken from here.

    To obtain the PCI ID you can use this:

    • my setupapi.h C++ example

    Just change the parsing string from TEXT("USB") to TEXT("PCI") and check VID 8086 devices so:

    bool PCIinfo()
        {
        int i,n;
        AnsiString s,txt="";
        DWORD dwSize,dwPropertyRegDataType;
        HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        TCHAR szDesc[1024];
    
    //  hDevInfo = SetupDiGetClassDevs(NULL, NULL       , NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all devices
    //  hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all connected USB devices
        hDevInfo = SetupDiGetClassDevs(NULL, TEXT("PCI"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all connected PCI devices
    
        if (hDevInfo == INVALID_HANDLE_VALUE) return false;
        // Find the ones that are driverless
        for (i=0;;i++)
            {
            DeviceInfoData.cbSize = sizeof(DeviceInfoData);
            if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break;
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=40; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            txt+="\r\n";
            }
        Main->mm_log->Lines->Add(txt);
        return true;
        }
    

    that code returns on my setup this:

    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1400&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 0         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1401&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 1         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1402&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 2         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1403&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 3         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1404&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 4         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1405&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 5         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1410&SUBSYS_14101022&REV_00                     PCI bus 0, device 0, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1412&SUBSYS_12341022&REV_00                     PCI bus 0, device 2, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1414&SUBSYS_12341022&REV_00                     PCI bus 0, device 4, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1417&SUBSYS_12341022&REV_00                     PCI bus 0, device 7, function 0          
    AMD IOMMU Device                                 PCI\VEN_1022&DEV_1419&SUBSYS_14191022&REV_00                     PCI bus 0, device 0, function 2          
    AMD SATA Controller                              PCI\VEN_1022&DEV_7801&SUBSYS_B0021458&REV_40                     PCI bus 0, device 17, function 0         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11                     PCI bus 0, device 18, function 0         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11                     PCI bus 0, device 19, function 0         
    Standard Enhanced PCI to USB Host Controller     PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11                     PCI bus 0, device 18, function 2         
    Standard Enhanced PCI to USB Host Controller     PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11                     PCI bus 0, device 19, function 2         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7809&SUBSYS_50041458&REV_11                     PCI bus 0, device 20, function 5         
    AMD SMBus                                        PCI\VEN_1022&DEV_780B&SUBSYS_780B1022&REV_14                     PCI bus 0, device 20, function 0         
    High Definition Audio Controller                 PCI\VEN_1022&DEV_780D&SUBSYS_A0021458&REV_01                     PCI bus 0, device 20, function 2         
    PCI standard ISA bridge                          PCI\VEN_1022&DEV_780E&SUBSYS_780E1022&REV_11                     PCI bus 0, device 20, function 3         
    PCI standard PCI-to-PCI bridge                   PCI\VEN_1022&DEV_780F&SUBSYS_00000000&REV_40                     PCI bus 0, device 20, function 4         
    AMD USB 3.0 Host Controller                      PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03                     PCI bus 0, device 16, function 0         
    AMD USB 3.0 Host Controller                      PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03                     PCI bus 0, device 16, function 1         
    High Definition Audio Controller                 PCI\VEN_10DE&DEV_0BEE&SUBSYS_35371458&REV_A1                     PCI bus 1, device 0, function 1          
    NVIDIA GeForce GTX 550 Ti                        PCI\VEN_10DE&DEV_1244&SUBSYS_35371458&REV_A1                     PCI bus 1, device 0, function 0          
    Realtek PCIe GBE Family Controller               PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_06                     PCI bus 2, device 0, function 0          
    MSI TV@Anywhere Plus                             PCI\VEN_1131&DEV_7133&SUBSYS_62311462&REV_D1                     PCI bus 4, device 6, function 0          
    Etron USB 3.0 Extensible Host Controller         PCI\VEN_1B6F&DEV_7023&SUBSYS_50071458&REV_01                     PCI bus 3, device 0, function 0          
    

    so run it on different IntelHD graphics computers and check if different PCI ID is there ...

    0 讨论(0)
提交回复
热议问题