Copyright © 2023 Joshua Ashton for Valve Software Copyright © 2023 Xaver Hugl Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. The aim of this color management extension is to get HDR games working quickly, and have an easy way to test implementations in the wild before the upstream protocol is ready to be merged. For that purpose it's intentionally limited and cut down and does not serve all uses cases. The color management factory singleton creates color managed surface objects. Interface for changing surface color management and HDR state. An implementation must: support every part of the version of the frog_color_managed_surface interface it exposes. Including all known enums associated with a given version. Destroying the color managed surface resets all known color state for the surface back to 'undefined' implementation-specific values. Extended information on the transfer functions described here can be found in the Khronos Data Format specification: https://registry.khronos.org/DataFormat/specs/1.3/dataformat.1.3.html Extended information on render intents described here can be found in ICC.1:2022: https://www.color.org/specification/ICC.1-2022-05.pdf NOTE: On a surface with "perceptual" (default) render intent, handling of the container's color volume is implementation-specific, and may differ between different transfer functions it is paired with: ie. sRGB + 709 rendering may have it's primaries widened to more of the available display's gamut to be be more pleasing for the viewer. Compared to scRGB Linear + 709 being treated faithfully as 709 (including utilizing negatives out of the 709 gamut triangle) Forwards HDR metadata from the client to the compositor. HDR Metadata Infoframe as per CTA 861.G spec. Usage of this HDR metadata is implementation specific and outside of the scope of this protocol. Mastering Red Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering Red Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering Green Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering Green Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering Blue Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering Blue Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering White Point X Coordinate of the Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Mastering White Point Y Coordinate of the Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Max Mastering Display Luminance. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. Min Mastering Display Luminance. This value is coded as an unsigned 16-bit value in units of 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF represents 6.5535 cd/m2. Max Content Light Level. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. Max Frame Average Light Level. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. Current preferred metadata for a surface. The application should use this information to tone-map its buffers to this target before committing. This metadata does not necessarily correspond to any physical output, but rather what the compositor thinks would be best for a given surface. Specifies a known transfer function that corresponds to the output the surface is targeting. Output Red Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output Red Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output Green Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output Green Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output Blue Color Primary X Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output Blue Color Primary Y Coordinate of the Data. Coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output White Point X Coordinate of the Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Output White Point Y Coordinate of the Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. Max Output Luminance The max luminance in nits that the output is capable of rendering in small areas. Content should: not exceed this value to avoid clipping. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. Min Output Luminance The min luminance that the output is capable of rendering. Content should: not exceed this value to avoid clipping. This value is coded as an unsigned 16-bit value in units of 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF represents 6.5535 cd/m2. Max Full Frame Luminance The max luminance in nits that the output is capable of rendering for the full frame sustained. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.