-
v4.192.0f95f7aa2 · ·
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-rc10a399889 · ·
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.0b98c9972 · ·
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-rc12f30ced6 · ·
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.38a719c08 · ·
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.28f81e2eb · ·
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.1ec69102e · ·
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.04abe5f14 · ·
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.077c901cd · ·
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
-
v3.104.0-rc183fc3aa2 · ·
v3.104.0-rc1 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
-
v2.72.13fb5427a · ·
v2.72.1 This release backports a number of bug fixes from master affecting the v2.72.0 release, most notably extending the range of supported glslang versions, as well as fixing the 3DLUT/ICC generation code. Bug fixes: - compatibility with glslang >= 8.13.3743 - compatibility with new glslang semantic versioning scheme - fix broken shaders on some versions of GLES by defaulting to 32-bit precision for floating point math - fix the vulkan API version passed to shaderc - fix the extension check for glInvalidateTexImage - fix pl_tex_create on older GLES versions - fix OpenGL logging thread safety - fix undefined memcmp() in pl_shader_av1_grain - fix pl_render_target.repr being ignored by pl_render_image - fix 3DLUT generation code (generated corrupt LUTs in all cases) - fix symbol visibility on some versions of GCC - fix potential overflow in BT.2390 shader - properly restrict pl_shader_sample_polar to GLSL >= 130 - fix vulkan function loading of promoted core functions Other changes: - tiny performance gain in 3DLUT generation - pl_opengl_create now logs GL_EXTENSIONS - log some additional VkResult enum members - improve several vulkan log messages by using friendly names of enums - add a copy of the config.h variables to the libplacebo.pc file
-
v2.72.0f3a7f5d9 · ·
v2.72.0 This is a major release with several key additions, most notably being the support for custom, mpv-style "user shaders" (.hook), giving us access to a large variety of pre-existing user shaders such as RAVU, FSRCNNX, Anime4K, SSimSuperRes, KrigBilateral, NNEDI3, and more. In addition to this, major additions include a completely refactored and fixed AV1 grain generation shader, support for Vulkan versions higher than 1.0, support for GPU-based timers, and improved interop APIs for both Vulkan and OpenGL, and new and improved aspect ratio handling. Finally, this release also brings with it a major change to the way HDR and SDR content are mapped between each other, including a new tone-mapping function based on the industry-standard ITU-R BT.2390 EETF. Additions: - add `pl_swapchain_hdr_metadata`, to set HDR metadata on supported swapchains (currently only vulkan with `VK_EXT_hdr_metadata`) - add support for vulkan versions higher than 1.0, communicated via the new fields `api_version` and `max_api_version` - add support for GPU-assisted validation and best practices layers, via the new field `pl_vk_inst_params.debug_extra` - add helper functions for working with `pl_rect`s, including new aspect ratio handling helpers (`pl_rect2df_aspect_*`) - add field `pl_vulkan_params.device_uuid` to allow choosing the vulkan device by its UUID - add function `pl_vulkan_hold_raw`, to hold images without actually transitioning its layout and access mode - add function `pl_vulkan_import`, to allow directly re-using an existing VkDevice rather than creating a new one; this requires communicating metadata about how the device was created - add field `pl_vulkan_params.features` to allow loading optional extra device features at device creation time - add support for mpv-style custom user shaders (.hook), using the set of functions in `<libplacebo/shaders/custom.h>` - add `pl_render_high_quality_params`, enabling debanding and EWA scaling - add `pl_timer` GPU resource type and associated API functions, allowing the GPU execution time of shaders and texture transfer operations to be measured directly - add `PL_SHADER_SIG_SAMPLER`, allowing generated sampling shaders to directly accept the sampler to use as function parameters - add `pl_image_set_chroma_location` to automatically apply the correct chroma location to any subsampled planes - add `PL_TONE_MAPPING_BT_2390`, a tone mapping function based on the EETF from ITU-R Report BT.2390 (and make it the default) - add `pl_peak_detect_params.overshoot_margin` to help combat clipping on certain types of rapid scene fade-ins - add `pl_sampler_type` to allow encoding non-standard sampler types such as sampler2DRect, and also generalize samplers to allow e.g. usampler2D or isampler3D - add `pl_opengl_wrap` and `pl_opengl_unwrap`, to allow directly mapping between OpenGL textures and the `pl_tex` abstraction Changes: - deprecate `pl_image.width/height`, which are now inferred automatically from the actual planes - `pl_vulkan_wrap` now takes a `pl_vulkan_wrap_params` struct instead of directly accepting its parameters, including new fields `sample_mode` and `address_mode` to configure the created sampler - change `pl_dispatch_compute` to allow optionally passing in a simulated framebuffer width/height, which will be used to translate vertex attributes (if any) - undefine disabled `config.h` features, instead of defining them as 0 - remove debanding from `pl_render_default_params` - refactor HDR<->SDR mapping; PL_COLOR_REF_WHITE has been removed and replaced by PL_COLOR_SDR_WHITE (203 cd/m^2) and PL_COLOR_SDR_WHITE_HLG (75% HLG), respectively - completely refactor pl_shader_av1_grain`, which now samples directly from the passed texture rather than requiring the color be pre-sampled - `pl_render_image` now infers the image primaries based on resolution, rather than always hard-coding `PL_COLOR_SPACE_UNKNOWN` as BT.709 - change `pl_render_target.dst_rect` from `pl_rect2d` to `pl_rect2df`, allowing more accurate aspect ratio handling, and correctly compensate for subpixel scaling ratios - require `python3-mako` as a dependency of the `vulkan` feature - `pl_chroma_location_offset` now treats `PL_CHROMA_UNKNOWN` as `PL_CHROMA_LEFT`, the de-facto standard chroma location - the default value of `pl_color_map_params.tone_mapping_algo` is now `PL_TONE_MAPPING_BT_2390` Fixes and performance improvements: - fix shader generation when the GLSL version is explicitly overridden - properly mark some shader failures (`pl_shader_is_failed`) - fix texture invalidation on OpenGL - correctly respect `pl_swapchain_frame.flipped` in `pl_render_target_from_swapchain` - correctly validate descriptor uniqueness in `pl_pass_create` - skip redundant matrix multiplication in `pl_shader_encode_color` wherever possible - work around driver bugs w.r.t out-of-order buffer offsets by sorting all buffer variables by offset - fix edge cases in vulkan swapchain usage flag checks - fix excessive CPU usage in `pl_tex_download` - reduce the number of unnecessary GPU flushes caused by `pl_buf_poll` - fix issue where blending did not work on some drivers (e.g. nvidia) - make the framebuffer discard check more aggressive - fix computation of anti-aliased resizable orthogonal filters, e.g. when downscaling using `pl_filter_lanczos` - fix external image memory barriers for exclusive mode images - fix failure path of `pl_swapchain_submit_frame` - fix various GLSL compatibility issues with av1 grain generation - reduce maximum vulkan memory allocation slab size to conform to AMD recommendations - fix build error when lcms is not available - fix double-application of texture scale for e.g. 10-bit content when using separable scalers - fix a multitude of bugs affecting av1 grain generation, especially for chroma planes - fix segfault on vulkan device oom - fix invalid shader generation on some platforms - fix a multitude of bugs, edge cases and subtle off-by-ones related to chroma scaling and plane alignment - add fallback code for edge case w.r.t chroma scaling and gpu resource exhaustion - correctly load VK_KHR_swapchain in all circumstances that require accessing its functions - minimize fbo usage inside `pl_renderer`, by re-using unused fbos - tweak the work group size for polar scaling to perform better on modern GPUs (tested on RDNA) - transparently upgrade fragment shaders to compute shaders on environments with async compute - pick a more reasonable size for the dummy gpu's `max_group_threads` - forbid 10-bit linear transfer functions from vulkan swapchains - fix segfault when re-executing previously failed shaders - fix swapchain creation errors on GLES 2 - explicitly mark all shader resources as non-aliased - correctly specify shader storage buffers as coherent for shaders that require them - fix various memory barrier synchronization issues for opengl
-
v2.72.0-rc2dea56e43 · ·
v2.72.0-rc2 This is a major release with several key additions, most notably being the support for custom, mpv-style "user shaders" (.hook), giving us access to a large variety of pre-existing user shaders such as RAVU, FSRCNNX, Anime4K, SSimSuperRes, KrigBilateral, NNEDI3, and more. In addition to this, major additions include a completely refactored and fixed AV1 grain generation shader, support for Vulkan versions higher than 1.0, support for GPU-based timers, and improved interop APIs for both Vulkan and OpenGL, and new and improved aspect ratio handling. Finally, this release also brings with it a major change to the way HDR and SDR content are mapped between each other, including a new tone-mapping function based on the industry-standard ITU-R BT.2390 EETF. Additions: - add `pl_swapchain_hdr_metadata`, to set HDR metadata on supported swapchains (currently only vulkan with `VK_EXT_hdr_metadata`) - add support for vulkan versions higher than 1.0, communicated via the new fields `api_version` and `max_api_version` - add support for GPU-assisted validation and best practices layers, via the new field `pl_vk_inst_params.debug_extra` - add helper functions for working with `pl_rect`s, including new aspect ratio handling helpers (`pl_rect2df_aspect_*`) - add field `pl_vulkan_params.device_uuid` to allow choosing the vulkan device by its UUID - add function `pl_vulkan_hold_raw`, to hold images without actually transitioning its layout and access mode - add function `pl_vulkan_import`, to allow directly re-using an existing VkDevice rather than creating a new one; this requires communicating metadata about how the device was created - add field `pl_vulkan_params.features` to allow loading optional extra device features at device creation time - add support for mpv-style custom user shaders (.hook), using the set of functions in `<libplacebo/shaders/custom.h>` - add `pl_render_high_quality_params`, enabling debanding and EWA scaling - add `pl_timer` GPU resource type and associated API functions, allowing the GPU execution time of shaders and texture transfer operations to be measured directly - add `PL_SHADER_SIG_SAMPLER`, allowing generated sampling shaders to directly accept the sampler to use as function parameters - add `pl_image_set_chroma_location` to automatically apply the correct chroma location to any subsampled planes - add `PL_TONE_MAPPING_BT_2390`, a tone mapping function based on the EETF from ITU-R Report BT.2390 (and make it the default) - add `pl_peak_detect_params.overshoot_margin` to help combat clipping on certain types of rapid scene fade-ins - add `pl_sampler_type` to allow encoding non-standard sampler types such as sampler2DRect, and also generalize samplers to allow e.g. usampler2D or isampler3D - add `pl_opengl_wrap` and `pl_opengl_unwrap`, to allow directly mapping between OpenGL textures and the `pl_tex` abstraction Changes: - deprecate `pl_image.width/height`, which are now inferred automatically from the actual planes - `pl_vulkan_wrap` now takes a `pl_vulkan_wrap_params` struct instead of directly accepting its parameters, including new fields `sample_mode` and `address_mode` to configure the created sampler - change `pl_dispatch_compute` to allow optionally passing in a simulated framebuffer width/height, which will be used to translate vertex attributes (if any) - undefine disabled `config.h` features, instead of defining them as 0 - remove debanding from `pl_render_default_params` - refactor HDR<->SDR mapping; PL_COLOR_REF_WHITE has been removed and replaced by PL_COLOR_SDR_WHITE (203 cd/m^2) and PL_COLOR_SDR_WHITE_HLG (75% HLG), respectively - completely refactor pl_shader_av1_grain`, which now samples directly from the passed texture rather than requiring the color be pre-sampled - `pl_render_image` now infers the image primaries based on resolution, rather than always hard-coding `PL_COLOR_SPACE_UNKNOWN` as BT.709 - change `pl_render_target.dst_rect` from `pl_rect2d` to `pl_rect2df`, allowing more accurate aspect ratio handling, and correctly compensate for subpixel scaling ratios - require `python3-mako` as a dependency of the `vulkan` feature - `pl_chroma_location_offset` now treats `PL_CHROMA_UNKNOWN` as `PL_CHROMA_LEFT`, the de-facto standard chroma location - the default value of `pl_color_map_params.tone_mapping_algo` is now `PL_TONE_MAPPING_BT_2390` Fixes and performance improvements: - fix shader generation when the GLSL version is explicitly overridden - properly mark some shader failures (`pl_shader_is_failed`) - fix texture invalidation on OpenGL - correctly respect `pl_swapchain_frame.flipped` in `pl_render_target_from_swapchain` - correctly validate descriptor uniqueness in `pl_pass_create` - skip redundant matrix multiplication in `pl_shader_encode_color` wherever possible - work around driver bugs w.r.t out-of-order buffer offsets by sorting all buffer variables by offset - fix edge cases in vulkan swapchain usage flag checks - fix excessive CPU usage in `pl_tex_download` - reduce the number of unnecessary GPU flushes caused by `pl_buf_poll` - fix issue where blending did not work on some drivers (e.g. nvidia) - make the framebuffer discard check more aggressive - fix computation of anti-aliased resizable orthogonal filters, e.g. when downscaling using `pl_filter_lanczos` - fix external image memory barriers for exclusive mode images - fix failure path of `pl_swapchain_submit_frame` - fix various GLSL compatibility issues with av1 grain generation - reduce maximum vulkan memory allocation slab size to conform to AMD recommendations - fix build error when lcms is not available - fix double-application of texture scale for e.g. 10-bit content when using separable scalers - fix a multitude of bugs affecting av1 grain generation, especially for chroma planes - fix segfault on vulkan device oom - fix invalid shader generation on some platforms - fix a multitude of bugs, edge cases and subtle off-by-ones related to chroma scaling and plane alignment - add fallback code for edge case w.r.t chroma scaling and gpu resource exhaustion - correctly load VK_KHR_swapchain in all circumstances that require accessing its functions - minimize fbo usage inside `pl_renderer`, by re-using unused fbos - tweak the work group size for polar scaling to perform better on modern GPUs (tested on RDNA) - transparently upgrade fragment shaders to compute shaders on environments with async compute - pick a more reasonable size for the dummy gpu's `max_group_threads` - forbid 10-bit linear transfer functions from vulkan swapchains - fix segfault when re-executing previously failed shaders - fix swapchain creation errors on GLES 2 - explicitly mark all shader resources as non-aliased - correctly specify shader storage buffers as coherent for shaders that require them - fix various memory barrier synchronization issues for opengl
-
v2.72.0-rc1bacc24a0 · ·
v2.72.0-rc1 This is a major release with several key additions, most notably being the support for custom, mpv-style "user shaders" (.hook), giving us access to a large variety of pre-existing user shaders such as RAVU, FSRCNNX, Anime4K, SSimSuperRes, KrigBilateral, NNEDI3, and more. In addition to this, major additions include a completely refactored and fixed AV1 grain generation shader, support for Vulkan versions higher than 1.0, support for GPU-based timers, and improved interop APIs for both Vulkan and OpenGL, and new and improved aspect ratio handling. Finally, this release also brings with it a major change to the way HDR and SDR content are mapped between each other, including a new tone-mapping function based on the industry-standard ITU-R BT.2390 EETF. Additions: - add `pl_swapchain_hdr_metadata`, to set HDR metadata on supported swapchains (currently only vulkan with `VK_EXT_hdr_metadata`) - add support for vulkan versions higher than 1.0, communicated via the new fields `api_version` and `max_api_version` - add support for GPU-assisted validation and best practices layers, via the new field `pl_vk_inst_params.debug_extra` - add helper functions for working with `pl_rect`s, including new aspect ratio handling helpers (`pl_rect2df_aspect_*`) - add field `pl_vulkan_params.device_uuid` to allow choosing the vulkan device by its UUID - add function `pl_vulkan_hold_raw`, to hold images without actually transitioning its layout and access mode - add function `pl_vulkan_import`, to allow directly re-using an existing VkDevice rather than creating a new one; this requires communicating metadata about how the device was created - add field `pl_vulkan_params.features` to allow loading optional extra device features at device creation time - add support for mpv-style custom user shaders (.hook), using the set of functions in `<libplacebo/shaders/custom.h>` - add `pl_render_high_quality_params`, enabling debanding and EWA scaling - add `pl_timer` GPU resource type and associated API functions, allowing the GPU execution time of shaders and texture transfer operations to be measured directly - add `PL_SHADER_SIG_SAMPLER`, allowing generated sampling shaders to directly accept the sampler to use as function parameters - add `pl_image_set_chroma_location` to automatically apply the correct chroma location to any subsampled planes - add `PL_TONE_MAPPING_BT_2390`, a tone mapping function based on the EETF from ITU-R Report BT.2390 (and make it the default) - add `pl_peak_detect_params.overshoot_margin` to help combat clipping on certain types of rapid scene fade-ins - add `pl_sampler_type` to allow encoding non-standard sampler types such as sampler2DRect, and also generalize samplers to allow e.g. usampler2D or isampler3D - add `pl_opengl_wrap` and `pl_opengl_unwrap`, to allow directly mapping between OpenGL textures and the `pl_tex` abstraction Changes: - deprecate `pl_image.width/height`, which are now inferred automatically from the actual planes - `pl_vulkan_wrap` now takes a `pl_vulkan_wrap_params` struct instead of directly accepting its parameters, including new fields `sample_mode` and `address_mode` to configure the created sampler - change `pl_dispatch_compute` to allow optionally passing in a simulated framebuffer width/height, which will be used to translate vertex attributes (if any) - undefine disabled `config.h` features, instead of defining them as 0 - remove debanding from `pl_render_default_params` - refactor HDR<->SDR mapping; PL_COLOR_REF_WHITE has been removed and replaced by PL_COLOR_SDR_WHITE (203 cd/m^2) and PL_COLOR_SDR_WHITE_HLG (75% HLG), respectively - completely refactor pl_shader_av1_grain`, which now samples directly from the passed texture rather than requiring the color be pre-sampled - `pl_render_image` now infers the image primaries based on resolution, rather than always hard-coding `PL_COLOR_SPACE_UNKNOWN` as BT.709 - change `pl_render_target.dst_rect` from `pl_rect2d` to `pl_rect2df`, allowing more accurate aspect ratio handling, and correctly compensate for subpixel scaling ratios - require `python3-mako` as a dependency of the `vulkan` feature - `pl_chroma_location_offset` now treats `PL_CHROMA_UNKNOWN` as `PL_CHROMA_LEFT`, the de-facto standard chroma location - the default value of `pl_color_map_params.tone_mapping_algo` is now `PL_TONE_MAPPING_BT_2390` Fixes and performance improvements: - fix shader generation when the GLSL version is explicitly overridden - properly mark some shader failures (`pl_shader_is_failed`) - fix texture invalidation on OpenGL - correctly respect `pl_swapchain_frame.flipped` in `pl_render_target_from_swapchain` - correctly validate descriptor uniqueness in `pl_pass_create` - skip redundant matrix multiplication in `pl_shader_encode_color` wherever possible - work around driver bugs w.r.t out-of-order buffer offsets by sorting all buffer variables by offset - fix edge cases in vulkan swapchain usage flag checks - fix excessive CPU usage in `pl_tex_download` - reduce the number of unnecessary GPU flushes caused by `pl_buf_poll` - fix issue where blending did not work on some drivers (e.g. nvidia) - make the framebuffer discard check more aggressive - fix computation of anti-aliased resizable orthogonal filters, e.g. when downscaling using `pl_filter_lanczos` - fix external image memory barriers for exclusive mode images - fix failure path of `pl_swapchain_submit_frame` - fix various GLSL compatibility issues with av1 grain generation - reduce maximum vulkan memory allocation slab size to conform to AMD recommendations - fix build error when lcms is not available - fix double-application of texture scale for e.g. 10-bit content when using separable scalers - fix a multitude of bugs affecting av1 grain generation, especially for chroma planes - fix segfault on vulkan device oom - fix invalid shader generation on some platforms - fix a multitude of bugs, edge cases and subtle off-by-ones related to chroma scaling and plane alignment - add fallback code for edge case w.r.t chroma scaling and gpu resource exhaustion - correctly load VK_KHR_swapchain in all circumstances that require accessing its functions - minimize fbo usage inside `pl_renderer`, by re-using unused fbos - tweak the work group size for polar scaling to perform better on modern GPUs (tested on RDNA) - transparently upgrade fragment shaders to compute shaders on environments with async compute - pick a more reasonable size for the dummy gpu's `max_group_threads` - forbid 10-bit linear transfer functions from vulkan swapchains - fix segfault when re-executing previously failed shaders
-
v2.43.151e9b73f · ·
v2.43.1 This release backports a number of bug fixes from master affecting the v2.43.0 release, and also slightly extends the range of backwards compatibility with respect to vulkan-headers versions. (This change is not on master, so this can be seen as a compatibility release) Bug fixes: - fix GLSL version checks when overriding GLSL versions with `pl_shader_params.glsl` - fix minor order-of-operations issue in AV1 grain synthesis - fix glInvalidate* backwards compatibility issue - fix compilation with older vulkan-headers (e.g. ubuntu 18.04) - fix a bug where pl_shader_encode_color sometimes uploaded and applied an identity matrix unnecessarily - work around upstream issues with MSL shader compilation by ensuring all buffer elements are sorted by offset - fix hypothetical edge case with swapchain image usages forbidden by the swapchain image format - fix an issue where blending overlays caused the rest of the image to be discarded Other changes: - log the vulkan surface selection choices - log the overall library version on initialization - add a few more pl_gpu validation checks - significantly reduce the CPU consumpation of blocking texture downloads
-
v2.43.0f51180d0 · ·
v2.43.0 The major highlight of this release is the introduction of a new OpenGL backend, documented in <libplacebo/opengl.h>, which is also the reason for the major version bump. Apart from the addition of OpenGL support, this release brings with it a large number of fixes for backwards compatibility with older versions of GLSL and GLES, allowing libplacebo to be used to generate legal shaders for virtually any GLSL version in existence. Supporting these changes, the test framework has been expanded considerably to allow for automated testing of older OpenGL context versions and older GLSL versions. Additions: - add `pl_gpu.pci`, containing the PCI address of the underlying GPU - add `pl_image.av1_grain`, allowing `pl_renderer` to add AV1 grain - add `pl_opengl` backend (see <libplacebo/opengl.h>) - add `pl_color_levels_guess`, to infer color levels from pl_color_repr - `pl_shader_encode_color` now handles non-linear color systems - add `pl_render_params.force_dither`, to force use of the dither code - add `pl_render_params.disable_fbos`, to forcibly disable FBOs - add `pl_vk_inst_params.layers`, to allow loading extra vulkan layers - add a way to restrict the maximum GLSL version provided by the various `pl_gpu` backends, for testing purposes Changes: - load all vulkan function pointers indirectly, using a user-provided `vkGetInstanceProcAddr` function - vulkan can now be built without linking against libvulkan.so - refactor av1 grain data struct, splitting it up into "grain metadata" and "shader params" - `pl_swapchain_resize` now recreates suboptimal swapchains even if the size does not change - `pl_tex_blit` now requires the new cap `PL_GPU_CAP_BLITTABLE_1D_3D` for 1D/3D textures - `pl_tex_params.host_readable` now requires the new cap `PL_FMT_CAP_HOST_READABLE` on the chosen format - `pl_vk_inst_create` will now automatically load any layers needed for extensions specified by the user Fixes and performance improvements: - make `pl_color_adjustment.gamma` actually do something - fix av1 grain shader for separated planes - fix memory corruption in `pl_vulkan_swapchain_suboptimal` - fix access mask on API writes to read-writable vulkan buffers - fix some instances of undefined behavior in av1 grain synthesis - fix av1 grain scale for PL_COLOR_LEVELS_UNKNOWN - fix use of local #include for config.h in installed headers - fix various incorrect literals for compatibility with older GLSL - fix potential type error in XYZ input handling - fix numerous backwards compatibility issues for older GLSL and GLES versions, across the board - quench some meson warnings, as well as some compiler warnings
-
v1.29.1d3a25695 · ·
v1.29.1 This is a minor bug fix follow-up, to address one major and two minor issues with the v1.29.0 release. Fixes: - fix a segfault in the test framework on platforms without vulkan - fix error message spam when rendering to minimized/hidden windows - hackily fix compilation on certain glslang versions
-
v1.29.00ba467b5 · ·
v1.29.0 The key highlights of this release are the change of `pl_gpu` API semantics to use explicit erroring instead of implicit undefined behavior, and several important bug fixes related to swapchain resizing (in particular, handling of suboptimal swapchains); as well as other minor utility changes, bug fixes and performance improvements. The new `pl_gpu` API allows clients to duplicate less code related to checking parameters and capabilities, as long as they're fine with the resulting error messages they might receive. In particular, libplacebo no longer aborts on invalid parameters - which helped during initial development, but is now suffocating clients more than it's helping. Additions: - add a new field `pl_fmt.internal_size`, which can differ from `texel_size` for emulated formats - add 16f / 64f texture formats with host-emulated 32f representation - expose a `pl_vulkan_choose_device` helper function - add a mechanism for allowing the user to explicitly resize suboptimal swapchains rather than having libplacebo take care of it Changes: - make `pl_gpu` log and error gracefully on `illegal` parameters rather than doing undefined behavior (i.e. aborting) - creating a `host_mapped` buffer now requires PL_GPU_CAP_MAPPED_BUFFERS - drop `priv` fields from public structs Fixes and performance improvements: - make libplacebo slightly less log spammy in general - skip the creation/use of semaphores for single-queue usage - fix several bugs related to swapchain recreation and image acquisition - fix creation of non-renderable but storable vulkan textures - fix several bugs related to emulated texture downloads - fix `pl_fmt` capabilities for some emulated formats - fix stride/alignment of std430 vectors/matrices - use push constants more aggressively, whenever possible - slightly improve accurate of BT.2100 matrices - fix overzealous rotation of vulkan queues - fix dangling validation layer suppression in rare cases - fix possible swapchain deadlock on VK_SUBOPTIMAL_KHR - handle VK_SUBOPTIMAL_KHR more gracefully / efficiently
-
v1.21.0aec4a92b · ·
v1.21.0 This is a minor / house-keeping release, mostly to get some important fixes into distros while also getting support for iGPUs requiring non-coherent memory into a "stable" release. Additions: - `shaders.h` API users can now override the GLSL version - add support for vulkan platforms with non-coherent memory (e.g. iGPUs) Changes: - default GLSL version is now 130 unless otherwise specified - signature of `pl_shader_alloc` now uses a params struct - PL_FIX_VER / PL_VERSION are no longer header constants - the renderer will now automatically adjust deband grain scale for HDR Fixes and performance improvements: - on GLSL < 130, shaders now correctly use `texture2D` etc. - fix a bug where async transfer was never actually used, due to incorrect alignment checks - fixed some issues that could lead to symbol conflicts - don't require large vertex buffers be host-visible (usually impossible) - correctly detect swapchain image feature flags - turned a few 1ms busy loops into infinite waits - fix compilation on some platforms that require SPIRV-Tools - fix vkCreateEvent error spam on MoltenVK - bump queued command limit from 64 to 1024