Skip to content

This release marks the first major release of libplacebo, in tune with
the release of VLC 4, which will be the first major project using it.
Apart from API stability going forwards, this release brings with it a
new AV1 film grain shader, better interoperability between libplacebo
and external APIs like CUDA (via shared buffers and shared textures),
and ICtCp support.

While not strictly part of libplacebo, one of the highlights since the
previous release includes the existence of a new example file
`demos/video-filtering.c` which illustrates how one would use libplacebo
to do GPU-based image filtering in something like FFmpeg or mpv.

- Add a new function `pl_gpu_finish` which blocks until all oustanding
  rendering on this `pl_gpu` is finished.
- Add new functions `pl_tex_recreate` and `pl_buf_recreate`, which work
  like `pl_tex/buf_create` but take a pointer to an existing tex/buf
  that will get destroyed + recreated only when necessary.
- Add a new function `pl_shader_is_failed` which will return true if a
  given shader is in a "failed" state. Shaders will be marked as failed
  on any internal/usage error, rather than them being silently ignored.
- Add a new enum `pl_channel` to clarify and encode friendly names for
  the often-referenced "canonical channel order".
- Add a new header `libplacebo/shaders/av1.h` which currently contains
  a function `pl_shader_av1_grain` for applying AV1 film grain on the
- Add a new concept of an "exportable" object (buffers and textures).
  Exportable objects can be exported using a handle (currently only
  supporting fds on POSIX-style platforms) and imported into other
  foreign APIs such as CUDA. The new functions `pl_buf_export` and
  `pl_tex_export` must be used to correctly synchronize access to the
  object. This also adds new fields `uuid` and `handle_caps` to
- Supporting the previous feature, add a new field `memory_type` to
  `pl_buf_params` which can be used to influence what type of memory
  to allocate a buffer from. Currently only works for texture transfer
  buffers, since allocating uniform/storage buffers from non-VRAM makes
  little sense.
- Add a new synchronization primitive wrapper, `pl_sync`, which wraps a
  semaphore pair and must be used to synchronize access to textures with
  external, asynchronous APIs.
- Implement the ITU-R BT.2100 ICtCp color system. Since the libplacebo
  color systems are not strictly tied to any particular transfer
  function, we must explicitly mark which flavor of ICtCp is meant.
- Add a new field `instance_params` which can be used to influence the
  parameters used when `pl_vulkan_create` ends up creating an internal
- Add a new function `pl_vulkan_unwrap` which allows users to unwrap a
  vulkan-baed `pl_tex` to expose the internal VkImage, allowing
  simultaneous use (via `pl_vulkan_hold/release`) similar to wrapped
  external images.
- Add new generic helper functions `pl_std430_layout` and
  `pl_std140_layout` which replace the old `pl_buf_uniform_layout`,
  `pl_buf_storage_layout` and `pl_push_constant_layout`.

- Empty device names ("") can now be passed to `pl_vulkan_create`.
  They will be treated as if NULL was passed.
- The `out_plane` parameter of `pl_upload_plane` is now optional.
- Clarify/Relax the restrictions on `pl_buf` usage and polling. Users
  are technically free to use `pl_buf` for multiple simultaneous
  libplacebo operations. Buffer polling is only needed for accesses by the
- `pl_vulkan_hold` now returns a bool indicating success.
- `pl_buffer_var` has been moved from gpu.h's `pl_desc` to shaders.h's
  `pl_shader_desc`. Describing the individual variables of a descriptor
  binding had zero practical application.
- `pl_buf_uniform_layout`, `pl_buf_storage_layout` and
  `pl_push_constant_layout` are now macros for `pl_std140_layout` and
  `pl_std430_layout` (respectively). This changed the signature to drop
  the `pl_gpu` parameter.

Fixes and performance improvements:
- Meson 0.47 is correctly marked as the minimum required version.
- Fix compilation on clang.
- Fix compilation on glslang git master.
- Fix compilation with older shaderc versions.
- Fix compilation on some platforms.
- Fix std140/std430 packing errors for vec3.
- Skip unnecessary flush in pl_buf_poll noop cases.
- Fix variable collision in sh_prng.
- Don't leak glslang internal symbols on supported platforms.
- Fix an issue where `pl_pass_run` was stricter than intended about
  compatibility with between `target` and `target_dummy`.
- Fix an issue where `pl_dispatch` could sometimes try dispatching
  shaders with an incompatible target.
- Fix an error in the heuristic for choosing the optimal image layout
  for vulkan render passes.
- Improved debugging messages in several places.
- Slightly speed up lookups from texture LUTs.
- Fix the addressing of shader LUTs in some hypothetical cases.
- Correctly flush the contents of host-readable buffers after
  modifications made by the GPU.
- Fix synchronization on `pl_buf_write` with non-mapped buffers.
- Fix undefined behavior when using push descriptors.
- Fix build issues on Android arm32.
- Slightly speed up some texture recreate operations by invalidating
  re-used textures.
- Fix an issue when trying to update large (>64k) VRAM-resident buffers.
- Fix two address calculation bugs in `pl_tex_blit`.
- Fix an over-read bug when the size of the vertex data changed for
  otherwise identical passes.
- Fix a misalignment that could theoretically happen with some
  combinations of (odd) texel sizes and device alignment requirements.
- Fix UB when creating "useless" images (without any usage flags).
- Fix a vulkan device memory leak when destroying large textures.
- Speed up compilation by skipping glslang when shaderc is available.