61 if (!
m_d->interface->isReady()) {
62 str <<
"WARNING: surface color management interface is not ready!" << Qt::endl;
71 str <<
"Configured mode:" <<
m_d->surfaceMode << Qt::endl;
73 RenderIntent preferredIntent = Private::calculateConfigIntent(
m_d->currentConfig.options());
74 str <<
"Configured intent:" << preferredIntent <<
"supported:" <<
m_d->interface->supportsRenderIntent(preferredIntent) << Qt::endl;
76 str <<
"Actual intent:";
77 if (
m_d->interface->renderingIntent()) {
78 str << *
m_d->interface->renderingIntent() << Qt::endl;
80 str <<
"<none>" << Qt::endl;
84 str <<
"Active surface description:";
85 if (
m_d->interface->surfaceDescription()) {
87 str.noquote() <<
m_d->interface->surfaceDescription()->makeTextReport() << Qt::endl;
89 str <<
"<none>" << Qt::endl;
93 str <<
"Selected Profile:";
94 if (
m_d->currentConfig.profile) {
95 auto profile =
m_d->currentConfig.profile;
97 str << profile->name() << Qt::endl;
103 auto colVec = profile->getColorantsxyY();
109 str <<
" red: " << colR << Qt::endl;
110 str <<
" green:" << colG << Qt::endl;
111 str <<
" blue: " << colB << Qt::endl;
115 auto whiteVec = profile->getWhitePointxyY();
119 str <<
" white: " << white << Qt::endl;
124 str <<
"<none>" << Qt::endl;
127 str <<
"Compositor preferred surface description:";
128 if (
m_d->interface->preferredSurfaceDescription()) {
130 str.noquote() <<
m_d->interface->preferredSurfaceDescription()->makeTextReport() << Qt::endl;
132 str <<
"<none>" << Qt::endl;
223 RenderIntent preferredIntent =
224 Private::calculateConfigIntent(newOptions);
226 if (!
m_d->interface->supportsRenderIntent(preferredIntent)) {
227 qWarning() <<
"WARNING: failed to set user preferred rendering"
228 <<
"intent for the surface, intent \""
229 << preferredIntent <<
"\" is unsupported, falling back to \"perceptual\"";
231 preferredIntent = RenderIntent::render_intent_perceptual;
237 std::optional<SurfaceDescription> requestedDescription;
243 requestedDescription = SurfaceDescription();
247 const auto compositorPreferred =
m_d->interface->preferredSurfaceDescription();
253 requestedDescription->colorSpace = compositorPreferred->colorSpace;
255 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
256 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_st2084_pq) {
260 requestedDescription->colorSpace.luminance =
Luminance();
261 requestedDescription->colorSpace.luminance->minLuminance = 0;
262 requestedDescription->colorSpace.luminance->referenceLuminance = 80;
263 requestedDescription->colorSpace.luminance->maxLuminance = 10000;
267 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
268 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
269 if (compositorPreferred->colorSpace.luminance) {
271 requestedDescription->colorSpace.luminance =
272 compositorPreferred->colorSpace.luminance->clipToSdr();
275 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
276 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_ext_linear;
277 if (compositorPreferred->colorSpace.luminance) {
279 requestedDescription->colorSpace.luminance =
280 compositorPreferred->colorSpace.luminance->clipToSdr();
284 if (std::holds_alternative<NamedPrimaries>(requestedDescription->colorSpace.primaries) &&
285 std::get<NamedPrimaries>(requestedDescription->colorSpace.primaries) == NamedPrimaries::primaries_unknown) {
287 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
290 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
291 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_unknown) {
293 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
296 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
299 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
300 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
302 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
303 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
305 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
306 qWarning() <<
"WARNING: failed to find a suitable surface format for the compositor";
313 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
314 if (request.isValid()) {
316 request.colorPrimariesType,
317 request.transferFunction);
323 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
324 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
325 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
326 if (request.isValid()) {
328 request.colorPrimariesType,
329 request.transferFunction);
336 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
337 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
338 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
339 if (request.isValid()) {
341 request.colorPrimariesType,
342 request.transferFunction);
348 qWarning() <<
"WARNING: failed to to create a profile for the compositor's preferred color space";
349 qWarning() <<
" " <<
ppVar(compositorPreferred);
350 qWarning() <<
" " <<
ppVar(*requestedDescription);
359 if (
m_d->interface->surfaceDescription() != requestedDescription ||
360 m_d->interface->renderingIntent() != preferredIntent) {
362 if (requestedDescription) {
363 auto future =
m_d->interface->setSurfaceDescription(*requestedDescription, preferredIntent);
365 if (!result.isValid() || !result.result()) {
367 <<
"WARNING: failed to set color space for the surface, setSurfaceDescription() returned false";
371 m_d->interface->unsetSurfaceDescription();
375 const bool requestedDescriptionIsHDR = requestedDescription && requestedDescription->colorSpace.isHDR();
378 newDisplayConfig.
profile = profile;
380 newDisplayConfig.
isHDR = requestedDescriptionIsHDR;
384 if (
m_d->currentConfig != newDisplayConfig) {
385 m_d->currentConfig = newDisplayConfig;