Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • v5.264.0
    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
    
  • v5.264.0-rc1
    v5.264.0-rc1
    
    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 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
    
  • v5.229.2
    2394aea1 · meson: update fix version ·
    v5.229.2
    
    This bugfix release fixes a number of minor issues that have come up
    since v5.229.1:
    
    Fixes and performance enhancements:
    - allow `plplay` to support hardware decoding with EGL
    - fix an issue where custom shaders with `//!SAVE MAIN` did not save
      textures
    - fix a number of minor memory leaks
    - fix an issue where custom shaders that tried binding conditionally
      excluded textures generated superfluous errors
    - fix an issue where the libav helpers ran into undefined behavior when
      operating on the 128-bit image formats in recent versions of ffmpeg
    - fix a build issue on BSD platforms without libdl
    - fix an issue where freeing `pl_shader_obj` too early could lead to
      use-after-free errors if shaders still referenced these objects
    - fix an issue where applying film grain after debanding could trigger
      an assertion due to a change in bit depth
    - fix an issue where film grain generation was unnecessarily verbose due
      to LUT updates
    - fix an issue where tone mapping desaturation was not working as
      intended, resulting in strongly oversaturated colors
    - fix an issue where the red channel sometimes got unintentionally
      deleted from RGB input images
    - fix an issue where AV1 film grain synthesis did not work on pictures
      above 12 bit depth, such as could be the output of a previous filter
    - remove an unnecessary assertion that caused build issues on some
      versions of clang
    - fix an issue where we unintentionally used linear downscaling on HDR
      sources
    - fix an issue with false negatives in the PL_GAMUT_WARN algorithm, and
      also change the algorithm to make it more visually obvious
    - fix an issue where OpenGL on WSL2 was unintentionally rejected as a
      software rasterizer
    
  • v5.229.1
    v5.229.1
    
    This minor release fixes a crucial bug in v5.229.0, which caused a
    regression when using orthogonal scaler kernels on anything but simple
    scaling ratios, as well as other minor fixes.
    
    Fixes and performance enhancements:
    - fix an issue where the pl_shader_sample_ortho refactor broke
      orthogonal scalers inside pl_renderer, for anything but very simply
      scaling ratios
    - fix an issue where pl_shader_sample_ortho2 rejected some scaling
      ratios due to floating point inaccuracy
    - fix an issue where some extreme 'test' ICC profiles were unfairly
      rejected by the gamma detection code
    - fix an issue where some oddly-crafted ICC profiles could result in
      NaNs propagating into the shader math
    
  • v5.229.0
    v5.229.0
    
    This is a major release, bumping up the major version to v5 and dropping
    all APIs deprecated in v3.x. The other major breaking change of this
    release is a switch away from the external `libepoxy` and `mako`
    dependencies in favor of the (optionally bundled) `glad2` and `jinja2`.
    These are now included, along with various other build-time dependencies,
    as git submodules. Users are advised to clone with `git clone
    --recursive` in order to satisfy these dependencies automatically, while
    distros maintainers are nonetheless encouraged to continue packaging
    them.
    
    In addition, this release brings with it a number of new features and
    changes - including support for fully automatic GPU deinterlacing, error
    diffusion dithering, gamma-aware dithering, and a number of improvements
    to the handling of HDR sources and output displays, as well as several
    notable bug fixes and performance enhancements.
    
    Additions:
    - add `pl_gpu_limits.array_size_constants` to indicate whether or not
      push constants can be used to size arrays
    - add PL_HANDLE_MTL_TEX, PL_HANDLE_IOSURFACE and `pl_shared_mem.plane`
      to improve interop with MoltenVK
    - add the informational fields `pl_opengl.major, `pl_opengl.minor`,
      `pl_opengl_extensions` and the `pl_opengl_has_ext` utility function
    - add `pl_opengl_params.get_proc_addr` and `get_proc_addr_ex`
    - add `pl_deband_params.grain_neutral`, the effect of which is to scale
      down / disable adding noise near this value
    - add <libplacebo/shaders/deinterlacing.h>, containing a basic
      implementation of yadif, bob and weave
    - add support for deinterlacing metadata to `pl_render_params`,
      `pl_frame`, and `pl_source_frame`
    - add <libplacebo/shaders/dithering.h>, splitting this off from its
      previous location inside <libplacebo/shaders/colorspace.h>
    - add `pl_shader_error_diffusion` and related helper functions, as well
      as `pl_render_params.error_diffusion`
    - add `pl_dither_params.transfer` to support gamma-aware dithering
    - add `pl_icc_params.force_bpc` to help work around black point
      compensation issues on "broken" v4 and v2 profiles
    
    Changes:
    - fields and functions deprecated in libplacebo v3 have been removed
    - `python3-mako` is now bundled as a submodule to make resolving this
      dependency easier
    - drop `libepoxy` as a dependency, and require `glad` v2 instead, the
      latter of which is added as a submodule to make building easier
    - drop the `PL_STRUCT` transitional macro, and switch to a consistent
      API where e.g. `pl_tex` is a typedef of `const struct pl_tex_t *`.
    - `PL_LUT_CONVERSION` now explicitly overrides ICC profiles as well
    - HDR color spaces no longer default to having a black point of 0.005
      nits, instead now defaulting to "true" black (1e-7 nits)
    - BT.1886 sources are now automatically tuned to match the swapchain /
      detected target contrast, rather than defaulting to 1000:1
    - move `pl_queue_params.frame_duration` to `pl_source_frame.duration`
    - the `vulkan-link` and `opengl-loader` boolean meson options have been
      removed in favor of the `vk-proc-addr` and `gl-proc-addr` feature
      flags, defaulting to `auto` instead of `yes`
    - a copy of `vulkan.h` and `vk.xml` have been bundled as submodules to
      make satisfying these dependencies easier
    - `<libplacebo/opengl.h>`, `<libplacebo/vulkan.h>` and
      `<libplacebo/d3d11.h`> are now installed unconditonally, with stubs
      for `pl_vulkan_create` etc. available even if these features are
      disabled at compile time
    - `pl_render_info.index` no longer indicates the number of frames being
      mixed on PL_RENDER_STAGE_BLEND, instead being relegated to the new
      field `pl_render_info.count`
    - `pl_shader_sample_ortho` has been reworked in order to fix a design
      flaw in its API, see `pl_shader_sample_ortho2` for its replacement
    
    Fixes and performance enhancements:
    - fix a bug where shaders with dynamically sized arrays would fail to
      compile on MoltenVK
    - reduce the frequency at which polar compute shaders need to be
      recompiled
    - fix compilation issues with MSVC
    - fix an issue where vulkan portability extensions were not correctly
      detected
    - fix a possible deadlock when using a multi-threaded opengl context
    - specify the correct calling convention for EGL debug callbacks
    - fix a bug where PL_INTENT_ABSOLUTE_COLORIMETRIC broke ICC profiles
    - improve the handling of perceptual ICC profiles, especially on
      "broken" v4 or v2 profiles
    - fix undefined behavior on 32-bit vulkan systems
    - fix bugs in the vulkan swapchain recreation
    - fix an issue where HDR metadata was not correctly reflected back to
      the renderer on vulkan swapchains
    - fix a bug where d3d11 swapchains failed being created on older
      versions of windows where high-bit-depth swapchains are unavailable
    - fix a bug where HDR metadata sent to the swapchain was not correctly
      inferred to valid values
    - `pl_shader_deband` has been rewritten to slightly improve performance,
      especially when the texture has more channels than necessary
    - `pl_shader_deband` no longer raises the black point due to clipping
    - fix build issues on GCC < 6
    - improve validity of partially set `pl_color_space` structs
    - fix `pl_find_tone_map_function` not having an implementation
    - fix a bug where cubic spline frame mixing did not work in `plplay`
    - fix a memory leak in `pl_queue_destroy`
    - fix a bug where changing `pl_icc_params.max_luma` or `intent` did not
      correctly invalidate the ICC 3DLUT and renderer cache
    - greatly improve the performance and accuracy of 3DLUTs (ICC, .cube)
    - fix compilation on newer glslang and make this code forward-compatible
    - fix an issue where `pl_shader_dither` raised the apparent brightness
      of the image when dithering to low bit depths
    - fix compilation on vulkan systems with `vulkan.h` available but no
      vulkan loader
    - fix an issue where DV metadata requiring an EL was partially applied
    - fix an issue where PQ HDR sources were incorrectly assumed to have a
      black point scaled to the mastering display, rather than absolute zero
    - fix an issue where disabling `async_compute` led to undefined behavior
      on systems with async compute queues available
    - fix an issue where debanding was applied *after* user shaders, causing
      massive performance/quality loss in the case of user shaders that
      upscaled the input planes somehow - in exchange for a slight
      performance penalty when rendering a heavily cropped source image with
      debanding enabled
    - fix an issue where plane shaders were sometimes not correctly merged
      with the following image combination shader
    - fix an issue where inverse tone mapping did not work with
      `pl_tone_map_auto`
    - fix a massive performance regression in the non-compute fallback polar
      shader, especially on nvidia and apple systems - in exchange for a
      slight performance penalty on AMD systems
    - slightly boost the performance of shader LUTs in some very specific
      circumstances
    - fix an issue where nonlinear shader LUTs did not work on GLSL < 130
    - fix an issue where libdl was incorrectly required on windows
    - fix an issue where fullscreen exclusive mode triggered freezes on
      certain platforms (e.g. AMD+Windows), by disabling fs exclusive mode
    - fix an issue where the wrong (GLES) extension was used for EGL image
      imports on desktop GL
    - fix a bug where host pointer imports could trigger an assertion
      failure on some platforms (e.g. intel+windows)
    - fix build issues on some platforms (windows llvm/mingw, emscripten)
    
  • v5.228.0-rc2
    v5.228.0-rc2
    
    This is a major release, bumping up the major version to v5 and dropping
    all APIs deprecated in v3.x. The other major breaking change of this
    release is a switch away from the external `libepoxy` and `mako`
    dependencies in favor of the (optionally bundled) `glad2` and `jinja2`.
    These are now included, along with various other build-time dependencies,
    as git submodules. Users are advised to clone with `git clone
    --recursive` in order to satisfy these dependencies automatically, while
    distros maintainers are nonetheless encouraged to continue packaging
    them.
    
    In addition, this release brings with it a number of new features and
    changes - including support for fully automatic GPU deinterlacing, error
    diffusion dithering, gamma-aware dithering, and a number of improvements
    to the handling of HDR sources and output displays, as well as several
    notable bug fixes and performance enhancements.
    
    Additions:
    - add `pl_gpu_limits.array_size_constants` to indicate whether or not
      push constants can be used to size arrays
    - add PL_HANDLE_MTL_TEX, PL_HANDLE_IOSURFACE and `pl_shared_mem.plane`
      to improve interop with MoltenVK
    - add the informational fields `pl_opengl.major, `pl_opengl.minor`,
      `pl_opengl_extensions` and the `pl_opengl_has_ext` utility function
    - add `pl_opengl_params.get_proc_addr` and `get_proc_addr_ex`
    - add `pl_deband_params.grain_neutral`, the effect of which is to scale
      down / disable adding noise near this value
    - add <libplacebo/shaders/deinterlacing.h>, containing a basic
      implementation of yadif, bob and weave
    - add support for deinterlacing metadata to `pl_render_params`,
      `pl_frame`, and `pl_source_frame`
    - add <libplacebo/shaders/dithering.h>, splitting this off from its
      previous location inside <libplacebo/shaders/colorspace.h>
    - add `pl_shader_error_diffusion` and related helper functions, as well
      as `pl_render_params.error_diffusion`
    - add `pl_dither_params.transfer` to support gamma-aware dithering
    - add `pl_icc_params.force_bpc` to help work around black point
      compensation issues on "broken" v4 and v2 profiles
    
    Changes:
    - fields and functions deprecated in libplacebo v3 have been removed
    - `python3-mako` is now bundled as a submodule to make resolving this
      dependency easier
    - drop `libepoxy` as a dependency, and require `glad` v2 instead, the
      latter of which is added as a submodule to make building easier
    - drop the `PL_STRUCT` transitional macro, and switch to a consistent
      API where e.g. `pl_tex` is a typedef of `const struct pl_tex_t *`.
    - `PL_LUT_CONVERSION` now explicitly overrides ICC profiles as well
    - HDR color spaces no longer default to having a black point of 0.005
      nits, instead now defaulting to "true" black (1e-7 nits)
    - BT.1886 sources are now automatically tuned to match the swapchain /
      detected target contrast, rather than defaulting to 1000:1
    - move `pl_queue_params.frame_duration` to `pl_source_frame.duration`
    - the `vulkan-link` and `opengl-loader` boolean meson options have been
      removed in favor of the `vk-proc-addr` and `gl-proc-addr` feature
      flags, defaulting to `auto` instead of `yes`
    - a copy of `vulkan.h` and `vk.xml` have been bundled as submodules to
      make satisfying these dependencies easier
    - `<libplacebo/opengl.h>`, `<libplacebo/vulkan.h>` and
      `<libplacebo/d3d11.h`> are now installed unconditonally, with stubs
      for `pl_vulkan_create` etc. available even if these features are
      disabled at compile time
    - `pl_render_info.index` no longer indicates the number of frames being
      mixed on PL_RENDER_STAGE_BLEND, instead being relegated to the new
      field `pl_render_info.count`
    
    Fixes and performance enhancements:
    - fix a bug where shaders with dynamically sized arrays would fail to
      compile on MoltenVK
    - reduce the frequency at which polar compute shaders need to be
      recompiled
    - fix compilation issues with MSVC
    - fix an issue where vulkan portability extensions were not correctly
      detected
    - fix a possible deadlock when using a multi-threaded opengl context
    - specify the correct calling convention for EGL debug callbacks
    - fix a bug where PL_INTENT_ABSOLUTE_COLORIMETRIC broke ICC profiles
    - improve the handling of perceptual ICC profiles, especially on
      "broken" v4 or v2 profiles
    - fix undefined behavior on 32-bit vulkan systems
    - fix bugs in the vulkan swapchain recreation
    - fix an issue where HDR metadata was not correctly reflected back to
      the renderer on vulkan swapchains
    - fix a bug where d3d11 swapchains failed being created on older
      versions of windows where high-bit-depth swapchains are unavailable
    - fix a bug where HDR metadata sent to the swapchain was not correctly
      inferred to valid values
    - `pl_shader_deband` has been rewritten to slightly improve performance,
      especially when the texture has more channels than necessary
    - `pl_shader_deband` no longer raises the black point due to clipping
    - fix build issues on GCC < 6
    - improve validity of partially set `pl_color_space` structs
    - fix `pl_find_tone_map_function` not having an implementation
    - fix a bug where cubic spline frame mixing did not work in `plplay`
    - fix a memory leak in `pl_queue_destroy`
    - fix a bug where changing `pl_icc_params.max_luma` or `intent` did not
      correctly invalidate the ICC 3DLUT and renderer cache
    - greatly improve the performance and accuracy of 3DLUTs (ICC, .cube)
    - fix compilation on newer glslang and make this code forward-compatible
    - fix an issue where `pl_shader_dither` raised the apparent brightness
      of the image when dithering to low bit depths
    - fix compilation on vulkan systems with `vulkan.h` available but no
      vulkan loader
    - fix an issue where DV metadata requiring an EL was partially applied
    - fix an issue where PQ HDR sources were incorrectly assumed to have a
      black point scaled to the mastering display, rather than absolute zero
    - fix an issue where disabling `async_compute` led to undefined behavior
      on systems with async compute queues available
    - fix an issue where debanding was applied *after* user shaders, causing
      massive performance/quality loss in the case of user shaders that
      upscaled the input planes somehow - in exchange for a slight
      performance penalty when rendering a heavily cropped source image with
      debanding enabled
    - fix an issue where plane shaders were sometimes not correctly merged
      with the following image combination shader
    - fix an issue where inverse tone mapping did not work with
      `pl_tone_map_auto`
    - fix a massive performance regression in the non-compute fallback polar
      shader, especially on nvidia and apple systems - in exchange for a
      slight performance penalty on AMD systems
    - slightly boost the performance of shader LUTs in some very specific
      circumstances
    - fix an issue where nonlinear shader LUTs did not work on GLSL < 130
    - fix an issue where libdl was incorrectly required on windows
    - fix an issue where fullscreen exclusive mode triggered freezes on
      certain platforms (e.g. AMD+Windows), by disabling fs exclusive mode
    - fix an issue where the wrong (GLES) extension was used for EGL image
      imports on desktop GL
    
  • v5.228.0-rc1
    v5.228.0-rc1
    
    This is a major release, bumping up the major version to v5 and dropping
    all APIs deprecated in v3.x. The other major breaking change of this
    release is a switch away from the external `libepoxy` OpenGL dependency
    in favor of the (optionally bundled) `glad` version 2. This is now
    included, along with various other build-time dependencies, as git
    submodules. Users are advised to clone with `git clone --recursive` in
    order to satisfy these dependencies automatically, while distros
    maintainers are nonetheless encouraged to continue packaging them.
    
    In addition, this release brings with it a number of new features and
    changes - including support for fully automatic GPU deinterlacing, error
    diffusion dithering, gamma-aware dithering, and a number of improvements
    to the handling of HDR sources and output displays, as well as several
    notable bug fixes and performance enhancements.
    
    Additions:
    - add `pl_gpu_limits.array_size_constants` to indicate whether or not
      push constants can be used to size arrays
    - add PL_HANDLE_MTL_TEX, PL_HANDLE_IOSURFACE and `pl_shared_mem.plane`
      to improve interop with MoltenVK
    - add the informational fields `pl_opengl.major, `pl_opengl.minor`,
      `pl_opengl_extensions` and the `pl_opengl_has_ext` utility function
    - add `pl_opengl_params.get_proc_addr` and `get_proc_addr_ex`
    - add `pl_deband_params.grain_neutral`, the effect of which is to scale
      down / disable adding noise near this value
    - add <libplacebo/shaders/deinterlacing.h>, containing a basic
      implementation of yadif, bob and weave
    - add support for deinterlacing metadata to `pl_render_params`,
      `pl_frame`, and `pl_source_frame`
    - add <libplacebo/shaders/dithering.h>, splitting this off from its
      previous location inside <libplacebo/shaders/colorspace.h>
    - add `pl_shader_error_diffusion` and related helper functions, as well
      as `pl_render_params.error_diffusion`
    - add `pl_dither_params.transfer` to support gamma-aware dithering
    - add `pl_icc_params.force_bpc` to help work around black point
      compensation issues on "broken" v4 and v2 profiles
    
    Changes:
    - fields and functions deprecated in libplacebo v3 have been removed
    - `python3-mako` is now bundled as a submodule to make resolving this
      dependency easier
    - drop `libepoxy` as a dependency, and require `glad` v2 instead, the
      latter of which is added as a submodule to make building easier
    - drop the `PL_STRUCT` transitional macro, and switch to a consistent
      API where e.g. `pl_tex` is a typedef of `const struct pl_tex_t *`.
    - `PL_LUT_CONVERSION` now explicitly overrides ICC profiles as well
    - HDR color spaces no longer default to having a black point of 0.005
      nits, instead now defaulting to "true" black (1e-7 nits)
    - BT.1886 sources are now automatically tuned to match the swapchain /
      detected target contrast, rather than defaulting to 1000:1
    - move `pl_queue_params.frame_duration` to `pl_source_frame.duration`
    - the `vulkan-link` and `opengl-loader` boolean meson options have been
      removed in favor of the `vk-proc-addr` and `gl-proc-addr` feature
      flags, defaulting to `auto` instead of `yes`
    - a copy of `vulkan.h` and `vk.xml` have been bundled as submodules to
      make satisfying these dependencies easier
    - `<libplacebo/opengl.h>`, `<libplacebo/vulkan.h>` and
      `<libplacebo/d3d11.h`> are now installed unconditonally, with stubs
      for `pl_vulkan_create` etc. available even if these features are
      disabled at compile time
    - `pl_render_info.index` no longer indicates the number of frames being
      mixed on PL_RENDER_STAGE_BLEND, instead being relegated to the new
      field `pl_render_info.count`
    
    Fixes and performance enhancements:
    - fix a bug where shaders with dynamically sized arrays would fail to
      compile on MoltenVK
    - reduce the frequency at which polar compute shaders need to be
      recompiled
    - fix compilation issues with MSVC
    - fix an issue where vulkan portability extensions were not correctly
      detected
    - fix a possible deadlock when using a multi-threaded opengl context
    - specify the correct calling convention for EGL debug callbacks
    - fix a bug where PL_INTENT_ABSOLUTE_COLORIMETRIC broke ICC profiles
    - improve the handling of perceptual ICC profiles, especially on
      "broken" v4 or v2 profiles
    - fix undefined behavior on 32-bit vulkan systems
    - fix bugs in the vulkan swapchain recreation
    - fix an issue where HDR metadata was not correctly reflected back to
      the renderer on vulkan swapchains
    - fix a bug where d3d11 swapchains failed being created on older
      versions of windows where high-bit-depth swapchains are unavailable
    - fix a bug where HDR metadata sent to the swapchain was not correctly
      inferred to valid values
    - `pl_shader_deband` has been rewritten to slightly improve performance,
      especially when the texture has more channels than necessary
    - `pl_shader_deband` no longer raises the black point due to clipping
    - fix build issues on GCC < 6
    - improve validity of partially set `pl_color_space` structs
    - fix `pl_find_tone_map_function` not having an implementation
    - fix a bug where cubic spline frame mixing did not work in `plplay`
    - fix a memory leak in `pl_queue_destroy`
    - fix a bug where changing `pl_icc_params.max_luma` or `intent` did not
      correctly invalidate the ICC 3DLUT and renderer cache
    - greatly improve the performance and accuracy of 3DLUTs (ICC, .cube)
    - fix compilation on newer glslang and make this code forward-compatible
    - fix an issue where `pl_shader_dither` raised the apparent brightness
      of the image when dithering to low bit depths
    - fix compilation on vulkan systems with `vulkan.h` available but no
      vulkan loader
    - fix an issue where DV metadata requiring an EL was partially applied
    - fix an issue where PQ HDR sources were incorrectly assumed to have a
      black point scaled to the mastering display, rather than absolute zero
    - fix an issue where disabling `async_compute` led to undefined behavior
      on systems with async compute queues available
    - fix an issue where debanding was applied *after* user shaders, causing
      massive performance/quality loss in the case of user shaders that
      upscaled the input planes somehow - in exchange for a slight
      performance penalty when rendering a heavily cropped source image with
      debanding enabled
    - fix an issue where plane shaders were sometimes not correctly merged
      with the following image combination shader
    - fix an issue where inverse tone mapping did not work with
      `pl_tone_map_auto`
    - fix a massive performance regression in the non-compute fallback polar
      shader, especially on nvidia and apple systems - in exchange for a
      slight performance penalty on AMD systems
    - slightly boost the performance of shader LUTs in some very specific
      circumstances
    - fix an issue where nonlinear shader LUTs did not work on GLSL < 130
    
  • v4.208.0
    v4.208.0
    
    This major release brings with it a number of fixes and changes for
    compatibility with both upstream and downstream projects, native HDR
    output on D3D11, and a complete redesign of the way ICC profiles are
    handled.
    
    Additions:
    - add helper macros linearize() and delinearize(), expanding to the
      definition of the gamma function in use for the video signal
    - add various new helper functions relating to colorspaces and
      primaries, see the API change log for a more comprehensive list
    - add `pl_render_params.force_low_bit_depth_fbos` for
      debugging/performance tweaking purposes
    - add `pl_plane.flipped`, to allow representing individual flipped
      frames in a way that semantically decouples from the presentation rect
      (e.g. for OpenGL framebuffers, or planes with negative stride)
    - add '%' and '=' as operators to custom shaders, matching mpv
    - add `pl_vulkan.(un)lock_queue` for interop with other libraries
    - add `pl_frame.acquire/release` for better interop with hardware
      decoders. These are only called on an as-needed basis immediately
      before and after a frame is actually used for rendering, with only one
      frame being acquired at any given time
    - add `pl_film_grain_from_av` helper function
    - add support for configuring the swapchain color space on D3D11, using
      the existing pl_swapchain_colorspace_hint mechanism
    - add an entirely new ICC profile shader API, allowing ICC profiles to
      be persistently opened (pl_icc_open) and their metadata exposed,
      with explicit `pl_icc_decode` and `pl_icc_encode` operations instead
      of a single monolithic decode+apply step
    - add `pl_render_params.plane_up/downscaler`, allowing to override the
      upscaler/downscaler for subsampled chroma planes in particular
    - add `pl_filter_function/config.name` for debugging/logging purposes
    
    Changes:
    - pl_log_create is no longer an exported symbol, instead becoming
      versioned by the compiled API version. `pl_log_create` is now a macro
      expanding to the name of this versioned function
    - `pl_overlay_part` has been refactored, adding the new field `coords`
      to control the coordinate system relative to which the part is placed
      on-screen, as well as being generalized to support floating point
      positions
    - deprecate PL_HOOK_PRE_OVERLAY, as a result of overlays no longer being
      applied during the rendering pipeline
    - default `pl_color_map_params.gamut_mode` to PL_GAMUT_CLIP, replacing
      PL_GAMUT_DARKEN
    - DRM modifiers are now required for vulkan dmabuf interop
    - `pl_vulkan.queue_*` are now *always* set to valid queues for that
      operation type, even if it means including duplicates
    - `pl_render_image` with NULL image now reports itself as a blend pass
      (blending 0 frames) instead of a frame pass to the info callbacks
    - completely refactor/remove the old ICC/3DLUT shader API
      (`pl_icc_update`, `pl_icc_apply` etc.)
    - <libplacebo/shaders/icc.h> is now installed unconditionally, with
      `pl_icc_open` simply failing when built without lcms2
    - versions of glslang before the new versioning scheme (10.x.x) are no
      longer supported
    
    Fixes and performance enhancements:
    - fix pl_tone_map_reinhard.param_min to prevent division by zero
    - fix left-over asserts preventing misaligned buffer uploads via
      pl_upload_plane
    - fix bug where emulated rgb textures had alpha incorrectly
      preinitialized to 0 instead of 1
    - overlays are now always rendered onto the final blended image, solving
      various bugs and unexpected edge cases due to image overlays being
      blended in the middle of the rendering pipeline
    - fix a bug where tone-mapping without a state object resulted in broken
      behavior
    - allow `pl_shader_sample_polar` to work with external samplers or
      flipped textures without incurring a performance penalty
    - fix the behavior of pl_shader_sample_oversample, which was previously
      producing very wrong results
    - fix an issue where the dither depth was incorrectly picked in a number
      of edge cases
    - fix a number of issues with the H.274 film grain shader
    - fix a bug where grayscale images were slightly too green
    - fix a bug where `pl_vulkan.queue_transfer` was never set
    - fix possible UB in pl_opengl_wrap_tex on some drivers with broken
      texture channel depth queries
    - fix issue where some shader LUTs were being regenerated on every
      single frame rather than properly cached
    - fix shader compilation error on older GLSL
    - fix bug where images were sometimes undesiredly being scaled in linear
      light
    - fix SDR<->SDR tone-mapping to properly be a no-op (linear stretch)
    - fix use-after-free in pl_get_buffer2's error path
    - fix d3d11 build issues on older versions of the SDK
    - fix edge case where auto-detected vulkan in the absence of
      glslang/shaderc caused the build to fail
    - fix build issues with up-to-date vulkan SDK
    - fix issue where non-coherent buffer imports were used in ways not
      adhering to the non-coherent memory atom size
    - fix various issues and undefined behavior when flushing mapped
      buffers, especially for non-coherent memory
    - avoid some validation warnings about improper pipeline barriers
    - fix runtime error with up-to-date MoltenVK
    - fix issue where some pl_frame_mix structs resulted no frames being
      mixed, triggering an assertion
    - fix bug where overlays were drawn flipped onto flipped planes when
      rendering a NULL image
    - fix allocation alignment issues on some platforms (notably win32 i686)
    - fix compatibility issues with older macOS
    - fix error handling in pl_cond_timedwait
    - fix build issues with older vulkan versions
    - fix build issue of demos/sdlimage in some configurations
    - reduce VRAM consumption of ICC 3DLUTs by 50%
    
  • v4.208.0-rc2
    v4.208.0-rc2
    
    This major release brings with it a number of fixes and changes for
    compatibility with both upstream and downstream projects, native HDR
    output on D3D11, and a complete redesign of the way ICC profiles are
    handled.
    
    Additions:
    - add helper macros linearize() and delinearize(), expanding to the
      definition of the gamma function in use for the video signal
    - add various new helper functions relating to colorspaces and
      primaries, see the API change log for a more comprehensive list
    - add `pl_render_params.force_low_bit_depth_fbos` for
      debugging/performance tweaking purposes
    - add `pl_plane.flipped`, to allow representing individual flipped
      frames in a way that semantically decouples from the presentation rect
      (e.g. for OpenGL framebuffers, or planes with negative stride)
    - add '%' and '=' as operators to custom shaders, matching mpv
    - add `pl_vulkan.(un)lock_queue` for interop with other libraries
    - add `pl_frame.acquire/release` for better interop with hardware
      decoders. These are only called on an as-needed basis immediately
      before and after a frame is actually used for rendering, with only one
      frame being acquired at any given time
    - add `pl_film_grain_from_av` helper function
    - add support for configuring the swapchain color space on D3D11, using
      the existing pl_swapchain_colorspace_hint mechanism
    - add an entirely new ICC profile shader API, allowing ICC profiles to
      be persistently opened (pl_icc_open) and their metadata exposed,
      with explicit `pl_icc_decode` and `pl_icc_encode` operations instead
      of a single monolithic decode+apply step
    - add `pl_render_params.plane_up/downscaler`, allowing to override the
      upscaler/downscaler for subsampled chroma planes in particular
    - add `pl_filter_function/config.name` for debugging/logging purposes
    
    Changes:
    - pl_log_create is no longer an exported symbol, instead becoming
      versioned by the compiled API version. `pl_log_create` is now a macro
      expanding to the name of this versioned function
    - `pl_overlay_part` has been refactored, adding the new field `coords`
      to control the coordinate system relative to which the part is placed
      on-screen, as well as being generalized to support floating point
      positions
    - deprecate PL_HOOK_PRE_OVERLAY, as a result of overlays no longer being
      applied during the rendering pipeline
    - default `pl_color_map_params.gamut_mode` to PL_GAMUT_CLIP, replacing
      PL_GAMUT_DARKEN
    - DRM modifiers are now required for vulkan dmabuf interop
    - `pl_vulkan.queue_*` are now *always* set to valid queues for that
      operation type, even if it means including duplicates
    - `pl_render_image` with NULL image now reports itself as a blend pass
      (blending 0 frames) instead of a frame pass to the info callbacks
    - completely refactor/remove the old ICC/3DLUT shader API
      (`pl_icc_update`, `pl_icc_apply` etc.)
    - <libplacebo/shaders/icc.h> is now installed unconditionally, with
      `pl_icc_open` simply failing when built without lcms2
    - versions of glslang before the new versioning scheme (10.x.x) are no
      longer supported
    
    Fixes and performance enhancements:
    - fix pl_tone_map_reinhard.param_min to prevent division by zero
    - fix left-over asserts preventing misaligned buffer uploads via
      pl_upload_plane
    - fix bug where emulated rgb textures had alpha incorrectly
      preinitialized to 0 instead of 1
    - overlays are now always rendered onto the final blended image, solving
      various bugs and unexpected edge cases due to image overlays being
      blended in the middle of the rendering pipeline
    - fix a bug where tone-mapping without a state object resulted in broken
      behavior
    - allow `pl_shader_sample_polar` to work with external samplers or
      flipped textures without incurring a performance penalty
    - fix the behavior of pl_shader_sample_oversample, which was previously
      producing very wrong results
    - fix an issue where the dither depth was incorrectly picked in a number
      of edge cases
    - fix a number of issues with the H.274 film grain shader
    - fix a bug where grayscale images were slightly too green
    - fix a bug where `pl_vulkan.queue_transfer` was never set
    - fix possible UB in pl_opengl_wrap_tex on some drivers with broken
      texture channel depth queries
    - fix issue where some shader LUTs were being regenerated on every
      single frame rather than properly cached
    - fix shader compilation error on older GLSL
    - fix bug where images were sometimes undesiredly being scaled in linear
      light
    - fix SDR<->SDR tone-mapping to properly be a no-op (linear stretch)
    - fix use-after-free in pl_get_buffer2's error path
    - fix d3d11 build issues on older versions of the SDK
    - fix edge case where auto-detected vulkan in the absence of
      glslang/shaderc caused the build to fail
    - fix build issues with up-to-date vulkan SDK
    - fix issue where non-coherent buffer imports were used in ways not
      adhering to the non-coherent memory atom size
    - fix various issues and undefined behavior when flushing mapped
      buffers, especially for non-coherent memory
    - avoid some validation warnings about improper pipeline barriers
    - fix runtime error with up-to-date MoltenVK
    - fix issue where some pl_frame_mix structs resulted no frames being
      mixed, triggering an assertion
    - fix bug where overlays were drawn flipped onto flipped planes when
      rendering a NULL image
    - fix allocation alignment issues on some platforms (notably win32 i686)
    - fix compatibility issues with older macOS
    - fix error handling in pl_cond_timedwait
    - fix build issues with older vulkan versions
    - fix build issue of demos/sdlimage in some configurations
    
  • v4.208.0-rc1
    v4.208.0-rc1
    
    This major release brings with it a number of fixes and changes for
    compatibility with both upstream and downstream projects, native HDR
    output on D3D11, and a complete redesign of the way ICC profiles are
    handled.
    
    Additions:
    - add helper macros linearize() and delinearize(), expanding to the
      definition of the gamma function in use for the video signal
    - add various new helper functions relating to colorspaces and
      primaries, see the API change log for a more comprehensive list
    - add `pl_render_params.force_low_bit_depth_fbos` for
      debugging/performance tweaking purposes
    - add `pl_plane.flipped`, to allow representing individual flipped
      frames in a way that semantically decouples from the presentation rect
      (e.g. for OpenGL framebuffers, or planes with negative stride)
    - add '%' and '=' as operators to custom shaders, matching mpv
    - add `pl_vulkan.(un)lock_queue` for interop with other libraries
    - add `pl_frame.acquire/release` for better interop with hardware
      decoders. These are only called on an as-needed basis immediately
      before and after a frame is actually used for rendering, with only one
      frame being acquired at any given time
    - add `pl_film_grain_from_av` helper function
    - add support for configuring the swapchain color space on D3D11, using
      the existing pl_swapchain_colorspace_hint mechanism
    - add an entirely new ICC profile shader API, allowing ICC profiles to
      be persistently opened (pl_icc_open) and their metadata exposed,
      with explicit `pl_icc_decode` and `pl_icc_encode` operations instead
      of a single monolithic decode+apply step
    - add `pl_render_params.plane_up/downscaler`, allowing to override the
      upscaler/downscaler for subsampled chroma planes in particular
    - ad `pl_filter_function/config.name` for debugging/logging purposes
    
    Changes:
    - pl_log_create is no longer an exported symbol, instead becoming
      versioned by the compiled API version. `pl_log_create` is now a macro
      expanding to the name of this versioned function
    - `pl_overlay_part` has been refactored, adding the new field `coords`
      to control the coordinate system relative to which the part is placed
      on-screen, as well as being generalized to support floating point
      positions
    - deprecate PL_HOOK_PRE_OVERLAY, as a result of overlays no longer being
      applied during the rendering pipeline
    - default `pl_color_map_params.gamut_mode` to PL_GAMUT_CLIP, replacing
      PL_GAMUT_DARKEN
    - DRM modifiers are now required for vulkan dmabuf interop
    - `pl_vulkan.queue_*` are now *always* set to valid queues for that
      operation type, even if it means including duplicates
    - `pl_render_image` with NULL image now reports itself as a blend pass
      (blending 0 frames) instead of a frame pass to the info callbacks
    - completely refactor/remove the old ICC/3DLUT shader API
      (`pl_icc_update`, `pl_icc_apply` etc.)
    - <libplacebo/shaders/icc.h> is now installed unconditionally, with
      `pl_icc_open` simply failing when built without lcms2
    
    Fixes and performance enhancements:
    - fix pl_tone_map_reinhard.param_min to prevent division by zero
    - fix left-over asserts preventing misaligned buffer uploads via
      pl_upload_plane
    - fix bug where emulated rgb textures had alpha incorrectly
      preinitialized to 0 instead of 1
    - overlays are now always rendered onto the final blended image, solving
      various bugs and unexpected edge cases due to image overlays being
      blended in the middle of the rendering pipeline
    - fix a bug where tone-mapping without a state object resulted in broken
      behavior
    - allow `pl_shader_sample_polar` to work with external samplers or
      flipped textures without incurring a performance penalty
    - fix the behavior of pl_shader_sample_oversample, which was previously
      producing very wrong results
    - fix an issue where the dither depth was incorrectly picked in a number
      of edge cases
    - fix a number of issues with the H.274 film grain shader
    - fix a bug where grayscale images were slightly too green
    - fix a bug where `pl_vulkan.queue_transfer` was never set
    - fix possible UB in pl_opengl_wrap_tex on some drivers with broken
      texture channel depth queries
    - fix issue where some shader LUTs were being regenerated on every
      single frame rather than properly cached
    - fix shader compilation error on older GLSL
    - fix bug where images were sometimes undesiredly being scaled in linear
      light
    - fix SDR<->SDR tone-mapping to properly be a no-op (linear stretch)
    - fix use-after-free in pl_get_buffer2's error path
    - fix d3d11 build issues on older versions of the SDK
    - fix edge case where auto-detected vulkan in the absence of
      glslang/shaderc caused the build to fail
    - fix build issues with up-to-date vulkan SDK
    - fix issue where non-coherent buffer imports were used in ways not
      adhering to the non-coherent memory atom size
    - fix various issues and undefined behavior when flushing mapped
      buffers, especially for non-coherent memory
    - avoid some validation warnings about improper pipeline barriers
    - fix runtime error with up-to-date MoltenVK
    - fix issue where some pl_frame_mix structs resulted no frames being
      mixed, triggering an assertion
    - fix bug where overlays were drawn flipped onto flipped planes when
      rendering a NULL image
    
  • v4.192.1
    c3c49744 · meson: bump fix version ·
    v4.192.1
    
    This is a minor bugfix release, containing some crucial follow-up for
    v4.192.0, most notably a fix for a regression in the YCbCr decoding
    logic that resulted in slightly green-shifted output on 10/12-bit files.
    
    Fixes and performance enhancements:
    - fix a regression causing incorrect YCbCr decoding for 10-bit content
    - fix overzealous error detection on OpenGL initialization
    - fix build issue caused by the use of 64-bit atomics on some platforms
    - fix a regression in renderer functionality caused by an unintended
      restriction of FBO requirements on certain platforms (older d3d11)
    - fix an issue where certain d3d11 texture formats were not blittable
    - fix debug layer checks on d3d 11.0
    - fix context creation on older d3d11 runtimes
    - fix an issue where PL_TONE_MAP_HYBRID unintentionally oversaturated
      low brightness scenes
    - fix a build issue on certain BSD platforms
    - update nuklear to 4.9.5, fixing some build-time warnings
    - fix an issue where a change to the d3d11 swapchain code resulted in
      lots of unnecessary log spam
    - fix an issue where some d3d11 formats were detected as gatherable, but
      not sampleable
    
  • v4.192.0
    v4.192.0
    
    This is a minor release, designed to synchronize with the release of
    FFmpeg 5.0. It focuses mainly on improvements to color space handling -
    including support for Dolby Vision Profile 5/8 content, completely
    rewritten HDR tone/gamut mapping, and bringing `pl_color_space` more in
    line with HDR10 metadata. Libplacebo now generally respects things like
    mastering color space metadata, especially for PL_INTENT_SATURATION.
    This technology is not yet perfect, and will be iterated upon in future
    versions of libplacebo. This release serves mainly to lay the API
    groundwork.
    
    Other notable changes include support for H.274 film grain synthesis, as well
    as improvements to the AVFrame<->libplacebo interop (in particular, support for
    hardware accelerated frames), and various fixes related to alpha transparency.
    
    As usual, also includes a number of bug fixes, performance improvements, and
    miscellaneous improvements to the API and debug messages - such as the
    inclusion of a brand-new Vulkan memory allocator, and a complete overhaul of
    the Vulkan synchronization infrastructure to use timeline semaphores,
    again for compatibility with FFmpeg Vulkan contexts.
    
    Additions:
    - add support for H.274 film grain synthesis
    - add preprocessor macros for all params structs, allowing users to write e.g.
      `pl_render_params(.foo = bar)` to construct a `pl_render_params` pointer
      which implicitly includes any default fields, without the need for explicitly
      reading from pl_render_default_params
    - add support for video/display rotation in the renderer
    - add `pl_frame_copy_stream_props`
    - add support for blending transparency against a checkerboard pattern
    - add `pl_fmt.signature`, for render pass compatibility
    - add `pl_pass_params.index_fmt` to allow 32-bit index buffers
    - add `pl_dispatch_reset_frame`, to allow explicitly advancing the state
      of the PRNG and/or triggering garbage collection
    - add the possibility of adding extra debug tags to GPU resources, which
      the default params helper macros set to the current source location
    - add `pl_gpu_limits.max_variable_comps`, correctly specifying the upper
      bound on the number of uniform variable floats
    - add `pl_vulkan_get`, `pl_opengl_get` and `pl_d3d11_get`
    - add `pl_shader_set_alpha`
    - add `pl_map_avframe_ex` and `pl_unmap_avframe`, which allow mapping extra
      AVFrame resources, and also support the use of hardware frames such as vaapi,
      dmabuf or vulkan
    - add support for Dolby Vision color reshaping, via PL_COLOR_SYSTEM_DOLBYVISION
      and `pl_dovi_metadata` - including automatic mapping from AVFrames
    - add <libplacebo/tone_mapping.h>, defining a collection of tone mapping
      primitives, and mechanisms for constructing LUTs, and including new
      functions such as BT.2446a and `spline`, as well as improvements to old
      curves such as `hable` and `linear` to make them more perceptually linear
    - add a variety of new tone mapping modes (see `pl_tone_map_mode`), including
      auto-selection based on heuristics of the source characteristics
    - add a variety of new gamut mapping modes (see `pl_gamut_mode`)
    - add support for `NAME_gather` macros for use in user shaders
    
    Changes:
    - replace <libplacebo/shaders/av1.h> by the more general
      <libplacebo/shaders/film_grain.h>
    - remove API members deprecated for libplacebo v3
    - PL_ALPHA_UNKNOWN tagging on files is now assumed to be PL_ALPHA_INDEPENDENT,
      rather than PL_ALPHA_PREMULTIPLIED, and `pl_shader_decode_color` now also
      outputs independent alpha by default
    - the `box` filter was removed entirely, due to a number of issues preventing
      it from being effectively useful in practice
    - replace `pl_tex_transfer.stride_w/h` (specified in texels) by
      `row/depth_pitch` (specified in bytes)
    - replace `pl_pass_params.target_dummy` by `target_format`, and
      requiring that rendered textures are compatible with this format
    - allow calling `pl_queue_update` on NULL
    - <libplacebo/vulkan.h> now requires support for the timeline semaphores
      feature, included automatically in Vulkan 1.2 and available via
      VK_KHR_timeline_semaphore in previous versions
    - change pl_vulkan_hold/release API: removing VkAccessFlags, and replacing the
      VkSemaphore by pl_vulkan_sem (for timeline semaphore support)
    - `pl_queue_push` may now be used to push frames out-of-order
    - `pl_render_image_mix` may now be used on single frames, in which case
      libplacebo will still go through the mixer cache, potentially speeding up
      single-frame redraws (see: `pl_render_params.skip_caching_single_frames`)
    - remove `pl_vulkan_params.disable_events`
    - `pl_shared_mem.size` no longer needs to be set for DMABUFs and D3D11 textures
    - remove support for 64-bit integer texture formats, since these are very
      poorly supported on most platforms and also extremely rarely needed
    - completely refactor all of the tone mapping settings in `pl_color_map_params`,
      replacing the old `desaturation_*` and `tone_mapping_algo` by the new
      `tone_mapping_mode` and `tone_mapping_function`, and the old `gamut_warning`
      and `gamut_clipping` by the new `gamut_mode`
    - completely refactor `pl_color_space`: deprecate the old `sig_peak`,
      `sig_scale` etc. fields in favor of merging `pl_hdr_metadata` into this
      struct, and update the API of several functions that previusly took
      `pl_color_space` struct values, to instead take pointers
    - remove `pl_color_light` entirely, instead treating the OOTF as an inseparable
      part of the color transfer function (e.g. HLG)
    - delete `pl_swapchain_colors` in favor of `pl_color_space` instead (which
      contains the exact same fields now)
    
    Fixes and performance enhancements:
    - improve the quality and performance of GPU random number generation
    - fix int/float compilation error on GLES in dither shader
    - correctly set minimum integer precision on GLES
    - allow pl_recreate_plane to create non-host-readable FBOs
    - correct GLSL version requirement for 3D LUT shader
    - correctly check for presence of GL_EXT_texture_integer
    - correctly check for presence of GL_EXT_texture_norm16 on GLES 3.0
    - correctly check for presence of GL_EXT_color_buffer_float
    - replace GL_ARB_debug_output by GL_KHR_debug
    - fix GLSL shader version for GLES 2.0
    - add support for GL_EXt_texture_rg on GLES
    - use GL_ARRAY_BUFFER instead of GL_COPY_WRITE_BUFFER (GLES compatibility)
    - correctly check for GL_UNPACK_IMAGE_HEIGHT presence
    - disable host readback on too-old GLES
    - add support for the `bgra8` image format on gl/gles and `bgrx8` on d3d11
    - remove deprecated usage of bare pointers for OpenGL index data
    - fix vulkan malloc efficiency estimate calculation
    - fix a memory leak in the vulkan memory allocator for small (<1K) buffers
    - complete rewrite of the vulkan memory allocator to improve throughput,
      reduce code complexity and generally reduce memory waste
    - allow using libplacebo as a meson subproject
    - fix cyclic header dependency
    - fix dithering when the FBO bit depth is higher than the content bit depth
    - fix segfault if command buffer allocation fails
    - fix various thread safety issues in vulkan command polling
    - properly invalidate framebuffers on OpenGL
    - properly disable GL_DEPTH_TEST and GL_CULL_FACE when running GL passes
    - fix GL_ARB_framebuffer_object check
    - fix issue with rendering transparent images on non-transparent swapchains
    - try and detect presence of alpha channels on opengl framebuffers
    - fix OUTPUT and NATIVE_CROPPED hook expressions for flipped files
    - fix EPOXY_HAS_EGL checks
    - significance increase performance of ICC 3DLUT generation
    - correctly set the C level to C11 during compilation
    - properly align allocated memory to `max_align_t` (instead of `intmax_t`)
    - fix `pl_cond_timedwait`
    - fix bug where `pl_opengl_wrap`+`pl_tex_destroy` accidentally closed FD 0
    - fix pl_get_buffer2 implementation
    - fix alpha blending of transparent subtitles onto transparent images
    - fix issue where frame blending could sometimes crash if the only image
      in the mix was too far away from the vsync
    - fix segfault when dispatching compute shader output hook while frame blending
    - fix UB when using the same shader with different types of textures on vulkan
    - fix possible race condition when writing to the same vulkan resource twice
    - fix issue where user shaders were sometimes executed as compute shaders
      despite no //!COMPUTE pragma
    - properly align texel buffers on vulkan
    - properly propagate HOOKED textures between passes of a shader
    - also support importing vulkan features from meta-structs like
      `VkPhysicalDeviceVulkan12Features`
    - drop the use of VkEvents entirely, and instead optimize the usage of pipeline
      barriers to always emit the minimum required dependency
    - fix vulkan object type enum parsing on recent vulkan versions
    - fix invalid output on the first frame after enabling peak detection
    - fix linking order of glslang libraries
    - fix generated .pc file on windows
    - fix imports of dedicated memory with plane offsets into vulkan resources
    - fix major performance issue when combining debanding with bilinear scaling
    - fix issue where `pl_vulkan_wrap` did not support `pl_tex_params.user_data`
    - fix compatibility with MoltenVK by adding VK_KHR_portability_subset
    - various compatibility fixes for OpenGL version 2.1
    - fix UB in `pl_test_pixfmt`
    - fix issue where rendering to partial crops of vulkan textures untentionally
      invalidated the image contents outside of the rendering area
    - reduce the rate of false negatives in the renderer mixing cache
    - fix strided OpenGL texture uploads
    - fix crash in the frame mixer when the image color space changes mid-stream
    - fix check for EGL DMA buffer modifiers
    - fix division by zero in tone mapping shader
    - make `pl_mpv_user_shader_destroy` properly reset the passed pointer
    - fix undefined behavior passing negative values to `pl_shader_decode_color`
    - fix bug where PL_QUEUE_MORE resulted in invalid frame mix outputs
    - fix thread race between `pl_queue_push` and reading from a `pl_frame_mix`
    - fix `pl_render_high_quality_params`
    - fix parsing .cube LUTs with scientific notation floats
    - inline LUTs into shader text less aggressively
    - disable peak detection in `pl_render_default_params`, instead moving it to
      `pl_render_high_quality_params`
    - fix edge case where HDR spaces didn't properly disable linearization
    - fix various issues involving the allocation of per-pass identifiers on d3d11
    - fix issue where the d3d11 swapchain unnecessarily held on to the framebuffer
    - make `pl_swapchain_start/stop_frame` more robust against threading issues or
      API misuse
    - fix the application of `pl_color_adjustment.gamma` in `pl_shader_decode_color`
    - add support for `pl_pass_params.cached_program` on d3d11
    
    
  • v4.192.0-rc1
    v4.192.0-rc1
    
    This is a minor release that focuses mainly on improvements to color space
    handling - including support for Dolby Vision Profile 5/8 content, completely
    rewritten HDR tone/gamut mapping, and bringing `pl_color_space` more in line
    with HDR10 metadata. Libplaceb now generally respects things like mastering
    color space metadata, especially for PL_INTENT_SATURATION. This technology is
    not yet perfect, and will be iterated upon in future versions of libplacebo.
    This release serves mainly to lay the API groundwork.
    
    Other notable changes include support for H.274 film grain synthesis, as well
    as improvements to the AVFrame<->libplacebo interop (in particular, support for
    hardware accelerated frames), and various fixes related to alpha transparency.
    
    As usual, also includes a number of bug fixes, performance improvements, and
    miscellaneous improvements to the API and debug messages - such as the
    inclusion of a brand-new Vulkan memory allocator, and a complete overhaul of
    the Vulkan synchronization infrastructure to use timeline semaphores.
    
    Additions:
    - add support for H.274 film grain synthesis
    - add preprocessor macros for all params structs, allowing users to write e.g.
      `pl_render_params(.foo = bar)` to construct a `pl_render_params` pointer
      which implicitly includes any default fields, without the need for explicitly
      reading from pl_render_default_params
    - add support for video/display rotation in the renderer
    - add `pl_frame_copy_stream_props`
    - add support for blending transparency against a checkerboard pattern
    - add `pl_fmt.signature`, for render pass compatibility
    - add `pl_pass_params.index_fmt` to allow 32-bit index buffers
    - add `pl_dispatch_reset_frame`, to allow explicitly advancing the state
      of the PRNG and/or triggering garbage collection
    - add the possibility of adding extra debug tags to GPU resources, which
      the default params helper macros set to the current source location
    - add `pl_gpu_limits.max_variable_comps`, correctly specifying the upper
      bound on the number of uniform variable floats
    - add `pl_vulkan_get`, `pl_opengl_get` and `pl_d3d11_get`
    - add `pl_shader_set_alpha`
    - add `pl_map_avframe_ex` and `pl_unmap_avframe`, which allow mapping extra
      AVFrame resources, and also support the use of hardware frames such as vaapi,
      dmabuf or vulkan
    - add support for Dolby Vision color reshaping, via PL_COLOR_SYSTEM_DOLBYVISION
      and `pl_dovi_metadata` - including automatic mapping from AVFrames
    - add <libplacebo/tone_mapping.h>, defining a collection of tone mapping
      primitives, and mechanisms for constructing LUTs, and including new
      functions such as BT.2446a and `spline`, as well as improvements to old
      curves such as `hable` and `linear` to make them more perceptually linear
    - add a variety of new tone mapping modes (see `pl_tone_map_mode`), including
      auto-selection based on heuristics of the source characteristics
    - add a variety of new gamut mapping modes (see `pl_gamut_mode`)
    - add support for `NAME_gather` macros for use in user shaders
    
    Changes:
    - replace <libplacebo/shaders/av1.h> by the more general
      <libplacebo/shaders/film_grain.h>
    - remove API members deprecated for libplacebo v3
    - PL_ALPHA_UNKNOWN tagging on files is now assumed to be PL_ALPHA_INDEPENDENT,
      rather than PL_ALPHA_PREMULTIPLIED, and `pl_shader_decode_color` now also
      outputs independent alpha by default
    - the `box` filter was removed entirely, due to a number of issues preventing
      it from being effectively useful in practice
    - replace `pl_tex_transfer.stride_w/h` (specified in texels) by
      `row/depth_pitch` (specified in bytes)
    - replace `pl_pass_params.target_dummy` by `target_format`, and
      requiring that rendered textures are compatible with this format
    - allow calling `pl_queue_update` on NULL
    - <libplacebo/vulkan.h> now requires support for the timeline semaphores
      feature, included automatically in Vulkan 1.2 and available via
      VK_KHR_timeline_semaphore in previous versions
    - change pl_vulkan_hold/release API: removing VkAccessFlags, and replacing the
      VkSemaphore by pl_vulkan_sem (for timeline semaphore support)
    - `pl_queue_push` may now be used to push frames out-of-order
    - `pl_render_image_mix` may now be used on single frames, in which case
      libplacebo will still go through the mixer cache, potentially speeding up
      single-frame redraws (see: `pl_render_params.skip_caching_single_frames`)
    - remove `pl_vulkan_params.disable_events`
    - `pl_shared_mem.size` no longer needs to be set for DMABUFs and D3D11 textures
    - remove support for 64-bit integer texture formats, since these are very
      poorly supported on most platforms and also extremely rarely needed
    - completely refactor all of the tone mapping settings in `pl_color_map_params`,
      replacing the old `desaturation_*` and `tone_mapping_algo` by the new
      `tone_mapping_mode` and `tone_mapping_function`, and the old `gamut_warning`
      and `gamut_clipping` by the new `gamut_mode`
    - completely refactor `pl_color_space`: deprecate the old `sig_peak`,
      `sig_scale` etc. fields in favor of merging `pl_hdr_metadata` into this
      struct, and update the API of several functions that previusly took
      `pl_color_space` struct values, to instead take pointers
    - remove `pl_color_light` entirely, instead treating the OOTF as an inseparable
      part of the color transfer function (e.g. HLG)
    - delete `pl_swapchain_colors` in favor of `pl_color_space` instead (which
      contains the exact same fields now)
    
    Fixes and performance enhancements:
    - improve the quality and performance of GPU random number generation
    - fix int/float compilation error on GLES in dither shader
    - correctly set minimum integer precision on GLES
    - allow pl_recreate_plane to create non-host-readable FBOs
    - correct GLSL version requirement for 3D LUT shader
    - correctly check for presence of GL_EXT_texture_integer
    - correctly check for presence of GL_EXT_texture_norm16 on GLES 3.0
    - correctly check for presence of GL_EXT_color_buffer_float
    - replace GL_ARB_debug_output by GL_KHR_debug
    - fix GLSL shader version for GLES 2.0
    - add support for GL_EXt_texture_rg on GLES
    - use GL_ARRAY_BUFFER instead of GL_COPY_WRITE_BUFFER (GLES compatibility)
    - correctly check for GL_UNPACK_IMAGE_HEIGHT presence
    - disable host readback on too-old GLES
    - add support for the `bgra8` image format on gl/gles and `bgrx8` on d3d11
    - remove deprecated usage of bare pointers for OpenGL index data
    - fix vulkan malloc efficiency estimate calculation
    - fix a memory leak in the vulkan memory allocator for small (<1K) buffers
    - complete rewrite of the vulkan memory allocator to improve throughput,
      reduce code complexity and generally reduce memory waste
    - allow using libplacebo as a meson subproject
    - fix cyclic header dependency
    - fix dithering when the FBO bit depth is higher than the content bit depth
    - fix segfault if command buffer allocation fails
    - fix various thread safety issues in vulkan command polling
    - properly invalidate framebuffers on OpenGL
    - properly disable GL_DEPTH_TEST and GL_CULL_FACE when running GL passes
    - fix GL_ARB_framebuffer_object check
    - fix issue with rendering transparent images on non-transparent swapchains
    - try and detect presence of alpha channels on opengl framebuffers
    - fix OUTPUT and NATIVE_CROPPED hook expressions for flipped files
    - fix EPOXY_HAS_EGL checks
    - significance increase performance of ICC 3DLUT generation
    - correctly set the C level to C11 during compilation
    - properly align allocated memory to `max_align_t` (instead of `intmax_t`)
    - fix `pl_cond_timedwait`
    - fix bug where `pl_opengl_wrap`+`pl_tex_destroy` accidentally closed FD 0
    - fix pl_get_buffer2 implementation
    - fix alpha blending of transparent subtitles onto transparent images
    - fix issue where frame blending could sometimes crash if the only image
      in the mix was too far away from the vsync
    - fix segfault when dispatching compute shader output hook while frame blending
    - fix UB when using the same shader with different types of textures on vulkan
    - fix possible race condition when writing to the same vulkan resource twice
    - fix issue where user shaders were sometimes executed as compute shaders
      despite no //!COMPUTE pragma
    - properly align texel buffers on vulkan
    - properly propagate HOOKED textures between passes of a shader
    - also support importing vulkan features from meta-structs like
      `VkPhysicalDeviceVulkan12Features`
    - drop the use of VkEvents entirely, and instead optimize the usage of pipeline
      barriers to always emit the minimum required dependency
    - fix vulkan object type enum parsing on recent vulkan versions
    - fix invalid output on the first frame after enabling peak detection
    - fix linking order of glslang libraries
    - fix generated .pc file on windows
    - fix imports of dedicated memory with plane offsets into vulkan resources
    - fix major performance issue when combining debanding with bilinear scaling
    - fix issue where `pl_vulkan_wrap` did not support `pl_tex_params.user_data`
    - fix compatibility with MoltenVK by adding VK_KHR_portability_subset
    - various compatibility fixes for OpenGL version 2.1
    - fix UB in `pl_test_pixfmt`
    - fix issue where rendering to partial crops of vulkan textures untentionally
      invalidated the image contents outside of the rendering area
    - reduce the rate of false negatives in the renderer mixing cache
    - fix strided OpenGL texture uploads
    - fix crash in the frame mixer when the image color space changes mid-stream
    - fix check for EGL DMA buffer modifiers
    - fix division by zero in tone mapping shader
    - make `pl_mpv_user_shader_destroy` properly reset the passed pointer
    - fix undefined behavior passing negative values to `pl_shader_decode_color`
    - fix bug where PL_QUEUE_MORE resulted in invalid frame mix outputs
    - fix thread race between `pl_queue_push` and reading from a `pl_frame_mix`
    - fix `pl_render_high_quality_params`
    - fix parsing .cube LUTs with scientific notation floats
    - inline LUTs into shader text less aggressively
    - disable peak detection in `pl_render_default_params`, instead moving it to
      `pl_render_high_quality_params`
    - fix edge case where HDR spaces didn't properly disable linearization
    - fix various issues involving the allocation of per-pass identifiers on d3d11
    - fix issue where the d3d11 swapchain unnecessarily held on to the framebuffer
    - make `pl_swapchain_start/stop_frame` more robust against threading issues or
      API misuse
    - fix the application of `pl_color_adjustment.gamma` in `pl_shader_decode_color`
    - add support for `pl_pass_params.cached_program` on d3d11
    
    
  • v4.157.0
    v4.157.0
    
    This is a major new release involving a significant overhaul of the
    public API, full thread safety, support for Direct3D 11 / Win32 /
    MSVC, native HDR output, and more.
    
    The primary way of accessing most libplacebo objects has been revamped.
    Rather than writing e.g. `const struct pl_tex *image`, users now simply
    write `pl_tex image`. In addition, the `struct pl_context *ctx` was
    universally refactored and replaced by `pl_log log`, with no concern
    besides logging.
    
    Direct3D 11 is now natively supported by libplacebo, and compiling on
    Windows in general has been made more straightforward.
    
    The entire API was revamped to be thread safe by default, even when
    using OpenGL (assuming the user provides the appropriate context binding
    callbacks). Accompanying this change, the `pl_queue` has been rewritten
    with multi-threaded decoding loops in mind. See the accompanying
    `plplay` demo for an illustration.
    
    Finally, this release brings with it a lot of features for feature
    parity with mpv, such as the ability to get pass stats / timings,
    oversample scaling, and more.
    
    Additions:
    - add a `void *user_data` field to `pl_frame`, with no further
      interpretation by libplacebo
    - add `pl_queue_push_block`, useful for multi-threaded decoding loops
    - add a `uint64_t timeout` to `pl_queue_update`, allowing it to
      block until frames are available even when not using a `get_frame`
      callback
    - make `pl_queue_update` also return valid data when failing with
      PL_QUEUE_MORE, allowing access to partial/incomplete mix outputs
    - allow calling `pl_render_image` on `image == NULL`, to render overlays
      only
    - add `pl_get_buffer2`, API-compatible with AVCodecContext.get_buffer2
    - add support for blitting from/to several obscure formats such as
      a1rgb5 or 64-bit integer formats
    - add `pl_tex_clear_ex` to support clearing integer textures
    - add `pl_render_params.ignore_icc_profiles`, for debugging
    - add `pl_queue_params.interpolation_threshold`, to allow disabling
      frame mixing when the source FPS approximately matches the display FPS
    - always accept DRM_FORMAT_MOD_INVALID for texture imports
    - add extra windowing functions to <libplacebo/filters.h>
    - add the `pl_fmt.gatherable` capability
    - add `pl_shader_sample_oversample`, a variant of nearest-neighbour
      that preserves pixel aspect ratios - good for pixel art
    - add `pl_scale_filters` alongside `pl_frame_mixers`
    - add support for compile-time specialization constants (`pl_constant`),
      and use them to speed up recompilation of shaders with hard-coded
      constants
    - add `pl_render_params.dynamic_constants`, which lifts hard-coded
      constants to dynamic variables - useful for scenarios in which render
      parameters are expected to change very frequently
    - add more PL_COLOR_TRC_GAMMAxx definitions
    - implement full black point adaptation, even when not using ICC
      profiles, and infer this black-point-adapted BT.1886 instead of gamma
      2.2 as the default gamma curve for SDR files.
    - add `pl_shader_res.description` and `pl_shader_res.steps`, containing
      more friendly names for shaders plus a detailed list of operations
      that shader is performing
    - add callbacks to `pl_dispatch` and `pl_renderer` for informing users
      of executed passes and their execution times
    - add support for the Direct3D 11 graphics API
    - add `pl_swapchain_colorspace_hint`, replacing
      `pl_swapchain_hdr_metadata` as the new way to update swapchain
      colorspace metadata at runtime. This can be used to e.g. switch
      between HDR and SDR mode, for supported swapchains
    - add `pl_peak_detect_params.minimum_peak`, allowing users to constrain
      the detected peak values to only be sensible (e.g. above 1.0)
    
    Changes:
    - simplify the `shaderc` pkg-config check - rather than querying for
      `shaderc_shared.pc`, `shaderc_combined.pc` etc, simply check for
      `shaderc.pc`, matching upstream
    - make almost everything thread-safe, and document the parts that
      aren't. In particular, almost all GPU state access is now thread safe,
      freeing up users to access `pl_gpu` instances from multiple threads,
      even when the underlying API is OpenGL
    - deprecate `disable_overlay_sampling`, now effectively always true
    - `struct pl_overlay` has been refactored completely to allow for
      overlays with more than one part per texture. The only way of using
      this struct is deprecated
    - prefix `enum pl_queue_status` members by `PL_`, fixing an oversight in
      the previous version of this API
    - make `pl_renderer` automatically clear the target image, freeing users
      from the responsibility of calling `pl_frame_clear` themselves. This
      can be controlled via three new fields in `pl_render_params`:
      `background_color`, `background_transparency` and `skip_target_clearing`
    - rename `pl_context` to `pl_log`, and make its use optional. The old
      names have been deprecated. It now lives inside <libplacebo/log.h>
    - add `typedefs` to all public-facing object types, o make them shorter
      to reference. For example, `const struct pl_tex *tex` is now simply
      `pl_tex tex`. This change affects almost every type of object in
      libplacebo. The old way of referencing these objects is still
      possible, but considered deprecated. Note that due to C++-specific
      reasons, C++ users *must* upgrade their codeto the new API style
    - remove PL_PRIM_TRIANGLE_FAN
    - remove support for 64-bit float formats, which probably don't work on
      any Vulkan implementation
    - stop contrast-limiting ICC profiles, instead assuming perceptual
      profiles have infinite contrast
    - remove `pl_shader_signature` for being necessarily unsafe
    - require Vulkan 1.1 as the minimum vulkan version
    - rename `pl_oversample_frame_mixer` to `pl_filter_oversample`, and
      allow using it for image scaling as well
    - change `pl_color_space_monitor` from PL_COLOR_TRC_GAMMA22 to UNKNOWN
    - change the signature of `pl_shader_(de)linearize` slightly
    - significantly increase the default strengths of the desaturation
      settings in`pl_color_map_params`, to mimic the hollywood feel
    - refactor `pl_glsl_desc` and `pl_gpu_caps` completely, in favor of the
      new structs `pl_glsl_version` and `pl_gpu_limits`, with new members.
      The old API is still available for the time being, but deprecated
    
    Fixes and performance improvements:
    - fix possible use-after-free in `plplay`
    - don't explode `pl_queue` on NaN/Infinity/weird PTS values
    - fix edge case involving plane merging for cropped images
    - improve `plplay` by using threaded libplacebo APIs
    - several fixes for edge cases in <libplacebo/utils/libav.h> helpers
    - several fixes for 32-bit platforms (e.g. integer overflows)
    - fix blending edge cases involving overlays and alpha channels
    - skip some unnecessary matrix multiplications for RGB content
    - allow for some small backwards PTS jumps in `pl_queue_update`
    - fix drawing overlays to subsampled targets
    - `pl_dispatch` now garbage collects old, unused passes to free up RAM
    - various improvements to debug/diagnonstic printouts
    - allow blitting from e.g. 2D to 3D textures
    - slightly improve small texture transfers in some emulated edge cases
    - fix several possible hash collisions for generated shaders, making the
      shader dispatch mechanism significantly more robust
    - properly allow building against vulkan headers without linking to the
      vulkan loader
    - C++ compatibility for public headers
    - improve performance of textureGather-based polar sampling, especially
      for radius 2 and 4
    - fix vulkan texture handle capabilities check, again
    - don't include superfluous pNext chains, fixes undefined behavior
    - fix crash on edge case when shader compilation fails
    - infer unsampled alpha channels as 1.0, rather than 0.0
    - properly infer `target->color` in `pl_render_image`
    - properly tag the OpenGL swapchain as pl_color_space_monitor
    - fix possible crash in pl_get_detected_peak
    - fix several edge cases in pl_render_image_mix relating to LUTs,
      3DLUTs, HDR peak detection and so on
    - fix sig_peak inferral for HLG content
    - several compatibility fixes for older GLSL, and GLES 2.0
    - fix possible use-after-free in pl_shader_custom
    - fix `pl_color_map_params.gamut_clipping` for HDR targets
    - reduce the number of redundant color space transformations required
      for frame mixing
    - fix edge case in pl_dispatch_save for some ancient GL drivers
    - several fixes for LLVM/MinGW/MSVC
    - fix bug where pl_pass_run incorrectly invalidated/accessed
      `params->target` even for compute shaders
    - add windows compatibility to several demo programs
    - fix the pl_fmt <-> DRM fourcc format mapping table
    - fix inappropriate texture access function for generated samplers with
      the sampler2D API
    - avoid generating spurious EGL errors when probing for EGL format
      modifiers
    - fix various typis in the documentation
    
  • v4.157.0-rc1
    v4.157.0-rc1
    
    This is a major new release involving a significant overhaul of the
    public API, full thread safety, support for Direct3D 11 / Win32 /
    MSVC, native HDR output, and more.
    
    The primary way of accessing most libplacebo objects has been revamped.
    Rather than writing e.g. `const struct pl_tex *image`, users now simply
    write `pl_tex image`. In addition, the `struct pl_context *ctx` was
    universally refactored and replaced by `pl_log log`, with no concern
    besides logging.
    
    Direct3D 11 is now natively supported by libplacebo, and compiling on
    Windows in general has been made more straightforward.
    
    The entire API was revamped to be thread safe by default, even when
    using OpenGL (assuming the user provides the appropriate context binding
    callbacks). Accompanying this change, the `pl_queue` has been rewritten
    with multi-threaded decoding loops in mind. See the accompanying
    `plplay` demo for an illustration.
    
    Finally, this release brings with it a lot of features for feature
    parity with mpv, such as the ability to get pass stats / timings,
    oversample scaling, and more.
    
    Additions:
    - add a `void *user_data` field to `pl_frame`, with no further
      interpretation by libplacebo
    - add `pl_queue_push_block`, useful for multi-threaded decoding loops
    - add a `uint64_t timeout` to `pl_queue_update`, allowing it to
      block until frames are available even when not using a `get_frame`
      callback
    - make `pl_queue_update` also return valid data when failing with
      PL_QUEUE_MORE, allowing access to partial/incomplete mix outputs
    - allow calling `pl_render_image` on `image == NULL`, to render overlays
      only
    - add `pl_get_buffer2`, API-compatible with AVCodecContext.get_buffer2
    - add support for blitting from/to several obscure formats such as
      a1rgb5 or 64-bit integer formats
    - add `pl_tex_clear_ex` to support clearing integer textures
    - add `pl_render_params.ignore_icc_profiles`, for debugging
    - add `pl_queue_params.interpolation_threshold`, to allow disabling
      frame mixing when the source FPS approximately matches the display FPS
    - always accept DRM_FORMAT_MOD_INVALID for texture imports
    - add extra windowing functions to <libplacebo/filters.h>
    - add the `pl_fmt.gatherable` capability
    - add `pl_shader_sample_oversample`, a variant of nearest-neighbour
      that preserves pixel aspect ratios - good for pixel art
    - add `pl_scale_filters` alongside `pl_frame_mixers`
    - add support for compile-time specialization constants (`pl_constant`),
      and use them to speed up recompilation of shaders with hard-coded
      constants
    - add `pl_render_params.dynamic_constants`, which lifts hard-coded
      constants to dynamic variables - useful for scenarios in which render
      parameters are expected to change very frequently
    - add more PL_COLOR_TRC_GAMMAxx definitions
    - implement full black point adaptation, even when not using ICC
      profiles, and infer this black-point-adapted BT.1886 instead of gamma
      2.2 as the default gamma curve for SDR files.
    - add `pl_shader_res.description` and `pl_shader_res.steps`, containing
      more friendly names for shaders plus a detailed list of operations
      that shader is performing
    - add callbacks to `pl_dispatch` and `pl_renderer` for informing users
      of executed passes and their execution times
    - add support for the Direct3D 11 graphics API
    - add `pl_swapchain_colorspace_hint`, replacing
      `pl_swapchain_hdr_metadata` as the new way to update swapchain
      colorspace metadata at runtime. This can be used to e.g. switch
      between HDR and SDR mode, for supported swapchains
    - add `pl_peak_detect_params.minimum_peak`, allowing users to constrain
      the detected peak values to only be sensible (e.g. above 1.0)
    
    Changes:
    - simplify the `shaderc` pkg-config check - rather than querying for
      `shaderc_shared.pc`, `shaderc_combined.pc` etc, simply check for
      `shaderc.pc`, matching upstream
    - make almost everything thread-safe, and document the parts that
      aren't. In particular, almost all GPU state access is now thread safe,
      freeing up users to access `pl_gpu` instances from multiple threads,
      even when the underlying API is OpenGL
    - deprecate `disable_overlay_sampling`, now effectively always true
    - `struct pl_overlay` has been refactored completely to allow for
      overlays with more than one part per texture. The only way of using
      this struct is deprecated
    - prefix `enum pl_queue_status` members by `PL_`, fixing an oversight in
      the previous version of this API
    - make `pl_renderer` automatically clear the target image, freeing users
      from the responsibility of calling `pl_frame_clear` themselves. This
      can be controlled via three new fields in `pl_render_params`:
      `background_color`, `background_transparency` and `skip_target_clearing`
    - rename `pl_context` to `pl_log`, and make its use optional. The old
      names have been deprecated. It now lives inside <libplacebo/log.h>
    - add `typedefs` to all public-facing object types, o make them shorter
      to reference. For example, `const struct pl_tex *tex` is now simply
      `pl_tex tex`. This change affects almost every type of object in
      libplacebo. The old way of referencing these objects is still
      possible, but considered deprecated. Note that due to C++-specific
      reasons, C++ users *must* upgrade their codeto the new API style
    - remove PL_PRIM_TRIANGLE_FAN
    - remove support for 64-bit float formats, which probably don't work on
      any Vulkan implementation
    - stop contrast-limiting ICC profiles, instead assuming perceptual
      profiles have infinite contrast
    - remove `pl_shader_signature` for being necessarily unsafe
    - require Vulkan 1.1 as the minimum vulkan version
    - rename `pl_oversample_frame_mixer` to `pl_filter_oversample`, and
      allow using it for image scaling as well
    - change `pl_color_space_monitor` from PL_COLOR_TRC_GAMMA22 to UNKNOWN
    - change the signature of `pl_shader_(de)linearize` slightly
    - significantly increase the default strengths of the desaturation
      settings in`pl_color_map_params`, to mimic the hollywood feel
    - refactor `pl_glsl_desc` and `pl_gpu_caps` completely, in favor of the
      new structs `pl_glsl_version` and `pl_gpu_limits`, with new members.
      The old API is still available for the time being, but deprecated
    
    Fixes and performance improvements:
    - fix possible use-after-free in `plplay`
    - don't explode `pl_queue` on NaN/Infinity/weird PTS values
    - fix edge case involving plane merging for cropped images
    - improve `plplay` by using threaded libplacebo APIs
    - several fixes for edge cases in <libplacebo/utils/libav.h> helpers
    - several fixes for 32-bit platforms (e.g. integer overflows)
    - fix blending edge cases involving overlays and alpha channels
    - skip some unnecessary matrix multiplications for RGB content
    - allow for some small backwards PTS jumps in `pl_queue_update`
    - fix drawing overlays to subsampled targets
    - `pl_dispatch` now garbage collects old, unused passes to free up RAM
    - various improvements to debug/diagnonstic printouts
    - allow blitting from e.g. 2D to 3D textures
    - slightly improve small texture transfers in some emulated edge cases
    - fix several possible hash collisions for generated shaders, making the
      shader dispatch mechanism significantly more robust
    - properly allow building against vulkan headers without linking to the
      vulkan loader
    - C++ compatibility for public headers
    - improve performance of textureGather-based polar sampling, especially
      for radius 2 and 4
    - fix vulkan texture handle capabilities check, again
    - don't include superfluous pNext chains, fixes undefined behavior
    - fix crash on edge case when shader compilation fails
    - infer unsampled alpha channels as 1.0, rather than 0.0
    - properly infer `target->color` in `pl_render_image`
    - properly tag the OpenGL swapchain as pl_color_space_monitor
    - fix possible crash in pl_get_detected_peak
    - fix several edge cases in pl_render_image_mix relating to LUTs,
      3DLUTs, HDR peak detection and so on
    - fix sig_peak inferral for HLG content
    - several compatibility fixes for older GLSL, and GLES 2.0
    - fix possible use-after-free in pl_shader_custom
    - fix `pl_color_map_params.gamut_clipping` for HDR targets
    - reduce the number of redundant color space transformations required
      for frame mixing
    - fix edge case in pl_dispatch_save for some ancient GL drivers
    - several fixes for LLVM/MinGW/MSVC
    - fix bug where pl_pass_run incorrectly invalidated/accessed
      `params->target` even for compute shaders
    - add windows compatibility to several demo programs
    - fix the pl_fmt <-> DRM fourcc format mapping table
    
  • v3.120.3
    8a719c08 · meson: bump fix version ·
    v3.120.3
    
    This minor release fixes a number of regressions surrounding memory
    imports and DRM modifiers, specifically aimed at issues that arose with
    mpv's --hwdec=vaapi.
    
    Changes:
    - `pl_fmt.modifiers` now always includes DRM_FORMAT_MOD_INVALID on
       OpenGL, which instructs the implementation to not specify modifiers
    - passing a DRM modifier not in the list of supported modifiers is now
      considered a hard error, to rule out non-working hwaccel formats
    
    Fixes:
    - fix a crash when using sampling shaders on textures with unknown formats
    - fix improperly specified SDL header imports in the demos
    - fix an issue where the vulkan texture handle capabilities were testing
      for presence of the wrong extension
    - fix an issue where non-enabled DRM modifier structs were accidentally
      linked into the pNext chain, causing issues with some drivers
    
  • v3.120.2
    8f81e2eb · meson: bump fix version ·
    v3.120.2
    
    This minor release fixes a number of additional bugs related to the
    thread queue, included demos, included helpers, and build system.
    
    Changes:
    - replace the `shaderc` library checks by pkg-config checks
    - `pl_dispatch` no longer grows infinitely, but prunes stale cache
      entries after a certain threshold
    - improve logging of GPU capabilities (including format capabilities)
    
    Fixes and performance improvements:
    - fix a typo on an error message
    - fix a use-after-free edge case in `plplay`
    - filter out Infinity, NaN and other values from fps/vps estimates
    - add several warnings for suspected frame queue API misuses
    - fix a crash when combining pl_render_image_mix with cropped frames
    - fix a crash on AV_PIX_FMT_NONE in the libav helpers
    - fix the loading of overlays in the `sdlimage` demo
    - fix a number of potential overflows on 32-bit platforms
    - omit redundant identity matrices in pl_shader_decode_color
    - fix crash in frame queue with certain out-of-order PTS sequences
    - add missing link to vulkan dependency in the `video-filtering` demo
    - correctly shift overlays when drawing to subsampled YCbCr planes
    - add missing check for PL_GPU_CAP_CALLBACKS in `utils/{libav,dav1d}.h`
    - improve handling of asynchronous texture uploads in `utils/libav.h`
    
  • v3.120.1
    ec69102e · meson: bump fix version ·
    v3.120.1
    
    This hotfix release fixes a number of minor issues with the v3.120.0
    release, and also modularizes the included demo programs to cut down on
    the number of compiled binaries.
    
    Changes:
    - hexadecimal strings in custom shaders may now include whitespace
    - added 16-bit half float formats to the dummy pl_gpu
    - significantly reduced verbosity of the included demo programs
    - merged all of the demo program variants into a single binary that
      picks the best windowing system / graphical API at runtime
    - install `plplay` when demos are enabled
    
    Fixes and performance improvements:
    - fixed an integer overflow in a texture bounds check
    - fixed a false positive error in the test framework on 32-bit platforms
    - fixed some minor issues with various outdated comments
    - fixed a potential use-after-free in the `plplay` demo program when
      playing files containing embedded ICC profiles
    
  • v3.120.0
    v3.120.0
    
    This is a feature release, introducing frame mixing, DRM format
    modifiers, and support for custom LUTs -, while also greatly expanding
    the available demo programs, in particular the `plplay` video player.
    
    The main highlight is the new `pl_queue` abstraction living in
    <libplacebo/utils/frame_queue.h>. This greatly simplifies the core of a
    libplacebo-based video renderer by translating a stream of input frames
    into an array of GPU-mapped textures suitable for frame mixing, given a
    corresponding vsync timestamp. New frames can be delivered to this API
    using a push or pull model, and they are lazily uploaded on an as-needed
    basis as well as internally garbage collected when no longer needed.
    This abstraction also contains all needed machinery for estimating
    source/display framerates by comparing and averaging timestamps, freeing
    users from the burden of having to accurately determine this information
    a priori.
    
    Also worth mentioning is the addition of support for custom LUTs,
    currently only in Adobe's .cube format. They can be applied flexibly at
    a number of locations in the video processing pipeline, including as a
    replacement for YUV<->RGB conversion or tone/gamut mapping, and fed with
    either normalized linear light or native-gamma values.
    
    Among the included demo programs, the `plplay` example video player has
    been greatly expanded - adding support for a settings GUI (based on
    nuklear), frame timing and mixing, custom shaders, and more. This
    example video player now serves as a convenient platform to demonstrate
    all of libplacebo's advanced rendering features.
    
    Finally, all of libplacebo now contains only code written entirely from
    scratch (rather than deriving from mpv), opening up the possibility to
    explore different licenses besides the current LGPLv2.1+. In particular,
    permissive (MIT/BSD-style) licenses are being considered.
    
    Additions:
    - add asynchronous GPU callbacks, specifically to `pl_tex_transfer`,
      allowing for non-blocking host memory transfer operations
    - add `pl_shared_mem.stride_w/h` to control dmabuf pitch
    - add `pl_render_image_mix` to blend multiple frames into a single
      output image, given relative timestamp information
    - add the `pl_filter_mitchell_clamp` filter preset
    - add `pl_render_params.preserve_mixing_cache` to speed up redraws after
      renderer size changes when frame mixing is active
    - add <libplacebo/utils/dav1d.h> to help with Dav1dPicture mapping
    - implement `PL_HANDLE_HOST_PTR` for the OpenGL backend
    - implement drm format modifiers for vulkan
    - add a new field `pl_fmt.modifiers` for DRM format modifier negotiation
    - add new header <libplacebo/shaders/lut.h> to load custom LUTs
      (currently only supporting the .cube format)
    - add `index_data/buf` to `pl_pass_run_params`, adding support for
      indexed vertex data when dispatching shader passes
    - add `pl_dispatch_vertex` to allow dispatching fragment shaders using
      a list of custom vertices with custom vertex attributes
    - add `pl_frame_recreate_from_avframe` and `pl_download_avframe` to help
      downloading GPU textures back into AVFrame form
    - add a new header <libplacebo/utils/frame_queue.h> to assist in taking
      a stream of (Frame, PTS) pairs as well as a list of VSync times and
      turning them into a stream of `pl_frame_mix` structs
    - add `pl_white_from_temp` and `pl_color_adjustment.temperature` to
      apply white point adjustments between correlated color temperatures (K)
    - add `pl_filter_preset.description` containing a longer, human-readable
      name for a given filter preset
    
    Changes:
    - `pl_3dlut_params` has been renamed `pl_icc_params`
    - `pl_render_params.force_3dlut` has been renamed `force_icc_lut`
    - `pl_3dlut_update/apply` have been renamed to `pl_icc_update/apply` and
      moved to a (conditionally installed) new header <libplacebo/shaders/icc.h>
    - `pl_upload_plane` no longer initializes `out_plane->shift_x/y` to 0,
      instead leaving them unmodified (to avoid clobbering existing shift data)
    - `pl_filter_box` has been renamed to `pl_filter_nearest`
    - `pl_filter_triangle` has been renamed to `pl_filter_bilinear`
    - `pl_render_params.frame_mixer = NULL` now disables frame mixing - to
      get back the old behaviour, set this to `&pl_oversample_frame_mixer`.
    - `pl_color_map_params.gamut_warning` now highlights out-of-gamut colors
      in bright pink, rather than the old (ill-defined) inversion behaviour
    - `pl_named_filter_config` has been renamed to `pl_filter_preset`
    - `pl_find_named_filter` has been renamed to `pl_find_filter_preset`
    - ditto for `pl_named_filter_function` and `pl_filter_function_preset`
    
    Fixes and performance improvements:
    - fix buffer overflow in custom shader STORAGE blocks
    - fix include path for glslang >= 11.0.0
    - actually enable shader subgroup operations for HDR peak detection
    - fix locale dependence of shader parsing primitives
    - fix AVCOL_SPC_SMPTE170M mapping
    - fix wrong color space selection in `pl_vulkan_create_swapchain`
    - work-around low UBO size limits on some platforms
    - fix compilation issues on C++ due to the use of reserved identifiers
    - fix `pl_get_detected_peak` on platforms without host-visible SSBOs
    - fix edge case in vulkan texture handle capabilities check
    - fix suboptimal mutex destruction code
    - skip peak detection when outputting to HDR displays
    - fix edge cases in shader LUT type selection logic
    - avoid redundant scaling passes when scaling anamorphic content
    - merge similar planes before dispatching heavy shaders (e.g.
      debanding, hooks)
    - avoid scaling passes for certain small fractional scaling steps
    - entirely avoid processing unneeded components when dispatching scalers
    - avoid using more components than necessary for intermediate FBOs
    - fix out-of-bounds read for small non-cropped emulated textures
    - avoid thrashing the shader cache when reinitializing OpenGL FBOs
    - fix incorrect include in <libplacebo/opengl.h>
    - fix vk.xml priority issue on windows
    - fix undefined behaviour / GPU hangs in HDR peak detection shader
    - fix incorrect forwarding of DRM modifiers to the OpenGL backend
    - fix crash on AV_PIX_FMT_FLAG_BAYER
    - fix various compilation issues on certain platforms
    - fix obscure edge-case in floating point printing routine
    - `pl_render_params.force_icc_lut` now excludes no-op cases
    - fix handling of custom shader COMPUTE blocks
    - correctly apply hue and saturation controls for non-YCbCr color spaces
    
  • v3.104.0
    v3.104.0
    
    This is a major release, introducing many new features and
    modifications. Most importantly, libplacebo now interoperates well with
    FFmpeg's libav* abstractions. This is primarily exposed via a new set of
    helpers, <libplacebo/utils/libav.h>, implemented as a single header
    library. In addition to this, a number of other supporting changes have
    been made to the API, most notably the unification of `pl_image` and
    `pl_render_target` into a single `pl_frame` concept, similar in spirit
    to AVFrame. As such, libplacebo now supports **rendering to planar
    targets**, including subsampled YCbCr.
    
    Besides the libav* compatibility changes, this release also brings with
    it a new feature for custom shaders: buffer blocks, and persistent
    storage. This can be used by third parties to implement stateful shaders
    (e.g. motion interpolation or temporal deinterlacing), or be leveraged
    to speed up some shaders by combining multiple passes into one.
    
    Finally, various import/export procedures have been expanded, including
    the ability to import host pointers and real-world DMABUFs.
    
    Additions:
    - add `pl_memory_qualifiers`, plus a corresponding `pl_shader_desc.memory`,
      to allow attaching GLSL memory qualifiers (coherent, volatile etc.) to
      shader descriptors
    - add functions `pl_dispatch_save` and `pl_dispatch_load` to allow
      saving/restoring the contents of an entire `pl_dispatch`'s cache
    - add functions `pl_renderer_save` and `pl_renderer_load` to allow
      saving/restoring the contents of an entire `pl_renderer`'s cache
    - add `pl_vulkan_swapchain_params.prefer_hdr`, which will cause the
      surface format selection logic to try HDR output formats first
    - add `pl_buf_copy` to copy from one buffer to another
    - add `pl_get_detected_peak`, to read back the result of peak detection
    - add `pl_primaries_superset` to test if one set of primaries is fully
      enclosed by another
    - add `pl_color_map_params.gamut_clipping`, which will colorimetrically
      clip any out-of-gamut colors by desaturating them towards neutral gray
      until they're in-gamut, rather than clipping per channel as before
    - add `PL_GPU_CAP_SUBGROUPS` and `pl_gpu_limits.subgroup_size`, to
      expose GLSL subgroup functionality via the `pl_gpu` interface
    - add `pl_gpu_is_failed`, to query at a high level whether the `pl_gpu`
      is in some internal failure state. GPUs in this state should be
      recreated, using the appropriate mechanism
    - add `pl_shader_custom`, to allow injecting arbitrary custom GLSL code
      into a `pl_shader`.
    - add `pl_buf_params.import_handle` to allow importing buffers
    - add `PL_HANDLE_HOST_POTR`, to allow importing arbitrary host pointers
    - add `pl_pass_run_params.vertex_buf`, to allow drawing vertex data
      directly from a `pl_buf`, guarded by `pl_gpu_limits.max_vbo_size`
    - add `_COUNT` members to all public enums, for consistency
    - add `pl_shared_mem.drm_format_mod`, to allow communicating DRM format
      modifiers when importing/exporting textures
    - add support for importing DMABUFs via EGL, via the new fields
      `pl_opengl_params.egl_display/context`
    - add `pl_fmt.fourcc` to facilitate mapping between `pl_fmt` and DRM
    - add the missing `pl_var_*` helpers, for consistency
    - add `pl_plane_data_align` to help with aligning `pl_plane_data`
      structs to byte boundaries
    - add support for STORAGE textures in user shaders, which can be used to
      persist data across separate invocations of the shader
    - add support for BUFFER blocks in user shaders, which can be used to
      create UBOs or SSBOs for use inside shaders, the latter of which can
      also persist across frames and be used to store persistent state
    - add PL_COLOR_PRIM_EBU_3213 and PL_COLOR_PRIM_FILM_C
    - add a new header <libplacebo/utils/libav.h>, containing a variety of
      helper functions for interoperating between libav* and libplacebo
    - add `demos/plplay.c` to serve as a demonstration of how to make a
      trivial playback loop with libavcodec and libplacebo
    - add `pl_sample_src.component_mask` to allow sampling an arbitrary
      subset of the available components from a plane
    - add `pl_frame_is_cropped` and `pl_frame_clear` to assist in properly
      clearing frames before rendering to them
    - add `pl_tex_poll` to assist in interoperating with some external APIs
    - add `pl_render_params.blend_params` to allow blending the final output
    
    Changes:
    - remove `pl_image.signature` and `pl_render_params.skip_redraw_caching`
    - change vulkan surface format selection to prioritize formats by
      'score', preferring higher depth integer formats
    - `pl_fmt` may now have PL_FMT_CAP_STORABLE even when `glsl_format` is
      NULL, in which case formatless image storage must be used
    - `pl_buf_read` no longer requires `buf_offset` be a multiple of 4
    - `pl_buf_*` commands are now synchronized internally:
    - `pl_buf_write` and `pl_buf_read` now block while the buffer is in use
      Note: for this reason, `pl_buf_write` should not be used in loops
    - `pl_tex_upload/download` may now be called on in-use buffers
    - allow `pl_dispatch_compute` on shaders with outputs, including the
      ability to automatically determine the number of work groups based on
      the shader output resolution
    - remove `pl_buf_params.type`, and the concept of buffer types in
      general. `pl_buf` is now a generic catch-all for any type of buffer,
      with individual capabilities in `pl_buf_params` determinig what type
      of shader operations it can be used for
    - relax the alignment requirements on `pl_tex_transfer_params`
    - change `pl_opengl_wrap_params` to allow directly importing
      framebuffers in addition to textures
    - rename `pl_color_levels` members for clarity
    - make `pl_opengl` ignore software rasterizers by default, unless the
      new field `pl_opengl_params.allow_software` is set
    - add `pl_av1_grain_params.luma_comp` to allow drawing the luma
      component from a channel with nonzero index
    - `pl_renderer` now supports rendering to planar targets, including
      subsampled targets
    - `pl_image` and `pl_render_target` have been removed and unified into a
      single `pl_frame` concept
    - remove `pl_tex_params.sample_mode/address_mode` and move them to
      `pl_desc_binding` instead, to decouple them from texture creation
    - refactor the signature of `pl_tex_blit`
    
    Fixes and performance improvements:
    - fix an oversight where `pl_buf_destroy` delayed some buffer
      destructions unnecessarily
    - fix a limitation where `pl_tex_destroy` sometimes delayed destroying
      textures unnecessarily
    - improve the performance of `pl_dispatch`'s code for assembling UBOs
    - improve the performance of `pl_shader_av1_grain` by switching from
      SSBOs to texture LUTs, also improving compatibility with older GL
    - improve the performance of `pl_shader_detect_peak` on GPUs with access
      to subgroups operations
    - fix an issue where reinitializing shader state objects with different
      settings sometimes resulted in undefined behaviour
    - fix some GLSL backwards compatibility issues
    - slightly cut down on unnecessary image layout transitions
    - add some miscellaneous debug print-outs, and improve the legibility of
      some existing log messages
    - fix an issue where freeing buffer variables from shader descriptors
      could result in use-after-free
    - add support for vulkan memory imports requiring dedication allocations
    - slightly improve, and fix, the vulkan memory placement logic
    - significantly improve the performance of `pl_tex_download` by
      importing the target host pointer directly
    - improve the performance of small LUTs, especially for the non-compute
      polar fallback path
    - prevent `pl_renderer` from unneccessarily applying a 3DLUT when both
      the input and output frames have the same ICC profile
    - fix the behaviour of partially specified `pl_bit_encoding` structs
    - fix the component ordering on some odd packed vulkan formats
    - fix an issue where `pl_plane_data_from_mask` broke for high bit depths
    - make `pl_renderer` consult the dither bit depth from the texture
      precision, if absent from `pl_bit_encoding`
    - fix the behaviour of `pl_renderer` when sampling from textures with
      swapped component orders
    - fix the implementation of PL_COLOR_SYSTEM_BT_2100_HLG
    - fix some issues relating to missing includes
    - enforce legality of image usage parameters on `pl_vulkan_wrap`
    - fix an undesired shader double-compilation when using orthogonal
      scalers with subsampled chroma planes
    - fix an issue where application of a 3DLUT cleared the alpha channel
    - add a missing extension to `pl_vulkan_recommended_extensions`
    - fix the plane alignment code for oddly sized subsampled chroma
    - fix the poor precision of `pl_shader_dither` for high bit depths
    - fix several possible overflows in the BT.2390 shader
    - fix a bug where using a polar sampler to draw a scaled overlay onto a
      non-storable target neglected to disable compute shaders
    - fix a bug where the renderer could sometimes alias when downscaling,
      in particular if both the upsampler and downsampler are set to bicubic
    - improve performance of scalers by avoiding bilinear filtering
    - reduce verbosity of memory allocations
    - fix missing PL_FMT_CAP_BLENDABLE on opengl fbos
    - significantly improve precision of float literals in shaders
    - add better error checking to gl_pass_create