v1.7.0-rc2 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. Additions: - 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 GPU. - 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 `pl_gpu`. - 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 instance. - 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`. Changes: - 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 host. - `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.