Skip to content

Vulkan common filter (RGBA to YCbCr) update and adding drm format modifier and import/export support #198

Merged
zlatinski merged 5 commits intomainfrom
vulkan-common-filter-and-drm
Feb 10, 2026
Merged

Vulkan common filter (RGBA to YCbCr) update and adding drm format modifier and import/export support #198
zlatinski merged 5 commits intomainfrom
vulkan-common-filter-and-drm

Conversation

@zlatinski
Copy link
Contributor

No description provided.

Signed-off-by: Tony Zlatinski <tzlatinski@nvidia.com>
…uite

Major features:
- RGBA to YCbCr color conversion filter with 4:4:4, 4:2:2, 4:2:0 support
- BT.601, BT.709, BT.2020 color primaries via YcbcrBtMatrix
- Y-subsampling output for Adaptive Quantization (AQ) algorithms
- Transfer operations (COPY_IMAGE_TO_BUFFER, COPY_BUFFER_TO_IMAGE)
- VkImageResourceView YCbCr sampler conversion support

Test infrastructure (common/libs/tests/):
- FilterTestApp using VulkanDeviceContext pattern from encoder sample
- 38+ test cases: format conversions, color primaries, ranges, resolutions
- CPU-side ColorConversion module for verification
- Test scripts: run_all_tests.sh, test_filter.sh

Documentation (docs/):
- VulkanFilterYuvCompute_FlexibleIO_Design.md - I/O slot architecture
- VulkanFilterYuvCompute_Architecture_Requirements.md - Full API reference
- VulkanFilterYuvCompute_Architecture_Review.md - Implementation review
- SVG diagrams for pipeline and data flow visualization

Bug fixes:
- Fix compute dispatch for 4:2:2 and 4:4:4 output formats
- Fix BT.2020 returning BT.709 coefficients in GetYcbcrPrimariesConstantsId()
- Fix RGBA2YCBCR descriptor type mismatch (storage vs sampled)
- Fix numPlanes initialization for single-plane RGBA images
- Use image2D instead of image2DArray for single-layer images
- Add null checks in VulkanComputePipeline Destroy methods
- Support UINT64_MAX as sentinel for OPTIMAL tiling export

Signed-off-by: Tony Zlatinski <tzlatinski@nvidia.com>
…Utils

Enable cross-process YCbCr image sharing via DMA-BUF (Linux) or NT handles
(Windows) with proper tiled layouts for video encoders.

VulkanDeviceMemoryImpl:
- CreateWithExport(): Allocate with VkExportMemoryAllocateInfo
- ExportNativeHandle(): Export DMA-BUF FD or NT handle
- GetMemoryTypeIndex(): For opaque FD cross-process import
- IsExportable(), GetExportHandleTypes() accessors

VkImageResource:
- CreateExportable(): Images with DRM modifiers and export handles
- GetDrmFormatModifier(), UsesDrmFormatModifier() accessors
- GetMemoryPlaneCount(), GetMemoryPlaneLayout() for plane info
- GetImageTiling(), IsLinearImage(), GetPlaneLayout() helpers
- Query actual DRM modifier from driver after image creation

Bug fixes:
- Handle DRM_FORMAT_MOD_LINEAR (value 0) correctly - check DMA_BUF
  handle type instead of modifier value to determine DRM tiling
- Add VkImageFormatListCreateInfo for MUTABLE_FORMAT with DRM modifiers
  (VUID-VkImageCreateInfo-tiling-02353)

Signed-off-by: Tony Zlatinski <tzlatinski@nvidia.com>
Python test scripts for H.264, H.265, AV1, VP9 decoder and H.264, H.265, AV1
encoder with Adaptive Quantization (AQ) support. Works on Linux and Windows.

Python scripts (cross-platform):
- run_decoder_tests.py: Decoder tests for all codecs
- run_encoder_tests.py: Encoder tests with AQ support
- run_all_video_tests.py: Unified test runner
- vulkan_video_test.py: Full framework with JSON reporting

Shell scripts (Linux only, legacy):
- run_decoder_tests.sh, run_encoder_tests.sh, run_all_video_tests.sh

Key features:
- Required --video-dir parameter (no default content directory)
- Validates video directory exists before running tests
- Remote execution via SSH (default: 127.0.0.1/localhost)
- --remote <host> to specify remote host
- --local flag for local execution (required on Windows)
- Vulkan validation layer support (--validate)
- Codec filtering (--codec h264|h265|av1|vp9)
- Quick test mode (--quick)
- ANSI color output (auto-detected on Windows Terminal)

Signed-off-by: Tony Zlatinski <tzlatinski@nvidia.com>
@zlatinski
Copy link
Contributor Author

zlatinski commented Feb 4, 2026

dabrain34, @srinathkr-nv and @krajunv, please review these changes.

…/export

Add comprehensive test application for DRM format modifier support in
Vulkan, covering LINEAR and block-linear (optimal tiling) modifiers for
multiplanar YCbCr formats.

Test application (drm_format_mod_test):
- Query and enumerate DRM format modifiers per format
- Export images via VK_EXT_image_drm_format_modifier + VK_KHR_external_memory_fd
- Import via DMA-BUF fd with plane layout propagation
- Round-trip validation: export -> import -> verify matching layouts
- Block-linear import using VkImageDrmFormatModifierListCreateInfoEXT
- Vendor-aware modifier decoding (NVIDIA block-linear fields)
- Compression modifier detection and --compression CLI option
- Supports NV12, P010, P012, P016, NV16, P210

VkCodecUtils infrastructure changes:
- VkImageResource: Add dedicated memory allocation for DMA-BUF
  exportable images (VkMemoryDedicatedAllocateInfo)
- VulkanDeviceMemoryImpl: Fix dedicated allocation size calculation
  and DRM modifier memory requirements query

Build: integrated into common/libs/tests/ CMake build system.
@zlatinski zlatinski merged commit c96e377 into main Feb 10, 2026
0 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant