| 367 | } |
| 368 | |
| 369 | NVAPI_INTERFACE |
| 370 | NvAPI_Disp_HdrColorControl(NvU32 displayId, NV_HDR_COLOR_DATA *pHdrColorData) { |
| 371 | switch (pHdrColorData->version) { |
| 372 | case NV_HDR_COLOR_DATA_VER1: |
| 373 | case NV_HDR_COLOR_DATA_VER2: |
| 374 | break; |
| 375 | default: |
| 376 | return NVAPI_INCOMPATIBLE_STRUCT_VERSION; |
| 377 | } |
| 378 | |
| 379 | WMTHDRMetadata metadata; |
| 380 | WMTColorSpace colorspace = WMTColorSpaceSRGB; |
| 381 | |
| 382 | if (pHdrColorData->cmd == NV_HDR_CMD_GET) { |
| 383 | if (WMTQueryDisplaySetting(displayId, &colorspace, &metadata)) { |
| 384 | pHdrColorData->hdrMode = colorspace == WMTColorSpaceHDR_scRGB ? NV_HDR_MODE_UHDA |
| 385 | : colorspace == WMTColorSpaceHDR_PQ ? NV_HDR_MODE_UHDA_PASSTHROUGH |
| 386 | : NV_HDR_MODE_OFF; |
| 387 | pHdrColorData->mastering_display_data.displayPrimary_x0 = metadata.red_primary[0]; |
| 388 | pHdrColorData->mastering_display_data.displayPrimary_y0 = metadata.red_primary[1]; |
| 389 | pHdrColorData->mastering_display_data.displayPrimary_x1 = metadata.green_primary[0]; |
| 390 | pHdrColorData->mastering_display_data.displayPrimary_y1 = metadata.green_primary[1]; |
| 391 | pHdrColorData->mastering_display_data.displayPrimary_x2 = metadata.blue_primary[0]; |
| 392 | pHdrColorData->mastering_display_data.displayPrimary_y2 = metadata.blue_primary[1]; |
| 393 | pHdrColorData->mastering_display_data.displayWhitePoint_x = metadata.white_point[0]; |
| 394 | pHdrColorData->mastering_display_data.displayWhitePoint_y = metadata.white_point[1]; |
| 395 | pHdrColorData->mastering_display_data.max_display_mastering_luminance = metadata.max_mastering_luminance; |
| 396 | pHdrColorData->mastering_display_data.min_display_mastering_luminance = metadata.min_mastering_luminance; |
| 397 | pHdrColorData->mastering_display_data.max_content_light_level = metadata.max_content_light_level; |
| 398 | pHdrColorData->mastering_display_data.max_frame_average_light_level = metadata.max_frame_average_light_level; |
| 399 | } else { |
| 400 | WMTDisplayDescription desc; |
| 401 | WMTGetDisplayDescription(displayId, &desc); |
| 402 | pHdrColorData->hdrMode = NV_HDR_MODE_OFF; |
| 403 | pHdrColorData->mastering_display_data.displayPrimary_x0 = desc.red_primaries[0] * 50000; |
| 404 | pHdrColorData->mastering_display_data.displayPrimary_y0 = desc.red_primaries[1] * 50000; |
| 405 | pHdrColorData->mastering_display_data.displayPrimary_x1 = desc.green_primaries[0] * 50000; |
| 406 | pHdrColorData->mastering_display_data.displayPrimary_y1 = desc.green_primaries[1] * 50000; |
| 407 | pHdrColorData->mastering_display_data.displayPrimary_x2 = desc.blue_primaries[0] * 50000; |
| 408 | pHdrColorData->mastering_display_data.displayPrimary_y2 = desc.blue_primaries[1] * 50000; |
| 409 | pHdrColorData->mastering_display_data.displayWhitePoint_x = desc.white_points[0] * 50000; |
| 410 | pHdrColorData->mastering_display_data.displayWhitePoint_y = desc.white_points[1] * 50000; |
| 411 | pHdrColorData->mastering_display_data.max_display_mastering_luminance = |
| 412 | desc.maximum_potential_edr_color_component_value * 100; |
| 413 | pHdrColorData->mastering_display_data.min_display_mastering_luminance = 1; |
| 414 | pHdrColorData->mastering_display_data.max_content_light_level = |
| 415 | desc.maximum_potential_edr_color_component_value * 100; |
| 416 | pHdrColorData->mastering_display_data.max_frame_average_light_level = |
| 417 | desc.maximum_potential_edr_color_component_value * 100; |
| 418 | } |
| 419 | } else { |
| 420 | if (pHdrColorData->hdrMode != NV_HDR_MODE_OFF) { |
| 421 | metadata.red_primary[0] = pHdrColorData->mastering_display_data.displayPrimary_x0; |
| 422 | metadata.red_primary[1] = pHdrColorData->mastering_display_data.displayPrimary_y0; |
| 423 | metadata.green_primary[0] = pHdrColorData->mastering_display_data.displayPrimary_x1; |
| 424 | metadata.green_primary[1] = pHdrColorData->mastering_display_data.displayPrimary_y1; |
| 425 | metadata.blue_primary[0] = pHdrColorData->mastering_display_data.displayPrimary_x2; |
| 426 | metadata.blue_primary[1] = pHdrColorData->mastering_display_data.displayPrimary_y2; |
nothing calls this directly
no test coverage detected