Video Encode/Decode#226
Conversation
|
Wow! Magnificent! Thanks a ton for bringing this work to life! I will try to review later today. |
Should
Should we add more formats? We should invent better names :) DXGI has short names, but they are unclear (seems to be a good start):
No D3D11 support? Probably not needed, but, IM, nice to have :) (...to be continued) |
|
Q1 Q2: Q3 |
+1, clarifying comments may be added if needed. They are pretty standard.
No objections here (assuming the interface is implementable in D3D11) |
|
Do we need other formats, like |
|
Please, add this link somewhere in the beginning of |
|
I'm ready to merge it after you are done with polishing. Just let me know. Further improvements can be made in I haven't deeply analyzed the implementation, but the API additions are nice and clear. Also I think that these formats: can be removed and |
Definitely. I'll look into it as soon as I can.
I like that. |
The current set targets the common 4:2:0 format family needed by the decode/encode path: NV12, P010, P016. Y410 is packed 4:4:4 and would add support for it in a follow-up if the need arises. |
|
I don't like that you're using native API structures in NRI public API. Wouldn't be logical to implemented it as a translation layer, not in the NRIWrapper* way? |
- "TextureViewDesc::readonlyPlanes" renamed to "planes". Logic switched to "direct" from "inverse"
- removed special depth-stencil format for shader resource views ("R24_UNORM_X8", "X24_G8_UINT", "R32_SFLOAT_X8_X24" and "X32_G8_UINT_X24"). Use "planes" instead
- explained valid usage
OTHER:
- VK: untangled "planes" (aspect mask) logic to be friendly for subpass inputs
- prerequisite for video support (PR #226)
@Daedie-git I have implemented it. Please, update your code to the latest since it's a prerequisite for the video support. Please, note that I have removed PR #222 since the code is completely different for these lines. Feel free to adjust, re-add or discuss. Thanks in advance! We are moving forward!
Just echoing already said, I absolutely agree with this. GAPI specific structs must be moved to corresponding |
Indeed. I have addressed this locally already. I'll rebase it on your change and push it soon. |
…ueues # Conflicts: # Source/VK/DescriptorVK.hpp
437decc to
4a2960d
Compare
|
I wrapped up my changes. |
|
I found some issues, so I will follow up with another commit. |
|
Additional question: For the sake of testing this, I've been building up quite the test suite in my own repo. Do you want to have it in some form? |
|
I'm with Codex now. I'm getting up to speed, but Codex has already proven to be extremely helpful. Last time I addressed many D3D12 issues, but not all of them. I haven't touched VK yet. I will get back to this on Monday. I'm sure Codex will help to accelerate. My plan is to fix NRI related issues, not video related issues to avoid introducing unnecessary noise to your work. |
|
I've managed to chew through most of the missing features. I'll also be upgrading the video sample project to the new reality soon. To make sure all the paths work beyond what my test suite is already covering. |
|
Also did a round of bugfixes. have all 6 codecs working again in the sample. |
|
Please, add big TODOs right into |
- removed very dirty "SelectQueueFamiliesVK" function with all dependencies - matched "TrySelectPreferredQueueType" usage across "Creation" and "VK"
Just spotted |
|
Semi-update: I've been working on building a new graphics stack for my work based on NRI recently (old one is still opengl based and not keeping up with our needs), and I've started adopting NRI video encode/decode in it (our applications are heavily video focused). I also still plan to direct some attention at upgrading the Samples soon. |
|
I've reworked the NRISample. Now it generates a collection of patterns that are sensitive to encoding artifacts. It now also offers a small suite of quality controls that can be manipulated at runtime. And an option to show the diff between original and encoded->decoded image. This makes the sample actually a quite useful tool (I think my boss will want to have it :) ). I have run into some bugs while integrating NRI video into our new graphics stacks. Those have been fixed. I also added a script to the sample repo that does smoke runs of a rich matrix of configuration permutations, which I highly recommend keeping in some form. It was an essential tool for getting through this final stretch without accidentally re-introduce regressions. I'm currently working through a final bug that surfaced in the aforementioned script. I expect to deal with it today or tomorrow. Then I actually think I'm ready for a final review + merging. |
|
I'm done for the most part. That being said, I would actually like to converge on a merge soon for this. Keep the above as documented known shortcoming. I think what's there is already quite strong even if not perfect. |
|
Thanks. I updated this branch to the latest |
|
Alright, have a great vacation! |
The open encode/decode enticed me to try and get VK hardware decoding working in my software (until now, I only had it on the D3D12 side). I expect this will need further changes, just let me know.
I wasn't sure what the right way to handle the D3D12 CommandBuffer was, I settled on the variant for now.
Summary
Adds hardware video queue support and a minimal native-backed video encode/decode extension API.
This branch makes video-capable queues visible through NRI, allows D3D12/Vulkan video command buffers to be created and submitted, adds
basic multi-planar video format support, and exposes
NRIVideoentry points for issuing native encode/decode commands.Changes
Public API
QueueType::VIDEO_DECODEQueueType::VIDEO_ENCODEG8_B8R8_2PLANE_420_UNORMG10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16G16_B16R16_2PLANE_420_UNORMPLANE_0PLANE_1PLANE_2Include/Extensions/NRIVideo.hVideoInterfaceCmdDecodeVideoCmdEncodeVideoAdapter and Queue Discovery
ID3D12VideoDeviceis availableVkQueueFamilyVideoPropertiesKHRto ensure Vulkan video queues also expose compatible codec operationsD3D12 Backend
D3D12_COMMAND_LIST_TYPE_VIDEO_DECODED3D12_COMMAND_LIST_TYPE_VIDEO_ENCODECommandBufferD3D12to hold graphics, video decode, or video encode command listsCmdDecodeVideoviaID3D12VideoDecodeCommandList::DecodeFrameCmdEncodeVideoviaID3D12VideoEncodeCommandList2::EncodeFrameID3D12CommandList*, since video command lists are not graphics command listsVulkan Backend
VK_KHR_video_queueVK_KHR_video_decode_queueVK_KHR_video_encode_queuevkCmdDecodeVideoKHRandvkCmdEncodeVideoKHRCmdDecodeVideo/CmdEncodeVideoforwarding to Vulkan command buffersValidation / Interface Wiring
VideoInterfacethroughnriGetInterfaceDeviceBase::FillFunctionTable(VideoInterface&)FillFunctionTable(VideoInterface&)implementationsAPI Shape
The new video API is intentionally small and native-backed.
NRI handles queue discovery, command buffer ownership, function table exposure, and command dispatch. Codec/session setup remains
backend-native (initially):
VkVideoDecodeInfoKHR/VkVideoEncodeInfoKHRpayloadsValidation
Built successfully with: