v5.264.0 This release focuses on a major overhaul of HDR tone-mapping, including support for HDR10+ and PQ CIE Y dynamic metadata (including ST2094-40 OOTF), an entirely rewritten peak detection shader (using a frame histogram), a reimagined new default 'spline' tone-mapping function, and two new debug overlays to visualize the tone-mapping LUT and clipped pixels. In addition, this release offers proper native support for DCI Digital Cinema Distribution Master (XYZ) decoding, integration with libdovi for Dolby Vision RPU parsing, native support for planar (YCbCr) vulkan texture formats, and a major overhaul of the vulkan command scheduling and synchronization code. Additions: - add PL_COLOR_PRIM_ACES_AP0 and PL_COLOR_PRIM_ACES_AP1 - add pl_tone_map_params_infer - add pl_plane_data_from_comps (not restricted to 64-bit formats) - add pl_hook.parameters and the ability to use //!PARAM directives inside mpv-style shaders - add pl_gpu_limits.host_cached to test for host-cached host-mapped buffer support - add pl_vukan.get_proc_addr - add pl_vulkan_sem_create/destroy, to create (exportable) vulkan semaphores for use with the vulkan image interop API - add pl_vulkan_hold_ex and pl_vulkan_release_ex - add pl_vulkan_wrap_params.aspect to wrap individual planes of planar images - add support for packed 16-bit formats (rx10, rxgx10 etc.) - add support for planar textures (pl_fmt.planes and pl_tex.planes), and introduce planar texture formats (g8_br8_420, gx10_bx10_rx10_444 etc) - add support for 3-component formats (rgb8, rgb16 etc) to d3d11 - add PL_COLOR_TRC_ST428 (DCI digital cinema XYZ transfer function) - add pl_plane_data.swapped to support uploading non-native endian data - add pl_hdr_metadata.scene_max/avg and pl_hdr_metadata.ootf for HDR10+ dynamic metadata - add pl_map_hdr_metadata and pl_frame_map_avdovi_metadata - add pl_tone_map_params.hdr - add pl_tone_map_st2094_10 and pl_tone_map_st2094_40 - add pl_color_map_params.visualize_lut and visualize_rect - add pl_hook.signature to help identify hooks (for error tracking) - add pl_renderer_get_errors and pl_renderer_reset_errors to query the renderer for internal errors - add <libplacebo/utils/dolbyvision.h> for parsing DV RPUs (based on libdovi) - add a compile-time option to disable dolbyvision support - add support for sampling from integer textures on d3d11 - add pl_color_space_nominal_peak_ex - add pl_get_detected_hdr_metadata - add pl_hdr_metadata.max_pq_y and avg_pq_y - add pl_tone_map_params.input_avg - add pl_hdr_metadata_type and pl_hdr_metadata_contains, as well as pl_color_map_params.metadata, to influence the choice of HDR metadata - add pl_peak_detect_params.percentile - add pl_color_map_params.show_clipping Changes: - deprecate pl_sync and pl_tex_export (in favor of pl_vulkan_sem_create and pl_vulkan_hold_ex) - deprecate pl_vulkan_hold, pl_vulkan_hold_raw and pl_vulkan_release (in favor of their _ex counterparts) - improve tone-mapping default function/mode heuristics - remove pl_swapchain.impl from public-facing struct - pl_tone_map_spline has been substantially rewritten and replaced by a similar but different algorithm, with a new tunable parameter (influencing the desired subjective contrast level) - pl_color_map_params.lut_size now only affects a 1D LUT, rather than a 2D LUT, and the default has been increased from 256 to 1024 - move pl_renderer_params.allow_delayed_peak_detect to pl_peak_detect_params.allow_delayed - deprecate pl_get_detected_peak, replaced by pl_get_detected_hdr_metadata - deprecate/remove pl_peak_detect_params.overshoot_margin - move pl_hdr_rescale from <libplacebo/tone_mapping.h> to <libplacebo/colorspace.h> Fixes and performance enhancements: - correctly accept even very wide ICC profiles - fix dynamic LUT generation suddenly switching between different tone mapping functions when using `pl_tone_map_auto` - correctly report buffer size limits in pl_vulkan.gpu->limits - fix an issue where zooming into a fullscreen image did not correctly invalidate the frame cache - fix building with recent versions of glslang - fix unintentional sub-pixel distortions when cropping - fix sampling from GL_OES_EGL_image_external targets on GL ES 3.x - fix UB when using VK_EXT_full_screen_exclusive - fix choice of default SDR curves when targetting PL_COLOR_TRC_UNKNOWN - infer correct color gamut / primaries when using PL_COLOR_SYSTEM_XYZ - fix corner case when combinig linear input with non-linear scaling - fix compute shader blit fallback rounding - optimize blitting from 1 pixel sources - fix UB when drawing from image formats where alpha was the first component - fix pl_vulkan_wrap incorrectly rejecting 1D/3D textures - fix pl_vulkan_wrap ignoring renderable/host_readable caps - fix GLSL codegen for non-float samplerBuffer - adjust precision of whitepoints to match common practice - fix d3d11 texel buffer initialization - fix frequent shader recompilation in pl_shader_dovi_reshape - correctly decode white point of DCI XYZ content - fix issue where OpenGL shaders with multiple buffer block bindings (UBOs/SSBOs) were not correctly initialized on older GLSL - various fixes and improvements to the vulkan memory selection logic - fix memory leak on d3d11 - fix possible crash on older OpenGL drivers - fix texture blit fallback shader on older GLSL - avoid implementation-defined behavior when using SSBOs on older GLSL - fix memory leak when pl_mpv_user_shader_parse fails - fix memory leak when using deinterlaced frames in pl_queue - fix thread-unsafe array usage in pl_pass_create on vulkan - fix issue where BT.2446 was unintentionally picked for HDR->HDR inverse tone mapping - fix double mutex unlock in vulkan memory allocator - fix <libplacebo/shaders/deinterlacing.h> and <libplacebo/d3d11.h> headers - fix missing host read/write dependencies vulkan buffers - fix build on newer vulkan headers - fix various build issues on 32-bit platforms - fix issue when shader LUTs fail being created - fix possible UB in AV1 film grain shader - substantially rewrite vulkan command/object synchronization to take full advantage of timeline semaphores, drastically reducing the number of semaphores and synchronization primitives that were emitted - properly clean up after old/unused shader cache entries - fix timing of vulkan uninit debug messages - correctly prefer mingw vulkan headers over system-wide vulkan headers when building inside mingw - improve performance of string concatenation operations when constructing shaders - fix vulkan swapchain recreation when swapchain size is unchanged - fix unnecessary/redundant tone-mapping when drawing overlays - fix discontinuity when using PL_TONE_MAP_AUTO and the source peak falls below the target peak - fix overly aggressive saturation when using PL_TONE_MAP_LUMA for small range conversions - various fixes for using libplacebo from C++ - always go through full tone-mapping LUT even when performing only black-point-compensation - performance improvement (LUT bypass) for pl_tone_map_linear - improve debugging of vulkan leak detection and out-of-memory errors - fix possible segfault when vulkan/d3d11 context creation fails - avoid deprecated features when compiling SPIR-V for newer vulkan - fix various issues caused by a poor choice of color mixing space when using pl_render_image_mix and HDR sources/displays - correctly invalidate frame cache when rendering single frames with updated parameters/dimensions - correctly reset peak detection state when params change - fix unintentional RGB hard-clip before luma-based tone-mapping - correctly enable vulkan validation features extension when using pl_vk_inst_params.debug_extra - emit correct texture barrier when pl_pass_params.load_target is true - various fixes and improvements to the test framework - various fixes and improvements to demos/plplay