【问题标题】:How to use the NvAPI_DISP_SetDisplayConfig function in C++?如何在 C++ 中使用 NvAPI_DISP_SetDisplayConfig 函数?
【发布时间】:2013-06-10 12:56:21
【问题描述】:

我连续三次成功地使用 NvAPI_DISP_GetDisplayConfig 函数获取显示配置(如另一个线程中所述),现在想更改我的一个显示器的缩放选项。

但是,即使我尝试不更改任何设置(或仅更改缩放选项)并简单地应用检索到的 pathInfo,NvAPI_DISP_SetDisplayConfig 也会失败。有人知道为什么吗?

NvAPI_Status status = NVAPI_OK;
NvU32 deviceCount = 0;
NV_DISPLAYCONFIG_PATH_INFO_V2 *  pathInfo = NULL;

status = NvAPI_Initialize();

if (status == NVAPI_OK) {
status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);
if ((status == NVAPI_OK) && (deviceCount > 0)) {

    printf("\nFirst pass ok. \n");
    pathInfo = new NV_DISPLAYCONFIG_PATH_INFO_V2[deviceCount];

    for (int i = 0; i < deviceCount; i++)
    {
        pathInfo[i].targetInfo = 0;
        pathInfo[i].targetInfoCount = 0;
        pathInfo[i].version = NV_DISPLAYCONFIG_PATH_INFO_VER2;
        pathInfo[i].sourceModeInfo = 0;
        pathInfo[i].reserved = 0;
    }

    status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);

    if (status == NVAPI_OK) {

         printf("\nSecond pass ok. \n");
        for (int i = 0; i < deviceCount; i++)
        {
            pathInfo[i].sourceModeInfo = new NV_DISPLAYCONFIG_SOURCE_MODE_INFO_V1;
            pathInfo[i].sourceModeInfo->reserved = 0;
            pathInfo[i].targetInfo = new NV_DISPLAYCONFIG_PATH_TARGET_INFO_V2[pathInfo[i].targetInfoCount];
            for (int j = 0; j < pathInfo[i].targetInfoCount; j++) {
                pathInfo[i].targetInfo[j].details = new NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO_V1;
                            pathInfo[i].targetInfo[j].details->version = NV_DISPLAYCONFIG_PATH_ADVANCED_TARGET_INFO_VER1;
                pathInfo[i].targetInfo[j].details->reserved = 0;
            }
        }
    }

    status = NvAPI_DISP_GetDisplayConfig(&deviceCount, pathInfo);
    if (status == NVAPI_OK) {
          printf("\nThird pass ok. \n");
    }

      for (int i = 0; i < deviceCount; i++)
        { 
            for (int j = 0; j < pathInfo[i].targetInfoCount; j++) {
                switch(pathInfo[i].targetInfo[j].details->scaling)
                {
                case NV_SCALING_DEFAULT:
                    printf("Default");
                    break;
                case NV_SCALING_GPU_SCALING_TO_CLOSEST:
                    printf("GPU Scaling to closest");
                    break;
                case NV_SCALING_GPU_SCALING_TO_NATIVE :
                    printf("GPU scaling to native");
                    break;
                case NV_SCALING_GPU_SCANOUT_TO_NATIVE :
                    printf("Gpu scanout to native");
                    break;
                case NV_SCALING_GPU_SCALING_TO_ASPECT_SCANOUT_TO_NATIVE :
                    printf("GPU scaling to aspect scanout to native");
                    break;
                case NV_SCALING_GPU_SCALING_TO_ASPECT_SCANOUT_TO_CLOSEST :
                    printf("Gpu scaling to aspect scanout to closest");
                    break;
                case NV_SCALING_GPU_SCANOUT_TO_CLOSEST :
                    printf("Gpu scanout to closest");
                    break;
                case NV_SCALING_CUSTOMIZED :
                    printf("Scaling customized");
                default:
                    printf("Nothing");
                    break;
               }             
            }     
        }

    //FAILS !!!!!!!!!!
      status = NvAPI_DISP_SetDisplayConfig(deviceCount,pathInfo,NV_DISPLAYCONFIG_VALIDATE_ONLY  );
    }

}

任何帮助将不胜感激,非常感谢!

【问题讨论】:

    标签: c++ scaling nvidia nvapi


    【解决方案1】:

    您似乎只是提到 SetDisplayConfig 失败...它可能有助于解决您的问题确切知道什么是错的...您能否给出具体错误:例如,这是取自NVAPI programming documentation

    /*
    This function is used to print to the command line a text message
    describing the nvapi error and quits
    */
    void PrintError(NvAPI_Status status)
    {
        NvAPI_ShortString
        szDesc = {0};
        NvAPI_GetErrorMessage
        (status, szDesc);
        printf(" NVAPI error: %s\n", szDesc);
        exit(-1);
    }
    

    【讨论】:

    • 不确定这是否能帮助任何人解决此问题,但我能够运行此代码,并且在 SetDisplayConfig 行上它崩溃了。调试时,崩溃引发了一个异常,指出在某个地址存在访问冲突。此地址似乎与 PathInfo 中一个 NV 对象中的 pOSAdapter 地址匹配。
    【解决方案2】:

    这是因为IsNonNVIDIAAdapter设置为true,但是pOSAdapterID没有传入。 如果你确定你有一个 nVidia 显卡,在使用前对 pathInfo 做ZeroMemory()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多