external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp \
external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp \
external/vulkancts/modules/vulkan/util/vktTypeComparisonUtil.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoTestUtils.cpp \
+ external/vulkancts/modules/vulkan/video/vktVideoTests.cpp \
external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp \
external/vulkancts/modules/vulkan/vktInfoTests.cpp \
external/vulkancts/modules/vulkan/vktShaderLibrary.cpp \
$(deqp_dir)/external/vulkancts/modules/vulkan/transform_feedback \
$(deqp_dir)/external/vulkancts/modules/vulkan/ubo \
$(deqp_dir)/external/vulkancts/modules/vulkan/util \
+ $(deqp_dir)/external/vulkancts/modules/vulkan/video \
$(deqp_dir)/external/vulkancts/modules/vulkan/wsi \
$(deqp_dir)/external/vulkancts/modules/vulkan/ycbcr \
$(deqp_dir)/external/vulkancts/vkscpc \
# Module FindGit requires cmake >= 2.8.2
cmake_minimum_required(VERSION 3.10.2)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/framework/delibs/cmake")
find_package(Git)
find_package(PythonInterp 3)
# RenderDoc API
include_directories(external/renderdoc/src)
+# FFmpeg used in vulkan video won't be part of android target
+if (NOT DE_OS_IS_ANDROID)
+ # FFmpeg
+ if (DE_OS_IS_WIN32)
+ add_subdirectory(external/ffmpeg)
+ include_directories(external/ffmpeg/src/include)
+ else()
+ find_package(FFmpeg REQUIRED)
+ # FFMPEG_FOUND - system has ffmpeg or libav
+ # FFMPEG_INCLUDE_DIR - the ffmpeg include directory
+ # FFMPEG_LIBRARIES
+ # FFMPEG_LIBAVCODEC
+ # FFMPEG_LIBAVFORMAT
+ # FFMPEG_LIBAVUTIL
+ if(FFMPEG_FOUND)
+ message("Found FFMPEG/LibAV libraries")
+ include_directories(${FFMPEG_INCLUDE_DIR})
+ else()
+ #add_subdirectory(external/ffmpeg)
+ include_directories(external/ffmpeg/src/include)
+ endif()
+ endif()
+endif()
include_directories(${PNG_INCLUDE_PATH})
# DRM (Direct Rendering Manager) Headers
vk-master-2022-03-01/synchronization2.txt
vk-master-2022-03-01/texture.txt
vk-master-2022-03-01/transform-feedback.txt
+vk-master-2022-03-01/video.txt
vk-master-2022-03-01/wsi.txt
vk-master-2022-03-01/ycbcr.txt
dEQP-VK.api.info.get_physical_device_properties2.features.depth_clamp_zero_one_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.address_binding_report_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.fault_features_ext
+dEQP-VK.api.info.get_physical_device_properties2.features.swapchain_maintenance1_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted11_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted12_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted13_structures
dEQP-VK.api.device_init.create_device_unsupported_features.optical_flow_features_nv
dEQP-VK.api.device_init.create_device_unsupported_features.fault_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.shader_core_builtins_features_arm
+dEQP-VK.api.device_init.create_device_unsupported_features.swapchain_maintenance1_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.ray_tracing_invocation_reorder_features_nv
+dEQP-VK.api.device_init.create_device_unsupported_features.multiview_per_view_viewports_features_qcom
dEQP-VK.api.device_init.create_device_queue2_two_queues.basic
dEQP-VK.api.device_init.create_device_queue2_all_protected.basic
dEQP-VK.api.device_init.create_device_queue2_all_unprotected.basic
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_compute_to_graphics
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_binary_semaphore_zircon_handle
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_timeline_semaphore_zircon_handle
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_262144_binary_semaphore_zircon_handle
--- /dev/null
+dEQP-VK.video.synchronization2.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.decode.h264_i
+dEQP-VK.video.decode.h264_i_p
+dEQP-VK.video.decode.h264_i_p_b_13
+dEQP-VK.video.decode.h264_i_p_not_matching_order
+dEQP-VK.video.decode.h264_i_p_b_13_not_matching_order
+dEQP-VK.video.decode.h264_query_with_status
+dEQP-VK.video.decode.h264_resolution_change
+dEQP-VK.video.decode.h264_resolution_change_dpb
+dEQP-VK.video.decode.h264_interleaved
+dEQP-VK.video.decode.h264_decode_encode_interleaved
+dEQP-VK.video.decode.h264_h265_interleaved
+dEQP-VK.video.decode.h265_i
+dEQP-VK.video.decode.h265_i_p
+dEQP-VK.video.decode.h265_i_p_not_matching_order
+dEQP-VK.video.decode.h265_i_p_b_13
+dEQP-VK.video.decode.h265_i_p_b_13_not_matching_order
+dEQP-VK.video.capabilities.queue_support_query
+dEQP-VK.video.capabilities.h264_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_spb_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_capabilities_query
+dEQP-VK.video.capabilities.h264_encode_capabilities_query
+dEQP-VK.video.capabilities.h265_decode_capabilities_query
+dEQP-VK.video.capabilities.h265_encode_capabilities_query
vk-master/texture.txt
vk-master/transform-feedback.txt
vk-master/ubo.txt
+vk-master/video.txt
vk-master/wsi.txt
vk-master/ycbcr.txt
dEQP-VK.api.info.get_physical_device_properties2.features.depth_clamp_zero_one_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.address_binding_report_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.fault_features_ext
+dEQP-VK.api.info.get_physical_device_properties2.features.swapchain_maintenance1_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted11_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted12_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted13_structures
dEQP-VK.api.device_init.create_device_unsupported_features.optical_flow_features_nv
dEQP-VK.api.device_init.create_device_unsupported_features.fault_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.shader_core_builtins_features_arm
+dEQP-VK.api.device_init.create_device_unsupported_features.swapchain_maintenance1_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.ray_tracing_invocation_reorder_features_nv
+dEQP-VK.api.device_init.create_device_unsupported_features.multiview_per_view_viewports_features_qcom
dEQP-VK.api.device_init.create_device_queue2.basic
dEQP-VK.api.device_init.create_instance_device_intentional_alloc_fail.basic
dEQP-VK.api.device_init.create_device_queue2_two_queues.basic
dEQP-VK.synchronization.op.multi_queue.timeline_semaphore.write_update_index_buffer_read_index_input.buffer_20_concurrent
dEQP-VK.synchronization.internally_synchronized_objects.pipeline_cache_compute
dEQP-VK.synchronization.internally_synchronized_objects.pipeline_cache_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_compute_to_graphics
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_binary_semaphore_fd
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_timeline_semaphore_fd
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_binary_semaphore_fence_fd
--- /dev/null
+dEQP-VK.video.synchronization2.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.decode.h264_i
+dEQP-VK.video.decode.h264_i_p
+dEQP-VK.video.decode.h264_i_p_b_13
+dEQP-VK.video.decode.h264_i_p_not_matching_order
+dEQP-VK.video.decode.h264_i_p_b_13_not_matching_order
+dEQP-VK.video.decode.h264_query_with_status
+dEQP-VK.video.decode.h264_resolution_change
+dEQP-VK.video.decode.h264_resolution_change_dpb
+dEQP-VK.video.decode.h264_interleaved
+dEQP-VK.video.decode.h264_decode_encode_interleaved
+dEQP-VK.video.decode.h264_h265_interleaved
+dEQP-VK.video.decode.h265_i
+dEQP-VK.video.decode.h265_i_p
+dEQP-VK.video.decode.h265_i_p_not_matching_order
+dEQP-VK.video.decode.h265_i_p_b_13
+dEQP-VK.video.decode.h265_i_p_b_13_not_matching_order
+dEQP-VK.video.capabilities.queue_support_query
+dEQP-VK.video.capabilities.h264_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_spb_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_capabilities_query
+dEQP-VK.video.capabilities.h264_encode_capabilities_query
+dEQP-VK.video.capabilities.h265_decode_capabilities_query
+dEQP-VK.video.capabilities.h265_encode_capabilities_query
import sys
import shutil
import tarfile
+import zipfile
import hashlib
import argparse
import subprocess
def clean (self):
fullDstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
# Remove read-only first
- readonlydir = os.path.join(fullDstPath, ".git", "objects", "pack")
+ readonlydir = os.path.join(fullDstPath, ".git")
if os.path.exists(readonlydir):
- shutil.rmtree(readonlydir, onerror = onReadonlyRemoveError )
+ shutil.rmtree(readonlydir, onerror = onReadonlyRemoveError)
if os.path.exists(fullDstPath):
shutil.rmtree(fullDstPath, ignore_errors=False)
self.archiveDir = "packages"
self.postExtract = postExtract
+ if ("FFmpeg" in url):
+ ndx = {"Windows":0, "Linux":1}[platform.system()]
+ self.url = self.url.split()[ndx]
+ self.checksum = self.checksum.split()[ndx]
+ self.filename = self.filename.split()[ndx]
+
def clean (self):
Source.clean(self)
self.removeArchives()
srcPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.archiveDir, self.filename)
tmpPath = os.path.join(EXTERNAL_DIR, ".extract-tmp-%s" % self.baseDir)
dstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
- archive = tarfile.open(srcPath)
+
+ if self.filename.endswith(".zip"):
+ archive = zipfile.ZipFile(srcPath)
+ else:
+ archive = tarfile.open(srcPath)
if os.path.exists(tmpPath):
shutil.rmtree(tmpPath, ignore_errors=False)
"c9d164ec247f426a525a7b89936694aefbc91fb7a50182b198898b8fc91174b4",
"libpng",
postExtract = postExtractLibpng),
+ SourcePackage(
+ "http://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2021-05-31-13-09/ffmpeg-N-102631-gbaf5cc5b7a-win64-lgpl-shared.zip https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2021-05-31-13-09/ffmpeg-N-102631-gbaf5cc5b7a-linux64-lgpl-shared.tar.xz",
+ "ffmpeg-N-102631-gbaf5cc5b7a-win64-lgpl-shared.zip ffmpeg-N-102631-gbaf5cc5b7a-linux64-lgpl-shared.tar.xz",
+ "9c1855b066d75de6ea6b2c3bb2c1cb87d3bd51dee056adfdcb00e4eaa1e437ad 22454a9a9639898171351b07b6f6c17288249596f96a28b7da67823988a316f9",
+ "ffmpeg"),
SourceFile(
"https://raw.githubusercontent.com/baldurk/renderdoc/v1.1/renderdoc/api/app/renderdoc_app.h",
"renderdoc_app.h",
GitRepo(
"https://github.com/KhronosGroup/Vulkan-Docs.git",
"git@github.com:KhronosGroup/Vulkan-Docs.git",
- "d4987d251a1f63f184ea6ed9b20f5125cfd6a2d5",
+ "9a2e576a052a1e65a5d41b593e693ff02745604b",
"vulkan-docs"),
GitRepo(
"https://github.com/google/amber.git",
"git@github.com:open-source-parsers/jsoncpp.git",
"9059f5cad030ba11d37818847443a53918c327b1",
"jsoncpp"),
+ GitRepo(
+ "https://github.com/nvpro-samples/vk_video_samples.git",
+ None,
+ "68398ce672fb3b331ee6c998392951bba37e7e4d",
+ "video-parser"),
]
def parseArgs ():
return args
-if __name__ == "__main__":
- args = parseArgs()
+def run(*popenargs, **kwargs):
+ process = subprocess.Popen(*popenargs, **kwargs)
- for pkg in PACKAGES:
- if args.clean:
- pkg.clean()
- else:
- pkg.update(args.protocol, args.force)
+ try:
+ stdout, stderr = process.communicate(None)
+ except:
+ process.kill()
+ process.wait()
+ raise
+
+ retcode = process.poll()
+
+ if retcode:
+ raise subprocess.CalledProcessError(retcode, process.args, output=stdout, stderr=stderr)
+
+ return retcode, stdout, stderr
+
+if __name__ == "__main__":
+ # Rerun script with python3 as python2 does not have lzma (xz) decompression support
+ if sys.version_info < (3, 0):
+ cmd = {"Windows": ['py', '-3'], "Linux": ['python3']}[platform.system()]
+ cmd = cmd + sys.argv
+ run(cmd)
+ else:
+ args = parseArgs()
+
+ for pkg in PACKAGES:
+ if args.clean:
+ pkg.clean()
+ else:
+ pkg.update(args.protocol, args.force)
--- /dev/null
+src
+packages
--- /dev/null
+# cmake file for ffmpeg
+
+if (NOT DE_DEFS)
+ message(FATAL_ERROR "Include Defs.cmake")
+endif ()
+
+if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/include/libavformat/avformat.h")
+ set(DEFAULT_FFMPEG_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src)
+else ()
+ # Assume build inside Android source tree
+ set(DEFAULT_FFMPEG_SRC_PATH "../ffmpeg")
+endif ()
+
+set(FFMPEG_SRC_PATH ${DEFAULT_FFMPEG_SRC_PATH} CACHE STRING "Path to ffmpeg source tree")
+
+if (IS_ABSOLUTE ${FFMPEG_SRC_PATH})
+ set(FFMPEG_ABS_PATH ${FFMPEG_SRC_PATH})
+else ()
+ set(FFMPEG_ABS_PATH "${CMAKE_SOURCE_DIR}/${FFMPEG_SRC_PATH}")
+endif ()
+
+#set(FFMPEG_SRCS
+# ${FFMPEG_ABS_PATH}/include/libavformat/avformat.h
+# ${FFMPEG_ABS_PATH}/include/libavformat/avio.h
+# ${FFMPEG_ABS_PATH}/include/libavcodec/avcodec.h
+# )
+
+#set(FFMPEG_INCLUDE_PATH ${FFMPEG_ABS_PATH}/include PARENT_SCOPE)
+
+if (DE_OS_IS_WIN32)
+ file(GLOB FFMPEG_LIBRARIES_FILES_FULL ${FFMPEG_ABS_PATH}/lib/*.lib)
+elseif (DE_OS_IS_UNIX)
+ file(GLOB FFMPEG_LIBRARIES_FILES_FULL ${FFMPEG_ABS_PATH}/lib/*)
+else ()
+ message( FATAL_ERROR "System is not supported" )
+endif ()
+
+#set(FFMPEG_LIBRARIES_FILES_SHORT )
+#foreach(FFMPEG_LIBRARY_FILE_FULL ${FFMPEG_LIBRARIES_FILES_FULL})
+# get_filename_component(FFMPEG_LIBRARY_FILE "${FFMPEG_LIBRARY_FILE_FULL}" NAME_WE)
+# set(FFMPEG_LIBRARIES_FILES_SHORT ${FFMPEG_LIBRARY_FILE} ${FFMPEG_LIBRARIES_FILES_SHORT})
+#endforeach()
+
+#message(WARNING ${FFMPEG_LIBRARIES_FILES_SHORT})
+
+set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES_FILES_FULL} PARENT_SCOPE)
+set(FFMPEG_LIBRARIES_PATH ${FFMPEG_ABS_PATH}/lib PARENT_SCOPE)
+
+#message(WARNING ${FFMPEG_LIBRARIES_FILES_FULL})
+
+#
+#file(GLOB ConfigFiles ${FFMPEG_ABS_PATH}/lib/*.lib
+# ${FFMPEG_ABS_PATH}/bin/*.dll)
+#
+#add_custom_target(ffmpeg)
+#foreach(ConfigFile ${ConfigFiles})
+# add_custom_command(TARGET ffmpeg PRE_BUILD
+# COMMAND ${CMAKE_COMMAND} -E
+# copy ${ConfigFile} ${CMAKE_CURRENT_BINARY_DIR}/.)
+#endforeach()
+
+if (DE_OS_IS_UNIX)
+ add_custom_target(ffmpeg ALL)
+ foreach(FFMPEG_LIBRARIES_FILE ${FFMPEG_LIBRARIES_FILES_FULL})
+ #message(WARNING ${FFMPEG_LIBRARIES_FILE})
+ #add_custom_command(TARGET ffmpeg PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_LIBRARIES_FILE} ${CMAKE_BINARY_DIR})
+ add_custom_command(TARGET ffmpeg PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_LIBRARIES_FILE} ${CMAKE_BINARY_DIR}/external/ffmpeg)
+ endforeach()
+ #message(WARNING ${CMAKE_BINARY_DIR})
+endif ()
--- /dev/null
+src
+packages
set(VKRENDERDOC_SRC vkNoRenderDocUtil.cpp)
endif(HAVE_RENDERDOC_APP_H)
+
# Build inl files
set(DEQP_VULKAN_INL_GEN_INPUT ${PROJECT_SOURCE_DIR}/external/vulkan-docs/src/xml/vk.xml)
set(DEQP_VULKAN_INL_GEN_OUTPUTS_DIR ${PROJECT_SOURCE_DIR}/external/vulkancts/framework/vulkan)
PCH(VKSCUTILNOSHADER_INLS ../../modules/vulkan/pch.cpp)
add_library(vkutilnoshader STATIC ${VKUTILNOSHADER_SRCS} ${VKUTILNOSHADER_INLS})
+
+
target_compile_definitions(vkutilnoshader PUBLIC CTS_USES_VULKAN)
target_link_libraries(vkutilnoshader PUBLIC ${VKUTILNOSHADER_LIBS})
add_dependencies(vkutilnoshader deqp-vk-inl)
target_include_directories(vkscutil BEFORE PUBLIC generated/vulkansc)
target_include_directories(vkscutil PUBLIC ${GLSLANG_INCLUDE_PATH} ${spirv-tools_SOURCE_DIR}/include ${spirv-tools_SOURCE_DIR}/external/include )
target_link_libraries(vkscutil PUBLIC vkscutilnoshader ${GLSLANG_LIBRARIES} SPIRV-Tools SPIRV-Tools-opt)
+
std::make_tuple(0, 1, 1, "VK_EXT_headless_surface", "VK_KHR_surface"),
std::make_tuple(0, 1, 2, "VK_EXT_headless_surface", "VK_KHR_surface"),
std::make_tuple(0, 1, 3, "VK_EXT_headless_surface", "VK_KHR_surface"),
+ std::make_tuple(0, 1, 0, "VK_EXT_surface_maintenance1", "VK_KHR_surface"),
+ std::make_tuple(0, 1, 0, "VK_EXT_surface_maintenance1", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(0, 1, 1, "VK_EXT_surface_maintenance1", "VK_KHR_surface"),
+ std::make_tuple(0, 1, 1, "VK_EXT_surface_maintenance1", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(0, 1, 2, "VK_EXT_surface_maintenance1", "VK_KHR_surface"),
+ std::make_tuple(0, 1, 2, "VK_EXT_surface_maintenance1", "VK_KHR_get_surface_capabilities2"),
+ std::make_tuple(0, 1, 3, "VK_EXT_surface_maintenance1", "VK_KHR_surface"),
+ std::make_tuple(0, 1, 3, "VK_EXT_surface_maintenance1", "VK_KHR_get_surface_capabilities2"),
std::make_tuple(0, 1, 0, "VK_EXT_acquire_drm_display", "VK_EXT_direct_mode_display"),
std::make_tuple(0, 1, 1, "VK_EXT_acquire_drm_display", "VK_EXT_direct_mode_display"),
std::make_tuple(0, 1, 2, "VK_EXT_acquire_drm_display", "VK_EXT_direct_mode_display"),
std::make_tuple(0, 1, 1, "VK_EXT_video_encode_h265", "VK_KHR_video_encode_queue"),
std::make_tuple(0, 1, 2, "VK_EXT_video_encode_h265", "VK_KHR_video_encode_queue"),
std::make_tuple(0, 1, 3, "VK_EXT_video_encode_h265", "VK_KHR_video_encode_queue"),
- std::make_tuple(0, 1, 0, "VK_EXT_video_decode_h264", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 1, "VK_EXT_video_decode_h264", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 2, "VK_EXT_video_decode_h264", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 3, "VK_EXT_video_decode_h264", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 0, "VK_KHR_video_decode_h264", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 1, "VK_KHR_video_decode_h264", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 2, "VK_KHR_video_decode_h264", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 3, "VK_KHR_video_decode_h264", "VK_KHR_video_decode_queue"),
std::make_tuple(0, 1, 0, "VK_AMD_texture_gather_bias_lod", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 0, "VK_KHR_dynamic_rendering", "VK_KHR_depth_stencil_resolve"),
std::make_tuple(0, 1, 0, "VK_KHR_dynamic_rendering", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 0, "VK_KHR_shader_clock", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 0, "VK_EXT_calibrated_timestamps", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 0, "VK_AMD_shader_core_properties", "VK_KHR_get_physical_device_properties2"),
- std::make_tuple(0, 1, 0, "VK_EXT_video_decode_h265", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 1, "VK_EXT_video_decode_h265", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 2, "VK_EXT_video_decode_h265", "VK_KHR_video_decode_queue"),
- std::make_tuple(0, 1, 3, "VK_EXT_video_decode_h265", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 0, "VK_KHR_video_decode_h265", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 1, "VK_KHR_video_decode_h265", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 2, "VK_KHR_video_decode_h265", "VK_KHR_video_decode_queue"),
+ std::make_tuple(0, 1, 3, "VK_KHR_video_decode_h265", "VK_KHR_video_decode_queue"),
std::make_tuple(0, 1, 0, "VK_EXT_vertex_attribute_divisor", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 0, "VK_GGP_frame_token", "VK_KHR_swapchain"),
std::make_tuple(0, 1, 0, "VK_GGP_frame_token", "VK_GGP_stream_descriptor_surface"),
std::make_tuple(0, 1, 1, "VK_EXT_shader_atomic_float2", "VK_EXT_shader_atomic_float"),
std::make_tuple(0, 1, 2, "VK_EXT_shader_atomic_float2", "VK_EXT_shader_atomic_float"),
std::make_tuple(0, 1, 3, "VK_EXT_shader_atomic_float2", "VK_EXT_shader_atomic_float"),
+ std::make_tuple(0, 1, 0, "VK_EXT_swapchain_maintenance1", "VK_KHR_swapchain"),
+ std::make_tuple(0, 1, 0, "VK_EXT_swapchain_maintenance1", "VK_EXT_surface_maintenance1"),
+ std::make_tuple(0, 1, 0, "VK_EXT_swapchain_maintenance1", "VK_KHR_get_physical_device_properties2"),
+ std::make_tuple(0, 1, 1, "VK_EXT_swapchain_maintenance1", "VK_KHR_swapchain"),
+ std::make_tuple(0, 1, 1, "VK_EXT_swapchain_maintenance1", "VK_EXT_surface_maintenance1"),
+ std::make_tuple(0, 1, 2, "VK_EXT_swapchain_maintenance1", "VK_KHR_swapchain"),
+ std::make_tuple(0, 1, 2, "VK_EXT_swapchain_maintenance1", "VK_EXT_surface_maintenance1"),
+ std::make_tuple(0, 1, 3, "VK_EXT_swapchain_maintenance1", "VK_KHR_swapchain"),
+ std::make_tuple(0, 1, 3, "VK_EXT_swapchain_maintenance1", "VK_EXT_surface_maintenance1"),
std::make_tuple(0, 1, 0, "VK_EXT_shader_demote_to_helper_invocation", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(0, 1, 1, "VK_NV_device_generated_commands", "VK_KHR_buffer_device_address"),
std::make_tuple(0, 1, 0, "VK_KHR_shader_integer_dot_product", "VK_KHR_get_physical_device_properties2"),
std::make_tuple(1, 0, "VK_AMD_shader_ballot"),
std::make_tuple(1, 0, "VK_EXT_video_encode_h264"),
std::make_tuple(1, 0, "VK_EXT_video_encode_h265"),
- std::make_tuple(1, 0, "VK_EXT_video_decode_h264"),
+ std::make_tuple(1, 0, "VK_KHR_video_decode_h264"),
std::make_tuple(1, 0, "VK_AMD_texture_gather_bias_lod"),
std::make_tuple(1, 0, "VK_AMD_shader_info"),
std::make_tuple(1, 0, "VK_KHR_dynamic_rendering"),
std::make_tuple(1, 0, "VK_AMD_pipeline_compiler_control"),
std::make_tuple(1, 0, "VK_EXT_calibrated_timestamps"),
std::make_tuple(1, 0, "VK_AMD_shader_core_properties"),
- std::make_tuple(1, 0, "VK_EXT_video_decode_h265"),
+ std::make_tuple(1, 0, "VK_KHR_video_decode_h265"),
std::make_tuple(1, 0, "VK_KHR_global_priority"),
std::make_tuple(1, 0, "VK_AMD_memory_overallocation_behavior"),
std::make_tuple(1, 0, "VK_EXT_vertex_attribute_divisor"),
std::make_tuple(1, 0, "VK_KHR_deferred_host_operations"),
std::make_tuple(1, 0, "VK_KHR_pipeline_executable_properties"),
std::make_tuple(1, 0, "VK_EXT_shader_atomic_float2"),
+ std::make_tuple(1, 0, "VK_EXT_surface_maintenance1"),
+ std::make_tuple(1, 0, "VK_EXT_swapchain_maintenance1"),
std::make_tuple(1, 0, "VK_EXT_shader_demote_to_helper_invocation"),
std::make_tuple(1, 1, "VK_NV_device_generated_commands"),
std::make_tuple(1, 0, "VK_NV_inherited_viewport_scissor"),
std::make_tuple(1, 0, "VK_QCOM_image_processing"),
std::make_tuple(1, 0, "VK_EXT_extended_dynamic_state3"),
std::make_tuple(1, 0, "VK_EXT_subpass_merge_feedback"),
+ std::make_tuple(1, 0, "VK_LUNARG_direct_driver_loading"),
std::make_tuple(1, 0, "VK_EXT_shader_module_identifier"),
std::make_tuple(1, 0, "VK_EXT_rasterization_order_attachment_access"),
std::make_tuple(1, 0, "VK_NV_optical_flow"),
std::make_tuple(1, 0, "VK_EXT_pipeline_protected_access"),
std::make_tuple(1, 0, "VK_QCOM_tile_properties"),
std::make_tuple(1, 0, "VK_SEC_amigo_profiling"),
+ std::make_tuple(1, 0, "VK_QCOM_multiview_per_view_viewports"),
std::make_tuple(1, 0, "VK_NV_ray_tracing_invocation_reorder"),
std::make_tuple(1, 0, "VK_EXT_mutable_descriptor_type"),
std::make_tuple(1, 0, "VK_ARM_shader_core_builtins"),
* This file was generated by /scripts/gen_framework.py
*/
-#define VK_API_VERSION_1_0 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 0, 0)))
-#define VK_API_VERSION_1_1 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 1, 0)))
-#define VK_API_VERSION_1_2 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 2, 0)))
-#define VK_API_VERSION_1_3 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 3, 0)))
-#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE (static_cast<size_t> (256))
-#define VK_UUID_SIZE (static_cast<size_t> (16))
-#define VK_LUID_SIZE (static_cast<size_t> (8))
-#define VK_MAX_EXTENSION_NAME_SIZE (static_cast<size_t> (256))
-#define VK_MAX_DESCRIPTION_SIZE (static_cast<size_t> (256))
-#define VK_MAX_MEMORY_TYPES (static_cast<size_t> (32))
-#define VK_MAX_MEMORY_HEAPS (static_cast<size_t> (16))
-#define VK_LOD_CLAMP_NONE (static_cast<float> (1000.0F))
-#define VK_REMAINING_MIP_LEVELS (static_cast<uint32_t> ((~0U)))
-#define VK_REMAINING_ARRAY_LAYERS (static_cast<uint32_t> ((~0U)))
-#define VK_WHOLE_SIZE (static_cast<vk::VkDeviceSize> ((~0ULL)))
-#define VK_ATTACHMENT_UNUSED (static_cast<uint32_t> ((~0U)))
-#define VK_TRUE (static_cast<vk::VkBool32> (1))
-#define VK_FALSE (static_cast<vk::VkBool32> (0))
-#define VK_QUEUE_FAMILY_IGNORED (static_cast<uint32_t> ((~0U)))
-#define VK_QUEUE_FAMILY_EXTERNAL (static_cast<uint32_t> ((~1U)))
-#define VK_QUEUE_FAMILY_FOREIGN_EXT (static_cast<uint32_t> ((~2U)))
-#define VK_SUBPASS_EXTERNAL (static_cast<uint32_t> ((~0U)))
-#define VK_MAX_DEVICE_GROUP_SIZE (static_cast<size_t> (32))
-#define VK_MAX_DRIVER_NAME_SIZE (static_cast<size_t> (256))
-#define VK_MAX_DRIVER_INFO_SIZE (static_cast<size_t> (256))
-#define VK_SHADER_UNUSED_KHR (static_cast<uint32_t> ((~0U)))
-#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR (static_cast<uint32_t> (16))
-#define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT (static_cast<uint32_t> (32))
+#define VK_API_VERSION_1_0 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 0, 0)))
+#define VK_API_VERSION_1_1 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 1, 0)))
+#define VK_API_VERSION_1_2 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 2, 0)))
+#define VK_API_VERSION_1_3 (static_cast<uint32_t> (VK_MAKE_API_VERSION(0, 1, 3, 0)))
+#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE (static_cast<size_t> (256))
+#define VK_UUID_SIZE (static_cast<size_t> (16))
+#define VK_LUID_SIZE (static_cast<size_t> (8))
+#define VK_MAX_EXTENSION_NAME_SIZE (static_cast<size_t> (256))
+#define VK_MAX_DESCRIPTION_SIZE (static_cast<size_t> (256))
+#define VK_MAX_MEMORY_TYPES (static_cast<size_t> (32))
+#define VK_MAX_MEMORY_HEAPS (static_cast<size_t> (16))
+#define VK_LOD_CLAMP_NONE (static_cast<float> (1000.0F))
+#define VK_REMAINING_MIP_LEVELS (static_cast<uint32_t> ((~0U)))
+#define VK_REMAINING_ARRAY_LAYERS (static_cast<uint32_t> ((~0U)))
+#define VK_WHOLE_SIZE (static_cast<vk::VkDeviceSize> ((~0ULL)))
+#define VK_ATTACHMENT_UNUSED (static_cast<uint32_t> ((~0U)))
+#define VK_TRUE (static_cast<vk::VkBool32> (1))
+#define VK_FALSE (static_cast<vk::VkBool32> (0))
+#define VK_QUEUE_FAMILY_IGNORED (static_cast<uint32_t> ((~0U)))
+#define VK_QUEUE_FAMILY_EXTERNAL (static_cast<uint32_t> ((~1U)))
+#define VK_QUEUE_FAMILY_FOREIGN_EXT (static_cast<uint32_t> ((~2U)))
+#define VK_SUBPASS_EXTERNAL (static_cast<uint32_t> ((~0U)))
+#define VK_MAX_DEVICE_GROUP_SIZE (static_cast<size_t> (32))
+#define VK_MAX_DRIVER_NAME_SIZE (static_cast<size_t> (256))
+#define VK_MAX_DRIVER_INFO_SIZE (static_cast<size_t> (256))
+#define VK_SHADER_UNUSED_KHR (static_cast<uint32_t> ((~0U)))
+#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR (static_cast<uint32_t> (16))
+#define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT (static_cast<uint32_t> (32))
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 (static_cast<uint32_t> (VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)))
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8 (static_cast<uint32_t> (VK_MAKE_VIDEO_STD_VERSION(0, 9, 8)))
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 (static_cast<uint32_t> (VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)))
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_0_9_9 (static_cast<uint32_t> (VK_MAKE_VIDEO_STD_VERSION(0, 9, 9)))
#define VK_API_MAX_FRAMEWORK_VERSION VK_API_VERSION_1_3
VK_DEFINE_HANDLE (VkInstance, HANDLE_TYPE_INSTANCE);
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT = 1000039008,
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT = 1000039009,
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040001,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT = 1000040003,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040004,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040005,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040006,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006,
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
VK_STRUCTURE_TYPE_RENDERING_INFO = 1000044000,
VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO = 1000044001,
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187001,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187002,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT = 1000187003,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187004,
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187005,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005,
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004,
+ VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,
VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001,
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002,
VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003,
+ VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000,
+ VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001,
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002,
VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000,
VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000,
static const VkMemoryDecompressionMethodFlagBitsNV VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0x00000001ULL;
+enum VkDirectDriverLoadingModeLUNARG
+{
+ VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG = 0,
+ VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG = 1,
+ VK_DIRECT_DRIVER_LOADING_MODE_LUNARG_LAST,
+ VK_DIRECT_DRIVER_LOADING_MODE_LUNARG_MAX_ENUM = 0x7FFFFFFF
+};
+
enum VkColorSpaceKHR
{
VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0,
VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001,
VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002,
VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0x00000004,
+ VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0x00000008,
VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
};
VK_DEVICE_FAULT_ADDRESS_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF
};
+enum VkPresentScalingFlagBitsEXT
+{
+ VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0x00000001,
+ VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0x00000002,
+ VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0x00000004,
+ VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+};
+
+enum VkPresentGravityFlagBitsEXT
+{
+ VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0x00000001,
+ VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0x00000002,
+ VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0x00000004,
+ VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+};
+
enum VkVendorId
{
VK_VENDOR_ID_VIV = 0x10001,
enum VkVideoCodecOperationFlagBitsKHR
{
VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0,
- VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT = 0x00000001,
- VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT = 0x00000002,
+ VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002,
VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000,
VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT = 0x00020000,
VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
VK_VIDEO_DECODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
};
-enum VkVideoDecodeH264PictureLayoutFlagBitsEXT
+enum VkVideoDecodeH264PictureLayoutFlagBitsKHR
{
- VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT = 0,
- VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT = 0x00000001,
- VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT = 0x00000002,
- VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR = 0,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0x00000002,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
};
enum VkVideoEncodeUsageFlagBitsKHR
typedef uint32_t VkMicromapCreateFlagsEXT;
+typedef uint32_t VkDirectDriverLoadingFlagsLUNARG;
+
typedef uint32_t VkCompositeAlphaFlagsKHR;
typedef uint32_t VkDisplayPlaneAlphaFlagsKHR;
typedef uint32_t VkOpticalFlowExecuteFlagsNV;
+typedef uint32_t VkPresentScalingFlagsEXT;
+
+typedef uint32_t VkPresentGravityFlagsEXT;
+
typedef uint32_t VkVideoCodecOperationFlagsKHR;
typedef uint32_t VkVideoCapabilityFlagsKHR;
typedef uint32_t VkVideoDecodeFlagsKHR;
-typedef uint32_t VkVideoDecodeH264PictureLayoutFlagsEXT;
+typedef uint32_t VkVideoDecodeH264PictureLayoutFlagsKHR;
typedef uint32_t VkVideoEncodeFlagsKHR;
#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME "VK_AMD_shader_explicit_vertex_parameter"
#define VK_EXT_DEBUG_MARKER_SPEC_VERSION 4
#define VK_EXT_DEBUG_MARKER_EXTENSION_NAME "VK_EXT_debug_marker"
-#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 7
+#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 8
#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue"
-#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 6
+#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 7
#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME "VK_KHR_video_decode_queue"
#define VK_AMD_GCN_SHADER_SPEC_VERSION 1
#define VK_AMD_GCN_SHADER_EXTENSION_NAME "VK_AMD_gcn_shader"
#define VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME "VK_EXT_video_encode_h264"
#define VK_EXT_VIDEO_ENCODE_H265_SPEC_VERSION 9
#define VK_EXT_VIDEO_ENCODE_H265_EXTENSION_NAME "VK_EXT_video_encode_h265"
-#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 7
-#define VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME "VK_EXT_video_decode_h264"
+#define VK_KHR_VIDEO_DECODE_H264_SPEC_VERSION 8
+#define VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME "VK_KHR_video_decode_h264"
#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION 1
#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME "VK_AMD_texture_gather_bias_lod"
#define VK_AMD_SHADER_INFO_SPEC_VERSION 1
#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME "VK_EXT_calibrated_timestamps"
#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 2
#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties"
-#define VK_EXT_VIDEO_DECODE_H265_SPEC_VERSION 5
-#define VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME "VK_EXT_video_decode_h265"
+#define VK_KHR_VIDEO_DECODE_H265_SPEC_VERSION 7
+#define VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME "VK_KHR_video_decode_h265"
#define VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION 1
#define VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME "VK_KHR_global_priority"
#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_SPEC_VERSION 1
#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME "VK_KHR_pipeline_executable_properties"
#define VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION 1
#define VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME "VK_EXT_shader_atomic_float2"
+#define VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION 1
+#define VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_surface_maintenance1"
+#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1
+#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_swapchain_maintenance1"
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
#define VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 3
#define VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME "VK_EXT_extended_dynamic_state3"
#define VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION 2
#define VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME "VK_EXT_subpass_merge_feedback"
+#define VK_LUNARG_DIRECT_DRIVER_LOADING_SPEC_VERSION 1
+#define VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME "VK_LUNARG_direct_driver_loading"
#define VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION 1
#define VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME "VK_EXT_shader_module_identifier"
#define VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION 1
#define VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME "VK_QCOM_tile_properties"
#define VK_SEC_AMIGO_PROFILING_SPEC_VERSION 1
#define VK_SEC_AMIGO_PROFILING_EXTENSION_NAME "VK_SEC_amigo_profiling"
+#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION 1
+#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME "VK_QCOM_multiview_per_view_viewports"
#define VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION 1
#define VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME "VK_NV_ray_tracing_invocation_reorder"
#define VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1
#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64
#define STD_VIDEO_H264_MAX_NUM_LIST_REF 32
#define STD_VIDEO_H264_MAX_CHROMA_PLANES 2
-#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_0_9_8
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0
#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_decode"
#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2
#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8
#define STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS 32
#define STD_VIDEO_H265_MAX_LONG_TERM_PICS 16
#define STD_VIDEO_H265_MAX_DELTA_POC 48
-#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_0_9_9
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0
#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265_decode"
#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8
#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_0_9_9
virtual VkResult bindOpticalFlowSessionImageNV (VkDevice device, VkOpticalFlowSessionNV session, VkOpticalFlowSessionBindingPointNV bindingPoint, VkImageView view, VkImageLayout layout) const;
virtual void cmdOpticalFlowExecuteNV (VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo) const;
virtual VkResult getDeviceFaultInfoEXT (VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo) const;
+virtual VkResult releaseSwapchainImagesEXT (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) const;
{
return m_vk.getDeviceFaultInfoEXT(device, pFaultCounts, pFaultInfo);
}
+
+VkResult DeviceDriver::releaseSwapchainImagesEXT (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) const
+{
+ return m_vk.releaseSwapchainImagesEXT(device, pReleaseInfo);
+}
"VK_KHR_timeline_semaphore",
"VK_KHR_uniform_buffer_standard_layout",
"VK_KHR_variable_pointers",
+ "VK_KHR_video_queue",
"VK_KHR_vulkan_memory_model",
"VK_KHR_win32_keyed_mutex",
"VK_KHR_workgroup_memory_explicit_layout",
}
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestSwapchainMaintenance1FeaturesEXT (Context& context)
+{
+ const PlatformInterface& vkp = context.getPlatformInterface();
+ tcu::TestLog& log = context.getTestContext().getLog();
+ tcu::ResultCollector resultCollector (log);
+ const CustomInstance instance (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+ const deUint32 queueFamilyIndex = 0;
+ const deUint32 queueCount = 1;
+ const float queuePriority = 1.0f;
+ const DeviceFeatures deviceFeaturesAll (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+ const VkPhysicalDeviceFeatures2 deviceFeatures2 = deviceFeaturesAll.getCoreFeatures2();
+ int numErrors = 0;
+ bool isSubProcess = context.getTestContext().getCommandLine().isSubProcess();
+
+
+ VkPhysicalDeviceFeatures emptyDeviceFeatures;
+ deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+ // Only non-core extensions will be used when creating the device.
+ vector<const char*> coreExtensions;
+ getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+ vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+ vector<const char*> extensionNames;
+ extensionNames.reserve(nonCoreExtensions.size());
+ for (const string& extension : nonCoreExtensions)
+ extensionNames.push_back(extension.c_str());
+
+ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>()))
+ {
+ static const Feature features[] =
+ {
+ FEATURE_ITEM (VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT, swapchainMaintenance1),
+ };
+ auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(featuresStruct);
+ checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, isSubProcess);
+ }
+
+ if (numErrors > 0)
+ return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+ else
+ return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
+}
+
+
tcu::TestStatus createDeviceWithUnsupportedFeaturesTestRayTracingInvocationReorderFeaturesNV (Context& context)
{
const PlatformInterface& vkp = context.getPlatformInterface();
}
+tcu::TestStatus createDeviceWithUnsupportedFeaturesTestMultiviewPerViewViewportsFeaturesQCOM (Context& context)
+{
+ const PlatformInterface& vkp = context.getPlatformInterface();
+ tcu::TestLog& log = context.getTestContext().getLog();
+ tcu::ResultCollector resultCollector (log);
+ const CustomInstance instance (createCustomInstanceWithExtensions(context, context.getInstanceExtensions(), DE_NULL, true));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+ const deUint32 queueFamilyIndex = 0;
+ const deUint32 queueCount = 1;
+ const float queuePriority = 1.0f;
+ const DeviceFeatures deviceFeaturesAll (context.getInstanceInterface(), context.getUsedApiVersion(), physicalDevice, context.getInstanceExtensions(), context.getDeviceExtensions(), DE_TRUE);
+ const VkPhysicalDeviceFeatures2 deviceFeatures2 = deviceFeaturesAll.getCoreFeatures2();
+ int numErrors = 0;
+ bool isSubProcess = context.getTestContext().getCommandLine().isSubProcess();
+
+
+ VkPhysicalDeviceFeatures emptyDeviceFeatures;
+ deMemset(&emptyDeviceFeatures, 0, sizeof(emptyDeviceFeatures));
+
+ // Only non-core extensions will be used when creating the device.
+ vector<const char*> coreExtensions;
+ getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions);
+ vector<string> nonCoreExtensions(removeExtensions(context.getDeviceExtensions(), coreExtensions));
+
+ vector<const char*> extensionNames;
+ extensionNames.reserve(nonCoreExtensions.size());
+ for (const string& extension : nonCoreExtensions)
+ extensionNames.push_back(extension.c_str());
+
+ if (const void* featuresStruct = findStructureInChain(const_cast<const void*>(deviceFeatures2.pNext), getStructureType<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>()))
+ {
+ static const Feature features[] =
+ {
+ FEATURE_ITEM (VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM, multiviewPerViewViewports),
+ };
+ auto* supportedFeatures = reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM*>(featuresStruct);
+ checkFeatures(vkp, instance, instanceDriver, physicalDevice, 1, features, supportedFeatures, queueFamilyIndex, queueCount, queuePriority, numErrors, resultCollector, &extensionNames, emptyDeviceFeatures, isSubProcess);
+ }
+
+ if (numErrors > 0)
+ return tcu::TestStatus(resultCollector.getResult(), "Enabling unsupported features didn't return VK_ERROR_FEATURE_NOT_PRESENT.");
+ else
+ return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
+}
+
+
void addSeparateUnsupportedFeatureTests (tcu::TestCaseGroup* testGroup)
{
addFunctionCase(testGroup, "optical_flow_features_nv", "createDeviceWithUnsupportedFeaturesTestOpticalFlowFeaturesNV", createDeviceWithUnsupportedFeaturesTestOpticalFlowFeaturesNV);
addFunctionCase(testGroup, "fault_features_ext", "createDeviceWithUnsupportedFeaturesTestFaultFeaturesEXT", createDeviceWithUnsupportedFeaturesTestFaultFeaturesEXT);
addFunctionCase(testGroup, "shader_core_builtins_features_arm", "createDeviceWithUnsupportedFeaturesTestShaderCoreBuiltinsFeaturesARM", createDeviceWithUnsupportedFeaturesTestShaderCoreBuiltinsFeaturesARM);
+ addFunctionCase(testGroup, "swapchain_maintenance1_features_ext", "createDeviceWithUnsupportedFeaturesTestSwapchainMaintenance1FeaturesEXT", createDeviceWithUnsupportedFeaturesTestSwapchainMaintenance1FeaturesEXT);
addFunctionCase(testGroup, "ray_tracing_invocation_reorder_features_nv", "createDeviceWithUnsupportedFeaturesTestRayTracingInvocationReorderFeaturesNV", createDeviceWithUnsupportedFeaturesTestRayTracingInvocationReorderFeaturesNV);
+ addFunctionCase(testGroup, "multiview_per_view_viewports_features_qcom", "createDeviceWithUnsupportedFeaturesTestMultiviewPerViewViewportsFeaturesQCOM", createDeviceWithUnsupportedFeaturesTestMultiviewPerViewViewportsFeaturesQCOM);
}
template<> void initFeatureFromBlob<VkPhysicalDeviceOpticalFlowFeaturesNV>(VkPhysicalDeviceOpticalFlowFeaturesNV&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceFaultFeaturesEXT>(VkPhysicalDeviceFaultFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM>(VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV>(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>(VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM&, const AllFeaturesBlobs&) {}
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, 139}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDynamicRenderingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION, 138}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCornerSampledImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION, 137}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 136}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTextureCompressionASTCHDRFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION, 135}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceASTCDecodeFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, 134}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineRobustnessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT, VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION, 133}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION, 132}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderFloat16Int8Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION, 131}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice16BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION, 130}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION, 129}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImagelessFramebufferFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION, 128}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePerformanceQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION, 127}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVariablePointersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION, 126}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInlineUniformBlockFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION, 125}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION, 124}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION, 123}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION, 122}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, VK_KHR_RAY_QUERY_EXTENSION_NAME, VK_KHR_RAY_QUERY_SPEC_VERSION, 121}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION, 120}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION, 119}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorIndexingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 118}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION, 117}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShadingRateImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION, 116}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION, 115}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION, 114}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice8BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION, 113}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicInt64Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION, 112}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderClockFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION, 111}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION, 110}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION, 109}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION, 108}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION, 107}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION, 106}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExclusiveScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION, 105}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTimelineSemaphoreFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 104}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION, 103}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVulkanMemoryModelFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION, 102}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderTerminateInvocationFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION, 101}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION, 100}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceScalarBlockLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION, 99}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubgroupSizeControlFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, 98}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION, 97}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME, VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION, 96}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION, 95}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION, 94}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION, 93}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION, 92}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 91}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentWaitFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, VK_KHR_PRESENT_WAIT_EXTENSION_NAME, VK_KHR_PRESENT_WAIT_SPEC_VERSION, 90}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION, 89}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION, 88}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION, 87}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION, 86}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION, 85}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProvokingVertexFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, VK_EXT_PROVOKING_VERTEX_SPEC_VERSION, 84}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 83}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLineRasterizationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION, 82}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION, 81}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceHostQueryResetFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, 80}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION, 79}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION, 78}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION, 77}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION, 76}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION, 75}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION, 74}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION, 73}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerDotProductFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION, 72}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, 71}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION, 70}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRobustness2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, VK_EXT_ROBUSTNESS_2_SPEC_VERSION, 69}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION, 68}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentBarrierFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, VK_NV_PRESENT_BARRIER_EXTENSION_NAME, VK_NV_PRESENT_BARRIER_SPEC_VERSION, 67}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentIdFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, VK_KHR_PRESENT_ID_EXTENSION_NAME, VK_KHR_PRESENT_ID_SPEC_VERSION, 66}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrivateDataFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, VK_EXT_PRIVATE_DATA_EXTENSION_NAME, VK_EXT_PRIVATE_DATA_SPEC_VERSION, 65}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineCreationCacheControlFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION, 64}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION, 63}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSynchronization2Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION, 62}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorBufferFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, VK_EXT_DESCRIPTOR_BUFFER_SPEC_VERSION, 61}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_SPEC_VERSION, 60}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_SPEC_VERSION, 59}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION, 58}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_SPEC_VERSION, 57}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION, 56}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION, 55}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME, VK_NV_RAY_TRACING_MOTION_BLUR_SPEC_VERSION, 54}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, VK_EXT_MESH_SHADER_EXTENSION_NAME, VK_EXT_MESH_SHADER_SPEC_VERSION, 53}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME, VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION, 52}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION, 51}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageRobustnessFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION, 50}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION, 49}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageCompressionControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME, VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION, 48}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION, 47}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice4444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, VK_EXT_4444_FORMATS_EXTENSION_NAME, VK_EXT_4444_FORMATS_SPEC_VERSION, 46}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFaultFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, VK_EXT_DEVICE_FAULT_EXTENSION_NAME, VK_EXT_DEVICE_FAULT_SPEC_VERSION, 45}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME, VK_EXT_RGBA10X6_FORMATS_SPEC_VERSION, 44}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION, 43}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAddressBindingReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_SPEC_VERSION, 42}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_CONTROL_SPEC_VERSION, 41}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION, 40}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME, VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION, 39}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME, VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION, 38}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME, VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION, 37}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelinePropertiesFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME, VK_EXT_PIPELINE_PROPERTIES_SPEC_VERSION, 36}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION, 35}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION, 34}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME, VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION, 33}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME, VK_EXT_PRIMITIVES_GENERATED_QUERY_SPEC_VERSION, 32}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME, VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION, 31}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME, VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION, 30}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiDrawFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, VK_EXT_MULTI_DRAW_EXTENSION_NAME, VK_EXT_MULTI_DRAW_SPEC_VERSION, 29}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImage2DViewOf3DFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME, VK_EXT_IMAGE_2D_VIEW_OF_3D_SPEC_VERSION, 28}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceOpacityMicromapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME, VK_EXT_OPACITY_MICROMAP_SPEC_VERSION, 27}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME, VK_EXT_BORDER_COLOR_SWIZZLE_SPEC_VERSION, 26}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION, 25}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMaintenance4Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR, VK_KHR_MAINTENANCE_4_EXTENSION_NAME, VK_KHR_MAINTENANCE_4_SPEC_VERSION, 24}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_SPEC_VERSION, 23}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClampZeroOneFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT, VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME, VK_EXT_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION, 22}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION, 21}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION, 20}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCopyMemoryIndirectFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME, VK_NV_COPY_MEMORY_INDIRECT_SPEC_VERSION, 19}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryDecompressionFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME, VK_NV_MEMORY_DECOMPRESSION_SPEC_VERSION, 18}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLinearColorAttachmentFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME, VK_NV_LINEAR_COLOR_ATTACHMENT_SPEC_VERSION, 17}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION, 16}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageProcessingFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME, VK_QCOM_IMAGE_PROCESSING_SPEC_VERSION, 15}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicState3FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_3_SPEC_VERSION, 14}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME, VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION, 13}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION, 12}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION, 11}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceOpticalFlowFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, VK_NV_OPTICAL_FLOW_EXTENSION_NAME, VK_NV_OPTICAL_FLOW_SPEC_VERSION, 10}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLegacyDitheringFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, VK_EXT_LEGACY_DITHERING_EXTENSION_NAME, VK_EXT_LEGACY_DITHERING_SPEC_VERSION, 9}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineProtectedAccessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT, VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION, 8}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTilePropertiesFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME, VK_QCOM_TILE_PROPERTIES_SPEC_VERSION, 7}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAmigoProfilingFeaturesSEC>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, VK_SEC_AMIGO_PROFILING_EXTENSION_NAME, VK_SEC_AMIGO_PROFILING_SPEC_VERSION, 6}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, 141}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDynamicRenderingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION, 140}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCornerSampledImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION, 139}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 138}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTextureCompressionASTCHDRFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION, 137}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceASTCDecodeFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, 136}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineRobustnessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT, VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION, 135}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION, 134}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderFloat16Int8Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION, 133}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice16BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION, 132}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION, 131}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImagelessFramebufferFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION, 130}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePerformanceQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION, 129}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVariablePointersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION, 128}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInlineUniformBlockFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION, 127}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION, 126}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION, 125}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION, 124}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, VK_KHR_RAY_QUERY_EXTENSION_NAME, VK_KHR_RAY_QUERY_SPEC_VERSION, 123}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION, 122}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION, 121}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorIndexingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 120}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION, 119}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShadingRateImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION, 118}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION, 117}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION, 116}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice8BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION, 115}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicInt64Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION, 114}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderClockFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION, 113}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION, 112}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION, 111}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION, 110}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION, 109}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION, 108}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExclusiveScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION, 107}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTimelineSemaphoreFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 106}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION, 105}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVulkanMemoryModelFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION, 104}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderTerminateInvocationFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION, 103}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION, 102}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceScalarBlockLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION, 101}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubgroupSizeControlFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, 100}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION, 99}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME, VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION, 98}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION, 97}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION, 96}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION, 95}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION, 94}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 93}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentWaitFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, VK_KHR_PRESENT_WAIT_EXTENSION_NAME, VK_KHR_PRESENT_WAIT_SPEC_VERSION, 92}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION, 91}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION, 90}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION, 89}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION, 88}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION, 87}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProvokingVertexFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, VK_EXT_PROVOKING_VERTEX_SPEC_VERSION, 86}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 85}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLineRasterizationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION, 84}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION, 83}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceHostQueryResetFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, 82}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION, 81}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION, 80}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION, 79}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION, 78}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION, 77}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION, 76}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION, 75}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION, 74}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerDotProductFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION, 73}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, 72}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION, 71}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRobustness2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, VK_EXT_ROBUSTNESS_2_SPEC_VERSION, 70}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION, 69}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentBarrierFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, VK_NV_PRESENT_BARRIER_EXTENSION_NAME, VK_NV_PRESENT_BARRIER_SPEC_VERSION, 68}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePresentIdFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, VK_KHR_PRESENT_ID_EXTENSION_NAME, VK_KHR_PRESENT_ID_SPEC_VERSION, 67}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrivateDataFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, VK_EXT_PRIVATE_DATA_EXTENSION_NAME, VK_EXT_PRIVATE_DATA_SPEC_VERSION, 66}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineCreationCacheControlFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION, 65}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION, 64}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSynchronization2Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION, 63}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorBufferFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, VK_EXT_DESCRIPTOR_BUFFER_SPEC_VERSION, 62}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_SPEC_VERSION, 61}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_SPEC_VERSION, 60}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION, 59}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_SPEC_VERSION, 58}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION, 57}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION, 56}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME, VK_NV_RAY_TRACING_MOTION_BLUR_SPEC_VERSION, 55}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, VK_EXT_MESH_SHADER_EXTENSION_NAME, VK_EXT_MESH_SHADER_SPEC_VERSION, 54}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME, VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION, 53}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION, 52}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageRobustnessFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION, 51}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION, 50}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageCompressionControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME, VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION, 49}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION, 48}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice4444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, VK_EXT_4444_FORMATS_EXTENSION_NAME, VK_EXT_4444_FORMATS_SPEC_VERSION, 47}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFaultFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, VK_EXT_DEVICE_FAULT_EXTENSION_NAME, VK_EXT_DEVICE_FAULT_SPEC_VERSION, 46}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME, VK_EXT_RGBA10X6_FORMATS_SPEC_VERSION, 45}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION, 44}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAddressBindingReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_SPEC_VERSION, 43}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_CONTROL_SPEC_VERSION, 42}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION, 41}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME, VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION, 40}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME, VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION, 39}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME, VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION, 38}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelinePropertiesFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME, VK_EXT_PIPELINE_PROPERTIES_SPEC_VERSION, 37}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION, 36}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION, 35}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME, VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION, 34}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME, VK_EXT_PRIMITIVES_GENERATED_QUERY_SPEC_VERSION, 33}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME, VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION, 32}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME, VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION, 31}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiDrawFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, VK_EXT_MULTI_DRAW_EXTENSION_NAME, VK_EXT_MULTI_DRAW_SPEC_VERSION, 30}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImage2DViewOf3DFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME, VK_EXT_IMAGE_2D_VIEW_OF_3D_SPEC_VERSION, 29}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceOpacityMicromapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME, VK_EXT_OPACITY_MICROMAP_SPEC_VERSION, 28}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME, VK_EXT_BORDER_COLOR_SWIZZLE_SPEC_VERSION, 27}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION, 26}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMaintenance4Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR, VK_KHR_MAINTENANCE_4_EXTENSION_NAME, VK_KHR_MAINTENANCE_4_SPEC_VERSION, 25}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_SPEC_VERSION, 24}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClampZeroOneFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT, VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME, VK_EXT_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION, 23}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION, 22}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION, 21}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCopyMemoryIndirectFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME, VK_NV_COPY_MEMORY_INDIRECT_SPEC_VERSION, 20}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryDecompressionFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME, VK_NV_MEMORY_DECOMPRESSION_SPEC_VERSION, 19}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLinearColorAttachmentFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME, VK_NV_LINEAR_COLOR_ATTACHMENT_SPEC_VERSION, 18}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION, 17}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageProcessingFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME, VK_QCOM_IMAGE_PROCESSING_SPEC_VERSION, 16}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicState3FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_3_SPEC_VERSION, 15}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME, VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION, 14}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION, 13}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION, 12}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceOpticalFlowFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, VK_NV_OPTICAL_FLOW_EXTENSION_NAME, VK_NV_OPTICAL_FLOW_SPEC_VERSION, 11}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLegacyDitheringFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, VK_EXT_LEGACY_DITHERING_EXTENSION_NAME, VK_EXT_LEGACY_DITHERING_SPEC_VERSION, 10}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineProtectedAccessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT, VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION, 9}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTilePropertiesFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME, VK_QCOM_TILE_PROPERTIES_SPEC_VERSION, 8}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAmigoProfilingFeaturesSEC>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, VK_SEC_AMIGO_PROFILING_EXTENSION_NAME, VK_SEC_AMIGO_PROFILING_SPEC_VERSION, 7}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION, 6}; }
template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION, 5}; }
template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION, 4}; }
template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME, VK_ARM_SHADER_CORE_BUILTINS_SPEC_VERSION, 3}; }
{ createFeatureStructWrapper<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>, VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>, VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDevicePipelineProtectedAccessFeaturesEXT>, VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceTilePropertiesFeaturesQCOM>, VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME, VK_QCOM_TILE_PROPERTIES_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceAmigoProfilingFeaturesSEC>, VK_SEC_AMIGO_PROFILING_EXTENSION_NAME, VK_SEC_AMIGO_PROFILING_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV>, VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT>, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM>, VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME, VK_ARM_SHADER_CORE_BUILTINS_SPEC_VERSION },
return tcu::TestStatus::pass("Querying succeeded");
}
+tcu::TestStatus testPhysicalDeviceFeatureSwapchainMaintenance1FeaturesEXT (Context& context)
+{
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const CustomInstance instance (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+ const InstanceDriver& vki (instance.getDriver());
+ const int count = 2u;
+ TestLog& log = context.getTestContext().getLog();
+ VkPhysicalDeviceFeatures2 extFeatures;
+ vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL);
+
+ VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT deviceSwapchainMaintenance1FeaturesEXT[count];
+ const bool isSwapchainMaintenance1FeaturesEXT = checkExtension(properties, "VK_EXT_swapchain_maintenance1");
+
+ for (int ndx = 0; ndx < count; ++ndx)
+ {
+ deMemset(&deviceSwapchainMaintenance1FeaturesEXT[ndx], 0xFF * ndx, sizeof(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT));
+ deviceSwapchainMaintenance1FeaturesEXT[ndx].sType = isSwapchainMaintenance1FeaturesEXT ? VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT : VK_STRUCTURE_TYPE_MAX_ENUM;
+ deviceSwapchainMaintenance1FeaturesEXT[ndx].pNext = DE_NULL;
+
+ deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features));
+ extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ extFeatures.pNext = &deviceSwapchainMaintenance1FeaturesEXT[ndx];
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &extFeatures);
+ }
+
+ if (isSwapchainMaintenance1FeaturesEXT)
+ log << TestLog::Message << deviceSwapchainMaintenance1FeaturesEXT[0] << TestLog::EndMessage;
+
+ if (isSwapchainMaintenance1FeaturesEXT &&
+ (deviceSwapchainMaintenance1FeaturesEXT[0].swapchainMaintenance1 != deviceSwapchainMaintenance1FeaturesEXT[1].swapchainMaintenance1))
+ {
+ TCU_FAIL("Mismatch between VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT");
+ }
+ return tcu::TestStatus::pass("Querying succeeded");
+}
+
tcu::TestStatus createDeviceWithPromoted11Structures (Context& context)
{
if (!context.contextSupports(vk::ApiVersion(0, 1, 1, 0)))
addFunctionCase(testGroup, "depth_clamp_zero_one_features_ext", "VkPhysicalDeviceDepthClampZeroOneFeaturesEXT", testPhysicalDeviceFeatureDepthClampZeroOneFeaturesEXT);
addFunctionCase(testGroup, "address_binding_report_features_ext", "VkPhysicalDeviceAddressBindingReportFeaturesEXT", testPhysicalDeviceFeatureAddressBindingReportFeaturesEXT);
addFunctionCase(testGroup, "fault_features_ext", "VkPhysicalDeviceFaultFeaturesEXT", testPhysicalDeviceFeatureFaultFeaturesEXT);
+ addFunctionCase(testGroup, "swapchain_maintenance1_features_ext", "VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT", testPhysicalDeviceFeatureSwapchainMaintenance1FeaturesEXT);
addFunctionCase(testGroup, "create_device_with_promoted11_structures", "", createDeviceWithPromoted11Structures);
addFunctionCase(testGroup, "create_device_with_promoted12_structures", "", createDeviceWithPromoted12Structures);
addFunctionCase(testGroup, "create_device_with_promoted13_structures", "", createDeviceWithPromoted13Structures);
const vk::VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& getExtendedDynamicStateFeaturesEXT (void) const;
const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const;
const vk::VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT& getShaderAtomicFloat2FeaturesEXT (void) const;
+const vk::VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT& getSwapchainMaintenance1FeaturesEXT (void) const;
const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures& getShaderDemoteToHelperInvocationFeatures (void) const;
const vk::VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV& getDeviceGeneratedCommandsFeatures (void) const;
const vk::VkPhysicalDeviceInheritedViewportScissorFeaturesNV& getInheritedViewportScissorFeatures (void) const;
const vk::VkPhysicalDevicePipelineProtectedAccessFeaturesEXT& getPipelineProtectedAccessFeaturesEXT (void) const;
const vk::VkPhysicalDeviceTilePropertiesFeaturesQCOM& getTilePropertiesFeaturesQCOM (void) const;
const vk::VkPhysicalDeviceAmigoProfilingFeaturesSEC& getAmigoProfilingFeaturesSEC (void) const;
+const vk::VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM& getMultiviewPerViewViewportsFeaturesQCOM (void) const;
const vk::VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV& getRayTracingInvocationReorderFeatures (void) const;
const vk::VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT& getMutableDescriptorTypeFeaturesEXT (void) const;
const vk::VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM& getShaderCoreBuiltinsFeaturesARM (void) const;
const vk::VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& Context::getExtendedDynamicStateFeaturesEXT (void) const { return m_device->getExtendedDynamicStateFeaturesEXT(); }
const vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& Context::getPipelineExecutablePropertiesFeatures (void) const { return m_device->getPipelineExecutablePropertiesFeatures(); }
const vk::VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT& Context::getShaderAtomicFloat2FeaturesEXT (void) const { return m_device->getShaderAtomicFloat2FeaturesEXT(); }
+const vk::VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT& Context::getSwapchainMaintenance1FeaturesEXT (void) const { return m_device->getSwapchainMaintenance1FeaturesEXT(); }
const vk::VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures& Context::getShaderDemoteToHelperInvocationFeatures (void) const { return m_device->getShaderDemoteToHelperInvocationFeatures(); }
const vk::VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV& Context::getDeviceGeneratedCommandsFeatures (void) const { return m_device->getDeviceGeneratedCommandsFeatures(); }
const vk::VkPhysicalDeviceInheritedViewportScissorFeaturesNV& Context::getInheritedViewportScissorFeatures (void) const { return m_device->getInheritedViewportScissorFeatures(); }
const vk::VkPhysicalDevicePipelineProtectedAccessFeaturesEXT& Context::getPipelineProtectedAccessFeaturesEXT (void) const { return m_device->getPipelineProtectedAccessFeaturesEXT(); }
const vk::VkPhysicalDeviceTilePropertiesFeaturesQCOM& Context::getTilePropertiesFeaturesQCOM (void) const { return m_device->getTilePropertiesFeaturesQCOM(); }
const vk::VkPhysicalDeviceAmigoProfilingFeaturesSEC& Context::getAmigoProfilingFeaturesSEC (void) const { return m_device->getAmigoProfilingFeaturesSEC(); }
+const vk::VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM& Context::getMultiviewPerViewViewportsFeaturesQCOM (void) const { return m_device->getMultiviewPerViewViewportsFeaturesQCOM(); }
const vk::VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV& Context::getRayTracingInvocationReorderFeatures (void) const { return m_device->getRayTracingInvocationReorderFeatures(); }
const vk::VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT& Context::getMutableDescriptorTypeFeaturesEXT (void) const { return m_device->getMutableDescriptorTypeFeaturesEXT(); }
const vk::VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM& Context::getShaderCoreBuiltinsFeaturesARM (void) const { return m_device->getShaderCoreBuiltinsFeaturesARM(); }
const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& getExtendedDynamicStateFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(); }
const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR& getPipelineExecutablePropertiesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(); }
const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT& getShaderAtomicFloat2FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(); }
+const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT& getSwapchainMaintenance1FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>(); }
const VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures& getShaderDemoteToHelperInvocationFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>(); }
const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV& getDeviceGeneratedCommandsFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(); }
const VkPhysicalDeviceInheritedViewportScissorFeaturesNV& getInheritedViewportScissorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(); }
const VkPhysicalDevicePipelineProtectedAccessFeaturesEXT& getPipelineProtectedAccessFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDevicePipelineProtectedAccessFeaturesEXT>(); }
const VkPhysicalDeviceTilePropertiesFeaturesQCOM& getTilePropertiesFeaturesQCOM (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceTilePropertiesFeaturesQCOM>(); }
const VkPhysicalDeviceAmigoProfilingFeaturesSEC& getAmigoProfilingFeaturesSEC (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceAmigoProfilingFeaturesSEC>(); }
+const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM& getMultiviewPerViewViewportsFeaturesQCOM (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>(); }
const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV& getRayTracingInvocationReorderFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV>(); }
const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT& getMutableDescriptorTypeFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT>(); }
const VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM& getShaderCoreBuiltinsFeaturesARM (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM>(); }
BindOpticalFlowSessionImageNVFunc bindOpticalFlowSessionImageNV;
CmdOpticalFlowExecuteNVFunc cmdOpticalFlowExecuteNV;
GetDeviceFaultInfoEXTFunc getDeviceFaultInfoEXT;
+ReleaseSwapchainImagesEXTFunc releaseSwapchainImagesEXT;
{
return;
}
- if (extName == "VK_EXT_video_decode_h264")
+ if (extName == "VK_KHR_video_decode_h264")
{
return;
}
{
return;
}
- if (extName == "VK_EXT_video_decode_h265")
+ if (extName == "VK_KHR_video_decode_h265")
{
return;
}
{
return;
}
+ if (extName == "VK_EXT_surface_maintenance1")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_swapchain_maintenance1")
+ {
+ return;
+ }
if (extName == "VK_EXT_shader_demote_to_helper_invocation")
{
return;
{
return;
}
+ if (extName == "VK_LUNARG_direct_driver_loading")
+ {
+ return;
+ }
if (extName == "VK_EXT_shader_module_identifier")
{
return;
{
return;
}
+ if (extName == "VK_QCOM_multiview_per_view_viewports")
+ {
+ return;
+ }
if (extName == "VK_NV_ray_tracing_invocation_reorder")
{
return;
{
return;
}
- if (extName == "VK_EXT_video_decode_h264")
+ if (extName == "VK_KHR_video_decode_h264")
{
return;
}
{
return;
}
- if (extName == "VK_EXT_video_decode_h265")
+ if (extName == "VK_KHR_video_decode_h265")
{
return;
}
{
return;
}
+ if (extName == "VK_EXT_surface_maintenance1")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_swapchain_maintenance1")
+ {
+ functions.push_back("vkReleaseSwapchainImagesEXT");
+ return;
+ }
if (extName == "VK_EXT_shader_demote_to_helper_invocation")
{
return;
{
return;
}
+ if (extName == "VK_LUNARG_direct_driver_loading")
+ {
+ return;
+ }
if (extName == "VK_EXT_shader_module_identifier")
{
functions.push_back("vkGetShaderModuleIdentifierEXT");
{
return;
}
+ if (extName == "VK_QCOM_multiview_per_view_viewports")
+ {
+ return;
+ }
if (extName == "VK_NV_ray_tracing_invocation_reorder")
{
return;
"VK_KHR_surface_protected_capabilities",
"VK_EXT_validation_features",
"VK_EXT_headless_surface",
+ "VK_EXT_surface_maintenance1",
"VK_EXT_acquire_drm_display",
"VK_QNX_screen_surface",
"VK_KHR_portability_enumeration",
"VK_GOOGLE_surfaceless_query",
+ "VK_LUNARG_direct_driver_loading",
};
::std::string deviceExtensionNames[] =
"VK_AMD_shader_ballot",
"VK_EXT_video_encode_h264",
"VK_EXT_video_encode_h265",
- "VK_EXT_video_decode_h264",
+ "VK_KHR_video_decode_h264",
"VK_AMD_texture_gather_bias_lod",
"VK_AMD_shader_info",
"VK_KHR_dynamic_rendering",
"VK_AMD_pipeline_compiler_control",
"VK_EXT_calibrated_timestamps",
"VK_AMD_shader_core_properties",
- "VK_EXT_video_decode_h265",
+ "VK_KHR_video_decode_h265",
"VK_KHR_global_priority",
"VK_AMD_memory_overallocation_behavior",
"VK_EXT_vertex_attribute_divisor",
"VK_KHR_deferred_host_operations",
"VK_KHR_pipeline_executable_properties",
"VK_EXT_shader_atomic_float2",
+ "VK_EXT_swapchain_maintenance1",
"VK_EXT_shader_demote_to_helper_invocation",
"VK_NV_device_generated_commands",
"VK_NV_inherited_viewport_scissor",
"VK_EXT_pipeline_protected_access",
"VK_QCOM_tile_properties",
"VK_SEC_amigo_profiling",
+ "VK_QCOM_multiview_per_view_viewports",
"VK_NV_ray_tracing_invocation_reorder",
"VK_EXT_mutable_descriptor_type",
"VK_ARM_shader_core_builtins",
typedef VKAPI_ATTR VkResult (VKAPI_CALL* BindOpticalFlowSessionImageNVFunc) (VkDevice device, VkOpticalFlowSessionNV session, VkOpticalFlowSessionBindingPointNV bindingPoint, VkImageView view, VkImageLayout layout);
typedef VKAPI_ATTR void (VKAPI_CALL* CmdOpticalFlowExecuteNVFunc) (VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetDeviceFaultInfoEXTFunc) (VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* ReleaseSwapchainImagesEXTFunc) (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo);
return VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264ProfileInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264ProfileInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264CapabilitiesEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264CapabilitiesKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersAddInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersAddInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersCreateInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersCreateInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264PictureInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264PictureInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH264DpbSlotInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH264DpbSlotInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265ProfileInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265ProfileInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265CapabilitiesEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265CapabilitiesKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersAddInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersAddInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersCreateInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersCreateInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265PictureInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265PictureInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR;
}
-template<> VkStructureType getStructureType<VkVideoDecodeH265DpbSlotInfoEXT> (void)
+template<> VkStructureType getStructureType<VkVideoDecodeH265DpbSlotInfoKHR> (void)
{
- return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT;
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR;
}
template<> VkStructureType getStructureType<VkVideoSessionCreateInfoKHR> (void)
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM;
}
+template<> VkStructureType getStructureType<VkSurfacePresentModeEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSurfacePresentScalingCapabilitiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSurfacePresentModeCompatibilityEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSwapchainPresentFenceInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSwapchainPresentModesCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSwapchainPresentModeInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkSwapchainPresentScalingCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkReleaseSwapchainImagesInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV;
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV;
}
+template<> VkStructureType getStructureType<VkDirectDriverLoadingInfoLUNARG> (void)
+{
+ return VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
+}
+
+template<> VkStructureType getStructureType<VkDirectDriverLoadingListLUNARG> (void)
+{
+ return VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM;
+}
+
m_vk.bindOpticalFlowSessionImageNV = (BindOpticalFlowSessionImageNVFunc) GET_PROC_ADDR("vkBindOpticalFlowSessionImageNV");
m_vk.cmdOpticalFlowExecuteNV = (CmdOpticalFlowExecuteNVFunc) GET_PROC_ADDR("vkCmdOpticalFlowExecuteNV");
m_vk.getDeviceFaultInfoEXT = (GetDeviceFaultInfoEXTFunc) GET_PROC_ADDR("vkGetDeviceFaultInfoEXT");
+m_vk.releaseSwapchainImagesEXT = (ReleaseSwapchainImagesEXTFunc) GET_PROC_ADDR("vkReleaseSwapchainImagesEXT");
return VK_SUCCESS;
}
+VKAPI_ATTR VkResult VKAPI_CALL releaseSwapchainImagesEXT (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pReleaseInfo);
+ return VK_SUCCESS;
+}
+
static const tcu::StaticFunctionLibrary::Entry s_platformFunctions[] =
{
VK_NULL_FUNC_ENTRY(vkCreateInstance, createInstance),
VK_NULL_FUNC_ENTRY(vkBindOpticalFlowSessionImageNV, bindOpticalFlowSessionImageNV),
VK_NULL_FUNC_ENTRY(vkCmdOpticalFlowExecuteNV, cmdOpticalFlowExecuteNV),
VK_NULL_FUNC_ENTRY(vkGetDeviceFaultInfoEXT, getDeviceFaultInfoEXT),
+ VK_NULL_FUNC_ENTRY(vkReleaseSwapchainImagesEXT, releaseSwapchainImagesEXT),
};
const char* getOpacityMicromapFormatEXTName (VkOpacityMicromapFormatEXT value);
const char* getOpacityMicromapSpecialIndexEXTName (VkOpacityMicromapSpecialIndexEXT value);
const char* getDeviceFaultVendorBinaryHeaderVersionEXTName (VkDeviceFaultVendorBinaryHeaderVersionEXT value);
+const char* getDirectDriverLoadingModeLUNARGName (VkDirectDriverLoadingModeLUNARG value);
const char* getColorSpaceKHRName (VkColorSpaceKHR value);
const char* getPresentModeKHRName (VkPresentModeKHR value);
const char* getDebugReportObjectTypeEXTName (VkDebugReportObjectTypeEXT value);
inline tcu::Format::Enum<VkOpacityMicromapFormatEXT> getOpacityMicromapFormatEXTStr (VkOpacityMicromapFormatEXT value) { return tcu::Format::Enum<VkOpacityMicromapFormatEXT>(getOpacityMicromapFormatEXTName, value); }
inline tcu::Format::Enum<VkOpacityMicromapSpecialIndexEXT> getOpacityMicromapSpecialIndexEXTStr (VkOpacityMicromapSpecialIndexEXT value) { return tcu::Format::Enum<VkOpacityMicromapSpecialIndexEXT>(getOpacityMicromapSpecialIndexEXTName, value); }
inline tcu::Format::Enum<VkDeviceFaultVendorBinaryHeaderVersionEXT> getDeviceFaultVendorBinaryHeaderVersionEXTStr (VkDeviceFaultVendorBinaryHeaderVersionEXT value) { return tcu::Format::Enum<VkDeviceFaultVendorBinaryHeaderVersionEXT>(getDeviceFaultVendorBinaryHeaderVersionEXTName, value); }
+inline tcu::Format::Enum<VkDirectDriverLoadingModeLUNARG> getDirectDriverLoadingModeLUNARGStr (VkDirectDriverLoadingModeLUNARG value) { return tcu::Format::Enum<VkDirectDriverLoadingModeLUNARG>(getDirectDriverLoadingModeLUNARGName, value); }
inline tcu::Format::Enum<VkColorSpaceKHR> getColorSpaceKHRStr (VkColorSpaceKHR value) { return tcu::Format::Enum<VkColorSpaceKHR>(getColorSpaceKHRName, value); }
inline tcu::Format::Enum<VkPresentModeKHR> getPresentModeKHRStr (VkPresentModeKHR value) { return tcu::Format::Enum<VkPresentModeKHR>(getPresentModeKHRName, value); }
inline tcu::Format::Enum<VkDebugReportObjectTypeEXT> getDebugReportObjectTypeEXTStr (VkDebugReportObjectTypeEXT value) { return tcu::Format::Enum<VkDebugReportObjectTypeEXT>(getDebugReportObjectTypeEXTName, value); }
inline std::ostream& operator<< (std::ostream& s, VkOpacityMicromapFormatEXT value) { return s << getOpacityMicromapFormatEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkOpacityMicromapSpecialIndexEXT value) { return s << getOpacityMicromapSpecialIndexEXTStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkDeviceFaultVendorBinaryHeaderVersionEXT value) { return s << getDeviceFaultVendorBinaryHeaderVersionEXTStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkDirectDriverLoadingModeLUNARG value) { return s << getDirectDriverLoadingModeLUNARGStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkColorSpaceKHR value) { return s << getColorSpaceKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkPresentModeKHR value) { return s << getPresentModeKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkDebugReportObjectTypeEXT value) { return s << getDebugReportObjectTypeEXTStr(value); }
tcu::Format::Bitfield<64> getMemoryDecompressionMethodFlagsNVStr (VkMemoryDecompressionMethodFlagsNV value);
tcu::Format::Bitfield<32> getBuildMicromapFlagsEXTStr (VkBuildMicromapFlagsEXT value);
tcu::Format::Bitfield<32> getMicromapCreateFlagsEXTStr (VkMicromapCreateFlagsEXT value);
+tcu::Format::Bitfield<32> getDirectDriverLoadingFlagsLUNARGStr (VkDirectDriverLoadingFlagsLUNARG value);
tcu::Format::Bitfield<32> getCompositeAlphaFlagsKHRStr (VkCompositeAlphaFlagsKHR value);
tcu::Format::Bitfield<32> getDisplayPlaneAlphaFlagsKHRStr (VkDisplayPlaneAlphaFlagsKHR value);
tcu::Format::Bitfield<32> getSurfaceTransformFlagsKHRStr (VkSurfaceTransformFlagsKHR value);
tcu::Format::Bitfield<32> getOpticalFlowUsageFlagsNVStr (VkOpticalFlowUsageFlagsNV value);
tcu::Format::Bitfield<32> getOpticalFlowSessionCreateFlagsNVStr (VkOpticalFlowSessionCreateFlagsNV value);
tcu::Format::Bitfield<32> getOpticalFlowExecuteFlagsNVStr (VkOpticalFlowExecuteFlagsNV value);
+tcu::Format::Bitfield<32> getPresentScalingFlagsEXTStr (VkPresentScalingFlagsEXT value);
+tcu::Format::Bitfield<32> getPresentGravityFlagsEXTStr (VkPresentGravityFlagsEXT value);
tcu::Format::Bitfield<32> getVideoCodecOperationFlagsKHRStr (VkVideoCodecOperationFlagsKHR value);
tcu::Format::Bitfield<32> getVideoCapabilityFlagsKHRStr (VkVideoCapabilityFlagsKHR value);
tcu::Format::Bitfield<32> getVideoSessionCreateFlagsKHRStr (VkVideoSessionCreateFlagsKHR value);
tcu::Format::Bitfield<32> getVideoDecodeUsageFlagsKHRStr (VkVideoDecodeUsageFlagsKHR value);
tcu::Format::Bitfield<32> getVideoDecodeCapabilityFlagsKHRStr (VkVideoDecodeCapabilityFlagsKHR value);
tcu::Format::Bitfield<32> getVideoDecodeFlagsKHRStr (VkVideoDecodeFlagsKHR value);
-tcu::Format::Bitfield<32> getVideoDecodeH264PictureLayoutFlagsEXTStr (VkVideoDecodeH264PictureLayoutFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoDecodeH264PictureLayoutFlagsKHRStr (VkVideoDecodeH264PictureLayoutFlagsKHR value);
tcu::Format::Bitfield<32> getVideoEncodeFlagsKHRStr (VkVideoEncodeFlagsKHR value);
tcu::Format::Bitfield<32> getVideoEncodeUsageFlagsKHRStr (VkVideoEncodeUsageFlagsKHR value);
tcu::Format::Bitfield<32> getVideoEncodeContentFlagsKHRStr (VkVideoEncodeContentFlagsKHR value);
std::ostream& operator<< (std::ostream& s, const VkVideoDecodeCapabilitiesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkVideoDecodeUsageInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkVideoDecodeInfoKHR& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoEXT& value);
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkVideoSessionCreateInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersCreateInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersUpdateInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkDecompressMemoryRegionNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM& value);
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentModeEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentScalingCapabilitiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentModeCompatibilityEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentFenceInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentModesCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentModeInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentScalingCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkReleaseSwapchainImagesInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV& value);
+std::ostream& operator<< (std::ostream& s, const VkDirectDriverLoadingInfoLUNARG& value);
+std::ostream& operator<< (std::ostream& s, const VkDirectDriverLoadingListLUNARG& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM& value);
std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsVuiFlags& value);
std::ostream& operator<< (std::ostream& s, const StdVideoH264HrdParameters& value);
std::ostream& operator<< (std::ostream& s, const StdVideoH264SequenceParameterSetVui& value);
case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT";
case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT";
case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR";
case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: return "VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD";
case VK_STRUCTURE_TYPE_RENDERING_INFO: return "VK_STRUCTURE_TYPE_RENDERING_INFO";
case VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO: return "VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO";
case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD";
case VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT: return "VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT";
- case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR";
case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR";
case VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR: return "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT: return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT";
+ case VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT";
+ case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT: return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT: return "VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV";
case VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT: return "VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT";
case VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG: return "VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG";
+ case VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG: return "VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM: return "VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC";
case VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC: return "VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM";
return tcu::Format::Bitfield<64>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+const char* getDirectDriverLoadingModeLUNARGName (VkDirectDriverLoadingModeLUNARG value)
+{
+ switch (value)
+ {
+ case VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG: return "VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG";
+ case VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG: return "VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG";
+ default: return DE_NULL;
+ }
+}
+
const char* getColorSpaceKHRName (VkColorSpaceKHR value)
{
switch (value)
tcu::Format::BitDesc(VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR, "VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR"),
tcu::Format::BitDesc(VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR, "VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR"),
tcu::Format::BitDesc(VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR, "VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT, "VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
}
}
+tcu::Format::Bitfield<32> getPresentScalingFlagsEXTStr (VkPresentScalingFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT, "VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT, "VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PRESENT_SCALING_STRETCH_BIT_EXT, "VK_PRESENT_SCALING_STRETCH_BIT_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getPresentGravityFlagsEXTStr (VkPresentGravityFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_PRESENT_GRAVITY_MIN_BIT_EXT, "VK_PRESENT_GRAVITY_MIN_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PRESENT_GRAVITY_MAX_BIT_EXT, "VK_PRESENT_GRAVITY_MAX_BIT_EXT"),
+ tcu::Format::BitDesc(VK_PRESENT_GRAVITY_CENTERED_BIT_EXT, "VK_PRESENT_GRAVITY_CENTERED_BIT_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
const char* getVendorIdName (VkVendorId value)
{
switch (value)
static const tcu::Format::BitDesc s_desc[] =
{
tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_NONE_KHR, "VK_VIDEO_CODEC_OPERATION_NONE_KHR"),
- tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT"),
- tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR, "VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR, "VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR"),
tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT"),
tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
-tcu::Format::Bitfield<32> getVideoDecodeH264PictureLayoutFlagsEXTStr (VkVideoDecodeH264PictureLayoutFlagsEXT value)
+tcu::Format::Bitfield<32> getVideoDecodeH264PictureLayoutFlagsKHRStr (VkVideoDecodeH264PictureLayoutFlagsKHR value)
{
static const tcu::Format::BitDesc s_desc[] =
{
- tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT"),
- tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT"),
- tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR, "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
}
+tcu::Format::Bitfield<32> getDirectDriverLoadingFlagsLUNARGStr (VkDirectDriverLoadingFlagsLUNARG value)
+{
+ return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
+}
+
tcu::Format::Bitfield<32> getDisplayModeCreateFlagsKHRStr (VkDisplayModeCreateFlagsKHR value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileInfoKHR& value)
{
- s << "VkVideoDecodeH264ProfileInfoEXT = {\n";
+ s << "VkVideoDecodeH264ProfileInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tstdProfileIdc = " << value.stdProfileIdc << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesKHR& value)
{
- s << "VkVideoDecodeH264CapabilitiesEXT = {\n";
+ s << "VkVideoDecodeH264CapabilitiesKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tmaxLevelIdc = " << value.maxLevelIdc << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoKHR& value)
{
- s << "VkVideoDecodeH264SessionParametersAddInfoEXT = {\n";
+ s << "VkVideoDecodeH264SessionParametersAddInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tstdSPSCount = " << value.stdSPSCount << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoKHR& value)
{
- s << "VkVideoDecodeH264SessionParametersCreateInfoEXT = {\n";
+ s << "VkVideoDecodeH264SessionParametersCreateInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tmaxStdSPSCount = " << value.maxStdSPSCount << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoKHR& value)
{
- s << "VkVideoDecodeH264PictureInfoEXT = {\n";
+ s << "VkVideoDecodeH264PictureInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tpStdPictureInfo = " << value.pStdPictureInfo << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoKHR& value)
{
- s << "VkVideoDecodeH264DpbSlotInfoEXT = {\n";
+ s << "VkVideoDecodeH264DpbSlotInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tpStdReferenceInfo = " << value.pStdReferenceInfo << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileInfoKHR& value)
{
- s << "VkVideoDecodeH265ProfileInfoEXT = {\n";
+ s << "VkVideoDecodeH265ProfileInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tstdProfileIdc = " << value.stdProfileIdc << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesKHR& value)
{
- s << "VkVideoDecodeH265CapabilitiesEXT = {\n";
+ s << "VkVideoDecodeH265CapabilitiesKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tmaxLevelIdc = " << value.maxLevelIdc << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoKHR& value)
{
- s << "VkVideoDecodeH265SessionParametersAddInfoEXT = {\n";
+ s << "VkVideoDecodeH265SessionParametersAddInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tstdVPSCount = " << value.stdVPSCount << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoKHR& value)
{
- s << "VkVideoDecodeH265SessionParametersCreateInfoEXT = {\n";
+ s << "VkVideoDecodeH265SessionParametersCreateInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tmaxStdVPSCount = " << value.maxStdVPSCount << '\n';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoKHR& value)
{
- s << "VkVideoDecodeH265PictureInfoEXT = {\n";
+ s << "VkVideoDecodeH265PictureInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tpStdPictureInfo = " << value.pStdPictureInfo << '\n';
- s << "\tsliceCount = " << value.sliceCount << '\n';
- s << "\tpSliceOffsets = " << value.pSliceOffsets << '\n';
+ s << "\tsliceSegmentCount = " << value.sliceSegmentCount << '\n';
+ s << "\tpSliceSegmentOffsets = " << value.pSliceSegmentOffsets << '\n';
s << '}';
return s;
}
-std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoEXT& value)
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoKHR& value)
{
- s << "VkVideoDecodeH265DpbSlotInfoEXT = {\n";
+ s << "VkVideoDecodeH265DpbSlotInfoKHR = {\n";
s << "\tsType = " << value.sType << '\n';
s << "\tpNext = " << value.pNext << '\n';
s << "\tpStdReferenceInfo = " << value.pStdReferenceInfo << '\n';
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentModeEXT& value)
+{
+ s << "VkSurfacePresentModeEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpresentMode = " << value.presentMode << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentScalingCapabilitiesEXT& value)
+{
+ s << "VkSurfacePresentScalingCapabilitiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsupportedPresentScaling = " << getPresentScalingFlagsEXTStr(value.supportedPresentScaling) << '\n';
+ s << "\tsupportedPresentGravityX = " << getPresentGravityFlagsEXTStr(value.supportedPresentGravityX) << '\n';
+ s << "\tsupportedPresentGravityY = " << getPresentGravityFlagsEXTStr(value.supportedPresentGravityY) << '\n';
+ s << "\tminScaledImageExtent = " << value.minScaledImageExtent << '\n';
+ s << "\tmaxScaledImageExtent = " << value.maxScaledImageExtent << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSurfacePresentModeCompatibilityEXT& value)
+{
+ s << "VkSurfacePresentModeCompatibilityEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpresentModeCount = " << value.presentModeCount << '\n';
+ s << "\tpPresentModes = " << value.pPresentModes << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tswapchainMaintenance1 = " << value.swapchainMaintenance1 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentFenceInfoEXT& value)
+{
+ s << "VkSwapchainPresentFenceInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tswapchainCount = " << value.swapchainCount << '\n';
+ s << "\tpFences = " << value.pFences << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentModesCreateInfoEXT& value)
+{
+ s << "VkSwapchainPresentModesCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpresentModeCount = " << value.presentModeCount << '\n';
+ s << "\tpPresentModes = " << value.pPresentModes << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentModeInfoEXT& value)
+{
+ s << "VkSwapchainPresentModeInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tswapchainCount = " << value.swapchainCount << '\n';
+ s << "\tpPresentModes = " << value.pPresentModes << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSwapchainPresentScalingCreateInfoEXT& value)
+{
+ s << "VkSwapchainPresentScalingCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tscalingBehavior = " << getPresentScalingFlagsEXTStr(value.scalingBehavior) << '\n';
+ s << "\tpresentGravityX = " << getPresentGravityFlagsEXTStr(value.presentGravityX) << '\n';
+ s << "\tpresentGravityY = " << getPresentGravityFlagsEXTStr(value.presentGravityY) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkReleaseSwapchainImagesInfoEXT& value)
+{
+ s << "VkReleaseSwapchainImagesInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tswapchain = " << value.swapchain << '\n';
+ s << "\timageIndexCount = " << value.imageIndexCount << '\n';
+ s << "\tpImageIndices = " << value.pImageIndices << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV& value)
{
s << "VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV = {\n";
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkDirectDriverLoadingInfoLUNARG& value)
+{
+ s << "VkDirectDriverLoadingInfoLUNARG = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getDirectDriverLoadingFlagsLUNARGStr(value.flags) << '\n';
+ s << "\tpfnGetInstanceProcAddr = " << value.pfnGetInstanceProcAddr << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDirectDriverLoadingListLUNARG& value)
+{
+ s << "VkDirectDriverLoadingListLUNARG = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmode = " << value.mode << '\n';
+ s << "\tdriverCount = " << value.driverCount << '\n';
+ s << "\tpDrivers = " << value.pDrivers << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM& value)
+{
+ s << "VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmultiviewPerViewViewports = " << value.multiviewPerViewViewports << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsVuiFlags& value)
{
s << "StdVideoH264SpsVuiFlags = {\n";
struct VkPhysicalDeviceVideoFormatInfoKHR
{
- VkStructureType sType;
+ VkStructureType sType;
const void* pNext;
VkImageUsageFlags imageUsage;
};
const VkVideoReferenceSlotInfoKHR* pReferenceSlots;
};
-struct VkVideoDecodeH264ProfileInfoEXT
+struct VkVideoDecodeH264ProfileInfoKHR
{
VkStructureType sType;
const void* pNext;
StdVideoH264ProfileIdc stdProfileIdc;
- VkVideoDecodeH264PictureLayoutFlagBitsEXT pictureLayout;
+ VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout;
};
-struct VkVideoDecodeH264CapabilitiesEXT
+struct VkVideoDecodeH264CapabilitiesKHR
{
VkStructureType sType;
void* pNext;
VkOffset2D fieldOffsetGranularity;
};
-struct VkVideoDecodeH265ProfileInfoEXT
+struct VkVideoDecodeH265ProfileInfoKHR
{
VkStructureType sType;
const void* pNext;
StdVideoH265ProfileIdc stdProfileIdc;
};
-struct VkVideoDecodeH265CapabilitiesEXT
+struct VkVideoDecodeH265CapabilitiesKHR
{
VkStructureType sType;
void* pNext;
const VkDescriptorAddressInfoEXT* pStorageTexelBuffer;
const VkDescriptorAddressInfoEXT* pUniformBuffer;
const VkDescriptorAddressInfoEXT* pStorageBuffer;
- VkDeviceAddress accelerationStructure;
+ VkDeviceAddress accelerationStructure;
};
struct VkDescriptorGetInfoEXT
VkBool32 shaderCoreBuiltins;
};
+struct VkSurfacePresentModeEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkPresentModeKHR presentMode;
+};
+
+struct VkSurfacePresentScalingCapabilitiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkPresentScalingFlagsEXT supportedPresentScaling;
+ VkPresentGravityFlagsEXT supportedPresentGravityX;
+ VkPresentGravityFlagsEXT supportedPresentGravityY;
+ VkExtent2D minScaledImageExtent;
+ VkExtent2D maxScaledImageExtent;
+};
+
+struct VkSurfacePresentModeCompatibilityEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ uint32_t presentModeCount;
+ VkPresentModeKHR* pPresentModes;
+};
+
+struct VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 swapchainMaintenance1;
+};
+
+struct VkSwapchainPresentFenceInfoEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ uint32_t swapchainCount;
+ const VkFence* pFences;
+};
+
+struct VkSwapchainPresentModesCreateInfoEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ uint32_t presentModeCount;
+ const VkPresentModeKHR* pPresentModes;
+};
+
+struct VkSwapchainPresentModeInfoEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ uint32_t swapchainCount;
+ const VkPresentModeKHR* pPresentModes;
+};
+
+struct VkSwapchainPresentScalingCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkPresentScalingFlagsEXT scalingBehavior;
+ VkPresentGravityFlagsEXT presentGravityX;
+ VkPresentGravityFlagsEXT presentGravityY;
+};
+
+struct VkReleaseSwapchainImagesInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSwapchainKHR swapchain;
+ uint32_t imageIndexCount;
+ const uint32_t* pImageIndices;
+};
+
struct VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV
{
VkStructureType sType;
VkRayTracingInvocationReorderModeNV rayTracingInvocationReorderReorderingHint;
};
+struct VkDirectDriverLoadingInfoLUNARG
+{
+ VkStructureType sType;
+ void* pNext;
+ VkDirectDriverLoadingFlagsLUNARG flags;
+ PFN_vkGetInstanceProcAddrLUNARG pfnGetInstanceProcAddr;
+};
+
+struct VkDirectDriverLoadingListLUNARG
+{
+ VkStructureType sType;
+ void* pNext;
+ VkDirectDriverLoadingModeLUNARG mode;
+ uint32_t driverCount;
+ const VkDirectDriverLoadingInfoLUNARG* pDrivers;
+};
+
+struct VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 multiviewPerViewViewports;
+};
+
struct StdVideoH264SpsVuiFlags
{
uint32_t aspect_ratio_info_present_flag:1;
const StdVideoH264ScalingLists* pScalingLists;
};
-struct VkVideoDecodeH264SessionParametersAddInfoEXT
+struct VkVideoDecodeH264SessionParametersAddInfoKHR
{
VkStructureType sType;
const void* pNext;
uint32_t complementary_field_pair:1;
};
-struct VkVideoDecodeH264SessionParametersCreateInfoEXT
+struct VkVideoDecodeH264SessionParametersCreateInfoKHR
{
VkStructureType sType;
const void* pNext;
uint32_t maxStdSPSCount;
uint32_t maxStdPPSCount;
- const VkVideoDecodeH264SessionParametersAddInfoEXT* pParametersAddInfo;
+ const VkVideoDecodeH264SessionParametersAddInfoKHR* pParametersAddInfo;
};
struct VkVideoEncodeH264SessionParametersCreateInfoEXT
int32_t PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];
};
-struct VkVideoDecodeH264PictureInfoEXT
+struct VkVideoDecodeH264PictureInfoKHR
{
VkStructureType sType;
const void* pNext;
int32_t PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];
};
-struct VkVideoDecodeH264DpbSlotInfoEXT
+struct VkVideoDecodeH264DpbSlotInfoKHR
{
VkStructureType sType;
const void* pNext;
const StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries;
};
-struct VkVideoDecodeH265SessionParametersAddInfoEXT
+struct VkVideoDecodeH265SessionParametersAddInfoKHR
{
VkStructureType sType;
const void* pNext;
uint32_t short_term_ref_pic_set_sps_flag:1;
};
-struct VkVideoDecodeH265SessionParametersCreateInfoEXT
+struct VkVideoDecodeH265SessionParametersCreateInfoKHR
{
VkStructureType sType;
const void* pNext;
uint32_t maxStdVPSCount;
uint32_t maxStdSPSCount;
uint32_t maxStdPPSCount;
- const VkVideoDecodeH265SessionParametersAddInfoEXT* pParametersAddInfo;
+ const VkVideoDecodeH265SessionParametersAddInfoKHR* pParametersAddInfo;
};
struct VkVideoEncodeH265SessionParametersCreateInfoEXT
uint8_t RefPicSetLtCurr[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE];
};
-struct VkVideoDecodeH265PictureInfoEXT
+struct VkVideoDecodeH265PictureInfoKHR
{
VkStructureType sType;
const void* pNext;
StdVideoDecodeH265PictureInfo* pStdPictureInfo;
- uint32_t sliceCount;
- const uint32_t* pSliceOffsets;
+ uint32_t sliceSegmentCount;
+ const uint32_t* pSliceSegmentOffsets;
};
struct StdVideoDecodeH265ReferenceInfoFlags
int32_t PicOrderCntVal;
};
-struct VkVideoDecodeH265DpbSlotInfoEXT
+struct VkVideoDecodeH265DpbSlotInfoKHR
{
VkStructureType sType;
const void* pNext;
virtual VkResult bindOpticalFlowSessionImageNV (VkDevice device, VkOpticalFlowSessionNV session, VkOpticalFlowSessionBindingPointNV bindingPoint, VkImageView view, VkImageLayout layout) const = 0;
virtual void cmdOpticalFlowExecuteNV (VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo) const = 0;
virtual VkResult getDeviceFaultInfoEXT (VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo) const = 0;
+virtual VkResult releaseSwapchainImagesEXT (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) const = 0;
#define vulkan_video_codec_h264std_encode 1
// Vulkan 0.9 provisional Vulkan video H.264 encode std specification version number
-#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8 VK_MAKE_VIDEO_STD_VERSION(0, 9, 8) // Patch version should always be set to 0
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8 VK_MAKE_VIDEO_STD_VERSION(0, 9, 8)
#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8
#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_encode"
#define vulkan_video_codec_h264std_decode 1
-// Vulkan 0.9 provisional Vulkan video H.264 decode std specification version number
-#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_0_9_8 VK_MAKE_VIDEO_STD_VERSION(0, 9, 8) // Patch version should always be set to 0
+
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)
#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2
-#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_0_9_8
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0
#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_decode"
typedef enum StdVideoDecodeH264FieldOrderCount {
#define vulkan_video_codec_h265std_decode 1
-// Vulkan 0.9 provisional Vulkan video H.265 decode std specification version number
-#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_0_9_9 VK_MAKE_VIDEO_STD_VERSION(0, 9, 9) // Patch version should always be set to 0
+
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)
#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8
-#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_0_9_9
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0
#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265_decode"
typedef struct StdVideoDecodeH265PictureInfoFlags {
deUint32 IrapPicFlag : 1;
#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0
// Version of this file
-#define VK_HEADER_VERSION 235
+#define VK_HEADER_VERSION 238
// Complete version of this file
#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION)
VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,
VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
VK_ERROR_INVALID_SHADER_NV = -1000012000,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR = -1000023002,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR = -1000023003,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005,
-#endif
VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
VK_ERROR_NOT_PERMITTED_KHR = -1000174001,
VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,
VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR = 1000023000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR = 1000023013,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR = 1000024001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR = 1000024002,
-#endif
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,
#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010,
#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT = 1000040003,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040004,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040005,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040006,
-#endif
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006,
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006,
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007,
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187002,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT = 1000187003,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187004,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187005,
-#endif
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005,
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000,
VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001,
+ VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004,
+ VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,
VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002,
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001,
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002,
VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003,
+ VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000,
+ VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001,
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002,
VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000,
VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000,
VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000,
VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
-#endif
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003,
VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,
-#endif
VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000,
VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001,
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_QUERY_TYPE_OCCLUSION = 0,
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,
-#endif
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,
VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000,
VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000,
-#endif
VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
-#endif
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100,
#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_QUEUE_TRANSFER_BIT = 0x00000004,
VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
VK_QUEUE_PROTECTED_BIT = 0x00000010,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,
-#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,
#endif
VK_QUERY_RESULT_WAIT_BIT = 0x00000002,
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,
VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,
-#endif
VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkQueryResultFlagBits;
typedef VkFlags VkQueryResultFlags;
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
-#endif
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0x4000000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
-#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;
-#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;
#endif
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
-#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;
-#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;
#endif
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR = 0x100000000ULL;
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT = 0x200000000ULL;
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR = 0x200000000ULL;
-#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000ULL;
-#endif
-#ifdef VK_ENABLE_BETA_EXTENSIONS
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000ULL;
-#endif
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000ULL;
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000ULL;
static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000ULL;
VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001,
VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002,
VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0x00000004,
+ VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0x00000008,
VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
} VkSwapchainCreateFlagBitsKHR;
typedef VkFlags VkSwapchainCreateFlagsKHR;
#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge"
+#define VK_KHR_video_queue 1
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR)
+#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 8
+#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue"
+
+typedef enum VkQueryResultStatusKHR {
+ VK_QUERY_RESULT_STATUS_ERROR_KHR = -1,
+ VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0,
+ VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1,
+ VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkQueryResultStatusKHR;
+
+typedef enum VkVideoCodecOperationFlagBitsKHR {
+ VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT = 0x00020000,
+#endif
+ VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002,
+ VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCodecOperationFlagBitsKHR;
+typedef VkFlags VkVideoCodecOperationFlagsKHR;
+
+typedef enum VkVideoChromaSubsamplingFlagBitsKHR {
+ VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR = 0,
+ VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001,
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002,
+ VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004,
+ VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008,
+ VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoChromaSubsamplingFlagBitsKHR;
+typedef VkFlags VkVideoChromaSubsamplingFlagsKHR;
+
+typedef enum VkVideoComponentBitDepthFlagBitsKHR {
+ VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoComponentBitDepthFlagBitsKHR;
+typedef VkFlags VkVideoComponentBitDepthFlagsKHR;
+
+typedef enum VkVideoCapabilityFlagBitsKHR {
+ VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
+ VK_VIDEO_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCapabilityFlagBitsKHR;
+typedef VkFlags VkVideoCapabilityFlagsKHR;
+
+typedef enum VkVideoSessionCreateFlagBitsKHR {
+ VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoSessionCreateFlagBitsKHR;
+typedef VkFlags VkVideoSessionCreateFlagsKHR;
+typedef VkFlags VkVideoSessionParametersCreateFlagsKHR;
+typedef VkFlags VkVideoBeginCodingFlagsKHR;
+typedef VkFlags VkVideoEndCodingFlagsKHR;
+
+typedef enum VkVideoCodingControlFlagBitsKHR {
+ VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0x00000002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR = 0x00000004,
+#endif
+ VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCodingControlFlagBitsKHR;
+typedef VkFlags VkVideoCodingControlFlagsKHR;
+typedef struct VkQueueFamilyQueryResultStatusPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 queryResultStatusSupport;
+} VkQueueFamilyQueryResultStatusPropertiesKHR;
+
+typedef struct VkQueueFamilyVideoPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCodecOperationFlagsKHR videoCodecOperations;
+} VkQueueFamilyVideoPropertiesKHR;
+
+typedef struct VkVideoProfileInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+} VkVideoProfileInfoKHR;
+
+typedef struct VkVideoProfileListInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 profileCount;
+ const VkVideoProfileInfoKHR* pProfiles;
+} VkVideoProfileListInfoKHR;
+
+typedef struct VkVideoCapabilitiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCapabilityFlagsKHR flags;
+ VkDeviceSize minBitstreamBufferOffsetAlignment;
+ VkDeviceSize minBitstreamBufferSizeAlignment;
+ VkExtent2D pictureAccessGranularity;
+ VkExtent2D minCodedExtent;
+ VkExtent2D maxCodedExtent;
+ deUint32 maxDpbSlots;
+ deUint32 maxActiveReferencePictures;
+ VkExtensionProperties stdHeaderVersion;
+} VkVideoCapabilitiesKHR;
+
+typedef struct VkPhysicalDeviceVideoFormatInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags imageUsage;
+} VkPhysicalDeviceVideoFormatInfoKHR;
+
+typedef struct VkVideoFormatPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkFormat format;
+ VkComponentMapping componentMapping;
+ VkImageCreateFlags imageCreateFlags;
+ VkImageType imageType;
+ VkImageTiling imageTiling;
+ VkImageUsageFlags imageUsageFlags;
+} VkVideoFormatPropertiesKHR;
+
+typedef struct VkVideoPictureResourceInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkOffset2D codedOffset;
+ VkExtent2D codedExtent;
+ deUint32 baseArrayLayer;
+ VkImageView imageViewBinding;
+} VkVideoPictureResourceInfoKHR;
+
+typedef struct VkVideoReferenceSlotInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deInt32 slotIndex;
+ const VkVideoPictureResourceInfoKHR* pPictureResource;
+} VkVideoReferenceSlotInfoKHR;
+
+typedef struct VkVideoSessionMemoryRequirementsKHR {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 memoryBindIndex;
+ VkMemoryRequirements memoryRequirements;
+} VkVideoSessionMemoryRequirementsKHR;
+
+typedef struct VkBindVideoSessionMemoryInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 memoryBindIndex;
+ VkDeviceMemory memory;
+ VkDeviceSize memoryOffset;
+ VkDeviceSize memorySize;
+} VkBindVideoSessionMemoryInfoKHR;
+
+typedef struct VkVideoSessionCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 queueFamilyIndex;
+ VkVideoSessionCreateFlagsKHR flags;
+ const VkVideoProfileInfoKHR* pVideoProfile;
+ VkFormat pictureFormat;
+ VkExtent2D maxCodedExtent;
+ VkFormat referencePictureFormat;
+ deUint32 maxDpbSlots;
+ deUint32 maxActiveReferencePictures;
+ const VkExtensionProperties* pStdHeaderVersion;
+} VkVideoSessionCreateInfoKHR;
+
+typedef struct VkVideoSessionParametersCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoSessionParametersCreateFlagsKHR flags;
+ VkVideoSessionParametersKHR videoSessionParametersTemplate;
+ VkVideoSessionKHR videoSession;
+} VkVideoSessionParametersCreateInfoKHR;
+
+typedef struct VkVideoSessionParametersUpdateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 updateSequenceCount;
+} VkVideoSessionParametersUpdateInfoKHR;
+
+typedef struct VkVideoBeginCodingInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoBeginCodingFlagsKHR flags;
+ VkVideoSessionKHR videoSession;
+ VkVideoSessionParametersKHR videoSessionParameters;
+ deUint32 referenceSlotCount;
+ const VkVideoReferenceSlotInfoKHR* pReferenceSlots;
+} VkVideoBeginCodingInfoKHR;
+
+typedef struct VkVideoEndCodingInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEndCodingFlagsKHR flags;
+} VkVideoEndCodingInfoKHR;
+
+typedef struct VkVideoCodingControlInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoCodingControlFlagsKHR flags;
+} VkVideoCodingControlInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)(VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession);
+typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionKHR)(VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator);
+typedef VkResult (VKAPI_PTR *PFN_vkGetVideoSessionMemoryRequirementsKHR)(VkDevice device, VkVideoSessionKHR videoSession, deUint32* pMemoryRequirementsCount, VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements);
+typedef VkResult (VKAPI_PTR *PFN_vkBindVideoSessionMemoryKHR)(VkDevice device, VkVideoSessionKHR videoSession, deUint32 bindSessionMemoryInfoCount, const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters);
+typedef VkResult (VKAPI_PTR *PFN_vkUpdateVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
+typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileInfoKHR* pVideoProfile,
+ VkVideoCapabilitiesKHR* pCapabilities);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
+ deUint32* pVideoFormatPropertyCount,
+ VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR(
+ VkDevice device,
+ const VkVideoSessionCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkVideoSessionKHR* pVideoSession);
+
+VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ const VkAllocationCallbacks* pAllocator);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ deUint32* pMemoryRequirementsCount,
+ VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ deUint32 bindSessionMemoryInfoCount,
+ const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR(
+ VkDevice device,
+ const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkVideoSessionParametersKHR* pVideoSessionParameters);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR(
+ VkDevice device,
+ VkVideoSessionParametersKHR videoSessionParameters,
+ const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR(
+ VkDevice device,
+ VkVideoSessionParametersKHR videoSessionParameters,
+ const VkAllocationCallbacks* pAllocator);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoBeginCodingInfoKHR* pBeginInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+#endif
+
+
+#define VK_KHR_video_decode_queue 1
+#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 7
+#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME "VK_KHR_video_decode_queue"
+
+typedef enum VkVideoDecodeCapabilityFlagBitsKHR {
+ VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0x00000002,
+ VK_VIDEO_DECODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoDecodeCapabilityFlagBitsKHR;
+typedef VkFlags VkVideoDecodeCapabilityFlagsKHR;
+
+typedef enum VkVideoDecodeUsageFlagBitsKHR {
+ VK_VIDEO_DECODE_USAGE_DEFAULT_KHR = 0,
+ VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0x00000002,
+ VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0x00000004,
+ VK_VIDEO_DECODE_USAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoDecodeUsageFlagBitsKHR;
+typedef VkFlags VkVideoDecodeUsageFlagsKHR;
+typedef VkFlags VkVideoDecodeFlagsKHR;
+typedef struct VkVideoDecodeCapabilitiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoDecodeCapabilityFlagsKHR flags;
+} VkVideoDecodeCapabilitiesKHR;
+
+typedef struct VkVideoDecodeUsageInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeUsageFlagsKHR videoUsageHints;
+} VkVideoDecodeUsageInfoKHR;
+
+typedef struct VkVideoDecodeInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeFlagsKHR flags;
+ VkBuffer srcBuffer;
+ VkDeviceSize srcBufferOffset;
+ VkDeviceSize srcBufferRange;
+ VkVideoPictureResourceInfoKHR dstPictureResource;
+ const VkVideoReferenceSlotInfoKHR* pSetupReferenceSlot;
+ deUint32 referenceSlotCount;
+ const VkVideoReferenceSlotInfoKHR* pReferenceSlots;
+} VkVideoDecodeInfoKHR;
+
+typedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoDecodeInfoKHR* pDecodeInfo);
+#endif
+
+
+#define VK_KHR_video_decode_h264 1
+
+
+#define VK_KHR_VIDEO_DECODE_H264_SPEC_VERSION 8
+#define VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME "VK_KHR_video_decode_h264"
+
+typedef enum VkVideoDecodeH264PictureLayoutFlagBitsKHR {
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR = 0,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0x00000002,
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoDecodeH264PictureLayoutFlagBitsKHR;
+typedef VkFlags VkVideoDecodeH264PictureLayoutFlagsKHR;
+typedef struct VkVideoDecodeH264ProfileInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH264ProfileIdc stdProfileIdc;
+ VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout;
+} VkVideoDecodeH264ProfileInfoKHR;
+
+typedef struct VkVideoDecodeH264CapabilitiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ StdVideoH264LevelIdc maxLevelIdc;
+ VkOffset2D fieldOffsetGranularity;
+} VkVideoDecodeH264CapabilitiesKHR;
+
+typedef struct VkVideoDecodeH264SessionParametersAddInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 stdSPSCount;
+ const StdVideoH264SequenceParameterSet* pStdSPSs;
+ deUint32 stdPPSCount;
+ const StdVideoH264PictureParameterSet* pStdPPSs;
+} VkVideoDecodeH264SessionParametersAddInfoKHR;
+
+typedef struct VkVideoDecodeH264SessionParametersCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 maxStdSPSCount;
+ deUint32 maxStdPPSCount;
+ const VkVideoDecodeH264SessionParametersAddInfoKHR* pParametersAddInfo;
+} VkVideoDecodeH264SessionParametersCreateInfoKHR;
+
+typedef struct VkVideoDecodeH264PictureInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264PictureInfo* pStdPictureInfo;
+ deUint32 sliceCount;
+ const deUint32* pSliceOffsets;
+} VkVideoDecodeH264PictureInfoKHR;
+
+typedef struct VkVideoDecodeH264DpbSlotInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo;
+} VkVideoDecodeH264DpbSlotInfoKHR;
+
+
+
#define VK_KHR_dynamic_rendering 1
#define VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION 1
#define VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME "VK_KHR_dynamic_rendering"
+#define VK_KHR_video_decode_h265 1
+
+
+#define VK_KHR_VIDEO_DECODE_H265_SPEC_VERSION 7
+#define VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME "VK_KHR_video_decode_h265"
+typedef struct VkVideoDecodeH265ProfileInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH265ProfileIdc stdProfileIdc;
+} VkVideoDecodeH265ProfileInfoKHR;
+
+typedef struct VkVideoDecodeH265CapabilitiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ StdVideoH265LevelIdc maxLevelIdc;
+} VkVideoDecodeH265CapabilitiesKHR;
+
+typedef struct VkVideoDecodeH265SessionParametersAddInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 stdVPSCount;
+ const StdVideoH265VideoParameterSet* pStdVPSs;
+ deUint32 stdSPSCount;
+ const StdVideoH265SequenceParameterSet* pStdSPSs;
+ deUint32 stdPPSCount;
+ const StdVideoH265PictureParameterSet* pStdPPSs;
+} VkVideoDecodeH265SessionParametersAddInfoKHR;
+
+typedef struct VkVideoDecodeH265SessionParametersCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 maxStdVPSCount;
+ deUint32 maxStdSPSCount;
+ deUint32 maxStdPPSCount;
+ const VkVideoDecodeH265SessionParametersAddInfoKHR* pParametersAddInfo;
+} VkVideoDecodeH265SessionParametersCreateInfoKHR;
+
+typedef struct VkVideoDecodeH265PictureInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo;
+ deUint32 sliceSegmentCount;
+ const deUint32* pSliceSegmentOffsets;
+} VkVideoDecodeH265PictureInfoKHR;
+
+typedef struct VkVideoDecodeH265DpbSlotInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo;
+} VkVideoDecodeH265DpbSlotInfoKHR;
+
+
+
#define VK_KHR_global_priority 1
#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR 16U
#define VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION 1
+#define VK_EXT_surface_maintenance1 1
+#define VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION 1
+#define VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_surface_maintenance1"
+
+typedef enum VkPresentScalingFlagBitsEXT {
+ VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0x00000001,
+ VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0x00000002,
+ VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0x00000004,
+ VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkPresentScalingFlagBitsEXT;
+typedef VkFlags VkPresentScalingFlagsEXT;
+
+typedef enum VkPresentGravityFlagBitsEXT {
+ VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0x00000001,
+ VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0x00000002,
+ VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0x00000004,
+ VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkPresentGravityFlagBitsEXT;
+typedef VkFlags VkPresentGravityFlagsEXT;
+typedef struct VkSurfacePresentModeEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkPresentModeKHR presentMode;
+} VkSurfacePresentModeEXT;
+
+typedef struct VkSurfacePresentScalingCapabilitiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkPresentScalingFlagsEXT supportedPresentScaling;
+ VkPresentGravityFlagsEXT supportedPresentGravityX;
+ VkPresentGravityFlagsEXT supportedPresentGravityY;
+ VkExtent2D minScaledImageExtent;
+ VkExtent2D maxScaledImageExtent;
+} VkSurfacePresentScalingCapabilitiesEXT;
+
+typedef struct VkSurfacePresentModeCompatibilityEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 presentModeCount;
+ VkPresentModeKHR* pPresentModes;
+} VkSurfacePresentModeCompatibilityEXT;
+
+
+
+#define VK_EXT_swapchain_maintenance1 1
+#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1
+#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_swapchain_maintenance1"
+typedef struct VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 swapchainMaintenance1;
+} VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT;
+
+typedef struct VkSwapchainPresentFenceInfoEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 swapchainCount;
+ const VkFence* pFences;
+} VkSwapchainPresentFenceInfoEXT;
+
+typedef struct VkSwapchainPresentModesCreateInfoEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 presentModeCount;
+ const VkPresentModeKHR* pPresentModes;
+} VkSwapchainPresentModesCreateInfoEXT;
+
+typedef struct VkSwapchainPresentModeInfoEXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 swapchainCount;
+ const VkPresentModeKHR* pPresentModes;
+} VkSwapchainPresentModeInfoEXT;
+
+typedef struct VkSwapchainPresentScalingCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkPresentScalingFlagsEXT scalingBehavior;
+ VkPresentGravityFlagsEXT presentGravityX;
+ VkPresentGravityFlagsEXT presentGravityY;
+} VkSwapchainPresentScalingCreateInfoEXT;
+
+typedef struct VkReleaseSwapchainImagesInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkSwapchainKHR swapchain;
+ deUint32 imageIndexCount;
+ const deUint32* pImageIndices;
+} VkReleaseSwapchainImagesInfoEXT;
+
+typedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesEXT)(VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkReleaseSwapchainImagesEXT(
+ VkDevice device,
+ const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo);
+#endif
+
+
#define VK_EXT_shader_demote_to_helper_invocation 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
const VkDescriptorAddressInfoEXT* pStorageTexelBuffer;
const VkDescriptorAddressInfoEXT* pUniformBuffer;
const VkDescriptorAddressInfoEXT* pStorageBuffer;
- VkDeviceAddress accelerationStructure;
+ VkDeviceAddress accelerationStructure;
} VkDescriptorDataEXT;
typedef struct VkDescriptorGetInfoEXT {
-#define VK_NV_acquire_winrt_display 1
-#define VK_NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION 1
-#define VK_NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME "VK_NV_acquire_winrt_display"
-typedef VkResult (VKAPI_PTR *PFN_vkAcquireWinrtDisplayNV)(VkPhysicalDevice physicalDevice, VkDisplayKHR display);
-typedef VkResult (VKAPI_PTR *PFN_vkGetWinrtDisplayNV)(VkPhysicalDevice physicalDevice, deUint32 deviceRelativeId, VkDisplayKHR* pDisplay);
-
-#ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkAcquireWinrtDisplayNV(
- VkPhysicalDevice physicalDevice,
- VkDisplayKHR display);
-
-VKAPI_ATTR VkResult VKAPI_CALL vkGetWinrtDisplayNV(
- VkPhysicalDevice physicalDevice,
- deUint32 deviceRelativeId,
- VkDisplayKHR* pDisplay);
-#endif
-
-
#define VK_VALVE_mutable_descriptor_type 1
#define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1
#define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME "VK_VALVE_mutable_descriptor_type"
+#define VK_LUNARG_direct_driver_loading 1
+#define VK_LUNARG_DIRECT_DRIVER_LOADING_SPEC_VERSION 1
+#define VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME "VK_LUNARG_direct_driver_loading"
+
+typedef enum VkDirectDriverLoadingModeLUNARG {
+ VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG = 0,
+ VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG = 1,
+ VK_DIRECT_DRIVER_LOADING_MODE_MAX_ENUM_LUNARG = 0x7FFFFFFF
+} VkDirectDriverLoadingModeLUNARG;
+typedef VkFlags VkDirectDriverLoadingFlagsLUNARG;
+typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddrLUNARG)(
+ VkInstance instance, const char* pName);
+
+typedef struct VkDirectDriverLoadingInfoLUNARG {
+ VkStructureType sType;
+ void* pNext;
+ VkDirectDriverLoadingFlagsLUNARG flags;
+ PFN_vkGetInstanceProcAddrLUNARG pfnGetInstanceProcAddr;
+} VkDirectDriverLoadingInfoLUNARG;
+
+typedef struct VkDirectDriverLoadingListLUNARG {
+ VkStructureType sType;
+ void* pNext;
+ VkDirectDriverLoadingModeLUNARG mode;
+ deUint32 driverCount;
+ const VkDirectDriverLoadingInfoLUNARG* pDrivers;
+} VkDirectDriverLoadingListLUNARG;
+
+
+
#define VK_EXT_shader_module_identifier 1
#define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT 32U
#define VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION 1
+#define VK_QCOM_multiview_per_view_viewports 1
+#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION 1
+#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME "VK_QCOM_multiview_per_view_viewports"
+typedef struct VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 multiviewPerViewViewports;
+} VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;
+
+
+
#define VK_NV_ray_tracing_invocation_reorder 1
#define VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION 1
#define VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME "VK_NV_ray_tracing_invocation_reorder"
"VK_KHR_timeline_semaphore",
"VK_KHR_uniform_buffer_standard_layout",
"VK_KHR_variable_pointers",
+ "VK_KHR_video_queue",
"VK_KHR_vulkan_memory_model",
"VK_KHR_win32_keyed_mutex",
"VK_KHR_workgroup_memory_explicit_layout",
std::make_pair(1000023009, "VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR"),
std::make_pair(1000023010, "VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR"),
std::make_pair(1000023011, "VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR"),
- std::make_pair(1000023012, "VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR"),
+ std::make_pair(1000023012, "VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR"),
std::make_pair(1000023013, "VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR"),
std::make_pair(1000023014, "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR"),
std::make_pair(1000023015, "VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR"),
std::make_pair(1000039009, "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_EXT"),
std::make_pair(1000039010, "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT"),
std::make_pair(1000039011, "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT"),
- std::make_pair(1000040000, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT"),
+ std::make_pair(1000040000, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR"),
std::make_pair(1000040001, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT"),
- std::make_pair(1000040002, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT"),
+ std::make_pair(1000040002, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR"),
std::make_pair(1000040003, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT"),
std::make_pair(1000040004, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT"),
std::make_pair(1000040005, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT"),
- std::make_pair(1000040006, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT"),
- std::make_pair(1000040007, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT"),
+ std::make_pair(1000040006, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR"),
+ std::make_pair(1000040007, "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR"),
std::make_pair(1000041000, "VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD"),
std::make_pair(1000044000, "VK_STRUCTURE_TYPE_RENDERING_INFO_KHR"),
std::make_pair(1000044001, "VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR"),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR", 1000023009),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR", 1000023010),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR", 1000023011),
- std::make_pair("VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR", 1000023012),
+ std::make_pair("VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR", 1000023012),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR", 1000023013),
std::make_pair("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR", 1000023014),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR", 1000023015),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_EXT", 1000039009),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT", 1000039010),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT", 1000039011),
- std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT", 1000040000),
+ std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR", 1000040000),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT", 1000040001),
- std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT", 1000040002),
+ std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR", 1000040002),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT", 1000040003),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT", 1000040004),
std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT", 1000040005),
- std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT", 1000040006),
- std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT", 1000040007),
+ std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR", 1000040006),
+ std::make_pair("VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR", 1000040007),
std::make_pair("VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD", 1000041000),
std::make_pair("VK_STRUCTURE_TYPE_RENDERING_INFO_KHR", 1000044000),
std::make_pair("VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR", 1000044001),
vk.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, 0u, DE_NULL, 0u, DE_NULL, imageMemoryBarrierCount32, pImageMemoryBarriers);
}
-
} // vkt
#define VK_CHECK_MSG(EXPR, MSG) vk::checkResult((EXPR), MSG, __FILE__, __LINE__)
#define VK_CHECK_WSI(EXPR) vk::checkWsiResult((EXPR), #EXPR, __FILE__, __LINE__)
+#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \
+ ((((deUint32)(major)) << 22) | (((deUint32)(minor)) << 12) | ((deUint32)(patch)))
+
/*--------------------------------------------------------------------*//*!
* \brief Vulkan utilities
*//*--------------------------------------------------------------------*/
const char* pMessage,
void* pUserData);
+typedef VKAPI_ATTR PFN_vkVoidFunction (VKAPI_CALL* PFN_vkGetInstanceProcAddrLUNARG) (VkInstance instance, const char pName);
+
#endif // CTS_USES_VULKANSC
typedef VKAPI_ATTR VkBool32 (VKAPI_CALL *PFN_vkDebugUtilsMessengerCallbackEXT) (VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
class Platform
{
public:
+ enum LibraryType
+ {
+ LIBRARY_TYPE_VULKAN = 0,
+ LIBRARY_TYPE_VULKAN_VIDEO_DECODE_PARSER,
+
+ LIBRARY_TYPE_LAST
+ };
+
Platform (void) {}
~Platform (void) {}
+#if (DE_OS == DE_OS_ANDROID)
+ virtual Library* createLibrary (const char* libraryPath = DE_NULL) const = 0;
+#else
+ virtual Library* createLibrary (LibraryType libraryType = LIBRARY_TYPE_VULKAN, const char* libraryPath = DE_NULL) const = 0;
+#endif
- virtual Library* createLibrary (const char* libraryPath) const = 0;
virtual wsi::Display* createWsiDisplay (wsi::Type wsiType) const;
virtual bool hasDisplay (wsi::Type wsiType) const;
virtual void describePlatform (std::ostream& dst) const;
VK_COMPONENT_SWIZZLE_A);
}
+inline VkComponentMapping makeComponentMappingIdentity (void)
+{
+ return makeComponentMapping(VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY);
+}
+
inline VkExtent3D makeExtent3D (const tcu::IVec3& vec)
{
return makeExtent3D((deUint32)vec.x(), (deUint32)vec.y(), (deUint32)vec.z());
return makeViewport(0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f);
}
+inline VkSemaphoreSubmitInfoKHR makeSemaphoreSubmitInfo (VkSemaphore semaphore, VkPipelineStageFlags2KHR stageMask, uint64_t value = 0, uint32_t deviceIndex = 0)
+{
+ return VkSemaphoreSubmitInfoKHR
+ {
+ VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ semaphore, // VkSemaphore semaphore;
+ value, // uint64_t value;
+ stageMask, // VkPipelineStageFlags2KHR stageMask;
+ deviceIndex, // uint32_t deviceIndex;
+ };
+}
+
inline VkPrimitiveTopology primitiveTopologyCastToList (const VkPrimitiveTopology primitiveTopology)
{
DE_STATIC_ASSERT(static_cast<deUint64>(VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) + 1 == static_cast<deUint64>(VK_PRIMITIVE_TOPOLOGY_LAST));
add_subdirectory(mesh_shader)
add_subdirectory(fragment_shading_barycentric)
add_subdirectory(sc)
-
+add_subdirectory(video)
include_directories(
api
fragment_shading_barycentric
${DEQP_INL_DIR}
sc
+ video
)
set(DEQP_VK_SRCS
deqp-vk-reconvergence
deqp-vk-mesh-shader
deqp-vk-fragment-shading-barycentric
+ deqp-vk-video
)
ENDIF()
ENDFOREACH()
+set(BINARY_COPY_DIR "./")
+
+if (DE_OS_IS_WIN32)
+ add_data_dir(deqp-vk ../../../ffmpeg/src/bin ${BINARY_COPY_DIR})
+endif()
+
+# Video parser used in vulkan video won't be part of android target
+if (NOT DE_OS_IS_ANDROID)
+ if (DE_OS_IS_WIN32)
+ add_data_dir(deqp-vk ../../../video-parser/src/vk_video_decoder/bin/libs/nv_vkvideo_parser/wddm2_amd64_release ${BINARY_COPY_DIR})
+ elseif(DE_OS_IS_UNIX)
+ add_data_dir(deqp-vk ../../../video-parser/src/vk_video_decoder/bin/libs/nv_vkvideo_parser/linux_amd64_release ${BINARY_COPY_DIR})
+ else()
+ message(FATAL_ERROR "System is not supported")
+ endif()
+endif()
+
+
if (DE_OS_IS_WIN32 OR DE_OS_IS_UNIX OR DE_OS_IS_OSX)
add_executable(vk-build-programs vktBuildPrograms.cpp)
target_link_libraries(vk-build-programs deqp-vk${MODULE_LIB_TARGET_POSTFIX})
}
if (i->any({VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR, VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR}))
{
- if (!context.isDeviceFunctionalitySupported(VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME))
+ if (!context.isDeviceFunctionalitySupported(VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME))
{
if (!msgs[5])
{
if (entryCount++) str << std::endl;
- str << INFOUSAGE("VK_EXT_video_decode_h264 not supported by device");
+ str << INFOUSAGE("VK_KHR_video_decode_h264 not supported by device");
msgs[5] = true;
}
notSupported = true;
}
- if (!(videoFlags & VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT))
+ if (!(videoFlags & VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR))
{
if (!msgs[6])
{
if (entryCount++) str << std::endl;
- str << INFOUSAGE("Could not find a queue that supports VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT on device");
+ str << INFOUSAGE("Could not find a queue that supports VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR on device");
msgs[6] = true;
}
notSupported = true;
STD_VIDEO_H264_PROFILE_IDC_BASELINE // StdVideoH264ProfileIdc stdProfileIdc;
};
- static VkVideoDecodeH264ProfileInfoEXT decodeProfile
+ static VkVideoDecodeH264ProfileInfoKHR decodeProfile
{
- VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR, // VkStructureType sType;
nullptr, // const void* pNext;
STD_VIDEO_H264_PROFILE_IDC_BASELINE, // StdVideoH264ProfileIdc stdProfileIdc;
- VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT // VkVideoDecodeH264FieldLayoutFlagsEXT fieldLayout;
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR // VkVideoDecodeH264FieldLayoutFlagsEXT fieldLayout;
};
static const VkVideoProfileInfoKHR videoProfiles[]
{
VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
&decodeProfile, // void* pNext;
- VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
tcu::TestLog& log = m_context.getTestContext().getLog();
const deUint32 apiVersion = m_context.getUsedApiVersion();
const vk::Platform& platform = m_context.getTestContext().getPlatform().getVulkanPlatform();
+#if (DE_OS == DE_OS_ANDROID)
de::MovePtr<vk::Library> vkLibrary = de::MovePtr<vk::Library>(platform.createLibrary(m_context.getTestContext().getCommandLine().getVkLibraryPath()));
+#else
+ de::MovePtr<vk::Library> vkLibrary = de::MovePtr<vk::Library>(platform.createLibrary(vk::Platform::LibraryType::LIBRARY_TYPE_VULKAN, m_context.getTestContext().getCommandLine().getVkLibraryPath()));
+#endif
const tcu::FunctionLibrary& funcLibrary = vkLibrary->getFunctionLibrary();
-
deUint32 failsQuantity = 0u;
// Tests with default instance and device without extensions
protected:
virtual void addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> ¶ms) const = 0;
void addSimpleVertexShader(SourceCollections& programCollection, const std::string &dest) const;
- virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM &rasterizationAccess) const
+ virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &rasterizationAccess) const
{
// unused parameter
DE_UNREF(rasterizationAccess);
}
protected:
virtual void addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> ¶ms) const;
- virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM &rasterizationAccess) const
+ virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &rasterizationAccess) const
{
if (!m_explicitSync && !rasterizationAccess.rasterizationOrderDepthAttachmentAccess)
{
}
protected:
virtual void addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> ¶ms) const;
- virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM &rasterizationAccess) const
+ virtual void checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &rasterizationAccess) const
{
if (!m_explicitSync && !rasterizationAccess.rasterizationOrderStencilAttachmentAccess)
{
const auto& vki = context.getInstanceInterface();
const auto physicalDevice = context.getPhysicalDevice();
- VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM rasterizationAccess = initVulkanStructure();
+ VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT rasterizationAccess = initVulkanStructure();
VkPhysicalDeviceFeatures2 features2 = initVulkanStructure(m_explicitSync ? nullptr : &rasterizationAccess);
vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
)
set(DEQP_VK_VKSC_SYNCHRONIZATION_SRCS
+ vktSynchronizationDefs.hpp
vktSynchronizationTests.cpp
vktSynchronizationTests.hpp
vktSynchronizationUtil.cpp
#include "vktSynchronizationBasicEventTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkDefs.hpp"
#include "vkPlatform.hpp"
#define SHORT_FENCE_WAIT 1000ull
#define LONG_FENCE_WAIT ~0ull
+using vkt::synchronization::VideoCodecOperationFlags;
+
struct TestConfig
{
- SynchronizationType type;
- VkEventCreateFlags flags;
+ SynchronizationType type;
+ VkEventCreateFlags flags;
+ VideoCodecOperationFlags videoCodecOperationFlags;
};
tcu::TestStatus hostResetSetEventCase (Context& context, TestConfig config)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
const VkEventCreateInfo eventInfo =
{
VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
tcu::TestStatus deviceResetSetEventCase (Context& context, TestConfig config)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
const Unique<VkEvent> event (createEvent(vk, device));
tcu::TestStatus singleSubmissionCase (Context& context, TestConfig config)
{
enum {SET=0, WAIT, COUNT};
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkFence> fence (createFence(vk, device));
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Move<VkCommandBuffer> ptrCmdBuffer[COUNT] = { makeCommandBuffer(vk, device, *cmdPool), makeCommandBuffer(vk, device, *cmdPool) };
tcu::TestStatus multiSubmissionCase(Context& context, TestConfig config)
{
enum { SET = 0, WAIT, COUNT };
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Move<VkFence> ptrFence[COUNT] = { createFence(vk, device), createFence(vk, device) };
VkFence fence[COUNT] = { *ptrFence[SET], *ptrFence[WAIT] };
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
tcu::TestStatus secondaryCommandBufferCase (Context& context, TestConfig config)
{
enum {SET=0, WAIT, COUNT};
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkFence> fence (createFence(vk, device));
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Move<VkCommandBuffer> primaryCmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
void checkSupport (Context& context, TestConfig config)
{
+ if (config.videoCodecOperationFlags != 0)
+ VideoDevice::checkSupport(context, config.videoCodecOperationFlags);
+
if (config.type == SynchronizationType::SYNCHRONIZATION2)
context.requireDeviceFunctionality("VK_KHR_synchronization2");
void checkSecondaryBufferSupport (Context& context, TestConfig config)
{
checkSupport(context, config);
+
#ifdef CTS_USES_VULKANSC
if (context.getDeviceVulkanSC10Properties().secondaryCommandBufferNullOrImagelessFramebuffer == VK_FALSE)
TCU_THROW(NotSupportedError, "secondaryCommandBufferNullFramebuffer is not supported");
#endif // CTS_USES_VULKANSC
-
}
} // anonymous
-tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx, VideoCodecOperationFlags videoCodecOperationFlags)
{
TestConfig config
{
SynchronizationType::LEGACY,
- 0U
+ 0U,
+ videoCodecOperationFlags
};
de::MovePtr<tcu::TestCaseGroup> basicTests (new tcu::TestCaseGroup(testCtx, "event", "Basic event tests"));
addFunctionCase(basicTests.get(), "device_set_reset", "Basic event tests set and reset on device", checkSupport, deviceResetSetEventCase, config);
addFunctionCase(basicTests.get(), "single_submit_multi_command_buffer", "Wait and set event single submission on device", checkSupport, singleSubmissionCase, config);
addFunctionCase(basicTests.get(), "multi_submit_multi_command_buffer", "Wait and set event mutli submission on device", checkSupport, multiSubmissionCase, config);
- addFunctionCase(basicTests.get(), "multi_secondary_command_buffer", "Event used on secondary command buffer ", checkSecondaryBufferSupport, secondaryCommandBufferCase, config);
+ // Secondary command buffer does not apply to video queues and should not be a part of test plan
+ if (!videoCodecOperationFlags)
+ addFunctionCase(basicTests.get(), "multi_secondary_command_buffer", "Event used on secondary command buffer ", checkSecondaryBufferSupport, secondaryCommandBufferCase, config);
return basicTests.release();
}
-tcu::TestCaseGroup* createSynchronization2BasicEventTests (tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createSynchronization2BasicEventTests (tcu::TestContext& testCtx, VideoCodecOperationFlags videoCodecOperationFlags)
{
TestConfig config
{
SynchronizationType::SYNCHRONIZATION2,
- 0U
+ 0U,
+ videoCodecOperationFlags
};
de::MovePtr<tcu::TestCaseGroup> basicTests (new tcu::TestCaseGroup(testCtx, "event", "Basic event tests"));
* \brief Synchronization event basic tests
*//*--------------------------------------------------------------------*/
+#include "vkDefs.hpp"
#include "tcuTestCase.hpp"
+#include "vktSynchronizationDefs.hpp"
namespace vkt
{
namespace synchronization
{
-tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx);
-tcu::TestCaseGroup* createSynchronization2BasicEventTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx, VideoCodecOperationFlags VideoCodecOperationFlags = 0);
+tcu::TestCaseGroup* createSynchronization2BasicEventTests (tcu::TestContext& testCtx, VideoCodecOperationFlags VideoCodecOperationFlags = 0);
} //synchronization
} // vkt
namespace
{
using namespace vk;
+using vkt::synchronization::VideoCodecOperationFlags;
static const deUint64 SHORT_FENCE_WAIT = 1000ull; // 1us
static const deUint64 LONG_FENCE_WAIT = 1000000000ull; // 1s
-tcu::TestStatus basicOneFenceCase (Context& context)
+struct FenceConfig
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ uint32_t numFences;
+ VideoCodecOperationFlags videoCodecOperationFlags;
+};
+
+tcu::TestStatus basicOneFenceCase (Context& context, FenceConfig config)
+{
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
return tcu::TestStatus::pass("Basic one fence tests passed");
}
-void checkCommandBufferSimultaneousUseSupport(Context& context)
+void checkVideoSupport (Context& context, FenceConfig config)
+{
+ if (config.videoCodecOperationFlags != 0)
+ VideoDevice::checkSupport(context, config.videoCodecOperationFlags);
+}
+
+void checkCommandBufferSimultaneousUseSupport (Context& context, FenceConfig config)
{
#ifdef CTS_USES_VULKANSC
if (context.getDeviceVulkanSC10Properties().commandBufferSimultaneousUse == VK_FALSE)
TCU_THROW(NotSupportedError, "commandBufferSimultaneousUse is not supported");
-#else
- DE_UNREF(context);
#endif
-}
-void checkCommandBufferSimultaneousUseSupport1(Context& context, uint32_t numFences)
-{
- DE_UNREF(numFences);
- checkCommandBufferSimultaneousUseSupport(context);
+ checkVideoSupport(context, config);
}
-tcu::TestStatus basicSignaledCase (Context& context, uint32_t numFences)
+tcu::TestStatus basicSignaledCase (Context& context, FenceConfig config)
{
- const auto& vkd = context.getDeviceInterface();
- const auto device = context.getDevice();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vkd = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
std::vector<Move<VkFence>> fences;
- fences.reserve(numFences);
+ fences.reserve(config.numFences);
const VkFenceCreateInfo fenceCreateInfo =
{
VK_FENCE_CREATE_SIGNALED_BIT, // VkFenceCreateFlags flags;
};
- for (uint32_t i = 0u; i < numFences; ++i)
+ for (uint32_t i = 0u; i < config.numFences; ++i)
{
fences.push_back(createFence(vkd, device, &fenceCreateInfo));
if (vkd.getFenceStatus(device, fences.back().get()) != VK_SUCCESS)
return tcu::TestStatus::pass("Pass");
}
-tcu::TestStatus basicMultiFenceCase (Context& context)
+tcu::TestStatus basicMultiFenceCase (Context& context, FenceConfig config)
{
enum
{
SECOND_FENCE
};
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
return tcu::TestStatus::pass("Basic multi fence tests passed");
}
-tcu::TestStatus emptySubmitCase (Context& context)
+tcu::TestStatus emptySubmitCase (Context& context, FenceConfig config)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
const VkFenceCreateInfo fenceCreateInfo =
{
return tcu::TestStatus::pass("OK");
}
-tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context)
+tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context, FenceConfig config)
{
enum
{
SECOND_FENCE
};
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
} // anonymous
-tcu::TestCaseGroup* createBasicFenceTests (tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createBasicFenceTests (tcu::TestContext& testCtx, VideoCodecOperationFlags videoCodecOperationFlags)
{
de::MovePtr<tcu::TestCaseGroup> basicFenceTests(new tcu::TestCaseGroup(testCtx, "fence", "Basic fence tests"));
- addFunctionCase(basicFenceTests.get(), "one", "Basic one fence tests", basicOneFenceCase);
- addFunctionCase(basicFenceTests.get(), "multi", "Basic multi fence tests", checkCommandBufferSimultaneousUseSupport, basicMultiFenceCase);
- addFunctionCase(basicFenceTests.get(), "empty_submit", "Signal a fence after an empty queue submission", emptySubmitCase);
- addFunctionCase(basicFenceTests.get(), "multi_waitall_false", "Basic multi fence test without waitAll", checkCommandBufferSimultaneousUseSupport, basicMultiFenceWaitAllFalseCase);
- addFunctionCase(basicFenceTests.get(), "one_signaled", "Create a single signaled fence and wait on it", basicSignaledCase, 1u);
- addFunctionCase(basicFenceTests.get(), "multiple_signaled", "Create multiple signaled fences and wait on them", checkCommandBufferSimultaneousUseSupport1, basicSignaledCase, 10u);
+
+ addFunctionCase(basicFenceTests.get(), "one", "Basic one fence tests", checkVideoSupport, basicOneFenceCase, FenceConfig { 0u, videoCodecOperationFlags });
+ addFunctionCase(basicFenceTests.get(), "multi", "Basic multi fence tests", checkCommandBufferSimultaneousUseSupport, basicMultiFenceCase, FenceConfig { 0u, videoCodecOperationFlags });
+ addFunctionCase(basicFenceTests.get(), "empty_submit", "Signal a fence after an empty queue submission", checkVideoSupport, emptySubmitCase, FenceConfig { 0u, videoCodecOperationFlags });
+ addFunctionCase(basicFenceTests.get(), "multi_waitall_false", "Basic multi fence test without waitAll", checkCommandBufferSimultaneousUseSupport, basicMultiFenceWaitAllFalseCase, FenceConfig { 0u, videoCodecOperationFlags });
+ addFunctionCase(basicFenceTests.get(), "one_signaled", "Create a single signaled fence and wait on it", checkVideoSupport, basicSignaledCase, FenceConfig { 1u, videoCodecOperationFlags });
+ addFunctionCase(basicFenceTests.get(), "multiple_signaled", "Create multiple signaled fences and wait on them", checkCommandBufferSimultaneousUseSupport, basicSignaledCase, FenceConfig { 10u, videoCodecOperationFlags });
return basicFenceTests.release();
}
* \brief Synchronization fence basic tests
*//*--------------------------------------------------------------------*/
+#include "vkDefs.hpp"
#include "tcuTestCase.hpp"
+#include "vktSynchronizationDefs.hpp"
namespace vkt
{
namespace synchronization
{
-tcu::TestCaseGroup* createBasicFenceTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createBasicFenceTests (tcu::TestContext& testCtx, VideoCodecOperationFlags VideoCodecOperationFlags = 0);
} //synchronization
} // vkt
{
using namespace vk;
+using vkt::synchronization::VideoCodecOperationFlags;
struct TestConfig
{
- bool useTypeCreate;
- VkSemaphoreType semaphoreType;
- SynchronizationType type;
+ bool useTypeCreate;
+ VkSemaphoreType semaphoreType;
+ SynchronizationType type;
+ VideoCodecOperationFlags videoCodecOperationFlags;
};
#ifdef CTS_USES_VULKANSC
tcu::TestStatus basicOneQueueCase (Context& context, const TestConfig config)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
- const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
+ const deUint32 queueFamilyIndex = getSyncQueueFamilyIndex(videoDevice, context);
const Unique<VkSemaphore> semaphore (createTestSemaphore(context, vk, device, config));
const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
tcu::TestStatus basicChainCase(Context & context, TestConfig config)
{
VkResult err = VK_SUCCESS;
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice& device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, DE_NULL, 0 };
VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL, 0 };
VkFence fence;
tcu::TestStatus basicChainTimelineCase (Context& context, TestConfig config)
{
VkResult err = VK_SUCCESS;
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice& device = context.getDevice();
- const VkQueue queue = context.getUniversalQueue();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
+ const VkQueue queue = getSyncQueue(videoDevice, context);
VkSemaphoreTypeCreateInfo scti = { VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, DE_NULL, VK_SEMAPHORE_TYPE_TIMELINE, 0 };
VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &scti, 0 };
VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL, 0 };
return tcu::TestStatus::fail("Basic semaphore chain test failed");
}
-tcu::TestStatus basicThreadTimelineCase(Context& context, TestConfig)
+tcu::TestStatus basicThreadTimelineCase(Context& context, TestConfig config)
{
- const DeviceInterface& vk = context.getDeviceInterface();
- const VkDevice& device = context.getDevice();
const VkSemaphoreTypeCreateInfo scti = { VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, DE_NULL, VK_SEMAPHORE_TYPE_TIMELINE, 0 };
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ const VkDevice device = getSyncDevice(videoDevice, context);
const VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &scti, 0 };
const VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL, 0 };
const vk::Unique<vk::VkSemaphore> semaphore (createSemaphore(vk, device, &sci));
return tcu::TestStatus::fail("Fail");
}
-tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
+tcu::TestStatus basicMultiQueueCase (Context& context, TestConfig config)
{
enum { NO_MATCH_FOUND = ~((deUint32)0) };
enum QueuesIndexes { FIRST = 0, SECOND, COUNT };
deUint32 queueFamilyIndex;
};
- const CustomInstance instance (createCustomInstanceFromContext(context));
- const InstanceDriver& instanceDriver (instance.getDriver());
- const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
-// const DeviceInterface& vk = context.getDeviceInterface();
-// const InstanceInterface& instance = context.getInstanceInterface();
-// const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- vk::Move<vk::VkDevice> logicalDevice;
- std::vector<VkQueueFamilyProperties> queueFamilyProperties;
- VkDeviceCreateInfo deviceInfo;
- VkPhysicalDeviceFeatures deviceFeatures;
- const float queuePriorities[COUNT] = { 1.0f, 1.0f };
- VkDeviceQueueCreateInfo queueInfos[COUNT];
- Queues queues[COUNT] =
+#ifndef CTS_USES_VULKANSC
+ const VkInstance instance = context.getInstance();
+ const InstanceInterface& instanceInterface = context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ de::MovePtr<VideoDevice> videoDevice (config.videoCodecOperationFlags != 0 ? new VideoDevice(context, config.videoCodecOperationFlags) : DE_NULL);
+ const DeviceInterface& vk = getSyncDeviceInterface(videoDevice, context);
+ std::vector<VkQueueFamilyVideoPropertiesKHR> videoQueueFamilyProperties2;
+#else
+ const CustomInstance instance (createCustomInstanceFromContext(context));
+ const InstanceDriver& instanceDriver (instance.getDriver());
+ const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
+ const InstanceInterface& instanceInterface = instanceDriver;
+// const DeviceInterface& vk = context.getDeviceInterface();
+// const InstanceInterface& instance = context.getInstanceInterface();
+// const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+#endif // CTS_USES_VULKANSC
+ vk::Move<vk::VkDevice> logicalDevice;
+ std::vector<VkQueueFamilyProperties> queueFamilyProperties;
+ std::vector<VkQueueFamilyProperties2> queueFamilyProperties2;
+ VkDeviceCreateInfo deviceInfo;
+ VkPhysicalDeviceFeatures deviceFeatures;
+ const float queuePriorities[COUNT] = { 1.0f, 1.0f };
+ VkDeviceQueueCreateInfo queueInfos[COUNT];
+ Queues queues[COUNT] =
{
{DE_NULL, (deUint32)NO_MATCH_FOUND},
{DE_NULL, (deUint32)NO_MATCH_FOUND}
DE_NULL, // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
};
- bool isTimelineSemaphore = config.semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE;
+ const bool isTimelineSemaphore = config.semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE;
+
+ if (config.videoCodecOperationFlags != 0)
+ {
+#ifndef CTS_USES_VULKANSC
+ uint32_t queueFamilyPropertiesCount = 0;
- queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
+ instanceInterface.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, DE_NULL);
+
+ if (queueFamilyPropertiesCount > 0)
+ {
+ queueFamilyProperties2.resize(queueFamilyPropertiesCount);
+ videoQueueFamilyProperties2.resize(queueFamilyPropertiesCount);
+
+ for (size_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ {
+ queueFamilyProperties2[ndx].sType = vk::VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
+ queueFamilyProperties2[ndx].pNext = &videoQueueFamilyProperties2[ndx];
+ videoQueueFamilyProperties2[ndx].sType = vk::VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
+ videoQueueFamilyProperties2[ndx].pNext = DE_NULL;
+ videoQueueFamilyProperties2[ndx].videoCodecOperations = 0;
+ }
+
+ instanceInterface.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, queueFamilyProperties2.data());
+
+ if (queueFamilyPropertiesCount != queueFamilyProperties2.size())
+ TCU_FAIL("Device returns less queue families than initially reported");
+
+ queueFamilyProperties.reserve(queueFamilyPropertiesCount);
+
+ for (size_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ queueFamilyProperties.push_back(queueFamilyProperties2[ndx].queueFamilyProperties);
+ }
+#endif // CTS_USES_VULKANSC
+ }
+ else
+ {
+ queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceInterface, physicalDevice);
+ }
for (deUint32 queueNdx = 0; queueNdx < queueFamilyProperties.size(); ++queueNdx)
{
+#ifndef CTS_USES_VULKANSC
+ const bool usableQueue = videoQueueFamilyProperties2.empty()
+ || (videoQueueFamilyProperties2[queueNdx].videoCodecOperations & config.videoCodecOperationFlags) != 0;
+
+ if (!usableQueue)
+ continue;
+#endif // CTS_USES_VULKANSC
+
if (NO_MATCH_FOUND == queues[FIRST].queueFamilyIndex)
queues[FIRST].queueFamilyIndex = queueNdx;
}
deMemset(&deviceInfo, 0, sizeof(deviceInfo));
- instanceDriver.getPhysicalDeviceFeatures(physicalDevice, &deviceFeatures);
+ instanceInterface.getPhysicalDeviceFeatures(physicalDevice, &deviceFeatures);
VkPhysicalDeviceFeatures2 createPhysicalFeature { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, DE_NULL, deviceFeatures };
VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphoreFeatures { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, DE_NULL, DE_TRUE };
void** nextPtr = &createPhysicalFeature.pNext;
std::vector<const char*> deviceExtensions;
+
+ if (config.videoCodecOperationFlags != 0)
+ VideoDevice::addVideoDeviceExtensions(deviceExtensions, context.getUsedApiVersion(), VideoDevice::getQueueFlags(config.videoCodecOperationFlags), config.videoCodecOperationFlags);
+
if (isTimelineSemaphore)
{
if (!isCoreDeviceExtension(context.getUsedApiVersion(), "VK_KHR_timeline_semaphore"))
deviceInfo.queueCreateInfoCount = (queues[FIRST].queueFamilyIndex == queues[SECOND].queueFamilyIndex) ? 1 : COUNT;
deviceInfo.pQueueCreateInfos = queueInfos;
- logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instance, instanceDriver, physicalDevice, &deviceInfo);
+ logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instance, instanceInterface, physicalDevice, &deviceInfo);
#ifndef CTS_USES_VULKANSC
de::MovePtr<vk::DeviceDriver> deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), instance, *logicalDevice));
#else
de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter> deviceDriver = de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(context.getPlatformInterface(), instance, *logicalDevice, context.getTestContext().getCommandLine(), context.getResourceInterface(), context.getDeviceVulkanSC10Properties(), context.getDeviceProperties()), vk::DeinitDeviceDeleter(context.getResourceInterface().get(), *logicalDevice));
-#endif // CTS_USES_VULKANSC
const DeviceInterface& vk = *deviceDriver;
+#endif // CTS_USES_VULKANSC
for (deUint32 queueReqNdx = 0; queueReqNdx < COUNT; ++queueReqNdx)
{
return tcu::TestStatus::pass("Basic semaphore tests with multi queue passed");
}
-void checkSupport(Context& context, TestConfig config)
+void checkSupport (Context& context, TestConfig config)
{
+ if (config.videoCodecOperationFlags != 0)
+ VideoDevice::checkSupport(context, config.videoCodecOperationFlags);
+
if (config.semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE)
context.requireDeviceFunctionality("VK_KHR_timeline_semaphore");
context.requireDeviceFunctionality("VK_KHR_synchronization2");
}
-void checkCommandBufferSimultaneousUseSupport(Context& context, TestConfig config)
+void checkCommandBufferSimultaneousUseSupport (Context& context, TestConfig config)
{
checkSupport(context, config);
+
#ifdef CTS_USES_VULKANSC
if (context.getDeviceVulkanSC10Properties().commandBufferSimultaneousUse == VK_FALSE)
TCU_THROW(NotSupportedError, "commandBufferSimultaneousUse is not supported");
} // anonymous
-tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type)
+tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperationFlags)
{
de::MovePtr<tcu::TestCaseGroup> basicTests(new tcu::TestCaseGroup(testCtx, "binary_semaphore", "Basic semaphore tests"));
0,
VK_SEMAPHORE_TYPE_BINARY,
type,
+ videoCodecOperationFlags,
};
for (deUint32 typedCreate = 0; typedCreate < 2; typedCreate++)
{
return basicTests.release();
}
-tcu::TestCaseGroup* createBasicTimelineSemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type)
+tcu::TestCaseGroup* createBasicTimelineSemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperationFlags)
{
de::MovePtr<tcu::TestCaseGroup> basicTests(new tcu::TestCaseGroup(testCtx, "timeline_semaphore", "Basic timeline semaphore tests"));
const TestConfig config =
true,
VK_SEMAPHORE_TYPE_TIMELINE,
type,
+ videoCodecOperationFlags,
};
addFunctionCase(basicTests.get(), "one_queue", "Basic timeline semaphore tests with one queue", checkCommandBufferSimultaneousUseSupport, basicOneQueueCase, config);
#include "tcuTestCase.hpp"
#include "vktSynchronizationUtil.hpp"
+#include "vktSynchronizationDefs.hpp"
namespace vkt
{
namespace synchronization
{
-tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type);
-tcu::TestCaseGroup* createBasicTimelineSemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type);
+tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperationFlags = 0);
+tcu::TestCaseGroup* createBasicTimelineSemaphoreTests (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperationFlags = 0);
} //synchronization
} // vkt
--- /dev/null
+#ifndef _VKTSYNCHRONIZATIONDEFS_HPP
+#define _VKTSYNCHRONIZATIONDEFS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2022 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Synchronization definitions
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+
+namespace vkt
+{
+namespace synchronization
+{
+
+#ifndef CTS_USES_VULKANSC
+ typedef vk::VkVideoCodecOperationFlagsKHR VideoCodecOperationFlags;
+#else
+ // Can be replaced when/if video extension will be promoted into SC
+ typedef uint32_t VideoCodecOperationFlags;
+#endif
+
+} // synchronization
+} // vkt
+
+#endif // _VKTSYNCHRONIZATIONDEFS_HPP
namespace
{
-tcu::TestCaseGroup* createBasicTests (tcu::TestContext& testCtx, SynchronizationType type)
+tcu::TestCaseGroup* createBasicTests (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperation)
{
de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "basic", ""));
if (type == SynchronizationType::LEGACY)
{
- group->addChild(createBasicEventTests(testCtx));
- group->addChild(createBasicFenceTests(testCtx));
+ group->addChild(createBasicEventTests(testCtx, videoCodecOperation));
+ group->addChild(createBasicFenceTests(testCtx, videoCodecOperation));
}
else
{
- group->addChild(createSynchronization2BasicEventTests(testCtx));
+ group->addChild(createSynchronization2BasicEventTests(testCtx, videoCodecOperation));
}
- group->addChild(createBasicBinarySemaphoreTests (testCtx, type));
- group->addChild(createBasicTimelineSemaphoreTests (testCtx, type));
+ group->addChild(createBasicBinarySemaphoreTests (testCtx, type, videoCodecOperation));
+ group->addChild(createBasicTimelineSemaphoreTests (testCtx, type, videoCodecOperation));
return group.release();
}
PipelineCacheData m_pipelineCacheData;
};
-tcu::TestCaseGroup* createTestsInternal (tcu::TestContext& testCtx, SynchronizationType type)
+const std::pair<std::string, std::string> getGroupName (SynchronizationType type, VideoCodecOperationFlags videoCodecOperation)
{
- const bool isSynchronization2 (type == SynchronizationType::SYNCHRONIZATION2);
- const char* groupName[] { "synchronization", "synchronization2" };
- const char* groupDescription[] { "Synchronization tests", "VK_KHR_synchronization2 tests" };
+ if (videoCodecOperation == 0)
+ {
+ const bool isSynchronization2 (type == SynchronizationType::SYNCHRONIZATION2);
+ const char* groupName[] { "synchronization", "synchronization2" };
+ const char* groupDescription[] { "Synchronization tests", "VK_KHR_synchronization2 tests" };
- de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, groupName[isSynchronization2], groupDescription[isSynchronization2]));
+ return std::pair<std::string, std::string>(groupName[isSynchronization2], groupDescription[isSynchronization2]);
+ }
- if (isSynchronization2)
- {
- testGroup->addChild(createSynchronization2SmokeTests(testCtx));
- testGroup->addChild(createSynchronization2TimelineSemaphoreTests(testCtx));
#ifndef CTS_USES_VULKANSC
- testGroup->addChild(createNoneStageTests(testCtx));
-#endif // CTS_USES_VULKANSC
- testGroup->addChild(createImageLayoutTransitionTests(testCtx));
- }
- else // legacy synchronization
+ switch (videoCodecOperation)
{
- testGroup->addChild(createSmokeTests(testCtx));
- testGroup->addChild(createTimelineSemaphoreTests(testCtx));
+ case vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT: return std::pair<std::string, std::string>("encode_h264", "");
+ case vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT: return std::pair<std::string, std::string>("encode_h265", "");
+ case vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: return std::pair<std::string, std::string>("decode_h264", "");
+ case vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: return std::pair<std::string, std::string>("decode_h265", "");
+ default: TCU_THROW(InternalError, "Unknown codec operation");
+ }
+#else
+ TCU_THROW(InternalError, "Video support is not implemented in Vulkan SC");
+#endif
+}
+
+tcu::TestCaseGroup* createTestsInternal (tcu::TestContext& testCtx, SynchronizationType type, VideoCodecOperationFlags videoCodecOperation)
+{
+ const bool isSynchronization2 (type == SynchronizationType::SYNCHRONIZATION2);
+ const std::pair<std::string, std::string> groupName = getGroupName(type, videoCodecOperation);
- testGroup->addChild(createInternallySynchronizedObjects(testCtx));
+ de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, groupName.first.c_str(), groupName.second.c_str()));
+
+ if (videoCodecOperation == 0)
+ {
+ if (isSynchronization2)
+ {
+ testGroup->addChild(createSynchronization2SmokeTests(testCtx));
+ testGroup->addChild(createSynchronization2TimelineSemaphoreTests(testCtx));
#ifndef CTS_USES_VULKANSC
- testGroup->addChild(createWin32KeyedMutexTest(testCtx));
- testGroup->addChild(createGlobalPriorityQueueTests(testCtx));
+ testGroup->addChild(createNoneStageTests(testCtx));
#endif // CTS_USES_VULKANSC
+ testGroup->addChild(createImageLayoutTransitionTests(testCtx));
+ }
+ else // legacy synchronization
+ {
+ testGroup->addChild(createSmokeTests(testCtx));
+ testGroup->addChild(createTimelineSemaphoreTests(testCtx));
+
+ testGroup->addChild(createInternallySynchronizedObjects(testCtx));
+#ifndef CTS_USES_VULKANSC
+ testGroup->addChild(createWin32KeyedMutexTest(testCtx));
+#endif // CTS_USES_VULKANSC
+ }
}
- testGroup->addChild(createBasicTests(testCtx, type));
- testGroup->addChild(new OperationTests(testCtx, type));
+ testGroup->addChild(createBasicTests(testCtx, type, videoCodecOperation));
+
+ if (videoCodecOperation == 0)
+ {
+ testGroup->addChild(new OperationTests(testCtx, type));
#ifndef CTS_USES_VULKANSC
- testGroup->addChild(createCrossInstanceSharingTest(testCtx, type));
- testGroup->addChild(createSignalOrderTests(testCtx, type));
+ testGroup->addChild(createCrossInstanceSharingTest(testCtx, type));
+ testGroup->addChild(createSignalOrderTests(testCtx, type));
#endif // CTS_USES_VULKANSC
+ }
return testGroup.release();
}
-
} // anonymous
} // synchronization
-tcu::TestCaseGroup* createSynchronizationTests (tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createSynchronizationTests (tcu::TestContext& testCtx, synchronization::VideoCodecOperationFlags videoCodecOperation)
{
using namespace synchronization;
- return createTestsInternal(testCtx, SynchronizationType::LEGACY);
+
+ de::MovePtr<tcu::TestCaseGroup> testGroup (createTestsInternal(testCtx, SynchronizationType::LEGACY, videoCodecOperation));
+
+ return testGroup.release();
}
-tcu::TestCaseGroup* createSynchronization2Tests(tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createSynchronization2Tests (tcu::TestContext& testCtx, synchronization::VideoCodecOperationFlags videoCodecOperation)
{
using namespace synchronization;
- return createTestsInternal(testCtx, SynchronizationType::SYNCHRONIZATION2);
+
+ de::MovePtr<tcu::TestCaseGroup> testGroup(createTestsInternal(testCtx, SynchronizationType::SYNCHRONIZATION2, videoCodecOperation));
+
+ return testGroup.release();
}
} // vkt
* \brief Synchronization tests
*//*--------------------------------------------------------------------*/
+#include "vkDefs.hpp"
#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
+#include "vktSynchronizationDefs.hpp"
namespace vkt
{
-tcu::TestCaseGroup* createSynchronizationTests(tcu::TestContext& testCtx);
-tcu::TestCaseGroup* createSynchronization2Tests(tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createSynchronizationTests (tcu::TestContext& testCtx, synchronization::VideoCodecOperationFlags videoCodecOperation = 0);
+tcu::TestCaseGroup* createSynchronization2Tests (tcu::TestContext& testCtx, synchronization::VideoCodecOperationFlags videoCodecOperation = 0);
} // vkt
#endif
}
+vk::VkDevice getSyncDevice (de::MovePtr<VideoDevice>& device, Context& context)
+{
+ if (device == DE_NULL)
+ return context.getDevice();
+ else
+ return device->getDeviceSupportingQueue();
+}
+
+const vk::DeviceInterface& getSyncDeviceInterface (de::MovePtr<VideoDevice>& device, Context& context)
+{
+ if (device == DE_NULL)
+ return context.getDeviceInterface();
+ else
+ return device->getDeviceDriver();
+}
+
+deUint32 getSyncQueueFamilyIndex (de::MovePtr<VideoDevice>& device, Context& context)
+{
+ if (device == DE_NULL)
+ return context.getUniversalQueueFamilyIndex();
+ else
+ return device->getQueueFamilyVideo();
+}
+
+vk::VkQueue getSyncQueue (de::MovePtr<VideoDevice>& device, Context& context)
+{
+ if (device == DE_NULL)
+ return context.getUniversalQueue();
+ else
+ return getDeviceQueue(device->getDeviceDriver(), device->getDeviceSupportingQueue(), device->getQueueFamilyVideo(), 0u);
+}
+
} // synchronization
} // vkt
#include "deMutex.hpp"
#include <memory>
#include "vkResourceInterface.hpp"
+#include "vktCustomInstancesDevices.hpp"
namespace vkt
{
vk::VkSemaphoreSubmitInfoKHR makeCommonSemaphoreSubmitInfo (vk::VkSemaphore semaphore, deUint64 value, vk::VkPipelineStageFlags2KHR stageMask);
vk::VkDependencyInfoKHR makeCommonDependencyInfo (const vk::VkMemoryBarrier2KHR* pMemoryBarrier = DE_NULL, const vk::VkBufferMemoryBarrier2KHR* pBufferMemoryBarrier = DE_NULL, const vk::VkImageMemoryBarrier2KHR* pImageMemoryBarrier = DE_NULL, bool eventDependency = DE_FALSE);
+vk::VkDevice getSyncDevice (de::MovePtr<VideoDevice>& device, Context& context);
+const vk::DeviceInterface& getSyncDeviceInterface (de::MovePtr<VideoDevice>& device, Context& context);
+deUint32 getSyncQueueFamilyIndex (de::MovePtr<VideoDevice>& device, Context& context);
+vk::VkQueue getSyncQueue (de::MovePtr<VideoDevice>& device, Context& context);
} // synchronization
} // vkt
--- /dev/null
+include_directories(..)
+include_directories(${FFMPEG_INCLUDE_PATH})
+
+set(DEQP_VK_VIDEO_SRC_TARGET_DEPENDENT
+ extFFmpegDemuxer.h
+ extNvidiaVideoParserIf.hpp
+ vktVideoSessionNvUtils.cpp
+ vktVideoSessionNvUtils.hpp
+ vktVideoSessionFfmpegUtils.cpp
+ vktVideoSessionFfmpegUtils.hpp
+ vktVideoBaseDecodeUtils.hpp
+ vktVideoBaseDecodeUtils.cpp
+ )
+
+set(DEQP_VK_VIDEO_SRCS_TARGET_INDEPENDENT
+ vktVideoPictureUtils.cpp
+ vktVideoPictureUtils.hpp
+ vktVideoCapabilitiesTests.cpp
+ vktVideoCapabilitiesTests.hpp
+ vktVideoDecodeTests.cpp
+ vktVideoDecodeTests.hpp
+ vktVideoTestUtils.cpp
+ vktVideoTestUtils.hpp
+ vktVideoTests.cpp
+ vktVideoTests.hpp
+ )
+
+if (DE_OS_IS_ANDROID)
+ set(DEQP_VK_VIDEO_SRCS ${DEQP_VK_VIDEO_SRCS_TARGET_INDEPENDENT})
+ else()
+ set(DEQP_VK_VIDEO_SRCS
+ ${DEQP_VK_VIDEO_SRC_TARGET_DEPENDENT}
+ ${DEQP_VK_VIDEO_SRCS_TARGET_INDEPENDENT}
+ )
+endif()
+
+set(DEQP_VK_VIDEO_LIBS
+ tcutil
+ vkutil
+ )
+
+PCH(DEQP_VK_VIDEO_SRCS ../pch.cpp)
+
+add_library(deqp-vk-video STATIC ${DEQP_VK_VIDEO_SRCS})
+target_link_libraries(deqp-vk-video ${DEQP_VK_VIDEO_LIBS})
+
--- /dev/null
+#ifndef _EXTFFMPEGDEMUXER_H
+#define _EXTFFMPEGDEMUXER_H
+/*
+* Copyright 2017-2018 NVIDIA Corporation. All rights reserved.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#if ((DE_COMPILER == DE_COMPILER_CLANG || DE_COMPILER == DE_COMPILER_GCC))
+# define DISABLE_DEPRECATIONS
+#endif
+
+#ifdef DISABLE_DEPRECATIONS
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+
+extern "C" {
+#include <libavformat/avformat.h>
+#include <libavformat/avio.h>
+#include <libavcodec/avcodec.h>
+}
+
+#ifdef DISABLE_DEPRECATIONS
+#pragma GCC diagnostic pop
+#endif
+
+#include <deDefs.h>
+
+#include <iostream>
+#include <tcuDefs.hpp>
+
+#define LOG(X) std::ostream(0)
+
+inline bool check(int e, int iLine, const char *szFile) {
+ if (e < 0) {
+ LOG(ERROR) << "General error " << e << " at line " << iLine << " in file " << szFile;
+ return false;
+ }
+ return true;
+}
+
+#define ck(call) check(call, __LINE__, __FILE__)
+
+
+typedef void* (*pFFMpeg_av_malloc)(size_t size);
+
+typedef void (*pFFMpeg_av_freep)(void* ptr);
+
+typedef void (*pFFMpeg_av_init_packet)(AVPacket* pkt);
+
+typedef void (*pFFMpeg_av_packet_unref)(AVPacket* pkt);
+
+typedef int (*pFFMpeg_av_bsf_init) (AVBSFContext* ctx);
+
+typedef int (*pFFMpeg_av_bsf_send_packet)(AVBSFContext* ctx, AVPacket* pkt);
+
+typedef int (*pFFMpeg_av_bsf_receive_packet)(AVBSFContext* ctx, AVPacket* pkt);
+
+typedef const AVBitStreamFilter* (*pFFMpeg_av_bsf_get_by_name)(const char* name);
+
+typedef int (*pFFMpeg_av_bsf_alloc)(const AVBitStreamFilter* filter, AVBSFContext** ctx);
+
+typedef AVIOContext* (*pFFMpeg_avio_alloc_context) (unsigned char *buffer,
+ int buffer_size,
+ int write_flag,
+ void *opaque,
+ int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
+ int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
+ int64_t (*seek)(void *opaque, int64_t offset, int whence));
+
+typedef int (*pFFMpeg_av_find_best_stream) (AVFormatContext *ic,
+ enum AVMediaType type,
+ int wanted_stream_nb,
+ int related_stream,
+ const AVCodec **decoder_ret,
+ int flags);
+
+typedef int (*pFFMpeg_av_read_frame)(AVFormatContext *s, AVPacket *pkt);
+
+typedef AVFormatContext* (*pFFMpeg_avformat_alloc_context)(void);
+
+typedef int (*pFFMpeg_avformat_network_init)(void);
+
+typedef int (*pFFMpeg_avformat_find_stream_info)(AVFormatContext *ic, AVDictionary **options);
+
+typedef int (*pFFMpeg_avformat_open_input)(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options);
+
+typedef void (*pFFMpeg_avformat_close_input)(AVFormatContext **s);
+
+typedef struct
+{
+ pFFMpeg_av_malloc av_malloc;
+ pFFMpeg_av_freep av_freep;
+ pFFMpeg_av_init_packet av_init_packet;
+ pFFMpeg_av_packet_unref av_packet_unref;
+ pFFMpeg_av_bsf_init av_bsf_init;
+ pFFMpeg_av_bsf_send_packet av_bsf_send_packet;
+ pFFMpeg_av_bsf_receive_packet av_bsf_receive_packet;
+ pFFMpeg_av_bsf_get_by_name av_bsf_get_by_name;
+ pFFMpeg_av_bsf_alloc av_bsf_alloc;
+ pFFMpeg_avio_alloc_context avio_alloc_context;
+ pFFMpeg_av_find_best_stream av_find_best_stream;
+ pFFMpeg_av_read_frame av_read_frame;
+ pFFMpeg_avformat_alloc_context avformat_alloc_context;
+ pFFMpeg_avformat_network_init avformat_network_init;
+ pFFMpeg_avformat_find_stream_info avformat_find_stream_info;
+ pFFMpeg_avformat_open_input avformat_open_input;
+ pFFMpeg_avformat_close_input avformat_close_input;
+} FFMpegAPI;
+
+
+class FFmpegDemuxer {
+private:
+ AVFormatContext *fmtc = NULL;
+ FFMpegAPI* api = NULL;
+ AVIOContext *avioc = NULL;
+ AVPacket pkt, pktFiltered;
+ AVBSFContext *bsfc = NULL;
+
+ int iVideoStream;
+ bool bMp4;
+ AVCodecID eVideoCodec;
+ int nWidth, nHeight, nBitDepth;
+
+ AVPixelFormat format;
+ /**
+ * Codec-specific bitstream restrictions that the stream conforms to.
+ */
+ int profile;
+ int level;
+
+ /**
+ * Video only. The aspect ratio (width / height) which a single pixel
+ * should have when displayed.
+ *
+ * When the aspect ratio is unknown / undefined, the numerator should be
+ * set to 0 (the denominator may have any value).
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * Video only. The order of the fields in interlaced video.
+ */
+ enum AVFieldOrder field_order;
+
+ /**
+ * Video only. Additional colorspace characteristics.
+ */
+ enum AVColorRange color_range;
+ enum AVColorPrimaries color_primaries;
+ enum AVColorTransferCharacteristic color_trc;
+ enum AVColorSpace color_space;
+ enum AVChromaLocation chroma_location;
+
+public:
+ class DataProvider {
+ public:
+ virtual ~DataProvider() {}
+ virtual int GetData(uint8_t *pBuf, int nBuf) = 0;
+ };
+
+private:
+ FFmpegDemuxer(AVFormatContext *fmtc_, FFMpegAPI* api_) : fmtc(fmtc_), api(api_) {
+ if (!fmtc) {
+ LOG(ERROR) << "No AVFormatContext provided.";
+ return;
+ }
+
+ LOG(INFO) << "Media format: " << fmtc->iformat->long_name << " (" << fmtc->iformat->name << ")";
+
+ ck(api->avformat_find_stream_info(fmtc, NULL));
+ iVideoStream = api->av_find_best_stream(fmtc, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
+ if (iVideoStream < 0) {
+ LOG(ERROR) << "FFmpeg error: " << __FILE__ << " " << __LINE__ << " " << "Could not find stream in input file";
+ return;
+ }
+
+ //fmtc->streams[iVideoStream]->need_parsing = AVSTREAM_PARSE_NONE;
+ eVideoCodec = fmtc->streams[iVideoStream]->codecpar->codec_id;
+ nWidth = fmtc->streams[iVideoStream]->codecpar->width;
+ nHeight = fmtc->streams[iVideoStream]->codecpar->height;
+ format = (AVPixelFormat)fmtc->streams[iVideoStream]->codecpar->format;
+ nBitDepth = 8;
+ if (fmtc->streams[iVideoStream]->codecpar->format == AV_PIX_FMT_YUV420P10LE)
+ nBitDepth = 10;
+ if (fmtc->streams[iVideoStream]->codecpar->format == AV_PIX_FMT_YUV420P12LE)
+ nBitDepth = 12;
+
+ bMp4 = (!strcmp(fmtc->iformat->long_name, "QuickTime / MOV") ||
+ !strcmp(fmtc->iformat->long_name, "FLV (Flash Video)") ||
+ !strcmp(fmtc->iformat->long_name, "Matroska / WebM"));
+
+ /**
+ * Codec-specific bitstream restrictions that the stream conforms to.
+ */
+ profile = fmtc->streams[iVideoStream]->codecpar->profile;
+ level = fmtc->streams[iVideoStream]->codecpar->level;
+
+ /**
+ * Video only. The aspect ratio (width / height) which a single pixel
+ * should have when displayed.
+ *
+ * When the aspect ratio is unknown / undefined, the numerator should be
+ * set to 0 (the denominator may have any value).
+ */
+ sample_aspect_ratio = fmtc->streams[iVideoStream]->codecpar->sample_aspect_ratio;
+
+ /**
+ * Video only. The order of the fields in interlaced video.
+ */
+ field_order = fmtc->streams[iVideoStream]->codecpar->field_order;
+
+ /**
+ * Video only. Additional colorspace characteristics.
+ */
+ color_range = fmtc->streams[iVideoStream]->codecpar->color_range;
+ color_primaries = fmtc->streams[iVideoStream]->codecpar->color_primaries;
+ color_trc = fmtc->streams[iVideoStream]->codecpar->color_trc;
+ color_space = fmtc->streams[iVideoStream]->codecpar->color_space;
+ chroma_location = fmtc->streams[iVideoStream]->codecpar->chroma_location;
+
+ api->av_init_packet(&pkt);
+ pkt.data = NULL;
+ pkt.size = 0;
+ api->av_init_packet(&pktFiltered);
+ pktFiltered.data = NULL;
+ pktFiltered.size = 0;
+
+ if (bMp4) {
+ const AVBitStreamFilter *bsf = NULL;
+
+ if (eVideoCodec == AV_CODEC_ID_H264) {
+ bsf = api->av_bsf_get_by_name("h264_mp4toannexb");
+ } else if (eVideoCodec == AV_CODEC_ID_HEVC) {
+ bsf = api->av_bsf_get_by_name("hevc_mp4toannexb");
+ }
+
+ if (!bsf) {
+ LOG(ERROR) << "FFmpeg error: " << __FILE__ << " " << __LINE__ << " " << "av_bsf_get_by_name(): " << eVideoCodec << " failed";
+ return;
+ }
+ ck(api->av_bsf_alloc(bsf, &bsfc));
+ bsfc->par_in = fmtc->streams[iVideoStream]->codecpar;
+ ck(api->av_bsf_init(bsfc));
+ }
+ }
+
+ AVFormatContext *CreateFormatContext(DataProvider *pDataProvider, FFMpegAPI* api_) {
+ api = api_;
+
+ AVFormatContext *ctx = NULL;
+ if (!(ctx = api->avformat_alloc_context())) {
+ LOG(ERROR) << "FFmpeg error: " << __FILE__ << " " << __LINE__;
+ return NULL;
+ }
+
+ uint8_t *avioc_buffer = NULL;
+ int avioc_buffer_size = 8 * 1024 * 1024;
+ avioc_buffer = (uint8_t *)api->av_malloc(avioc_buffer_size);
+ if (!avioc_buffer) {
+ LOG(ERROR) << "FFmpeg error: " << __FILE__ << " " << __LINE__;
+ return NULL;
+ }
+ avioc = api->avio_alloc_context(avioc_buffer, avioc_buffer_size,
+ 0, pDataProvider, &ReadPacket, NULL, NULL);
+ if (!avioc) {
+ LOG(ERROR) << "FFmpeg error: " << __FILE__ << " " << __LINE__;
+ return NULL;
+ }
+ ctx->pb = avioc;
+
+ ck(api->avformat_open_input(&ctx, NULL, NULL, NULL));
+ return ctx;
+ }
+
+ AVFormatContext *CreateFormatContext(const char *szFilePath, FFMpegAPI* api_) {
+ api = api_;
+
+ api->avformat_network_init();
+
+ AVFormatContext *ctx = NULL;
+ ck(api->avformat_open_input(&ctx, szFilePath, NULL, NULL));
+ return ctx;
+ }
+
+public:
+ FFmpegDemuxer(const char *szFilePath, FFMpegAPI* api_) : FFmpegDemuxer(CreateFormatContext(szFilePath, api_), api_) {}
+ FFmpegDemuxer(DataProvider *pDataProvider, FFMpegAPI* api_) : FFmpegDemuxer(CreateFormatContext(pDataProvider, api_), api_) {}
+ ~FFmpegDemuxer() {
+ if (pkt.data) {
+ api->av_packet_unref(&pkt);
+ }
+ if (pktFiltered.data) {
+ api->av_packet_unref(&pktFiltered);
+ }
+
+ api->avformat_close_input(&fmtc);
+ if (avioc) {
+ api->av_freep(&avioc->buffer);
+ api->av_freep(&avioc);
+ }
+ }
+ AVCodecID GetVideoCodec() {
+ return eVideoCodec;
+ }
+ int GetWidth() {
+ return nWidth;
+ }
+ int GetHeight() {
+ return nHeight;
+ }
+ int GetBitDepth() {
+ return nBitDepth;
+ }
+ int GetFrameSize() {
+ return nBitDepth == 8 ? nWidth * nHeight * 3 / 2: nWidth * nHeight * 3;
+ }
+ bool Demux(uint8_t **ppVideo, int *pnVideoBytes) {
+ if (!fmtc) {
+ return false;
+ }
+
+ *pnVideoBytes = 0;
+
+ if (pkt.data) {
+ api->av_packet_unref(&pkt);
+ }
+
+ int e = 0;
+ while ((e = api->av_read_frame(fmtc, &pkt)) >= 0 && pkt.stream_index != iVideoStream) {
+ api->av_packet_unref(&pkt);
+ }
+ if (e < 0) {
+ return false;
+ }
+
+ if (bMp4) {
+ if (pktFiltered.data) {
+ api->av_packet_unref(&pktFiltered);
+ }
+ ck(api->av_bsf_send_packet(bsfc, &pkt));
+ ck(api->av_bsf_receive_packet(bsfc, &pktFiltered));
+ *ppVideo = pktFiltered.data;
+ *pnVideoBytes = pktFiltered.size;
+ } else {
+ *ppVideo = pkt.data;
+ *pnVideoBytes = pkt.size;
+ }
+
+ return true;
+ }
+
+ static int ReadPacket(void *opaque, uint8_t *pBuf, int nBuf) {
+ return ((DataProvider *)opaque)->GetData(pBuf, nBuf);
+ }
+
+
+ void DumpStreamParameters() {
+
+ LOG(INFO) << "Width: " << nWidth << std::endl;
+ LOG(INFO) << "Height: " << nHeight << std::endl;
+ LOG(INFO) << "BitDepth: " << nBitDepth << std::endl;
+ LOG(INFO) << "Profile: " << profile << std::endl;
+ LOG(INFO) << "Level: " << level << std::endl;
+ LOG(INFO) << "Aspect Ration: " << (float)sample_aspect_ratio.num / (float)sample_aspect_ratio.den << std::endl;
+
+ static const char* FieldOrder[] = {
+ "UNKNOWN",
+ "PROGRESSIVE",
+ "TT: Top coded_first, top displayed first",
+ "BB: Bottom coded first, bottom displayed first",
+ "TB: Top coded first, bottom displayed first",
+ "BT: Bottom coded first, top displayed first",
+ };
+ LOG(INFO) << "Field Order: " << FieldOrder[field_order] << std::endl;
+
+ static const char* ColorRange[] = {
+ "UNSPECIFIED",
+ "MPEG: the normal 219*2^(n-8) MPEG YUV ranges",
+ "JPEG: the normal 2^n-1 JPEG YUV ranges",
+ "NB: Not part of ABI",
+ };
+ LOG(INFO) << "Color Range: " << ColorRange[color_range] << std::endl;
+
+ static const char* ColorPrimaries[] = {
+ "RESERVED0",
+ "BT709: also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B",
+ "UNSPECIFIED",
+ "RESERVED",
+ "BT470M: also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)",
+
+ "BT470BG: also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM",
+ "SMPTE170M: also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC",
+ "SMPTE240M: also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC",
+ "FILM: colour filters using Illuminant C",
+ "BT2020: ITU-R BT2020",
+ "SMPTE428: SMPTE ST 428-1 (CIE 1931 XYZ)",
+ "SMPTE431: SMPTE ST 431-2 (2011) / DCI P3",
+ "SMPTE432: SMPTE ST 432-1 (2010) / P3 D65 / Display P3",
+ "JEDEC_P22: JEDEC P22 phosphors",
+ "NB: Not part of ABI",
+ };
+ LOG(INFO) << "Color Primaries: " << ColorPrimaries[color_primaries] << std::endl;
+
+ static const char* ColorTransferCharacteristic[] = {
+ "RESERVED0",
+ "BT709: also ITU-R BT1361",
+ "UNSPECIFIED",
+ "RESERVED",
+ "GAMMA22: also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM",
+ "GAMMA28: also ITU-R BT470BG",
+ "SMPTE170M: also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC",
+ "SMPTE240M",
+ "LINEAR: Linear transfer characteristics",
+ "LOG: Logarithmic transfer characteristic (100:1 range)",
+ "LOG_SQRT: Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)",
+ "IEC61966_2_4: IEC 61966-2-4",
+ "BT1361_ECG: ITU-R BT1361 Extended Colour Gamut",
+ "IEC61966_2_1: IEC 61966-2-1 (sRGB or sYCC)",
+ "BT2020_10: ITU-R BT2020 for 10-bit system",
+ "BT2020_12: ITU-R BT2020 for 12-bit system",
+ "SMPTE2084: SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems",
+ "SMPTE428: SMPTE ST 428-1",
+ "ARIB_STD_B67: ARIB STD-B67, known as Hybrid log-gamma",
+ "NB: Not part of ABI",
+ };
+ LOG(INFO) << "Color Transfer Characteristic: " << ColorTransferCharacteristic[color_trc] << std::endl;
+
+ static const char* ColorSpace[] = {
+ "RGB: order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)",
+ "BT709: also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B",
+ "UNSPECIFIED",
+ "RESERVED",
+ "FCC: FCC Title 47 Code of Federal Regulations 73.682 (a)(20)",
+ "BT470BG: also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601",
+ "SMPTE170M: also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC",
+ "SMPTE240M: functionally identical to above",
+ "YCGCO: Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16",
+ "BT2020_NCL: ITU-R BT2020 non-constant luminance system",
+ "BT2020_CL: ITU-R BT2020 constant luminance system",
+ "SMPTE2085: SMPTE 2085, Y'D'zD'x",
+ "CHROMA_DERIVED_NCL: Chromaticity-derived non-constant luminance system",
+ "CHROMA_DERIVED_CL: Chromaticity-derived constant luminance system",
+ "ICTCP: ITU-R BT.2100-0, ICtCp",
+ "NB: Not part of ABI",
+ };
+ LOG(INFO) << "Color Space: " << ColorSpace[color_space] << std::endl;
+
+ static const char* ChromaLocation[] = {
+ "UNSPECIFIED",
+ "LEFT: MPEG-2/4 4:2:0, H.264 default for 4:2:0",
+ "CENTER: MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0",
+ "TOPLEFT: ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2",
+ "TOP",
+ "BOTTOMLEFT",
+ "BOTTOM",
+ "NB:Not part of ABI",
+ };
+ LOG(INFO) << "Chroma Location: " << ChromaLocation[chroma_location] << std::endl;
+ }
+
+};
+
+inline vk::VkVideoCodecOperationFlagBitsKHR FFmpeg2NvCodecId(AVCodecID id) {
+ switch (id) {
+ case AV_CODEC_ID_MPEG1VIDEO : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ case AV_CODEC_ID_MPEG2VIDEO : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ case AV_CODEC_ID_MPEG4 : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ case AV_CODEC_ID_VC1 : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ case AV_CODEC_ID_H264 : return vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR;
+ case AV_CODEC_ID_HEVC : return vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
+ case AV_CODEC_ID_VP8 : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+#ifdef VK_EXT_video_decode_vp9
+ case AV_CODEC_ID_VP9 : return VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR;
+#endif // VK_EXT_video_decode_vp9
+ case AV_CODEC_ID_MJPEG : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ default : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
+ }
+}
+#endif /* _EXTFFMPEGDEMUXER_H */
--- /dev/null
+#ifndef _EXTNVIDIAVIDEOPARSERIF_HPP
+#define _EXTNVIDIAVIDEOPARSERIF_HPP
+
+/*
+ * Copyright 2021 NVIDIA Corporation.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /*
+ * Copyright 2020 NVIDIA Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vkDefs.hpp"
+
+#include <atomic>
+#include <stdint.h>
+#include <string.h>
+
+namespace vkt
+{
+namespace video
+{
+#define DEBUGLOG(X)
+
+using namespace vk;
+using namespace std;
+
+class NvidiaParserVideoRefCountBase
+{
+public:
+ //! Increment the reference count by 1.
+ virtual int32_t AddRef() = 0;
+
+ //! Decrement the reference count by 1. When the reference count
+ //! goes to 0 the object is automatically destroyed.
+ virtual int32_t Release() = 0;
+
+protected:
+ virtual ~NvidiaParserVideoRefCountBase() { }
+};
+
+template<class NvidiaBaseObjType>
+class NvidiaSharedBaseObj
+{
+public:
+ NvidiaSharedBaseObj<NvidiaBaseObjType>& Reset (NvidiaBaseObjType* const newObjectPtr)
+ {
+ if (newObjectPtr != m_sharedObject)
+ {
+ int refCount = -1;
+
+ if (m_sharedObject != nullptr)
+ {
+ refCount = m_sharedObject->Release();
+
+ if (refCount < 0)
+ {
+ DE_ASSERT(0 && "RefCount less than zero");
+ }
+ }
+
+ m_sharedObject = newObjectPtr;
+
+ if (newObjectPtr != nullptr)
+ {
+ refCount = newObjectPtr->AddRef();
+
+ if (!(refCount > 0))
+ {
+ DE_ASSERT(0 && "RefCount is smaller not greater than zero");
+ }
+ }
+ }
+ return *this;
+ }
+
+ // Constructors increment the refcount of the provided object if non-nullptr
+ explicit NvidiaSharedBaseObj (NvidiaBaseObjType* const newObjectPtr = nullptr)
+ : m_sharedObject(nullptr)
+ {
+ Reset(newObjectPtr);
+ }
+
+ NvidiaSharedBaseObj (const NvidiaSharedBaseObj<NvidiaBaseObjType>& newObject)
+ : m_sharedObject(nullptr)
+ {
+ Reset(newObject.Get());
+ }
+
+ ~NvidiaSharedBaseObj ()
+ {
+ Reset(nullptr);
+ }
+
+ // Assignment from another smart pointer maps to raw pointer assignment
+ NvidiaSharedBaseObj<NvidiaBaseObjType>& operator= (const NvidiaSharedBaseObj<NvidiaBaseObjType>& sharedObject)
+ {
+ return Reset(sharedObject.Get());
+ }
+
+ NvidiaSharedBaseObj<NvidiaBaseObjType>& operator= (NvidiaBaseObjType* const newObjectPtr)
+ {
+ return Reset(newObjectPtr);
+ }
+
+ template <class VkBaseObjType2>
+ const NvidiaSharedBaseObj<NvidiaBaseObjType>& operator= (const NvidiaSharedBaseObj<VkBaseObjType2>& otherSharedObject)
+ {
+ return Reset(otherSharedObject.Get());
+ }
+
+ // Comparison operators can be used with any compatible types
+ inline bool operator== (const NvidiaSharedBaseObj<NvidiaBaseObjType>& otherObject)
+ {
+ return (this->Get() == otherObject.Get());
+ }
+
+ inline bool operator!= (const NvidiaSharedBaseObj<NvidiaBaseObjType>& otherObject)
+ {
+ return !(*this == otherObject);
+ }
+
+ bool operator! () const
+ {
+ return m_sharedObject == nullptr;
+ }
+
+ // Exchange
+ void Swap (NvidiaSharedBaseObj<NvidiaBaseObjType>& sharedObject)
+ {
+ NvidiaSharedBaseObj<NvidiaBaseObjType> tmp(m_sharedObject);
+
+ m_sharedObject = sharedObject.m_sharedObject;
+
+ sharedObject.m_sharedObject = tmp;
+ }
+
+ // Non ref-counted access to the underlying object
+ NvidiaBaseObjType* Get (void) const
+ {
+ return m_sharedObject;
+ }
+
+ // Cast to a raw object pointer
+ operator NvidiaBaseObjType* () const
+ {
+ return m_sharedObject;
+ }
+
+ NvidiaBaseObjType* operator-> () const
+ {
+ return m_sharedObject;
+ }
+
+ NvidiaBaseObjType& operator* () const
+ {
+ return *m_sharedObject;
+ }
+
+private:
+ NvidiaBaseObjType* m_sharedObject;
+};
+
+class INvidiaVulkanPicture
+{
+public:
+ virtual void AddRef() = 0;
+ virtual void Release() = 0;
+
+ int32_t decodeWidth;
+ int32_t decodeHeight;
+ int32_t decodeSuperResWidth;
+ int32_t reserved[16 - 3];
+
+protected:
+ virtual ~INvidiaVulkanPicture() { }
+};
+
+class NvidiaVulkanPictureBase : public INvidiaVulkanPicture
+{
+private:
+ std::atomic<int32_t> m_refCount;
+
+public:
+ int32_t m_picIdx;
+ int32_t m_displayOrder;
+ int32_t m_decodeOrder;
+ uint64_t m_timestamp;
+ uint64_t m_presentTime;
+
+public:
+ virtual void AddRef ()
+ {
+ DE_ASSERT(m_refCount >= 0);
+
+ ++m_refCount;
+ }
+
+ virtual void Release ()
+ {
+ DE_ASSERT(m_refCount > 0);
+
+ int32_t ref = --m_refCount;
+
+ if (ref == 0)
+ {
+ Reset();
+ }
+ }
+
+public:
+ NvidiaVulkanPictureBase ()
+ : m_refCount (0)
+ , m_picIdx (-1)
+ , m_displayOrder (-1)
+ , m_decodeOrder (-1)
+ , m_timestamp (0)
+ , m_presentTime (0)
+ {
+ }
+
+ bool IsAvailable () const
+ {
+ DE_ASSERT(m_refCount >= 0);
+
+ return (m_refCount == 0);
+ }
+
+ int32_t Reset ()
+ {
+ int32_t ref = m_refCount;
+
+ m_picIdx = -1;
+ m_displayOrder = -1;
+ m_decodeOrder = -1;
+ m_timestamp = 0;
+ m_presentTime = 0;
+ m_refCount = 0;
+
+ return ref;
+ }
+
+ virtual ~NvidiaVulkanPictureBase ()
+ {
+ Reset();
+ }
+};
+
+#define NV_VULKAN_VIDEO_PARSER_API_VERSION_0_9_6 VK_MAKE_VIDEO_STD_VERSION(0, 9, 6)
+
+#define NV_VULKAN_VIDEO_PARSER_API_VERSION NV_VULKAN_VIDEO_PARSER_API_VERSION_0_9_6
+
+typedef uint32_t FrameRate; // Packed 18-bit numerator & 14-bit denominator
+
+// Definitions for video_format
+enum
+{
+ VideoFormatComponent = 0,
+ VideoFormatPAL,
+ VideoFormatNTSC,
+ VideoFormatSECAM,
+ VideoFormatMAC,
+ VideoFormatUnspecified,
+ VideoFormatReserved6,
+ VideoFormatReserved7
+};
+
+// Definitions for color_primaries
+enum
+{
+ ColorPrimariesForbidden = 0,
+ ColorPrimariesBT709 = 1,
+ ColorPrimariesUnspecified = 2,
+ ColorPrimariesReserved = 3,
+ ColorPrimariesBT470M = 4,
+ ColorPrimariesBT470BG = 5,
+ ColorPrimariesSMPTE170M = 6, // Also, ITU-R BT.601
+ ColorPrimariesSMPTE240M = 7,
+ ColorPrimariesGenericFilm = 8,
+ ColorPrimariesBT2020 = 9,
+ // below are defined in AOM standard
+ ColorPrimariesXYZ = 10, // SMPTE 428 (CIE 1921 XYZ)
+ ColorPrimariesSMPTE431 = 11, // SMPTE RP 431-2
+ ColorPrimariesSMPTE432 = 12, // SMPTE EG 432-1
+ ColorPrimariesRESERVED13 = 13, // For future use (values 13 - 21)
+ ColorPrimariesEBU3213 = 22, // EBU Tech. 3213-E
+ ColorPrimariesRESERVED23 = 23 // For future use (values 23 - 255)
+};
+
+// Definitions for transfer_characteristics
+enum
+{
+ TransferCharacteristicsForbidden = 0,
+ TransferCharacteristicsBT709 = 1,
+ TransferCharacteristicsUnspecified = 2,
+ TransferCharacteristicsReserved = 3,
+ TransferCharacteristicsBT470M = 4,
+ TransferCharacteristicsBT470BG = 5,
+ TransferCharacteristicsSMPTE170M = 6,
+ TransferCharacteristicsSMPTE240M = 7,
+ TransferCharacteristicsLinear = 8,
+ TransferCharacteristicsLog100 = 9,
+ TransferCharacteristicsLog316 = 10,
+ TransferCharacteristicsIEC61966_2_4 = 11,
+ TransferCharacteristicsBT1361 = 12,
+ TransferCharacteristicsIEC61966_2_1 = 13,
+ TransferCharacteristicsBT2020 = 14,
+ TransferCharacteristicsBT2020_2 = 15,
+ TransferCharacteristicsST2084 = 16,
+ TransferCharacteristicsST428_1 = 17,
+ // below are defined in AOM standard
+ TransferCharacteristicsHLG = 18, // BT.2100 HLG, ARIB STD-B67
+ TransferCharacteristicsRESERVED19 = 19 // For future use (values 19-255)
+};
+
+// Definitions for matrix_coefficients
+enum
+{
+ MatrixCoefficientsForbidden = 0,
+ MatrixCoefficientsBT709 = 1,
+ MatrixCoefficientsUnspecified = 2,
+ MatrixCoefficientsReserved = 3,
+ MatrixCoefficientsFCC = 4,
+ MatrixCoefficientsBT470BG = 5,
+ MatrixCoefficientsSMPTE170M = 6,
+ MatrixCoefficientsSMPTE240M = 7,
+ MatrixCoefficientsYCgCo = 8,
+ MatrixCoefficientsBT2020_NCL = 9, // Non-constant luminance
+ MatrixCoefficientsBT2020_CL = 10, // Constant luminance
+ // below are defined in AOM standard
+ MatrixCoefficientsSMPTE2085 = 11, // SMPTE ST 2085 YDzDx
+ MatrixCoefficientsCHROMAT_NCL = 12, // Chromaticity-derived non-constant luminance
+ MatrixCoefficientsCHROMAT_CL = 13, // Chromaticity-derived constant luminance
+ MatrixCoefficientsICTCP = 14, // BT.2100 ICtCp
+ MatrixCoefficientsRESERVED15 = 15
+};
+
+// Maximum raw sequence header length (all codecs) i.e. 1024 bytes
+#define VK_MAX_SEQ_HDR_LEN (1024)
+
+typedef struct NvidiaVulkanParserH264DpbEntry
+{
+ INvidiaVulkanPicture* pNvidiaVulkanPicture; // ptr to reference frame
+ int32_t FrameIdx; // frame_num(short-term) or LongTermFrameIdx(long-term)
+ int32_t is_long_term; // 0=short term reference, 1=long term reference
+ int32_t not_existing; // non-existing reference frame (corresponding PicIdx should be set to -1)
+ int32_t used_for_reference; // 0=unused, 1=top_field, 2=bottom_field, 3=both_fields
+ int32_t FieldOrderCnt[2]; // field order count of top and bottom fields
+} NvidiaVulkanParserH264DpbEntry;
+
+typedef struct NvidiaVulkanParserH264PictureData
+{
+ // SPS
+ const struct vk::StdVideoH264SequenceParameterSet* pStdSps;
+ NvidiaParserVideoRefCountBase* pSpsClientObject;
+
+ // PPS
+ const struct vk::StdVideoH264PictureParameterSet* pStdPps;
+ NvidiaParserVideoRefCountBase* pPpsClientObject;
+
+ uint8_t pic_parameter_set_id; // PPS ID
+ uint8_t seq_parameter_set_id; // SPS ID
+ uint8_t vps_video_parameter_set_id; // VPS ID
+ int32_t num_ref_idx_l0_active_minus1;
+ int32_t num_ref_idx_l1_active_minus1;
+ int32_t weighted_pred_flag;
+ int32_t weighted_bipred_idc;
+ int32_t pic_init_qp_minus26;
+ int32_t redundant_pic_cnt_present_flag;
+ uint8_t deblocking_filter_control_present_flag;
+ uint8_t transform_8x8_mode_flag;
+ uint8_t MbaffFrameFlag;
+ uint8_t constrained_intra_pred_flag;
+ uint8_t entropy_coding_mode_flag;
+ uint8_t pic_order_present_flag;
+ int8_t chroma_qp_index_offset;
+ int8_t second_chroma_qp_index_offset;
+ int32_t frame_num;
+ int32_t CurrFieldOrderCnt[2];
+ uint8_t fmo_aso_enable;
+ uint8_t num_slice_groups_minus1;
+ uint8_t slice_group_map_type;
+ int8_t pic_init_qs_minus26;
+ uint32_t slice_group_change_rate_minus1;
+ const uint8_t* pMb2SliceGroupMap;
+ // DPB
+ NvidiaVulkanParserH264DpbEntry dpb[16 + 1]; // List of reference frames within the DPB
+
+ // Quantization Matrices (raster-order)
+ union
+ {
+ // MVC extension
+ struct
+ {
+ int32_t num_views_minus1;
+ int32_t view_id;
+ uint8_t inter_view_flag;
+ uint8_t num_inter_view_refs_l0;
+ uint8_t num_inter_view_refs_l1;
+ uint8_t MVCReserved8Bits;
+ int32_t InterViewRefsL0[16];
+ int32_t InterViewRefsL1[16];
+ } mvcext;
+ // SVC extension
+ struct
+ {
+ uint8_t profile_idc;
+ uint8_t level_idc;
+ uint8_t DQId;
+ uint8_t DQIdMax;
+ uint8_t disable_inter_layer_deblocking_filter_idc;
+ uint8_t ref_layer_chroma_phase_y_plus1;
+ int8_t inter_layer_slice_alpha_c0_offset_div2;
+ int8_t inter_layer_slice_beta_offset_div2;
+ uint16_t DPBEntryValidFlag;
+
+ union
+ {
+ struct
+ {
+ uint8_t inter_layer_deblocking_filter_control_present_flag : 1;
+ uint8_t extended_spatial_scalability_idc : 2;
+ uint8_t adaptive_tcoeff_level_prediction_flag : 1;
+ uint8_t slice_header_restriction_flag : 1;
+ uint8_t chroma_phase_x_plus1_flag : 1;
+ uint8_t chroma_phase_y_plus1 : 2;
+ uint8_t tcoeff_level_prediction_flag : 1;
+ uint8_t constrained_intra_resampling_flag : 1;
+ uint8_t ref_layer_chroma_phase_x_plus1_flag : 1;
+ uint8_t store_ref_base_pic_flag : 1;
+ uint8_t Reserved : 4;
+ } f;
+ uint8_t ucBitFields[2];
+ };
+
+ union {
+ int16_t seq_scaled_ref_layer_left_offset;
+ int16_t scaled_ref_layer_left_offset;
+ };
+ union {
+ int16_t seq_scaled_ref_layer_top_offset;
+ int16_t scaled_ref_layer_top_offset;
+ };
+ union {
+ int16_t seq_scaled_ref_layer_right_offset;
+ int16_t scaled_ref_layer_right_offset;
+ };
+ union {
+ int16_t seq_scaled_ref_layer_bottom_offset;
+ int16_t scaled_ref_layer_bottom_offset;
+ };
+ } svcext;
+ };
+} NvidiaVulkanParserH264PictureData;
+
+typedef struct NvidiaVulkanParserH265PictureData
+{
+ // VPS
+ const StdVideoH265VideoParameterSet* pStdVps;
+ NvidiaParserVideoRefCountBase* pVpsClientObject;
+
+ // SPS
+ const struct vk::StdVideoH265SequenceParameterSet* pStdSps;
+ NvidiaParserVideoRefCountBase* pSpsClientObject;
+
+ // PPS
+ const struct vk::StdVideoH265PictureParameterSet* pStdPps;
+ NvidiaParserVideoRefCountBase* pPpsClientObject;
+
+ uint8_t pic_parameter_set_id; // PPS ID
+ uint8_t seq_parameter_set_id; // SPS ID
+ uint8_t vps_video_parameter_set_id; // VPS ID
+
+ uint8_t IrapPicFlag;
+ uint8_t IdrPicFlag;
+
+ // RefPicSets
+ int32_t NumBitsForShortTermRPSInSlice;
+ int32_t NumDeltaPocsOfRefRpsIdx;
+ int32_t NumPocTotalCurr;
+ int32_t NumPocStCurrBefore;
+ int32_t NumPocStCurrAfter;
+ int32_t NumPocLtCurr;
+ int32_t CurrPicOrderCntVal;
+ INvidiaVulkanPicture* RefPics[16];
+ int32_t PicOrderCntVal[16];
+ uint8_t IsLongTerm[16]; // 1=long-term reference
+ int8_t RefPicSetStCurrBefore[8];
+ int8_t RefPicSetStCurrAfter[8];
+ int8_t RefPicSetLtCurr[8];
+
+ // various profile related
+ // 0 = invalid, 1 = Main, 2 = Main10, 3 = still picture, 4 = Main 12, 5 = MV-HEVC Main8
+ uint8_t ProfileLevel;
+ uint8_t ColorPrimaries; // ColorPrimariesBTXXXX enum
+ uint8_t bit_depth_luma_minus8;
+ uint8_t bit_depth_chroma_minus8;
+
+ // MV-HEVC related fields
+ uint8_t mv_hevc_enable;
+ uint8_t nuh_layer_id;
+ uint8_t default_ref_layers_active_flag;
+ uint8_t NumDirectRefLayers;
+ uint8_t max_one_active_ref_layer_flag;
+ uint8_t poc_lsb_not_present_flag;
+ uint8_t pad0[2];
+
+ int32_t NumActiveRefLayerPics0;
+ int32_t NumActiveRefLayerPics1;
+ int8_t RefPicSetInterLayer0[8];
+ int8_t RefPicSetInterLayer1[8];
+} NvidiaVulkanParserH265PictureData;
+
+typedef struct NvidiaVulkanParserPictureData
+{
+ int32_t PicWidthInMbs; // Coded Frame Size
+ int32_t FrameHeightInMbs; // Coded Frame Height
+ INvidiaVulkanPicture* pCurrPic; // Current picture (output)
+ int32_t field_pic_flag; // 0=frame picture, 1=field picture
+ int32_t bottom_field_flag; // 0=top field, 1=bottom field (ignored if field_pic_flag=0)
+ int32_t second_field; // Second field of a complementary field pair
+ int32_t progressive_frame; // Frame is progressive
+ int32_t top_field_first; // Frame pictures only
+ int32_t repeat_first_field; // For 3:2 pulldown (number of additional fields, 2=frame doubling, 4=frame tripling)
+ int32_t ref_pic_flag; // Frame is a reference frame
+ int32_t intra_pic_flag; // Frame is entirely intra coded (no temporal dependencies)
+ int32_t chroma_format; // Chroma Format (should match sequence info)
+ int32_t picture_order_count; // picture order count (if known)
+ uint8_t* pbSideData; // Encryption Info
+ uint32_t nSideDataLen; // Encryption Info length
+
+ // Bitstream data
+ uint32_t nBitstreamDataLen; // Number of bytes in bitstream data buffer
+ uint8_t* pBitstreamData; // Ptr to bitstream data for this picture (slice-layer)
+ uint32_t nNumSlices; // Number of slices(tiles in case of AV1) in this picture
+ const uint32_t* pSliceDataOffsets; // nNumSlices entries, contains offset of each slice within the bitstream data buffer
+
+ // Codec-specific data
+ union
+ {
+ NvidiaVulkanParserH264PictureData h264;
+ NvidiaVulkanParserH265PictureData h265;
+ } CodecSpecific;
+} NvidiaVulkanParserPictureData;
+
+// Packet input for parsing
+typedef struct NvidiaVulkanParserBitstreamPacket
+{
+ const uint8_t* pByteStream; // Ptr to byte stream data
+ int32_t nDataLength; // Data length for this packet
+ int32_t bEOS; // true if this is an End-Of-Stream packet (flush everything)
+ int32_t bPTSValid; // true if llPTS is valid (also used to detect frame boundaries for VC1 SP/MP)
+ int32_t bDiscontinuity; // true if DecMFT is signalling a discontinuity
+ int32_t bPartialParsing; // 0: parse entire packet, 1: parse until next decode/display event
+ int64_t llPTS; // Presentation Time Stamp for this packet (clock rate specified at initialization)
+ bool bDisablePP; // optional flag for VC1
+ bool bEOP; // true if the packet in pByteStream is exactly one frame
+ uint8_t* pbSideData; // Auxiliary encryption information
+ int32_t nSideDataLength; // Auxiliary encrypton information length
+} NvidiaVulkanParserBitstreamPacket;
+
+// Sequence information
+typedef struct NvidiaVulkanParserSequenceInfo
+{
+ vk::VkVideoCodecOperationFlagBitsKHR eCodec; // Compression Standard
+ bool isSVC; // h.264 SVC
+ FrameRate frameRate; // Frame Rate stored in the bitstream
+ int32_t bProgSeq; // Progressive Sequence
+ int32_t nDisplayWidth; // Displayed Horizontal Size
+ int32_t nDisplayHeight; // Displayed Vertical Size
+ int32_t nCodedWidth; // Coded Picture Width
+ int32_t nCodedHeight; // Coded Picture Height
+ int32_t nMaxWidth; // Max width within sequence
+ int32_t nMaxHeight; // Max height within sequence
+ uint8_t nChromaFormat; // Chroma Format (0=4:0:0, 1=4:2:0, 2=4:2:2, 3=4:4:4)
+ uint8_t uBitDepthLumaMinus8; // Luma bit depth (0=8bit)
+ uint8_t uBitDepthChromaMinus8; // Chroma bit depth (0=8bit)
+ uint8_t uVideoFullRange; // 0=16-235, 1=0-255
+ int32_t lBitrate; // Video bitrate (bps)
+ int32_t lDARWidth; // Display Aspect Ratio = lDARWidth : lDARHeight
+ int32_t lDARHeight; // Display Aspect Ratio = lDARWidth : lDARHeight
+ int32_t lVideoFormat; // Video Format (VideoFormatXXX)
+ int32_t lColorPrimaries; // Colour Primaries (ColorPrimariesXXX)
+ int32_t lTransferCharacteristics; // Transfer Characteristics
+ int32_t lMatrixCoefficients; // Matrix Coefficients
+ int32_t cbSequenceHeader; // Number of bytes in SequenceHeaderData
+ int32_t nMinNumDpbSlots; // Minimum number of DPB slots for correct decoding
+ int32_t nMinNumDecodeSurfaces; // Minimum number of decode surfaces for correct decoding
+ uint8_t SequenceHeaderData[VK_MAX_SEQ_HDR_LEN]; // Raw sequence header data (codec-specific)
+ uint8_t* pbSideData; // Auxiliary encryption information
+ uint32_t cbSideData; // Auxiliary encryption information length
+ uint32_t codecProfile; // Codec Profile IDC
+} NvidiaVulkanParserSequenceInfo;
+
+enum {
+ VK_PARSER_CAPS_MVC = 0x01,
+ VK_PARSER_CAPS_SVC = 0x02,
+};
+
+enum NvidiaParserPictureParametersUpdateType
+{
+ VK_PICTURE_PARAMETERS_UPDATE_H264_SPS = 0,
+ VK_PICTURE_PARAMETERS_UPDATE_H264_PPS,
+ VK_PICTURE_PARAMETERS_UPDATE_H265_VPS,
+ VK_PICTURE_PARAMETERS_UPDATE_H265_SPS,
+ VK_PICTURE_PARAMETERS_UPDATE_H265_PPS,
+};
+
+typedef struct NvidiaVulkanPictureParameters
+{
+ NvidiaParserPictureParametersUpdateType updateType;
+ union
+ {
+ const struct vk::StdVideoH264SequenceParameterSet* pH264Sps;
+ const struct vk::StdVideoH264PictureParameterSet* pH264Pps;
+ const struct vk::StdVideoH265VideoParameterSet* pH265Vps;
+ const struct vk::StdVideoH265SequenceParameterSet* pH265Sps;
+ const struct vk::StdVideoH265PictureParameterSet* pH265Pps;
+ };
+ uint32_t updateSequenceCount;
+} NvidiaVulkanPictureParameters;
+
+// Interface to allow decoder to communicate with the client
+class NvidiaVulkanParserVideoDecodeClient
+{
+public:
+ // callback
+ virtual int32_t BeginSequence (const NvidiaVulkanParserSequenceInfo* pnvsi) = 0; // Returns max number of reference frames (always at least 2 for MPEG-2)
+ virtual bool AllocPictureBuffer (INvidiaVulkanPicture** ppNvidiaVulkanPicture) = 0; // Returns a new INvidiaVulkanPicture interface
+ virtual bool DecodePicture (NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData) = 0; // Called when a picture is ready to be decoded
+ virtual bool UpdatePictureParameters (NvidiaVulkanPictureParameters* pNvidiaVulkanPictureParameters,
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase>& pictureParametersObject,
+ uint64_t updateSequenceCount) = 0; // Called when a picture is ready to be decoded
+ virtual bool DisplayPicture (INvidiaVulkanPicture* pNvidiaVulkanPicture,
+ int64_t llPTS) = 0;
+ virtual void UnhandledNALU (const uint8_t* pbData,
+ int32_t cbData) = 0; // Called for custom NAL parsing (not required)
+ virtual uint32_t GetDecodeCaps () { return 0; } // NVD_CAPS_XXX
+ virtual int32_t GetOperatingPoint (void* /* pOPInfo */) { return 0; } // called from sequence header of av1 scalable video streams
+
+protected:
+ virtual ~NvidiaVulkanParserVideoDecodeClient () {}
+};
+
+// Initialization parameters for decoder class
+typedef struct NvidiaVulkanParserInitDecodeParameters
+{
+ uint32_t interfaceVersion;
+ NvidiaVulkanParserVideoDecodeClient* pClient; // should always be present if using parsing functionality
+ uint64_t lReferenceClockRate; // ticks per second of PTS clock (0=default=10000000=10Mhz)
+ int32_t lErrorThreshold; // threshold for deciding to bypass of picture (0=do not decode, 100=always decode)
+ NvidiaVulkanParserSequenceInfo* pExternalSeqInfo; // optional external sequence header data from system layer
+ bool bOutOfBandPictureParameters; // If set, Picture Parameters are going to be provided via UpdatePictureParameters callback
+} NvidiaVulkanParserInitDecodeParameters;
+
+// High-level interface to video decoder (Note that parsing and decoding functionality are decoupled from each other)
+// Some unused parameters has been replaced with void*
+class NvidiaVulkanVideoDecodeParser : public virtual NvidiaParserVideoRefCountBase
+{
+public:
+ virtual VkResult Initialize (NvidiaVulkanParserInitDecodeParameters* pVulkanParserInitDecodeParameters) = 0;
+ virtual bool Deinitialize () = 0;
+ virtual bool DecodePicture (NvidiaVulkanParserPictureData* pVulkanParserPictureData) = 0;
+ virtual bool ParseByteStream (const NvidiaVulkanParserBitstreamPacket* pVulkanParserBitstreamPacket,
+ int32_t* pParsedBytes = NULL) = 0;
+ virtual bool DecodeSliceInfo (void* pVulkanParserSliceInfo,
+ const void* pVulkanParserPictureData,
+ int32_t iSlice) = 0;
+ virtual bool GetDisplayMasteringInfo (void* pVulkanParserDisplayMasteringInfo) = 0;
+};
+
+struct SpsVideoH264PictureParametersSet
+{
+ vk::StdVideoH264SequenceParameterSet stdSps;
+ vk::StdVideoH264SequenceParameterSetVui stdVui;
+ vk::StdVideoH264ScalingLists spsStdScalingLists;
+};
+
+struct PpsVideoH264PictureParametersSet
+{
+ vk::StdVideoH264PictureParameterSet stdPps;
+ vk::StdVideoH264ScalingLists ppsStdScalingLists;
+};
+
+struct SpsVideoH265PictureParametersSet
+{
+ vk::StdVideoH265SequenceParameterSet stdSps;
+ vk::StdVideoH265SequenceParameterSetVui stdVui;
+ vk::StdVideoH265ScalingLists spsStdScalingLists;
+};
+
+struct PpsVideoH265PictureParametersSet
+{
+ vk::StdVideoH265PictureParameterSet stdPps;
+ vk::StdVideoH265ScalingLists ppsStdScalingLists;
+};
+
+class StdVideoPictureParametersSet : public NvidiaParserVideoRefCountBase
+{
+public:
+
+ void Update(NvidiaVulkanPictureParameters* pPictureParameters, uint32_t updateSequenceCount)
+ {
+ switch (pPictureParameters->updateType)
+ {
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_PPS:
+ {
+
+ if (pPictureParameters->updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_SPS)
+ {
+ m_data.h264Sps.stdSps = *pPictureParameters->pH264Sps;
+ if (pPictureParameters->pH264Sps->pScalingLists)
+ {
+ m_data.h264Sps.spsStdScalingLists = *pPictureParameters->pH264Sps->pScalingLists;
+ m_data.h264Sps.stdSps.pScalingLists = &m_data.h264Sps.spsStdScalingLists;
+ }
+
+ if (pPictureParameters->pH264Sps->pSequenceParameterSetVui)
+ {
+ m_data.h264Sps.stdVui = *pPictureParameters->pH264Sps->pSequenceParameterSetVui;
+ m_data.h264Sps.stdSps.pSequenceParameterSetVui = &m_data.h264Sps.stdVui;
+ }
+ }
+ else if (pPictureParameters->updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_PPS)
+ {
+ m_data.h264Pps.stdPps = *pPictureParameters->pH264Pps;
+
+ if (pPictureParameters->pH264Pps->pScalingLists)
+ {
+ m_data.h264Pps.ppsStdScalingLists = *pPictureParameters->pH264Pps->pScalingLists;
+ m_data.h264Pps.stdPps.pScalingLists = &m_data.h264Pps.ppsStdScalingLists;
+ }
+ }
+
+ break;
+ }
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_VPS:
+ {
+ // Vulkan Video Decode APIs do not support VPS parameters
+ break;
+ }
+
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_PPS:
+ {
+ if (pPictureParameters->updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_SPS)
+ {
+ m_data.h265Sps.stdSps = *pPictureParameters->pH265Sps;
+ if (pPictureParameters->pH265Sps->pScalingLists)
+ {
+ m_data.h265Sps.spsStdScalingLists = *pPictureParameters->pH265Sps->pScalingLists;
+ m_data.h265Sps.stdSps.pScalingLists = &m_data.h265Sps.spsStdScalingLists;
+ }
+ if (pPictureParameters->pH265Sps->pSequenceParameterSetVui)
+ {
+ m_data.h265Sps.stdVui = *pPictureParameters->pH265Sps->pSequenceParameterSetVui;
+ m_data.h265Sps.stdSps.pSequenceParameterSetVui = &m_data.h265Sps.stdVui;
+ }
+
+ }
+ else if (pPictureParameters->updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_PPS)
+ {
+ m_data.h265Pps.stdPps = *pPictureParameters->pH265Pps;
+
+ if (pPictureParameters->pH265Pps->pScalingLists)
+ {
+ m_data.h265Pps.ppsStdScalingLists = *pPictureParameters->pH265Pps->pScalingLists;
+ m_data.h265Pps.stdPps.pScalingLists = &m_data.h265Pps.ppsStdScalingLists;
+ }
+ }
+
+ break;
+ }
+ default:
+ DE_ASSERT(0 && "Invalid Parser format");
+ }
+
+ m_updateSequenceCount = updateSequenceCount;
+ }
+
+ int32_t GetSpsId(bool& isSps) const
+ {
+ isSps = false;
+
+ switch (m_updateType)
+ {
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_SPS:
+ isSps = true;
+ return m_data.h264Sps.stdSps.seq_parameter_set_id;
+
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_PPS:
+ return m_data.h264Pps.stdPps.seq_parameter_set_id;
+
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_SPS:
+ isSps = true;
+ return m_data.h265Sps.stdSps.sps_seq_parameter_set_id;
+
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_PPS:
+ return m_data.h265Pps.stdPps.pps_seq_parameter_set_id;
+
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_VPS:
+ return m_data.h265Pps.stdPps.pps_seq_parameter_set_id;
+
+ default:
+ DE_ASSERT(0 && "Invalid STD type");
+ }
+
+ return -1;
+ }
+
+ int32_t GetPpsId(bool& isPps) const
+ {
+ isPps = false;
+ switch (m_updateType)
+ {
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_SPS:
+ break;
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_PPS:
+ isPps = true;
+ return m_data.h264Pps.stdPps.pic_parameter_set_id;
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_SPS:
+ break;
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_PPS:
+ isPps = true;
+ return m_data.h265Pps.stdPps.pps_pic_parameter_set_id;
+ default:
+ DE_ASSERT(0 && "Invalid STD type");
+ }
+ return -1;
+ }
+
+ static StdVideoPictureParametersSet* Create(NvidiaVulkanPictureParameters* pPictureParameters, uint64_t updateSequenceCount)
+ {
+ StdVideoPictureParametersSet* pNewSet = new StdVideoPictureParametersSet(pPictureParameters->updateType);
+
+ pNewSet->Update(pPictureParameters, (uint32_t)updateSequenceCount);
+
+ return pNewSet;
+ }
+
+ static StdVideoPictureParametersSet* StdVideoPictureParametersSetFromBase(NvidiaParserVideoRefCountBase* pBase)
+ {
+ if (!pBase)
+ return DE_NULL;
+
+ StdVideoPictureParametersSet* result = dynamic_cast<StdVideoPictureParametersSet*>(pBase);
+
+ if (result)
+ return result;
+
+ TCU_THROW(InternalError, "Invalid StdVideoPictureParametersSet from pBase");
+ }
+
+ virtual int32_t AddRef()
+ {
+ return ++m_refCount;
+ }
+
+ virtual int32_t Release()
+ {
+ uint32_t ret = --m_refCount;
+
+ // Destroy the device if refcount reaches zero
+ if (ret == 0)
+ {
+ delete this;
+ }
+
+ return ret;
+ }
+
+private:
+ std::atomic<int32_t> m_refCount;
+
+public:
+ NvidiaParserPictureParametersUpdateType m_updateType;
+ union
+ {
+ SpsVideoH264PictureParametersSet h264Sps;
+ PpsVideoH264PictureParametersSet h264Pps;
+ SpsVideoH265PictureParametersSet h265Sps;
+ PpsVideoH265PictureParametersSet h265Pps;
+ } m_data;
+
+ uint32_t m_updateSequenceCount;
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase> m_vkObjectOwner; // NvidiaParserVideoPictureParameters
+ vk::VkVideoSessionKHR m_vkVideoDecodeSession;
+private:
+
+ StdVideoPictureParametersSet (NvidiaParserPictureParametersUpdateType updateType)
+ : m_refCount (0)
+ , m_updateType (updateType)
+ , m_data ()
+ , m_updateSequenceCount (0)
+ , m_vkVideoDecodeSession (DE_NULL)
+ {
+ }
+
+ ~StdVideoPictureParametersSet()
+ {
+ m_vkObjectOwner = nullptr;
+ m_vkVideoDecodeSession = vk::VkVideoSessionKHR();
+ }
+
+};
+
+struct VulkanParserDetectedVideoFormat
+{
+ vk::VkVideoCodecOperationFlagBitsKHR codec; // Compression format
+ uint32_t codecProfile;
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ VkVideoChromaSubsamplingFlagBitsKHR chromaSubsampling;
+ uint32_t frame_rate_numerator; // Frame rate denominator (0 = unspecified or variable frame rate)
+ uint32_t frame_rate_denominator;
+ uint8_t sequenceUpdate : 1; // if true, this is a sequence update and not the first time StartVideoSequence is being called.
+ uint8_t sequenceReconfigireFormat : 1; // if true, this is a sequence update for the video format.
+ uint8_t sequenceReconfigireCodedExtent : 1; // if true, this is a sequence update for the video coded extent.
+ uint8_t progressive_sequence : 1; // false = interlaced, true = progressive
+ uint8_t bit_depth_luma_minus8; // high bit depth luma. E.g, 2 for 10-bitdepth, 4 for 12-bitdepth
+ uint8_t bit_depth_chroma_minus8; // high bit depth chroma. E.g, 2 for 10-bitdepth, 4 for 12-bitdepth
+ uint8_t reserved1; // Reserved for future use
+ uint32_t coded_width; // Coded frame width in pixels
+ uint32_t coded_height; // Coded frame height in pixels
+
+ struct
+ {
+ int32_t left; // left position of display rect
+ int32_t top; // top position of display rect
+ int32_t right; // right position of display rect
+ int32_t bottom; // bottom position of display rect
+ } display_area;
+
+ uint32_t bitrate; // Video bitrate (bps, 0=unknown)
+ int32_t display_aspect_ratio_x;
+ int32_t display_aspect_ratio_y;
+ uint32_t minNumDecodeSurfaces; // Minimum number of decode surfaces for correct decoding (NumRefFrames + 2;)
+ uint32_t maxNumDpbSlots; // Can't be more than 16 + 1
+
+ struct
+ {
+ uint8_t video_format : 3; // 0-Component, 1-PAL, 2-NTSC, 3-SECAM, 4-MAC, 5-Unspecified
+ uint8_t video_full_range_flag : 1; // indicates the black level and luma and chroma range
+ uint8_t reserved_zero_bits : 4; // Reserved bits
+ uint8_t color_primaries; // Chromaticity coordinates of source primaries
+ uint8_t transfer_characteristics; // Opto-electronic transfer characteristic of the source picture
+ uint8_t matrix_coefficients; // used in deriving luma and chroma signals from RGB primaries
+ } video_signal_description; // Video Signal Description. Refer section E.2.1 (VUI parameters semantics) of H264 spec file
+ uint32_t seqhdr_data_length; // Additional bytes following (NVVIDEOFORMATEX)
+};
+
+union VulkanParserFieldFlags
+{
+ struct
+ {
+ uint32_t progressiveFrame : 1; // Frame is progressive
+ uint32_t fieldPic : 1; // 0 = frame picture, 1 = field picture
+ uint32_t bottomField : 1; // 0 = top field, 1 = bottom field (ignored if field_pic_flag=0)
+ uint32_t secondField : 1; // Second field of a complementary field pair
+ uint32_t topFieldFirst : 1; // Frame pictures only
+ uint32_t unpairedField : 1; // Incomplete (half) frame.
+ uint32_t syncFirstReady : 1; // Synchronize the second field to the first one.
+ uint32_t syncToFirstField : 1; // Synchronize the second field to the first one.
+ uint32_t repeatFirstField : 3; // For 3:2 pulldown (number of additional fields, 2 = frame doubling, 4 = frame tripling)
+ uint32_t refPic : 1; // Frame is a reference frame
+ };
+ uint32_t fieldFlags;
+};
+
+struct VulkanParserFrameSyncinfo
+{
+ uint32_t unpairedField : 1; // Generate a semaphore reference, do not return the semaphore.
+ uint32_t syncToFirstField : 1; // Use the semaphore from the unpared field to wait on.
+ void* pDebugInterface;
+};
+
+struct VulkanParserDecodePictureInfo
+{
+ int32_t displayWidth;
+ int32_t displayHeight;
+ int32_t pictureIndex; // Index of the current picture
+ VulkanParserFieldFlags flags;
+ VulkanParserFrameSyncinfo frameSyncinfo;
+ uint16_t videoFrameType; // VideoFrameType - use Vulkan codec specific type pd->CodecSpecific.h264.slice_type.
+ uint16_t viewId; // from pictureInfoH264->ext.mvcext.view_id
+};
+
+struct PerFrameDecodeParameters
+{
+ enum
+ {
+ MAX_DPB_REF_SLOTS = 16 + 1
+ };
+
+ int currPicIdx; // Output index of the current picture
+ StdVideoPictureParametersSet* pCurrentPictureParameters;
+ unsigned int bitstreamDataLen; // Number of bytes in bitstream data buffer
+ const unsigned char* pBitstreamData; // ptr to bitstream data for this picture (slice-layer)
+ vk::VkVideoDecodeInfoKHR decodeFrameInfo;
+ int32_t numGopReferenceSlots;
+ int8_t pGopReferenceImagesIndexes[MAX_DPB_REF_SLOTS];
+ vk::VkVideoPictureResourceInfoKHR pictureResources[MAX_DPB_REF_SLOTS];
+};
+
+} // video
+} // vkt
+
+#endif // _EXTNVIDIAVIDEOPARSERIF_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Decoding Base Classe Functionality
+ *//*--------------------------------------------------------------------*/
+ /*
+ * Copyright 2020 NVIDIA Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vktVideoBaseDecodeUtils.hpp"
+#include "tcuPlatform.hpp"
+#include "vkDefs.hpp"
+#include "vkRef.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkStrUtil.hpp"
+#include "deSTLUtil.hpp"
+#include "deRandom.hpp"
+
+#include <iostream>
+
+namespace vkt
+{
+namespace video
+{
+using namespace vk;
+using namespace std;
+using de::MovePtr;
+using de::SharedPtr;
+
+static const uint32_t topFieldShift = 0;
+static const uint32_t topFieldMask = (1 << topFieldShift);
+static const uint32_t bottomFieldShift = 1;
+static const uint32_t bottomFieldMask = (1 << bottomFieldShift);
+static const uint32_t fieldIsReferenceMask = (topFieldMask | bottomFieldMask);
+static const uint32_t EXTRA_DPB_SLOTS = 1;
+static const uint32_t MAX_DPB_SLOTS_PLUS_1 = 16 + EXTRA_DPB_SLOTS;
+
+#define HEVC_MAX_DPB_SLOTS 16
+#define AVC_MAX_DPB_SLOTS 17
+
+#define NVIDIA_FRAME_RATE_NUM(rate) ((rate) >> 14)
+#define NVIDIA_FRAME_RATE_DEN(rate) ((rate)&0x3fff)
+
+template<typename T>
+inline const T* dataOrNullPtr (const std::vector<T>& v)
+{
+ return (v.empty() ? DE_NULL : &v[0]);
+}
+
+template<typename T>
+inline T* dataOrNullPtr (std::vector<T>& v)
+{
+ return (v.empty() ? DE_NULL : &v[0]);
+}
+
+template<typename T>
+inline T& incSizeSafe (std::vector<T>& v)
+{
+ DE_ASSERT(v.size() < v.capacity()); // Disable grow
+
+ v.resize(v.size() + 1);
+
+ return v.back();
+}
+
+
+
+/******************************************************/
+//! \struct nvVideoH264PicParameters
+//! H.264 picture parameters
+/******************************************************/
+struct nvVideoH264PicParameters
+{
+ enum { MAX_REF_PICTURES_LIST_ENTRIES = 16 };
+
+ StdVideoDecodeH264PictureInfo stdPictureInfo;
+ VkVideoDecodeH264PictureInfoKHR pictureInfo;
+ VkVideoDecodeH264SessionParametersAddInfoKHR pictureParameters;
+ VkVideoDecodeH264DpbSlotInfoKHR mvcInfo;
+ NvidiaVideoDecodeH264DpbSlotInfo currentDpbSlotInfo;
+ NvidiaVideoDecodeH264DpbSlotInfo dpbRefList[MAX_REF_PICTURES_LIST_ENTRIES];
+};
+
+/*******************************************************/
+//! \struct nvVideoH265PicParameters
+//! HEVC picture parameters
+/*******************************************************/
+struct nvVideoH265PicParameters
+{
+ enum { MAX_REF_PICTURES_LIST_ENTRIES = 16 };
+
+ StdVideoDecodeH265PictureInfo stdPictureInfo;
+ VkVideoDecodeH265PictureInfoKHR pictureInfo;
+ VkVideoDecodeH265SessionParametersAddInfoKHR pictureParameters;
+ NvidiaVideoDecodeH265DpbSlotInfo dpbRefList[MAX_REF_PICTURES_LIST_ENTRIES];
+};
+
+
+inline NvidiaVulkanPictureBase* GetPic (INvidiaVulkanPicture* pPicBuf)
+{
+ return (NvidiaVulkanPictureBase*)pPicBuf;
+}
+
+inline VkVideoChromaSubsamplingFlagBitsKHR ConvertStdH264ChromaFormatToVulkan (StdVideoH264ChromaFormatIdc stdFormat)
+{
+ switch (stdFormat)
+ {
+ case STD_VIDEO_H264_CHROMA_FORMAT_IDC_420: return VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR;
+ case STD_VIDEO_H264_CHROMA_FORMAT_IDC_422: return VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR;
+ case STD_VIDEO_H264_CHROMA_FORMAT_IDC_444: return VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR;
+ default: TCU_THROW(InternalError, "Invalid chroma sub-sampling format");
+ }
+}
+
+VkFormat codecGetVkFormat (VkVideoChromaSubsamplingFlagBitsKHR chromaFormatIdc,
+ int bitDepthLuma,
+ bool isSemiPlanar)
+{
+ switch (chromaFormatIdc)
+ {
+ case VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR:
+ {
+ switch (bitDepthLuma)
+ {
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR: return VK_FORMAT_R8_UNORM;
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR: return VK_FORMAT_R10X6_UNORM_PACK16;
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR: return VK_FORMAT_R12X4_UNORM_PACK16;
+ default: TCU_THROW(InternalError, "Cannot map monochrome format to VkFormat");
+ }
+ }
+ case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
+ {
+ switch (bitDepthLuma)
+ {
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G8_B8R8_2PLANE_420_UNORM : VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 : VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 : VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16);
+ default: TCU_THROW(InternalError, "Cannot map 420 format to VkFormat");
+ }
+ }
+ case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
+ {
+ switch (bitDepthLuma)
+ {
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G8_B8R8_2PLANE_422_UNORM : VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 : VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 : VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16);
+ default: TCU_THROW(InternalError, "Cannot map 422 format to VkFormat");
+ }
+ }
+ case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
+ {
+ switch (bitDepthLuma)
+ {
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT : VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT : VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16);
+ case VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR: return (isSemiPlanar ? VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT : VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16);
+ default: TCU_THROW(InternalError, "Cannot map 444 format to VkFormat");
+ }
+ }
+ default: TCU_THROW(InternalError, "Unknown input idc format");
+ }
+}
+
+VkVideoComponentBitDepthFlagsKHR getLumaBitDepth (deUint8 lumaBitDepthMinus8)
+{
+ switch (lumaBitDepthMinus8)
+ {
+ case 0: return VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR;
+ case 2: return VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR;
+ case 4: return VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR;
+ default:TCU_THROW(InternalError, "Unhandler lumaBitDepthMinus8");
+ }
+}
+
+VkVideoComponentBitDepthFlagsKHR getChromaBitDepth (deUint8 chromaBitDepthMinus8)
+{
+ switch (chromaBitDepthMinus8)
+ {
+ case 0: return VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR;
+ case 2: return VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR;
+ case 4: return VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR;
+ default:TCU_THROW(InternalError, "Unhandler chromaBitDepthMinus8");
+ }
+}
+
+void setImageLayout (const DeviceInterface& vkd,
+ VkCommandBuffer cmdBuffer,
+ VkImage image,
+ VkImageLayout oldImageLayout,
+ VkImageLayout newImageLayout,
+ VkPipelineStageFlags2KHR srcStages,
+ VkPipelineStageFlags2KHR dstStages,
+ VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT)
+{
+ VkAccessFlags2KHR srcAccessMask = 0;
+ VkAccessFlags2KHR dstAccessMask = 0;
+
+ switch (static_cast<VkImageLayout>(oldImageLayout))
+ {
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_PREINITIALIZED: srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: srcAccessMask = VK_ACCESS_SHADER_READ_BIT; break;
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR: srcAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR; break;
+ default: srcAccessMask = 0; break;
+ }
+
+ switch (static_cast<VkImageLayout>(newImageLayout))
+ {
+ case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; break;
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: dstAccessMask = VK_ACCESS_SHADER_READ_BIT; break;
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; break;
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR: dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR; break;
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR: dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR; break;
+ case VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR: dstAccessMask = VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR; break;
+ case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR: dstAccessMask = VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR | VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR; break;
+ case VK_IMAGE_LAYOUT_GENERAL: dstAccessMask = VK_ACCESS_HOST_WRITE_BIT; break;
+ default: dstAccessMask = 0; break;
+ }
+
+ const VkImageMemoryBarrier2KHR imageMemoryBarrier =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ srcStages, // VkPipelineStageFlags2KHR srcStageMask;
+ srcAccessMask, // VkAccessFlags2KHR srcAccessMask;
+ dstStages, // VkPipelineStageFlags2KHR dstStageMask;
+ dstAccessMask, // VkAccessFlags2KHR dstAccessMask;
+ oldImageLayout, // VkImageLayout oldLayout;
+ newImageLayout, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
+ image, // VkImage image;
+ { aspectMask, 0, 1, 0, 1 }, // VkImageSubresourceRange subresourceRange;
+ };
+
+ const VkDependencyInfoKHR dependencyInfo =
+ {
+ VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_DEPENDENCY_BY_REGION_BIT, // VkDependencyFlags dependencyFlags;
+ 0, // deUint32 memoryBarrierCount;
+ DE_NULL, // const VkMemoryBarrier2KHR* pMemoryBarriers;
+ 0, // deUint32 bufferMemoryBarrierCount;
+ DE_NULL, // const VkBufferMemoryBarrier2KHR* pBufferMemoryBarriers;
+ 1, // deUint32 imageMemoryBarrierCount;
+ &imageMemoryBarrier, // const VkImageMemoryBarrier2KHR* pImageMemoryBarriers;
+ };
+
+ vkd.cmdPipelineBarrier2(cmdBuffer, &dependencyInfo);
+}
+
+NvidiaVideoDecodeH264DpbSlotInfo::NvidiaVideoDecodeH264DpbSlotInfo ()
+ : dpbSlotInfo()
+ , stdReferenceInfo()
+{
+}
+
+const VkVideoDecodeH264DpbSlotInfoKHR* NvidiaVideoDecodeH264DpbSlotInfo::Init (int32_t slotIndex)
+{
+ DE_UNREF(slotIndex);
+
+ dpbSlotInfo.sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR;
+ dpbSlotInfo.pNext = DE_NULL;
+ dpbSlotInfo.pStdReferenceInfo = &stdReferenceInfo;
+
+ return &dpbSlotInfo;
+}
+
+bool NvidiaVideoDecodeH264DpbSlotInfo::IsReference () const
+{
+ return (dpbSlotInfo.pStdReferenceInfo == &stdReferenceInfo);
+}
+
+NvidiaVideoDecodeH264DpbSlotInfo::operator bool() const
+{
+ return IsReference();
+}
+
+void NvidiaVideoDecodeH264DpbSlotInfo::Invalidate ()
+{
+ deMemset(this, 0x00, sizeof(*this));
+}
+
+NvidiaVideoDecodeH265DpbSlotInfo::NvidiaVideoDecodeH265DpbSlotInfo ()
+ : dpbSlotInfo()
+ , stdReferenceInfo()
+{
+}
+
+const VkVideoDecodeH265DpbSlotInfoKHR* NvidiaVideoDecodeH265DpbSlotInfo::Init (int32_t slotIndex)
+{
+ DE_UNREF(slotIndex);
+
+ dpbSlotInfo.sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR;
+ dpbSlotInfo.pNext = DE_NULL;
+ dpbSlotInfo.pStdReferenceInfo = &stdReferenceInfo;
+
+ return &dpbSlotInfo;
+}
+
+bool NvidiaVideoDecodeH265DpbSlotInfo::IsReference() const
+{
+ return (dpbSlotInfo.pStdReferenceInfo == &stdReferenceInfo);
+}
+
+NvidiaVideoDecodeH265DpbSlotInfo::operator bool() const
+{
+ return IsReference();
+}
+
+void NvidiaVideoDecodeH265DpbSlotInfo::Invalidate()
+{
+ deMemset(this, 0x00, sizeof(*this));
+}
+
+// Keeps track of data associated with active internal reference frames
+bool DpbSlot::isInUse (void)
+{
+ return (m_reserved || m_inUse);
+}
+
+bool DpbSlot::isAvailable (void)
+{
+ return !isInUse();
+}
+
+bool DpbSlot::Invalidate (void)
+{
+ bool wasInUse = isInUse();
+
+ if (m_picBuf)
+ {
+ m_picBuf->Release();
+ m_picBuf = DE_NULL;
+ }
+
+ m_reserved = m_inUse = false;
+
+ return wasInUse;
+}
+
+NvidiaVulkanPictureBase* DpbSlot::getPictureResource (void)
+{
+ return m_picBuf;
+}
+
+NvidiaVulkanPictureBase* DpbSlot::setPictureResource (NvidiaVulkanPictureBase* picBuf)
+{
+ NvidiaVulkanPictureBase* oldPic = m_picBuf;
+
+ if (picBuf)
+ {
+ picBuf->AddRef();
+ }
+
+ m_picBuf = picBuf;
+
+ if (oldPic)
+ {
+ oldPic->Release();
+ }
+
+ return oldPic;
+}
+
+void DpbSlot::Reserve (void)
+{
+ m_reserved = true;
+}
+
+void DpbSlot::MarkInUse ()
+{
+ m_inUse = true;
+}
+
+DpbSlots::DpbSlots (uint32_t dpbMaxSize)
+ : m_dpbMaxSize (0)
+ , m_slotInUseMask (0)
+ , m_dpb (m_dpbMaxSize)
+ , m_dpbSlotsAvailable ()
+{
+ Init(dpbMaxSize, false);
+}
+
+int32_t DpbSlots::Init (uint32_t newDpbMaxSize, bool reconfigure)
+{
+ DE_ASSERT(newDpbMaxSize <= MAX_DPB_SLOTS_PLUS_1);
+
+ if (!reconfigure)
+ {
+ Deinit();
+ }
+
+ if (reconfigure && newDpbMaxSize < m_dpbMaxSize)
+ {
+ return m_dpbMaxSize;
+ }
+
+ uint32_t oldDpbMaxSize = reconfigure ? m_dpbMaxSize : 0;
+ m_dpbMaxSize = newDpbMaxSize;
+
+ m_dpb.resize(m_dpbMaxSize);
+
+ for (uint32_t ndx = oldDpbMaxSize; ndx < m_dpbMaxSize; ndx++)
+ {
+ m_dpb[ndx].Invalidate();
+ }
+
+ for (uint32_t dpbIndx = oldDpbMaxSize; dpbIndx < m_dpbMaxSize; dpbIndx++)
+ {
+ m_dpbSlotsAvailable.push((uint8_t)dpbIndx);
+ }
+
+ return m_dpbMaxSize;
+}
+
+void DpbSlots::Deinit (void)
+{
+ for (uint32_t ndx = 0; ndx < m_dpbMaxSize; ndx++)
+ m_dpb[ndx].Invalidate();
+
+ while (!m_dpbSlotsAvailable.empty())
+ m_dpbSlotsAvailable.pop();
+
+ m_dpbMaxSize = 0;
+ m_slotInUseMask = 0;
+}
+
+DpbSlots::~DpbSlots ()
+{
+ Deinit();
+}
+
+int8_t DpbSlots::AllocateSlot (void)
+{
+ DE_ASSERT(!m_dpbSlotsAvailable.empty());
+
+ int8_t slot = (int8_t)m_dpbSlotsAvailable.front();
+
+ DE_ASSERT((slot >= 0) && ((uint8_t)slot < m_dpbMaxSize));
+
+ m_slotInUseMask |= (1 << slot);
+ m_dpbSlotsAvailable.pop();
+ m_dpb[slot].Reserve();
+
+ return slot;
+}
+
+void DpbSlots::FreeSlot (int8_t slot)
+{
+ DE_ASSERT((uint8_t)slot < m_dpbMaxSize);
+ DE_ASSERT(m_dpb[slot].isInUse());
+ DE_ASSERT(m_slotInUseMask & (1 << slot));
+
+ m_dpb[slot].Invalidate();
+ m_dpbSlotsAvailable.push(slot);
+ m_slotInUseMask &= ~(1 << slot);
+}
+
+DpbSlot& DpbSlots::operator[] (uint32_t slot)
+{
+ DE_ASSERT(slot < m_dpbMaxSize);
+
+ return m_dpb[slot];
+}
+
+void DpbSlots::MapPictureResource (NvidiaVulkanPictureBase* pPic, int32_t dpbSlot)
+{
+ for (uint32_t slot = 0; slot < m_dpbMaxSize; slot++)
+ {
+ if ((uint8_t)slot == dpbSlot)
+ {
+ m_dpb[slot].setPictureResource(pPic);
+ }
+ else if (pPic)
+ {
+ if (m_dpb[slot].getPictureResource() == pPic)
+ {
+ FreeSlot((uint8_t)slot);
+ }
+ }
+ }
+}
+
+uint32_t DpbSlots::getSlotInUseMask ()
+{
+ return m_slotInUseMask;
+}
+
+uint32_t DpbSlots::getMaxSize ()
+{
+ return m_dpbMaxSize;
+}
+
+typedef struct dpbEntry
+{
+ int8_t dpbSlot;
+ // bit0(used_for_reference)=1: top field used for reference,
+ // bit1(used_for_reference)=1: bottom field used for reference
+ uint32_t used_for_reference : 2;
+ uint32_t is_long_term : 1; // 0 = short-term, 1 = long-term
+ uint32_t is_non_existing : 1; // 1 = marked as non-existing
+ uint32_t is_field_ref : 1; // set if unpaired field or complementary field pair
+
+ union
+ {
+ int16_t FieldOrderCnt[2]; // h.264 : 2*32 [top/bottom].
+ int32_t PicOrderCnt; // HEVC PicOrderCnt
+ };
+
+ union
+ {
+ int16_t FrameIdx; // : 16 short-term: FrameNum (16 bits), long-term: LongTermFrameIdx (4 bits)
+ int8_t originalDpbIndex; // Original Dpb source Index.
+ };
+
+ NvidiaVulkanPictureBase* m_picBuff; // internal picture reference
+
+ void setReferenceAndTopBoottomField (bool isReference,
+ bool nonExisting,
+ bool isLongTerm,
+ bool isFieldRef,
+ bool topFieldIsReference,
+ bool bottomFieldIsReference,
+ int16_t frameIdx,
+ const int16_t fieldOrderCntList[2],
+ NvidiaVulkanPictureBase* picBuff)
+ {
+ is_non_existing = nonExisting;
+ is_long_term = isLongTerm;
+ is_field_ref = isFieldRef;
+
+ if (isReference && isFieldRef)
+ {
+ used_for_reference = (unsigned char)(3 & ((bottomFieldIsReference << bottomFieldShift) | (topFieldIsReference << topFieldShift)));
+ }
+ else
+ {
+ used_for_reference = isReference ? 3 : 0;
+ }
+
+ FrameIdx = frameIdx;
+ FieldOrderCnt[0] = fieldOrderCntList[used_for_reference == 2]; // 0: for progressive and top reference; 1: for bottom reference only.
+ FieldOrderCnt[1] = fieldOrderCntList[used_for_reference != 1]; // 0: for top reference only; 1: for bottom reference and progressive.
+ dpbSlot = -1;
+ m_picBuff = picBuff;
+ }
+
+ void setReference (bool isLongTerm,
+ int32_t picOrderCnt,
+ NvidiaVulkanPictureBase* picBuff)
+ {
+ is_non_existing = (picBuff == DE_NULL);
+ is_long_term = isLongTerm;
+ is_field_ref = false;
+ used_for_reference = (picBuff != DE_NULL) ? 3 : 0;
+
+ PicOrderCnt = picOrderCnt;
+
+ dpbSlot = -1;
+ m_picBuff = picBuff;
+ originalDpbIndex = -1;
+ }
+
+ bool isRef ()
+ {
+ return (used_for_reference != 0);
+ }
+
+ StdVideoDecodeH264ReferenceInfoFlags getPictureFlag ()
+ {
+ StdVideoDecodeH264ReferenceInfoFlags picFlags = StdVideoDecodeH264ReferenceInfoFlags();
+
+ if (used_for_reference)
+ {
+ // picFlags.is_reference = true;
+ }
+
+ if (is_long_term)
+ {
+ picFlags.used_for_long_term_reference = true;
+ }
+
+ if (is_non_existing)
+ {
+ picFlags.is_non_existing = true;
+ }
+
+ if (is_field_ref)
+ {
+ // picFlags.field_pic_flag = true;
+ }
+
+ if (used_for_reference & topFieldMask)
+ {
+ picFlags.top_field_flag = true;
+ }
+
+ if (used_for_reference & bottomFieldMask)
+ {
+ picFlags.bottom_field_flag = true;
+ }
+
+ return picFlags;
+ }
+
+ void setH264PictureData (NvidiaVideoDecodeH264DpbSlotInfo* pDpbRefList,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ uint32_t dpbEntryIdx,
+ uint32_t dpbSlotIndex)
+ {
+ DE_ASSERT(dpbEntryIdx < AVC_MAX_DPB_SLOTS);
+ DE_ASSERT(dpbSlotIndex < AVC_MAX_DPB_SLOTS);
+
+ DE_ASSERT((dpbSlotIndex == (uint32_t)dpbSlot) || is_non_existing);
+ pReferenceSlots[dpbEntryIdx].sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR;
+ pReferenceSlots[dpbEntryIdx].slotIndex = dpbSlotIndex;
+ pReferenceSlots[dpbEntryIdx].pNext = pDpbRefList[dpbEntryIdx].Init(dpbSlotIndex);
+
+ StdVideoDecodeH264ReferenceInfo* pRefPicInfo = &pDpbRefList[dpbEntryIdx].stdReferenceInfo;
+
+ pRefPicInfo->FrameNum = FrameIdx;
+ pRefPicInfo->flags = getPictureFlag();
+ pRefPicInfo->PicOrderCnt[0] = FieldOrderCnt[0];
+ pRefPicInfo->PicOrderCnt[1] = FieldOrderCnt[1];
+ }
+
+ void setH265PictureData (NvidiaVideoDecodeH265DpbSlotInfo* pDpbSlotInfo,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ uint32_t dpbEntryIdx,
+ uint32_t dpbSlotIndex)
+ {
+ DE_ASSERT(dpbEntryIdx < HEVC_MAX_DPB_SLOTS);
+ DE_ASSERT(dpbSlotIndex < HEVC_MAX_DPB_SLOTS);
+ DE_ASSERT(isRef());
+
+ DE_ASSERT((dpbSlotIndex == (uint32_t)dpbSlot) || is_non_existing);
+ pReferenceSlots[dpbEntryIdx].sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR;
+ pReferenceSlots[dpbEntryIdx].slotIndex = dpbSlotIndex;
+ pReferenceSlots[dpbEntryIdx].pNext = pDpbSlotInfo[dpbEntryIdx].Init(dpbSlotIndex);
+
+ StdVideoDecodeH265ReferenceInfo* pRefPicInfo = &pDpbSlotInfo[dpbEntryIdx].stdReferenceInfo;
+ pRefPicInfo->PicOrderCntVal = PicOrderCnt;
+ pRefPicInfo->flags.used_for_long_term_reference = is_long_term;
+ pRefPicInfo->flags.unused_for_reference = is_non_existing;
+
+ }
+
+} dpbEntry;
+
+int8_t VideoBaseDecoder::GetPicIdx (NvidiaVulkanPictureBase* pPicBuf)
+{
+ if (pPicBuf)
+ {
+ int32_t picIndex = pPicBuf->m_picIdx;
+
+ if ((picIndex >= 0) && ((uint32_t)picIndex < m_maxNumDecodeSurfaces))
+ {
+ return (int8_t)picIndex;
+ }
+ }
+
+ return -1;
+}
+
+int8_t VideoBaseDecoder::GetPicIdx (INvidiaVulkanPicture* pPicBuf)
+{
+ return GetPicIdx(GetPic(pPicBuf));
+}
+
+int8_t VideoBaseDecoder::GetPicDpbSlot (int8_t picIndex)
+{
+ return m_pictureToDpbSlotMap[picIndex];
+}
+
+int8_t VideoBaseDecoder::GetPicDpbSlot (NvidiaVulkanPictureBase* pPicBuf)
+{
+ int8_t picIndex = GetPicIdx(pPicBuf);
+ DE_ASSERT((picIndex >= 0) && ((uint32_t)picIndex < m_maxNumDecodeSurfaces));
+ return GetPicDpbSlot(picIndex);
+}
+
+bool VideoBaseDecoder::GetFieldPicFlag (int8_t picIndex)
+{
+ DE_ASSERT((picIndex >= 0) && ((uint32_t)picIndex < m_maxNumDecodeSurfaces));
+
+ return !!(m_fieldPicFlagMask & (1 << (uint32_t)picIndex));
+}
+
+bool VideoBaseDecoder::SetFieldPicFlag (int8_t picIndex, bool fieldPicFlag)
+{
+ DE_ASSERT((picIndex >= 0) && ((uint32_t)picIndex < m_maxNumDecodeSurfaces));
+
+ bool oldFieldPicFlag = GetFieldPicFlag(picIndex);
+
+ if (fieldPicFlag)
+ {
+ m_fieldPicFlagMask |= (1 << (uint32_t)picIndex);
+ }
+ else
+ {
+ m_fieldPicFlagMask &= ~(1 << (uint32_t)picIndex);
+ }
+
+ return oldFieldPicFlag;
+}
+
+int8_t VideoBaseDecoder::SetPicDpbSlot (int8_t picIndex, int8_t dpbSlot)
+{
+ int8_t oldDpbSlot = m_pictureToDpbSlotMap[picIndex];
+
+ m_pictureToDpbSlotMap[picIndex] = dpbSlot;
+
+ if (dpbSlot >= 0)
+ {
+ m_dpbSlotsMask |= (1 << picIndex);
+ }
+ else
+ {
+ m_dpbSlotsMask &= ~(1 << picIndex);
+
+ if (oldDpbSlot >= 0)
+ {
+ m_dpb.FreeSlot(oldDpbSlot);
+ }
+ }
+
+ return oldDpbSlot;
+}
+
+int8_t VideoBaseDecoder::SetPicDpbSlot (NvidiaVulkanPictureBase* pPicBuf, int8_t dpbSlot)
+{
+ int8_t picIndex = GetPicIdx(pPicBuf);
+
+ DE_ASSERT((picIndex >= 0) && ((uint32_t)picIndex < m_maxNumDecodeSurfaces));
+
+ return SetPicDpbSlot(picIndex, dpbSlot);
+}
+
+uint32_t VideoBaseDecoder::ResetPicDpbSlots (uint32_t picIndexSlotValidMask)
+{
+ uint32_t resetSlotsMask = ~(picIndexSlotValidMask | ~m_dpbSlotsMask);
+
+ for (uint32_t picIdx = 0; (picIdx < m_maxNumDecodeSurfaces) && resetSlotsMask; picIdx++)
+ {
+ if (resetSlotsMask & (1 << picIdx))
+ {
+ resetSlotsMask &= ~(1 << picIdx);
+
+ SetPicDpbSlot((int8_t)picIdx, -1);
+ }
+ }
+
+ return m_dpbSlotsMask;
+}
+
+VideoBaseDecoder::VideoBaseDecoder (Context& context)
+ : m_context (context)
+ , m_nvFuncs (createIfcNvFunctions(context.getTestContext().getPlatform().getVulkanPlatform()))
+ , m_ffmpegFuncs (createIfcFfmpegFunctions())
+ , m_videoCodecOperation (VK_VIDEO_CODEC_OPERATION_NONE_KHR)
+ , m_vkd (DE_NULL)
+ , m_device (DE_NULL)
+ , m_queueFamilyIndexTransfer (VK_QUEUE_FAMILY_IGNORED)
+ , m_queueFamilyIndexDecode (VK_QUEUE_FAMILY_IGNORED)
+ , m_queueTransfer (DE_NULL)
+ , m_queueDecode (DE_NULL)
+ , m_allocator (DE_NULL)
+ , m_nCurrentPictureID (0)
+ , m_dpbSlotsMask (0)
+ , m_fieldPicFlagMask (0)
+ , m_dpb (3)
+ , m_pictureToDpbSlotMap ()
+ , m_maxNumDecodeSurfaces (1)
+ , m_maxNumDpbSurfaces (1)
+ , m_clockRate (0)
+ , m_minBitstreamBufferSizeAlignment (0)
+ , m_minBitstreamBufferOffsetAlignment (0)
+ , m_videoDecodeSession ()
+ , m_videoDecodeSessionAllocs ()
+ , m_numDecodeSurfaces ()
+ , m_videoCommandPool ()
+ , m_videoFrameBuffer (new VideoFrameBuffer())
+ , m_decodeFramesData (DE_NULL)
+ , m_maxDecodeFramesCount (0)
+ , m_maxDecodeFramesAllocated (0)
+ , m_width (0)
+ , m_height (0)
+ , m_codedWidth (0)
+ , m_codedHeight (0)
+ , m_chromaFormat ()
+ , m_bitLumaDepthMinus8 (0)
+ , m_bitChromaDepthMinus8 (0)
+ , m_decodePicCount (0)
+ , m_videoFormat ()
+ , m_lastSpsIdInQueue (-1)
+ , m_pictureParametersQueue ()
+ , m_lastSpsPictureParametersQueue ()
+ , m_lastPpsPictureParametersQueue ()
+ , m_currentPictureParameters ()
+ , m_randomOrSwapped (false)
+ , m_queryResultWithStatus (false)
+ , m_frameCountTrigger (0)
+ , m_submitAfter (false)
+ , m_gopSize (0)
+ , m_dpbCount (0)
+ , m_heaps ()
+ , m_pPerFrameDecodeParameters ()
+ , m_pVulkanParserDecodePictureInfo ()
+ , m_pFrameDatas ()
+ , m_bitstreamBufferMemoryBarriers ()
+ , m_imageBarriersVec ()
+ , m_frameSynchronizationInfos ()
+ , m_commandBufferSubmitInfos ()
+ , m_decodeBeginInfos ()
+ , m_pictureResourcesInfos ()
+ , m_dependencyInfos ()
+ , m_decodeEndInfos ()
+ , m_submitInfos ()
+ , m_frameCompleteFences ()
+ , m_frameConsumerDoneFences ()
+ , m_frameCompleteSemaphoreSubmitInfos ()
+ , m_frameConsumerDoneSemaphoreSubmitInfos ()
+ , m_distinctDstDpbImages (false)
+{
+ deMemset(&m_nvidiaVulkanParserSequenceInfo, 0, sizeof(m_nvidiaVulkanParserSequenceInfo));
+
+ for (uint32_t picNdx = 0; picNdx < DE_LENGTH_OF_ARRAY(m_pictureToDpbSlotMap); picNdx++)
+ m_pictureToDpbSlotMap[picNdx] = -1;
+
+ ReinitCaches();
+}
+
+VideoBaseDecoder::~VideoBaseDecoder (void)
+{
+ Deinitialize();
+}
+
+void VideoBaseDecoder::initialize (const VkVideoCodecOperationFlagBitsKHR videoCodecOperation,
+ const DeviceInterface& vkd,
+ const VkDevice device,
+ const deUint32 queueFamilyIndexTransfer,
+ const deUint32 queueFamilyIndexDecode,
+ Allocator& allocator)
+{
+ DE_ASSERT(m_videoCodecOperation == VK_VIDEO_CODEC_OPERATION_NONE_KHR);
+ DE_ASSERT(m_vkd == DE_NULL);
+ DE_ASSERT(m_device == DE_NULL);
+ DE_ASSERT(queueFamilyIndexTransfer != VK_QUEUE_FAMILY_IGNORED);
+ DE_ASSERT(queueFamilyIndexDecode != VK_QUEUE_FAMILY_IGNORED);
+ DE_ASSERT(m_allocator == DE_NULL);
+
+ m_videoCodecOperation = videoCodecOperation;
+ m_vkd = &vkd;
+ m_device = device;
+ m_queueFamilyIndexTransfer = queueFamilyIndexTransfer;
+ m_queueFamilyIndexDecode = queueFamilyIndexDecode;
+ m_allocator = &allocator;
+ m_queueTransfer = getDeviceQueue(vkd, device, m_queueFamilyIndexTransfer, 0u);
+ m_queueDecode = getDeviceQueue(vkd, device, m_queueFamilyIndexDecode, 0u);
+}
+
+VkDevice VideoBaseDecoder::getDevice (void)
+{
+ DE_ASSERT(m_device != DE_NULL);
+
+ return m_device;
+}
+
+const DeviceInterface& VideoBaseDecoder::getDeviceDriver (void)
+{
+ DE_ASSERT(m_vkd != DE_NULL);
+
+ return *m_vkd;
+}
+
+deUint32 VideoBaseDecoder::getQueueFamilyIndexTransfer (void)
+{
+ DE_ASSERT(m_queueFamilyIndexTransfer != VK_QUEUE_FAMILY_IGNORED);
+
+ return m_queueFamilyIndexTransfer;
+}
+
+VkQueue VideoBaseDecoder::getQueueTransfer (void)
+{
+ DE_ASSERT(m_queueTransfer != DE_NULL);
+
+ return m_queueTransfer;
+}
+
+deUint32 VideoBaseDecoder::getQueueFamilyIndexDecode (void)
+{
+ DE_ASSERT(m_queueFamilyIndexDecode != VK_QUEUE_FAMILY_IGNORED);
+
+ return m_queueFamilyIndexDecode;
+}
+
+VkQueue VideoBaseDecoder::getQueueDecode (void)
+{
+ DE_ASSERT(m_queueDecode != DE_NULL);
+
+ return m_queueDecode;
+}
+
+Allocator& VideoBaseDecoder::getAllocator (void)
+{
+ DE_ASSERT(m_allocator != DE_NULL);
+
+ return *m_allocator;
+}
+
+
+void VideoBaseDecoder::setDecodeParameters (bool randomOrSwapped,
+ bool queryResultWithStatus,
+ uint32_t frameCountTrigger,
+ bool submitAfter,
+ uint32_t gopSize,
+ uint32_t dpbCount)
+
+{
+ m_randomOrSwapped = randomOrSwapped;
+ m_queryResultWithStatus = queryResultWithStatus;
+ m_frameCountTrigger = frameCountTrigger;
+ m_submitAfter = submitAfter;
+ m_gopSize = gopSize ? gopSize : frameCountTrigger;
+ m_dpbCount = dpbCount ? dpbCount : 1;
+
+ DEBUGLOG(std::cout << m_randomOrSwapped << " " << m_queryResultWithStatus << " " << m_frameCountTrigger << " " << m_submitAfter << " " << m_gopSize << " " << m_dpbCount << std::endl);
+
+ ReinitCaches();
+}
+
+int32_t VideoBaseDecoder::BeginSequence (const NvidiaVulkanParserSequenceInfo* pnvsi)
+{
+ DEBUGLOG(std::cout << "VideoBaseDecoder::BeginSequence " << std::dec << pnvsi->nCodedWidth << "x" << pnvsi->nCodedHeight << std::endl);
+
+ const int32_t maxDbpSlots = MAX_DPB_SLOTS_PLUS_1 - ((pnvsi->eCodec == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) ? 0 : EXTRA_DPB_SLOTS);
+ const int32_t configDpbSlotsPre = (pnvsi->nMinNumDecodeSurfaces > 0)
+ ? (pnvsi->nMinNumDecodeSurfaces - (pnvsi->isSVC ? 3 : 1))
+ : 0;
+ const int32_t configDpbSlots = std::min(maxDbpSlots, configDpbSlotsPre);
+ const int32_t configDpbSlotsPlus1 = std::min(configDpbSlots + 1, (int32_t)MAX_DPB_SLOTS_PLUS_1);
+ const bool sequenceUpdate = (m_nvidiaVulkanParserSequenceInfo.nMaxWidth != 0) && (m_nvidiaVulkanParserSequenceInfo.nMaxHeight != 0);
+ const bool formatChange = (pnvsi->eCodec != m_nvidiaVulkanParserSequenceInfo.eCodec)
+ || (pnvsi->codecProfile != m_nvidiaVulkanParserSequenceInfo.codecProfile)
+ || (pnvsi->nChromaFormat != m_nvidiaVulkanParserSequenceInfo.nChromaFormat)
+ || (pnvsi->uBitDepthLumaMinus8 != m_nvidiaVulkanParserSequenceInfo.uBitDepthLumaMinus8)
+ || (pnvsi->uBitDepthChromaMinus8 != m_nvidiaVulkanParserSequenceInfo.uBitDepthChromaMinus8)
+ || (pnvsi->bProgSeq != m_nvidiaVulkanParserSequenceInfo.bProgSeq);
+ const bool extentChange = (pnvsi->nCodedWidth != m_nvidiaVulkanParserSequenceInfo.nCodedWidth)
+ || (pnvsi->nCodedHeight != m_nvidiaVulkanParserSequenceInfo.nCodedHeight);
+ const bool sequenceReconfigireFormat = sequenceUpdate && formatChange;
+ const bool sequenceReconfigireCodedExtent = sequenceUpdate && extentChange;
+ const VkVideoChromaSubsamplingFlagBitsKHR chromaSubsampling = ConvertStdH264ChromaFormatToVulkan((StdVideoH264ChromaFormatIdc)pnvsi->nChromaFormat);
+ const VulkanParserDetectedVideoFormat detectedFormat =
+ {
+ pnvsi->eCodec, // vk::VkVideoCodecOperationFlagBitsKHR codec;
+ pnvsi->codecProfile, // uint32_t codecProfile;
+ getLumaBitDepth(pnvsi->uBitDepthLumaMinus8), // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ getChromaBitDepth(pnvsi->uBitDepthChromaMinus8), // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ chromaSubsampling, // VkVideoChromaSubsamplingFlagBitsKHR chromaSubsampling;
+ NVIDIA_FRAME_RATE_NUM(pnvsi->frameRate), // uint32_t frame_rate_numerator;
+ NVIDIA_FRAME_RATE_DEN(pnvsi->frameRate), // uint32_t frame_rate_denominator;
+ (uint8_t)(sequenceUpdate != 0 ? 1 : 0), // uint8_t sequenceUpdate : 1;
+ (uint8_t)(sequenceReconfigireFormat != 0 ? 1 : 0), // uint8_t sequenceReconfigireFormat : 1;
+ (uint8_t)(sequenceReconfigireCodedExtent != 0 ? 1 : 0), // uint8_t sequenceReconfigireCodedExtent : 1;
+ (uint8_t)(pnvsi->bProgSeq != 0 ? 1 : 0), // uint8_t progressive_sequence : 1;
+ pnvsi->uBitDepthLumaMinus8, // uint8_t bit_depth_luma_minus8;
+ pnvsi->uBitDepthChromaMinus8, // uint8_t bit_depth_chroma_minus8;
+ 0u, // uint8_t reserved1;
+ (uint32_t)pnvsi->nCodedWidth, // uint32_t coded_width;
+ (uint32_t)pnvsi->nCodedHeight, // uint32_t coded_height;
+
+ {
+ 0u, // int32_t left;
+ 0u, // int32_t top;
+ pnvsi->nDisplayWidth, // int32_t right;
+ pnvsi->nDisplayHeight, // int32_t bottom;
+ },
+
+ (uint32_t)pnvsi->lBitrate, // uint32_t bitrate;
+ (int32_t)pnvsi->lDARWidth, // int32_t display_aspect_ratio_x;
+ (int32_t)pnvsi->lDARHeight, // int32_t display_aspect_ratio_y;
+ (uint32_t)pnvsi->nMinNumDecodeSurfaces, // uint32_t minNumDecodeSurfaces;
+ (uint32_t)configDpbSlotsPlus1, // uint32_t maxNumDpbSlots;
+
+ {
+ (uint8_t)(7 & pnvsi->lVideoFormat), // uint8_t video_format : 3;
+ (uint8_t)(pnvsi->uVideoFullRange != 0 ? 1 : 0), // uint8_t video_full_range_flag : 1;
+ 0u, // uint8_t reserved_zero_bits : 4;
+ (uint8_t)pnvsi->lColorPrimaries, // uint8_t color_primaries;
+ (uint8_t)pnvsi->lTransferCharacteristics, // uint8_t transfer_characteristics;
+ (uint8_t)pnvsi->lMatrixCoefficients, // uint8_t matrix_coefficients;
+ },
+
+ 0u, // uint32_t seqhdr_data_length;
+ };
+
+ m_nvidiaVulkanParserSequenceInfo = *pnvsi;
+ m_nvidiaVulkanParserSequenceInfo.nMaxWidth = pnvsi->nCodedWidth;
+ m_nvidiaVulkanParserSequenceInfo.nMaxHeight = pnvsi->nCodedHeight;
+
+ int maxDecodeRTs = StartVideoSequence(&detectedFormat);
+
+ // nDecodeRTs = 0 means SequenceCallback failed
+ // nDecodeRTs = 1 means SequenceCallback succeeded
+ // nDecodeRTs > 1 means we need to overwrite the MaxNumDecodeSurfaces
+ if (!maxDecodeRTs)
+ {
+ return 0;
+ }
+ // MaxNumDecodeSurface may not be correctly calculated by the client while
+ // parser creation so overwrite it with NumDecodeSurface. (only if nDecodeRT
+ // > 1)
+ if (maxDecodeRTs > 1)
+ {
+ m_maxNumDecodeSurfaces = maxDecodeRTs;
+ }
+
+ // The number of minNumDecodeSurfaces can be overwritten.
+ // Add one for the current Dpb setup slot.
+ m_maxNumDpbSurfaces = configDpbSlotsPlus1;
+
+ m_dpb.Init(m_maxNumDpbSurfaces, sequenceUpdate);
+
+ // NOTE: Important Tegra parser requires the maxDpbSlotsPlus1 and not dpbSlots.
+ return configDpbSlotsPlus1;
+}
+
+bool VideoBaseDecoder::AllocPictureBuffer (INvidiaVulkanPicture** ppNvidiaVulkanPicture)
+{
+ DEBUGLOG(std::cout << "VideoBaseDecoder::AllocPictureBuffer" << std::endl);
+ bool result = false;
+
+ *ppNvidiaVulkanPicture = m_videoFrameBuffer->ReservePictureBuffer();
+
+ if (*ppNvidiaVulkanPicture)
+ {
+ result = true;
+
+ DEBUGLOG(std::cout << "\tVideoBaseDecoder::AllocPictureBuffer " << (void*)*ppNvidiaVulkanPicture << std::endl);
+ }
+
+ if (!result)
+ {
+ *ppNvidiaVulkanPicture = (INvidiaVulkanPicture*)DE_NULL;
+ }
+
+ return result;
+}
+
+bool VideoBaseDecoder::DecodePicture (NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData)
+{
+ DEBUGLOG(std::cout << "VideoBaseDecoder::DecodePicture" << std::endl);
+
+ VulkanParserDecodePictureInfo decodePictureInfo = VulkanParserDecodePictureInfo();
+ bool result = false;
+
+ if (!pNvidiaVulkanParserPictureData->pCurrPic)
+ {
+ return result;
+ }
+
+ NvidiaVulkanPictureBase* pVkPicBuff = GetPic(pNvidiaVulkanParserPictureData->pCurrPic);
+ const int32_t picIdx = pVkPicBuff ? pVkPicBuff->m_picIdx : -1;
+
+ DEBUGLOG(std::cout << "\tVideoBaseDecoder::DecodePicture " << (void*)pVkPicBuff << std::endl);
+
+ DE_ASSERT(picIdx < MAX_FRM_CNT);
+
+ decodePictureInfo.pictureIndex = picIdx;
+ decodePictureInfo.flags.progressiveFrame = pNvidiaVulkanParserPictureData->progressive_frame ? 1 : 0;
+ decodePictureInfo.flags.fieldPic = pNvidiaVulkanParserPictureData->field_pic_flag ? 1 : 0; // 0 = frame picture, 1 = field picture
+ decodePictureInfo.flags.repeatFirstField = 3 & (uint32_t)pNvidiaVulkanParserPictureData->repeat_first_field; // For 3:2 pulldown (number of additional fields, 2 = frame doubling, 4 = frame tripling)
+ decodePictureInfo.flags.refPic = pNvidiaVulkanParserPictureData->ref_pic_flag ? 1 : 0; // Frame is a reference frame
+
+ // Mark the first field as unpaired Detect unpaired fields
+ if (pNvidiaVulkanParserPictureData->field_pic_flag)
+ {
+ decodePictureInfo.flags.bottomField = pNvidiaVulkanParserPictureData->bottom_field_flag ? 1 : 0; // 0 = top field, 1 = bottom field (ignored if field_pic_flag=0)
+ decodePictureInfo.flags.secondField = pNvidiaVulkanParserPictureData->second_field ? 1 : 0; // Second field of a complementary field pair
+ decodePictureInfo.flags.topFieldFirst = pNvidiaVulkanParserPictureData->top_field_first ? 1 : 0; // Frame pictures only
+
+ if (!pNvidiaVulkanParserPictureData->second_field)
+ {
+ decodePictureInfo.flags.unpairedField = true; // Incomplete (half) frame.
+ }
+ else
+ {
+ if (decodePictureInfo.flags.unpairedField)
+ {
+ decodePictureInfo.flags.syncToFirstField = true;
+ decodePictureInfo.flags.unpairedField = false;
+ }
+ }
+ }
+
+ decodePictureInfo.frameSyncinfo.unpairedField = decodePictureInfo.flags.unpairedField;
+ decodePictureInfo.frameSyncinfo.syncToFirstField = decodePictureInfo.flags.syncToFirstField;
+
+ return DecodePicture(pNvidiaVulkanParserPictureData, &decodePictureInfo);
+}
+
+bool VideoBaseDecoder::UpdatePictureParameters (NvidiaVulkanPictureParameters* pNvidiaVulkanPictureParameters,
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase>& pictureParametersObject,
+ uint64_t updateSequenceCount)
+{
+ DEBUGLOG(std::cout << "VideoBaseDecoder::UpdatePictureParameters " << (void*)pNvidiaVulkanPictureParameters << " " << updateSequenceCount << std::endl);
+
+ if (pNvidiaVulkanPictureParameters == DE_NULL)
+ return DE_NULL;
+
+ return UpdatePictureParametersHandler(pNvidiaVulkanPictureParameters, pictureParametersObject, updateSequenceCount);
+}
+
+bool VideoBaseDecoder::DisplayPicture (INvidiaVulkanPicture* pNvidiaVulkanPicture,
+ int64_t llPTS)
+{
+ DEBUGLOG(std::cout << "VideoBaseDecoder::DisplayPicture" << std::endl);
+
+ bool result = false;
+
+ NvidiaVulkanPictureBase* pVkPicBuff = GetPic(pNvidiaVulkanPicture);
+
+ DE_ASSERT(pVkPicBuff != DE_NULL);
+
+ int32_t picIdx = pVkPicBuff ? pVkPicBuff->m_picIdx : -1;
+
+ DE_ASSERT(picIdx != -1);
+
+ if (m_videoFrameBuffer != DE_NULL && picIdx != -1)
+ {
+ DisplayPictureInfo dispInfo = DisplayPictureInfo();
+
+ dispInfo.timestamp = (int64_t)llPTS;
+
+ const int32_t retVal = m_videoFrameBuffer->QueueDecodedPictureForDisplay((int8_t)picIdx, &dispInfo);
+
+ DE_ASSERT(picIdx == retVal);
+ DE_UNREF(retVal);
+
+ result = true;
+ }
+
+ return result;
+}
+
+void VideoBaseDecoder::UnhandledNALU (const uint8_t* pbData,
+ int32_t cbData)
+{
+ const vector<uint8_t> data (pbData, pbData + cbData);
+ ostringstream css;
+
+ css << "UnhandledNALU=";
+
+ for (const auto& i: data)
+ css << std::hex << std::setw(2) << std::setfill('0') << (deUint32)i << ' ';
+
+ TCU_THROW(InternalError, css.str());
+}
+
+bool VideoBaseDecoder::DecodePicture (NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ VulkanParserDecodePictureInfo* pDecodePictureInfo)
+{
+ DEBUGLOG(std::cout << "\tDecodePicture sps_sid:" << (uint32_t)pNvidiaVulkanParserPictureData->CodecSpecific.h264.pStdSps->seq_parameter_set_id << " pps_sid:" << (uint32_t)pNvidiaVulkanParserPictureData->CodecSpecific.h264.pStdPps->seq_parameter_set_id << " pps_pid:" << (uint32_t)pNvidiaVulkanParserPictureData->CodecSpecific.h264.pStdPps->pic_parameter_set_id << std::endl);
+ bool bRet = false;
+
+ if (!pNvidiaVulkanParserPictureData->pCurrPic)
+ {
+ return false;
+ }
+
+ const uint32_t PicIdx = GetPicIdx(pNvidiaVulkanParserPictureData->pCurrPic);
+
+ if (PicIdx >= MAX_FRM_CNT)
+ {
+ DE_ASSERT(0);
+ return false;
+ }
+
+ HeapType heap;
+
+ PerFrameDecodeParameters* pPictureParams = ALLOC_HEAP_OBJECT(heap, PerFrameDecodeParameters);
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots = ALLOC_HEAP_OBJECT_ARRAY(heap, VkVideoReferenceSlotInfoKHR, PerFrameDecodeParameters::MAX_DPB_REF_SLOTS);
+ VkVideoReferenceSlotInfoKHR* pSetupReferenceSlot = ALLOC_HEAP_OBJECT(heap, VkVideoReferenceSlotInfoKHR);
+
+ *pSetupReferenceSlot =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ -1, // deInt8 slotIndex;
+ DE_NULL // const VkVideoPictureResourceInfoKHR* pPictureResource;
+ };
+
+ PerFrameDecodeParameters* pPerFrameDecodeParameters = pPictureParams;
+
+ pPerFrameDecodeParameters->currPicIdx = PicIdx;
+ pPerFrameDecodeParameters->bitstreamDataLen = pNvidiaVulkanParserPictureData->nBitstreamDataLen;
+ pPerFrameDecodeParameters->pBitstreamData = pNvidiaVulkanParserPictureData->pBitstreamData;
+
+ pPerFrameDecodeParameters->decodeFrameInfo.sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR;
+ pPerFrameDecodeParameters->decodeFrameInfo.dstPictureResource.sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR;
+
+ if (m_videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR)
+ {
+ const NvidiaVulkanParserH264PictureData*const pin = &pNvidiaVulkanParserPictureData->CodecSpecific.h264;
+ nvVideoH264PicParameters* pH264 = ALLOC_HEAP_OBJECT(heap, nvVideoH264PicParameters);
+ VkVideoDecodeH264PictureInfoKHR* pPictureInfo = &pH264->pictureInfo;
+ NvidiaVideoDecodeH264DpbSlotInfo* pDpbRefList = pH264->dpbRefList;
+ StdVideoDecodeH264PictureInfo* pStdPictureInfo = &pH264->stdPictureInfo;
+
+ *pH264 = nvVideoH264PicParameters();
+
+ pPerFrameDecodeParameters->pCurrentPictureParameters = StdVideoPictureParametersSet::StdVideoPictureParametersSetFromBase(pin->pPpsClientObject);
+ DEBUGLOG(std::cout << "\tDecodePicture SPS:" << (void*)pin->pSpsClientObject << " PPS:" << (void*)pin->pPpsClientObject << std::endl);
+
+ pDecodePictureInfo->videoFrameType = 0; // pd->CodecSpecific.h264.slice_type;
+ // FIXME: If mvcext is enabled.
+ pDecodePictureInfo->viewId = (uint16_t)pNvidiaVulkanParserPictureData->CodecSpecific.h264.mvcext.view_id;
+
+ pPictureInfo->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR;
+ pPictureInfo->pNext = DE_NULL;
+ pPictureInfo->pStdPictureInfo = &pH264->stdPictureInfo;
+ pPictureInfo->sliceCount = pNvidiaVulkanParserPictureData->nNumSlices;
+ pPictureInfo->pSliceOffsets = pNvidiaVulkanParserPictureData->pSliceDataOffsets;
+
+ pPerFrameDecodeParameters->decodeFrameInfo.pNext = &pH264->pictureInfo;
+
+ pStdPictureInfo->pic_parameter_set_id = pin->pic_parameter_set_id; // PPS ID
+ pStdPictureInfo->seq_parameter_set_id = pin->seq_parameter_set_id; // SPS ID;
+ pStdPictureInfo->frame_num = (uint16_t)pin->frame_num;
+
+ pH264->mvcInfo.sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR;
+ pH264->mvcInfo.pNext = DE_NULL; // No more extension structures.
+
+ StdVideoDecodeH264ReferenceInfo referenceInfo = StdVideoDecodeH264ReferenceInfo();
+ pH264->mvcInfo.pStdReferenceInfo = &referenceInfo;
+ pSetupReferenceSlot->pNext = &pH264->mvcInfo;
+
+ StdVideoDecodeH264PictureInfoFlags currPicFlags = StdVideoDecodeH264PictureInfoFlags();
+
+ currPicFlags.is_intra = (pNvidiaVulkanParserPictureData->intra_pic_flag != 0);
+
+ // 0 = frame picture, 1 = field picture
+ if (pNvidiaVulkanParserPictureData->field_pic_flag)
+ {
+ // 0 = top field, 1 = bottom field (ignored if field_pic_flag = 0)
+ currPicFlags.field_pic_flag = true;
+ if (pNvidiaVulkanParserPictureData->bottom_field_flag)
+ {
+ currPicFlags.bottom_field_flag = true;
+ }
+ }
+ // Second field of a complementary field pair
+ if (pNvidiaVulkanParserPictureData->second_field)
+ {
+ currPicFlags.complementary_field_pair = true;
+ }
+
+ // Frame is a reference frame
+ if (pNvidiaVulkanParserPictureData->ref_pic_flag)
+ {
+ currPicFlags.is_reference = true;
+ }
+
+ pStdPictureInfo->flags = currPicFlags;
+
+ if (!pNvidiaVulkanParserPictureData->field_pic_flag)
+ {
+ pStdPictureInfo->PicOrderCnt[0] = pin->CurrFieldOrderCnt[0];
+ pStdPictureInfo->PicOrderCnt[1] = pin->CurrFieldOrderCnt[1];
+ }
+ else
+ {
+ pStdPictureInfo->PicOrderCnt[pNvidiaVulkanParserPictureData->bottom_field_flag] = pin->CurrFieldOrderCnt[pNvidiaVulkanParserPictureData->bottom_field_flag];
+ }
+
+ pPerFrameDecodeParameters->numGopReferenceSlots = FillDpbH264State(pNvidiaVulkanParserPictureData,
+ pin->dpb,
+ DE_LENGTH_OF_ARRAY(pin->dpb),
+ pDpbRefList,
+ pReferenceSlots,
+ pPerFrameDecodeParameters->pGopReferenceImagesIndexes,
+ pH264->stdPictureInfo.flags,
+ &pSetupReferenceSlot->slotIndex);
+
+ DEBUGLOG(cout<<"pSetupReferenceSlot->slotIndex=" << dec << pSetupReferenceSlot->slotIndex <<endl);
+
+ if (pSetupReferenceSlot->slotIndex >= 0)
+ {
+ if (m_distinctDstDpbImages)
+ {
+ const int32_t setupSlotNdx = pPerFrameDecodeParameters->numGopReferenceSlots;
+
+ DE_ASSERT(setupSlotNdx < PerFrameDecodeParameters::MAX_DPB_REF_SLOTS);
+
+ pReferenceSlots[setupSlotNdx] = *pSetupReferenceSlot;
+
+ pSetupReferenceSlot = &pReferenceSlots[setupSlotNdx];
+
+ pPerFrameDecodeParameters->pictureResources[setupSlotNdx] = pPerFrameDecodeParameters->decodeFrameInfo.dstPictureResource;
+
+ pSetupReferenceSlot->pPictureResource = &pPerFrameDecodeParameters->pictureResources[setupSlotNdx];
+ }
+ else
+ {
+ pSetupReferenceSlot->pPictureResource = &pPerFrameDecodeParameters->decodeFrameInfo.dstPictureResource;
+ }
+
+ pPerFrameDecodeParameters->decodeFrameInfo.pSetupReferenceSlot = pSetupReferenceSlot;
+ }
+
+ ostringstream s;
+ s << "numGopReferenceSlots:" << std::dec << pPerFrameDecodeParameters->numGopReferenceSlots << "(";
+ if (pPerFrameDecodeParameters->numGopReferenceSlots)
+ {
+ for (int32_t dpbEntryIdx = 0; dpbEntryIdx < pPerFrameDecodeParameters->numGopReferenceSlots; dpbEntryIdx++)
+ {
+ pPerFrameDecodeParameters->pictureResources[dpbEntryIdx].sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR;
+ pReferenceSlots[dpbEntryIdx].pPictureResource = &pPerFrameDecodeParameters->pictureResources[dpbEntryIdx];
+
+ DE_ASSERT(pDpbRefList[dpbEntryIdx].IsReference());
+
+ s << std::dec << pReferenceSlots[dpbEntryIdx].slotIndex << " ";
+ }
+
+ pPerFrameDecodeParameters->decodeFrameInfo.pReferenceSlots = pReferenceSlots;
+ pPerFrameDecodeParameters->decodeFrameInfo.referenceSlotCount = pPerFrameDecodeParameters->numGopReferenceSlots;
+ }
+ else
+ {
+ pPerFrameDecodeParameters->decodeFrameInfo.pReferenceSlots = DE_NULL;
+ pPerFrameDecodeParameters->decodeFrameInfo.referenceSlotCount = 0;
+ }
+ s << ")";
+
+ DEBUGLOG(cout << s.str() <<endl);
+ }
+ else if (m_videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR)
+ {
+ const NvidiaVulkanParserH265PictureData* const pin = &pNvidiaVulkanParserPictureData->CodecSpecific.h265;
+ nvVideoH265PicParameters* pHevc = ALLOC_HEAP_OBJECT(heap, nvVideoH265PicParameters);
+ VkVideoDecodeH265PictureInfoKHR* pPictureInfo = &pHevc->pictureInfo;
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo = &pHevc->stdPictureInfo;
+ NvidiaVideoDecodeH265DpbSlotInfo* pDpbRefList = pHevc->dpbRefList;
+
+ *pHevc = nvVideoH265PicParameters();
+
+ pPerFrameDecodeParameters->pCurrentPictureParameters = StdVideoPictureParametersSet::StdVideoPictureParametersSetFromBase(pin->pPpsClientObject);
+ pPerFrameDecodeParameters->decodeFrameInfo.pNext = &pHevc->pictureInfo;
+
+ pPictureInfo->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR;
+ pPictureInfo->pNext = DE_NULL;
+ pPictureInfo->pStdPictureInfo = &pHevc->stdPictureInfo;
+
+ pDecodePictureInfo->videoFrameType = 0;
+ if (pNvidiaVulkanParserPictureData->CodecSpecific.h265.mv_hevc_enable)
+ {
+ pDecodePictureInfo->viewId = pNvidiaVulkanParserPictureData->CodecSpecific.h265.nuh_layer_id;
+ }
+ else
+ {
+ pDecodePictureInfo->viewId = 0;
+ }
+
+ pPictureInfo->sliceSegmentCount = pNvidiaVulkanParserPictureData->nNumSlices;
+ pPictureInfo->pSliceSegmentOffsets = pNvidiaVulkanParserPictureData->pSliceDataOffsets;
+
+ pStdPictureInfo->pps_pic_parameter_set_id = pin->pic_parameter_set_id; // PPS ID
+ pStdPictureInfo->flags.IrapPicFlag = (pin->IrapPicFlag ? 1 : 0); // Intra Random Access Point for current picture.
+ pStdPictureInfo->flags.IdrPicFlag = (pin->IdrPicFlag ? 1 : 0); // Instantaneous Decoding Refresh for current picture.
+ pStdPictureInfo->NumBitsForSTRefPicSetInSlice = (uint16_t)pin->NumBitsForShortTermRPSInSlice;
+ pStdPictureInfo->NumDeltaPocsOfRefRpsIdx = (uint8_t)pin->NumDeltaPocsOfRefRpsIdx;
+ pStdPictureInfo->PicOrderCntVal = pin->CurrPicOrderCntVal;
+
+ int8_t dpbSlot = AllocateDpbSlotForCurrentH265(GetPic(pNvidiaVulkanParserPictureData->pCurrPic), true);
+
+ pSetupReferenceSlot->slotIndex = dpbSlot;
+ // slotLayer requires NVIDIA specific extension VK_KHR_video_layers, not
+ // enabled, just yet. setupReferenceSlot.slotLayerIndex = 0;
+ DE_ASSERT(!(dpbSlot < 0));
+
+ if (dpbSlot >= 0)
+ {
+ DE_ASSERT(pNvidiaVulkanParserPictureData->ref_pic_flag);
+ }
+
+ pPerFrameDecodeParameters->numGopReferenceSlots = FillDpbH265State(pNvidiaVulkanParserPictureData,
+ pin,
+ pDpbRefList,
+ pStdPictureInfo,
+ pReferenceSlots,
+ pPerFrameDecodeParameters->pGopReferenceImagesIndexes);
+
+ DE_ASSERT(!pNvidiaVulkanParserPictureData->ref_pic_flag || (pSetupReferenceSlot->slotIndex >= 0));
+
+
+ if (pSetupReferenceSlot->slotIndex >= 0)
+ {
+ if (m_distinctDstDpbImages)
+ {
+ const int32_t setupSlotNdx = pPerFrameDecodeParameters->numGopReferenceSlots;
+
+ DE_ASSERT(setupSlotNdx < PerFrameDecodeParameters::MAX_DPB_REF_SLOTS);
+
+ pReferenceSlots[setupSlotNdx] = *pSetupReferenceSlot;
+
+ pSetupReferenceSlot = &pReferenceSlots[setupSlotNdx];
+
+ pPerFrameDecodeParameters->pictureResources[setupSlotNdx] = pPerFrameDecodeParameters->decodeFrameInfo.dstPictureResource;
+
+ pSetupReferenceSlot->pPictureResource = &pPerFrameDecodeParameters->pictureResources[setupSlotNdx];
+ }
+ else
+ {
+ pSetupReferenceSlot->pPictureResource = &pPerFrameDecodeParameters->decodeFrameInfo.dstPictureResource;
+ }
+
+ pPerFrameDecodeParameters->decodeFrameInfo.pSetupReferenceSlot = pSetupReferenceSlot;
+ }
+
+ if (pPerFrameDecodeParameters->numGopReferenceSlots)
+ {
+ for (int32_t dpbEntryIdx = 0; dpbEntryIdx < pPerFrameDecodeParameters->numGopReferenceSlots; dpbEntryIdx++)
+ {
+ pPerFrameDecodeParameters->pictureResources[dpbEntryIdx].sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR;
+ pReferenceSlots[dpbEntryIdx].pPictureResource = &pPerFrameDecodeParameters->pictureResources[dpbEntryIdx];
+
+ DE_ASSERT(pDpbRefList[dpbEntryIdx].IsReference());
+ }
+
+ pPerFrameDecodeParameters->decodeFrameInfo.pReferenceSlots = pReferenceSlots;
+ pPerFrameDecodeParameters->decodeFrameInfo.referenceSlotCount = pPerFrameDecodeParameters->numGopReferenceSlots;
+ }
+ else
+ {
+ pPerFrameDecodeParameters->decodeFrameInfo.pReferenceSlots = DE_NULL;
+ pPerFrameDecodeParameters->decodeFrameInfo.referenceSlotCount = 0;
+ }
+ }
+
+ pDecodePictureInfo->displayWidth = m_nvidiaVulkanParserSequenceInfo.nDisplayWidth;
+ pDecodePictureInfo->displayHeight = m_nvidiaVulkanParserSequenceInfo.nDisplayHeight;
+
+ bRet = DecodePictureWithParameters(pPictureParams, pDecodePictureInfo, heap) >= 0;
+
+ m_nCurrentPictureID++;
+
+ return bRet;
+}
+
+// FillDpbState
+uint32_t VideoBaseDecoder::FillDpbH264State (const NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ const NvidiaVulkanParserH264DpbEntry* dpbIn,
+ uint32_t maxDpbInSlotsInUse,
+ NvidiaVideoDecodeH264DpbSlotInfo* pDpbRefList,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ int8_t* pGopReferenceImagesIndexes,
+ StdVideoDecodeH264PictureInfoFlags currPicFlags,
+ int32_t* pCurrAllocatedSlotIndex)
+{
+ // #### Update m_dpb based on dpb parameters ####
+ // Create unordered DPB and generate a bitmask of all render targets present in DPB
+ uint32_t num_ref_frames = pNvidiaVulkanParserPictureData->CodecSpecific.h264.pStdSps->max_num_ref_frames;
+
+ DE_ASSERT(num_ref_frames <= m_maxNumDpbSurfaces);
+ DE_UNREF(num_ref_frames);
+
+ dpbEntry refOnlyDpbIn[AVC_MAX_DPB_SLOTS]; // max number of Dpb // surfaces
+ deMemset(&refOnlyDpbIn, 0, m_maxNumDpbSurfaces * sizeof(refOnlyDpbIn[0]));
+
+ uint32_t refDpbUsedAndValidMask = 0;
+ uint32_t numUsedRef = 0;
+
+ for (uint32_t inIdx = 0; inIdx < maxDpbInSlotsInUse; inIdx++)
+ {
+ // used_for_reference: 0 = unused, 1 = top_field, 2 = bottom_field, 3 = both_fields
+ const uint32_t used_for_reference = dpbIn[inIdx].used_for_reference & fieldIsReferenceMask;
+
+ if (used_for_reference)
+ {
+ const int8_t picIdx = (!dpbIn[inIdx].not_existing && dpbIn[inIdx].pNvidiaVulkanPicture)
+ ? GetPicIdx(dpbIn[inIdx].pNvidiaVulkanPicture)
+ : -1;
+ const bool isFieldRef = (picIdx >= 0)
+ ? GetFieldPicFlag(picIdx)
+ : (used_for_reference && (used_for_reference != fieldIsReferenceMask));
+ const int16_t fieldOrderCntList[2] =
+ {
+ (int16_t)dpbIn[inIdx].FieldOrderCnt[0],
+ (int16_t)dpbIn[inIdx].FieldOrderCnt[1]
+ };
+
+ refOnlyDpbIn[numUsedRef].setReferenceAndTopBoottomField(
+ !!used_for_reference,
+ (picIdx < 0), /* not_existing is frame inferred by the decoding process for gaps in frame_num */
+ !!dpbIn[inIdx].is_long_term,
+ isFieldRef,
+ !!(used_for_reference & topFieldMask),
+ !!(used_for_reference & bottomFieldMask),
+ (int16_t)dpbIn[inIdx].FrameIdx,
+ fieldOrderCntList,
+ GetPic(dpbIn[inIdx].pNvidiaVulkanPicture));
+
+ if (picIdx >= 0)
+ {
+ refDpbUsedAndValidMask |= (1 << picIdx);
+ }
+
+ numUsedRef++;
+ }
+ // Invalidate all slots.
+ pReferenceSlots[inIdx].slotIndex = -1;
+ pGopReferenceImagesIndexes[inIdx] = -1;
+ }
+
+ DE_ASSERT(numUsedRef <= 16);
+ DE_ASSERT(numUsedRef <= m_maxNumDpbSurfaces);
+ DE_ASSERT(numUsedRef <= num_ref_frames);
+
+ // Map all frames not present in DPB as non-reference, and generate a mask of all used DPB entries
+ /* uint32_t destUsedDpbMask = */ ResetPicDpbSlots(refDpbUsedAndValidMask);
+
+ // Now, map DPB render target indices to internal frame buffer index,
+ // assign each reference a unique DPB entry, and create the ordered DPB
+ // This is an undocumented MV restriction: the position in the DPB is stored
+ // along with the co-located data, so once a reference frame is assigned a DPB
+ // entry, it can no longer change.
+
+ // Find or allocate slots for existing dpb items.
+ // Take into account the reference picture now.
+ int8_t currPicIdx = GetPicIdx(pNvidiaVulkanParserPictureData->pCurrPic);
+ int8_t bestNonExistingPicIdx = currPicIdx;
+
+ DE_ASSERT(currPicIdx >= 0);
+
+ if (refDpbUsedAndValidMask)
+ {
+ int32_t minFrameNumDiff = 0x10000;
+
+ for (int32_t dpbIdx = 0; (uint32_t)dpbIdx < numUsedRef; dpbIdx++)
+ {
+ if (!refOnlyDpbIn[dpbIdx].is_non_existing)
+ {
+ NvidiaVulkanPictureBase* picBuff = refOnlyDpbIn[dpbIdx].m_picBuff;
+ int8_t picIdx = GetPicIdx(picBuff); // should always be valid at this point
+
+ DE_ASSERT(picIdx >= 0);
+
+ // We have up to 17 internal frame buffers, but only MAX_DPB_SIZE dpb
+ // entries, so we need to re-map the index from the [0..MAX_DPB_SIZE]
+ // range to [0..15]
+ int8_t dpbSlot = GetPicDpbSlot(picIdx);
+
+ if (dpbSlot < 0)
+ {
+ dpbSlot = m_dpb.AllocateSlot();
+
+ DE_ASSERT((dpbSlot >= 0) && ((uint32_t)dpbSlot < m_maxNumDpbSurfaces));
+
+ SetPicDpbSlot(picIdx, dpbSlot);
+
+ m_dpb[dpbSlot].setPictureResource(picBuff);
+ }
+
+ m_dpb[dpbSlot].MarkInUse();
+
+ DE_ASSERT(dpbSlot >= 0); // DPB mapping logic broken!
+
+ refOnlyDpbIn[dpbIdx].dpbSlot = dpbSlot;
+
+ int32_t frameNumDiff = ((int32_t)pNvidiaVulkanParserPictureData->CodecSpecific.h264.frame_num - refOnlyDpbIn[dpbIdx].FrameIdx);
+
+ if (frameNumDiff <= 0)
+ {
+ frameNumDiff = 0xffff;
+ }
+
+ if (frameNumDiff < minFrameNumDiff)
+ {
+ bestNonExistingPicIdx = picIdx;
+ minFrameNumDiff = frameNumDiff;
+ }
+ else if (bestNonExistingPicIdx == currPicIdx)
+ {
+ bestNonExistingPicIdx = picIdx;
+ }
+ }
+ }
+ }
+
+ // In Vulkan, we always allocate a Dbp slot for the current picture,
+ // regardless if it is going to become a reference or not. Non-reference slots
+ // get freed right after usage. if (pNvidiaVulkanParserPictureData->ref_pic_flag)
+ int8_t currPicDpbSlot = AllocateDpbSlotForCurrentH264(GetPic(pNvidiaVulkanParserPictureData->pCurrPic), currPicFlags);
+
+ DE_ASSERT(currPicDpbSlot >= 0);
+
+ *pCurrAllocatedSlotIndex = currPicDpbSlot;
+
+ if (refDpbUsedAndValidMask)
+ {
+ // Find or allocate slots for non existing dpb items and populate the slots.
+ uint32_t dpbInUseMask = m_dpb.getSlotInUseMask();
+ int8_t firstNonExistingDpbSlot = 0;
+
+ for (uint32_t dpbIdx = 0; dpbIdx < numUsedRef; dpbIdx++)
+ {
+ int8_t dpbSlot = -1;
+ int8_t picIdx = -1;
+
+ if (refOnlyDpbIn[dpbIdx].is_non_existing)
+ {
+ DE_ASSERT(refOnlyDpbIn[dpbIdx].m_picBuff == DE_NULL);
+
+ while (((uint32_t)firstNonExistingDpbSlot < m_maxNumDpbSurfaces) && (dpbSlot == -1))
+ {
+ if (!(dpbInUseMask & (1 << firstNonExistingDpbSlot)))
+ {
+ dpbSlot = firstNonExistingDpbSlot;
+ }
+
+ firstNonExistingDpbSlot++;
+ }
+
+ picIdx = bestNonExistingPicIdx;
+
+ // Find the closest valid refpic already in the DPB
+ uint32_t minDiffPOC = 0x7fff;
+
+ for (uint32_t j = 0; j < numUsedRef; j++)
+ {
+ if (!refOnlyDpbIn[j].is_non_existing && (refOnlyDpbIn[j].used_for_reference & refOnlyDpbIn[dpbIdx].used_for_reference) == refOnlyDpbIn[dpbIdx].used_for_reference)
+ {
+ uint32_t diffPOC = abs((int32_t)(refOnlyDpbIn[j].FieldOrderCnt[0] - refOnlyDpbIn[dpbIdx].FieldOrderCnt[0]));
+
+ if (diffPOC <= minDiffPOC)
+ {
+ minDiffPOC = diffPOC;
+ picIdx = GetPicIdx(refOnlyDpbIn[j].m_picBuff);
+ }
+ }
+ }
+ }
+ else
+ {
+ DE_ASSERT(refOnlyDpbIn[dpbIdx].m_picBuff != DE_NULL);
+
+ dpbSlot = refOnlyDpbIn[dpbIdx].dpbSlot;
+ picIdx = GetPicIdx(refOnlyDpbIn[dpbIdx].m_picBuff);
+ }
+
+ DE_ASSERT((dpbSlot >= 0) && ((uint32_t)dpbSlot < m_maxNumDpbSurfaces));
+
+ refOnlyDpbIn[dpbIdx].setH264PictureData(pDpbRefList, pReferenceSlots, dpbIdx, dpbSlot);
+
+ pGopReferenceImagesIndexes[dpbIdx] = picIdx;
+ }
+ }
+
+ return refDpbUsedAndValidMask ? numUsedRef : 0;
+}
+
+uint32_t VideoBaseDecoder::FillDpbH265State (const NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ const NvidiaVulkanParserH265PictureData* pin,
+ NvidiaVideoDecodeH265DpbSlotInfo* pDpbSlotInfo,
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ int8_t* pGopReferenceImagesIndexes)
+{
+ // #### Update m_dpb based on dpb parameters ####
+ // Create unordered DPB and generate a bitmask of all render targets present in DPB
+
+ dpbEntry refOnlyDpbIn[AVC_MAX_DPB_SLOTS];
+ deMemset(&refOnlyDpbIn, 0, m_maxNumDpbSurfaces * sizeof(refOnlyDpbIn[0]));
+ uint32_t refDpbUsedAndValidMask = 0;
+ uint32_t numUsedRef = 0;
+
+ for (int32_t inIdx = 0; inIdx < HEVC_MAX_DPB_SLOTS; inIdx++)
+ {
+ // used_for_reference: 0 = unused, 1 = top_field, 2 = bottom_field, 3 = both_fields
+ int8_t picIdx = GetPicIdx(pin->RefPics[inIdx]);
+ if (picIdx >= 0)
+ {
+ refOnlyDpbIn[numUsedRef].setReference((pin->IsLongTerm[inIdx] == 1), pin->PicOrderCntVal[inIdx], GetPic(pin->RefPics[inIdx]));
+
+ refDpbUsedAndValidMask |= (1 << picIdx);
+
+ refOnlyDpbIn[numUsedRef].originalDpbIndex = (int8_t)inIdx;
+ numUsedRef++;
+ }
+ // Invalidate all slots.
+ pReferenceSlots[inIdx].slotIndex = -1;
+ pGopReferenceImagesIndexes[inIdx] = -1;
+ }
+
+ DE_ASSERT(numUsedRef <= m_maxNumDpbSurfaces);
+
+ // Take into account the reference picture now.
+ int8_t currPicIdx = GetPicIdx(pNvidiaVulkanParserPictureData->pCurrPic);
+ int8_t currPicDpbSlot = -1;
+
+ DE_ASSERT(currPicIdx >= 0);
+
+ if (currPicIdx >= 0)
+ {
+ currPicDpbSlot = GetPicDpbSlot(currPicIdx);
+ refDpbUsedAndValidMask |= (1 << currPicIdx);
+ }
+
+ DE_UNREF(currPicDpbSlot);
+ DE_ASSERT(currPicDpbSlot >= 0);
+
+ // Map all frames not present in DPB as non-reference, and generate a mask of
+ // all used DPB entries
+ /* uint32_t destUsedDpbMask = */ ResetPicDpbSlots(refDpbUsedAndValidMask);
+
+ // Now, map DPB render target indices to internal frame buffer index,
+ // assign each reference a unique DPB entry, and create the ordered DPB
+ // This is an undocumented MV restriction: the position in the DPB is stored
+ // along with the co-located data, so once a reference frame is assigned a DPB
+ // entry, it can no longer change.
+
+ int8_t frmListToDpb[HEVC_MAX_DPB_SLOTS]; // TODO change to -1 for invalid indexes.
+ deMemset(&frmListToDpb, 0, sizeof(frmListToDpb));
+
+ // Find or allocate slots for existing dpb items.
+ for (int32_t dpbIdx = 0; (uint32_t)dpbIdx < numUsedRef; dpbIdx++)
+ {
+ if (!refOnlyDpbIn[dpbIdx].is_non_existing)
+ {
+ NvidiaVulkanPictureBase* picBuff = refOnlyDpbIn[dpbIdx].m_picBuff;
+
+ int8_t picIdx = GetPicIdx(picBuff); // should always be valid at this point
+
+ DE_ASSERT(picIdx >= 0);
+ // We have up to 17 internal frame buffers, but only HEVC_MAX_DPB_SLOTS
+ // dpb entries, so we need to re-map the index from the
+ // [0..HEVC_MAX_DPB_SLOTS] range to [0..15]
+
+ int8_t dpbSlot = GetPicDpbSlot(picIdx);
+
+ if (dpbSlot < 0)
+ {
+ dpbSlot = m_dpb.AllocateSlot();
+
+ DE_ASSERT(dpbSlot >= 0);
+
+ SetPicDpbSlot(picIdx, dpbSlot);
+
+ m_dpb[dpbSlot].setPictureResource(picBuff);
+ }
+
+ m_dpb[dpbSlot].MarkInUse();
+
+ DE_ASSERT(dpbSlot >= 0); // DPB mapping logic broken!
+
+ refOnlyDpbIn[dpbIdx].dpbSlot = dpbSlot;
+
+ uint32_t originalDpbIndex = refOnlyDpbIn[dpbIdx].originalDpbIndex;
+
+ DE_ASSERT(originalDpbIndex < HEVC_MAX_DPB_SLOTS);
+
+ frmListToDpb[originalDpbIndex] = dpbSlot;
+ }
+ }
+
+ // Find or allocate slots for non existing dpb items and populate the slots.
+ uint32_t dpbInUseMask = m_dpb.getSlotInUseMask();
+ int8_t firstNonExistingDpbSlot = 0;
+
+ for (uint32_t dpbIdx = 0; dpbIdx < numUsedRef; dpbIdx++)
+ {
+ int8_t dpbSlot = -1;
+
+ if (refOnlyDpbIn[dpbIdx].is_non_existing)
+ {
+ // There shouldn't be not_existing in h.265
+ DE_ASSERT(0);
+ DE_ASSERT(refOnlyDpbIn[dpbIdx].m_picBuff == DE_NULL);
+
+ while (((uint32_t)firstNonExistingDpbSlot < m_maxNumDpbSurfaces) && (dpbSlot == -1))
+ {
+ if (!(dpbInUseMask & (1 << firstNonExistingDpbSlot)))
+ {
+ dpbSlot = firstNonExistingDpbSlot;
+ }
+ firstNonExistingDpbSlot++;
+ }
+
+ DE_ASSERT((dpbSlot >= 0) && ((uint32_t)dpbSlot < m_maxNumDpbSurfaces));
+ }
+ else
+ {
+ DE_ASSERT(refOnlyDpbIn[dpbIdx].m_picBuff != DE_NULL);
+ dpbSlot = refOnlyDpbIn[dpbIdx].dpbSlot;
+ }
+
+ DE_ASSERT((dpbSlot >= 0) && (dpbSlot < HEVC_MAX_DPB_SLOTS));
+
+ refOnlyDpbIn[dpbIdx].setH265PictureData(pDpbSlotInfo, pReferenceSlots, dpbIdx, dpbSlot);
+ pGopReferenceImagesIndexes[dpbIdx] = GetPicIdx(refOnlyDpbIn[dpbIdx].m_picBuff);
+ }
+
+ int32_t numPocStCurrBefore = 0;
+ const size_t maxNumPocStCurrBefore = sizeof(pStdPictureInfo->RefPicSetStCurrBefore) / sizeof(pStdPictureInfo->RefPicSetStCurrBefore[0]);
+
+ DE_UNREF(maxNumPocStCurrBefore);
+ DE_ASSERT((size_t)pin->NumPocStCurrBefore < maxNumPocStCurrBefore);
+
+ for (int32_t i = 0; i < pin->NumPocStCurrBefore; i++)
+ {
+ uint8_t idx = (uint8_t)pin->RefPicSetStCurrBefore[i];
+
+ if (idx < HEVC_MAX_DPB_SLOTS)
+ {
+ pStdPictureInfo->RefPicSetStCurrBefore[numPocStCurrBefore++] = frmListToDpb[idx] & 0xf;
+ }
+ }
+ while (numPocStCurrBefore < 8)
+ {
+ pStdPictureInfo->RefPicSetStCurrBefore[numPocStCurrBefore++] = 0xff;
+ }
+
+ int32_t numPocStCurrAfter = 0;
+ const size_t maxNumPocStCurrAfter = sizeof(pStdPictureInfo->RefPicSetStCurrAfter) / sizeof(pStdPictureInfo->RefPicSetStCurrAfter[0]);
+
+ DE_UNREF(maxNumPocStCurrAfter);
+ DE_ASSERT((size_t)pin->NumPocStCurrAfter < maxNumPocStCurrAfter);
+
+ for (int32_t i = 0; i < pin->NumPocStCurrAfter; i++)
+ {
+ uint8_t idx = (uint8_t)pin->RefPicSetStCurrAfter[i];
+
+ if (idx < HEVC_MAX_DPB_SLOTS)
+ {
+ pStdPictureInfo->RefPicSetStCurrAfter[numPocStCurrAfter++] = frmListToDpb[idx] & 0xf;
+ }
+ }
+
+ while (numPocStCurrAfter < 8)
+ {
+ pStdPictureInfo->RefPicSetStCurrAfter[numPocStCurrAfter++] = 0xff;
+ }
+
+ int32_t numPocLtCurr = 0;
+ const size_t maxNumPocLtCurr = sizeof(pStdPictureInfo->RefPicSetLtCurr) / sizeof(pStdPictureInfo->RefPicSetLtCurr[0]);
+
+ DE_UNREF(maxNumPocLtCurr);
+ DE_ASSERT((size_t)pin->NumPocLtCurr < maxNumPocLtCurr);
+
+ for (int32_t i = 0; i < pin->NumPocLtCurr; i++)
+ {
+ uint8_t idx = (uint8_t)pin->RefPicSetLtCurr[i];
+
+ if (idx < HEVC_MAX_DPB_SLOTS)
+ {
+ pStdPictureInfo->RefPicSetLtCurr[numPocLtCurr++] = frmListToDpb[idx] & 0xf;
+ }
+ }
+
+ while (numPocLtCurr < 8)
+ {
+ pStdPictureInfo->RefPicSetLtCurr[numPocLtCurr++] = 0xff;
+ }
+
+ return numUsedRef;
+}
+
+int8_t VideoBaseDecoder::AllocateDpbSlotForCurrentH264 (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase,
+ StdVideoDecodeH264PictureInfoFlags currPicFlags)
+{
+ // Now, map the current render target
+ int8_t dpbSlot = -1;
+ int8_t currPicIdx = GetPicIdx(pNvidiaVulkanPictureBase);
+
+ DE_ASSERT(currPicIdx >= 0);
+
+ SetFieldPicFlag(currPicIdx, currPicFlags.field_pic_flag);
+ // In Vulkan we always allocate reference slot for the current picture.
+ if (true /* currPicFlags.is_reference */)
+ {
+ dpbSlot = GetPicDpbSlot(currPicIdx);
+
+ if (dpbSlot < 0)
+ {
+ dpbSlot = m_dpb.AllocateSlot();
+
+ DE_ASSERT(dpbSlot >= 0);
+
+ SetPicDpbSlot(currPicIdx, dpbSlot);
+
+ m_dpb[dpbSlot].setPictureResource(pNvidiaVulkanPictureBase);
+ }
+
+ DE_ASSERT(dpbSlot >= 0);
+ }
+
+ return dpbSlot;
+}
+
+int8_t VideoBaseDecoder::AllocateDpbSlotForCurrentH265 (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase,
+ bool isReference)
+{
+ // Now, map the current render target
+ int8_t dpbSlot = -1;
+ int8_t currPicIdx = GetPicIdx(pNvidiaVulkanPictureBase);
+
+ DE_ASSERT(currPicIdx >= 0);
+ DE_ASSERT(isReference);
+
+ if (isReference)
+ {
+ dpbSlot = GetPicDpbSlot(currPicIdx);
+
+ if (dpbSlot < 0)
+ {
+ dpbSlot = m_dpb.AllocateSlot();
+
+ DE_ASSERT(dpbSlot >= 0);
+
+ SetPicDpbSlot(currPicIdx, dpbSlot);
+
+ m_dpb[dpbSlot].setPictureResource(pNvidiaVulkanPictureBase);
+ }
+
+ DE_ASSERT(dpbSlot >= 0);
+ }
+
+ return dpbSlot;
+}
+
+VkFormat getRecommendedFormat (const vector<VkFormat>& formats, VkFormat recommendedFormat)
+{
+ if (formats.empty())
+ return VK_FORMAT_UNDEFINED;
+ else if (recommendedFormat != VK_FORMAT_UNDEFINED && std::find(formats.begin(), formats.end(), recommendedFormat) != formats.end())
+ return recommendedFormat;
+ else
+ return formats[0];
+}
+
+vector<pair<VkFormat, VkImageUsageFlags>> getImageFormatAndUsageForOutputAndDPB (const InstanceInterface& vk,
+ const VkPhysicalDevice physicalDevice,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat recommendedFormat,
+ const bool distinctDstDpbImages)
+{
+ const VkImageUsageFlags dstFormatUsages = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
+ | VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR;
+ const VkImageUsageFlags dpbFormatUsages = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
+ const VkImageUsageFlags bothImageUsages = dstFormatUsages | dpbFormatUsages;
+ VkFormat dstFormat = VK_FORMAT_UNDEFINED;
+ VkFormat dpbFormat = VK_FORMAT_UNDEFINED;
+ vector<pair<VkFormat, VkImageUsageFlags>> result;
+
+ // Check if both image usages are not supported on this platform
+ if (!distinctDstDpbImages)
+ {
+ const MovePtr<vector<VkFormat>> bothUsageFormats = getSupportedFormats(vk, physicalDevice, bothImageUsages, videoProfileList);
+ VkFormat pickedFormat = getRecommendedFormat(*bothUsageFormats, recommendedFormat);
+
+ result.push_back(pair<VkFormat, VkImageUsageFlags>(pickedFormat, bothImageUsages));
+ result.push_back(pair<VkFormat, VkImageUsageFlags>(pickedFormat, VkImageUsageFlags()));
+ }
+ else
+ {
+ {
+ const MovePtr<vector<VkFormat>> dstUsageFormats = getSupportedFormats(vk, physicalDevice, dstFormatUsages, videoProfileList);
+
+ if (dstUsageFormats == DE_NULL)
+ TCU_FAIL("Implementation must report format for VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR");
+
+ dstFormat = getRecommendedFormat(*dstUsageFormats, recommendedFormat);
+
+ if (dstFormat == VK_FORMAT_UNDEFINED)
+ TCU_FAIL("Implementation must report format for VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR");
+
+ result.push_back(pair<VkFormat, VkImageUsageFlags>(dstFormat, dstFormatUsages));
+ }
+
+ {
+ const MovePtr<vector<VkFormat>> dpbUsageFormats = getSupportedFormats(vk, physicalDevice, dpbFormatUsages, videoProfileList);
+
+ if (dpbUsageFormats == DE_NULL)
+ TCU_FAIL("Implementation must report format for VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR");
+
+ dpbFormat = getRecommendedFormat(*dpbUsageFormats, recommendedFormat);
+
+ result.push_back(pair<VkFormat, VkImageUsageFlags>(dpbFormat, dpbFormatUsages));
+ }
+ }
+
+ DE_ASSERT(result.size() == 2);
+
+ return result;
+}
+
+/* Callback function to be registered for getting a callback when decoding of
+ * sequence starts. Return value from HandleVideoSequence() are interpreted as :
+ * 0: fail, 1: suceeded, > 1: override dpb size of parser (set by
+ * nvVideoParseParameters::ulMaxNumDecodeSurfaces while creating parser)
+ */
+int32_t VideoBaseDecoder::StartVideoSequence (const VulkanParserDetectedVideoFormat* pVideoFormat)
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
+ const VkDevice device = getDevice();
+ const DeviceInterface& vkd = getDeviceDriver();
+ const deUint32 queueFamilyIndex = getQueueFamilyIndexDecode();
+ Allocator& allocator = getAllocator();
+ const VkDeviceSize bufferSize = 4 * 1024 * 1024;
+
+ DE_ASSERT(m_videoFrameBuffer != DE_NULL);
+ DE_ASSERT(m_videoCodecOperation == pVideoFormat->codec); // Make sure video have same format the queue was created for
+ DE_ASSERT(VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR == pVideoFormat->chromaSubsampling || VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR == pVideoFormat->chromaSubsampling || VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR == pVideoFormat->chromaSubsampling || VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR == pVideoFormat->chromaSubsampling);
+
+ const VkVideoCodecOperationFlagBitsKHR videoCodec = pVideoFormat->codec;
+ const uint32_t maxDpbSlotCount = pVideoFormat->maxNumDpbSlots; // This is currently configured by the parser to maxNumDpbSlots from the stream plus 1 for the current slot on the fly
+ const bool semiPlanarFormat = pVideoFormat->chromaSubsampling != VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR;
+ const VkVideoChromaSubsamplingFlagBitsKHR chromaSubsampling = pVideoFormat->chromaSubsampling;
+ const VkVideoComponentBitDepthFlagsKHR lumaBitDepth = getLumaBitDepth(pVideoFormat->bit_depth_luma_minus8);
+ const VkVideoComponentBitDepthFlagsKHR chromaBitDepth = getChromaBitDepth(pVideoFormat->bit_depth_chroma_minus8);
+ const VkFormat videoVkFormat = codecGetVkFormat(chromaSubsampling, lumaBitDepth, semiPlanarFormat);
+ const VkExtent2D codedExtent = { pVideoFormat->coded_width, pVideoFormat->coded_height };
+ const bool h264 = (videoCodec == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR);
+ const bool h265 = (videoCodec == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR);
+
+ DE_ASSERT(pVideoFormat->coded_width <= 3840);
+ DE_ASSERT(videoVkFormat == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM);
+ DE_ASSERT(h264 || h265);
+
+ m_numDecodeSurfaces = std::max(m_gopSize * m_dpbCount, 4u);
+
+ const MovePtr<VkVideoDecodeH264ProfileInfoKHR> videoProfileExtentionH264 = getVideoProfileExtensionH264D();
+ const MovePtr<VkVideoDecodeH265ProfileInfoKHR> videoProfileExtentionH265 = getVideoProfileExtensionH265D();
+ void* videoProfileExtention = h264 ? (void*)videoProfileExtentionH264.get()
+ : h265 ? (void*)videoProfileExtentionH265.get()
+ : DE_NULL;
+ const MovePtr<VkVideoProfileInfoKHR> videoProfile = getVideoProfile(videoCodec, videoProfileExtention, chromaSubsampling, lumaBitDepth, chromaBitDepth);
+ const MovePtr<VkVideoProfileListInfoKHR> videoProfileList = getVideoProfileList(videoProfile.get());
+
+
+ const MovePtr<VkVideoDecodeH264CapabilitiesKHR> videoCapabilitiesExtension264D = getVideoCapabilitiesExtensionH264D();
+ const MovePtr<VkVideoDecodeH265CapabilitiesKHR> videoCapabilitiesExtension265D = getVideoCapabilitiesExtensionH265D();
+ void* videoCapabilitiesExtension = h264 ? (void*)videoCapabilitiesExtension264D.get()
+ : h265 ? (void*)videoCapabilitiesExtension265D.get()
+ : DE_NULL;
+ MovePtr<VkVideoDecodeCapabilitiesKHR> videoDecodeCapabilities = getVideoDecodeCapabilities(videoCapabilitiesExtension);
+ const MovePtr<VkVideoCapabilitiesKHR> videoCapabilites = getVideoCapabilities(vki, physDevice, videoProfile.get(), videoDecodeCapabilities.get());
+ const bool videoExtentSupported = validateVideoExtent(codedExtent, *videoCapabilites);
+
+ m_distinctDstDpbImages = (videoDecodeCapabilities->flags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR) ? true : false;
+
+ const vector<pair<VkFormat, VkImageUsageFlags>> imageFormatAndUsageForOutputAndDPB = getImageFormatAndUsageForOutputAndDPB(vki, physDevice, videoProfileList.get(), videoVkFormat, m_distinctDstDpbImages);
+
+ const bool outFormatValidate = validateFormatSupport(vki, physDevice, imageFormatAndUsageForOutputAndDPB[0].second, videoProfileList.get(), imageFormatAndUsageForOutputAndDPB[0].first);
+ const bool isVideoProfileSutable = validateVideoProfileList(vki, physDevice, videoProfileList.get(), imageFormatAndUsageForOutputAndDPB[0].first, imageFormatAndUsageForOutputAndDPB[0].second);
+
+ DE_UNREF(outFormatValidate);
+ DE_UNREF(isVideoProfileSutable);
+
+ const VkFormat outPictureFormat = imageFormatAndUsageForOutputAndDPB[0].first;
+ const VkImageUsageFlags outPictureUsage = imageFormatAndUsageForOutputAndDPB[0].second;
+ const VkFormat dpbPictureFormat = imageFormatAndUsageForOutputAndDPB[1].first;
+ const VkImageUsageFlags dpbPictureUsage = imageFormatAndUsageForOutputAndDPB[1].second;
+ const deUint32 dpbPictureImageLayers = (videoCapabilites->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR) ? 1 : m_numDecodeSurfaces;
+ const VkImageCreateInfo outImageCreateInfo = makeImageCreateInfo(outPictureFormat, codedExtent, &queueFamilyIndex, outPictureUsage, videoProfileList.get());
+ const VkImageCreateInfo dpbImageCreateInfo = makeImageCreateInfo(dpbPictureFormat, codedExtent, &queueFamilyIndex, dpbPictureUsage, videoProfileList.get(), dpbPictureImageLayers);
+ const VkImageCreateInfo* pDpbImageCreateInfo = dpbPictureUsage == static_cast<VkImageUsageFlags>(0) ? DE_NULL : &dpbImageCreateInfo;
+
+ if (m_width == 0 || m_height == 0)
+ {
+ const MovePtr<VkVideoSessionCreateInfoKHR> videoSessionCreateInfo = getVideoSessionCreateInfo(queueFamilyIndex,
+ videoProfile.get(),
+ codedExtent,
+ outPictureFormat,
+ dpbPictureFormat,
+ maxDpbSlotCount,
+ maxDpbSlotCount);
+ Move<VkVideoSessionKHR> videoSession = createVideoSessionKHR(vkd, device, videoSessionCreateInfo.get());
+ vector<AllocationPtr> allocations = getAndBindVideoSessionMemory(vkd, device, *videoSession, allocator);
+
+ DE_UNREF(videoExtentSupported);
+
+ m_minBitstreamBufferSizeAlignment = videoCapabilites->minBitstreamBufferSizeAlignment;
+ m_minBitstreamBufferOffsetAlignment = videoCapabilites->minBitstreamBufferOffsetAlignment;
+ m_videoDecodeSessionAllocs.swap(allocations);
+
+ m_videoDecodeSession = videoSession;
+ m_videoCodecOperation = pVideoFormat->codec;
+ m_chromaFormat = pVideoFormat->chromaSubsampling;
+ m_bitLumaDepthMinus8 = pVideoFormat->bit_depth_luma_minus8;
+ m_bitChromaDepthMinus8 = pVideoFormat->bit_depth_chroma_minus8;
+ m_videoFormat = *pVideoFormat;
+ m_codedWidth = pVideoFormat->coded_width;
+ m_codedHeight = pVideoFormat->coded_height;
+ m_width = pVideoFormat->display_area.right - pVideoFormat->display_area.left;
+ m_height = pVideoFormat->display_area.bottom - pVideoFormat->display_area.top;
+ m_maxDecodeFramesAllocated = std::max((uint32_t)m_frameCountTrigger, m_numDecodeSurfaces);
+ m_maxDecodeFramesCount = m_numDecodeSurfaces;
+
+ DE_ASSERT(m_maxDecodeFramesCount <= m_maxDecodeFramesAllocated);
+
+ m_videoFrameBuffer->InitImagePool(vkd, device, queueFamilyIndex, allocator, m_maxDecodeFramesCount, m_maxDecodeFramesAllocated, &outImageCreateInfo, pDpbImageCreateInfo, videoProfile.get());
+
+ m_decodeFramesData = new NvVkDecodeFrameData[m_maxDecodeFramesAllocated];
+ m_videoCommandPool = makeCommandPool(vkd, device, queueFamilyIndex);
+
+ for (uint32_t decodeFrameId = 0; decodeFrameId < m_maxDecodeFramesCount; decodeFrameId++)
+ {
+ m_decodeFramesData[decodeFrameId].bitstreamBuffer.CreateVideoBitstreamBuffer(vkd, device, allocator, bufferSize, m_minBitstreamBufferOffsetAlignment, m_minBitstreamBufferSizeAlignment, videoProfileList.get());
+ m_decodeFramesData[decodeFrameId].commandBuffer = allocateCommandBuffer(vkd, device, *m_videoCommandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ }
+ }
+ else if (m_maxDecodeFramesCount < m_maxDecodeFramesAllocated)
+ {
+ const uint32_t firstIndex = m_maxDecodeFramesCount;
+
+ DE_ASSERT(m_maxDecodeFramesCount > 0);
+
+ m_maxDecodeFramesCount += m_gopSize;
+
+ DE_ASSERT(m_maxDecodeFramesCount <= m_maxDecodeFramesAllocated);
+
+ m_numDecodeSurfaces = m_maxDecodeFramesCount;
+ m_codedWidth = pVideoFormat->coded_width;
+ m_codedHeight = pVideoFormat->coded_height;
+ m_width = pVideoFormat->display_area.right - pVideoFormat->display_area.left;
+ m_height = pVideoFormat->display_area.bottom - pVideoFormat->display_area.top;
+
+ m_videoFrameBuffer->InitImagePool(vkd, device, queueFamilyIndex, allocator, m_maxDecodeFramesCount, m_maxDecodeFramesAllocated, &outImageCreateInfo, pDpbImageCreateInfo, videoProfile.get());
+
+ for (uint32_t decodeFrameId = firstIndex; decodeFrameId < m_maxDecodeFramesCount; decodeFrameId++)
+ {
+ m_decodeFramesData[decodeFrameId].bitstreamBuffer.CreateVideoBitstreamBuffer(vkd, device, allocator, bufferSize, m_minBitstreamBufferOffsetAlignment, m_minBitstreamBufferSizeAlignment, videoProfileList.get());
+ m_decodeFramesData[decodeFrameId].commandBuffer = allocateCommandBuffer(vkd, device, *m_videoCommandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ }
+ }
+
+ return m_numDecodeSurfaces;
+}
+
+bool VideoBaseDecoder::UpdatePictureParametersHandler (NvidiaVulkanPictureParameters* pNvidiaVulkanPictureParameters,
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase>& pictureParametersObject,
+ uint64_t updateSequenceCount)
+{
+ NvidiaSharedBaseObj<StdVideoPictureParametersSet> pictureParametersSet(StdVideoPictureParametersSet::Create(pNvidiaVulkanPictureParameters, updateSequenceCount));
+
+ DEBUGLOG(std::cout << "\tUpdatePictureParametersHandler::PPS:" << (void*)pictureParametersSet.Get() << std::endl);
+
+ if (!pictureParametersSet)
+ {
+ DE_ASSERT(0 && "Invalid pictureParametersSet");
+ return false;
+ }
+
+ const bool hasSpsPpsPair = AddPictureParametersToQueue(pictureParametersSet);
+
+ if (m_videoDecodeSession.get() != DE_NULL && hasSpsPpsPair)
+ {
+ FlushPictureParametersQueue();
+ }
+
+ pictureParametersObject = pictureParametersSet;
+
+ return true;
+}
+
+bool VideoBaseDecoder::AddPictureParametersToQueue (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& pictureParametersSet)
+{
+ if (!m_pictureParametersQueue.empty())
+ {
+ m_pictureParametersQueue.push(pictureParametersSet);
+
+ return false;
+ }
+
+ bool isSps = false;
+ int32_t spsId = pictureParametersSet->GetSpsId(isSps);
+
+ // Attempt to combine the pair of SPS/PPS to avid creatingPicture Parameter Objects
+ if ((!!m_lastSpsPictureParametersQueue && !!m_lastPpsPictureParametersQueue) || // the last slots are already occupied
+ (isSps && !!m_lastSpsPictureParametersQueue) || // the current one is SPS but SPS slot is already occupied
+ (!isSps && !!m_lastPpsPictureParametersQueue) || // the current one is PPS but PPS slot is already occupied
+ ((m_lastSpsIdInQueue != -1) && (m_lastSpsIdInQueue != spsId))) // This has a different spsId
+ {
+ if (m_lastSpsPictureParametersQueue)
+ {
+ m_pictureParametersQueue.push(m_lastSpsPictureParametersQueue);
+ m_lastSpsPictureParametersQueue = DE_NULL;
+ }
+
+ if (m_lastPpsPictureParametersQueue)
+ {
+ m_pictureParametersQueue.push(m_lastPpsPictureParametersQueue);
+ m_lastPpsPictureParametersQueue = DE_NULL;
+ }
+
+ m_pictureParametersQueue.push(pictureParametersSet);
+
+ m_lastSpsIdInQueue = -1;
+
+ return false;
+ }
+
+ if (m_lastSpsIdInQueue == -1)
+ {
+ m_lastSpsIdInQueue = spsId;
+ }
+
+ DE_ASSERT(m_lastSpsIdInQueue != -1);
+
+ if (isSps)
+ {
+ m_lastSpsPictureParametersQueue = pictureParametersSet;
+ }
+ else
+ {
+ m_lastPpsPictureParametersQueue = pictureParametersSet;
+ }
+
+ uint32_t count = 0;
+ if (m_lastSpsPictureParametersQueue)
+ {
+ count++;
+ }
+
+ if (m_lastPpsPictureParametersQueue)
+ {
+ count++;
+ }
+
+ return (count == 2);
+}
+
+uint32_t VideoBaseDecoder::FlushPictureParametersQueue ()
+{
+ uint32_t numQueueItems = 0;
+ while (!m_pictureParametersQueue.empty())
+ {
+ NvidiaSharedBaseObj<StdVideoPictureParametersSet>& ppItem = m_pictureParametersQueue.front();
+
+ bool isSps = false;
+ ppItem->GetSpsId(isSps);
+
+ NvidiaSharedBaseObj<StdVideoPictureParametersSet> emptyStdPictureParametersSet;
+
+ AddPictureParameters(isSps ? ppItem : emptyStdPictureParametersSet, isSps ? emptyStdPictureParametersSet : ppItem);
+
+ m_pictureParametersQueue.pop();
+ numQueueItems++;
+ }
+
+ if (numQueueItems)
+ {
+ return numQueueItems;
+ }
+
+ if (!(m_lastSpsPictureParametersQueue || m_lastPpsPictureParametersQueue))
+ {
+ return 0;
+ }
+
+ AddPictureParameters(m_lastSpsPictureParametersQueue, m_lastPpsPictureParametersQueue);
+
+ if (m_lastSpsPictureParametersQueue)
+ {
+ numQueueItems++;
+ m_lastSpsPictureParametersQueue = DE_NULL;
+ }
+
+ if (m_lastPpsPictureParametersQueue)
+ {
+ numQueueItems++;
+ m_lastPpsPictureParametersQueue = DE_NULL;
+ }
+
+ m_lastSpsIdInQueue = -1;
+
+ DE_ASSERT(numQueueItems);
+
+ return numQueueItems;
+}
+
+bool VideoBaseDecoder::CheckStdObjectBeforeUpdate (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& stdPictureParametersSet)
+{
+ if (!stdPictureParametersSet)
+ {
+ return false;
+ }
+
+ bool stdObjectUpdate = (stdPictureParametersSet->m_updateSequenceCount > 0);
+
+ if (!m_currentPictureParameters || stdObjectUpdate)
+ {
+ DE_ASSERT(m_videoDecodeSession.get() != DE_NULL);
+ DE_ASSERT(stdObjectUpdate || (stdPictureParametersSet->m_vkVideoDecodeSession == DE_NULL));
+ // DE_ASSERT(!stdObjectUpdate || stdPictureParametersSet->m_vkObjectOwner);
+ // Create new Vulkan Picture Parameters object
+ return true;
+
+ }
+ else
+ {
+ // new std object
+ DE_ASSERT(!stdPictureParametersSet->m_vkObjectOwner);
+ DE_ASSERT(stdPictureParametersSet->m_vkVideoDecodeSession == DE_NULL);
+ DE_ASSERT(m_currentPictureParameters);
+ // Update the existing Vulkan Picture Parameters object
+
+ return false;
+ }
+}
+
+NvidiaParserVideoPictureParameters* NvidiaParserVideoPictureParameters::VideoPictureParametersFromBase (NvidiaParserVideoRefCountBase* pBase)
+{
+ if (!pBase)
+ return DE_NULL;
+
+ NvidiaParserVideoPictureParameters* result = dynamic_cast<NvidiaParserVideoPictureParameters*>(pBase);
+
+ if (result)
+ return result;
+
+ TCU_THROW(InternalError, "Invalid NvidiaParserVideoPictureParameters from base");
+}
+
+VkVideoSessionParametersKHR NvidiaParserVideoPictureParameters::GetVideoSessionParametersKHR () const
+{
+ return m_sessionParameters.get();
+}
+
+int32_t NvidiaParserVideoPictureParameters::GetId () const
+{
+ return m_Id;
+}
+
+bool NvidiaParserVideoPictureParameters::HasSpsId (uint32_t spsId) const
+{
+ return m_spsIdsUsed[spsId];
+}
+
+bool NvidiaParserVideoPictureParameters::HasPpsId (uint32_t ppsId) const
+{
+ return m_ppsIdsUsed[ppsId];
+}
+
+NvidiaParserVideoPictureParameters::NvidiaParserVideoPictureParameters (VkDevice device)
+ : m_Id (-1)
+ , m_refCount (0)
+ , m_device (device)
+ , m_sessionParameters ()
+{
+}
+
+NvidiaParserVideoPictureParameters::~NvidiaParserVideoPictureParameters ()
+{
+}
+
+VulkanVideoBitstreamBuffer::VulkanVideoBitstreamBuffer ()
+ : m_bufferSize (0)
+ , m_bufferOffsetAlignment (0)
+ , m_bufferSizeAlignment (0)
+ , m_buffer (DE_NULL)
+{
+}
+
+const VkBuffer& VulkanVideoBitstreamBuffer::get ()
+{
+ return m_buffer->get();
+}
+
+VkResult VulkanVideoBitstreamBuffer::CreateVideoBitstreamBuffer (const DeviceInterface& vkd,
+ VkDevice device,
+ Allocator& allocator,
+ VkDeviceSize bufferSize,
+ VkDeviceSize bufferOffsetAlignment,
+ VkDeviceSize bufferSizeAlignment,
+ void* pNext,
+ const unsigned char* pBitstreamData,
+ VkDeviceSize bitstreamDataSize)
+{
+ DestroyVideoBitstreamBuffer();
+
+ m_bufferSizeAlignment = bufferSizeAlignment;
+ m_bufferSize = deAlign64(bufferSize, bufferSizeAlignment);
+ m_bufferOffsetAlignment = bufferOffsetAlignment;
+
+ const VkBufferCreateInfo bufferCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ pNext, // const void* pNext;
+ 0, // VkBufferCreateFlags flags;
+ m_bufferSize, // VkDeviceSize size;
+ VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0, // deUint32 queueFamilyIndexCount;
+ DE_NULL, // const deUint32* pQueueFamilyIndices;
+ };
+
+ m_buffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, bufferCreateInfo, MemoryRequirement::HostVisible));
+
+ VK_CHECK(CopyVideoBitstreamToBuffer(vkd, device, pBitstreamData, bitstreamDataSize));
+
+ return VK_SUCCESS;
+}
+
+VkResult VulkanVideoBitstreamBuffer::CopyVideoBitstreamToBuffer (const DeviceInterface& vkd,
+ VkDevice device,
+ const unsigned char* pBitstreamData,
+ VkDeviceSize bitstreamDataSize)
+{
+ if (pBitstreamData && bitstreamDataSize)
+ {
+ void* ptr = m_buffer->getAllocation().getHostPtr();
+
+ DE_ASSERT(bitstreamDataSize <= m_bufferSize);
+
+ //Copy Bitstream nvdec hw requires min bitstream size to be 16 (see bug 1599347). memset padding to 0 if bitstream size less than 16
+ if (bitstreamDataSize < 16)
+ deMemset(ptr, 0, 16);
+
+ deMemcpy(ptr, pBitstreamData, (size_t)bitstreamDataSize);
+
+ flushAlloc(vkd, device, m_buffer->getAllocation());
+ }
+
+ return VK_SUCCESS;
+}
+
+void VulkanVideoBitstreamBuffer::DestroyVideoBitstreamBuffer ()
+{
+ m_buffer = de::MovePtr<BufferWithMemory>();
+ m_bufferSize = 0;
+ m_bufferOffsetAlignment = 0;
+ m_bufferSizeAlignment = 0;
+}
+
+VulkanVideoBitstreamBuffer::~VulkanVideoBitstreamBuffer ()
+{
+ DestroyVideoBitstreamBuffer();
+}
+
+VkDeviceSize VulkanVideoBitstreamBuffer::GetBufferSize ()
+{
+ return m_bufferSize;
+}
+
+VkDeviceSize VulkanVideoBitstreamBuffer::GetBufferOffsetAlignment ()
+{
+ return m_bufferOffsetAlignment;
+}
+
+NvidiaParserVideoPictureParameters* VideoBaseDecoder::CheckStdObjectAfterUpdate (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& stdPictureParametersSet,
+ NvidiaParserVideoPictureParameters* pNewPictureParametersObject)
+{
+ if (!stdPictureParametersSet)
+ {
+ return DE_NULL;
+ }
+
+ if (pNewPictureParametersObject)
+ {
+ if (stdPictureParametersSet->m_updateSequenceCount == 0)
+ {
+ stdPictureParametersSet->m_vkVideoDecodeSession = m_videoDecodeSession.get();
+ }
+ else
+ {
+ // DE_ASSERT(stdPictureParametersSet->m_vkObjectOwner);
+ // DE_ASSERT(stdPictureParametersSet->m_vkVideoDecodeSession == m_vkVideoDecodeSession);
+ const NvidiaParserVideoPictureParameters* pOwnerPictureParameters = NvidiaParserVideoPictureParameters::VideoPictureParametersFromBase(stdPictureParametersSet->m_vkObjectOwner);
+
+ if (pOwnerPictureParameters)
+ {
+ DE_ASSERT(pOwnerPictureParameters->GetId() < pNewPictureParametersObject->GetId());
+ }
+ }
+
+ // new object owner
+ stdPictureParametersSet->m_vkObjectOwner = pNewPictureParametersObject;
+ return pNewPictureParametersObject;
+
+ }
+ else
+ { // new std object
+ stdPictureParametersSet->m_vkVideoDecodeSession = m_videoDecodeSession.get();
+ stdPictureParametersSet->m_vkObjectOwner = m_currentPictureParameters;
+ }
+
+ return m_currentPictureParameters;
+}
+
+NvidiaParserVideoPictureParameters* VideoBaseDecoder::AddPictureParameters (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& spsStdPictureParametersSet,
+ NvidiaSharedBaseObj<StdVideoPictureParametersSet>& ppsStdPictureParametersSet)
+{
+ const DeviceInterface& vkd = getDeviceDriver();
+ const VkDevice device = getDevice();
+ NvidiaParserVideoPictureParameters* pPictureParametersObject = DE_NULL;
+ const bool createNewObject = CheckStdObjectBeforeUpdate(spsStdPictureParametersSet)
+ || CheckStdObjectBeforeUpdate(ppsStdPictureParametersSet);
+#ifdef TODO
+ if (createNewObject)
+#else
+ DE_UNREF(createNewObject);
+
+ if (true)
+#endif
+ {
+ pPictureParametersObject = NvidiaParserVideoPictureParameters::Create(vkd, device, m_videoDecodeSession.get(), spsStdPictureParametersSet, ppsStdPictureParametersSet, m_currentPictureParameters);
+ if (pPictureParametersObject)
+ m_currentPictureParameters = pPictureParametersObject;
+ }
+ else
+ {
+ m_currentPictureParameters->Update(vkd, spsStdPictureParametersSet, ppsStdPictureParametersSet);
+ }
+
+ CheckStdObjectAfterUpdate(spsStdPictureParametersSet, pPictureParametersObject);
+ CheckStdObjectAfterUpdate(ppsStdPictureParametersSet, pPictureParametersObject);
+
+ return pPictureParametersObject;
+}
+
+NvVkDecodeFrameData* VideoBaseDecoder::GetCurrentFrameData (uint32_t currentSlotId)
+{
+ DE_ASSERT(currentSlotId < m_maxDecodeFramesCount);
+
+ return &m_decodeFramesData[currentSlotId];
+}
+
+int32_t VideoBaseDecoder::ReleaseDisplayedFrame (DecodedFrame* pDisplayedFrame)
+{
+ if (pDisplayedFrame->pictureIndex != -1)
+ {
+ DecodedFrameRelease decodedFramesRelease = { pDisplayedFrame->pictureIndex, 0, 0, 0, 0, 0 };
+ DecodedFrameRelease* decodedFramesReleasePtr = &decodedFramesRelease;
+
+ pDisplayedFrame->pictureIndex = -1;
+
+ decodedFramesRelease.decodeOrder = pDisplayedFrame->decodeOrder;
+ decodedFramesRelease.displayOrder = pDisplayedFrame->displayOrder;
+
+ decodedFramesRelease.hasConsummerSignalFence = pDisplayedFrame->hasConsummerSignalFence;
+ decodedFramesRelease.hasConsummerSignalSemaphore = pDisplayedFrame->hasConsummerSignalSemaphore;
+ decodedFramesRelease.timestamp = 0;
+
+ return m_videoFrameBuffer->ReleaseDisplayedPicture(&decodedFramesReleasePtr, 1);
+ }
+
+ return -1;
+}
+
+VideoFrameBuffer* VideoBaseDecoder::GetVideoFrameBuffer (void)
+{
+ DE_ASSERT(m_videoFrameBuffer.get() != DE_NULL);
+
+ return m_videoFrameBuffer.get();
+}
+
+IfcFfmpegFunctions* VideoBaseDecoder::GetIfcFfmpegFuncs (void)
+{
+ DE_ASSERT(m_ffmpegFuncs.get() != DE_NULL);
+
+ return m_ffmpegFuncs.get();
+}
+
+IfcNvFunctions* VideoBaseDecoder::GetNvFuncs (void)
+{
+ DE_ASSERT(m_nvFuncs.get() != DE_NULL);
+
+ return m_nvFuncs.get();
+}
+
+void* copyToHeap (HeapType& heap, const void* p, size_t size)
+{
+ if (p == DE_NULL || size == 0)
+ return DE_NULL;
+
+ heap.push_back(de::MovePtr<vector<deUint8>>(new vector<deUint8>(size)));
+
+ deMemcpy(heap.back()->data(), p, size);
+
+ return heap.back()->data();
+}
+
+void appendHeap (HeapType& heapTo, HeapType& heapFrom)
+{
+ heapTo.reserve(heapTo.size() + heapFrom.size());
+
+ for (auto& item : heapFrom)
+ heapTo.push_back(de::MovePtr<vector<deUint8>>(item.release()));
+
+ heapFrom.clear();
+}
+
+void appendPerFrameDecodeParameters (PerFrameDecodeParameters* pPerFrameDecodeParameters,
+ vector<PerFrameDecodeParameters*>& perFrameDecodeParameters,
+ HeapType& heap)
+{
+ perFrameDecodeParameters.push_back(pPerFrameDecodeParameters);
+
+ pPerFrameDecodeParameters->pCurrentPictureParameters->AddRef();
+
+ if (pPerFrameDecodeParameters->bitstreamDataLen > 0)
+ pPerFrameDecodeParameters->pBitstreamData = static_cast<unsigned char*>(copyToHeap(heap, pPerFrameDecodeParameters->pBitstreamData, static_cast<size_t>(deAlign64(pPerFrameDecodeParameters->bitstreamDataLen, 16))));
+}
+
+/* Callback function to be registered for getting a callback when a decoded
+ * frame is ready to be decoded. Return value from HandlePictureDecode() are
+ * interpreted as: 0: fail, >=1: suceeded
+ */
+int32_t VideoBaseDecoder::DecodePictureWithParameters (PerFrameDecodeParameters* pPerFrameDecodeParameters,
+ VulkanParserDecodePictureInfo* pVulkanParserDecodePictureInfo,
+ HeapType& heap)
+{
+ DEBUGLOG(std::cout << "\tDecodePictureWithParameters:" << std::dec << m_pPerFrameDecodeParameters.size() << std::endl);
+
+ int32_t result = -1;
+
+ const size_t ndx = m_pPerFrameDecodeParameters.size();
+
+ FlushPictureParametersQueue();
+
+ appendHeap(incSizeSafe(m_heaps), heap);
+
+ m_pVulkanParserDecodePictureInfo.push_back((VulkanParserDecodePictureInfo*)copyToHeap(m_heaps[ndx], pVulkanParserDecodePictureInfo, sizeof(*pVulkanParserDecodePictureInfo)));
+ appendPerFrameDecodeParameters(pPerFrameDecodeParameters, m_pPerFrameDecodeParameters, m_heaps[ndx]);
+
+ result = pPerFrameDecodeParameters->currPicIdx;
+
+ if (m_pPerFrameDecodeParameters.size() >= (size_t)m_frameCountTrigger)
+ result = DecodeCachedPictures();
+
+ return result;
+}
+
+void VideoBaseDecoder::ReinitCaches (void)
+{
+ const size_t size = m_frameCountTrigger;
+
+ for (auto& it : m_pPerFrameDecodeParameters)
+ it->pCurrentPictureParameters->Release();
+
+ m_pPerFrameDecodeParameters.clear();
+ m_pVulkanParserDecodePictureInfo.clear();
+ m_pFrameDatas.clear();
+ m_bitstreamBufferMemoryBarriers.clear();
+ m_imageBarriersVec.clear();
+ m_frameSynchronizationInfos.clear();
+ m_commandBufferSubmitInfos.clear();
+ m_decodeBeginInfos.clear();
+ m_pictureResourcesInfos.clear();
+ m_dependencyInfos.clear();
+ m_decodeEndInfos.clear();
+ m_submitInfos.clear();
+ m_frameCompleteFences.clear();
+ m_frameConsumerDoneFences.clear();
+ m_frameCompleteSemaphoreSubmitInfos.clear();
+ m_frameConsumerDoneSemaphoreSubmitInfos.clear();
+ m_heaps.clear();
+
+ // Make sure pointers will stay consistent
+ m_pPerFrameDecodeParameters.reserve(size);
+ m_pVulkanParserDecodePictureInfo.reserve(size);
+ m_pFrameDatas.reserve(size);
+ m_bitstreamBufferMemoryBarriers.reserve(size);
+ m_imageBarriersVec.reserve(size);
+ m_frameSynchronizationInfos.reserve(size);
+ m_commandBufferSubmitInfos.reserve(size);
+ m_decodeBeginInfos.reserve(size);
+ m_pictureResourcesInfos.reserve(size);
+ m_dependencyInfos.reserve(size);
+ m_decodeEndInfos.reserve(size);
+ m_submitInfos.reserve(size);
+ m_frameCompleteFences.reserve(size);
+ m_frameConsumerDoneFences.reserve(size);
+ m_frameCompleteSemaphoreSubmitInfos.reserve(size);
+ m_frameConsumerDoneSemaphoreSubmitInfos.reserve(size);
+ m_heaps.reserve(size);
+}
+
+int32_t VideoBaseDecoder::DecodeCachedPictures (VideoBaseDecoder* friendDecoder,
+ bool waitSubmitted)
+{
+ DEBUGLOG(std::cout << "DecodeCachedPictures" << std::endl);
+
+ const DeviceInterface& vkd = getDeviceDriver();
+ const VkDevice device = getDevice();
+ const deUint32 queueFamilyIndex = getQueueFamilyIndexDecode();
+ const size_t ndxMax = m_pPerFrameDecodeParameters.size();
+ const bool interleaved = friendDecoder != DE_NULL || !waitSubmitted;
+ vector<size_t> recordOrderIndices;
+
+ DE_ASSERT(m_minBitstreamBufferSizeAlignment != 0);
+ DE_ASSERT(m_videoDecodeSession.get() != DE_NULL);
+
+ m_pFrameDatas.resize(ndxMax);
+ m_bitstreamBufferMemoryBarriers.resize(ndxMax);
+ m_imageBarriersVec.resize(ndxMax);
+ m_frameSynchronizationInfos.resize(ndxMax);
+ m_commandBufferSubmitInfos.resize(ndxMax);
+ m_decodeBeginInfos.resize(ndxMax);
+ m_pictureResourcesInfos.resize(ndxMax);
+ m_dependencyInfos.resize(ndxMax);
+ m_decodeEndInfos.resize(ndxMax);
+ m_submitInfos.resize(ndxMax);
+ m_frameCompleteFences.resize(ndxMax);
+ m_frameConsumerDoneSemaphoreSubmitInfos.resize(ndxMax);
+ m_frameCompleteSemaphoreSubmitInfos.resize(ndxMax);
+
+ for (size_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ const size_t picNdx = ndx;
+ PerFrameDecodeParameters* pPicParams = m_pPerFrameDecodeParameters[picNdx];
+ vector<VkImageMemoryBarrier2KHR>& imageBarriers = m_imageBarriersVec[picNdx];
+ VideoFrameBuffer::FrameSynchronizationInfo& frameSynchronizationInfo = m_frameSynchronizationInfos[picNdx];
+ NvVkDecodeFrameData*& pFrameData = m_pFrameDatas[picNdx];
+ vector<VideoFrameBuffer::PictureResourceInfo>& pictureResourcesInfo = m_pictureResourcesInfos[picNdx];
+ VkBufferMemoryBarrier2KHR& bitstreamBufferMemoryBarrier = m_bitstreamBufferMemoryBarriers[picNdx];
+ VkFence& frameCompleteFence = m_frameCompleteFences[picNdx];
+ VulkanParserDecodePictureInfo* pDecodePictureInfo = m_pVulkanParserDecodePictureInfo[picNdx];
+ const int32_t currPicIdx = pPicParams->currPicIdx;
+
+ DE_ASSERT((uint32_t)currPicIdx < m_numDecodeSurfaces);
+
+ m_videoFrameBuffer->SetPicNumInDecodeOrder(currPicIdx, ++m_decodePicCount);
+
+ pFrameData = GetCurrentFrameData((uint32_t)currPicIdx);
+
+ DE_ASSERT(pFrameData->bitstreamBuffer.GetBufferSize() >= pPicParams->bitstreamDataLen);
+
+ pFrameData->bitstreamBuffer.CopyVideoBitstreamToBuffer(vkd, device, pPicParams->pBitstreamData, pPicParams->bitstreamDataLen);
+
+ pPicParams->decodeFrameInfo.srcBuffer = pFrameData->bitstreamBuffer.get();
+ pPicParams->decodeFrameInfo.srcBufferOffset = 0;
+ pPicParams->decodeFrameInfo.srcBufferRange = deAlign64((VkDeviceSize)pPicParams->bitstreamDataLen, m_minBitstreamBufferSizeAlignment);
+
+ DE_ASSERT(pPicParams->decodeFrameInfo.srcBuffer != DE_NULL);
+
+ bitstreamBufferMemoryBarrier =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_PIPELINE_STAGE_2_NONE_KHR, // VkPipelineStageFlags2KHR srcStageMask;
+ 0, // VkAccessFlags2KHR srcAccessMask;
+ VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR, // VkPipelineStageFlags2KHR dstStageMask;
+ VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR, // VkAccessFlags2KHR dstAccessMask;
+ queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
+ queueFamilyIndex, // deUint32 dstQueueFamilyIndex;
+ pPicParams->decodeFrameInfo.srcBuffer, // VkBuffer buffer;
+ pPicParams->decodeFrameInfo.srcBufferOffset, // VkDeviceSize offset;
+ pPicParams->decodeFrameInfo.srcBufferRange // VkDeviceSize size;
+ };
+
+ imageBarriers.reserve(2 * PerFrameDecodeParameters::MAX_DPB_REF_SLOTS);
+
+ const VkImageMemoryBarrier2KHR dpbBarrierTemplate =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_PIPELINE_STAGE_2_NONE_KHR, // VkPipelineStageFlags2KHR srcStageMask;
+ 0, // VkAccessFlags2KHR srcAccessMask;
+ VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR, // VkPipelineStageFlags2KHR dstStageMask;
+ VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR, // VkAccessFlags2KHR dstAccessMask;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR, // VkImageLayout newLayout;
+ queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
+ queueFamilyIndex, // deUint32 dstQueueFamilyIndex;
+ DE_NULL, // VkImage image;
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1, } // VkImageSubresourceRange subresourceRange;
+ };
+
+ {
+ const VkImageLayout newLayout = m_distinctDstDpbImages ? VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR : VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
+ VkVideoPictureResourceInfoKHR& pictureResource = pPicParams->decodeFrameInfo.dstPictureResource;
+ VideoFrameBuffer::PictureResourceInfo currentPictureResource = { DE_NULL, VK_IMAGE_LAYOUT_UNDEFINED };
+
+ m_videoFrameBuffer->GetImageResourcesByIndex((int8_t)pPicParams->currPicIdx, &pictureResource, ¤tPictureResource, newLayout);
+
+ DEBUGLOG(std::cout << "PicNdx: " << std::dec << (int32_t)picNdx << " " << currentPictureResource.image << std::endl);
+
+ if (currentPictureResource.currentImageLayout == VK_IMAGE_LAYOUT_UNDEFINED)
+ {
+ VkImageMemoryBarrier2KHR& imageBarrier = incSizeSafe(imageBarriers);
+
+ imageBarrier = dpbBarrierTemplate;
+ imageBarrier.oldLayout = currentPictureResource.currentImageLayout;
+ imageBarrier.newLayout = newLayout;
+ imageBarrier.image = currentPictureResource.image;
+ imageBarrier.dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR;
+
+ DEBUGLOG(std::cout << "\tTransit DST: " << imageBarrier.image << " from " << imageBarrier.oldLayout << std::endl);
+
+ DE_ASSERT(imageBarrier.image != DE_NULL);
+ }
+ }
+
+ if (m_distinctDstDpbImages)
+ {
+ const VkImageLayout newLayout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
+ VkVideoPictureResourceInfoKHR& pictureResource = pPicParams->pictureResources[pPicParams->numGopReferenceSlots];
+ VideoFrameBuffer::PictureResourceInfo currentPictureResource = { DE_NULL, VK_IMAGE_LAYOUT_UNDEFINED };
+
+ m_videoFrameBuffer->GetImageResourcesByIndex((int8_t)pPicParams->currPicIdx, &pictureResource, ¤tPictureResource, newLayout);
+
+ DEBUGLOG(std::cout << "PicNdx: " << std::dec << (int32_t)picNdx << " " << currentPictureResource.image << std::endl);
+
+ if (currentPictureResource.currentImageLayout == VK_IMAGE_LAYOUT_UNDEFINED)
+ {
+ VkImageMemoryBarrier2KHR& imageBarrier = incSizeSafe(imageBarriers);
+
+ imageBarrier = dpbBarrierTemplate;
+ imageBarrier.oldLayout = currentPictureResource.currentImageLayout;
+ imageBarrier.newLayout = newLayout;
+ imageBarrier.image = currentPictureResource.image;
+ imageBarrier.dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR;
+ imageBarrier.subresourceRange.baseArrayLayer = pPicParams->decodeFrameInfo.dstPictureResource.baseArrayLayer;
+
+ DEBUGLOG(std::cout << "\tTransit DPB: " << imageBarrier.image << ":" << imageBarrier.subresourceRange.baseArrayLayer << " from " << imageBarrier.oldLayout << std::endl);
+
+ DE_ASSERT(imageBarrier.image != DE_NULL);
+ }
+ }
+
+
+ stringstream s;
+
+ s << "\tGOP:" << std::dec << (int32_t)pPicParams->numGopReferenceSlots << " ( ";
+
+ if (pPicParams->numGopReferenceSlots)
+ {
+ const VkImageLayout newLayout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
+
+ pictureResourcesInfo.resize(PerFrameDecodeParameters::MAX_DPB_REF_SLOTS);
+
+ deMemset(pictureResourcesInfo.data(), 0, sizeof(pictureResourcesInfo[0]) * pictureResourcesInfo.size());
+
+ m_videoFrameBuffer->GetImageResourcesByIndex(pPicParams->numGopReferenceSlots, &pPicParams->pGopReferenceImagesIndexes[0], pPicParams->pictureResources, pictureResourcesInfo.data(), newLayout);
+
+ for (int32_t resId = 0; resId < pPicParams->numGopReferenceSlots; resId++)
+ {
+ s << std::dec << (int32_t)pPicParams->pGopReferenceImagesIndexes[resId] << ":" << pictureResourcesInfo[resId].image << " ";
+
+ // slotLayer requires NVIDIA specific extension VK_KHR_video_layers, not enabled, just yet.
+ // pGopReferenceSlots[resId].slotLayerIndex = 0;
+ // pictureResourcesInfo[resId].image can be a DE_NULL handle if the picture is not-existent.
+ if (pictureResourcesInfo[resId].image != DE_NULL && pictureResourcesInfo[resId].currentImageLayout != newLayout)
+ {
+ VkImageMemoryBarrier2KHR& imageBarrier = incSizeSafe(imageBarriers);
+
+ imageBarrier = dpbBarrierTemplate;
+ imageBarrier.oldLayout = pictureResourcesInfo[resId].currentImageLayout;
+ imageBarrier.newLayout = newLayout;
+ imageBarrier.image = pictureResourcesInfo[resId].image;
+
+ DEBUGLOG(std::cout << "\tTransit DPB: " << imageBarrier.image << " from " << imageBarrier.oldLayout << std::endl);
+
+ pictureResourcesInfo[resId].currentImageLayout = imageBarrier.newLayout;
+
+ DE_ASSERT(imageBarrier.image != DE_NULL);
+ }
+ }
+ }
+
+ DEBUGLOG(std::cout << s.str() << ")" << std::endl);
+
+ if (pDecodePictureInfo->flags.unpairedField)
+ pDecodePictureInfo->flags.syncFirstReady = true;
+
+ pDecodePictureInfo->flags.syncToFirstField = false;
+
+ frameSynchronizationInfo.hasFrameCompleteSignalFence = true;
+ frameSynchronizationInfo.hasFrameCompleteSignalSemaphore = true;
+
+ int32_t retVal = m_videoFrameBuffer->QueuePictureForDecode((int8_t)currPicIdx, pDecodePictureInfo, pPicParams->pCurrentPictureParameters->m_vkObjectOwner, &frameSynchronizationInfo);
+
+ if (currPicIdx != retVal)
+ DE_ASSERT(0 && "QueuePictureForDecode has failed");
+
+ frameCompleteFence = frameSynchronizationInfo.frameCompleteFence;
+ }
+
+ recordOrderIndices.reserve(ndxMax);
+ for (size_t ndx = 0; ndx < ndxMax; ++ndx)
+ recordOrderIndices.push_back(ndx);
+
+ if (m_randomOrSwapped)
+ {
+ if (ndxMax == 2)
+ {
+ std::swap(recordOrderIndices[0], recordOrderIndices[1]);
+ }
+ else
+ {
+ de::Random rnd(0);
+
+ DE_ASSERT(recordOrderIndices.size() % m_gopSize == 0);
+
+ for (vector<size_t>::iterator it = recordOrderIndices.begin();
+ it != recordOrderIndices.end();
+ it += m_gopSize)
+ {
+ rnd.shuffle(it, it + m_gopSize);
+ }
+ }
+ }
+
+ for (size_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ const size_t picNdx = recordOrderIndices[ndx];
+ PerFrameDecodeParameters* pPicParams = m_pPerFrameDecodeParameters[picNdx];
+ vector<VkImageMemoryBarrier2KHR>& imageBarriers = m_imageBarriersVec[picNdx];
+ VideoFrameBuffer::FrameSynchronizationInfo& frameSynchronizationInfo = m_frameSynchronizationInfos[picNdx];
+ NvVkDecodeFrameData*& pFrameData = m_pFrameDatas[picNdx];
+ VkBufferMemoryBarrier2KHR& bitstreamBufferMemoryBarrier = m_bitstreamBufferMemoryBarriers[picNdx];
+ VkVideoBeginCodingInfoKHR& decodeBeginInfo = m_decodeBeginInfos[picNdx];
+ VkDependencyInfoKHR& dependencyInfo = m_dependencyInfos[picNdx];
+ VkVideoEndCodingInfoKHR& decodeEndInfo = m_decodeEndInfos[picNdx];
+ VkCommandBufferSubmitInfoKHR& commandBufferSubmitInfo = m_commandBufferSubmitInfos[picNdx];
+ VkCommandBuffer& commandBuffer = commandBufferSubmitInfo.commandBuffer;
+ const VkVideoCodingControlInfoKHR videoCodingControlInfoKHR =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR, // VkVideoCodingControlFlagsKHR flags;
+ };
+
+ commandBufferSubmitInfo =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ pFrameData->commandBuffer.get(), // VkCommandBuffer commandBuffer;
+ 0u, // uint32_t deviceMask;
+ };
+
+ // Effectively its done above
+ commandBuffer = pFrameData->commandBuffer.get();
+
+ DEBUGLOG(std::cout << "PicNdx: " << std::dec << picNdx << " commandBuffer:" << commandBuffer << std::endl);
+
+ DE_ASSERT(pPicParams->pCurrentPictureParameters->m_vkObjectOwner);
+ const NvidiaParserVideoPictureParameters* pOwnerPictureParameters = NvidiaParserVideoPictureParameters::VideoPictureParametersFromBase(pPicParams->pCurrentPictureParameters->m_vkObjectOwner);
+ DE_ASSERT(pOwnerPictureParameters);
+ //DE_ASSERT(pOwnerPictureParameters->GetId() <= m_currentPictureParameters->GetId());
+
+ bool isSps = false;
+ int32_t spsId = pPicParams->pCurrentPictureParameters->GetSpsId(isSps);
+ DE_ASSERT(!isSps);
+ DE_ASSERT(spsId >= 0);
+ DE_ASSERT(pOwnerPictureParameters->HasSpsId(spsId));
+ DE_UNREF(spsId);
+
+ bool isPps = false;
+ int32_t ppsId = pPicParams->pCurrentPictureParameters->GetPpsId(isPps);
+ DE_ASSERT(isPps);
+ DE_ASSERT(ppsId >= 0);
+ DE_ASSERT(pOwnerPictureParameters->HasPpsId(ppsId));
+ DE_UNREF(ppsId);
+
+ beginCommandBuffer(vkd, commandBuffer);
+
+ DEBUGLOG(std::cout << "beginCommandBuffer " << commandBuffer << " VkVideoSessionParametersKHR:" << pOwnerPictureParameters->GetVideoSessionParametersKHR() << std::endl);
+
+ const uint32_t referenceSlotCount = pPicParams->decodeFrameInfo.referenceSlotCount;
+
+ decodeBeginInfo =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkVideoBeginCodingFlagsKHR flags;
+ m_videoDecodeSession.get(), // VkVideoSessionKHR videoSession;
+ pOwnerPictureParameters->GetVideoSessionParametersKHR(), // VkVideoSessionParametersKHR videoSessionParameters;
+ referenceSlotCount, // uint32_t referenceSlotCount;
+ pPicParams->decodeFrameInfo.pReferenceSlots, // const VkVideoReferenceSlotInfoKHR* pReferenceSlots;
+ };
+ dependencyInfo =
+ {
+ VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_DEPENDENCY_BY_REGION_BIT, // VkDependencyFlags dependencyFlags;
+ 0, // deUint32 memoryBarrierCount;
+ DE_NULL, // const VkMemoryBarrier2KHR* pMemoryBarriers;
+ 1, // deUint32 bufferMemoryBarrierCount;
+ &bitstreamBufferMemoryBarrier, // const VkBufferMemoryBarrier2KHR* pBufferMemoryBarriers;
+ (uint32_t)imageBarriers.size(), // deUint32 imageMemoryBarrierCount;
+ dataOrNullPtr(imageBarriers), // const VkImageMemoryBarrier2KHR* pImageMemoryBarriers;
+ };
+ decodeEndInfo =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkVideoEndCodingFlagsKHR flags;
+ };
+
+ if (m_queryResultWithStatus)
+ vkd.cmdResetQueryPool(commandBuffer, frameSynchronizationInfo.queryPool, frameSynchronizationInfo.startQueryId, frameSynchronizationInfo.numQueries);
+
+ vkd.cmdBeginVideoCodingKHR(commandBuffer, &decodeBeginInfo);
+
+ if (picNdx == 0)
+ vkd.cmdControlVideoCodingKHR(commandBuffer, &videoCodingControlInfoKHR);
+
+ vkd.cmdPipelineBarrier2(commandBuffer, &dependencyInfo);
+
+ if (m_queryResultWithStatus)
+ vkd.cmdBeginQuery(commandBuffer, frameSynchronizationInfo.queryPool, frameSynchronizationInfo.startQueryId, 0u);
+
+ vkd.cmdDecodeVideoKHR(commandBuffer, &pPicParams->decodeFrameInfo);
+
+ stringstream s;
+
+ s << "Slots: " << (int32_t)pPicParams->decodeFrameInfo.referenceSlotCount << ": ( ";
+ for (uint32_t i = 0; i < pPicParams->decodeFrameInfo.referenceSlotCount; i++)
+ s << std::dec << (int32_t)pPicParams->decodeFrameInfo.pReferenceSlots[i].slotIndex << " ";
+
+ DEBUGLOG(std::cout << s.str() << ")" << std::endl);
+
+ if (m_queryResultWithStatus)
+ vkd.cmdEndQuery(commandBuffer, frameSynchronizationInfo.queryPool, frameSynchronizationInfo.startQueryId);
+
+ vkd.cmdEndVideoCodingKHR(commandBuffer, &decodeEndInfo);
+
+ endCommandBuffer(vkd, commandBuffer);
+
+ DEBUGLOG(std::cout << "endCommandBuffer " << commandBuffer << std::endl);
+
+ if (!m_submitAfter)
+ SubmitQueue(&commandBufferSubmitInfo, &m_submitInfos[picNdx], &m_frameSynchronizationInfos[picNdx], &m_frameConsumerDoneSemaphoreSubmitInfos[picNdx], &m_frameCompleteSemaphoreSubmitInfos[picNdx]);
+ }
+
+ if (m_submitAfter && !interleaved)
+ {
+ for (size_t ndx = 0; ndx < recordOrderIndices.size(); ++ndx)
+ SubmitQueue(&m_commandBufferSubmitInfos[ndx], &m_submitInfos[ndx], &m_frameSynchronizationInfos[ndx], &m_frameConsumerDoneSemaphoreSubmitInfos[ndx], &m_frameCompleteSemaphoreSubmitInfos[ndx]);
+ }
+
+ m_frameConsumerDoneSemaphoreSubmitInfos.clear();
+ m_frameCompleteSemaphoreSubmitInfos.clear();
+
+ if (interleaved)
+ {
+ for (uint32_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ if (m_frameSynchronizationInfos[ndx].frameConsumerDoneFence != DE_NULL)
+ m_frameConsumerDoneFences.push_back(m_frameSynchronizationInfos[ndx].frameConsumerDoneFence);
+
+ if (m_frameSynchronizationInfos[ndx].frameCompleteSemaphore != DE_NULL)
+ m_frameCompleteSemaphoreSubmitInfos.push_back(makeSemaphoreSubmitInfo(m_frameSynchronizationInfos[ndx].frameCompleteSemaphore, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR));
+
+ if (m_frameSynchronizationInfos[ndx].frameConsumerDoneSemaphore != DE_NULL)
+ m_frameConsumerDoneSemaphoreSubmitInfos.push_back(makeSemaphoreSubmitInfo(m_frameSynchronizationInfos[ndx].frameConsumerDoneSemaphore, VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR));
+ }
+
+ if (friendDecoder != DE_NULL)
+ {
+ friendDecoder->DecodeCachedPictures(DE_NULL, false);
+
+ for (uint32_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ if (friendDecoder->m_frameSynchronizationInfos[ndx].frameConsumerDoneFence != DE_NULL)
+ m_frameConsumerDoneFences.push_back(friendDecoder->m_frameSynchronizationInfos[ndx].frameConsumerDoneFence);
+
+ if (friendDecoder->m_frameSynchronizationInfos[ndx].frameCompleteSemaphore != DE_NULL)
+ m_frameCompleteSemaphoreSubmitInfos.push_back(makeSemaphoreSubmitInfo(friendDecoder->m_frameSynchronizationInfos[ndx].frameCompleteSemaphore, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR));
+
+ if (friendDecoder->m_frameSynchronizationInfos[ndx].frameConsumerDoneSemaphore != DE_NULL)
+ m_frameConsumerDoneSemaphoreSubmitInfos.push_back(makeSemaphoreSubmitInfo(friendDecoder->m_frameSynchronizationInfos[ndx].frameConsumerDoneSemaphore, VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR));
+ }
+ }
+
+ if (waitSubmitted)
+ {
+ vector<VkCommandBufferSubmitInfoKHR> commandBufferSubmitInfos;
+
+ DE_ASSERT(m_commandBufferSubmitInfos.size() == friendDecoder->m_commandBufferSubmitInfos.size());
+
+ commandBufferSubmitInfos.reserve(m_commandBufferSubmitInfos.size() + friendDecoder->m_commandBufferSubmitInfos.size());
+
+ for (uint32_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ incSizeSafe(commandBufferSubmitInfos) = m_commandBufferSubmitInfos[ndx];
+ incSizeSafe(commandBufferSubmitInfos) = friendDecoder->m_commandBufferSubmitInfos[ndx];
+ }
+
+ SubmitQueue(
+ commandBufferSubmitInfos,
+ &m_submitInfos[ndxMax - 1],
+ m_frameCompleteFences[ndxMax - 1],
+ m_frameConsumerDoneFences,
+ m_frameCompleteSemaphoreSubmitInfos,
+ m_frameConsumerDoneSemaphoreSubmitInfos);
+ }
+ }
+
+ if (waitSubmitted)
+ {
+ VK_CHECK(vkd.waitForFences(device, (uint32_t)m_frameCompleteFences.size(), m_frameCompleteFences.data(), true, ~0ull));
+
+ m_frameCompleteFences.clear();
+ m_frameConsumerDoneFences.clear();
+ m_frameCompleteSemaphoreSubmitInfos.clear();
+ m_frameConsumerDoneSemaphoreSubmitInfos.clear();
+
+ if (friendDecoder != DE_NULL)
+ friendDecoder->ReinitCaches();
+ }
+
+ if (m_queryResultWithStatus)
+ {
+ for (size_t ndx = 0; ndx < ndxMax; ++ndx)
+ {
+ struct nvVideoGetDecodeStatus
+ {
+ VkQueryResultStatusKHR decodeStatus;
+ uint32_t hwCyclesCount; // OUT: HW cycle count per frame
+ uint32_t hwStatus; // OUT: HW decode status
+ uint32_t mbsCorrectlyDecoded; // total numers of correctly decoded macroblocks
+ uint32_t mbsInError; // number of error macroblocks.
+ uint16_t instanceId; // OUT: nvdec instance id
+ uint16_t reserved1; // Reserved for future use
+ } queryResult;
+
+ VkResult result = vkd.getQueryPoolResults(device,
+ m_frameSynchronizationInfos[ndx].queryPool,
+ m_frameSynchronizationInfos[ndx].startQueryId,
+ 1,
+ sizeof(queryResult),
+ &queryResult,
+ sizeof(queryResult),
+ VK_QUERY_RESULT_WITH_STATUS_BIT_KHR | VK_QUERY_RESULT_WAIT_BIT);
+
+ if (queryResult.decodeStatus != VK_QUERY_RESULT_STATUS_COMPLETE_KHR)
+ TCU_FAIL("VK_QUERY_RESULT_STATUS_COMPLETE_KHR expected");
+
+ //TCU_FAIL("TODO: nvVideoGetDecodeStatus is not specified in spec");
+
+ DE_UNREF(result);
+ }
+ }
+
+ const int result = m_pPerFrameDecodeParameters[m_pPerFrameDecodeParameters.size() - 1]->currPicIdx;
+
+ if (waitSubmitted)
+ ReinitCaches();
+
+ return result;
+}
+
+void VideoBaseDecoder::SubmitQueue (VkCommandBufferSubmitInfoKHR* commandBufferSubmitInfo,
+ VkSubmitInfo2KHR* submitInfo,
+ VideoFrameBuffer::FrameSynchronizationInfo* frameSynchronizationInfo,
+ VkSemaphoreSubmitInfoKHR* frameConsumerDoneSemaphore,
+ VkSemaphoreSubmitInfoKHR* frameCompleteSemaphore)
+{
+ const DeviceInterface& vkd = getDeviceDriver();
+ const VkDevice device = getDevice();
+ const VkQueue queue = getQueueDecode();
+ const deUint32 waitSemaphoreCount = (frameSynchronizationInfo->frameConsumerDoneSemaphore == DE_NULL) ? 0u : 1u;
+ const deUint32 signalSemaphoreInfoCount = (frameSynchronizationInfo->frameCompleteSemaphore == DE_NULL) ? 0u : 1u;
+
+ *frameConsumerDoneSemaphore = makeSemaphoreSubmitInfo(frameSynchronizationInfo->frameConsumerDoneSemaphore, VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR);
+ *frameCompleteSemaphore = makeSemaphoreSubmitInfo(frameSynchronizationInfo->frameCompleteSemaphore, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR);
+
+ *submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkSubmitFlagsKHR flags;
+ waitSemaphoreCount, // uint32_t waitSemaphoreInfoCount;
+ frameConsumerDoneSemaphore, // const VkSemaphoreSubmitInfoKHR* pWaitSemaphoreInfos;
+ 1u, // uint32_t commandBufferInfoCount;
+ commandBufferSubmitInfo, // const VkCommandBufferSubmitInfoKHR* pCommandBufferInfos;
+ signalSemaphoreInfoCount, // uint32_t signalSemaphoreInfoCount;
+ frameCompleteSemaphore, // const VkSemaphoreSubmitInfoKHR* pSignalSemaphoreInfos;
+ };
+
+ VkResult result = VK_SUCCESS;
+
+ if ((frameSynchronizationInfo->frameConsumerDoneSemaphore == DE_NULL) && (frameSynchronizationInfo->frameConsumerDoneFence != DE_NULL))
+ VK_CHECK(vkd.waitForFences(device, 1, &frameSynchronizationInfo->frameConsumerDoneFence, true, ~0ull));
+
+ VK_CHECK(vkd.getFenceStatus(device, frameSynchronizationInfo->frameCompleteFence));
+
+ VK_CHECK(vkd.resetFences(device, 1, &frameSynchronizationInfo->frameCompleteFence));
+
+ result = vkd.getFenceStatus(device, frameSynchronizationInfo->frameCompleteFence);
+ DE_ASSERT(result == VK_NOT_READY);
+ DE_UNREF(result);
+
+ vkd.queueSubmit2(queue, 1, submitInfo, frameSynchronizationInfo->frameCompleteFence);
+}
+
+void VideoBaseDecoder::SubmitQueue (vector<VkCommandBufferSubmitInfoKHR>& commandBufferSubmitInfos,
+ VkSubmitInfo2KHR* submitInfo,
+ const VkFence frameCompleteFence,
+ const vector<VkFence>& frameConsumerDoneFence,
+ const vector<VkSemaphoreSubmitInfoKHR>& frameConsumerDoneSemaphores,
+ const vector<VkSemaphoreSubmitInfoKHR>& frameCompleteSemaphores)
+{
+ const DeviceInterface& vkd = getDeviceDriver();
+ const VkDevice device = getDevice();
+ const VkQueue queue = getQueueDecode();
+
+ for (uint32_t ndx = 0; ndx < frameConsumerDoneSemaphores.size(); ++ndx)
+ if ((frameConsumerDoneSemaphores[ndx].semaphore == DE_NULL) && (frameConsumerDoneFence[ndx] != DE_NULL))
+ VK_CHECK(vkd.waitForFences(device, 1, &frameConsumerDoneFence[ndx], true, ~0ull));
+
+ VK_CHECK(vkd.getFenceStatus(device, frameCompleteFence));
+ VK_CHECK(vkd.resetFences(device, 1, &frameCompleteFence));
+ DE_ASSERT(vkd.getFenceStatus(device, frameCompleteFence) == VK_NOT_READY);
+
+ *submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkSubmitFlagsKHR flags;
+ (deUint32)frameCompleteSemaphores.size(), // uint32_t waitSemaphoreInfoCount;
+ de::dataOrNull(frameCompleteSemaphores), // const VkSemaphoreSubmitInfoKHR* pWaitSemaphoreInfos;
+ (uint32_t)commandBufferSubmitInfos.size(), // uint32_t commandBufferInfoCount;
+ dataOrNullPtr(commandBufferSubmitInfos), // const VkCommandBufferSubmitInfoKHR* pCommandBufferInfos;
+ (deUint32)frameConsumerDoneSemaphores.size(), // uint32_t signalSemaphoreInfoCount;
+ de::dataOrNull(frameConsumerDoneSemaphores), // const VkSemaphoreSubmitInfoKHR* pSignalSemaphoreInfos;
+ };
+
+ vkd.queueSubmit2(queue, 1, submitInfo, frameCompleteFence);
+}
+
+void VideoBaseDecoder::Deinitialize ()
+{
+ if (m_device != DE_NULL)
+ {
+ const DeviceInterface& vkd = getDeviceDriver();
+ const VkDevice device = getDevice();
+ const VkQueue queueDecode = getQueueDecode();
+ const VkQueue queueTransfer = getQueueTransfer();
+
+ if (queueDecode)
+ {
+ vkd.queueWaitIdle(queueDecode);
+ }
+
+ if (queueTransfer)
+ {
+ vkd.queueWaitIdle(queueTransfer);
+ }
+
+ if (device)
+ {
+ vkd.deviceWaitIdle(device);
+ }
+ }
+
+ m_dpb.Deinit();
+
+ if (m_videoFrameBuffer)
+ {
+ m_videoFrameBuffer = MovePtr<VideoFrameBuffer>();
+ }
+
+ if (m_decodeFramesData && m_videoCommandPool)
+ {
+ for (size_t decodeFrameId = 0; decodeFrameId < m_maxDecodeFramesCount; decodeFrameId++)
+ m_decodeFramesData[decodeFrameId].commandBuffer = Move<VkCommandBuffer>();
+
+ m_videoCommandPool = Move<VkCommandPool>();
+ }
+
+ if (m_decodeFramesData)
+ {
+ for (size_t decodeFrameId = 0; decodeFrameId < m_maxDecodeFramesCount; decodeFrameId++)
+ {
+ m_decodeFramesData[decodeFrameId].bitstreamBuffer.DestroyVideoBitstreamBuffer();
+ }
+
+ delete[] m_decodeFramesData;
+
+ m_decodeFramesData = DE_NULL;
+ }
+
+}
+
+int32_t NvidiaParserVideoPictureParameters::m_currentId = 0;
+
+int32_t NvidiaParserVideoPictureParameters::PopulateH264UpdateFields (const StdVideoPictureParametersSet* pStdPictureParametersSet,
+ vk::VkVideoDecodeH264SessionParametersAddInfoKHR& h264SessionParametersAddInfo)
+{
+ if (pStdPictureParametersSet == DE_NULL)
+ return -1;
+
+ DE_ASSERT((pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_SPS) || (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_PPS));
+ DE_ASSERT(h264SessionParametersAddInfo.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR);
+
+ if (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_SPS)
+ {
+ h264SessionParametersAddInfo.stdSPSCount = 1;
+ h264SessionParametersAddInfo.pStdSPSs = &pStdPictureParametersSet->m_data.h264Sps.stdSps;
+ return pStdPictureParametersSet->m_data.h264Sps.stdSps.seq_parameter_set_id;
+ }
+ else if (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H264_PPS)
+ {
+ h264SessionParametersAddInfo.stdPPSCount = 1;
+ h264SessionParametersAddInfo.pStdPPSs = &pStdPictureParametersSet->m_data.h264Pps.stdPps;
+ return pStdPictureParametersSet->m_data.h264Pps.stdPps.pic_parameter_set_id;
+ }
+ else
+ {
+ TCU_THROW(InternalError, "Incorrect h.264 type");
+ }
+}
+
+int32_t NvidiaParserVideoPictureParameters::PopulateH265UpdateFields (const StdVideoPictureParametersSet* pStdPictureParametersSet,
+ vk::VkVideoDecodeH265SessionParametersAddInfoKHR& h265SessionParametersAddInfo)
+{
+ if (pStdPictureParametersSet == DE_NULL)
+ return -1;
+
+ DE_ASSERT((pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_SPS) || (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_PPS)
+ || (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_VPS));
+ DE_ASSERT(h265SessionParametersAddInfo.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR);
+
+ if (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_SPS)
+ {
+ h265SessionParametersAddInfo.stdSPSCount = 1;
+ h265SessionParametersAddInfo.pStdSPSs = &pStdPictureParametersSet->m_data.h265Sps.stdSps;
+ return pStdPictureParametersSet->m_data.h265Sps.stdSps.sps_seq_parameter_set_id;
+ }
+ else if (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_PPS)
+ {
+ h265SessionParametersAddInfo.stdPPSCount = 1;
+ h265SessionParametersAddInfo.pStdPPSs = &pStdPictureParametersSet->m_data.h265Pps.stdPps;
+ return pStdPictureParametersSet->m_data.h265Pps.stdPps.pps_seq_parameter_set_id;
+ }
+ else if (pStdPictureParametersSet->m_updateType == VK_PICTURE_PARAMETERS_UPDATE_H265_VPS)
+ {
+ // Vulkan Video Decode APIs do not support VPS parameters
+ return -1;
+ }
+ else
+ {
+ TCU_THROW(InternalError, "Incorrect h.265 type");
+ }
+}
+
+NvidiaParserVideoPictureParameters* NvidiaParserVideoPictureParameters::Create (const DeviceInterface& vkd,
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ const StdVideoPictureParametersSet* pSpsStdPictureParametersSet,
+ const StdVideoPictureParametersSet* pPpsStdPictureParametersSet,
+ NvidiaParserVideoPictureParameters* pTemplate)
+{
+ int32_t currentSpsId = -1;
+ int32_t currentPpsId = -1;
+ const NvidiaParserVideoPictureParameters* pTemplatePictureParameters = pTemplate;
+ vk::VkVideoSessionParametersCreateInfoKHR createInfo = vk::initVulkanStructure();
+ vk::VkVideoDecodeH264SessionParametersCreateInfoKHR h264SessionParametersCreateInfo = vk::initVulkanStructure();
+ vk::VkVideoDecodeH264SessionParametersAddInfoKHR h264SessionParametersAddInfo = vk::initVulkanStructure();
+ vk::VkVideoDecodeH265SessionParametersCreateInfoKHR h265SessionParametersCreateInfo = vk::initVulkanStructure();
+ vk::VkVideoDecodeH265SessionParametersAddInfoKHR h265SessionParametersAddInfo = vk::initVulkanStructure();
+ NvidiaParserPictureParametersUpdateType updateType = pSpsStdPictureParametersSet
+ ? pSpsStdPictureParametersSet->m_updateType
+ : pPpsStdPictureParametersSet->m_updateType;
+ NvidiaParserVideoPictureParameters* pPictureParameters = new NvidiaParserVideoPictureParameters(device);
+
+ if (pPictureParameters == DE_NULL)
+ return DE_NULL;
+
+ switch (updateType)
+ {
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_PPS:
+ {
+ createInfo.pNext = &h264SessionParametersCreateInfo;
+ // TODO maxStdVPSCount ?
+ h264SessionParametersCreateInfo.maxStdSPSCount = MAX_SPS_IDS;
+ h264SessionParametersCreateInfo.maxStdPPSCount = MAX_PPS_IDS;
+ h264SessionParametersCreateInfo.pParametersAddInfo = &h264SessionParametersAddInfo;
+
+ currentSpsId = PopulateH264UpdateFields(pSpsStdPictureParametersSet, h264SessionParametersAddInfo);
+ currentPpsId = PopulateH264UpdateFields(pPpsStdPictureParametersSet, h264SessionParametersAddInfo);
+
+ break;
+ }
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_PPS:
+ {
+ createInfo.pNext = &h265SessionParametersCreateInfo;
+
+ h265SessionParametersCreateInfo.maxStdSPSCount = MAX_SPS_IDS;
+ h265SessionParametersCreateInfo.maxStdPPSCount = MAX_PPS_IDS;
+ h265SessionParametersCreateInfo.pParametersAddInfo = &h265SessionParametersAddInfo;
+
+ currentSpsId = PopulateH265UpdateFields(pSpsStdPictureParametersSet, h265SessionParametersAddInfo);
+ currentPpsId = PopulateH265UpdateFields(pPpsStdPictureParametersSet, h265SessionParametersAddInfo);
+
+ break;
+ }
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_VPS:
+ {
+ // Vulkan Video Decode APIs do not support VPS parameters
+ return DE_NULL;
+ }
+ default:
+ TCU_THROW(InternalError, "Invalid Parser format");
+ }
+
+ createInfo.videoSessionParametersTemplate = pTemplatePictureParameters != DE_NULL
+ ? pTemplatePictureParameters->GetVideoSessionParametersKHR()
+ : VkVideoSessionParametersKHR(DE_NULL);
+ createInfo.videoSession = videoSession;
+
+ pPictureParameters->m_sessionParameters = createVideoSessionParametersKHR(vkd, device, &createInfo);
+
+ DEBUGLOG(cout << "VkVideoSessionParametersKHR:" << pPictureParameters->m_sessionParameters.get() << endl);
+
+ if (pTemplatePictureParameters)
+ {
+ pPictureParameters->m_spsIdsUsed = pTemplatePictureParameters->m_spsIdsUsed;
+ pPictureParameters->m_ppsIdsUsed = pTemplatePictureParameters->m_ppsIdsUsed;
+ }
+
+ DE_ASSERT((currentSpsId != -1) || (currentPpsId != -1));
+
+ if (currentSpsId != -1)
+ {
+ pPictureParameters->m_spsIdsUsed.set(currentSpsId, true);
+ }
+
+ if (currentPpsId != -1)
+ {
+ pPictureParameters->m_ppsIdsUsed.set(currentPpsId, true);
+ }
+
+ pPictureParameters->m_Id = ++m_currentId;
+
+ return pPictureParameters;
+}
+
+VkResult NvidiaParserVideoPictureParameters::Update (const DeviceInterface& vkd,
+ const StdVideoPictureParametersSet* pSpsStdPictureParametersSet,
+ const StdVideoPictureParametersSet* pPpsStdPictureParametersSet)
+{
+ int32_t currentSpsId = -1;
+ int32_t currentPpsId = -1;
+
+ VkVideoSessionParametersUpdateInfoKHR updateInfo = vk::initVulkanStructure();
+ VkVideoDecodeH264SessionParametersAddInfoKHR h264SessionParametersAddInfo = vk::initVulkanStructure();
+ VkVideoDecodeH265SessionParametersAddInfoKHR h265SessionParametersAddInfo = vk::initVulkanStructure();
+ NvidiaParserPictureParametersUpdateType updateType = pSpsStdPictureParametersSet
+ ? pSpsStdPictureParametersSet->m_updateType
+ : pPpsStdPictureParametersSet->m_updateType;
+
+ switch (updateType)
+ {
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H264_PPS:
+ {
+
+ updateInfo.pNext = &h264SessionParametersAddInfo;
+
+ currentSpsId = PopulateH264UpdateFields(pSpsStdPictureParametersSet, h264SessionParametersAddInfo);
+ currentPpsId = PopulateH264UpdateFields(pPpsStdPictureParametersSet, h264SessionParametersAddInfo);
+
+ break;
+ }
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_VPS:
+ {
+ // Vulkan Video Decode APIs do not support VPS parameters
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_SPS:
+ case VK_PICTURE_PARAMETERS_UPDATE_H265_PPS:
+ {
+
+ updateInfo.pNext = &h265SessionParametersAddInfo;
+
+ currentSpsId = PopulateH265UpdateFields(pSpsStdPictureParametersSet, h265SessionParametersAddInfo);
+ currentPpsId = PopulateH265UpdateFields(pPpsStdPictureParametersSet, h265SessionParametersAddInfo);
+
+ break;
+ }
+ default:
+ TCU_THROW(InternalError, "Invalid Parser format");
+ }
+
+ if (pSpsStdPictureParametersSet)
+ {
+ updateInfo.updateSequenceCount = std::max(pSpsStdPictureParametersSet->m_updateSequenceCount, updateInfo.updateSequenceCount);
+ }
+
+ if (pPpsStdPictureParametersSet)
+ {
+ updateInfo.updateSequenceCount = std::max(pPpsStdPictureParametersSet->m_updateSequenceCount, updateInfo.updateSequenceCount);
+ }
+
+ vk::VkResult result = vkd.updateVideoSessionParametersKHR(m_device, *m_sessionParameters, &updateInfo);
+
+ if (result == VK_SUCCESS)
+ {
+ DE_ASSERT((currentSpsId != -1) || (currentPpsId != -1));
+
+ if (currentSpsId != -1)
+ {
+ m_spsIdsUsed.set(currentSpsId, true);
+ }
+
+ if (currentPpsId != -1)
+ {
+ m_ppsIdsUsed.set(currentPpsId, true);
+ }
+ }
+ else
+ {
+ TCU_THROW(InternalError, "Could not update Session Parameters Object");
+ }
+
+ return result;
+}
+
+int32_t NvidiaParserVideoPictureParameters::AddRef ()
+{
+ return ++m_refCount;
+}
+
+int32_t NvidiaParserVideoPictureParameters::Release ()
+{
+ uint32_t ret = --m_refCount;
+
+ if (ret == 0)
+ {
+ delete this;
+ }
+
+ return ret;
+}
+
+ImageObject::ImageObject ()
+ : m_imageFormat (VK_FORMAT_UNDEFINED)
+ , m_imageExtent ()
+ , m_image (DE_NULL)
+ , m_imageView ()
+ , m_imageArrayLayers (0)
+{
+}
+
+ImageObject::~ImageObject ()
+{
+ DestroyImage();
+}
+
+void ImageObject::DestroyImage ()
+{
+ m_image = de::MovePtr<ImageWithMemory>(DE_NULL);
+ m_imageView = Move<VkImageView>();
+ m_imageFormat = VK_FORMAT_UNDEFINED;
+ m_imageExtent = makeExtent2D(0,0);
+ m_imageArrayLayers = 0;
+}
+
+VkResult ImageObject::CreateImage (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ const VkImageCreateInfo* pImageCreateInfo,
+ const MemoryRequirement memoryRequirement)
+{
+ DestroyImage();
+
+ m_imageFormat = pImageCreateInfo->format;
+ m_imageExtent = makeExtent2D(pImageCreateInfo->extent.width, pImageCreateInfo->extent.height);
+ m_image = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, *pImageCreateInfo, memoryRequirement));
+ m_imageArrayLayers = pImageCreateInfo->arrayLayers;
+
+ DE_ASSERT(m_imageArrayLayers != 0);
+
+ VkResult status = StageImage(vkd, device, pImageCreateInfo->usage, memoryRequirement, queueFamilyIndex);
+
+ if (VK_SUCCESS != status)
+ {
+ return status;
+ }
+
+ const VkImageViewCreateInfo imageViewCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkImageViewCreateFlags flags;
+ m_image->get(), // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ m_imageFormat, // VkFormat format;
+ makeComponentMappingIdentity(), // VkComponentMapping components;
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, m_imageArrayLayers }, // VkImageSubresourceRange subresourceRange;
+ };
+
+ m_imageView = createImageView(vkd, device, &imageViewCreateInfo);
+
+ return VK_SUCCESS;
+}
+
+VkResult ImageObject::StageImage (const DeviceInterface& vkd,
+ VkDevice device,
+ VkImageUsageFlags usage,
+ const MemoryRequirement memoryRequirement,
+ uint32_t queueFamilyIndex)
+{
+ if (usage == 0 && memoryRequirement == MemoryRequirement::Any)
+ {
+ return VK_ERROR_FORMAT_NOT_SUPPORTED;
+ }
+
+ Move<VkCommandPool> cmdPool = createCommandPool(vkd, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex);
+ Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const VkQueue queue = getDeviceQueue(vkd, device, queueFamilyIndex, 0u);
+ const VkImageLayout layout = (usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR) ? VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR
+ : (usage & VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR) ? VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR
+ : VK_IMAGE_LAYOUT_UNDEFINED;
+
+ DE_ASSERT(layout != VK_IMAGE_LAYOUT_UNDEFINED);
+
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
+
+ setImageLayout(vkd, *cmdBuffer, m_image->get(), VK_IMAGE_LAYOUT_UNDEFINED, layout, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR);
+
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, *cmdBuffer);
+
+ return VK_SUCCESS;
+}
+
+VkFormat ImageObject::getFormat (void) const
+{
+ return m_imageFormat;
+}
+
+VkExtent2D ImageObject::getExtent (void) const
+{
+ return m_imageExtent;
+}
+
+VkImage ImageObject::getImage (void) const
+{
+ return m_image->get();
+}
+
+VkImageView ImageObject::getView (void) const
+{
+ return m_imageView.get();
+}
+
+bool ImageObject::isArray (void) const
+{
+ return m_imageArrayLayers > 1;
+}
+
+bool ImageObject::isImageExist (void) const
+{
+ return (m_image != DE_NULL) && (m_image->get() != DE_NULL);
+}
+
+
+NvidiaPerFrameDecodeImage::NvidiaPerFrameDecodeImage ()
+ : NvidiaVulkanPictureBase ()
+ , m_picDispInfo ()
+ , m_frameImage ()
+ , m_frameImageCurrentLayout (VK_IMAGE_LAYOUT_UNDEFINED)
+ , m_frameCompleteFence ()
+ , m_frameCompleteSemaphore ()
+ , m_frameConsumerDoneFence ()
+ , m_frameConsumerDoneSemaphore ()
+ , m_hasFrameCompleteSignalFence (false)
+ , m_hasFrameCompleteSignalSemaphore (false)
+ , m_hasConsummerSignalFence (false)
+ , m_hasConsummerSignalSemaphore (false)
+ , m_inDecodeQueue (false)
+ , m_inDisplayQueue (false)
+ , m_ownedByDisplay (false)
+ , m_dpbImage ()
+ , m_dpbImageCurrentLayout (VK_IMAGE_LAYOUT_UNDEFINED)
+{
+}
+
+void NvidiaPerFrameDecodeImage::init (const DeviceInterface& vkd,
+ VkDevice device)
+{
+ const VkFenceCreateInfo fenceFrameCompleteInfo = // The fence waited on for the first frame should be signaled.
+ {
+ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_FENCE_CREATE_SIGNALED_BIT, // VkFenceCreateFlags flags;
+ };
+ const VkFenceCreateInfo fenceInfo =
+ {
+ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkFenceCreateFlags flags;
+ };
+ const VkSemaphoreCreateInfo semInfo =
+ {
+ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0, // VkSemaphoreCreateFlags flags;
+ };
+
+ m_frameCompleteFence = createFence(vkd, device, &fenceFrameCompleteInfo);
+ m_frameConsumerDoneFence = createFence(vkd, device, &fenceInfo);
+ m_frameCompleteSemaphore = createSemaphore(vkd, device, &semInfo);
+ m_frameConsumerDoneSemaphore = createSemaphore(vkd, device, &semInfo);
+
+ Reset();
+}
+
+VkResult NvidiaPerFrameDecodeImage::CreateImage (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ const VkImageCreateInfo* pImageCreateInfo,
+ const MemoryRequirement memoryRequirement)
+{
+ VK_CHECK(m_frameImage.CreateImage(vkd, device, queueFamilyIndex, allocator, pImageCreateInfo, memoryRequirement));
+
+ m_frameImageCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+
+ return VK_SUCCESS;
+}
+
+const ImageObject* NvidiaPerFrameDecodeImage::GetImageObject (void)
+{
+ return isImageExist() ? &m_frameImage : DE_NULL;
+}
+
+bool NvidiaPerFrameDecodeImage::isImageExist (void)
+{
+ return m_frameImage.isImageExist();
+}
+
+const ImageObject* NvidiaPerFrameDecodeImage::GetDPBImageObject (void)
+{
+ return m_dpbImage.get();
+}
+
+void NvidiaPerFrameDecodeImage::deinit ()
+{
+ currentVkPictureParameters = DE_NULL;
+
+ m_frameCompleteFence = Move<VkFence>();
+ m_frameConsumerDoneFence = Move<VkFence>();
+ m_frameCompleteSemaphore = Move<VkSemaphore>();
+ m_frameConsumerDoneSemaphore = Move<VkSemaphore>();
+
+ m_frameImage.DestroyImage();
+ m_dpbImage.clear();
+
+ Reset();
+}
+
+NvidiaPerFrameDecodeImage::~NvidiaPerFrameDecodeImage ()
+{
+ deinit();
+}
+
+NvidiaPerFrameDecodeImageSet::NvidiaPerFrameDecodeImageSet ()
+ : m_size (0)
+ , m_frameDecodeImages ()
+{
+}
+
+int32_t NvidiaPerFrameDecodeImageSet::init (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ uint32_t numImages,
+ const VkImageCreateInfo* pOutImageCreateInfo,
+ const VkImageCreateInfo* pDpbImageCreateInfo,
+ MemoryRequirement memoryRequirement)
+{
+ const uint32_t firstIndex = (uint32_t)m_size;
+
+ // CTS is not designed to reinitialize images
+ DE_ASSERT(numImages > m_size);
+
+ DE_ASSERT(numImages < DE_LENGTH_OF_ARRAY(m_frameDecodeImages));
+
+ for (uint32_t imageIndex = firstIndex; imageIndex < numImages; imageIndex++)
+ {
+ DE_ASSERT(!m_frameDecodeImages[imageIndex].isImageExist());
+
+ m_frameDecodeImages[imageIndex].init(vkd, device);
+
+ VK_CHECK(m_frameDecodeImages[imageIndex].CreateImage(vkd, device, queueFamilyIndex, allocator, pOutImageCreateInfo, memoryRequirement));
+
+ DEBUGLOG(std::cout << "CreateImg: " << m_frameDecodeImages[imageIndex].m_frameImage.getImage() << " " << std::dec << pOutImageCreateInfo->extent.width << "x" << pOutImageCreateInfo->extent.height << " " << m_frameDecodeImages[imageIndex].m_frameImageCurrentLayout << std::endl);
+
+ if (pDpbImageCreateInfo != DE_NULL)
+ {
+ DE_ASSERT(pDpbImageCreateInfo->arrayLayers == 1 || pDpbImageCreateInfo->arrayLayers >= numImages - m_size);
+
+ if (pDpbImageCreateInfo->arrayLayers == 1 || imageIndex == firstIndex)
+ {
+ m_frameDecodeImages[imageIndex].m_dpbImage = de::SharedPtr<ImageObject>(new ImageObject());
+
+ VK_CHECK(m_frameDecodeImages[imageIndex].m_dpbImage->CreateImage(vkd, device, queueFamilyIndex, allocator, pDpbImageCreateInfo, memoryRequirement));
+
+ DEBUGLOG(std::cout << "CreateDPB: " << m_frameDecodeImages[imageIndex].m_dpbImage->getImage() << " " << std::dec << pOutImageCreateInfo->extent.width << "x" << pOutImageCreateInfo->extent.height << " " << m_frameDecodeImages[imageIndex].m_dpbImageCurrentLayout << std::endl);
+ }
+ else
+ {
+ m_frameDecodeImages[imageIndex].m_dpbImage = m_frameDecodeImages[firstIndex].m_dpbImage;
+ }
+ }
+ }
+
+ m_size = numImages;
+
+ return (int32_t)m_size;
+}
+
+void NvidiaPerFrameDecodeImageSet::deinit ()
+{
+ for (uint32_t ndx = 0; ndx < m_size; ndx++)
+ m_frameDecodeImages[ndx].deinit();
+
+ m_size = 0;
+}
+
+NvidiaPerFrameDecodeImageSet::~NvidiaPerFrameDecodeImageSet ()
+{
+ deinit();
+}
+
+NvidiaPerFrameDecodeImage& NvidiaPerFrameDecodeImageSet::operator[] (size_t index)
+{
+ DE_ASSERT(index < m_size);
+
+ return m_frameDecodeImages[index];
+}
+
+size_t NvidiaPerFrameDecodeImageSet::size ()
+{
+ return m_size;
+}
+
+VideoFrameBuffer::VideoFrameBuffer ()
+ : m_perFrameDecodeImageSet ()
+ , m_displayFrames ()
+ , m_queryPool ()
+ , m_ownedByDisplayMask (0)
+ , m_frameNumInDecodeOrder (0)
+ , m_frameNumInDisplayOrder (0)
+ , m_extent { 0, 0 }
+{
+}
+
+Move<VkQueryPool> VideoFrameBuffer::CreateVideoQueries (const DeviceInterface& vkd,
+ VkDevice device,
+ uint32_t numSlots,
+ const VkVideoProfileInfoKHR* pDecodeProfile)
+{
+ const VkQueryPoolCreateInfo queryPoolCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // VkStructureType sType;
+ pDecodeProfile, // const void* pNext;
+ 0, // VkQueryPoolCreateFlags flags;
+ VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR, // VkQueryType queryType;
+ numSlots, // deUint32 queryCount;
+ 0, // VkQueryPipelineStatisticFlags pipelineStatistics;
+ };
+
+ return createQueryPool(vkd, device, &queryPoolCreateInfo);
+}
+
+int32_t VideoFrameBuffer::InitImagePool (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ uint32_t numImages,
+ uint32_t maxNumImages,
+ const VkImageCreateInfo* pOutImageCreateInfo,
+ const VkImageCreateInfo* pDpbImageCreateInfo,
+ const VkVideoProfileInfoKHR* pDecodeProfile)
+{
+ if (numImages && pDecodeProfile && m_queryPool.get() == DE_NULL)
+ m_queryPool = CreateVideoQueries(vkd, device, maxNumImages, pDecodeProfile);
+
+ if (numImages && pOutImageCreateInfo)
+ {
+ m_extent = makeExtent2D(pOutImageCreateInfo->extent.width, pOutImageCreateInfo->extent.height);
+
+ return m_perFrameDecodeImageSet.init(vkd, device, queueFamilyIndex, allocator, numImages, pOutImageCreateInfo, pDpbImageCreateInfo, MemoryRequirement::Local);
+ }
+
+ return 0;
+}
+
+int32_t VideoFrameBuffer::QueueDecodedPictureForDisplay (int8_t picId, DisplayPictureInfo* pDispInfo)
+{
+ DE_ASSERT((uint32_t)picId < m_perFrameDecodeImageSet.size());
+
+ m_perFrameDecodeImageSet[picId].m_displayOrder = m_frameNumInDisplayOrder++;
+ m_perFrameDecodeImageSet[picId].m_timestamp = pDispInfo->timestamp;
+ m_perFrameDecodeImageSet[picId].m_inDisplayQueue = true;
+ m_perFrameDecodeImageSet[picId].AddRef();
+
+ m_displayFrames.push((uint8_t)picId);
+
+ return picId;
+}
+
+int32_t VideoFrameBuffer::QueuePictureForDecode (int8_t picId,
+ VulkanParserDecodePictureInfo* pDecodePictureInfo,
+ NvidiaParserVideoRefCountBase* pCurrentVkPictureParameters,
+ FrameSynchronizationInfo* pFrameSynchronizationInfo)
+{
+ DE_ASSERT((uint32_t)picId < m_perFrameDecodeImageSet.size());
+
+ m_perFrameDecodeImageSet[picId].m_picDispInfo = *pDecodePictureInfo;
+ m_perFrameDecodeImageSet[picId].m_decodeOrder = m_frameNumInDecodeOrder++;
+ m_perFrameDecodeImageSet[picId].m_inDecodeQueue = true;
+ m_perFrameDecodeImageSet[picId].currentVkPictureParameters = pCurrentVkPictureParameters;
+
+ if (pFrameSynchronizationInfo->hasFrameCompleteSignalFence)
+ {
+ pFrameSynchronizationInfo->frameCompleteFence = m_perFrameDecodeImageSet[picId].m_frameCompleteFence.get();
+
+ if (pFrameSynchronizationInfo->frameCompleteFence != DE_NULL)
+ {
+ m_perFrameDecodeImageSet[picId].m_hasFrameCompleteSignalFence = true;
+ }
+ }
+
+ if (m_perFrameDecodeImageSet[picId].m_hasConsummerSignalFence)
+ {
+ pFrameSynchronizationInfo->frameConsumerDoneFence = m_perFrameDecodeImageSet[picId].m_frameConsumerDoneFence.get();
+
+ m_perFrameDecodeImageSet[picId].m_hasConsummerSignalFence = false;
+ }
+
+ if (pFrameSynchronizationInfo->hasFrameCompleteSignalSemaphore)
+ {
+ pFrameSynchronizationInfo->frameCompleteSemaphore = m_perFrameDecodeImageSet[picId].m_frameCompleteSemaphore.get();
+
+ if (pFrameSynchronizationInfo->frameCompleteSemaphore != DE_NULL)
+ {
+ m_perFrameDecodeImageSet[picId].m_hasFrameCompleteSignalSemaphore = true;
+ }
+ }
+
+ if (m_perFrameDecodeImageSet[picId].m_hasConsummerSignalSemaphore)
+ {
+ pFrameSynchronizationInfo->frameConsumerDoneSemaphore = m_perFrameDecodeImageSet[picId].m_frameConsumerDoneSemaphore.get();
+
+ m_perFrameDecodeImageSet[picId].m_hasConsummerSignalSemaphore = false;
+ }
+
+ pFrameSynchronizationInfo->queryPool = m_queryPool.get();
+ pFrameSynchronizationInfo->startQueryId = picId;
+ pFrameSynchronizationInfo->numQueries = 1;
+
+ return picId;
+}
+
+int32_t VideoFrameBuffer::DequeueDecodedPicture (DecodedFrame* pDecodedFrame)
+{
+ int numberOfPendingFrames = 0;
+ int pictureIndex = -1;
+
+ if (!m_displayFrames.empty())
+ {
+ numberOfPendingFrames = (int)m_displayFrames.size();
+ pictureIndex = m_displayFrames.front();
+
+ DE_ASSERT((pictureIndex >= 0) && ((uint32_t)pictureIndex < m_perFrameDecodeImageSet.size()));
+ DE_ASSERT(!(m_ownedByDisplayMask & (1 << pictureIndex)));
+
+ m_ownedByDisplayMask |= (1 << pictureIndex);
+ m_displayFrames.pop();
+ m_perFrameDecodeImageSet[pictureIndex].m_inDisplayQueue = false;
+ m_perFrameDecodeImageSet[pictureIndex].m_ownedByDisplay = true;
+ }
+
+ if ((uint32_t)pictureIndex < m_perFrameDecodeImageSet.size())
+ {
+ pDecodedFrame->pictureIndex = pictureIndex;
+
+ pDecodedFrame->pDecodedImage = &m_perFrameDecodeImageSet[pictureIndex].m_frameImage;
+
+ pDecodedFrame->decodedImageLayout = m_perFrameDecodeImageSet[pictureIndex].m_frameImageCurrentLayout;
+
+ if (m_perFrameDecodeImageSet[pictureIndex].m_hasFrameCompleteSignalFence)
+ {
+ pDecodedFrame->frameCompleteFence = m_perFrameDecodeImageSet[pictureIndex].m_frameCompleteFence.get();
+
+ m_perFrameDecodeImageSet[pictureIndex].m_hasFrameCompleteSignalFence = false;
+ }
+ else
+ {
+ pDecodedFrame->frameCompleteFence = DE_NULL;
+ }
+
+ if (m_perFrameDecodeImageSet[pictureIndex].m_hasFrameCompleteSignalSemaphore)
+ {
+ pDecodedFrame->frameCompleteSemaphore = m_perFrameDecodeImageSet[pictureIndex].m_frameCompleteSemaphore.get();
+
+ m_perFrameDecodeImageSet[pictureIndex].m_hasFrameCompleteSignalSemaphore = false;
+ }
+ else
+ {
+ pDecodedFrame->frameCompleteSemaphore = DE_NULL;
+ }
+
+ pDecodedFrame->frameConsumerDoneFence = m_perFrameDecodeImageSet[pictureIndex].m_frameConsumerDoneFence.get();
+ pDecodedFrame->frameConsumerDoneSemaphore = m_perFrameDecodeImageSet[pictureIndex].m_frameConsumerDoneSemaphore.get();
+ pDecodedFrame->timestamp = m_perFrameDecodeImageSet[pictureIndex].m_timestamp;
+ pDecodedFrame->decodeOrder = m_perFrameDecodeImageSet[pictureIndex].m_decodeOrder;
+ pDecodedFrame->displayOrder = m_perFrameDecodeImageSet[pictureIndex].m_displayOrder;
+ pDecodedFrame->queryPool = m_queryPool.get();
+ pDecodedFrame->startQueryId = pictureIndex;
+ pDecodedFrame->numQueries = 1;
+ }
+
+ return numberOfPendingFrames;
+}
+
+int32_t VideoFrameBuffer::GetDisplayFramesCount (void)
+{
+ return static_cast<int32_t>(m_displayFrames.size());
+}
+
+int32_t VideoFrameBuffer::ReleaseDisplayedPicture (DecodedFrameRelease** pDecodedFramesRelease,
+ uint32_t numFramesToRelease)
+{
+ for (uint32_t i = 0; i < numFramesToRelease; i++)
+ {
+ const DecodedFrameRelease* pDecodedFrameRelease = pDecodedFramesRelease[i];
+ int picId = pDecodedFrameRelease->pictureIndex;
+
+ DE_ASSERT((picId >= 0) && ((uint32_t)picId < m_perFrameDecodeImageSet.size()));
+ DE_ASSERT(m_perFrameDecodeImageSet[picId].m_decodeOrder == pDecodedFrameRelease->decodeOrder);
+ DE_ASSERT(m_perFrameDecodeImageSet[picId].m_displayOrder == pDecodedFrameRelease->displayOrder);
+ DE_ASSERT(m_ownedByDisplayMask & (1 << picId));
+
+ m_ownedByDisplayMask &= ~(1 << picId);
+ m_perFrameDecodeImageSet[picId].m_inDecodeQueue = false;
+ m_perFrameDecodeImageSet[picId].currentVkPictureParameters = DE_NULL;
+ m_perFrameDecodeImageSet[picId].m_ownedByDisplay = false;
+ m_perFrameDecodeImageSet[picId].Release();
+
+ m_perFrameDecodeImageSet[picId].m_hasConsummerSignalFence = pDecodedFrameRelease->hasConsummerSignalFence;
+ m_perFrameDecodeImageSet[picId].m_hasConsummerSignalSemaphore = pDecodedFrameRelease->hasConsummerSignalSemaphore;
+ }
+
+ return 0;
+}
+
+void VideoFrameBuffer::GetImageResourcesByIndex (int32_t numResources,
+ const int8_t* referenceSlotIndexes,
+ VkVideoPictureResourceInfoKHR* videoPictureResources,
+ PictureResourceInfo* pictureResourcesInfos,
+ VkImageLayout newImageLayout)
+{
+ DE_ASSERT(newImageLayout == VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR || newImageLayout == VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR);
+ DE_ASSERT(pictureResourcesInfos != DE_NULL);
+
+ for (int32_t resId = 0; resId < numResources; resId++)
+ {
+ const int32_t referenceSlotIndex = referenceSlotIndexes[resId];
+ const int32_t perFrameDecodeImageSetSize = (int32_t)m_perFrameDecodeImageSet.size();
+
+ if (de::inBounds(referenceSlotIndex, 0, perFrameDecodeImageSetSize))
+ {
+ NvidiaPerFrameDecodeImage& perFrameDecodeImage = m_perFrameDecodeImageSet[referenceSlotIndex];
+ VkVideoPictureResourceInfoKHR& videoPictureResource = videoPictureResources[resId];
+ PictureResourceInfo& pictureResourcesInfo = pictureResourcesInfos[resId];
+
+ DE_ASSERT(videoPictureResource.sType == VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR);
+
+ if (newImageLayout == VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR || perFrameDecodeImage.m_dpbImage == DE_NULL)
+ {
+ videoPictureResource.codedOffset = { 0, 0 }; // FIXME: This parameter must to be adjusted based on the interlaced mode.
+ videoPictureResource.codedExtent = m_extent;
+ videoPictureResource.baseArrayLayer = 0;
+ videoPictureResource.imageViewBinding = perFrameDecodeImage.m_frameImage.getView();
+
+ pictureResourcesInfo.image = perFrameDecodeImage.m_frameImage.getImage();
+ pictureResourcesInfo.currentImageLayout = perFrameDecodeImage.m_frameImageCurrentLayout;
+
+ perFrameDecodeImage.m_frameImageCurrentLayout = newImageLayout;
+ }
+ else if (newImageLayout == VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR)
+ {
+ videoPictureResource.codedOffset = { 0, 0 }; // FIXME: This parameter must to be adjusted based on the interlaced mode.
+ videoPictureResource.codedExtent = m_extent;
+ videoPictureResource.baseArrayLayer = perFrameDecodeImage.m_dpbImage->isArray() ? referenceSlotIndex : 0;
+ videoPictureResource.imageViewBinding = perFrameDecodeImage.m_dpbImage->getView();
+
+ pictureResourcesInfo.image = perFrameDecodeImage.m_dpbImage->getImage();
+ pictureResourcesInfo.currentImageLayout = perFrameDecodeImage.m_dpbImageCurrentLayout;
+
+ perFrameDecodeImage.m_dpbImageCurrentLayout = newImageLayout;
+ }
+ else
+ DE_ASSERT(0 && "Unknown image resource requested");
+ }
+ }
+}
+
+void VideoFrameBuffer::GetImageResourcesByIndex (const int8_t referenceSlotIndex,
+ VkVideoPictureResourceInfoKHR* videoPictureResources,
+ PictureResourceInfo* pictureResourcesInfos,
+ VkImageLayout newImageLayout)
+{
+ GetImageResourcesByIndex(1, &referenceSlotIndex, videoPictureResources, pictureResourcesInfos, newImageLayout);
+}
+
+int32_t VideoFrameBuffer::SetPicNumInDecodeOrder (int32_t picId, int32_t picNumInDecodeOrder)
+{
+ if ((uint32_t)picId < m_perFrameDecodeImageSet.size())
+ {
+ int32_t oldPicNumInDecodeOrder = m_perFrameDecodeImageSet[picId].m_decodeOrder;
+
+ m_perFrameDecodeImageSet[picId].m_decodeOrder = picNumInDecodeOrder;
+
+ return oldPicNumInDecodeOrder;
+ }
+
+ TCU_THROW(InternalError, "Impossible in SetPicNumInDecodeOrder");
+}
+
+int32_t VideoFrameBuffer::SetPicNumInDisplayOrder (int32_t picId, int32_t picNumInDisplayOrder)
+{
+ if ((uint32_t)picId < m_perFrameDecodeImageSet.size())
+ {
+ int32_t oldPicNumInDisplayOrder = m_perFrameDecodeImageSet[picId].m_displayOrder;
+
+ m_perFrameDecodeImageSet[picId].m_displayOrder = picNumInDisplayOrder;
+
+ return oldPicNumInDisplayOrder;
+ }
+
+ TCU_THROW(InternalError, "Impossible in SetPicNumInDisplayOrder");
+}
+
+NvidiaVulkanPictureBase* VideoFrameBuffer::ReservePictureBuffer (void)
+{
+ for (uint32_t picId = 0; picId < m_perFrameDecodeImageSet.size(); picId++)
+ {
+ NvidiaVulkanPictureBase& perFrameDecodeImage = m_perFrameDecodeImageSet[picId];
+
+ if (perFrameDecodeImage.IsAvailable())
+ {
+ perFrameDecodeImage.Reset();
+ perFrameDecodeImage.AddRef();
+ perFrameDecodeImage.m_picIdx = picId;
+
+ DEBUGLOG(std::cout << "\tReservePictureBuffer " << picId << std::endl);
+
+ return &perFrameDecodeImage;
+ }
+ }
+
+ TCU_THROW(InternalError, "ReservePictureBuffer failed");
+}
+
+size_t VideoFrameBuffer::GetSize (void)
+{
+ return m_perFrameDecodeImageSet.size();
+}
+
+VideoFrameBuffer::~VideoFrameBuffer ()
+{
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOBASEDECODEUTILS_HPP
+#define _VKTVIDEOBASEDECODEUTILS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Decoding Base Classe Functionality
+ *//*--------------------------------------------------------------------*/
+ /*
+ * Copyright 2020 NVIDIA Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vktVideoTestUtils.hpp"
+#include "vktVideoSessionNvUtils.hpp"
+#include "vktVideoSessionFfmpegUtils.hpp"
+#include "extNvidiaVideoParserIf.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBufferWithMemory.hpp"
+
+#include <vector>
+#include <list>
+#include <bitset>
+#include <queue>
+
+namespace vkt
+{
+namespace video
+{
+
+using namespace vk;
+using namespace std;
+
+
+
+class ImageObject
+{
+public:
+ ImageObject ();
+ ~ImageObject ();
+ void DestroyImage (void);
+
+ VkResult CreateImage (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ const VkImageCreateInfo* pImageCreateInfo,
+ const MemoryRequirement memoryRequirement);
+ VkResult StageImage (const DeviceInterface& vkd,
+ VkDevice device,
+ VkImageUsageFlags usage,
+ const MemoryRequirement memoryRequirement,
+ uint32_t queueFamilyIndex);
+ VkFormat getFormat (void) const;
+ VkExtent2D getExtent (void) const;
+ VkImage getImage (void) const;
+ VkImageView getView (void) const;
+ bool isArray (void) const;
+ bool isImageExist (void) const;
+
+protected:
+ VkFormat m_imageFormat;
+ VkExtent2D m_imageExtent;
+ de::MovePtr<ImageWithMemory> m_image;
+ Move<VkImageView> m_imageView;
+ uint32_t m_imageArrayLayers;
+};
+
+struct DecodedFrame
+{
+ int32_t pictureIndex;
+ const ImageObject* pDecodedImage;
+ VkImageLayout decodedImageLayout;
+ VkFence frameCompleteFence;
+ VkFence frameConsumerDoneFence;
+ VkSemaphore frameCompleteSemaphore;
+ VkSemaphore frameConsumerDoneSemaphore;
+ VkQueryPool queryPool;
+ int32_t startQueryId;
+ uint32_t numQueries;
+ uint64_t timestamp;
+ uint32_t hasConsummerSignalFence : 1;
+ uint32_t hasConsummerSignalSemaphore : 1;
+ // For debugging
+ int32_t decodeOrder;
+ int32_t displayOrder;
+};
+
+struct DecodedFrameRelease
+{
+ int32_t pictureIndex;
+ int64_t timestamp;
+ uint32_t hasConsummerSignalFence : 1;
+ uint32_t hasConsummerSignalSemaphore : 1;
+ // For debugging
+ int32_t decodeOrder;
+ int32_t displayOrder;
+};
+
+struct DisplayPictureInfo
+{
+ int64_t timestamp; // Presentation time stamp
+};
+
+
+class NvidiaPerFrameDecodeImage : public NvidiaVulkanPictureBase
+{
+public:
+ NvidiaPerFrameDecodeImage ();
+ NvidiaPerFrameDecodeImage (const NvidiaPerFrameDecodeImage& srcObj) = delete;
+ NvidiaPerFrameDecodeImage (NvidiaPerFrameDecodeImage&& srcObj) = delete;
+ ~NvidiaPerFrameDecodeImage ();
+
+ void deinit (void);
+ void init (const DeviceInterface& vkd,
+ VkDevice device);
+
+ VkResult CreateImage (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ const VkImageCreateInfo* pImageCreateInfo,
+ const MemoryRequirement memoryRequirement);
+
+ const ImageObject* GetImageObject (void);
+ bool isImageExist (void);
+ const ImageObject* GetDPBImageObject (void);
+
+ VulkanParserDecodePictureInfo m_picDispInfo;
+ ImageObject m_frameImage;
+ VkImageLayout m_frameImageCurrentLayout;
+ Move<VkFence> m_frameCompleteFence;
+ Move<VkSemaphore> m_frameCompleteSemaphore;
+ Move<VkFence> m_frameConsumerDoneFence;
+ Move<VkSemaphore> m_frameConsumerDoneSemaphore;
+ uint32_t m_hasFrameCompleteSignalFence : 1;
+ uint32_t m_hasFrameCompleteSignalSemaphore : 1;
+ uint32_t m_hasConsummerSignalFence : 1;
+ uint32_t m_hasConsummerSignalSemaphore : 1;
+ uint32_t m_inDecodeQueue : 1;
+ uint32_t m_inDisplayQueue : 1;
+ uint32_t m_ownedByDisplay : 1;
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase> currentVkPictureParameters;
+ de::SharedPtr<ImageObject> m_dpbImage;
+ VkImageLayout m_dpbImageCurrentLayout;
+};
+
+class NvidiaPerFrameDecodeImageSet
+{
+public:
+ enum
+ {
+ MAX_FRAMEBUFFER_IMAGES = 32
+ };
+ NvidiaPerFrameDecodeImageSet ();
+ ~NvidiaPerFrameDecodeImageSet ();
+
+ int32_t init (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ uint32_t numImages,
+ const VkImageCreateInfo* pOutImageCreateInfo,
+ const VkImageCreateInfo* pDpbImageCreateInfo,
+ MemoryRequirement memoryRequirement = MemoryRequirement::Any);
+
+ void deinit (void);
+
+ NvidiaPerFrameDecodeImage& operator[] (size_t index);
+ size_t size (void);
+
+private:
+ size_t m_size;
+ NvidiaPerFrameDecodeImage m_frameDecodeImages[MAX_FRAMEBUFFER_IMAGES];
+};
+
+class VideoFrameBuffer
+{
+public:
+ // Synchronization
+ struct FrameSynchronizationInfo
+ {
+ VkFence frameCompleteFence;
+ VkSemaphore frameCompleteSemaphore;
+ VkFence frameConsumerDoneFence;
+ VkSemaphore frameConsumerDoneSemaphore;
+ VkQueryPool queryPool;
+ int32_t startQueryId;
+ uint32_t numQueries;
+ uint32_t hasFrameCompleteSignalFence : 1;
+ uint32_t hasFrameCompleteSignalSemaphore : 1;
+ };
+
+ struct PictureResourceInfo
+ {
+ VkImage image;
+ VkImageLayout currentImageLayout;
+ };
+
+ VideoFrameBuffer ();
+ virtual ~VideoFrameBuffer ();
+
+ virtual int32_t InitImagePool (const DeviceInterface& vkd,
+ VkDevice device,
+ int32_t queueFamilyIndex,
+ Allocator& allocator,
+ uint32_t numImages,
+ uint32_t maxNumImages,
+ const VkImageCreateInfo* pOutImageCreateInfo,
+ const VkImageCreateInfo* pDpbImageCreateInfo,
+ const VkVideoProfileInfoKHR* pDecodeProfile = DE_NULL);
+ virtual int32_t QueuePictureForDecode (int8_t picId,
+ VulkanParserDecodePictureInfo* pDecodePictureInfo,
+ NvidiaParserVideoRefCountBase* pCurrentVkPictureParameters,
+ FrameSynchronizationInfo* pFrameSynchronizationInfo);
+ virtual int32_t DequeueDecodedPicture (DecodedFrame* pDecodedFrame);
+ virtual int32_t GetDisplayFramesCount (void);
+ virtual int32_t ReleaseDisplayedPicture (DecodedFrameRelease** pDecodedFramesRelease,
+ uint32_t numFramesToRelease);
+ virtual void GetImageResourcesByIndex (int32_t numResources,
+ const int8_t* referenceSlotIndexes,
+ VkVideoPictureResourceInfoKHR* videoPictureResources,
+ PictureResourceInfo* pictureResourcesInfo,
+ VkImageLayout newImageLayout);
+ virtual void GetImageResourcesByIndex (const int8_t referenceSlotIndex,
+ VkVideoPictureResourceInfoKHR* videoPictureResources,
+ PictureResourceInfo* pictureResourcesInfo,
+ VkImageLayout newImageLayout);
+ virtual int32_t SetPicNumInDecodeOrder (int32_t picId,
+ int32_t picNumInDecodeOrder);
+ virtual int32_t SetPicNumInDisplayOrder (int32_t picId,
+ int32_t picNumInDisplayOrder);
+ virtual size_t GetSize (void);
+ Move<VkQueryPool> CreateVideoQueries (const DeviceInterface& vkd,
+ VkDevice device,
+ uint32_t numSlots,
+ const VkVideoProfileInfoKHR* pDecodeProfile);
+ int32_t QueueDecodedPictureForDisplay (int8_t picId,
+ DisplayPictureInfo* pDispInfo);
+ NvidiaVulkanPictureBase* ReservePictureBuffer (void);
+
+protected:
+ NvidiaPerFrameDecodeImageSet m_perFrameDecodeImageSet;
+ queue<uint8_t> m_displayFrames;
+ Move<VkQueryPool> m_queryPool;
+ uint32_t m_ownedByDisplayMask;
+ int32_t m_frameNumInDecodeOrder;
+ int32_t m_frameNumInDisplayOrder;
+ VkExtent2D m_extent;
+};
+
+struct NvidiaVideoDecodeH264DpbSlotInfo
+{
+ NvidiaVideoDecodeH264DpbSlotInfo ();
+ const VkVideoDecodeH264DpbSlotInfoKHR* Init (int32_t slotIndex);
+ bool IsReference () const;
+ operator bool () const;
+ void Invalidate ();
+
+ VkVideoDecodeH264DpbSlotInfoKHR dpbSlotInfo;
+ StdVideoDecodeH264ReferenceInfo stdReferenceInfo;
+};
+
+struct NvidiaVideoDecodeH265DpbSlotInfo
+{
+ NvidiaVideoDecodeH265DpbSlotInfo ();
+ const VkVideoDecodeH265DpbSlotInfoKHR* Init (int32_t slotIndex);
+ bool IsReference () const;
+ operator bool () const;
+ void Invalidate ();
+
+ VkVideoDecodeH265DpbSlotInfoKHR dpbSlotInfo;
+ StdVideoDecodeH265ReferenceInfo stdReferenceInfo;
+};
+
+class DpbSlot
+{
+public:
+ bool isInUse ();
+ bool isAvailable ();
+ bool Invalidate ();
+ NvidiaVulkanPictureBase* getPictureResource ();
+ NvidiaVulkanPictureBase* setPictureResource (NvidiaVulkanPictureBase* picBuf);
+ void Reserve ();
+ void MarkInUse ();
+
+private:
+ NvidiaVulkanPictureBase* m_picBuf; // Associated resource
+ bool m_reserved;
+ bool m_inUse;
+};
+
+class DpbSlots
+{
+public:
+ DpbSlots (uint32_t dpbMaxSize);
+ ~DpbSlots ();
+
+ int32_t Init (uint32_t newDpbMaxSize,
+ bool reconfigure);
+ void Deinit (void);
+ int8_t AllocateSlot (void);
+ void FreeSlot (int8_t slot);
+ DpbSlot& operator[] (uint32_t slot);
+ void MapPictureResource (NvidiaVulkanPictureBase* pPic,
+ int32_t dpbSlot);
+ uint32_t getMaxSize (void);
+ uint32_t getSlotInUseMask (void);
+
+private:
+ uint32_t m_dpbMaxSize;
+ uint32_t m_slotInUseMask;
+ vector<DpbSlot> m_dpb;
+ queue<uint8_t> m_dpbSlotsAvailable;
+};
+
+class NvidiaParserVideoPictureParameters : public NvidiaParserVideoRefCountBase
+{
+public:
+ static const uint32_t MAX_SPS_IDS = 32;
+ static const uint32_t MAX_PPS_IDS = 256;
+
+ virtual int32_t AddRef();
+ virtual int32_t Release();
+ static NvidiaParserVideoPictureParameters* VideoPictureParametersFromBase (NvidiaParserVideoRefCountBase* pBase);
+ static NvidiaParserVideoPictureParameters* Create (const DeviceInterface& vkd,
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ const StdVideoPictureParametersSet* pSpsStdPictureParametersSet,
+ const StdVideoPictureParametersSet* pPpsStdPictureParametersSet,
+ NvidiaParserVideoPictureParameters* pTemplate);
+ static int32_t PopulateH264UpdateFields (const StdVideoPictureParametersSet* pStdPictureParametersSet,
+ VkVideoDecodeH264SessionParametersAddInfoKHR& h264SessionParametersAddInfo);
+ static int32_t PopulateH265UpdateFields (const StdVideoPictureParametersSet* pStdPictureParametersSet,
+ VkVideoDecodeH265SessionParametersAddInfoKHR& h265SessionParametersAddInfo);
+ VkResult Update (const DeviceInterface& vkd,
+ const StdVideoPictureParametersSet* pSpsStdPictureParametersSet,
+ const StdVideoPictureParametersSet* pPpsStdPictureParametersSet);
+ VkVideoSessionParametersKHR GetVideoSessionParametersKHR () const;
+ int32_t GetId () const;
+ bool HasSpsId (uint32_t spsId) const;
+ bool HasPpsId (uint32_t ppsId) const;
+
+protected:
+ NvidiaParserVideoPictureParameters (VkDevice device);
+ virtual ~NvidiaParserVideoPictureParameters ();
+
+private:
+ static int32_t m_currentId;
+ int32_t m_Id;
+ atomic<int32_t> m_refCount;
+ VkDevice m_device;
+ Move<VkVideoSessionParametersKHR> m_sessionParameters;
+ bitset<MAX_SPS_IDS> m_spsIdsUsed;
+ bitset<MAX_PPS_IDS> m_ppsIdsUsed;
+};
+
+class VulkanVideoBitstreamBuffer
+{
+public:
+ VulkanVideoBitstreamBuffer ();
+ ~VulkanVideoBitstreamBuffer ();
+ VkResult CreateVideoBitstreamBuffer (const DeviceInterface& vkd,
+ VkDevice device,
+ Allocator& allocator,
+ VkDeviceSize bufferSize,
+ VkDeviceSize bufferOffsetAlignment,
+ VkDeviceSize bufferSizeAlignment,
+ void* pNext,
+ const unsigned char* pBitstreamData = DE_NULL,
+ VkDeviceSize bitstreamDataSize = 0);
+ VkResult CopyVideoBitstreamToBuffer (const DeviceInterface& vkd,
+ VkDevice device,
+ const unsigned char* pBitstreamData,
+ VkDeviceSize bitstreamDataSize);
+ void DestroyVideoBitstreamBuffer ();
+ VkDeviceSize GetBufferSize ();
+ VkDeviceSize GetBufferOffsetAlignment ();
+ const VkBuffer& get ();
+
+protected:
+ VkDeviceSize m_bufferSize;
+ VkDeviceSize m_bufferOffsetAlignment;
+ VkDeviceSize m_bufferSizeAlignment;
+ de::MovePtr<BufferWithMemory> m_buffer;
+};
+
+class NvVkDecodeFrameData
+{
+public:
+ VulkanVideoBitstreamBuffer bitstreamBuffer;
+ Move<VkCommandBuffer> commandBuffer;
+};
+
+typedef queue<NvidiaSharedBaseObj<StdVideoPictureParametersSet>> PictureParametersQueue;
+typedef NvidiaSharedBaseObj<StdVideoPictureParametersSet> LastSpsPictureParametersQueue;
+typedef NvidiaSharedBaseObj<StdVideoPictureParametersSet> LastPpsPictureParametersQueue;
+typedef NvidiaSharedBaseObj<NvidiaParserVideoPictureParameters> CurrentPictureParameters;
+
+typedef vector<de::MovePtr<vector<deUint8>>> HeapType;
+
+#define ALLOC_HEAP_OBJECT_ARRAY(H,T,N) ((T*)heap.emplace(H.end(), de::MovePtr<vector<deUint8>>(new vector<deUint8>(sizeof(T)*N)))->get()->data())
+#define ALLOC_HEAP_OBJECT(H,T) ALLOC_HEAP_OBJECT_ARRAY(H,T,1)
+
+class VideoBaseDecoder : public NvidiaVulkanParserVideoDecodeClient
+{
+public:
+ enum
+ {
+ MAX_FRM_CNT = 32,
+ };
+
+ VideoBaseDecoder (Context& context);
+ ~VideoBaseDecoder (void);
+
+ void initialize (const VkVideoCodecOperationFlagBitsKHR videoCodecOperation,
+ const DeviceInterface& vkd,
+ const VkDevice device,
+ const deUint32 queueFamilyIndexTransfer,
+ const deUint32 queueFamilyIndexDecode,
+ Allocator& allocator);
+
+ VkDevice getDevice (void);
+ const DeviceInterface& getDeviceDriver (void);
+ deUint32 getQueueFamilyIndexTransfer (void);
+ deUint32 getQueueFamilyIndexDecode (void);
+ VkQueue getQueueTransfer (void);
+ VkQueue getQueueDecode (void);
+ Allocator& getAllocator (void);
+
+ void setDecodeParameters (bool randomOrSwapped,
+ bool queryResultWithStatus,
+ uint32_t frameCountTrigger,
+ bool submitAfter = true,
+ uint32_t gopSize = 0,
+ uint32_t dpbCount = 1);
+ int32_t DecodeCachedPictures (VideoBaseDecoder* friendDecoder = DE_NULL,
+ bool waitSubmitted = true);
+
+protected:
+ // NvidiaVulkanParserVideoDecodeClient callbacks
+ virtual int32_t BeginSequence (const NvidiaVulkanParserSequenceInfo* pnvsi) override; // Returns max number of reference frames (always at least 2 for MPEG-2)
+ virtual bool AllocPictureBuffer (INvidiaVulkanPicture** ppNvidiaVulkanPicture) override; // Returns a new INvidiaVulkanPicture interface
+ virtual bool DecodePicture (NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData) override; // Called when a picture is ready to be decoded
+ virtual bool UpdatePictureParameters (NvidiaVulkanPictureParameters* pNvidiaVulkanPictureParameters,
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase>& pictureParametersObject,
+ uint64_t updateSequenceCount) override; // Called when a picture is ready to be decoded
+ virtual bool DisplayPicture (INvidiaVulkanPicture* pNvidiaVulkanPicture,
+ int64_t llPTS) override; // Called when a picture is ready to be displayed
+ virtual void UnhandledNALU (const uint8_t* pbData,
+ int32_t cbData) override; // Called for custom NAL parsing (not required)
+
+ // Parser methods
+ bool DecodePicture (NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ VulkanParserDecodePictureInfo* pDecodePictureInfo);
+ uint32_t FillDpbH264State (const NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ const NvidiaVulkanParserH264DpbEntry* dpbIn,
+ uint32_t maxDpbInSlotsInUse,
+ NvidiaVideoDecodeH264DpbSlotInfo* pDpbRefList,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ int8_t* pGopReferenceImagesIndexes,
+ StdVideoDecodeH264PictureInfoFlags currPicFlags,
+ int32_t* pCurrAllocatedSlotIndex);
+ uint32_t FillDpbH265State (const NvidiaVulkanParserPictureData* pNvidiaVulkanParserPictureData,
+ const NvidiaVulkanParserH265PictureData* pin,
+ NvidiaVideoDecodeH265DpbSlotInfo* pDpbSlotInfo,
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo,
+ VkVideoReferenceSlotInfoKHR* pReferenceSlots,
+ int8_t* pGopReferenceImagesIndexes);
+ int8_t AllocateDpbSlotForCurrentH264 (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase,
+ StdVideoDecodeH264PictureInfoFlags currPicFlags);
+ int8_t AllocateDpbSlotForCurrentH265 (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase,
+ bool isReference);
+ int8_t GetPicIdx (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase);
+ int8_t GetPicIdx (INvidiaVulkanPicture* pNvidiaVulkanPicture);
+ int8_t GetPicDpbSlot (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase);
+ int8_t GetPicDpbSlot (int8_t picIndex);
+ int8_t SetPicDpbSlot (NvidiaVulkanPictureBase* pNvidiaVulkanPictureBase,
+ int8_t dpbSlot);
+ int8_t SetPicDpbSlot (int8_t picIndex,
+ int8_t dpbSlot);
+ uint32_t ResetPicDpbSlots (uint32_t picIndexSlotValidMask);
+ bool GetFieldPicFlag (int8_t picIndex);
+ bool SetFieldPicFlag (int8_t picIndex,
+ bool fieldPicFlag);
+
+ void ReinitCaches (void);
+ void SubmitQueue (VkCommandBufferSubmitInfoKHR* commandBufferSubmitInfo,
+ VkSubmitInfo2KHR* submitInfo,
+ VideoFrameBuffer::FrameSynchronizationInfo* frameSynchronizationInfo,
+ VkSemaphoreSubmitInfoKHR* frameConsumerDoneSemaphore,
+ VkSemaphoreSubmitInfoKHR* frameCompleteSemaphore);
+
+ void SubmitQueue (vector<VkCommandBufferSubmitInfoKHR>& commandBufferSubmitInfos,
+ VkSubmitInfo2KHR* submitInfo,
+ const VkFence frameCompleteFence,
+ const vector<VkFence>& frameConsumerDoneFence,
+ const vector<VkSemaphoreSubmitInfoKHR>& frameCompleteSemaphores,
+ const vector<VkSemaphoreSubmitInfoKHR>& frameConsumerDoneSemaphores);
+
+ // Client callbacks
+ virtual int32_t StartVideoSequence (const VulkanParserDetectedVideoFormat* pVideoFormat);
+ virtual bool UpdatePictureParametersHandler (NvidiaVulkanPictureParameters* pNvidiaVulkanPictureParameters,
+ NvidiaSharedBaseObj<NvidiaParserVideoRefCountBase>& pictureParametersObject,
+ uint64_t updateSequenceCount);
+ virtual int32_t DecodePictureWithParameters (PerFrameDecodeParameters* pPicParams,
+ VulkanParserDecodePictureInfo* pDecodePictureInfo,
+ HeapType& heap);
+
+ // Client methods
+ virtual void Deinitialize (void);
+ uint32_t GetNumDecodeSurfaces (VkVideoCodecOperationFlagBitsKHR codec,
+ uint32_t minNumDecodeSurfaces,
+ uint32_t width,
+ uint32_t height);
+ bool AddPictureParametersToQueue (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& pictureParametersSet);
+ uint32_t FlushPictureParametersQueue ();
+ bool CheckStdObjectBeforeUpdate (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& stdPictureParametersSet);
+ NvidiaParserVideoPictureParameters* CheckStdObjectAfterUpdate (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& stdPictureParametersSet,
+ NvidiaParserVideoPictureParameters* pNewPictureParametersObject);
+ NvidiaParserVideoPictureParameters* AddPictureParameters (NvidiaSharedBaseObj<StdVideoPictureParametersSet>& spsStdPictureParametersSet,
+ NvidiaSharedBaseObj<StdVideoPictureParametersSet>& ppsStdPictureParametersSet);
+ NvVkDecodeFrameData* GetCurrentFrameData (uint32_t currentSlotId);
+
+public:
+ NvVkDecodeFrameData* TriggerQueue (uint32_t currentSlotId);
+ int32_t ReleaseDisplayedFrame (DecodedFrame* pDisplayedFrame);
+ VideoFrameBuffer* GetVideoFrameBuffer (void);
+ IfcNvFunctions* GetNvFuncs (void);
+ IfcFfmpegFunctions* GetIfcFfmpegFuncs (void);
+
+protected:
+ Context& m_context;
+ de::MovePtr<IfcNvFunctions> m_nvFuncs;
+ de::MovePtr<IfcFfmpegFunctions> m_ffmpegFuncs;
+ VkVideoCodecOperationFlagBitsKHR m_videoCodecOperation;
+ const DeviceInterface* m_vkd;
+ VkDevice m_device;
+ deUint32 m_queueFamilyIndexTransfer;
+ deUint32 m_queueFamilyIndexDecode;
+ VkQueue m_queueTransfer;
+ VkQueue m_queueDecode;
+ Allocator* m_allocator;
+
+ // Parser fields
+ int32_t m_nCurrentPictureID;
+ uint32_t m_dpbSlotsMask;
+ uint32_t m_fieldPicFlagMask;
+ DpbSlots m_dpb;
+ int8_t m_pictureToDpbSlotMap[MAX_FRM_CNT];
+ uint32_t m_maxNumDecodeSurfaces;
+ uint32_t m_maxNumDpbSurfaces;
+ uint64_t m_clockRate;
+ VkDeviceSize m_minBitstreamBufferSizeAlignment;
+ VkDeviceSize m_minBitstreamBufferOffsetAlignment;
+
+ // Client fields
+ Move<VkVideoSessionKHR> m_videoDecodeSession;
+ vector<AllocationPtr> m_videoDecodeSessionAllocs;
+ uint32_t m_numDecodeSurfaces;
+ Move<VkCommandPool> m_videoCommandPool;
+ de::MovePtr<VideoFrameBuffer> m_videoFrameBuffer;
+ NvVkDecodeFrameData* m_decodeFramesData;
+ uint32_t m_maxDecodeFramesCount;
+ uint32_t m_maxDecodeFramesAllocated;
+ // dimension of the output
+ uint32_t m_width;
+ uint32_t m_height;
+ uint32_t m_codedWidth;
+ uint32_t m_codedHeight;
+ // height of the mapped surface
+ VkVideoChromaSubsamplingFlagBitsKHR m_chromaFormat;
+ uint8_t m_bitLumaDepthMinus8;
+ uint8_t m_bitChromaDepthMinus8;
+ int32_t m_decodePicCount;
+ VulkanParserDetectedVideoFormat m_videoFormat;
+ int32_t m_lastSpsIdInQueue;
+ PictureParametersQueue m_pictureParametersQueue;
+ LastSpsPictureParametersQueue m_lastSpsPictureParametersQueue;
+ LastPpsPictureParametersQueue m_lastPpsPictureParametersQueue;
+ CurrentPictureParameters m_currentPictureParameters;
+
+ bool m_randomOrSwapped;
+ bool m_queryResultWithStatus;
+ int32_t m_frameCountTrigger;
+ bool m_submitAfter;
+ uint32_t m_gopSize;
+ uint32_t m_dpbCount;
+
+ vector<HeapType> m_heaps;
+
+ vector<PerFrameDecodeParameters*> m_pPerFrameDecodeParameters;
+ vector<VulkanParserDecodePictureInfo*> m_pVulkanParserDecodePictureInfo;
+ vector<NvVkDecodeFrameData*> m_pFrameDatas;
+ vector<VkBufferMemoryBarrier2KHR> m_bitstreamBufferMemoryBarriers;
+ vector<vector<VkImageMemoryBarrier2KHR>> m_imageBarriersVec;
+ vector<VideoFrameBuffer::FrameSynchronizationInfo> m_frameSynchronizationInfos;
+ vector<VkCommandBufferSubmitInfoKHR> m_commandBufferSubmitInfos;
+ vector<VkVideoBeginCodingInfoKHR> m_decodeBeginInfos;
+ vector<vector<VideoFrameBuffer::PictureResourceInfo>> m_pictureResourcesInfos;
+ vector<VkDependencyInfoKHR> m_dependencyInfos;
+ vector<VkVideoEndCodingInfoKHR> m_decodeEndInfos;
+ vector<VkSubmitInfo2KHR> m_submitInfos;
+ vector<VkFence> m_frameCompleteFences;
+ vector<VkFence> m_frameConsumerDoneFences;
+ vector<VkSemaphoreSubmitInfoKHR> m_frameCompleteSemaphoreSubmitInfos;
+ vector<VkSemaphoreSubmitInfoKHR> m_frameConsumerDoneSemaphoreSubmitInfos;
+
+ NvidiaVulkanParserSequenceInfo m_nvidiaVulkanParserSequenceInfo;
+ bool m_distinctDstDpbImages;
+};
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOBASEDECODEUTILS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding Capabilities tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoCapabilitiesTests.hpp"
+#include "vktVideoTestUtils.hpp"
+
+#include "vkDefs.hpp"
+#include "vkTypeUtil.hpp"
+
+
+#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
+#include "vktVideoBaseDecodeUtils.hpp"
+
+
+namespace vkt
+{
+namespace video
+{
+namespace
+{
+using namespace vk;
+using namespace std;
+
+enum TestType
+{
+ TEST_TYPE_QUEUE_SUPPORT_QUERY, // Test case 1
+ TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 2 iteration 1 ?
+ TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 2 iteration 2 ?
+ TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 3 iteration 1
+ TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 3 iteration 2
+ TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 4a iteration 1 ?
+ TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 4a iteration 2 ?
+ TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 4b iteration 1
+ TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY, // Test case 4b iteration 2
+ TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY, // Test case 5a
+ TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY, // Test case 5b
+ TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY, // Test case 5c
+ TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY, // Test case 5d
+ TEST_TYPE_LAST
+};
+
+struct CaseDef
+{
+ TestType testType;
+};
+
+#define VALIDATE_FIELD_EQUAL(A,B,X) if (deMemCmp(&A.X, &B.X, sizeof(A.X)) != 0) TCU_FAIL("Unequal " #A "." #X)
+
+class VideoQueueQueryTestInstance : public VideoBaseTestInstance
+{
+public:
+ VideoQueueQueryTestInstance (Context& context, const CaseDef& data);
+ ~VideoQueueQueryTestInstance (void);
+
+ tcu::TestStatus iterate (void);
+
+private:
+ CaseDef m_caseDef;
+};
+
+VideoQueueQueryTestInstance::VideoQueueQueryTestInstance (Context& context, const CaseDef& data)
+ : VideoBaseTestInstance (context)
+ , m_caseDef (data)
+{
+ DE_UNREF(m_caseDef);
+}
+
+VideoQueueQueryTestInstance::~VideoQueueQueryTestInstance (void)
+{
+}
+
+tcu::TestStatus VideoQueueQueryTestInstance::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ deUint32 queueFamilyPropertiesCount = 0u;
+ vector<VkQueueFamilyProperties2> queueFamilyProperties2;
+ vector<VkQueueFamilyVideoPropertiesKHR> videoQueueFamilyProperties2;
+ bool encodePass = false;
+ bool decodePass = false;
+
+ vk.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, DE_NULL);
+
+ if(queueFamilyPropertiesCount == 0u)
+ TCU_FAIL("Device reports an empty set of queue family properties");
+
+ queueFamilyProperties2.resize(queueFamilyPropertiesCount);
+ videoQueueFamilyProperties2.resize(queueFamilyPropertiesCount);
+
+ for (size_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ {
+ queueFamilyProperties2[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
+ queueFamilyProperties2[ndx].pNext = &videoQueueFamilyProperties2[ndx];
+ videoQueueFamilyProperties2[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
+ videoQueueFamilyProperties2[ndx].pNext = DE_NULL;
+ videoQueueFamilyProperties2[ndx].videoCodecOperations = 0;
+ }
+
+ vk.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, queueFamilyProperties2.data());
+
+ if (queueFamilyPropertiesCount != queueFamilyProperties2.size())
+ TCU_FAIL("Device returns less queue families than initially reported");
+
+ for (uint32_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ {
+ const uint32_t queueCount = queueFamilyProperties2[ndx].queueFamilyProperties.queueCount;
+ const VkQueueFlags queueFlags = queueFamilyProperties2[ndx].queueFamilyProperties.queueFlags;
+ const VkVideoCodecOperationFlagsKHR queueVideoCodecOperations = videoQueueFamilyProperties2[ndx].videoCodecOperations;
+
+ if ((queueFlags & VK_QUEUE_VIDEO_ENCODE_BIT_KHR) != 0)
+ {
+ if (!VideoDevice::isVideoEncodeOperation(queueVideoCodecOperations))
+ TCU_FAIL("Invalid codec operations for encode queue");
+
+ if (queueCount == 0)
+ TCU_FAIL("Video encode queue returned queueCount is zero");
+
+ encodePass = true;
+ }
+
+ if ((queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0)
+ {
+ if (!VideoDevice::isVideoDecodeOperation(queueVideoCodecOperations))
+ TCU_FAIL("Invalid codec operations for decode queue");
+
+ if (queueCount == 0)
+ TCU_FAIL("Video decode queue returned queueCount is zero");
+
+ decodePass = true;
+ }
+ }
+
+ if (!m_context.isDeviceFunctionalitySupported("VK_KHR_video_encode_queue"))
+ encodePass = false;
+
+ if (!m_context.isDeviceFunctionalitySupported("VK_KHR_video_decode_queue"))
+ decodePass = false;
+
+ if (encodePass || decodePass)
+ return tcu::TestStatus::pass("Pass");
+ else
+ return tcu::TestStatus::fail("Neither encode, nor decode is available");
+}
+
+template<typename ProfileOperation>
+class VideoFormatPropertiesQueryTestInstance : public VideoBaseTestInstance
+{
+public:
+ VideoFormatPropertiesQueryTestInstance (Context& context, const CaseDef& data);
+ ~VideoFormatPropertiesQueryTestInstance (void);
+ tcu::TestStatus iterate (void);
+
+private:
+ ProfileOperation getProfileOperation (void);
+
+ CaseDef m_caseDef;
+ VkVideoCodecOperationFlagsKHR m_videoCodecOperation;
+ VkImageUsageFlags m_imageUsageFlags;
+};
+
+template<typename ProfileOperation>
+VideoFormatPropertiesQueryTestInstance<ProfileOperation>::VideoFormatPropertiesQueryTestInstance (Context& context, const CaseDef& data)
+ : VideoBaseTestInstance (context)
+ , m_caseDef (data)
+{
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR; break;
+ case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT; break;
+ case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR; break;
+ case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT; break;
+ default: TCU_THROW(InternalError, "Unknown testType");
+ }
+
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR; break;
+ case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR; break;
+ case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR; break;
+ case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR; break;
+ case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR; break;
+ case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR; break;
+ case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR; break;
+ case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR; break;
+ default: TCU_THROW(InternalError, "Unknown testType");
+ }
+}
+
+template<typename ProfileOperation>
+VideoFormatPropertiesQueryTestInstance<ProfileOperation>::~VideoFormatPropertiesQueryTestInstance (void)
+{
+}
+
+template<>
+VkVideoDecodeH264ProfileInfoKHR VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH264ProfileInfoKHR>::getProfileOperation (void)
+{
+ return getProfileOperationH264D();
+}
+
+template<>
+VkVideoEncodeH264ProfileInfoEXT VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH264ProfileInfoEXT>::getProfileOperation (void)
+{
+ return getProfileOperationH264E();
+}
+
+template<>
+VkVideoDecodeH265ProfileInfoKHR VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH265ProfileInfoKHR>::getProfileOperation (void)
+{
+ return getProfileOperationH265D();
+}
+
+template<>
+VkVideoEncodeH265ProfileInfoEXT VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH265ProfileInfoEXT>::getProfileOperation (void)
+{
+ return getProfileOperationH265E();
+}
+
+template<typename ProfileOperation>
+tcu::TestStatus VideoFormatPropertiesQueryTestInstance<ProfileOperation>::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ deUint32 videoFormatPropertiesCount = 0u;
+ bool testResult = false;
+
+ const ProfileOperation videoProfileOperation = getProfileOperation();
+ const VkVideoCodecOperationFlagBitsKHR videoCodecOperation = static_cast<VkVideoCodecOperationFlagBitsKHR>(m_videoCodecOperation);
+ const VkVideoProfileInfoKHR videoProfile =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ (void*)&videoProfileOperation, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+ const VkVideoProfileListInfoKHR videoProfiles =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ 1u, // deUint32 profilesCount;
+ &videoProfile, // const VkVideoProfileInfoKHR* pProfiles;
+ };
+
+ const VkPhysicalDeviceVideoFormatInfoKHR videoFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR, // VkStructureType sType;
+ const_cast<VkVideoProfileListInfoKHR *>(&videoProfiles), // const void* pNext;
+ m_imageUsageFlags, // VkImageUsageFlags imageUsage;
+ };
+ const VkImageUsageFlags imageUsageFlagsDPB = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
+ const bool imageUsageDPB = (videoFormatInfo.imageUsage & imageUsageFlagsDPB) != 0;
+
+ {
+ const VkResult result = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, DE_NULL);
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query call to vkGetPhysicalDeviceVideoFormatPropertiesKHR with " << result;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+
+ if (videoFormatPropertiesCount == 0)
+ return tcu::TestStatus::fail("vkGetPhysicalDeviceVideoFormatPropertiesKHR reports 0 formats");
+ }
+
+ {
+ const VkVideoFormatPropertiesKHR videoFormatPropertiesKHR =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ VK_FORMAT_MAX_ENUM, // VkFormat format;
+ vk::makeComponentMappingIdentity(), // VkComponentMapping componentMapping;
+ (VkImageCreateFlags)0u, // VkImageCreateFlags imageCreateFlags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling imageTiling;
+ VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR
+ | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR, // VkImageUsageFlags imageUsageFlags;
+ };
+ std::vector<VkVideoFormatPropertiesKHR> videoFormatProperties (videoFormatPropertiesCount, videoFormatPropertiesKHR);
+
+ const VkResult result = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, videoFormatProperties.data());
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query data call to vkGetPhysicalDeviceVideoFormatPropertiesKHR with " << result;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+
+ if (videoFormatPropertiesCount == 0)
+ return tcu::TestStatus::fail("vkGetPhysicalDeviceVideoFormatPropertiesKHR reports 0 formats supported for chosen encding/decoding");
+
+ if (videoFormatPropertiesCount != videoFormatProperties.size())
+ return tcu::TestStatus::fail("Number of formats returned is less than reported.");
+
+ for (const auto& videoFormatProperty: videoFormatProperties)
+ {
+ if (videoFormatProperty.format == VK_FORMAT_MAX_ENUM)
+ return tcu::TestStatus::fail("Format is not written");
+
+ if (videoFormatProperty.format == VK_FORMAT_UNDEFINED)
+ {
+ if (!imageUsageDPB)
+ TCU_FAIL("VK_FORMAT_UNDEFINED is allowed only for DPB image usage");
+
+ if (videoFormatProperties.size() != 1)
+ TCU_FAIL("VK_FORMAT_UNDEFINED must be the only format returned for opaque DPB");
+
+ testResult = true;
+
+ break;
+ }
+
+ if (videoFormatProperty.format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM ||
+ videoFormatProperty.format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM)
+ {
+ testResult = true;
+
+ break;
+ }
+ }
+ }
+
+ if (testResult)
+ return tcu::TestStatus::pass("Pass");
+ else
+ return tcu::TestStatus::fail("Fail");
+}
+
+typedef VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH264ProfileInfoKHR> VideoFormatPropertiesQueryH264DecodeTestInstance;
+typedef VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH264ProfileInfoEXT> VideoFormatPropertiesQueryH264EncodeTestInstance;
+typedef VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH265ProfileInfoKHR> VideoFormatPropertiesQueryH265DecodeTestInstance;
+typedef VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH265ProfileInfoEXT> VideoFormatPropertiesQueryH265EncodeTestInstance;
+
+class VideoCapabilitiesQueryTestInstance : public VideoBaseTestInstance
+{
+public:
+ VideoCapabilitiesQueryTestInstance (Context& context, const CaseDef& data);
+ ~VideoCapabilitiesQueryTestInstance (void);
+
+protected:
+ void validateVideoCapabilities (const VkVideoCapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoCapabilitiesKHR& videoCapabilitiesKHRSecond);
+ void validateVideoDecodeCapabilities (const VkVideoDecodeCapabilitiesKHR& videoDecodeCapabilitiesKHR,
+ const VkVideoDecodeCapabilitiesKHR& videoDecodeCapabilitiesKHRSecond);
+ void validateVideoEncodeCapabilities (const VkVideoEncodeCapabilitiesKHR& videoEncodeCapabilitiesKHR,
+ const VkVideoEncodeCapabilitiesKHR& videoEncodeCapabilitiesKHRSecond);
+ void validateExtensionProperties (const VkExtensionProperties& extensionProperties,
+ const VkExtensionProperties& extensionPropertiesSecond);
+ CaseDef m_caseDef;
+};
+
+VideoCapabilitiesQueryTestInstance::VideoCapabilitiesQueryTestInstance (Context& context, const CaseDef& data)
+ : VideoBaseTestInstance (context)
+ , m_caseDef (data)
+{
+ DE_UNREF(m_caseDef);
+}
+
+VideoCapabilitiesQueryTestInstance::~VideoCapabilitiesQueryTestInstance (void)
+{
+}
+
+void VideoCapabilitiesQueryTestInstance::validateVideoCapabilities (const VkVideoCapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoCapabilitiesKHR& videoCapabilitiesKHRSecond)
+{
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minBitstreamBufferOffsetAlignment);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minBitstreamBufferSizeAlignment);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, pictureAccessGranularity);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minCodedExtent);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxCodedExtent);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxDpbSlots);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxActiveReferencePictures);
+ validateExtensionProperties(videoCapabilitiesKHR.stdHeaderVersion, videoCapabilitiesKHRSecond.stdHeaderVersion);
+
+ const VkVideoCapabilityFlagsKHR videoCapabilityFlagsKHR = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR
+ | VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
+
+ if ((videoCapabilitiesKHR.flags & ~videoCapabilityFlagsKHR) != 0)
+ TCU_FAIL("Undeclared videoCapabilitiesKHR.flags returned");
+
+ if (!deIsPowerOfTwo64(videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment))
+ TCU_FAIL("Expected to be Power-Of-Two: videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment");
+
+ if (!deIsPowerOfTwo64(videoCapabilitiesKHR.minBitstreamBufferSizeAlignment))
+ TCU_FAIL("Expected to be Power-Of-Two: videoCapabilitiesKHR.minBitstreamBufferSizeAlignment");
+
+ if (videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment == 0)
+ TCU_FAIL("Expected to be non zero: videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment");
+
+ if (videoCapabilitiesKHR.minBitstreamBufferSizeAlignment == 0)
+ TCU_FAIL("Expected to be non zero: videoCapabilitiesKHR.minBitstreamBufferSizeAlignment");
+
+ if (videoCapabilitiesKHR.pictureAccessGranularity.width == 0)
+ TCU_FAIL("Expected to be non-zero: videoCapabilitiesKHR.pictureAccessGranularity.width");
+
+ if (videoCapabilitiesKHR.pictureAccessGranularity.height == 0)
+ TCU_FAIL("Expected to be non-zero: videoCapabilitiesKHR.pictureAccessGranularity.height");
+
+ if (videoCapabilitiesKHR.minCodedExtent.width == 0 || videoCapabilitiesKHR.minCodedExtent.height == 0)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.minCodedExtent");
+
+ if (videoCapabilitiesKHR.maxCodedExtent.width < videoCapabilitiesKHR.minCodedExtent.width)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.maxCodedExtent.width");
+
+ if (videoCapabilitiesKHR.maxCodedExtent.height < videoCapabilitiesKHR.minCodedExtent.height)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.maxCodedExtent.height");
+
+ if (videoCapabilitiesKHR.maxDpbSlots == 0)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.maxDpbSlots");
+
+ if (videoCapabilitiesKHR.maxActiveReferencePictures == 0)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.maxActiveReferencePictures");
+}
+
+void VideoCapabilitiesQueryTestInstance::validateVideoDecodeCapabilities (const VkVideoDecodeCapabilitiesKHR& videoDecodeCapabilitiesKHR,
+ const VkVideoDecodeCapabilitiesKHR& videoDecodeCapabilitiesKHRSecond)
+{
+ const VkVideoDecodeCapabilityFlagsKHR videoDecodeCapabilitiesFlags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR
+ | VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
+
+ VALIDATE_FIELD_EQUAL(videoDecodeCapabilitiesKHR, videoDecodeCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoDecodeCapabilitiesKHR, videoDecodeCapabilitiesKHRSecond, flags);
+
+ if ((videoDecodeCapabilitiesKHR.flags & ~videoDecodeCapabilitiesFlags) != 0)
+ TCU_FAIL("Undefined videoDecodeCapabilitiesKHR.flags");
+}
+
+void VideoCapabilitiesQueryTestInstance::validateVideoEncodeCapabilities (const VkVideoEncodeCapabilitiesKHR& videoEncodeCapabilitiesKHR,
+ const VkVideoEncodeCapabilitiesKHR& videoEncodeCapabilitiesKHRSecond)
+{
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, flags);
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, rateControlModes);
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, rateControlLayerCount);
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, qualityLevelCount);
+ VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, inputImageDataFillAlignment);
+
+ const VkVideoEncodeCapabilityFlagsKHR videoEncodeCapabilityFlags = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR;
+ const VkVideoEncodeRateControlModeFlagsKHR videoEncodeRateControlModeFlags = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR
+ | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR
+ | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
+
+ if ((videoEncodeCapabilitiesKHR.flags & ~videoEncodeCapabilityFlags) != 0)
+ TCU_FAIL("Undeclared VkVideoEncodeCapabilitiesKHR.flags returned");
+
+ if ((videoEncodeCapabilitiesKHR.rateControlModes & ~videoEncodeRateControlModeFlags) != 0)
+ TCU_FAIL("Undeclared videoEncodeCapabilitiesKHR.rateControlModes returned");
+
+ if (videoEncodeCapabilitiesKHR.rateControlLayerCount == 0)
+ TCU_FAIL("videoEncodeCapabilitiesKHR.rateControlModes is zero. Implementations must report at least 1.");
+
+ if (videoEncodeCapabilitiesKHR.qualityLevelCount == 0)
+ TCU_FAIL("videoEncodeCapabilitiesKHR.qualityLevelCount is zero. Implementations must report at least 1.");
+}
+
+void VideoCapabilitiesQueryTestInstance::validateExtensionProperties (const VkExtensionProperties& extensionProperties,
+ const VkExtensionProperties& extensionPropertiesSecond)
+{
+ // FIXME: artificially change version
+ //VALIDATE_FIELD_EQUAL(extensionProperties, extensionPropertiesSecond, specVersion);
+
+ for (size_t ndx = 0; ndx < VK_MAX_EXTENSION_NAME_SIZE; ++ndx)
+ {
+ if (extensionProperties.extensionName[ndx] != extensionPropertiesSecond.extensionName[ndx])
+ TCU_FAIL("Unequal extensionProperties.extensionName");
+
+ if (extensionProperties.extensionName[ndx] == 0)
+ return;
+ }
+
+ TCU_FAIL("Non-zero terminated string extensionProperties.extensionName");
+}
+
+
+class VideoCapabilitiesQueryH264DecodeTestInstance : public VideoCapabilitiesQueryTestInstance
+{
+public:
+ VideoCapabilitiesQueryH264DecodeTestInstance (Context& context, const CaseDef& data);
+ virtual ~VideoCapabilitiesQueryH264DecodeTestInstance (void);
+ tcu::TestStatus iterate (void);
+
+protected:
+ void validateVideoCapabilitiesExt (const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHRSecond);
+};
+
+VideoCapabilitiesQueryH264DecodeTestInstance::VideoCapabilitiesQueryH264DecodeTestInstance (Context& context, const CaseDef& data)
+ : VideoCapabilitiesQueryTestInstance(context, data)
+{
+}
+
+VideoCapabilitiesQueryH264DecodeTestInstance::~VideoCapabilitiesQueryH264DecodeTestInstance (void)
+{
+}
+
+tcu::TestStatus VideoCapabilitiesQueryH264DecodeTestInstance::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkVideoCodecOperationFlagBitsKHR videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR;
+ const VkVideoDecodeH264ProfileInfoKHR videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ STD_VIDEO_H264_PROFILE_IDC_BASELINE, // StdVideoH264ProfileIdc stdProfileIdc;
+ VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR, // VkVideoDecodeH264PictureLayoutFlagsEXT pictureLayout;
+ };
+ const VkVideoProfileInfoKHR videoProfile =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ (void*)&videoProfileOperation, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+
+ VkVideoDecodeH264CapabilitiesKHR videoDecodeH264Capabilities[2];
+ VkVideoDecodeCapabilitiesKHR videoDecodeCapabilities[2];
+ VkVideoCapabilitiesKHR videoCapabilites[2];
+
+ for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
+ {
+ const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
+
+ deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
+ deMemset(&videoDecodeCapabilities[ndx], filling, sizeof(videoDecodeCapabilities[ndx]));
+ deMemset(&videoDecodeH264Capabilities[ndx], filling, sizeof(videoDecodeH264Capabilities[ndx]));
+
+ videoCapabilites[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
+ videoCapabilites[ndx].pNext = &videoDecodeCapabilities[ndx];
+ videoDecodeCapabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR;
+ videoDecodeCapabilities[ndx].pNext = &videoDecodeH264Capabilities[ndx];
+ videoDecodeH264Capabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR;
+ videoDecodeH264Capabilities[ndx].pNext = DE_NULL;
+
+ VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+ }
+
+ validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
+ validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
+ validateVideoDecodeCapabilities(videoDecodeCapabilities[0], videoDecodeCapabilities[1]);
+ validateVideoCapabilitiesExt(videoDecodeH264Capabilities[0], videoDecodeH264Capabilities[1]);
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+void VideoCapabilitiesQueryH264DecodeTestInstance::validateVideoCapabilitiesExt (const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHRSecond)
+{
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, fieldOffsetGranularity);
+}
+
+
+class VideoCapabilitiesQueryH264EncodeTestInstance : public VideoCapabilitiesQueryTestInstance
+{
+public:
+ VideoCapabilitiesQueryH264EncodeTestInstance (Context& context, const CaseDef& data);
+ virtual ~VideoCapabilitiesQueryH264EncodeTestInstance (void);
+ tcu::TestStatus iterate (void);
+
+private:
+ void validateVideoCapabilitiesExt (const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHR,
+ const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHRSecond);
+};
+
+VideoCapabilitiesQueryH264EncodeTestInstance::VideoCapabilitiesQueryH264EncodeTestInstance (Context& context, const CaseDef& data)
+ : VideoCapabilitiesQueryTestInstance(context, data)
+{
+}
+
+VideoCapabilitiesQueryH264EncodeTestInstance::~VideoCapabilitiesQueryH264EncodeTestInstance (void)
+{
+}
+
+tcu::TestStatus VideoCapabilitiesQueryH264EncodeTestInstance::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkVideoCodecOperationFlagBitsKHR videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT;
+ const VkVideoEncodeH264ProfileInfoEXT videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ STD_VIDEO_H264_PROFILE_IDC_BASELINE, // StdVideoH264ProfileIdc stdProfileIdc;
+ };
+ const VkVideoProfileInfoKHR videoProfile =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ (void*)&videoProfileOperation, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+ VkVideoEncodeH264CapabilitiesEXT videoEncodeH264Capabilities[2];
+ VkVideoEncodeCapabilitiesKHR videoEncodeCapabilities[2];
+ VkVideoCapabilitiesKHR videoCapabilites[2];
+
+ for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
+ {
+ const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
+
+ deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
+ deMemset(&videoEncodeCapabilities[ndx], filling, sizeof(videoEncodeCapabilities[ndx]));
+ deMemset(&videoEncodeH264Capabilities[ndx], filling, sizeof(videoEncodeH264Capabilities[ndx]));
+
+ videoCapabilites[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
+ videoCapabilites[ndx].pNext = &videoEncodeCapabilities[ndx];
+ videoEncodeCapabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR;
+ videoEncodeCapabilities[ndx].pNext = &videoEncodeH264Capabilities[ndx];
+ videoEncodeH264Capabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT;
+ videoEncodeH264Capabilities[ndx].pNext = DE_NULL;
+
+ VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+ }
+
+ validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
+ validateVideoEncodeCapabilities(videoEncodeCapabilities[0], videoEncodeCapabilities[1]);
+ validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
+ validateVideoCapabilitiesExt(videoEncodeH264Capabilities[0], videoEncodeH264Capabilities[1]);
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+void VideoCapabilitiesQueryH264EncodeTestInstance::validateVideoCapabilitiesExt (const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHR, const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHRSecond)
+{
+ const VkVideoEncodeH264CapabilityFlagsEXT videoCapabilityFlags = VK_VIDEO_ENCODE_H264_CAPABILITY_DIRECT_8X8_INFERENCE_ENABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DIRECT_8X8_INFERENCE_DISABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_SEPARATE_COLOUR_PLANE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_SCALING_LISTS_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_PIC_INIT_QP_MINUS26_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_PRED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BIPRED_EXPLICIT_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BIPRED_IMPLICIT_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_PRED_NO_TABLE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DISABLE_DIRECT_SPATIAL_MV_PRED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_SLICE_MB_COUNT_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_EXT;
+ const VkVideoEncodeH264CapabilityFlagsEXT videoCapabilityFlagsEntropyReq = VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT;
+ const VkVideoEncodeH264CapabilityFlagsEXT videoCapabilityFlagsDeblockReq = VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT;
+ const VkVideoEncodeH264InputModeFlagsEXT videoInputModeFlags = VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT;
+ const VkVideoEncodeH264InputModeFlagsEXT videoInputModeFlagsReq = VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT;
+ const VkVideoEncodeH264OutputModeFlagsEXT videoOutputModeFlags = VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT;
+ const VkVideoEncodeH264OutputModeFlagsEXT videoOutputModeFlagsReq = VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT;
+ const bool inputFrame = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT);
+ const bool inputSlice = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT);
+ const bool inputNonVCL = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT);
+ const bool outputFrame = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT);
+ const bool outputSlice = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT);
+ const bool outputNonVCL = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT);
+ const bool validCombination = (inputFrame && outputFrame ) // Input: Frame, Output : Frame
+ || (inputFrame && outputFrame && outputNonVCL ) // Input: Frame, Output : Frame and Non-VCL
+ || (inputFrame && outputSlice ) // Input: Frame, Output : Slice
+ || (inputFrame && outputSlice && outputNonVCL ) // Input: Frame, Output : Slice and Non-VCL
+ || (inputSlice && outputSlice ) // Input: Slice, Output : Slice
+ || (inputSlice && outputSlice && outputNonVCL ) // Input: Slice, Output : Slice and Non-VCL
+ || (inputFrame && inputNonVCL && outputFrame && outputNonVCL ) // Input: Frame and Non-VCL, Output : Frame and Non-VCL
+ || (inputFrame && inputNonVCL && outputSlice && outputNonVCL ) // Input: Frame and Non-VCL, Output : Slice and Non-VCL
+ || (inputSlice && inputNonVCL && outputSlice && outputNonVCL ); // Input: Slice and Non-VCL, Output : Slice and Non-VCL
+
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, inputModeFlags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, outputModeFlags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxPPictureL0ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBPictureL0ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxL1ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, motionVectorsOverPicBoundariesFlag);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBytesPerPicDenom);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBitsPerMbDenom);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, log2MaxMvLengthHorizontal);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, log2MaxMvLengthVertical);
+
+ if (videoCapabilitiesKHR.flags == 0)
+ TCU_FAIL("videoCapabilitiesKHR.flags must not be 0");
+
+ if ((videoCapabilitiesKHR.flags & ~videoCapabilityFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.flags");
+
+ if ((videoCapabilitiesKHR.flags & videoCapabilityFlagsEntropyReq) == 0)
+ TCU_FAIL("An implementation must support at least one entropy coding mode");
+
+ if ((videoCapabilitiesKHR.flags & videoCapabilityFlagsDeblockReq) == 0)
+ TCU_FAIL("An implementation must support at least one deblocking filter mode");
+
+ if (videoCapabilitiesKHR.inputModeFlags == 0)
+ TCU_FAIL("videoCapabilitiesKHR.inputModeFlags must not be 0");
+
+ if ((videoCapabilitiesKHR.inputModeFlags & ~videoInputModeFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.inputModeFlags");
+
+ if ((videoCapabilitiesKHR.inputModeFlags & videoInputModeFlagsReq) == 0)
+ TCU_FAIL("An implementation must support at least one of VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT or VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT");
+
+ if (videoCapabilitiesKHR.outputModeFlags == 0)
+ TCU_FAIL("videoCapabilitiesKHR.outputModeFlags must not be 0");
+
+ if ((videoCapabilitiesKHR.outputModeFlags & ~videoOutputModeFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.outputModeFlags");
+
+ if ((videoCapabilitiesKHR.outputModeFlags & videoOutputModeFlagsReq) == 0)
+ TCU_FAIL("An implementation must support at least one of VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT or VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT");
+
+ if (!validCombination)
+ TCU_FAIL("An implementation must report one of the following combinations of input/output modes (see above)");
+}
+
+
+class VideoCapabilitiesQueryH265DecodeTestInstance : public VideoCapabilitiesQueryTestInstance
+{
+public:
+ VideoCapabilitiesQueryH265DecodeTestInstance (Context& context, const CaseDef& data);
+ virtual ~VideoCapabilitiesQueryH265DecodeTestInstance (void);
+ tcu::TestStatus iterate (void);
+
+protected:
+ void validateVideoCapabilitiesExt (const VkVideoDecodeH265CapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoDecodeH265CapabilitiesKHR& videoCapabilitiesKHRSecond);
+};
+
+VideoCapabilitiesQueryH265DecodeTestInstance::VideoCapabilitiesQueryH265DecodeTestInstance (Context& context, const CaseDef& data)
+ : VideoCapabilitiesQueryTestInstance(context, data)
+{
+}
+
+VideoCapabilitiesQueryH265DecodeTestInstance::~VideoCapabilitiesQueryH265DecodeTestInstance (void)
+{
+}
+
+tcu::TestStatus VideoCapabilitiesQueryH265DecodeTestInstance::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkVideoCodecOperationFlagBitsKHR videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
+ const VkVideoDecodeH265ProfileInfoKHR videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ STD_VIDEO_H265_PROFILE_IDC_MAIN, // StdVideoH265ProfileIdc stdProfileIdc;
+ };
+ const VkVideoProfileInfoKHR videoProfile =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ (void*)&videoProfileOperation, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+ VkVideoDecodeH265CapabilitiesKHR videoDecodeH265Capabilities[2];
+ VkVideoDecodeCapabilitiesKHR videoDecodeCapabilities[2];
+ VkVideoCapabilitiesKHR videoCapabilites[2];
+
+ for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
+ {
+ const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
+
+ deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
+ deMemset(&videoDecodeCapabilities[ndx], filling, sizeof(videoDecodeCapabilities[ndx]));
+ deMemset(&videoDecodeH265Capabilities[ndx], filling, sizeof(videoDecodeH265Capabilities[ndx]));
+
+ videoCapabilites[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
+ videoCapabilites[ndx].pNext = &videoDecodeCapabilities[ndx];
+ videoDecodeCapabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR;
+ videoDecodeCapabilities[ndx].pNext = &videoDecodeH265Capabilities[ndx];
+ videoDecodeH265Capabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR;
+ videoDecodeH265Capabilities[ndx].pNext = DE_NULL;
+
+ VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+ }
+
+ validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
+ validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
+ validateVideoDecodeCapabilities(videoDecodeCapabilities[0], videoDecodeCapabilities[1]);
+ validateVideoCapabilitiesExt(videoDecodeH265Capabilities[0], videoDecodeH265Capabilities[1]);
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+void VideoCapabilitiesQueryH265DecodeTestInstance::validateVideoCapabilitiesExt (const VkVideoDecodeH265CapabilitiesKHR& videoCapabilitiesKHR,
+ const VkVideoDecodeH265CapabilitiesKHR& videoCapabilitiesKHRSecond)
+{
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
+}
+
+class VideoCapabilitiesQueryH265EncodeTestInstance : public VideoCapabilitiesQueryTestInstance
+{
+public:
+ VideoCapabilitiesQueryH265EncodeTestInstance (Context& context, const CaseDef& data);
+ virtual ~VideoCapabilitiesQueryH265EncodeTestInstance (void);
+ tcu::TestStatus iterate (void);
+
+protected:
+ void validateVideoCapabilitiesExt (const VkVideoEncodeH265CapabilitiesEXT& videoCapabilitiesKHR,
+ const VkVideoEncodeH265CapabilitiesEXT& videoCapabilitiesKHRSecond);
+};
+
+VideoCapabilitiesQueryH265EncodeTestInstance::VideoCapabilitiesQueryH265EncodeTestInstance (Context& context, const CaseDef& data)
+ : VideoCapabilitiesQueryTestInstance(context, data)
+{
+}
+
+VideoCapabilitiesQueryH265EncodeTestInstance::~VideoCapabilitiesQueryH265EncodeTestInstance (void)
+{
+}
+
+tcu::TestStatus VideoCapabilitiesQueryH265EncodeTestInstance::iterate (void)
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkVideoCodecOperationFlagBitsKHR videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT;
+ const VkVideoEncodeH265ProfileInfoEXT videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ STD_VIDEO_H265_PROFILE_IDC_MAIN, // StdVideoH265ProfileIdc stdProfileIdc;
+ };
+ const VkVideoProfileInfoKHR videoProfile =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ (void*)&videoProfileOperation, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+ VkVideoEncodeH265CapabilitiesEXT videoEncodeH265Capabilities[2];
+ VkVideoEncodeCapabilitiesKHR videoEncodeCapabilities[2];
+ VkVideoCapabilitiesKHR videoCapabilites[2];
+
+ for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
+ {
+ const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
+
+ deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
+ deMemset(&videoEncodeCapabilities[ndx], filling, sizeof(videoEncodeCapabilities[ndx]));
+ deMemset(&videoEncodeH265Capabilities[ndx], filling, sizeof(videoEncodeH265Capabilities[ndx]));
+
+ videoCapabilites[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
+ videoCapabilites[ndx].pNext = &videoEncodeCapabilities[ndx];
+ videoEncodeCapabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR;
+ videoEncodeCapabilities[ndx].pNext = &videoEncodeH265Capabilities[ndx];
+ videoEncodeH265Capabilities[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT;
+ videoEncodeH265Capabilities[ndx].pNext = DE_NULL;
+
+ VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
+
+ if (result != VK_SUCCESS)
+ {
+ ostringstream failMsg;
+
+ failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
+
+ return tcu::TestStatus::fail(failMsg.str());
+ }
+ }
+
+ validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
+ validateVideoEncodeCapabilities(videoEncodeCapabilities[0], videoEncodeCapabilities[1]);
+ validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
+ validateVideoCapabilitiesExt(videoEncodeH265Capabilities[0], videoEncodeH265Capabilities[1]);
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+void VideoCapabilitiesQueryH265EncodeTestInstance::validateVideoCapabilitiesExt (const VkVideoEncodeH265CapabilitiesEXT& videoCapabilitiesKHR,
+ const VkVideoEncodeH265CapabilitiesEXT& videoCapabilitiesKHRSecond)
+{
+ const VkVideoEncodeH265InputModeFlagsEXT videoInputModeFlags = VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_SEGMENT_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT;
+ const VkVideoEncodeH265InputModeFlagsEXT videoInputModeFlagsReq = VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_SEGMENT_BIT_EXT;
+ const VkVideoEncodeH265OutputModeFlagsEXT videoOutputModeFlags = VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_SEGMENT_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT;
+ const VkVideoEncodeH265OutputModeFlagsEXT videoOutputModeFlagsReq = VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_SEGMENT_BIT_EXT;
+ const VkVideoEncodeH265CtbSizeFlagsEXT ctbSizeFlags = VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_EXT;
+ const VkVideoEncodeH265TransformBlockSizeFlagsEXT transformBlockSizes = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_EXT
+ | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_EXT;
+ const bool inputFrame = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT);
+ const bool inputSlice = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_SEGMENT_BIT_EXT);
+ const bool inputNonVCL = 0 != (videoCapabilitiesKHR.inputModeFlags & VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT);
+ const bool outputFrame = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT);
+ const bool outputSlice = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_SEGMENT_BIT_EXT);
+ const bool outputNonVCL = 0 != (videoCapabilitiesKHR.outputModeFlags & VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT);
+ const bool validCombination = (inputFrame && outputFrame ) // Input: Frame, Output : Frame
+ || (inputFrame && outputFrame && outputNonVCL ) // Input: Frame, Output : Frame and Non-VCL
+ || (inputFrame && outputSlice ) // Input: Frame, Output : Slice
+ || (inputFrame && outputSlice && outputNonVCL ) // Input: Frame, Output : Slice and Non-VCL
+ || (inputSlice && outputSlice ) // Input: Slice, Output : Slice
+ || (inputSlice && outputSlice && outputNonVCL ) // Input: Slice, Output : Slice and Non-VCL
+ || (inputFrame && inputNonVCL && outputFrame && outputNonVCL ) // Input: Frame and Non-VCL, Output : Frame and Non-VCL
+ || (inputFrame && inputNonVCL && outputSlice && outputNonVCL ) // Input: Frame and Non-VCL, Output : Slice and Non-VCL
+ || (inputSlice && inputNonVCL && outputSlice && outputNonVCL ); // Input: Slice and Non-VCL, Output : Slice and Non-VCL
+
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, inputModeFlags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, outputModeFlags);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, ctbSizes);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, transformBlockSizes);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxPPictureL0ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBPictureL0ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxL1ReferenceCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxSubLayersCount);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minLog2MinLumaCodingBlockSizeMinus3);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLog2MinLumaCodingBlockSizeMinus3);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minLog2MinLumaTransformBlockSizeMinus2);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLog2MinLumaTransformBlockSizeMinus2);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minMaxTransformHierarchyDepthInter);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxMaxTransformHierarchyDepthInter);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minMaxTransformHierarchyDepthIntra);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxMaxTransformHierarchyDepthIntra);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxDiffCuQpDeltaDepth);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minMaxNumMergeCand);
+ VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxMaxNumMergeCand);
+
+ if (videoCapabilitiesKHR.flags != 0)
+ TCU_FAIL("videoCapabilitiesKHR.flags must be 0");
+
+ if (videoCapabilitiesKHR.inputModeFlags == 0)
+ TCU_FAIL("videoCapabilitiesKHR.inputModeFlags must not be 0");
+
+ if ((videoCapabilitiesKHR.inputModeFlags & ~videoInputModeFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.inputModeFlags");
+
+ if ((videoCapabilitiesKHR.inputModeFlags & videoInputModeFlagsReq) == 0)
+ TCU_FAIL("An implementation must support at least one of VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT or VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_SEGMENT_BIT_EXT");
+
+ if (videoCapabilitiesKHR.outputModeFlags == 0)
+ TCU_FAIL("videoCapabilitiesKHR.outputModeFlags must not be 0");
+
+ if ((videoCapabilitiesKHR.outputModeFlags & ~videoOutputModeFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.outputModeFlags");
+
+ if ((videoCapabilitiesKHR.outputModeFlags & videoOutputModeFlagsReq) == 0)
+ TCU_FAIL("An implementation must support at least one of VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT or VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_SEGMENT_BIT_EXT");
+
+ if (!validCombination)
+ TCU_FAIL("An implementation must report one of the following combinations of input/output modes (see above)");
+
+ if (videoCapabilitiesKHR.ctbSizes == 0)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.ctbSizes");
+
+ if ((videoCapabilitiesKHR.ctbSizes & ~ctbSizeFlags) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.ctbSizeFlags");
+
+ if (videoCapabilitiesKHR.transformBlockSizes == 0)
+ TCU_FAIL("Invalid videoCapabilitiesKHR.transformBlockSizes");
+
+ if ((videoCapabilitiesKHR.transformBlockSizes & ~transformBlockSizes) != 0)
+ TCU_FAIL("Undefined videoCapabilitiesKHR.transformBlockSizes");
+}
+
+
+class VideoCapabilitiesQueryTestCase : public TestCase
+{
+ public:
+ VideoCapabilitiesQueryTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef caseDef);
+ ~VideoCapabilitiesQueryTestCase (void);
+
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+private:
+ CaseDef m_caseDef;
+};
+
+VideoCapabilitiesQueryTestCase::VideoCapabilitiesQueryTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef caseDef)
+ : vkt::TestCase (context, name, desc)
+ , m_caseDef (caseDef)
+{
+}
+
+VideoCapabilitiesQueryTestCase::~VideoCapabilitiesQueryTestCase (void)
+{
+}
+
+void VideoCapabilitiesQueryTestCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_video_queue");
+
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_QUEUE_SUPPORT_QUERY: break;
+ case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: context.requireDeviceFunctionality("VK_KHR_video_decode_h264"); break;
+ case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: context.requireDeviceFunctionality("VK_EXT_video_encode_h264"); break;
+ case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: context.requireDeviceFunctionality("VK_KHR_video_decode_h265"); break;
+ case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
+ case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: context.requireDeviceFunctionality("VK_EXT_video_encode_h265"); break;
+ case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY: context.requireDeviceFunctionality("VK_KHR_video_decode_h264"); break;
+ case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY: context.requireDeviceFunctionality("VK_EXT_video_encode_h264"); break;
+ case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY: context.requireDeviceFunctionality("VK_KHR_video_decode_h265"); break;
+ case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY: context.requireDeviceFunctionality("VK_EXT_video_encode_h265"); break;
+ default: TCU_THROW(NotSupportedError, "Unknown TestType");
+ }
+}
+
+TestInstance* VideoCapabilitiesQueryTestCase::createInstance (Context& context) const
+{
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_QUEUE_SUPPORT_QUERY: return new VideoQueueQueryTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH264DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH264DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH264EncodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH264EncodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH265DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH265DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH265EncodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return new VideoFormatPropertiesQueryH265EncodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY: return new VideoCapabilitiesQueryH264DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY: return new VideoCapabilitiesQueryH264EncodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY: return new VideoCapabilitiesQueryH265DecodeTestInstance(context, m_caseDef);
+ case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY: return new VideoCapabilitiesQueryH265EncodeTestInstance(context, m_caseDef);
+ default: TCU_THROW(NotSupportedError, "Unknown TestType");
+ }
+}
+
+const char* getTestName (const TestType testType)
+{
+ switch (testType)
+ {
+ case TEST_TYPE_QUEUE_SUPPORT_QUERY: return "queue_support_query";
+ case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: return "h264_decode_dst_video_format_support_query";
+ case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return "h264_decode_dpb_video_format_support_query";
+ case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: return "h264_encode_src_video_format_support_query";
+ case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return "h264_encode_dpb_video_format_support_query";
+ case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY: return "h265_decode_dst_video_format_support_query";
+ case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return "h265_decode_spb_video_format_support_query";
+ case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY: return "h265_encode_src_video_format_support_query";
+ case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY: return "h265_encode_dpb_video_format_support_query";
+ case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY: return "h264_decode_capabilities_query";
+ case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY: return "h264_encode_capabilities_query";
+ case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY: return "h265_decode_capabilities_query";
+ case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY: return "h265_encode_capabilities_query";
+ default: TCU_THROW(NotSupportedError, "Unknown TestType");
+ }
+}
+} // anonymous
+
+tcu::TestCaseGroup* createVideoCapabilitiesTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "capabilities", "Video encoding and decoding capability query tests"));
+
+ for (int testTypeNdx = 0; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
+ {
+ const TestType testType = static_cast<TestType>(testTypeNdx);
+ const CaseDef caseDef =
+ {
+ testType, // TestType testType;
+ };
+
+ group->addChild(new VideoCapabilitiesQueryTestCase(testCtx, getTestName(testType), "", caseDef));
+ }
+
+ return group.release();
+}
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOCAPABILITIESTESTS_HPP
+#define _VKTVIDEOCAPABILITIESTESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Capabilities Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+tcu::TestCaseGroup* createVideoCapabilitiesTests (tcu::TestContext& testCtx);
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOCAPABILITIESTESTS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Decoding Session tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoDecodeTests.hpp"
+#include "vktVideoTestUtils.hpp"
+#include "vktTestCase.hpp"
+#include "vktVideoPictureUtils.hpp"
+
+#include "tcuTextureUtil.hpp"
+#include "tcuVectorUtil.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuPlatform.hpp"
+#include "tcuFunctionLibrary.hpp"
+#include "tcuImageCompare.hpp"
+
+#include "vkDefs.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkImageUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+
+#include "../ycbcr/vktYCbCrUtil.hpp"
+
+#if (DE_OS != DE_OS_ANDROID)
+#include "vktVideoSessionNvUtils.hpp"
+#include "vktVideoSessionFfmpegUtils.hpp"
+#include "vktVideoBaseDecodeUtils.hpp"
+#endif
+
+
+#include <atomic>
+
+namespace vkt
+{
+namespace video
+{
+namespace
+{
+using namespace vk;
+using namespace std;
+
+using de::MovePtr;
+using vkt::ycbcr::MultiPlaneImageData;
+
+
+enum TestType
+{
+ TEST_TYPE_H264_DECODE_I, // Case 6
+ TEST_TYPE_H264_DECODE_I_P, // Case 7
+ TEST_TYPE_H264_DECODE_I_P_B_13, // Case 7a
+ TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER, // Case 8
+ TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER, // Case 8a
+ TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS, // Case 9
+ TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE, // Case 17
+ TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB, // Case 18
+ TEST_TYPE_H264_DECODE_INTERLEAVED, // Case 21
+ TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED, // Case 23
+ TEST_TYPE_H264_H265_DECODE_INTERLEAVED, // Case 24
+
+ TEST_TYPE_H265_DECODE_I, // Case 15
+ TEST_TYPE_H265_DECODE_I_P, // Case 16
+ TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER, // Case 16-2
+ TEST_TYPE_H265_DECODE_I_P_B_13 , // Case 16-3
+ TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER, // Case 16-4
+
+ TEST_TYPE_LAST
+};
+
+struct CaseDef
+{
+ TestType testType;
+};
+
+// Vulkan video is not supported on android platform
+// all external libraries, helper functions and test instances has been excluded
+#if (DE_OS != DE_OS_ANDROID)
+DecodedFrame initDecodeFrame (void)
+{
+ DecodedFrame frameTemplate =
+ {
+ -1, // int32_t pictureIndex;
+ DE_NULL, // const ImageObject* pDecodedImage;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout decodedImageLayout;
+ DE_NULL, // VkFence frameCompleteFence;
+ DE_NULL, // VkFence frameConsumerDoneFence;
+ DE_NULL, // VkSemaphore frameCompleteSemaphore;
+ DE_NULL, // VkSemaphore frameConsumerDoneSemaphore;
+ DE_NULL, // VkQueryPool queryPool;
+ 0, // int32_t startQueryId;
+ 0, // uint32_t numQueries;
+ 0, // uint64_t timestamp;
+ 0, // uint32_t hasConsummerSignalFence : 1;
+ 0, // uint32_t hasConsummerSignalSemaphore : 1;
+ 0, // int32_t decodeOrder;
+ 0, // int32_t displayOrder;
+ };
+
+ return frameTemplate;
+}
+
+// Avoid useless sampler in writeImage 2.5x faster
+MovePtr<tcu::TextureLevel> convertToRGBASized (const tcu::ConstPixelBufferAccess& src, const tcu::UVec2& size)
+{
+ const tcu::TextureFormat format (tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8);
+ MovePtr<tcu::TextureLevel> result (new tcu::TextureLevel(format, size.x(), size.y()));
+ tcu::PixelBufferAccess access (result->getAccess());
+
+ for (int y = 0; y < result->getHeight(); ++y)
+ for (int x = 0; x < result->getWidth(); ++x)
+ access.setPixel(src.getPixelUint(x, y), x, y);
+
+ return result;
+}
+
+MovePtr<tcu::TextureLevel> convertToRGBA (const tcu::ConstPixelBufferAccess& src)
+{
+ return convertToRGBASized(src, tcu::UVec2((uint32_t)src.getWidth(), (uint32_t)src.getHeight()));
+}
+
+MovePtr<MultiPlaneImageData> getDecodedImage (const DeviceInterface& vkd,
+ VkDevice device,
+ Allocator& allocator,
+ VkImage image,
+ VkImageLayout layout,
+ VkFormat format,
+ VkExtent2D codedExtent,
+ deUint32 queueFamilyIndexTransfer,
+ deUint32 queueFamilyIndexDecode)
+{
+ MovePtr<MultiPlaneImageData> multiPlaneImageData (new MultiPlaneImageData(format, tcu::UVec2(codedExtent.width, codedExtent.height)));
+ const VkQueue queueDecode = getDeviceQueue(vkd, device, queueFamilyIndexDecode, 0u);
+ const VkQueue queueTransfer = getDeviceQueue(vkd, device, queueFamilyIndexTransfer, 0u);
+ const VkImageSubresourceRange imageSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1);
+ const VkImageMemoryBarrier2KHR imageBarrierDecode = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
+ VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
+ VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ layout,
+ VK_IMAGE_LAYOUT_GENERAL,
+ image,
+ imageSubresourceRange);
+ const VkImageMemoryBarrier2KHR imageBarrierOwnershipDecode = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ VK_IMAGE_LAYOUT_GENERAL,
+ VK_IMAGE_LAYOUT_GENERAL,
+ image,
+ imageSubresourceRange,
+ queueFamilyIndexDecode,
+ queueFamilyIndexTransfer);
+ const VkImageMemoryBarrier2KHR imageBarrierOwnershipTransfer = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ VK_IMAGE_LAYOUT_GENERAL,
+ VK_IMAGE_LAYOUT_GENERAL,
+ image,
+ imageSubresourceRange,
+ queueFamilyIndexDecode,
+ queueFamilyIndexTransfer);
+ const VkImageMemoryBarrier2KHR imageBarrierTransfer = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR,
+ VK_ACCESS_2_TRANSFER_READ_BIT_KHR,
+ VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR,
+ VK_ACCESS_NONE_KHR,
+ VK_IMAGE_LAYOUT_GENERAL,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ image,
+ imageSubresourceRange);
+ const Move<VkCommandPool> cmdDecodePool (makeCommandPool(vkd, device, queueFamilyIndexDecode));
+ const Move<VkCommandBuffer> cmdDecodeBuffer (allocateCommandBuffer(vkd, device, *cmdDecodePool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+ const Move<VkCommandPool> cmdTransferPool (makeCommandPool(vkd, device, queueFamilyIndexTransfer));
+ const Move<VkCommandBuffer> cmdTransferBuffer (allocateCommandBuffer(vkd, device, *cmdTransferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+ Move<VkSemaphore> semaphore = createSemaphore(vkd, device);
+ Move<VkFence> decodeFence = createFence(vkd, device);
+ Move<VkFence> transferFence = createFence(vkd, device);
+ VkFence fences[] = { *decodeFence, *transferFence };
+ const VkPipelineStageFlags waitDstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ const VkSubmitInfo decodeSubmitInfo
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // deUint32 waitSemaphoreCount;
+ DE_NULL, // const VkSemaphore* pWaitSemaphores;
+ DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
+ 1u, // deUint32 commandBufferCount;
+ &*cmdDecodeBuffer, // const VkCommandBuffer* pCommandBuffers;
+ 1u, // deUint32 signalSemaphoreCount;
+ &*semaphore, // const VkSemaphore* pSignalSemaphores;
+ };
+ const VkSubmitInfo transferSubmitInfo
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 1u, // deUint32 waitSemaphoreCount;
+ &*semaphore, // const VkSemaphore* pWaitSemaphores;
+ &waitDstStageMask, // const VkPipelineStageFlags* pWaitDstStageMask;
+ 1u, // deUint32 commandBufferCount;
+ &*cmdTransferBuffer, // const VkCommandBuffer* pCommandBuffers;
+ 0u, // deUint32 signalSemaphoreCount;
+ DE_NULL, // const VkSemaphore* pSignalSemaphores;
+ };
+
+ DEBUGLOG(std::cout << "getDecodedImage: " << image << " " << layout << std::endl);
+
+ beginCommandBuffer(vkd, *cmdDecodeBuffer, 0u);
+ cmdPipelineImageMemoryBarrier2(vkd, *cmdDecodeBuffer, &imageBarrierDecode);
+ cmdPipelineImageMemoryBarrier2(vkd, *cmdDecodeBuffer, &imageBarrierOwnershipDecode);
+ endCommandBuffer(vkd, *cmdDecodeBuffer);
+
+ beginCommandBuffer(vkd, *cmdTransferBuffer, 0u);
+ cmdPipelineImageMemoryBarrier2(vkd, *cmdTransferBuffer, &imageBarrierOwnershipTransfer);
+ cmdPipelineImageMemoryBarrier2(vkd, *cmdTransferBuffer, &imageBarrierTransfer);
+ endCommandBuffer(vkd, *cmdTransferBuffer);
+
+ VK_CHECK(vkd.queueSubmit(queueDecode, 1u, &decodeSubmitInfo, *decodeFence));
+ VK_CHECK(vkd.queueSubmit(queueTransfer, 1u, &transferSubmitInfo, *transferFence));
+
+ VK_CHECK(vkd.waitForFences(device, DE_LENGTH_OF_ARRAY(fences), fences, DE_TRUE, ~0ull));
+
+ vkt::ycbcr::downloadImage(vkd, device, queueFamilyIndexTransfer, allocator, image, multiPlaneImageData.get(), 0, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+ return multiPlaneImageData;
+}
+
+class VideoDecodeTestInstance : public VideoBaseTestInstance
+{
+public:
+ typedef std::pair<tcu::IVec3, tcu::IVec3> ReferencePixel;
+
+ VideoDecodeTestInstance (Context& context,
+ const CaseDef& data);
+ ~VideoDecodeTestInstance (void);
+
+ MovePtr<vector<deUint8>> loadTestVideoData (void);
+
+ tcu::TestStatus iterate (void);
+ tcu::TestStatus iterateSingleFrame (void);
+ tcu::TestStatus iterateDoubleFrame (void);
+ tcu::TestStatus iterateMultipleFrame (void);
+ bool verifyImage (uint32_t frameNumber,
+ const MultiPlaneImageData& multiPlaneImageData);
+ bool verifyImageMultipleFrame (uint32_t frameNumber,
+ const MultiPlaneImageData& multiPlaneImageData);
+ bool verifyImageMultipleFrameNoReference (uint32_t frameNumber,
+ const MultiPlaneImageData& multiPlaneImageData,
+ const vector<ReferencePixel>& referencePixels);
+ bool verifyImageMultipleFrameWithReference (uint32_t frameNumber,
+ const MultiPlaneImageData& multiPlaneImageData);
+protected:
+ CaseDef m_caseDef;
+ MovePtr<VideoBaseDecoder> m_decoder;
+ VkVideoCodecOperationFlagBitsKHR m_videoCodecOperation;
+ int32_t m_frameCountTrigger;
+ bool m_queryWithStatusRequired;
+};
+
+VideoDecodeTestInstance::VideoDecodeTestInstance (Context& context, const CaseDef& data)
+ : VideoBaseTestInstance (context)
+ , m_caseDef (data)
+ , m_decoder (new VideoBaseDecoder(context))
+ , m_videoCodecOperation (VK_VIDEO_CODEC_OPERATION_NONE_KHR)
+ , m_frameCountTrigger (0)
+ , m_queryWithStatusRequired (false)
+{
+ const bool queryResultWithStatus = m_caseDef.testType == TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS;
+ const bool twoCachedPicturesSwapped = queryResultWithStatus
+ || m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER;
+ const bool randomOrSwapped = twoCachedPicturesSwapped
+ || m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER;
+ const uint32_t gopSize = m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE ? 15
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB ? 15
+ : 0;
+ const uint32_t gopCount = m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE ? 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB ? 1
+ : 0;
+ const bool submitDuringRecord = m_caseDef.testType == TEST_TYPE_H264_DECODE_I
+ || m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P;
+ const bool submitAfter = !submitDuringRecord;
+
+ m_frameCountTrigger = m_caseDef.testType == TEST_TYPE_H264_DECODE_I ? 1
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P ? 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13 ? 13 * 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER ? 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER ? 13 * 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS ? 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE ? 15 * 2
+ : m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB ? 15 * 2
+ : m_caseDef.testType == TEST_TYPE_H265_DECODE_I ? 1
+ : m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P ? 2
+ : m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER ? 2
+ : m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_B_13 ? 13 * 2
+ : m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER ? 13 * 2
+ : 0;
+
+ m_decoder->setDecodeParameters(randomOrSwapped, queryResultWithStatus, m_frameCountTrigger, submitAfter, gopSize, gopCount);
+
+ m_videoCodecOperation = de::inBounds(m_caseDef.testType, TEST_TYPE_H264_DECODE_I, TEST_TYPE_H265_DECODE_I) ? VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
+ : de::inBounds(m_caseDef.testType, TEST_TYPE_H265_DECODE_I, TEST_TYPE_LAST) ? VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
+ : VK_VIDEO_CODEC_OPERATION_NONE_KHR;
+
+ DE_ASSERT(m_videoCodecOperation != VK_VIDEO_CODEC_OPERATION_NONE_KHR);
+
+ m_queryWithStatusRequired = (m_caseDef.testType == TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS);
+}
+
+VideoDecodeTestInstance::~VideoDecodeTestInstance (void)
+{
+}
+
+MovePtr<vector<deUint8>> VideoDecodeTestInstance::loadTestVideoData (void)
+{
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_I:
+ case TEST_TYPE_H264_DECODE_I_P:
+ case TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS: return loadVideoDataClipA();
+ case TEST_TYPE_H264_DECODE_I_P_B_13:
+ case TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER: return loadVideoDataClipH264G13();
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE:
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB: return loadVideoDataClipC();
+ case TEST_TYPE_H265_DECODE_I:
+ case TEST_TYPE_H265_DECODE_I_P:
+ case TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER: return loadVideoDataClipD();
+ case TEST_TYPE_H265_DECODE_I_P_B_13:
+ case TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER: return loadVideoDataClipH265G13();
+
+ default: TCU_THROW(InternalError, "Unknown testType");
+ }
+}
+
+tcu::TestStatus VideoDecodeTestInstance::iterate (void)
+{
+ if (m_frameCountTrigger == 1)
+ return iterateSingleFrame();
+ else if (m_frameCountTrigger == 2)
+ return iterateDoubleFrame();
+ else
+ return iterateMultipleFrame();
+}
+
+vk::VkExtensionProperties getExtensionVersion (VkVideoCodecOperationFlagBitsKHR videoCodecOperation)
+{
+ // FIXME: last spec version accepted by the parser function
+ //static const vk::VkExtensionProperties h264StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION };
+ static const vk::VkExtensionProperties h264StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME, VK_MAKE_VIDEO_STD_VERSION(0, 9, 8) };
+ //static const vk::VkExtensionProperties h265StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION };
+ static const vk::VkExtensionProperties h265StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME, VK_MAKE_VIDEO_STD_VERSION(0, 9, 9) };
+
+ if (videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) {
+ return h264StdExtensionVersion;
+ } else if (videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) {
+ return h265StdExtensionVersion;
+ }
+
+ TCU_THROW(InternalError, "Unsupported Codec Type");
+}
+
+
+tcu::TestStatus VideoDecodeTestInstance::iterateSingleFrame (void)
+{
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED
+ | (m_queryWithStatusRequired ? VideoDevice::VIDEO_DEVICE_FLAG_QUERY_WITH_STATUS_FOR_DECODE_SUPPORT : 0);
+ const VkDevice device = getDeviceSupportingQueue(VK_QUEUE_VIDEO_DECODE_BIT_KHR | VK_QUEUE_TRANSFER_BIT, m_videoCodecOperation, videoDeviceFlags);
+ const DeviceInterface& vkd = getDeviceDriver();
+ const deUint32 queueFamilyIndexDecode = getQueueFamilyIndexDecode();
+ const deUint32 queueFamilyIndexTransfer = getQueueFamilyIndexTransfer();
+ Allocator& allocator = getAllocator();
+ MovePtr<vector<deUint8>> videoData = loadTestVideoData();
+ MovePtr<IfcFfmpegDemuxer> ffmpegDemuxer (m_decoder->GetIfcFfmpegFuncs()->createIfcFfmpegDemuxer(videoData));
+ VkExtensionProperties stdExtensionVersion = getExtensionVersion(m_videoCodecOperation);
+
+ MovePtr<IfcVulkanVideoDecodeParser> vulkanVideoDecodeParser (m_decoder->GetNvFuncs()->createIfcVulkanVideoDecodeParser(m_videoCodecOperation, &stdExtensionVersion));
+ bool videoStreamHasEnded = false;
+ int32_t framesInQueue = 0;
+ int32_t frameNumber = 0;
+ int32_t framesCorrect = 0;
+ DecodedFrame frame = initDecodeFrame();
+
+ m_decoder->initialize(m_videoCodecOperation, vkd, device, queueFamilyIndexTransfer, queueFamilyIndexDecode, allocator);
+
+ if (!vulkanVideoDecodeParser->initialize(dynamic_cast<NvidiaVulkanParserVideoDecodeClient*>(m_decoder.get())))
+ {
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->initialize()");
+ }
+
+ while (framesInQueue > 0 || !videoStreamHasEnded)
+ {
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->DequeueDecodedPicture(&frame);
+
+ while (framesInQueue == 0 && !videoStreamHasEnded)
+ {
+ if (!videoStreamHasEnded)
+ {
+ deUint8* pData = 0;
+ deInt64 size = 0;
+ const bool demuxerSuccess = ffmpegDemuxer->demux(&pData, &size);
+ const bool parserSuccess = vulkanVideoDecodeParser->parseByteStream(pData, size);
+
+ if (!demuxerSuccess || !parserSuccess)
+ videoStreamHasEnded = true;
+ }
+
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->DequeueDecodedPicture(&frame);
+ }
+
+ if (frame.pictureIndex >= 0)
+ {
+ const VkExtent2D imageExtent = frame.pDecodedImage->getExtent();
+ const VkImage image = frame.pDecodedImage->getImage();
+ const VkFormat format = frame.pDecodedImage->getFormat();
+ const VkImageLayout layout = frame.decodedImageLayout;
+ MovePtr<MultiPlaneImageData> resultImage = getDecodedImage(vkd, device, allocator, image, layout, format, imageExtent, queueFamilyIndexTransfer, queueFamilyIndexDecode);
+
+ if (verifyImage(frameNumber, *resultImage))
+ framesCorrect++;
+
+ m_decoder->ReleaseDisplayedFrame(&frame);
+ frameNumber++;
+
+ if (frameNumber >= 1)
+ break;
+ }
+ }
+
+ if (!vulkanVideoDecodeParser->deinitialize())
+ {
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->deinitialize()");
+ }
+
+ if (framesCorrect > 0 && framesCorrect == frameNumber)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("Some frames has not been decoded correctly (" + de::toString(framesCorrect) + "/" + de::toString(frameNumber) + ")");
+}
+
+tcu::TestStatus VideoDecodeTestInstance::iterateDoubleFrame (void)
+{
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED
+ | (m_queryWithStatusRequired ? VideoDevice::VIDEO_DEVICE_FLAG_QUERY_WITH_STATUS_FOR_DECODE_SUPPORT : 0);
+ const VkDevice device = getDeviceSupportingQueue(VK_QUEUE_VIDEO_DECODE_BIT_KHR | VK_QUEUE_TRANSFER_BIT, m_videoCodecOperation, videoDeviceFlags);
+ const DeviceInterface& vkd = getDeviceDriver();
+ const deUint32 queueFamilyIndexDecode = getQueueFamilyIndexDecode();
+ const deUint32 queueFamilyIndexTransfer = getQueueFamilyIndexTransfer();
+ Allocator& allocator = getAllocator();
+ MovePtr<vector<deUint8>> videoData = loadTestVideoData();
+ MovePtr<IfcFfmpegDemuxer> ffmpegDemuxer (m_decoder->GetIfcFfmpegFuncs()->createIfcFfmpegDemuxer(videoData));
+ VkExtensionProperties stdExtensionVersion = getExtensionVersion(m_videoCodecOperation);
+
+ MovePtr<IfcVulkanVideoDecodeParser> vulkanVideoDecodeParser (m_decoder->GetNvFuncs()->createIfcVulkanVideoDecodeParser(m_videoCodecOperation, &stdExtensionVersion));
+ bool videoStreamHasEnded = false;
+ int32_t framesInQueue = 0;
+ int32_t frameNumber = 0;
+ int32_t framesCorrect = 0;
+ DecodedFrame frames[2] = { initDecodeFrame(), initDecodeFrame() };
+
+ m_decoder->initialize(m_videoCodecOperation, vkd, device, queueFamilyIndexTransfer, queueFamilyIndexDecode, allocator);
+
+ if (!vulkanVideoDecodeParser->initialize(dynamic_cast<NvidiaVulkanParserVideoDecodeClient*>(m_decoder.get())))
+ {
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->initialize()");
+ }
+
+ while (framesInQueue > 0 || !videoStreamHasEnded)
+ {
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->GetDisplayFramesCount();
+
+ while (framesInQueue < 2 && !videoStreamHasEnded)
+ {
+ if (!videoStreamHasEnded)
+ {
+ deUint8* pData = 0;
+ deInt64 size = 0;
+ const bool demuxerSuccess = ffmpegDemuxer->demux(&pData, &size);
+ const bool parserSuccess = vulkanVideoDecodeParser->parseByteStream(pData, size);
+
+ if (!demuxerSuccess || !parserSuccess)
+ videoStreamHasEnded = true;
+ }
+
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->GetDisplayFramesCount();
+ }
+
+ for (size_t frameNdx = 0; frameNdx < 2; ++frameNdx)
+ {
+ DecodedFrame& frame = frames[frameNdx];
+
+ m_decoder->GetVideoFrameBuffer()->DequeueDecodedPicture(&frame);
+ }
+
+ for (size_t frameNdx = 0; frameNdx < 2; ++frameNdx)
+ {
+ DecodedFrame& frame = frames[frameNdx];
+ const VkExtent2D imageExtent = frame.pDecodedImage->getExtent();
+ const VkImage image = frame.pDecodedImage->getImage();
+ const VkFormat format = frame.pDecodedImage->getFormat();
+ const VkImageLayout layout = frame.decodedImageLayout;
+
+ if (frame.pictureIndex >= 0)
+ {
+ const bool assumeCorrect = m_caseDef.testType == TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS;
+ MovePtr<MultiPlaneImageData> resultImage = getDecodedImage(vkd, device, allocator, image, layout, format, imageExtent, queueFamilyIndexTransfer, queueFamilyIndexDecode);
+
+ if (assumeCorrect || verifyImage(frameNumber, *resultImage))
+ framesCorrect++;
+
+ m_decoder->ReleaseDisplayedFrame(&frame);
+ frameNumber++;
+
+ if (frameNumber >= DE_LENGTH_OF_ARRAY(frames))
+ break;
+ }
+ }
+
+ if (frameNumber >= DE_LENGTH_OF_ARRAY(frames))
+ break;
+ }
+
+ if (!vulkanVideoDecodeParser->deinitialize())
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->deinitialize()");
+
+ if (framesCorrect > 0 && framesCorrect == frameNumber)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("Some frames has not been decoded correctly (" + de::toString(framesCorrect) + "/" + de::toString(frameNumber) + ")");
+}
+
+tcu::TestStatus VideoDecodeTestInstance::iterateMultipleFrame (void)
+{
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED
+ | (m_queryWithStatusRequired ? VideoDevice::VIDEO_DEVICE_FLAG_QUERY_WITH_STATUS_FOR_DECODE_SUPPORT : 0);
+ const VkDevice device = getDeviceSupportingQueue(VK_QUEUE_VIDEO_DECODE_BIT_KHR | VK_QUEUE_TRANSFER_BIT, m_videoCodecOperation, videoDeviceFlags);
+ const DeviceInterface& vkd = getDeviceDriver();
+ const deUint32 queueFamilyIndexDecode = getQueueFamilyIndexDecode();
+ const deUint32 queueFamilyIndexTransfer = getQueueFamilyIndexTransfer();
+ Allocator& allocator = getAllocator();
+ MovePtr<vector<deUint8>> videoData = loadTestVideoData();
+ MovePtr<IfcFfmpegDemuxer> ffmpegDemuxer (m_decoder->GetIfcFfmpegFuncs()->createIfcFfmpegDemuxer(videoData));
+ VkExtensionProperties stdExtensionVersion = getExtensionVersion(m_videoCodecOperation);
+
+ MovePtr<IfcVulkanVideoDecodeParser> vulkanVideoDecodeParser (m_decoder->GetNvFuncs()->createIfcVulkanVideoDecodeParser(m_videoCodecOperation, &stdExtensionVersion));
+ bool videoStreamHasEnded = false;
+ int32_t framesInQueue = 0;
+ int32_t frameNumber = 0;
+ int32_t framesCorrect = 0;
+ vector<DecodedFrame> frames (m_frameCountTrigger, initDecodeFrame());
+
+ m_decoder->initialize(m_videoCodecOperation, vkd, device, queueFamilyIndexTransfer, queueFamilyIndexDecode, allocator);
+
+ if (!vulkanVideoDecodeParser->initialize(dynamic_cast<NvidiaVulkanParserVideoDecodeClient*>(m_decoder.get())))
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->initialize()");
+
+ while (framesInQueue > 0 || !videoStreamHasEnded)
+ {
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->GetDisplayFramesCount();
+
+ while (framesInQueue < m_frameCountTrigger && !videoStreamHasEnded)
+ {
+ if (!videoStreamHasEnded)
+ {
+ deUint8* pData = 0;
+ deInt64 size = 0;
+ const bool demuxerSuccess = ffmpegDemuxer->demux(&pData, &size);
+ const bool parserSuccess = vulkanVideoDecodeParser->parseByteStream(pData, size);
+
+ if (!demuxerSuccess || !parserSuccess)
+ videoStreamHasEnded = true;
+ }
+
+ framesInQueue = m_decoder->GetVideoFrameBuffer()->GetDisplayFramesCount();
+ }
+
+ for (int32_t frameNdx = 0; frameNdx < m_frameCountTrigger; ++frameNdx)
+ {
+ DecodedFrame& frame = frames[frameNdx];
+
+ m_decoder->GetVideoFrameBuffer()->DequeueDecodedPicture(&frame);
+ }
+
+ bool success = true;
+
+ for (int32_t frameNdx = 0; frameNdx < m_frameCountTrigger; ++frameNdx)
+ {
+ DecodedFrame& frame = frames[frameNdx];
+ const VkExtent2D imageExtent = frame.pDecodedImage->getExtent();
+ const VkImage image = frame.pDecodedImage->getImage();
+ const VkFormat format = frame.pDecodedImage->getFormat();
+ const VkImageLayout layout = frame.decodedImageLayout;
+
+ if (frame.pictureIndex >= 0)
+ {
+ MovePtr<MultiPlaneImageData> resultImage = getDecodedImage(vkd, device, allocator, image, layout, format, imageExtent, queueFamilyIndexTransfer, queueFamilyIndexDecode);
+
+ if (success && verifyImageMultipleFrame(frameNumber, *resultImage))
+ framesCorrect++;
+ else
+ success = false;
+
+ m_decoder->ReleaseDisplayedFrame(&frame);
+ frameNumber++;
+ }
+ }
+ }
+
+ if (!vulkanVideoDecodeParser->deinitialize())
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->deinitialize()");
+
+ if (framesCorrect > 0 && framesCorrect == frameNumber)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("Some frames has not been decoded correctly (" + de::toString(framesCorrect) + "/" + de::toString(frameNumber) + ")");
+}
+
+bool VideoDecodeTestInstance::verifyImage (uint32_t frameNumber, const MultiPlaneImageData& multiPlaneImageData)
+{
+ const tcu::UVec2 imageSize = multiPlaneImageData.getSize();
+ const uint32_t barCount = 10;
+ const uint32_t barWidth = 16;
+ const uint32_t barNum = uint32_t(frameNumber) % barCount;
+ const uint32_t edgeX = imageSize.x() - barWidth * barNum;
+ const uint32_t colorNdx = uint32_t(frameNumber) / barCount;
+ const int32_t refColorsV[] = { 240, 34, 110 };
+ const int32_t refColorsY[] = { 81, 145, 41 };
+ const int32_t refColorsU[] = { 90, 0, 0 };
+ const tcu::UVec4 refColorV = tcu::UVec4(refColorsV[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refColorY = tcu::UVec4(refColorsY[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refColorU = tcu::UVec4(refColorsU[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refBlankV = tcu::UVec4(128, 0, 0, 0);
+ const tcu::UVec4 refBlankY = tcu::UVec4( 16, 0, 0, 0);
+ const tcu::UVec4 refBlankU = tcu::UVec4(128, 0, 0, 0);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessV = multiPlaneImageData.getChannelAccess(0);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessY = multiPlaneImageData.getChannelAccess(1);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessU = multiPlaneImageData.getChannelAccess(2);
+ tcu::TextureLevel refPixelBufferV (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::TextureLevel refPixelBufferY (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::TextureLevel refPixelBufferU (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::PixelBufferAccess refPixelBufferAccessV = refPixelBufferV.getAccess();
+ tcu::PixelBufferAccess refPixelBufferAccessY = refPixelBufferY.getAccess();
+ tcu::PixelBufferAccess refPixelBufferAccessU = refPixelBufferU.getAccess();
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ const string titleV = "Rendered frame " + de::toString(frameNumber) + ". V Component";
+ const string titleY = "Rendered frame " + de::toString(frameNumber) + ". Y Component";
+ const string titleU = "Rendered frame " + de::toString(frameNumber) + ". U Component";
+ const tcu::UVec4 threshold = tcu::UVec4(0, 0, 0, 0);
+
+ for (uint32_t x = 0; x < imageSize.x(); ++x)
+ {
+ const tcu::UVec4& colorV = x < edgeX ? refColorV : refBlankV;
+ const tcu::UVec4& colorY = x < edgeX ? refColorY : refBlankY;
+ const tcu::UVec4& colorU = x < edgeX ? refColorU : refBlankU;
+
+ for (uint32_t y = 0; y < imageSize.y(); ++y)
+ {
+ refPixelBufferAccessV.setPixel(colorV, x, y);
+ refPixelBufferAccessY.setPixel(colorY, x, y);
+ refPixelBufferAccessU.setPixel(colorU, x, y);
+ }
+ }
+
+ const bool resultV = tcu::intThresholdCompare(log, titleV.c_str(), "", refPixelBufferAccessV, outPixelBufferAccessV, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultY = tcu::intThresholdCompare(log, titleY.c_str(), "", refPixelBufferAccessY, outPixelBufferAccessY, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultU = tcu::intThresholdCompare(log, titleU.c_str(), "", refPixelBufferAccessU, outPixelBufferAccessU, threshold, tcu::COMPARE_LOG_ON_ERROR);
+
+ return resultV && resultY && resultU;
+}
+
+bool VideoDecodeTestInstance::verifyImageMultipleFrame (uint32_t frameNumber, const MultiPlaneImageData& multiPlaneImageData)
+{
+ const bool noReferenceTests = m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13
+ || m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_B_13
+ || m_caseDef.testType == TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER;
+
+ if (noReferenceTests)
+ {
+ const bool h264 = m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13
+ || m_caseDef.testType == TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER;
+ const vector<ReferencePixel> referencePixels264
+ {
+ ReferencePixel(tcu::IVec3( 0, 0, 0), tcu::IVec3( 124, 53, 140)),
+ ReferencePixel(tcu::IVec3(1920 - 1, 1080 - 1, 0), tcu::IVec3( 131, 190, 115)),
+ ReferencePixel(tcu::IVec3( 0, 0, 12), tcu::IVec3( 140, 223, 92)),
+ ReferencePixel(tcu::IVec3(1920 - 1, 1080 - 1, 12), tcu::IVec3( 138, 166, 98)),
+ };
+ const vector<ReferencePixel> referencePixels265
+ {
+ ReferencePixel(tcu::IVec3( 0, 0, 0), tcu::IVec3( 124, 55, 144)),
+ ReferencePixel(tcu::IVec3(1920 - 1, 1080 - 1, 0), tcu::IVec3( 130, 190, 114)),
+ ReferencePixel(tcu::IVec3( 0, 0, 12), tcu::IVec3( 142, 210, 94)),
+ ReferencePixel(tcu::IVec3(1920 - 1, 1080 - 1, 12), tcu::IVec3( 137, 166, 96)),
+ };
+ const vector<ReferencePixel>& referencePixels = h264 ? referencePixels264 : referencePixels265;
+
+ return verifyImageMultipleFrameNoReference(frameNumber, multiPlaneImageData, referencePixels);
+ }
+ else
+ return verifyImageMultipleFrameWithReference(frameNumber, multiPlaneImageData);
+}
+
+bool VideoDecodeTestInstance::verifyImageMultipleFrameWithReference (uint32_t frameNumber, const MultiPlaneImageData& multiPlaneImageData)
+{
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ const bool firstHalf = frameNumber < 15;
+ const bool resolutionChange = m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE || m_caseDef.testType == TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB;
+ const uint32_t k = resolutionChange
+ ? (firstHalf ? 2 : 1)
+ : 1;
+ const uint32_t cellSize = 16 * k;
+ const uint32_t cellCountX = 11;
+ const uint32_t cellCountV = 9;
+ const tcu::UVec2 imageSize = { cellSize * cellCountX, cellSize * cellCountV };
+ const string titleV = "Rendered frame " + de::toString(frameNumber) + ". V Component";
+ const tcu::UVec4 refColor0V = tcu::UVec4(128, 0, 0, 255);
+ const tcu::UVec4 refColor1V = tcu::UVec4(128, 0, 0, 255);
+ const tcu::UVec4& refColorV = firstHalf ? refColor0V : refColor1V;
+ const tcu::UVec4& refBlankV = firstHalf ? refColor1V : refColor0V;
+ tcu::TextureLevel refPixelBufferV (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::PixelBufferAccess refPixelBufferAccessV = refPixelBufferV.getAccess();
+ MovePtr<tcu::TextureLevel> outPixelBufferV = convertToRGBASized(multiPlaneImageData.getChannelAccess(0), imageSize);
+ tcu::PixelBufferAccess outPixelBufferAccessV = outPixelBufferV->getAccess();
+ const string titleY = "Rendered frame " + de::toString(frameNumber) + ". Y Component";
+ const tcu::UVec4 refColor0Y = tcu::UVec4(235, 0, 0, 255);
+ const tcu::UVec4 refColor1Y = tcu::UVec4( 16, 0, 0, 255);
+ const tcu::UVec4& refColorY = firstHalf ? refColor0Y : refColor1Y;
+ const tcu::UVec4& refBlankY = firstHalf ? refColor1Y : refColor0Y;
+ tcu::TextureLevel refPixelBufferY (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::PixelBufferAccess refPixelBufferAccessY = refPixelBufferY.getAccess();
+ MovePtr<tcu::TextureLevel> outPixelBufferY = convertToRGBASized(multiPlaneImageData.getChannelAccess(1), imageSize);
+ tcu::PixelBufferAccess outPixelBufferAccessY = outPixelBufferY->getAccess();
+ const string titleU = "Rendered frame " + de::toString(frameNumber) + ". U Component";
+ const tcu::UVec4 refColor0U = tcu::UVec4(128, 0, 0, 255);
+ const tcu::UVec4 refColor1U = tcu::UVec4(128, 0, 0, 255);
+ const tcu::UVec4& refColorU = firstHalf ? refColor0U : refColor1U;
+ const tcu::UVec4& refBlankU = firstHalf ? refColor1U : refColor0U;
+ tcu::TextureLevel refPixelBufferU (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::PixelBufferAccess refPixelBufferAccessU = refPixelBufferU.getAccess();
+ MovePtr<tcu::TextureLevel> outPixelBufferU = convertToRGBASized(multiPlaneImageData.getChannelAccess(2), imageSize);
+ tcu::PixelBufferAccess outPixelBufferAccessU = outPixelBufferU->getAccess();
+ const tcu::UVec4 threshold = tcu::UVec4(0, 0, 0, 0);
+
+ for (uint32_t x = 0; x < imageSize.x(); ++x)
+ for (uint32_t y = 0; y < imageSize.y(); ++y)
+ {
+ refPixelBufferAccessV.setPixel(refBlankV, x, y);
+ refPixelBufferAccessY.setPixel(refBlankY, x, y);
+ refPixelBufferAccessU.setPixel(refBlankU, x, y);
+ }
+
+ for (uint32_t cellNdx = 0; cellNdx <= frameNumber % 15; cellNdx++)
+ {
+ const uint32_t cellOfs = firstHalf ? 0 : 6 * cellSize;
+ const uint32_t cellX0 = cellSize * (cellNdx % 5);
+ const uint32_t cellV0 = cellSize * (cellNdx / 5) + cellOfs;
+ const uint32_t cellX1 = cellX0 + cellSize;
+ const uint32_t cellV1 = cellV0 + cellSize;
+
+ for (uint32_t x = cellX0; x < cellX1; ++x)
+ for (uint32_t y = cellV0; y < cellV1; ++y)
+ {
+ refPixelBufferAccessV.setPixel(refColorV, x, y);
+ refPixelBufferAccessY.setPixel(refColorY, x, y);
+ refPixelBufferAccessU.setPixel(refColorU, x, y);
+ }
+ }
+
+ const bool resultV = tcu::intThresholdCompare(log, titleV.c_str(), "", refPixelBufferAccessV, outPixelBufferAccessV, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultY = tcu::intThresholdCompare(log, titleY.c_str(), "", refPixelBufferAccessY, outPixelBufferAccessY, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultU = tcu::intThresholdCompare(log, titleU.c_str(), "", refPixelBufferAccessU, outPixelBufferAccessU, threshold, tcu::COMPARE_LOG_ON_ERROR);
+
+ return resultV && resultY && resultU;
+}
+
+bool VideoDecodeTestInstance::verifyImageMultipleFrameNoReference (uint32_t frameNumber, const MultiPlaneImageData& multiPlaneImageData, const vector<ReferencePixel>& referencePixels)
+{
+ bool decodeFrame = false;
+ for (size_t i = 0; i < referencePixels.size(); i++)
+ if (referencePixels[i].first.z() == static_cast<int>(frameNumber))
+ decodeFrame = true;
+
+ if (decodeFrame)
+ {
+ MovePtr<tcu::TextureLevel> outPixelBufferV = convertToRGBA(multiPlaneImageData.getChannelAccess(0));
+ tcu::PixelBufferAccess outPixelBufferAccessV = outPixelBufferV->getAccess();
+ MovePtr<tcu::TextureLevel> outPixelBufferY = convertToRGBA(multiPlaneImageData.getChannelAccess(1));
+ tcu::PixelBufferAccess outPixelBufferAccessY = outPixelBufferY->getAccess();
+ MovePtr<tcu::TextureLevel> outPixelBufferU = convertToRGBA(multiPlaneImageData.getChannelAccess(2));
+ tcu::PixelBufferAccess outPixelBufferAccessU = outPixelBufferU->getAccess();
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+
+ log << tcu::TestLog::Message << "TODO: WARNING: ONLY FEW PIXELS ARE CHECKED\n" << tcu::TestLog::EndMessage;
+
+ log << tcu::TestLog::ImageSet("Frame", "")
+ << tcu::TestLog::Image("Result V", "Result V", outPixelBufferAccessV)
+ << tcu::TestLog::Image("Result Y", "Result Y", outPixelBufferAccessY)
+ << tcu::TestLog::Image("Result U", "Result U", outPixelBufferAccessU)
+ << tcu::TestLog::EndImageSet;
+
+ for (size_t i = 0; i < referencePixels.size(); i++)
+ if (referencePixels[i].first.z() == static_cast<int>(frameNumber))
+ {
+ const tcu::IVec3& pos = referencePixels[i].first;
+ const tcu::IVec3& ref = referencePixels[i].second;
+ const tcu::IVec3 value = tcu::IVec3(outPixelBufferAccessV.getPixelInt(pos.x(), pos.y()).x(),
+ outPixelBufferAccessY.getPixelInt(pos.x(), pos.y()).x(),
+ outPixelBufferAccessU.getPixelInt(pos.x(), pos.y()).x());
+
+ if (value != ref)
+ return false;
+ }
+ }
+
+ return true;
+}
+
+class DualVideoDecodeTestInstance : public VideoBaseTestInstance
+{
+public:
+ DualVideoDecodeTestInstance (Context& context,
+ const CaseDef& data);
+ ~DualVideoDecodeTestInstance (void);
+
+ MovePtr<vector<deUint8>> loadTestVideoData (bool primary);
+
+ tcu::TestStatus iterate (void);
+ bool verifyImage (bool firstClip,
+ int32_t frameNumber,
+ const MultiPlaneImageData& multiPlaneImageData);
+protected:
+ CaseDef m_caseDef;
+ MovePtr<VideoBaseDecoder> m_decoder1;
+ MovePtr<VideoBaseDecoder> m_decoder2;
+ VkVideoCodecOperationFlagBitsKHR m_videoCodecOperation;
+ VkVideoCodecOperationFlagBitsKHR m_videoCodecOperation1;
+ VkVideoCodecOperationFlagBitsKHR m_videoCodecOperation2;
+ int32_t m_frameCountTrigger;
+};
+
+DualVideoDecodeTestInstance::DualVideoDecodeTestInstance (Context& context, const CaseDef& data)
+ : VideoBaseTestInstance (context)
+ , m_caseDef (data)
+ , m_decoder1 (new VideoBaseDecoder(context))
+ , m_decoder2 (new VideoBaseDecoder(context))
+ , m_videoCodecOperation (VK_VIDEO_CODEC_OPERATION_NONE_KHR)
+ , m_videoCodecOperation1 (VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR)
+ , m_videoCodecOperation2 (VK_VIDEO_CODEC_OPERATION_NONE_KHR)
+ , m_frameCountTrigger (10)
+{
+ const bool randomOrSwapped = false;
+ const bool queryResultWithStatus = false;
+
+ m_decoder1->setDecodeParameters(randomOrSwapped, queryResultWithStatus, m_frameCountTrigger + 1);
+ m_decoder2->setDecodeParameters(randomOrSwapped, queryResultWithStatus, m_frameCountTrigger + 1);
+
+ m_videoCodecOperation2 = m_caseDef.testType == TEST_TYPE_H264_DECODE_INTERLEAVED ? VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
+ : m_caseDef.testType == TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED ? VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT
+ : m_caseDef.testType == TEST_TYPE_H264_H265_DECODE_INTERLEAVED ? VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
+ : VK_VIDEO_CODEC_OPERATION_NONE_KHR;
+
+ DE_ASSERT(m_videoCodecOperation2 != VK_VIDEO_CODEC_OPERATION_NONE_KHR);
+
+ m_videoCodecOperation = static_cast<VkVideoCodecOperationFlagBitsKHR>(m_videoCodecOperation1 | m_videoCodecOperation2);
+
+ if (m_videoCodecOperation2 == VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT)
+ TCU_THROW(NotSupportedError, "NOT IMPLEMENTED: REQUIRES ENCODE QUEUE");
+}
+
+DualVideoDecodeTestInstance::~DualVideoDecodeTestInstance (void)
+{
+}
+
+MovePtr<vector<deUint8>> DualVideoDecodeTestInstance::loadTestVideoData (bool primary)
+{
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_INTERLEAVED: return primary ? loadVideoDataClipA() : loadVideoDataClipB();
+ case TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED: return loadVideoDataClipA();
+ case TEST_TYPE_H264_H265_DECODE_INTERLEAVED: return primary ? loadVideoDataClipA() : loadVideoDataClipD();
+ default: TCU_THROW(InternalError, "Unknown testType");
+ }
+}
+
+tcu::TestStatus DualVideoDecodeTestInstance::iterate (void)
+{
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED;
+ const VkDevice device = getDeviceSupportingQueue(VK_QUEUE_VIDEO_DECODE_BIT_KHR | VK_QUEUE_TRANSFER_BIT, m_videoCodecOperation, videoDeviceFlags);
+ const DeviceInterface& vkd = getDeviceDriver();
+ const deUint32 queueFamilyIndexDecode = getQueueFamilyIndexDecode();
+ const deUint32 queueFamilyIndexTransfer = getQueueFamilyIndexTransfer();
+ Allocator& allocator = getAllocator();
+ MovePtr<vector<deUint8>> videoData1 = loadTestVideoData(true);
+ MovePtr<vector<deUint8>> videoData2 = loadTestVideoData(false);
+ MovePtr<IfcFfmpegDemuxer> ffmpegDemuxer1 (m_decoder1->GetIfcFfmpegFuncs()->createIfcFfmpegDemuxer(videoData1));
+ MovePtr<IfcFfmpegDemuxer> ffmpegDemuxer2 (m_decoder2->GetIfcFfmpegFuncs()->createIfcFfmpegDemuxer(videoData2));
+ VkExtensionProperties stdExtensionVersion1 = getExtensionVersion(m_videoCodecOperation1);
+ VkExtensionProperties stdExtensionVersion2 = getExtensionVersion(m_videoCodecOperation2);
+
+ MovePtr<IfcVulkanVideoDecodeParser> vulkanVideoDecodeParser1 (m_decoder1->GetNvFuncs()->createIfcVulkanVideoDecodeParser(m_videoCodecOperation1, &stdExtensionVersion1));
+ MovePtr<IfcVulkanVideoDecodeParser> vulkanVideoDecodeParser2 (m_decoder2->GetNvFuncs()->createIfcVulkanVideoDecodeParser(m_videoCodecOperation2, &stdExtensionVersion2));
+ int32_t frameNumber = 0;
+ int32_t framesCorrect = 0;
+ vector<DecodedFrame> frames (m_frameCountTrigger, initDecodeFrame());
+
+ m_decoder1->initialize(m_videoCodecOperation1, vkd, device, queueFamilyIndexTransfer, queueFamilyIndexDecode, allocator);
+
+ if (!vulkanVideoDecodeParser1->initialize(dynamic_cast<NvidiaVulkanParserVideoDecodeClient*>(m_decoder1.get())))
+ {
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->initialize()");
+ }
+
+ m_decoder2->initialize(m_videoCodecOperation2, vkd, device, queueFamilyIndexTransfer, queueFamilyIndexDecode, allocator);
+
+ if (!vulkanVideoDecodeParser2->initialize(dynamic_cast<NvidiaVulkanParserVideoDecodeClient*>(m_decoder2.get())))
+ {
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->initialize()");
+ }
+
+ {
+ bool videoStreamHasEnded = false;
+ int32_t framesInQueue = 0;
+
+ while (framesInQueue < m_frameCountTrigger && !videoStreamHasEnded)
+ {
+ deUint8* pData = 0;
+ deInt64 size = 0;
+ const bool demuxerSuccess = ffmpegDemuxer1->demux(&pData, &size);
+ const bool parserSuccess = vulkanVideoDecodeParser1->parseByteStream(pData, size);
+
+ if (!demuxerSuccess || !parserSuccess)
+ videoStreamHasEnded = true;
+
+ framesInQueue = m_decoder1->GetVideoFrameBuffer()->GetDisplayFramesCount();
+ }
+ }
+
+ {
+ bool videoStreamHasEnded = false;
+ int32_t framesInQueue = 0;
+
+ while (framesInQueue < m_frameCountTrigger && !videoStreamHasEnded)
+ {
+ deUint8* pData = 0;
+ deInt64 size = 0;
+ const bool demuxerSuccess = ffmpegDemuxer2->demux(&pData, &size);
+ const bool parserSuccess = vulkanVideoDecodeParser2->parseByteStream(pData, size);
+
+ if (!demuxerSuccess || !parserSuccess)
+ videoStreamHasEnded = true;
+
+ framesInQueue = m_decoder2->GetVideoFrameBuffer()->GetDisplayFramesCount();
+ }
+ }
+
+ m_decoder1->DecodeCachedPictures(m_decoder2.get());
+
+ for (size_t decoderNdx = 0; decoderNdx < 2; ++decoderNdx)
+ {
+ const bool firstDecoder = (decoderNdx == 0);
+ VideoBaseDecoder* decoder = firstDecoder ? m_decoder1.get() : m_decoder2.get();
+ const bool firstClip = firstDecoder ? true
+ : m_caseDef.testType == TEST_TYPE_H264_H265_DECODE_INTERLEAVED;
+
+ for (int32_t frameNdx = 0; frameNdx < m_frameCountTrigger; ++frameNdx)
+ {
+ decoder->GetVideoFrameBuffer()->DequeueDecodedPicture(&frames[frameNdx]);
+
+ DecodedFrame& frame = frames[frameNdx];
+ const VkExtent2D imageExtent = frame.pDecodedImage->getExtent();
+ const VkImage image = frame.pDecodedImage->getImage();
+ const VkFormat format = frame.pDecodedImage->getFormat();
+ const VkImageLayout layout = frame.decodedImageLayout;
+
+ if (frame.pictureIndex >= 0)
+ {
+ MovePtr<MultiPlaneImageData> resultImage = getDecodedImage(vkd, device, allocator, image, layout, format, imageExtent, queueFamilyIndexTransfer, queueFamilyIndexDecode);
+
+ if (verifyImage(firstClip, frameNdx, *resultImage))
+ framesCorrect++;
+
+ decoder->ReleaseDisplayedFrame(&frame);
+ frameNumber++;
+ }
+ }
+ }
+
+ if (!vulkanVideoDecodeParser2->deinitialize())
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->deinitialize()");
+
+ if (!vulkanVideoDecodeParser1->deinitialize())
+ TCU_THROW(InternalError, "vulkanVideoDecodeParser->deinitialize()");
+
+ if (framesCorrect > 0 && framesCorrect == frameNumber)
+ return tcu::TestStatus::pass("pass");
+ else
+ return tcu::TestStatus::fail("Some frames has not been decoded correctly (" + de::toString(framesCorrect) + "/" + de::toString(frameNumber) + ")");
+}
+
+bool DualVideoDecodeTestInstance::verifyImage (bool firstClip, int32_t frameNumber, const MultiPlaneImageData& multiPlaneImageData)
+{
+ const tcu::UVec2 imageSize = multiPlaneImageData.getSize();
+ const uint32_t k = firstClip ? 1 : 2;
+ const uint32_t barCount = 10;
+ const uint32_t barWidth = 16 * k;
+ const uint32_t barNum = uint32_t(frameNumber) % barCount;
+ const uint32_t edgeX = imageSize.x() - barWidth * barNum;
+ const uint32_t colorNdx = uint32_t(frameNumber) / barCount;
+ const int32_t refColorsV1[] = { 240, 34, 110 };
+ const int32_t refColorsY1[] = { 81, 145, 41 };
+ const int32_t refColorsU1[] = { 90, 0, 0 };
+ const int32_t refColorsV2[] = { 16, 0, 0 };
+ const int32_t refColorsY2[] = { 170, 0, 0 };
+ const int32_t refColorsU2[] = { 166, 0, 0 };
+ const tcu::UVec4 refColorV = tcu::UVec4(firstClip ? refColorsV1[colorNdx] : refColorsV2[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refColorY = tcu::UVec4(firstClip ? refColorsY1[colorNdx] : refColorsY2[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refColorU = tcu::UVec4(firstClip ? refColorsU1[colorNdx] : refColorsU2[colorNdx], 0, 0, 0);
+ const tcu::UVec4 refBlankV = tcu::UVec4(128, 0, 0, 0);
+ const tcu::UVec4 refBlankY = tcu::UVec4( 16, 0, 0, 0);
+ const tcu::UVec4 refBlankU = tcu::UVec4(128, 0, 0, 0);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessV = multiPlaneImageData.getChannelAccess(0);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessY = multiPlaneImageData.getChannelAccess(1);
+ tcu::ConstPixelBufferAccess outPixelBufferAccessU = multiPlaneImageData.getChannelAccess(2);
+ tcu::TextureLevel refPixelBufferV (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::TextureLevel refPixelBufferY (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::TextureLevel refPixelBufferU (mapVkFormat(VK_FORMAT_R8_UNORM), imageSize.x(), imageSize.y());
+ tcu::PixelBufferAccess refPixelBufferAccessV = refPixelBufferV.getAccess();
+ tcu::PixelBufferAccess refPixelBufferAccessY = refPixelBufferY.getAccess();
+ tcu::PixelBufferAccess refPixelBufferAccessU = refPixelBufferU.getAccess();
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ const string titleV = "Rendered frame " + de::toString(frameNumber) + ". V Component";
+ const string titleY = "Rendered frame " + de::toString(frameNumber) + ". Y Component";
+ const string titleU = "Rendered frame " + de::toString(frameNumber) + ". U Component";
+ const tcu::UVec4 threshold = tcu::UVec4(0, 0, 0, 0);
+
+ for (uint32_t x = 0; x < imageSize.x(); ++x)
+ {
+ const tcu::UVec4& colorV = (x < edgeX) ? refColorV : refBlankV;
+ const tcu::UVec4& colorY = (x < edgeX) ? refColorY : refBlankY;
+ const tcu::UVec4& colorU = (x < edgeX) ? refColorU : refBlankU;
+
+ for (uint32_t y = 0; y < imageSize.y(); ++y)
+ {
+ refPixelBufferAccessV.setPixel(colorV, x, y);
+ refPixelBufferAccessY.setPixel(colorY, x, y);
+ refPixelBufferAccessU.setPixel(colorU, x, y);
+ }
+ }
+
+ const bool resultV = tcu::intThresholdCompare(log, titleV.c_str(), "", refPixelBufferAccessV, outPixelBufferAccessV, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultY = tcu::intThresholdCompare(log, titleY.c_str(), "", refPixelBufferAccessY, outPixelBufferAccessY, threshold, tcu::COMPARE_LOG_ON_ERROR);
+ const bool resultU = tcu::intThresholdCompare(log, titleU.c_str(), "", refPixelBufferAccessU, outPixelBufferAccessU, threshold, tcu::COMPARE_LOG_ON_ERROR);
+
+ return resultV && resultY && resultU;
+}
+#endif // DE_OS != DE_OS_ANDROID
+class VideoDecodeTestCase : public TestCase
+{
+ public:
+ VideoDecodeTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef caseDef);
+ ~VideoDecodeTestCase (void);
+
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+private:
+ CaseDef m_caseDef;
+};
+
+VideoDecodeTestCase::VideoDecodeTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef caseDef)
+ : vkt::TestCase (context, name, desc)
+ , m_caseDef (caseDef)
+{
+}
+
+VideoDecodeTestCase::~VideoDecodeTestCase (void)
+{
+}
+
+void VideoDecodeTestCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_video_queue");
+ context.requireDeviceFunctionality("VK_KHR_synchronization2");
+
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_I:
+ case TEST_TYPE_H264_DECODE_I_P:
+ case TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H264_DECODE_I_P_B_13:
+ case TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS:
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE:
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB:
+ case TEST_TYPE_H264_DECODE_INTERLEAVED:
+ case TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED:
+ {
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h264");
+ break;
+ }
+ case TEST_TYPE_H265_DECODE_I:
+ case TEST_TYPE_H265_DECODE_I_P:
+ case TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H265_DECODE_I_P_B_13:
+ case TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER:
+ {
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h265");
+ break;
+ }
+ case TEST_TYPE_H264_H265_DECODE_INTERLEAVED:
+ {
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h264");
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h265");
+ break;
+ }
+ default:
+ TCU_THROW(InternalError, "Unknown TestType");
+ }
+}
+
+TestInstance* VideoDecodeTestCase::createInstance (Context& context) const
+{
+// Vulkan video is unsupported for android platform
+ switch (m_caseDef.testType)
+ {
+ case TEST_TYPE_H264_DECODE_I:
+ case TEST_TYPE_H264_DECODE_I_P:
+ case TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H264_DECODE_I_P_B_13:
+ case TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS:
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE:
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB:
+ case TEST_TYPE_H265_DECODE_I:
+ case TEST_TYPE_H265_DECODE_I_P:
+ case TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER:
+ case TEST_TYPE_H265_DECODE_I_P_B_13:
+ case TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER:
+ {
+#if (DE_OS != DE_OS_ANDROID)
+ return new VideoDecodeTestInstance(context, m_caseDef);
+#endif
+ }
+ case TEST_TYPE_H264_DECODE_INTERLEAVED:
+ case TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED:
+ case TEST_TYPE_H264_H265_DECODE_INTERLEAVED:
+ {
+#if (DE_OS != DE_OS_ANDROID)
+ return new DualVideoDecodeTestInstance(context, m_caseDef);
+#endif
+ }
+ default:
+ TCU_THROW(InternalError, "Unknown TestType");
+ }
+#if (DE_OS == DE_OS_ANDROID)
+ DE_UNREF(context);
+#endif
+
+}
+
+const char* getTestName (const TestType testType)
+{
+ switch (testType)
+ {
+ case TEST_TYPE_H264_DECODE_I: return "h264_i";
+ case TEST_TYPE_H264_DECODE_I_P: return "h264_i_p";
+ case TEST_TYPE_H264_DECODE_I_P_NOT_MATCHING_ORDER: return "h264_i_p_not_matching_order";
+ case TEST_TYPE_H264_DECODE_I_P_B_13: return "h264_i_p_b_13";
+ case TEST_TYPE_H264_DECODE_I_P_B_13_NOT_MATCHING_ORDER: return "h264_i_p_b_13_not_matching_order";
+ case TEST_TYPE_H264_DECODE_QUERY_RESULT_WITH_STATUS: return "h264_query_with_status";
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE: return "h264_resolution_change";
+ case TEST_TYPE_H264_DECODE_RESOLUTION_CHANGE_DPB: return "h264_resolution_change_dpb";
+ case TEST_TYPE_H264_DECODE_INTERLEAVED: return "h264_interleaved";
+ case TEST_TYPE_H264_BOTH_DECODE_ENCODE_INTERLEAVED: return "h264_decode_encode_interleaved";
+ case TEST_TYPE_H264_H265_DECODE_INTERLEAVED: return "h264_h265_interleaved";
+ case TEST_TYPE_H265_DECODE_I: return "h265_i";
+ case TEST_TYPE_H265_DECODE_I_P: return "h265_i_p";
+ case TEST_TYPE_H265_DECODE_I_P_NOT_MATCHING_ORDER: return "h265_i_p_not_matching_order";
+ case TEST_TYPE_H265_DECODE_I_P_B_13: return "h265_i_p_b_13";
+ case TEST_TYPE_H265_DECODE_I_P_B_13_NOT_MATCHING_ORDER: return "h265_i_p_b_13_not_matching_order";
+ default: TCU_THROW(InternalError, "Unknown TestType");
+ }
+}
+} // anonymous
+
+tcu::TestCaseGroup* createVideoDecodeTests (tcu::TestContext& testCtx)
+{
+ MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "decode", "Video decoding session tests"));
+
+ for (int testTypeNdx = 0; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
+ {
+ const TestType testType = static_cast<TestType>(testTypeNdx);
+ const CaseDef caseDef =
+ {
+ testType, // TestType testType;
+ };
+
+ group->addChild(new VideoDecodeTestCase(testCtx, getTestName(testType), "", caseDef));
+ }
+
+ return group.release();
+}
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEODECODETESTS_HPP
+#define _VKTVIDEODECODETESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Decoding Session tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+tcu::TestCaseGroup* createVideoDecodeTests (tcu::TestContext& testCtx);
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEODECODETESTS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding Utility Functions
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoPictureUtils.hpp"
+#include "deMemory.h"
+
+using namespace vk;
+using namespace std;
+
+namespace vkt
+{
+namespace video
+{
+VulkanPicture::VulkanPicture()
+ : m_refCount ()
+{
+ Clear();
+}
+
+VulkanPicture::~VulkanPicture ()
+{
+}
+
+void VulkanPicture::AddRef ()
+{
+ m_refCount++;
+}
+
+void VulkanPicture::Release ()
+{
+ int32_t ref = --m_refCount;
+
+ if (ref == 0)
+ Reset();
+ else
+ DE_ASSERT(ref > 0);
+}
+
+void VulkanPicture::Clear ()
+{
+ DE_ASSERT(m_refCount == 0);
+
+ decodeWidth = 0;
+ decodeHeight = 0;
+ decodeSuperResWidth = 0;
+ deMemset(&reserved, 0, sizeof(reserved));
+}
+
+void VulkanPicture::Reset()
+{
+ DE_ASSERT(m_refCount == 0);
+
+ delete this;
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOPICTUREUTILS_HPP
+#define _VKTVIDEOPICTUREUTILS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding Picture Utility Functions
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "extNvidiaVideoParserIf.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+class VulkanPicture: public INvidiaVulkanPicture
+{
+public:
+ VulkanPicture ();
+ ~VulkanPicture ();
+
+ virtual void AddRef () override;
+ virtual void Release () override;
+ void Reset ();
+
+protected:
+ void Clear ();
+
+ std::atomic<int32_t> m_refCount;
+};
+
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOPICTUREUTILS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Session Ffmpeg Utils
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoSessionFfmpegUtils.hpp"
+#include "vkDefs.hpp"
+#include "tcuPlatform.hpp"
+#include "tcuFunctionLibrary.hpp"
+
+#include "extFFmpegDemuxer.h"
+#include "deMemory.h"
+
+#if (DE_OS == DE_OS_WIN32)
+# define FFMPEG_AVCODEC_LIBRARY_NAME "avcodec-59.dll"
+# define FFMPEG_AVFORMAT_LIBRARY_NAME "avformat-59.dll"
+# define FFMPEG_AVUTIL_LIBRARY_NAME "avutil-57.dll"
+#elif (DE_OS == DE_OS_ANDROID)
+# define FFMPEG_AVCODEC_LIBRARY_NAME "avcodec-59.so"
+# define FFMPEG_AVFORMAT_LIBRARY_NAME "avformat-59.so"
+# define FFMPEG_AVUTIL_LIBRARY_NAME "avutil-57.so"
+#else
+# define FFMPEG_AVCODEC_LIBRARY_NAME "libavcodec.so"
+# define FFMPEG_AVFORMAT_LIBRARY_NAME "libavformat.so"
+# define FFMPEG_AVUTIL_LIBRARY_NAME "libavutil.so"
+#endif
+
+
+namespace vkt
+{
+namespace video
+{
+
+class DataProviderImpl : public FFmpegDemuxer::DataProvider
+{
+public:
+ DataProviderImpl (de::MovePtr<std::vector<deUint8>>& data);
+
+ virtual ~DataProviderImpl () {};
+ virtual int GetData (uint8_t* pBuf, int nBuf);
+ virtual size_t GetDataSize (void) { return m_data->size(); };
+
+ de::MovePtr<std::vector<deUint8>> m_data;
+ size_t m_used;
+};
+
+DataProviderImpl::DataProviderImpl (de::MovePtr<std::vector<deUint8>>& data)
+ : m_data (data)
+ , m_used (0)
+{
+}
+
+int DataProviderImpl::GetData (uint8_t* pBuf, int nBuf)
+{
+ if (nBuf <= 0 || pBuf == DE_NULL)
+ return 0;
+
+ const size_t left = m_data->size() - m_used;
+ const size_t requested = static_cast<size_t>(nBuf);
+ const size_t size = requested < left ? requested : left;
+
+ if (size > 0)
+ {
+ const std::vector<deUint8>& data = *m_data;
+
+ deMemcpy(pBuf, &data[m_used], size);
+
+ m_used += size;
+ }
+
+ return static_cast<int>(size);
+}
+
+class FfmpegDemuxerImpl : public IfcFfmpegDemuxer
+{
+public:
+ FfmpegDemuxerImpl (de::MovePtr<std::vector<deUint8>>& data, FFMpegAPI& api);
+ virtual ~FfmpegDemuxerImpl () {};
+ virtual bool demux (deUint8** pData, deInt64* pSize);
+
+protected:
+ DataProviderImpl m_dataProvider;
+ de::MovePtr<FFmpegDemuxer> m_FFmpegDemuxer;
+};
+
+FfmpegDemuxerImpl::FfmpegDemuxerImpl (de::MovePtr<std::vector<deUint8>>& data, FFMpegAPI& api)
+ : m_dataProvider (data)
+ , m_FFmpegDemuxer (new FFmpegDemuxer(&m_dataProvider, &api))
+{
+}
+
+bool FfmpegDemuxerImpl::demux (deUint8** pData, deInt64* pSize)
+{
+ int size = 0;
+ bool result = m_FFmpegDemuxer->Demux((uint8_t**)pData, &size);
+
+ if (pSize != DE_NULL)
+ *pSize = static_cast<deInt64>(size);
+
+ return result;
+}
+
+class FfmpegFunctionsImpl : public IfcFfmpegFunctions
+{
+public:
+ FfmpegFunctionsImpl ();
+ virtual IfcFfmpegDemuxer* createIfcFfmpegDemuxer (de::MovePtr<std::vector<deUint8>>& data);
+
+protected:
+ tcu::DynamicFunctionLibrary m_functions_avcodec;
+ tcu::DynamicFunctionLibrary m_functions_avformat;
+ tcu::DynamicFunctionLibrary m_functions_avutil;
+
+ FFMpegAPI m_FFmpegApi;
+};
+
+// The following DLLs should be same folder as deqp-vk.exe: avcodec-59.dll avdevice-59.dll avfilter-8.dll avformat-59.dll avutil-57.dll swresample-4.dll swscale-6.dll
+FfmpegFunctionsImpl::FfmpegFunctionsImpl ()
+ : m_functions_avcodec (FFMPEG_AVCODEC_LIBRARY_NAME)
+ , m_functions_avformat (FFMPEG_AVFORMAT_LIBRARY_NAME)
+ , m_functions_avutil (FFMPEG_AVUTIL_LIBRARY_NAME)
+{
+ m_FFmpegApi =
+ {
+ (pFFMpeg_av_malloc) m_functions_avutil.getFunction("av_malloc"), // pFFMpeg_av_malloc av_malloc;
+ (pFFMpeg_av_freep) m_functions_avutil.getFunction("av_freep"), // pFFMpeg_av_freep av_freep;
+ (pFFMpeg_av_init_packet) m_functions_avcodec.getFunction("av_init_packet"), // pFFMpeg_av_init_packet av_init_packet;
+ (pFFMpeg_av_packet_unref) m_functions_avcodec.getFunction("av_packet_unref"), // pFFMpeg_av_packet_unref av_packet_unref;
+ (pFFMpeg_av_bsf_init) m_functions_avcodec.getFunction("av_bsf_init"), // pFFMpeg_av_bsf_init av_bsf_init;
+ (pFFMpeg_av_bsf_send_packet) m_functions_avcodec.getFunction("av_bsf_send_packet"), // pFFMpeg_av_bsf_send_packet av_bsf_send_packet;
+ (pFFMpeg_av_bsf_receive_packet) m_functions_avcodec.getFunction("av_bsf_receive_packet"), // pFFMpeg_av_bsf_receive_packet av_bsf_receive_packet;
+ (pFFMpeg_av_bsf_get_by_name) m_functions_avcodec.getFunction("av_bsf_get_by_name"), // pFFMpeg_av_bsf_get_by_name av_bsf_get_by_name;
+ (pFFMpeg_av_bsf_alloc) m_functions_avcodec.getFunction("av_bsf_alloc"), // pFFMpeg_av_bsf_alloc av_bsf_alloc;
+ (pFFMpeg_avio_alloc_context) m_functions_avformat.getFunction("avio_alloc_context"), // pFFMpeg_avio_alloc_context avio_alloc_context;
+ (pFFMpeg_av_find_best_stream) m_functions_avformat.getFunction("av_find_best_stream"), // pFFMpeg_av_find_best_stream av_find_best_stream;
+ (pFFMpeg_av_read_frame) m_functions_avformat.getFunction("av_read_frame"), // pFFMpeg_av_read_frame av_read_frame;
+ (pFFMpeg_avformat_alloc_context) m_functions_avformat.getFunction("avformat_alloc_context"), // pFFMpeg_avformat_alloc_context avformat_alloc_context;
+ (pFFMpeg_avformat_network_init) m_functions_avformat.getFunction("avformat_network_init"), // pFFMpeg_avformat_network_init avformat_network_init;
+ (pFFMpeg_avformat_find_stream_info) m_functions_avformat.getFunction("avformat_find_stream_info"), // pFFMpeg_avformat_find_stream_info avformat_find_stream_info;
+ (pFFMpeg_avformat_open_input) m_functions_avformat.getFunction("avformat_open_input"), // pFFMpeg_avformat_open_input avformat_open_input;
+ (pFFMpeg_avformat_close_input) m_functions_avformat.getFunction("avformat_close_input"), // pFFMpeg_avformat_close_input avformat_close_input;
+ };
+
+ for (size_t i = 0; i < sizeof(m_FFmpegApi)/sizeof(void*); i++)
+ {
+ const void* p = (void*)((void**)&m_FFmpegApi)[i];
+
+ DE_ASSERT(p != DE_NULL);
+
+ DE_UNREF(p);
+ }
+}
+
+IfcFfmpegDemuxer* FfmpegFunctionsImpl::createIfcFfmpegDemuxer (de::MovePtr<std::vector<deUint8>>& data)
+{
+ return new FfmpegDemuxerImpl(data, m_FFmpegApi);
+}
+
+de::MovePtr<IfcFfmpegFunctions> createIfcFfmpegFunctions ()
+{
+ return de::MovePtr<IfcFfmpegFunctions>(new FfmpegFunctionsImpl());
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOSESSIONFFMPEGUTILS_HPP
+#define _VKTVIDEOSESSIONFFMPEGUTILS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Session Ffmpeg Utils
+ *//*--------------------------------------------------------------------*/
+
+#include "deUniquePtr.hpp"
+#include "deDefs.hpp"
+#include "vkPlatform.hpp"
+#include <vector>
+
+namespace vkt
+{
+namespace video
+{
+
+class IfcFfmpegDemuxer
+{
+public:
+ virtual bool demux (deUint8** pData, deInt64* pSize) = 0;
+ virtual ~IfcFfmpegDemuxer () { }
+};
+
+
+class IfcFfmpegFunctions
+{
+public:
+ virtual IfcFfmpegDemuxer* createIfcFfmpegDemuxer (de::MovePtr<std::vector<deUint8>>& data) = 0;
+ virtual ~IfcFfmpegFunctions () {};
+};
+
+de::MovePtr<IfcFfmpegFunctions> createIfcFfmpegFunctions ();
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOSESSIONFFMPEGUTILS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Session NV Utils
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoSessionNvUtils.hpp"
+#include "vkDefs.hpp"
+#include "vkPlatform.hpp"
+#include "tcuPlatform.hpp"
+#include "tcuFunctionLibrary.hpp"
+#include "deMemory.h"
+
+#include "extNvidiaVideoParserIf.hpp"
+
+namespace vkt
+{
+namespace video
+{
+#if DE_OS == DE_OS_WIN32
+ const char* CreateVulkanVideoDecodeParserFuncName = "?CreateVulkanVideoDecodeParser@@YA_NPEAPEAVVulkanVideoDecodeParser@@W4VkVideoCodecOperationFlagBitsKHR@@PEBUVkExtensionProperties@@P6AXPEBDZZH@Z";
+#else
+ const char* CreateVulkanVideoDecodeParserFuncName = "_Z29CreateVulkanVideoDecodeParserPP23VulkanVideoDecodeParser32VkVideoCodecOperationFlagBitsKHRPK21VkExtensionPropertiesPFvPKczEi";
+#endif
+
+typedef void (*NvidiaParserLogFuncType)(const char* format, ...);
+typedef bool (*CreateVulkanVideoDecodeParserFunc)(NvidiaVulkanVideoDecodeParser** ppobj, vk::VkVideoCodecOperationFlagBitsKHR eCompression, const vk::VkExtensionProperties* extensionProperty, NvidiaParserLogFuncType pParserLogFunc, int logLevel);
+
+void NvidiaParserLogFunc (const char* format, ...)
+{
+ DE_UNREF(format);
+}
+
+class ClsVulkanVideoDecodeParser : public IfcVulkanVideoDecodeParser
+{
+public:
+ ClsVulkanVideoDecodeParser (NvidiaVulkanVideoDecodeParser* vulkanVideoDecodeParser);
+ virtual ~ClsVulkanVideoDecodeParser ();
+
+public:
+ // IfcVulkanVideoDecodeParser commands
+ virtual bool initialize (NvidiaVulkanParserVideoDecodeClient* nvidiaVulkanParserVideoDecodeClient);
+ virtual bool deinitialize (void);
+ virtual bool parseByteStream (deUint8* pData, deInt64 size);
+
+protected:
+ NvidiaVulkanVideoDecodeParser* m_vulkanVideoDecodeParser;
+};
+
+ClsVulkanVideoDecodeParser::ClsVulkanVideoDecodeParser (NvidiaVulkanVideoDecodeParser* vulkanVideoDecodeParser)
+ : m_vulkanVideoDecodeParser (vulkanVideoDecodeParser)
+{
+}
+
+ClsVulkanVideoDecodeParser::~ClsVulkanVideoDecodeParser()
+{
+ if (m_vulkanVideoDecodeParser != DE_NULL)
+ {
+ m_vulkanVideoDecodeParser->Deinitialize();
+
+ m_vulkanVideoDecodeParser->Release();
+
+ m_vulkanVideoDecodeParser = DE_NULL;
+ }
+}
+
+bool ClsVulkanVideoDecodeParser::initialize (NvidiaVulkanParserVideoDecodeClient* nvidiaVulkanParserVideoDecodeClient)
+{
+ DE_ASSERT(m_vulkanVideoDecodeParser != DE_NULL);
+
+ NvidiaVulkanParserInitDecodeParameters parameters =
+ {
+ NV_VULKAN_VIDEO_PARSER_API_VERSION,
+ nvidiaVulkanParserVideoDecodeClient,
+ 0,
+ 0,
+ DE_NULL,
+ true
+ };
+
+ if (m_vulkanVideoDecodeParser->Initialize(¶meters) != vk::VK_SUCCESS)
+ {
+ TCU_THROW(InternalError, "ClsVulkanVideoDecodeParser->Initialize failed");
+ }
+
+ return true;
+}
+
+bool ClsVulkanVideoDecodeParser::deinitialize (void)
+{
+ bool result = true;
+
+ if (m_vulkanVideoDecodeParser != DE_NULL)
+ {
+ result = m_vulkanVideoDecodeParser->Deinitialize();
+
+ m_vulkanVideoDecodeParser = DE_NULL;
+ }
+
+ return result;
+}
+
+bool ClsVulkanVideoDecodeParser::parseByteStream (deUint8* pData, deInt64 size)
+{
+ DE_ASSERT(m_vulkanVideoDecodeParser != DE_NULL);
+
+ int32_t parsed = 0;
+ NvidiaVulkanParserBitstreamPacket pkt;
+
+ deMemset(&pkt, 0, sizeof(pkt));
+
+ pkt.nDataLength = static_cast<int32_t>(size);
+ pkt.pByteStream = pData;
+ pkt.bEOS = (pData == DE_NULL || size == 0);
+
+ bool result = m_vulkanVideoDecodeParser->ParseByteStream(&pkt, &parsed);
+
+ return result && (parsed > 0);
+}
+
+
+class NvFunctions: public IfcNvFunctions
+{
+public:
+ NvFunctions (const vk::Platform& platform);
+ virtual IfcVulkanVideoDecodeParser* createIfcVulkanVideoDecodeParser (VkVideoCodecOperationFlagBitsKHR codecOperation, const VkExtensionProperties* stdExtensionVersion);
+
+private:
+ de::MovePtr<vk::Library> m_library;
+ CreateVulkanVideoDecodeParserFunc m_createVulkanVideoDecodeParserFunc;
+};
+
+NvFunctions::NvFunctions (const vk::Platform& platform)
+#if (DE_OS == DE_OS_ANDROID)
+ : m_library (de::MovePtr<vk::Library>(platform.createLibrary()))
+#else
+ : m_library (de::MovePtr<vk::Library>(platform.createLibrary(vk::Platform::LIBRARY_TYPE_VULKAN_VIDEO_DECODE_PARSER, DE_NULL)))
+#endif
+{
+ const tcu::FunctionLibrary& funcsLibrary = m_library->getFunctionLibrary();
+
+ m_createVulkanVideoDecodeParserFunc = reinterpret_cast<CreateVulkanVideoDecodeParserFunc>(funcsLibrary.getFunction(CreateVulkanVideoDecodeParserFuncName));
+
+ if (m_createVulkanVideoDecodeParserFunc == DE_NULL)
+ TCU_THROW(InternalError, string("Function not found in library: ") + CreateVulkanVideoDecodeParserFuncName);
+}
+
+IfcVulkanVideoDecodeParser* NvFunctions::createIfcVulkanVideoDecodeParser (VkVideoCodecOperationFlagBitsKHR codecOperation, const VkExtensionProperties* stdExtensionVersion)
+{
+ DE_ASSERT(m_createVulkanVideoDecodeParserFunc != DE_NULL);
+
+ NvidiaVulkanVideoDecodeParser* pobj = DE_NULL;
+
+ if (!m_createVulkanVideoDecodeParserFunc(&pobj, codecOperation, stdExtensionVersion, NvidiaParserLogFunc, 0) || pobj == DE_NULL)
+ {
+ return DE_NULL;
+ }
+
+ return new ClsVulkanVideoDecodeParser(pobj);
+}
+
+de::MovePtr<IfcNvFunctions> createIfcNvFunctions (const vk::Platform& platform)
+{
+ return de::MovePtr<IfcNvFunctions>(new NvFunctions(platform));
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOSESSIONNVUTILS_HPP
+#define _VKTVIDEOSESSIONNVUTILS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Session NV Utils
+ *//*--------------------------------------------------------------------*/
+
+#include "deUniquePtr.hpp"
+#include "extNvidiaVideoParserIf.hpp"
+#include "vkPlatform.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+class IfcVulkanVideoDecodeParser
+{
+public:
+ virtual bool parseByteStream (deUint8* pData, deInt64 size) = 0;
+ virtual bool initialize (NvidiaVulkanParserVideoDecodeClient* nvidiaVulkanParserVideoDecodeClient) = 0;
+ virtual bool deinitialize (void) = 0;
+
+ virtual ~IfcVulkanVideoDecodeParser () {}
+};
+
+class IfcNvFunctions
+{
+public:
+ virtual IfcVulkanVideoDecodeParser* createIfcVulkanVideoDecodeParser (VkVideoCodecOperationFlagBitsKHR codecOperation, const VkExtensionProperties* stdExtensionVersion) = 0;
+ virtual ~IfcNvFunctions () {};
+};
+
+de::MovePtr<IfcNvFunctions> createIfcNvFunctions (const vk::Platform& platform);
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOSESSIONNVUTILS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding Utility Functions
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoTestUtils.hpp"
+
+#include "vkDefs.hpp"
+#include "vkMemUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkDeviceUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuResource.hpp"
+
+#include "vktCustomInstancesDevices.hpp"
+#include "vktTestCase.hpp"
+
+#include "vktVideoDecodeTests.hpp"
+
+using namespace vk;
+using namespace std;
+
+namespace vkt
+{
+namespace video
+{
+
+using namespace vk;
+using namespace std;
+
+
+
+void cmdPipelineImageMemoryBarrier2 (const DeviceInterface& vk,
+ const VkCommandBuffer commandBuffer,
+ const VkImageMemoryBarrier2KHR* pImageMemoryBarriers,
+ const size_t imageMemoryBarrierCount,
+ const VkDependencyFlags dependencyFlags)
+{
+ const deUint32 imageMemoryBarrierCount32 = static_cast<deUint32>(imageMemoryBarrierCount);
+ const VkDependencyInfo dependencyInfoKHR =
+ {
+ vk::VK_STRUCTURE_TYPE_DEPENDENCY_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ dependencyFlags, // VkDependencyFlags dependencyFlags;
+ 0u, // deUint32 memoryBarrierCount;
+ DE_NULL, // const VkMemoryBarrier2KHR* pMemoryBarriers;
+ 0u, // deUint32 bufferMemoryBarrierCount;
+ DE_NULL, // const VkBufferMemoryBarrier2KHR* pBufferMemoryBarriers;
+ imageMemoryBarrierCount32, // deUint32 imageMemoryBarrierCount;
+ pImageMemoryBarriers, // const VkImageMemoryBarrier2KHR* pImageMemoryBarriers;
+ };
+
+ DE_ASSERT(imageMemoryBarrierCount == imageMemoryBarrierCount32);
+
+ vk.cmdPipelineBarrier2(commandBuffer, &dependencyInfoKHR);
+}
+
+static VkExtensionProperties makeExtensionProperties(const char* extensionName, deUint32 specVersion)
+{
+ const deUint32 extensionNameLen = static_cast<deUint32>(deStrnlen(extensionName, VK_MAX_EXTENSION_NAME_SIZE));
+ VkExtensionProperties result;
+
+ deMemset(&result, 0, sizeof(result));
+
+ deMemcpy(&result.extensionName, extensionName, extensionNameLen);
+
+ result.specVersion = specVersion;
+
+ return result;
+}
+
+static const VkExtensionProperties EXTENSION_PROPERTIES_H264_DECODE = makeExtensionProperties(VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION);
+static const VkExtensionProperties EXTENSION_PROPERTIES_H264_ENCODE = makeExtensionProperties(VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION);
+static const VkExtensionProperties EXTENSION_PROPERTIES_H265_DECODE = makeExtensionProperties(VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION);
+static const VkExtensionProperties EXTENSION_PROPERTIES_H265_ENCODE = makeExtensionProperties(VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME, VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION);
+
+VideoBaseTestInstance::VideoBaseTestInstance (Context& context)
+ : TestInstance (context)
+ , m_videoDevice (context)
+{
+}
+
+VideoBaseTestInstance::~VideoBaseTestInstance (void)
+{
+}
+
+bool VideoBaseTestInstance::createDeviceSupportingQueue (const VkQueueFlags queueFlagsRequired, const VkVideoCodecOperationFlagsKHR videoCodecOperationFlags, const VideoDevice::VideoDeviceFlags videoDeviceFlags)
+{
+ return m_videoDevice.createDeviceSupportingQueue(queueFlagsRequired, videoCodecOperationFlags, videoDeviceFlags);
+}
+
+VkDevice VideoBaseTestInstance::getDeviceSupportingQueue (const VkQueueFlags queueFlagsRequired, const VkVideoCodecOperationFlagsKHR videoCodecOperationFlags, const VideoDevice::VideoDeviceFlags videoDeviceFlags)
+{
+ return m_videoDevice.getDeviceSupportingQueue(queueFlagsRequired, videoCodecOperationFlags, videoDeviceFlags);
+}
+
+const DeviceDriver& VideoBaseTestInstance::getDeviceDriver (void)
+{
+ return m_videoDevice.getDeviceDriver();
+}
+
+const deUint32& VideoBaseTestInstance::getQueueFamilyIndexTransfer (void)
+{
+ return m_videoDevice.getQueueFamilyIndexTransfer();
+}
+
+const deUint32& VideoBaseTestInstance::getQueueFamilyIndexDecode (void)
+{
+ return m_videoDevice.getQueueFamilyIndexDecode();
+}
+
+const deUint32& VideoBaseTestInstance::getQueueFamilyIndexEncode (void)
+{
+ return m_videoDevice.getQueueFamilyIndexEncode();
+}
+
+Allocator& VideoBaseTestInstance::getAllocator (void)
+{
+ return m_videoDevice.getAllocator();
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoData (const string& filename)
+{
+ tcu::Archive& archive = m_context.getTestContext().getArchive();
+ de::UniquePtr<tcu::Resource> resource (archive.getResource(filename.c_str()));
+ const int resourceSize = resource->getSize();
+ de::MovePtr<vector<deUint8>> result (new vector<deUint8>(resourceSize));
+
+ resource->read(result->data(), resource->getSize());
+
+ return result;
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipA (void)
+{
+ return loadVideoData("vulkan/video/clip-a.mp4");
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipB (void)
+{
+ return loadVideoData("vulkan/video/clip-b.mp4");
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipC (void)
+{
+ return loadVideoData("vulkan/video/clip-c.mp4");
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipD (void)
+{
+ return loadVideoData("vulkan/video/clip-d.mp4");
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipH264G13 (void)
+{
+ return loadVideoData("vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h264.mp4");
+}
+
+de::MovePtr<vector<deUint8>> VideoBaseTestInstance::loadVideoDataClipH265G13 (void)
+{
+ return loadVideoData("vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h265.mp4");
+}
+
+de::MovePtr<VkVideoDecodeCapabilitiesKHR> getVideoDecodeCapabilities (void* pNext)
+{
+ const VkVideoDecodeCapabilitiesKHR videoDecodeCapabilities =
+ {
+ vk::VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, // VkStructureType sType;
+ pNext, // void* pNext;
+ 0, // VkVideoDecodeCapabilityFlagsKHR Flags;
+ };
+
+ return de::MovePtr<VkVideoDecodeCapabilitiesKHR>(new VkVideoDecodeCapabilitiesKHR(videoDecodeCapabilities));
+}
+
+de::MovePtr<VkVideoDecodeH264CapabilitiesKHR> getVideoCapabilitiesExtensionH264D (void)
+{
+ const VkVideoDecodeH264CapabilitiesKHR videoCapabilitiesExtension =
+ {
+ vk::VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ STD_VIDEO_H264_LEVEL_IDC_1_0, // StdVideoH264Level maxLevel;
+ {0, 0}, // VkOffset2D fieldOffsetGranularity;
+ };
+
+ return de::MovePtr<VkVideoDecodeH264CapabilitiesKHR>(new VkVideoDecodeH264CapabilitiesKHR(videoCapabilitiesExtension));
+}
+
+de::MovePtr <VkVideoEncodeH264CapabilitiesEXT> getVideoCapabilitiesExtensionH264E (void)
+{
+ const VkVideoEncodeH264CapabilitiesEXT videoCapabilitiesExtension =
+ {
+ vk::VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkVideoEncodeH264CapabilityFlagsEXT flags;
+ 0u, // VkVideoEncodeH264InputModeFlagsEXT inputModeFlags;
+ 0u, // VkVideoEncodeH264OutputModeFlagsEXT outputModeFlags;
+ 0u, // uint8_t maxPPictureL0ReferenceCount;
+ 0u, // uint8_t maxBPictureL0ReferenceCount;
+ 0u, // uint8_t maxL1ReferenceCount;
+ DE_FALSE, // VkBool32 motionVectorsOverPicBoundariesFlag;
+ 0u, // uint32_t maxBytesPerPicDenom;
+ 0u, // uint32_t maxBitsPerMbDenom;
+ 0u, // uint32_t log2MaxMvLengthHorizontal;
+ 0u, // uint32_t log2MaxMvLengthVertical;
+ };
+
+ return de::MovePtr<VkVideoEncodeH264CapabilitiesEXT>(new VkVideoEncodeH264CapabilitiesEXT(videoCapabilitiesExtension));
+}
+
+de::MovePtr<VkVideoDecodeH265CapabilitiesKHR> getVideoCapabilitiesExtensionH265D (void)
+{
+ const VkVideoDecodeH265CapabilitiesKHR videoCapabilitiesExtension =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ STD_VIDEO_H265_LEVEL_IDC_1_0, // StdVideoH265Level maxLevel;
+ };
+
+ return de::MovePtr<VkVideoDecodeH265CapabilitiesKHR>(new VkVideoDecodeH265CapabilitiesKHR(videoCapabilitiesExtension));
+}
+
+de::MovePtr <VkVideoEncodeH265CapabilitiesEXT> getVideoCapabilitiesExtensionH265E (void)
+{
+ const VkVideoEncodeH265CapabilitiesEXT videoCapabilitiesExtension =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkVideoEncodeH265CapabilityFlagsEXT flags;
+ 0u, // VkVideoEncodeH265InputModeFlagsEXT inputModeFlags;
+ 0u, // VkVideoEncodeH265OutputModeFlagsEXT outputModeFlags;
+ 0u, // VkVideoEncodeH265CtbSizeFlagsEXT ctbSizes;
+ 0u, // VkVideoEncodeH265TransformBlockSizeFlagsEXT transformBlockSizes;
+ 0u, // uint8_t maxPPictureL0ReferenceCount;
+ 0u, // uint8_t maxBPictureL0ReferenceCount;
+ 0u, // uint8_t maxL1ReferenceCount;
+ 0u, // uint8_t maxSubLayersCount;
+ 0u, // uint8_t minLog2MinLumaCodingBlockSizeMinus3;
+ 0u, // uint8_t maxLog2MinLumaCodingBlockSizeMinus3;
+ 0u, // uint8_t minLog2MinLumaTransformBlockSizeMinus2;
+ 0u, // uint8_t maxLog2MinLumaTransformBlockSizeMinus2;
+ 0u, // uint8_t minMaxTransformHierarchyDepthInter;
+ 0u, // uint8_t maxMaxTransformHierarchyDepthInter;
+ 0u, // uint8_t minMaxTransformHierarchyDepthIntra;
+ 0u, // uint8_t maxMaxTransformHierarchyDepthIntra;
+ 0u, // uint8_t maxDiffCuQpDeltaDepth;
+ 0u, // uint8_t minMaxNumMergeCand;
+ 0u, // uint8_t maxMaxNumMergeCand;
+ };
+
+ return de::MovePtr<VkVideoEncodeH265CapabilitiesEXT>(new VkVideoEncodeH265CapabilitiesEXT(videoCapabilitiesExtension));
+}
+
+de::MovePtr<VkVideoCapabilitiesKHR> getVideoCapabilities (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileInfoKHR* videoProfile,
+ void* pNext)
+{
+ VkVideoCapabilitiesKHR* videoCapabilities = new VkVideoCapabilitiesKHR
+ {
+ VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR, // VkStructureType sType;
+ pNext, // void* pNext;
+ 0, // VkVideoCapabilityFlagsKHR capabilityFlags;
+ 0, // VkDeviceSize minBitstreamBufferOffsetAlignment;
+ 0, // VkDeviceSize minBitstreamBufferSizeAlignment;
+ {0, 0}, // VkExtent2D videoPictureExtentGranularity;
+ {0, 0}, // VkExtent2D minExtent;
+ {0, 0}, // VkExtent2D maxExtent;
+ 0, // uint32_t maxReferencePicturesSlotsCount;
+ 0, // uint32_t maxReferencePicturesActiveCount;
+ { { 0 }, 0 }, // VkExtensionProperties stdHeaderVersion;
+ };
+ de::MovePtr<VkVideoCapabilitiesKHR> result = de::MovePtr<VkVideoCapabilitiesKHR>(videoCapabilities);
+
+ VK_CHECK(vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, videoProfile, videoCapabilities));
+
+ return result;
+}
+
+de::MovePtr<VkVideoDecodeH264ProfileInfoKHR> getVideoProfileExtensionH264D (StdVideoH264ProfileIdc stdProfileIdc, VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout)
+{
+ VkVideoDecodeH264ProfileInfoKHR* videoCodecOperation = new VkVideoDecodeH264ProfileInfoKHR(getProfileOperationH264D(stdProfileIdc, pictureLayout));
+ de::MovePtr<VkVideoDecodeH264ProfileInfoKHR> result = de::MovePtr<VkVideoDecodeH264ProfileInfoKHR>(videoCodecOperation);
+
+ return result;
+}
+
+de::MovePtr<VkVideoEncodeH264ProfileInfoEXT> getVideoProfileExtensionH264E (StdVideoH264ProfileIdc stdProfileIdc)
+{
+ VkVideoEncodeH264ProfileInfoEXT* videoCodecOperation = new VkVideoEncodeH264ProfileInfoEXT(getProfileOperationH264E(stdProfileIdc));
+ de::MovePtr<VkVideoEncodeH264ProfileInfoEXT> result = de::MovePtr<VkVideoEncodeH264ProfileInfoEXT>(videoCodecOperation);
+
+ return result;
+}
+
+de::MovePtr<VkVideoDecodeH265ProfileInfoKHR> getVideoProfileExtensionH265D (StdVideoH265ProfileIdc stdProfileIdc)
+{
+ VkVideoDecodeH265ProfileInfoKHR* videoCodecOperation = new VkVideoDecodeH265ProfileInfoKHR(getProfileOperationH265D(stdProfileIdc));
+ de::MovePtr<VkVideoDecodeH265ProfileInfoKHR> result = de::MovePtr<VkVideoDecodeH265ProfileInfoKHR>(videoCodecOperation);
+
+ return result;
+}
+
+de::MovePtr<VkVideoEncodeH265ProfileInfoEXT> getVideoProfileExtensionH265E (StdVideoH265ProfileIdc stdProfileIdc)
+{
+ VkVideoEncodeH265ProfileInfoEXT* videoCodecOperation = new VkVideoEncodeH265ProfileInfoEXT(getProfileOperationH265E(stdProfileIdc));
+ de::MovePtr<VkVideoEncodeH265ProfileInfoEXT> result = de::MovePtr<VkVideoEncodeH265ProfileInfoEXT>(videoCodecOperation);
+
+ return result;
+}
+
+de::MovePtr<VkVideoProfileInfoKHR> getVideoProfile (VkVideoCodecOperationFlagBitsKHR videoCodecOperation,
+ void* pNext,
+ VkVideoChromaSubsamplingFlagsKHR chromaSubsampling,
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth,
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth)
+{
+ VkVideoProfileInfoKHR* videoProfile = new VkVideoProfileInfoKHR
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, // VkStructureType sType;
+ pNext, // void* pNext;
+ videoCodecOperation, // VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ chromaSubsampling, // VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ lumaBitDepth, // VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ chromaBitDepth, // VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+ };
+ de::MovePtr<VkVideoProfileInfoKHR> result = de::MovePtr<VkVideoProfileInfoKHR>(videoProfile);
+
+ return result;
+}
+
+de::MovePtr<VkVideoProfileListInfoKHR> getVideoProfileList (const VkVideoProfileInfoKHR* videoProfile)
+{
+ VkVideoProfileListInfoKHR* videoProfileList = new VkVideoProfileListInfoKHR
+ {
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 1, // uint32_t profileCount;
+ videoProfile, // const VkVideoProfileInfoKHR* pProfiles;
+ };
+
+ de::MovePtr<VkVideoProfileListInfoKHR> result = de::MovePtr<VkVideoProfileListInfoKHR>(videoProfileList);
+
+ return result;
+}
+
+
+const VkExtensionProperties* getVideoExtensionProperties (const VkVideoCodecOperationFlagBitsKHR codecOperation)
+{
+ switch (codecOperation)
+ {
+ case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT: return &EXTENSION_PROPERTIES_H264_ENCODE;
+ case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT: return &EXTENSION_PROPERTIES_H265_ENCODE;
+ case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: return &EXTENSION_PROPERTIES_H264_DECODE;
+ case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: return &EXTENSION_PROPERTIES_H265_DECODE;
+ default: TCU_THROW(InternalError, "Unkown codec operation");
+ }
+}
+
+de::MovePtr<VkVideoSessionCreateInfoKHR> getVideoSessionCreateInfo (deUint32 queueFamilyIndex,
+ const VkVideoProfileInfoKHR* videoProfile,
+ const VkExtent2D& codedExtent,
+ VkFormat pictureFormat,
+ VkFormat referencePicturesFormat,
+ deUint32 maxReferencePicturesSlotsCount,
+ deUint32 maxReferencePicturesActiveCount)
+{
+
+ //FIXME: last spec version accepted by the parser function
+ //const VkExtensionProperties* extensionProperties = getVideoExtensionProperties(videoProfile->videoCodecOperation);
+
+ static const vk::VkExtensionProperties h264StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME, VK_MAKE_VIDEO_STD_VERSION(0, 9, 8) };
+ static const vk::VkExtensionProperties h265StdExtensionVersion = { VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME, VK_MAKE_VIDEO_STD_VERSION(0, 9, 9) };
+
+ VkVideoSessionCreateInfoKHR* videoSessionCreateInfo = new VkVideoSessionCreateInfoKHR
+ {
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ queueFamilyIndex, // uint32_t queueFamilyIndex;
+ static_cast<VkVideoSessionCreateFlagsKHR>(0), // VkVideoSessionCreateFlagsKHR flags;
+ videoProfile, // const VkVideoProfileInfoKHR* pVideoProfile;
+ pictureFormat, // VkFormat pictureFormat;
+ codedExtent, // VkExtent2D maxCodedExtent;
+ referencePicturesFormat, // VkFormat referencePicturesFormat;
+ maxReferencePicturesSlotsCount, // uint32_t maxReferencePicturesSlotsCount;
+ maxReferencePicturesActiveCount, // uint32_t maxReferencePicturesActiveCount;
+ videoProfile->videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR ? &h264StdExtensionVersion : &h265StdExtensionVersion, // const VkExtensionProperties* pStdHeaderVersion;
+ };
+
+ de::MovePtr<VkVideoSessionCreateInfoKHR> result = de::MovePtr<VkVideoSessionCreateInfoKHR>(videoSessionCreateInfo);
+
+ return result;
+}
+
+vector<AllocationPtr> getAndBindVideoSessionMemory (const DeviceInterface& vkd,
+ const VkDevice device,
+ VkVideoSessionKHR videoSession,
+ Allocator& allocator)
+{
+ deUint32 videoSessionMemoryRequirementsCount = 0;
+
+ DE_ASSERT(videoSession != DE_NULL);
+
+ VK_CHECK(vkd.getVideoSessionMemoryRequirementsKHR(device, videoSession, &videoSessionMemoryRequirementsCount, DE_NULL));
+
+ const VkVideoSessionMemoryRequirementsKHR videoGetMemoryPropertiesKHR =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // deUint32 memoryBindIndex;
+ {0ull, 0ull, 0u}, // VkMemoryRequirements memoryRequirements;
+ };
+
+ vector<VkVideoSessionMemoryRequirementsKHR> videoSessionMemoryRequirements (videoSessionMemoryRequirementsCount, videoGetMemoryPropertiesKHR);
+
+ for (size_t ndx = 0; ndx < videoSessionMemoryRequirements.size(); ++ndx)
+ videoSessionMemoryRequirements[ndx].sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR;
+
+ VK_CHECK(vkd.getVideoSessionMemoryRequirementsKHR(device, videoSession, &videoSessionMemoryRequirementsCount, videoSessionMemoryRequirements.data()));
+
+ vector<AllocationPtr> allocations (videoSessionMemoryRequirements.size());
+ vector<VkBindVideoSessionMemoryInfoKHR> videoBindsMemoryKHR (videoSessionMemoryRequirements.size());
+
+ for (size_t ndx = 0; ndx < allocations.size(); ++ndx)
+ {
+ const VkMemoryRequirements& requirements = videoSessionMemoryRequirements[ndx].memoryRequirements;
+ const deUint32 memoryBindIndex = videoSessionMemoryRequirements[ndx].memoryBindIndex;
+ de::MovePtr<Allocation> alloc = allocator.allocate(requirements, MemoryRequirement::Any);
+
+ const VkBindVideoSessionMemoryInfoKHR videoBindMemoryKHR =
+ {
+ VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ memoryBindIndex, // deUint32 memoryBindIndex;
+ alloc->getMemory(), // VkDeviceMemory memory;
+ alloc->getOffset(), // VkDeviceSize memoryOffset;
+ requirements.size, // VkDeviceSize memorySize;
+ };
+
+ allocations[ndx] = alloc;
+
+ videoBindsMemoryKHR[ndx] = videoBindMemoryKHR;
+ }
+
+ VK_CHECK(vkd.bindVideoSessionMemoryKHR(device, videoSession, static_cast<deUint32>(videoBindsMemoryKHR.size()), videoBindsMemoryKHR.data()));
+
+ return allocations;
+}
+
+
+de::MovePtr<vector<VkFormat>> getSupportedFormats (const InstanceInterface& vk,
+ const VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ const VkVideoProfileListInfoKHR* videoProfileList)
+
+{
+ deUint32 videoFormatPropertiesCount = 0u;
+
+ const VkPhysicalDeviceVideoFormatInfoKHR videoFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR, // VkStructureType sType;
+ videoProfileList, // const void* pNext;
+ imageUsageFlags, // VkImageUsageFlags imageUsage;
+ };
+
+ VkVideoFormatPropertiesKHR videoFormatPropertiesKHR = {};
+ videoFormatPropertiesKHR.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
+ videoFormatPropertiesKHR.pNext = DE_NULL;
+
+
+ vector<VkVideoFormatPropertiesKHR> videoFormatProperties;
+ de::MovePtr<vector<VkFormat>> result;
+
+ const VkResult res = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, DE_NULL);
+
+ if (res == VK_ERROR_FORMAT_NOT_SUPPORTED)
+ return de::MovePtr<vector<VkFormat>>(DE_NULL);
+ else
+ VK_CHECK(res);
+
+ videoFormatProperties.resize(videoFormatPropertiesCount, videoFormatPropertiesKHR);
+
+ VK_CHECK(vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, videoFormatProperties.data()));
+
+ DE_ASSERT(videoFormatPropertiesCount == videoFormatProperties.size());
+
+ result = de::MovePtr<vector<VkFormat>>(new vector<VkFormat>);
+
+ result->reserve(videoFormatProperties.size());
+
+ for (const auto& videoFormatProperty : videoFormatProperties)
+ result->push_back(videoFormatProperty.format);
+
+ return result;
+}
+
+VkVideoFormatPropertiesKHR getSupportedFormatProperties (const InstanceInterface& vk,
+ const VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ void* pNext,
+ const VkFormat format)
+
+{
+ if (format == VK_FORMAT_UNDEFINED)
+ return VkVideoFormatPropertiesKHR();
+
+ deUint32 videoFormatPropertiesCount = 0u;
+
+ const VkPhysicalDeviceVideoFormatInfoKHR videoFormatInfo =
+ {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR, // VkStructureType sType;
+ pNext, // const void* pNext;
+ imageUsageFlags, // VkImageUsageFlags imageUsage;
+ };
+
+ VkVideoFormatPropertiesKHR videoFormatPropertiesKHR = {};
+ videoFormatPropertiesKHR.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
+ videoFormatPropertiesKHR.pNext = DE_NULL;
+
+ vector<VkVideoFormatPropertiesKHR> videoFormatProperties;
+
+ const VkResult res = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, DE_NULL);
+
+ if (res == VK_ERROR_FORMAT_NOT_SUPPORTED)
+ return VkVideoFormatPropertiesKHR();
+ else
+ VK_CHECK(res);
+
+ videoFormatProperties.resize(videoFormatPropertiesCount, videoFormatPropertiesKHR);
+
+ VK_CHECK(vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, videoFormatProperties.data()));
+
+ DE_ASSERT(videoFormatPropertiesCount == videoFormatProperties.size());
+
+ for (const auto& videoFormatProperty : videoFormatProperties)
+ {
+ if (videoFormatProperty.format == format)
+ return videoFormatProperty;
+ };
+
+ TCU_THROW(NotSupportedError, "Video format not found in properties list");
+}
+
+
+bool validateVideoExtent (const VkExtent2D& codedExtent, const VkVideoCapabilitiesKHR& videoCapabilities)
+{
+ if (!de::inRange(codedExtent.width, videoCapabilities.minCodedExtent.width, videoCapabilities.maxCodedExtent.width))
+ TCU_THROW(NotSupportedError, "Video width does not fit capabilities");
+
+ if (!de::inRange(codedExtent.height, videoCapabilities.minCodedExtent.height, videoCapabilities.maxCodedExtent.height))
+ TCU_THROW(NotSupportedError, "Video height does not fit capabilities");
+
+ return true;
+}
+
+bool validateFormatSupport (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat format,
+ bool throwException)
+{
+ de::MovePtr<vector<VkFormat>> supportedVideoFormats = getSupportedFormats(vk, physicalDevice, imageUsageFlags, videoProfileList);
+
+ if (supportedVideoFormats != DE_NULL)
+ {
+ if (supportedVideoFormats->size() == 0)
+ if (throwException)
+ TCU_THROW(NotSupportedError, "Supported video formats count is 0");
+
+ for (const auto& supportedVideoFormat : *supportedVideoFormats)
+ {
+ if (supportedVideoFormat == format)
+ return true;
+ }
+
+ if (throwException)
+ TCU_THROW(NotSupportedError, "Required format is not supported for video");
+ }
+ else
+ {
+ if (throwException)
+ TCU_THROW(NotSupportedError, "Separate DPB and DST buffers expected");
+ }
+
+ return false;
+}
+
+bool validateVideoProfileList (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat format,
+ const VkImageUsageFlags usage)
+{
+ VkPhysicalDeviceImageFormatInfo2 imageFormatInfo = {};
+ imageFormatInfo.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
+ imageFormatInfo.pNext = videoProfileList;
+ imageFormatInfo.format = format;
+ imageFormatInfo.usage = usage;
+
+
+ VkImageFormatProperties2 imageFormatProperties = {};
+ imageFormatProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ imageFormatProperties.pNext = DE_NULL;
+
+ const VkResult res = vk.getPhysicalDeviceImageFormatProperties2(physicalDevice, &imageFormatInfo, &imageFormatProperties);
+
+ if (res != VK_SUCCESS)
+ return false;
+ else
+ return true;
+
+}
+
+VkVideoDecodeH264ProfileInfoKHR getProfileOperationH264D (StdVideoH264ProfileIdc stdProfileIdc, VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout)
+{
+ const VkVideoDecodeH264ProfileInfoKHR videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ stdProfileIdc, // StdVideoH264ProfileIdc stdProfileIdc;
+ pictureLayout, // VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout;
+ };
+
+ return videoProfileOperation;
+}
+
+VkVideoEncodeH264ProfileInfoEXT getProfileOperationH264E (StdVideoH264ProfileIdc stdProfileIdc)
+{
+ const VkVideoEncodeH264ProfileInfoEXT videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ stdProfileIdc, // StdVideoH264ProfileIdc stdProfileIdc;
+ };
+
+ return videoProfileOperation;
+}
+
+VkVideoDecodeH265ProfileInfoKHR getProfileOperationH265D (StdVideoH265ProfileIdc stdProfileIdc)
+{
+ const VkVideoDecodeH265ProfileInfoKHR videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ stdProfileIdc, // StdVideoH265ProfileIdc stdProfileIdc;
+ };
+
+ return videoProfileOperation;
+}
+
+VkVideoEncodeH265ProfileInfoEXT getProfileOperationH265E (StdVideoH265ProfileIdc stdProfileIdc)
+{
+ const VkVideoEncodeH265ProfileInfoEXT videoProfileOperation =
+ {
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ stdProfileIdc, // StdVideoH265ProfileIdc stdProfileIdc;
+ };
+
+ return videoProfileOperation;
+}
+
+VkImageCreateInfo makeImageCreateInfo (VkFormat format,
+ const VkExtent2D& extent,
+ const deUint32* queueFamilyIndex,
+ const VkImageUsageFlags usage,
+ void* pNext,
+ const deUint32 arrayLayers)
+{
+
+
+ const VkExtent3D extent3D = makeExtent3D(extent.width, extent.height, 1u);
+
+
+ const VkImageCreateInfo imageCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ pNext, // const void* pNext;
+ (VkImageCreateFlags)0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ extent3D, // VkExtent3D extent;
+ 1, // deUint32 mipLevels;
+ arrayLayers, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+
+ return imageCreateInfo;
+}
+
+de::MovePtr<StdVideoH264SequenceParameterSet> getStdVideoH264SequenceParameterSet (uint32_t width,
+ uint32_t height,
+ StdVideoH264SequenceParameterSetVui* stdVideoH264SequenceParameterSetVui)
+{
+ const StdVideoH264SpsFlags stdVideoH264SpsFlags =
+ {
+ 0u, // uint32_t constraint_set0_flag:1;
+ 0u, // uint32_t constraint_set1_flag:1;
+ 0u, // uint32_t constraint_set2_flag:1;
+ 0u, // uint32_t constraint_set3_flag:1;
+ 0u, // uint32_t constraint_set4_flag:1;
+ 0u, // uint32_t constraint_set5_flag:1;
+ 1u, // uint32_t direct_8x8_inference_flag:1;
+ 0u, // uint32_t mb_adaptive_frame_field_flag:1;
+ 1u, // uint32_t frame_mbs_only_flag:1;
+ 0u, // uint32_t delta_pic_order_always_zero_flag:1;
+ 0u, // uint32_t separate_colour_plane_flag:1;
+ 0u, // uint32_t gaps_in_frame_num_value_allowed_flag:1;
+ 0u, // uint32_t qpprime_y_zero_transform_bypass_flag:1;
+ 0u, // uint32_t frame_cropping_flag:1;
+ 0u, // uint32_t seq_scaling_matrix_present_flag:1;
+ 0u, // uint32_t vui_parameters_present_flag:1;
+ };
+
+ const StdVideoH264SequenceParameterSet stdVideoH264SequenceParameterSet =
+ {
+ stdVideoH264SpsFlags, // StdVideoH264SpsFlags flags;
+ STD_VIDEO_H264_PROFILE_IDC_BASELINE, // StdVideoH264ProfileIdc profile_idc;
+ STD_VIDEO_H264_LEVEL_IDC_4_1, // StdVideoH264Level level_idc;
+ STD_VIDEO_H264_CHROMA_FORMAT_IDC_420, // StdVideoH264ChromaFormatIdc chroma_format_idc;
+ 0u, // uint8_t seq_parameter_set_id;
+ 0u, // uint8_t bit_depth_luma_minus8;
+ 0u, // uint8_t bit_depth_chroma_minus8;
+ 0u, // uint8_t log2_max_frame_num_minus4;
+ STD_VIDEO_H264_POC_TYPE_2, // StdVideoH264PocType pic_order_cnt_type;
+ 0, // int32_t offset_for_non_ref_pic;
+ 0, // int32_t offset_for_top_to_bottom_field;
+ 0u, // uint8_t log2_max_pic_order_cnt_lsb_minus4;
+ 0u, // uint8_t num_ref_frames_in_pic_order_cnt_cycle;
+ 3u, // uint8_t max_num_ref_frames;
+ 0u, // uint8_t reserved1;
+ (width + 15) / 16 - 1, // uint32_t pic_width_in_mbs_minus1;
+ (height + 15) / 16 - 1, // uint32_t pic_height_in_map_units_minus1;
+ 0u, // uint32_t frame_crop_left_offset;
+ 0u, // uint32_t frame_crop_right_offset;
+ 0u, // uint32_t frame_crop_top_offset;
+ 0u, // uint32_t frame_crop_bottom_offset;
+ 0u, // uint32_t reserved2;
+ DE_NULL, // const int32_t* pOffsetForRefFrame;
+ DE_NULL, // const StdVideoH264ScalingLists* pScalingLists;
+ stdVideoH264SequenceParameterSetVui, // const StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui;
+ };
+
+ return de::MovePtr<StdVideoH264SequenceParameterSet>(new StdVideoH264SequenceParameterSet(stdVideoH264SequenceParameterSet));
+}
+
+de::MovePtr<StdVideoH264PictureParameterSet> getStdVideoH264PictureParameterSet (void)
+{
+ const StdVideoH264PpsFlags stdVideoH264PpsFlags =
+ {
+ 1u, // uint32_t transform_8x8_mode_flag:1;
+ 0u, // uint32_t redundant_pic_cnt_present_flag:1;
+ 0u, // uint32_t constrained_intra_pred_flag:1;
+ 1u, // uint32_t deblocking_filter_control_present_flag:1;
+ 0u, // uint32_t weighted_pred_flag:1;
+ 0u, // uint32_4 bottom_field_pic_order_in_frame_present_flag:1;
+ 1u, // uint32_t entropy_coding_mode_flag:1;
+ 0u, // uint32_t pic_scaling_matrix_present_flag;
+ };
+
+ const StdVideoH264PictureParameterSet stdVideoH264PictureParameterSet =
+ {
+ stdVideoH264PpsFlags, // StdVideoH264PpsFlags flags;
+ 0u, // uint8_t seq_parameter_set_id;
+ 0u, // uint8_t pic_parameter_set_id;
+ 2u, // uint8_t num_ref_idx_l0_default_active_minus1;
+ 0u, // uint8_t num_ref_idx_l1_default_active_minus1;
+ STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT, // StdVideoH264WeightedBipredIdc weighted_bipred_idc;
+ -16, // int8_t pic_init_qp_minus26;
+ 0, // int8_t pic_init_qs_minus26;
+ -2, // int8_t chroma_qp_index_offset;
+ -2, // int8_t second_chroma_qp_index_offset;
+ DE_NULL, // const StdVideoH264ScalingLists* pScalingLists;
+ };
+
+ return de::MovePtr<StdVideoH264PictureParameterSet>(new StdVideoH264PictureParameterSet(stdVideoH264PictureParameterSet));
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOTESTUTILS_HPP
+#define _VKTVIDEOTESTUTILS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding Utility Functions
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoTestUtils.hpp"
+
+#include "vkDefs.hpp"
+#include "vkRefUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+using namespace vk;
+using namespace std;
+
+typedef de::MovePtr<Allocation> AllocationPtr;
+
+VkVideoDecodeH264ProfileInfoKHR getProfileOperationH264D (StdVideoH264ProfileIdc stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN,
+ VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR);
+VkVideoEncodeH264ProfileInfoEXT getProfileOperationH264E (StdVideoH264ProfileIdc stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN);
+VkVideoDecodeH265ProfileInfoKHR getProfileOperationH265D (StdVideoH265ProfileIdc stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN);
+VkVideoEncodeH265ProfileInfoEXT getProfileOperationH265E (StdVideoH265ProfileIdc stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN);
+
+de::MovePtr<VkVideoDecodeCapabilitiesKHR> getVideoDecodeCapabilities (void* pNext);
+
+de::MovePtr<VkVideoDecodeH264CapabilitiesKHR> getVideoCapabilitiesExtensionH264D (void);
+de::MovePtr<VkVideoEncodeH264CapabilitiesEXT> getVideoCapabilitiesExtensionH264E (void);
+de::MovePtr<VkVideoDecodeH265CapabilitiesKHR> getVideoCapabilitiesExtensionH265D (void);
+de::MovePtr<VkVideoEncodeH265CapabilitiesEXT> getVideoCapabilitiesExtensionH265E (void);
+de::MovePtr<VkVideoCapabilitiesKHR> getVideoCapabilities (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileInfoKHR* videoProfile,
+ void* pNext);
+
+de::MovePtr<VkVideoDecodeH264ProfileInfoKHR> getVideoProfileExtensionH264D (StdVideoH264ProfileIdc stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN,
+ VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR);
+de::MovePtr<VkVideoEncodeH264ProfileInfoEXT> getVideoProfileExtensionH264E (StdVideoH264ProfileIdc stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN);
+de::MovePtr<VkVideoDecodeH265ProfileInfoKHR> getVideoProfileExtensionH265D (StdVideoH265ProfileIdc stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN);
+de::MovePtr<VkVideoEncodeH265ProfileInfoEXT> getVideoProfileExtensionH265E (StdVideoH265ProfileIdc stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN);
+de::MovePtr<VkVideoProfileInfoKHR> getVideoProfile (VkVideoCodecOperationFlagBitsKHR videoCodecOperation,
+ void* pNext,
+ VkVideoChromaSubsamplingFlagsKHR chromaSubsampling = VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth = VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth = VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR);
+de::MovePtr<VkVideoProfileListInfoKHR> getVideoProfileList (const VkVideoProfileInfoKHR* videoProfile);
+
+const VkExtensionProperties* getVideoExtensionProperties (const VkVideoCodecOperationFlagBitsKHR codecOperation);
+de::MovePtr<VkVideoSessionCreateInfoKHR> getVideoSessionCreateInfo (deUint32 queueFamilyIndex,
+ const VkVideoProfileInfoKHR* videoProfile,
+ const VkExtent2D& codedExtent = { 1920, 1080 },
+ VkFormat pictureFormat = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+ VkFormat referencePicturesFormat = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+ deUint32 maxReferencePicturesSlotsCount = 2u,
+ deUint32 maxReferencePicturesActiveCount = 2u);
+
+vector<AllocationPtr> getAndBindVideoSessionMemory (const DeviceInterface& vkd,
+ const VkDevice device,
+ VkVideoSessionKHR videoSession,
+ Allocator& allocator);
+
+de::MovePtr<vector<VkFormat>> getSupportedFormats (const InstanceInterface& vk,
+ const VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ const VkVideoProfileListInfoKHR* videoProfileList);
+
+VkVideoFormatPropertiesKHR getSupportedFormatProperties (const InstanceInterface& vk,
+ const VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat format);
+bool validateVideoExtent (const VkExtent2D& codedExtent,
+ const VkVideoCapabilitiesKHR& videoCapabilities);
+bool validateFormatSupport (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkImageUsageFlags imageUsageFlags,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat format,
+ const bool throwException = true);
+
+bool validateVideoProfileList (const InstanceInterface& vk,
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileListInfoKHR* videoProfileList,
+ const VkFormat format,
+ const VkImageUsageFlags usage);
+
+VkImageCreateInfo makeImageCreateInfo (VkFormat format,
+ const VkExtent2D& extent,
+ const deUint32* queueFamilyIndex,
+ const VkImageUsageFlags usage,
+ void* pNext,
+ const deUint32 arrayLayers = 1);
+
+de::MovePtr<StdVideoH264SequenceParameterSet> getStdVideoH264SequenceParameterSet (uint32_t width,
+ uint32_t height,
+ StdVideoH264SequenceParameterSetVui* stdVideoH264SequenceParameterSetVui);
+de::MovePtr<StdVideoH264PictureParameterSet> getStdVideoH264PictureParameterSet (void);
+
+void cmdPipelineImageMemoryBarrier2 (const DeviceInterface& vk,
+ const VkCommandBuffer commandBuffer,
+ const VkImageMemoryBarrier2KHR* pImageMemoryBarriers,
+ const size_t imageMemoryBarrierCount = 1u,
+ const VkDependencyFlags dependencyFlags = 0);
+
+class VideoBaseTestInstance : public TestInstance
+{
+public:
+ VideoBaseTestInstance (Context& context);
+ virtual ~VideoBaseTestInstance (void);
+
+ VkDevice getDeviceSupportingQueue (const VkQueueFlags queueFlagsRequired = 0,
+ const VkVideoCodecOperationFlagsKHR videoCodecOperationFlags = 0,
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_NONE);
+ bool createDeviceSupportingQueue (const VkQueueFlags queueFlagsRequired,
+ const VkVideoCodecOperationFlagsKHR videoCodecOperationFlags,
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags = VideoDevice::VIDEO_DEVICE_FLAG_NONE);
+ const DeviceDriver& getDeviceDriver (void);
+ const deUint32& getQueueFamilyIndexTransfer (void);
+ const deUint32& getQueueFamilyIndexDecode (void);
+ const deUint32& getQueueFamilyIndexEncode (void);
+ Allocator& getAllocator (void);
+
+ de::MovePtr<vector<deUint8>> loadVideoDataClipA (void);
+ de::MovePtr<vector<deUint8>> loadVideoDataClipB (void);
+ de::MovePtr<vector<deUint8>> loadVideoDataClipC (void);
+ de::MovePtr<vector<deUint8>> loadVideoDataClipD (void);
+ de::MovePtr<vector<deUint8>> loadVideoDataClipH264G13 (void);
+ de::MovePtr<vector<deUint8>> loadVideoDataClipH265G13 (void);
+
+protected:
+ de::MovePtr<vector<deUint8>> loadVideoData (const string& filename);
+
+ VideoDevice m_videoDevice;
+};
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOTESTUTILS_HPP
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktVideoTests.hpp"
+#include "vktVideoCapabilitiesTests.hpp"
+#include "vktVideoDecodeTests.hpp"
+#include "synchronization/vktSynchronizationTests.hpp"
+
+#include "deUniquePtr.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+using namespace vk;
+
+tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "video", "Video encoding and decoding tests"));
+
+ group->addChild(createVideoCapabilitiesTests(testCtx));
+ group->addChild(createVideoDecodeTests(testCtx));
+
+ {
+ de::MovePtr<tcu::TestCaseGroup> syncGroup(new tcu::TestCaseGroup(testCtx, "synchronization", ""));
+
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR));
+
+ group->addChild(syncGroup.release());
+ }
+
+ {
+ de::MovePtr<tcu::TestCaseGroup> syncGroup(new tcu::TestCaseGroup(testCtx, "synchronization2", ""));
+
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR));
+ syncGroup->addChild(createSynchronizationTests(testCtx, VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR));
+
+ group->addChild(syncGroup.release());
+ }
+
+ return group.release();
+}
+
+} // video
+} // vkt
--- /dev/null
+#ifndef _VKTVIDEOTESTS_HPP
+#define _VKTVIDEOTESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Video Encoding and Decoding tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace video
+{
+
+tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx);
+
+} // video
+} // vkt
+
+#endif // _VKTVIDEOTESTS_HPP
#include "vkQueryUtil.hpp"
#include "vkDeviceUtil.hpp"
#include "vkDebugReportUtil.hpp"
+#include "vkMemUtil.hpp"
#include "tcuCommandLine.hpp"
#include "vktCustomInstancesDevices.hpp"
: instance(vkt::createCustomInstanceWithExtensions(context, extensions))
{
}
+void VideoDevice::checkSupport (Context& context,
+ const VideoCodecOperationFlags videoCodecOperation)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(videoCodecOperation != 0 && isVideoOperation(videoCodecOperation));
+
+ if (isVideoOperation(videoCodecOperation))
+ context.requireDeviceFunctionality("VK_KHR_video_queue");
+
+ if (isVideoEncodeOperation(videoCodecOperation))
+ context.requireDeviceFunctionality("VK_KHR_video_encode_queue");
+
+ if (isVideoDecodeOperation(videoCodecOperation))
+ context.requireDeviceFunctionality("VK_KHR_video_decode_queue");
+
+ if ((videoCodecOperation & vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT) != 0)
+ context.requireDeviceFunctionality("VK_EXT_video_encode_h264");
+
+ if ((videoCodecOperation & vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT) != 0)
+ context.requireDeviceFunctionality("VK_EXT_video_encode_h265");
+
+ if ((videoCodecOperation & vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) != 0)
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h264");
+
+ if ((videoCodecOperation & vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) != 0)
+ context.requireDeviceFunctionality("VK_KHR_video_decode_h265");
+#else
+ DE_UNREF(context);
+ DE_UNREF(videoCodecOperation);
+#endif
+}
+
+VideoDevice::VideoDevice (Context& context)
+ : m_context (context)
+ , m_logicalDevice ()
+ , m_deviceDriver ()
+ , m_allocator ()
+ , m_queueFamilyTransfer (VK_QUEUE_FAMILY_IGNORED)
+ , m_queueFamilyDecode (VK_QUEUE_FAMILY_IGNORED)
+ , m_queueFamilyEncode (VK_QUEUE_FAMILY_IGNORED)
+#ifndef CTS_USES_VULKANSC
+ , m_videoCodecOperation (vk::VK_VIDEO_CODEC_OPERATION_NONE_KHR)
+#else
+ , m_videoCodecOperation (~0u)
+#endif
+{
+}
+
+VideoDevice::VideoDevice (Context& context,
+ const VideoCodecOperationFlags videoCodecOperation,
+ const VideoDeviceFlags videoDeviceFlags)
+ : VideoDevice (context)
+{
+#ifndef CTS_USES_VULKANSC
+ const vk::VkQueueFlags queueFlagsRequired = getQueueFlags(videoCodecOperation);
+ const vk::VkDevice result = getDeviceSupportingQueue(queueFlagsRequired, videoCodecOperation, videoDeviceFlags);
+
+ DE_ASSERT(result != DE_NULL);
+ DE_UNREF(result);
+#else
+ DE_UNREF(videoCodecOperation);
+ DE_UNREF(videoDeviceFlags);
+#endif
+}
+
+VideoDevice::~VideoDevice (void)
+{
+}
+
+vk::VkQueueFlags VideoDevice::getQueueFlags (const VideoCodecOperationFlags videoCodecOperation)
+{
+#ifndef CTS_USES_VULKANSC
+ const vk::VkQueueFlags queueFlagsRequired = (isVideoEncodeOperation(videoCodecOperation) ? vk::VK_QUEUE_VIDEO_ENCODE_BIT_KHR : 0)
+ | (isVideoDecodeOperation(videoCodecOperation) ? vk::VK_QUEUE_VIDEO_DECODE_BIT_KHR : 0);
+
+ return queueFlagsRequired;
+#else
+ DE_UNREF(videoCodecOperation);
+
+ return 0;
+#endif
+}
+
+bool VideoDevice::isVideoEncodeOperation (const VideoCodecOperationFlags videoCodecOperationFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ const vk::VkVideoCodecOperationFlagsKHR encodeOperations = vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT
+ | vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT;
+
+ return (encodeOperations & videoCodecOperationFlags) != 0;
+#else
+ DE_UNREF(videoCodecOperationFlags);
+
+ return false;
+#endif
+}
+
+bool VideoDevice::isVideoDecodeOperation (const VideoCodecOperationFlags videoCodecOperationFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ const vk::VkVideoCodecOperationFlagsKHR decodeOperations = vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
+ | vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
+
+ return (decodeOperations & videoCodecOperationFlags) != 0;
+#else
+ DE_UNREF(videoCodecOperationFlags);
+
+ return false;
+#endif
+}
+
+bool VideoDevice::isVideoOperation (const VideoCodecOperationFlags videoCodecOperationFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ return isVideoDecodeOperation(videoCodecOperationFlags) || isVideoEncodeOperation(videoCodecOperationFlags);
+#else
+ DE_UNREF(videoCodecOperationFlags);
+
+ return false;
+#endif
+}
+
+void VideoDevice::addVideoDeviceExtensions (std::vector<const char*>& deviceExtensions,
+ const uint32_t apiVersion,
+ const vk::VkQueueFlags queueFlagsRequired,
+ const VideoCodecOperationFlags videoCodecOperationFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ static const char videoQueue[] = "VK_KHR_video_queue";
+ static const char videoEncodeQueue[] = "VK_KHR_video_encode_queue";
+ static const char videoDecodeQueue[] = "VK_KHR_video_decode_queue";
+ static const char videoEncodeH264[] = "VK_EXT_video_encode_h264";
+ static const char videoEncodeH265[] = "VK_EXT_video_encode_h265";
+ static const char videoDecodeH264[] = "VK_KHR_video_decode_h264";
+ static const char videoDecodeH265[] = "VK_KHR_video_decode_h265";
+
+ if (!vk::isCoreDeviceExtension(apiVersion, videoQueue))
+ deviceExtensions.push_back(videoQueue);
+
+ if ((queueFlagsRequired & vk::VK_QUEUE_VIDEO_ENCODE_BIT_KHR) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoEncodeQueue))
+ deviceExtensions.push_back(videoEncodeQueue);
+
+ if ((queueFlagsRequired & vk::VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoDecodeQueue))
+ deviceExtensions.push_back(videoDecodeQueue);
+
+ if ((videoCodecOperationFlags & vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoEncodeH264))
+ deviceExtensions.push_back(videoEncodeH264);
+
+ if ((videoCodecOperationFlags & vk::VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoEncodeH265))
+ deviceExtensions.push_back(videoEncodeH265);
+
+ if ((videoCodecOperationFlags & vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoDecodeH265))
+ deviceExtensions.push_back(videoDecodeH265);
+
+ if ((videoCodecOperationFlags & vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) != 0)
+ if (!vk::isCoreDeviceExtension(apiVersion, videoDecodeH264))
+ deviceExtensions.push_back(videoDecodeH264);
+#else
+ DE_UNREF(deviceExtensions);
+ DE_UNREF(apiVersion);
+ DE_UNREF(queueFlagsRequired);
+ DE_UNREF(videoCodecOperationFlags);
+#endif
+}
+
+vk::VkDevice VideoDevice::getDeviceSupportingQueue (const vk::VkQueueFlags queueFlagsRequired,
+ const VideoCodecOperationFlags videoCodecOperationFlags,
+ const VideoDevice::VideoDeviceFlags videoDeviceFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ if (*m_logicalDevice == DE_NULL)
+ {
+ DE_ASSERT(static_cast<deUint32>(queueFlagsRequired) != 0u);
+ DE_ASSERT(static_cast<deUint32>(videoCodecOperationFlags) != 0u);
+
+ if (!createDeviceSupportingQueue(queueFlagsRequired, videoCodecOperationFlags, videoDeviceFlags))
+ TCU_THROW(NotSupportedError, "Cannot create device with required parameters");
+ }
+
+ return *m_logicalDevice;
+#else
+ DE_UNREF(queueFlagsRequired);
+ DE_UNREF(videoCodecOperationFlags);
+ DE_UNREF(videoDeviceFlags);
+
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+bool VideoDevice::createDeviceSupportingQueue (const vk::VkQueueFlags queueFlagsRequired,
+ const VideoCodecOperationFlags videoCodecOperationFlags,
+ const VideoDeviceFlags videoDeviceFlags)
+{
+#ifndef CTS_USES_VULKANSC
+ const vk::PlatformInterface& vkp = m_context.getPlatformInterface();
+ const vk::InstanceInterface& vki = m_context.getInstanceInterface();
+ const vk::VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const vk::VkInstance instance = m_context.getInstance();
+ const deUint32 apiVersion = m_context.getUsedApiVersion();
+ const bool validationEnabled = m_context.getTestContext().getCommandLine().isValidationEnabled();
+ const bool queryWithStatusForDecodeSupport = (videoDeviceFlags & VIDEO_DEVICE_FLAG_QUERY_WITH_STATUS_FOR_DECODE_SUPPORT) != 0;
+ const bool requireYCBCRorNotSupported = (videoDeviceFlags & VIDEO_DEVICE_FLAG_REQUIRE_YCBCR_OR_NOT_SUPPORTED) != 0;
+ const bool requireSync2orNotSupported = (videoDeviceFlags & VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED) != 0;
+ const float queueFamilyPriority = 1.0f;
+ deUint32 queueFamilyPropertiesCount = 0u;
+ deUint32 queueFamilyTransfer = VK_QUEUE_FAMILY_IGNORED;
+ deUint32 queueFamilyDecode = VK_QUEUE_FAMILY_IGNORED;
+ deUint32 queueFamilyEncode = VK_QUEUE_FAMILY_IGNORED;
+ vk::VkQueueFlags queueFlagsFound = 0;
+ vector<vk::VkQueueFamilyProperties2> queueFamilyProperties2;
+ vector<vk::VkQueueFamilyVideoPropertiesKHR> videoQueueFamilyProperties2;
+ vector<vk::VkQueueFamilyQueryResultStatusPropertiesKHR> VkQueueFamilyQueryResultStatusPropertiesKHR;
+ vector<const char*> deviceExtensions;
+ vector<vk::VkDeviceQueueCreateInfo> queueInfos;
+
+ DE_ASSERT(queueFlagsRequired != 0);
+ DE_ASSERT(videoCodecOperationFlags != 0);
+
+ vki.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, DE_NULL);
+
+ if(queueFamilyPropertiesCount == 0u)
+ TCU_FAIL("Device reports an empty set of queue family properties");
+
+ queueFamilyProperties2.resize(queueFamilyPropertiesCount);
+ videoQueueFamilyProperties2.resize(queueFamilyPropertiesCount);
+ VkQueueFamilyQueryResultStatusPropertiesKHR.resize(queueFamilyPropertiesCount);
+
+ for (size_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ {
+ queueFamilyProperties2[ndx].sType = vk::VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
+ queueFamilyProperties2[ndx].pNext = &videoQueueFamilyProperties2[ndx];
+ videoQueueFamilyProperties2[ndx].sType = vk::VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
+ videoQueueFamilyProperties2[ndx].pNext = &VkQueueFamilyQueryResultStatusPropertiesKHR[ndx];
+ videoQueueFamilyProperties2[ndx].videoCodecOperations = 0;
+ VkQueueFamilyQueryResultStatusPropertiesKHR[ndx].sType = vk::VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR;
+ VkQueueFamilyQueryResultStatusPropertiesKHR[ndx].pNext = DE_NULL;
+ VkQueueFamilyQueryResultStatusPropertiesKHR[ndx].queryResultStatusSupport = DE_FALSE;
+ }
+
+ vki.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, queueFamilyProperties2.data());
+
+ if (queueFamilyPropertiesCount != queueFamilyProperties2.size())
+ TCU_FAIL("Device returns less queue families than initially reported");
+
+ for (uint32_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
+ {
+ const vk::VkQueueFamilyProperties& queueFamilyProperties = queueFamilyProperties2[ndx].queueFamilyProperties;
+ const vk::VkQueueFlags usefulQueueFlags = queueFamilyProperties.queueFlags & queueFlagsRequired & ~queueFlagsFound;
+
+ if (usefulQueueFlags != 0)
+ {
+ bool assigned = false;
+
+ if ((usefulQueueFlags & vk::VK_QUEUE_TRANSFER_BIT) != 0 && queueFamilyTransfer == VK_QUEUE_FAMILY_IGNORED)
+ {
+ queueFamilyTransfer = ndx;
+ assigned = true;
+ }
+
+ if ((videoQueueFamilyProperties2[ndx].videoCodecOperations & videoCodecOperationFlags) != 0)
+ {
+ if ((usefulQueueFlags & vk::VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0 && queueFamilyDecode == VK_QUEUE_FAMILY_IGNORED)
+ {
+ if (!queryWithStatusForDecodeSupport || (queryWithStatusForDecodeSupport && VkQueueFamilyQueryResultStatusPropertiesKHR[ndx].queryResultStatusSupport))
+ {
+ queueFamilyDecode = ndx;
+ assigned = true;
+ }
+ }
+
+ if ((usefulQueueFlags & vk::VK_QUEUE_VIDEO_ENCODE_BIT_KHR) != 0 && queueFamilyEncode == VK_QUEUE_FAMILY_IGNORED)
+ {
+ queueFamilyEncode = ndx;
+ assigned = true;
+ }
+ }
+
+ if (assigned)
+ {
+ const vk::VkDeviceQueueCreateInfo queueInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (vk::VkDeviceQueueCreateFlags)0u, // VkDeviceQueueCreateFlags flags;
+ ndx, // deUint32 queueFamilyIndex;
+ 1u, // deUint32 queueCount;
+ &queueFamilyPriority, // const float* pQueuePriorities;
+ };
+
+ if (queueFamilyProperties.queueCount == 0)
+ TCU_FAIL("Video queue returned queueCount is zero");
+
+ queueInfos.push_back(queueInfo);
+
+ queueFlagsFound |= usefulQueueFlags;
+
+ if (queueFlagsFound == queueFlagsRequired)
+ break;
+ }
+ }
+ }
+
+ if (queueFlagsFound != queueFlagsRequired)
+ return false;
+
+ addVideoDeviceExtensions(deviceExtensions, apiVersion, queueFlagsRequired, videoCodecOperationFlags);
+
+ if (requireYCBCRorNotSupported)
+ if (!vk::isCoreDeviceExtension(apiVersion, "VK_KHR_sampler_ycbcr_conversion"))
+ deviceExtensions.push_back("VK_KHR_sampler_ycbcr_conversion");
+
+ if (requireSync2orNotSupported)
+ if (!vk::isCoreDeviceExtension(apiVersion, "VK_KHR_synchronization2"))
+ deviceExtensions.push_back("VK_KHR_synchronization2");
+
+ vk::VkPhysicalDeviceSynchronization2FeaturesKHR synchronization2Features =
+ {
+ vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ DE_FALSE, // VkBool32 synchronization2;
+ };
+ vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYcbcrConversionFeatures =
+ {
+ vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ DE_FALSE, // VkBool32 samplerYcbcrConversion;
+ };
+ vk::VkPhysicalDeviceFeatures2 features2 =
+ {
+ vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, // VkStructureType sType;
+ DE_NULL, // void* pNext;
+ vk::VkPhysicalDeviceFeatures(), // VkPhysicalDeviceFeatures features;
+ };
+
+ if (requireYCBCRorNotSupported)
+ appendStructurePtrToVulkanChain((const void**)&features2.pNext, &samplerYcbcrConversionFeatures);
+
+ if (requireSync2orNotSupported)
+ appendStructurePtrToVulkanChain((const void**)&features2.pNext, &synchronization2Features);
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+
+ if (requireYCBCRorNotSupported && samplerYcbcrConversionFeatures.samplerYcbcrConversion == DE_FALSE)
+ TCU_THROW(NotSupportedError, "samplerYcbcrConversionFeatures.samplerYcbcrConversion is required");
+
+ if (requireSync2orNotSupported && synchronization2Features.synchronization2 == DE_FALSE)
+ TCU_THROW(NotSupportedError, "synchronization2Features.synchronization2 is required");
+
+ features2.features.robustBufferAccess = DE_FALSE;
+
+ const vk::VkDeviceCreateInfo deviceCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
+ &features2, // const void* pNext;
+ (vk::VkDeviceCreateFlags)0, // VkDeviceCreateFlags flags;
+ static_cast<uint32_t>(queueInfos.size()), // deUint32 queueCreateInfoCount;
+ de::dataOrNull(queueInfos), // const VkDeviceQueueCreateInfo* pQueueCreateInfos;
+ 0u, // deUint32 enabledLayerCount;
+ DE_NULL, // const char* const* ppEnabledLayerNames;
+ deUint32(deviceExtensions.size()), // deUint32 enabledExtensionCount;
+ de::dataOrNull(deviceExtensions), // const char* const* ppEnabledExtensionNames;
+ DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
+ };
+
+ m_logicalDevice = createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceCreateInfo);
+ m_deviceDriver = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, instance, *m_logicalDevice));
+ m_allocator = de::MovePtr<vk::Allocator>(new vk::SimpleAllocator(*m_deviceDriver, *m_logicalDevice, getPhysicalDeviceMemoryProperties(vki, physicalDevice)));
+ m_queueFamilyTransfer = queueFamilyTransfer;
+ m_queueFamilyDecode = queueFamilyDecode;
+ m_queueFamilyEncode = queueFamilyEncode;
+ m_videoCodecOperation = videoCodecOperationFlags;
+
+ return true;
+#else
+ DE_UNREF(queueFlagsRequired);
+ DE_UNREF(videoCodecOperationFlags);
+ DE_UNREF(videoDeviceFlags);
+
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+const vk::DeviceDriver& VideoDevice::getDeviceDriver (void)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(m_deviceDriver.get() != DE_NULL);
+
+ return *m_deviceDriver;
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+const deUint32& VideoDevice::getQueueFamilyIndexTransfer (void)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(m_queueFamilyTransfer != VK_QUEUE_FAMILY_IGNORED);
+
+ return m_queueFamilyTransfer;
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+const deUint32& VideoDevice::getQueueFamilyIndexDecode (void)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(m_queueFamilyDecode != VK_QUEUE_FAMILY_IGNORED);
+
+ return m_queueFamilyDecode;
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+const deUint32& VideoDevice::getQueueFamilyIndexEncode (void)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(m_queueFamilyEncode != VK_QUEUE_FAMILY_IGNORED);
+
+ return m_queueFamilyEncode;
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+const deUint32& VideoDevice::getQueueFamilyVideo (void)
+{
+#ifndef CTS_USES_VULKANSC
+ const bool encode = isVideoEncodeOperation(m_videoCodecOperation);
+ const bool decode = isVideoDecodeOperation(m_videoCodecOperation);
+
+ DE_ASSERT((encode && !decode) || (!encode && decode));
+ DE_UNREF(decode);
+
+ return encode ? getQueueFamilyIndexEncode() : getQueueFamilyIndexDecode();
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
+
+vk::Allocator& VideoDevice::getAllocator (void)
+{
+#ifndef CTS_USES_VULKANSC
+ DE_ASSERT(m_allocator != DE_NULL);
+
+ return *m_allocator;
+#else
+ TCU_THROW(NotSupportedError, "Video is not supported for Vulkan SC");
+#endif
+}
}
vkt::CustomInstance instance;
};
+class VideoDevice
+{
+public:
+#ifndef CTS_USES_VULKANSC
+ typedef vk::VkVideoCodecOperationFlagsKHR VideoCodecOperationFlags;
+#else
+ typedef uint32_t VideoCodecOperationFlags;
+#endif // CTS_USES_VULKANSC
+
+ enum VideoDeviceFlagBits
+ {
+ VIDEO_DEVICE_FLAG_NONE = 0,
+ VIDEO_DEVICE_FLAG_QUERY_WITH_STATUS_FOR_DECODE_SUPPORT = 0x00000001,
+ VIDEO_DEVICE_FLAG_REQUIRE_YCBCR_OR_NOT_SUPPORTED = 0x00000002,
+ VIDEO_DEVICE_FLAG_REQUIRE_SYNC2_OR_NOT_SUPPORTED = 0x00000004
+ };
+ typedef uint32_t VideoDeviceFlags;
+
+ static void checkSupport (Context& context,
+ const VideoCodecOperationFlags videoCodecOperation);
+ static vk::VkQueueFlags getQueueFlags (const VideoCodecOperationFlags videoCodecOperationFlags);
+
+ static void addVideoDeviceExtensions (std::vector<const char*>& deviceExtensions,
+ const uint32_t apiVersion,
+ const vk::VkQueueFlags queueFlagsRequired,
+ const VideoCodecOperationFlags videoCodecOperationFlags);
+ static bool isVideoEncodeOperation (const VideoCodecOperationFlags videoCodecOperationFlags);
+ static bool isVideoDecodeOperation (const VideoCodecOperationFlags videoCodecOperationFlags);
+ static bool isVideoOperation (const VideoCodecOperationFlags videoCodecOperationFlags);
+
+ VideoDevice (Context& context);
+ VideoDevice (Context& context,
+ const VideoCodecOperationFlags videoCodecOperation,
+ const VideoDeviceFlags videoDeviceFlags = VIDEO_DEVICE_FLAG_NONE);
+ virtual ~VideoDevice (void);
+
+ vk::VkDevice getDeviceSupportingQueue (const vk::VkQueueFlags queueFlagsRequired = 0,
+ const VideoCodecOperationFlags videoCodecOperationFlags = 0,
+ const VideoDeviceFlags videoDeviceFlags = VIDEO_DEVICE_FLAG_NONE);
+ bool createDeviceSupportingQueue (const vk::VkQueueFlags queueFlagsRequired,
+ const VideoCodecOperationFlags videoCodecOperationFlags,
+ const VideoDeviceFlags videoDeviceFlags = VIDEO_DEVICE_FLAG_NONE);
+ const vk::DeviceDriver& getDeviceDriver (void);
+ const deUint32& getQueueFamilyIndexTransfer (void);
+ const deUint32& getQueueFamilyIndexDecode (void);
+ const deUint32& getQueueFamilyIndexEncode (void);
+ const deUint32& getQueueFamilyVideo (void);
+ vk::Allocator& getAllocator (void);
+
+protected:
+ Context& m_context;
+
+ vk::Move<vk::VkDevice> m_logicalDevice;
+ de::MovePtr<vk::DeviceDriver> m_deviceDriver;
+ de::MovePtr<vk::Allocator> m_allocator;
+ deUint32 m_queueFamilyTransfer;
+ deUint32 m_queueFamilyDecode;
+ deUint32 m_queueFamilyEncode;
+ VideoCodecOperationFlags m_videoCodecOperation;
+};
+
}
#endif // _VKTCUSTOMINSTANCESDEVICES_HPP
#ifdef CTS_USES_VULKANSC
#include "vktSafetyCriticalTests.hpp"
#endif // CTS_USES_VULKANSC
+#include "vktVideoTests.hpp"
#include <vector>
#include <sstream>
static MovePtr<vk::Library> createLibrary (tcu::TestContext& testCtx)
{
+#if (DE_OS == DE_OS_ANDROID)
return MovePtr<vk::Library>(testCtx.getPlatform().getVulkanPlatform().createLibrary(testCtx.getCommandLine().getVkLibraryPath()));
+#else
+ return MovePtr<vk::Library>(testCtx.getPlatform().getVulkanPlatform().createLibrary(vk::Platform::LIBRARY_TYPE_VULKAN, testCtx.getCommandLine().getVkLibraryPath()));
+#endif
}
static vk::VkPhysicalDeviceProperties getPhysicalDeviceProperties(vkt::Context& context)
addChild(FragmentShadingBarycentric::createTests(m_testCtx));
// Amber depth pipeline tests
addChild(cts_amber::createAmberDepthGroup (m_testCtx));
+ addChild(video::createTests (m_testCtx));
}
void ExperimentalTestPackage::init (void)
vk-default/texture.txt
vk-default/transform-feedback.txt
vk-default/ubo.txt
+vk-default/video.txt
vk-default/wsi.txt
vk-default/ycbcr.txt
dEQP-VK.api.info.get_physical_device_properties2.features.depth_clamp_zero_one_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.address_binding_report_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.fault_features_ext
+dEQP-VK.api.info.get_physical_device_properties2.features.swapchain_maintenance1_features_ext
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted11_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted12_structures
dEQP-VK.api.info.get_physical_device_properties2.features.create_device_with_promoted13_structures
dEQP-VK.api.device_init.create_device_unsupported_features.optical_flow_features_nv
dEQP-VK.api.device_init.create_device_unsupported_features.fault_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.shader_core_builtins_features_arm
+dEQP-VK.api.device_init.create_device_unsupported_features.swapchain_maintenance1_features_ext
dEQP-VK.api.device_init.create_device_unsupported_features.ray_tracing_invocation_reorder_features_nv
+dEQP-VK.api.device_init.create_device_unsupported_features.multiview_per_view_viewports_features_qcom
dEQP-VK.api.device_init.create_device_queue2.basic
dEQP-VK.api.device_init.create_instance_device_intentional_alloc_fail.basic
dEQP-VK.api.device_init.create_device_queue2_two_queues.basic
dEQP-VK.synchronization.op.multi_queue.timeline_semaphore.write_update_index_buffer_read_index_input.buffer_20_concurrent
dEQP-VK.synchronization.internally_synchronized_objects.pipeline_cache_compute
dEQP-VK.synchronization.internally_synchronized_objects.pipeline_cache_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.low.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.medium.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.high.semaphore.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.no_sync.sparse_protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.no_modifiers.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.protected.from_compute_to_graphics
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_graphics_to_compute
-dEQP-VK.synchronization.global_priority_transition.realtime.semaphore.sparse_protected.from_compute_to_graphics
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_binary_semaphore_fd
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_timeline_semaphore_fd
dEQP-VK.synchronization.cross_instance.suballocated.write_fill_buffer_read_copy_buffer.buffer_16384_binary_semaphore_fence_fd
--- /dev/null
+dEQP-VK.video.synchronization2.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization2.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization2.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization2.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization2.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.encode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.encode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.encode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.encode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.encode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.encode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h264.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h264.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h264.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h264.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h264.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h264.basic.timeline_semaphore.two_threads
+dEQP-VK.video.synchronization.decode_h265.basic.event.host_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.device_set_reset
+dEQP-VK.video.synchronization.decode_h265.basic.event.single_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.event.multi_submit_multi_command_buffer
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi
+dEQP-VK.video.synchronization.decode_h265.basic.fence.empty_submit
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multi_waitall_false
+dEQP-VK.video.synchronization.decode_h265.basic.fence.one_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.fence.multiple_signaled
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.one_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.multi_queue_typed
+dEQP-VK.video.synchronization.decode_h265.basic.binary_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.one_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.multi_queue
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.chain
+dEQP-VK.video.synchronization.decode_h265.basic.timeline_semaphore.two_threads
+dEQP-VK.video.decode.h264_i
+dEQP-VK.video.decode.h264_i_p
+dEQP-VK.video.decode.h264_i_p_b_13
+dEQP-VK.video.decode.h264_i_p_not_matching_order
+dEQP-VK.video.decode.h264_i_p_b_13_not_matching_order
+dEQP-VK.video.decode.h264_query_with_status
+dEQP-VK.video.decode.h264_resolution_change
+dEQP-VK.video.decode.h264_resolution_change_dpb
+dEQP-VK.video.decode.h264_interleaved
+dEQP-VK.video.decode.h264_decode_encode_interleaved
+dEQP-VK.video.decode.h264_h265_interleaved
+dEQP-VK.video.decode.h265_i
+dEQP-VK.video.decode.h265_i_p
+dEQP-VK.video.decode.h265_i_p_not_matching_order
+dEQP-VK.video.decode.h265_i_p_b_13
+dEQP-VK.video.decode.h265_i_p_b_13_not_matching_order
+dEQP-VK.video.capabilities.queue_support_query
+dEQP-VK.video.capabilities.h264_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h264_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_dst_video_format_support_query
+dEQP-VK.video.capabilities.h265_decode_spb_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_src_video_format_support_query
+dEQP-VK.video.capabilities.h265_encode_dpb_video_format_support_query
+dEQP-VK.video.capabilities.h264_decode_capabilities_query
+dEQP-VK.video.capabilities.h264_encode_capabilities_query
+dEQP-VK.video.capabilities.h265_decode_capabilities_query
+dEQP-VK.video.capabilities.h265_encode_capabilities_query
structMembers
))
elif category == "define":
- if typeNode.get("requires") == "VK_MAKE_API_VERSION":
+ requires = typeNode.get("requires")
+ if requires == "VK_MAKE_API_VERSION" or requires == "VK_MAKE_VIDEO_STD_VERSION":
value = typeNode.find("type").tail
- value = 'VK_MAKE_API_VERSION' + value[:value.find(')')+1]
+ value = requires + value[:value.find(')')+1]
self.defines.append(Define(
typeNode.find("name").text,
"uint32_t",
"StdVideoEncodeH265SliceSegmentHeaderFlags",
"StdVideoEncodeH265ReferenceModificationFlags",
"StdVideoEncodeH265ReferenceInfoFlags",
+ "StdVideoEncodeH265SliceSegmentHeaderFlags",
"StdVideoH265ProfileTierLevelFlags",
- "StdVideoH265ShortTermRefPicSetFlags"
+ "StdVideoH265ShortTermRefPicSetFlags",
])
def isSimpleStruct (type):
--- /dev/null
+{
+ "register_extension":
+ {
+ "type": "device",
+ "core": ""
+ }
+}
\ No newline at end of file
tcu::DirArchive archive {""};
tcu::TestLog log { cmdLine.getOption<opt::LogFile>().c_str() }; log.supressLogging(true);
de::SharedPtr<tcu::Platform> platform {createPlatform()};
- de::SharedPtr<vk::Library> library {platform->getVulkanPlatform().createLibrary(DE_NULL)};
+ de::SharedPtr<vk::Library> library {platform->getVulkanPlatform().createLibrary(vk::Platform::LIBRARY_TYPE_VULKAN, DE_NULL)};
tcu::TestContext tcx {*platform, archive, log, cmdLineDummy, nullptr};
vk::BinaryCollection collection {};
vkt::Context context (tcx, library->getPlatformInterface(), collection, de::SharedPtr<vk::ResourceInterface>{new vk::ResourceInterfaceStandard{ tcx }});
tcu::DirArchive archive {""};
tcu::TestLog log { logFile.c_str() }; log.supressLogging(true);
tcu::Platform* platform {createPlatform()};
- vk::Library* library {platform->getVulkanPlatform().createLibrary(DE_NULL)};
+ vk::Library* library {platform->getVulkanPlatform().createLibrary(vk::Platform::LIBRARY_TYPE_VULKAN, DE_NULL)};
tcu::TestContext* tcx = new tcu::TestContext{*platform, archive, log, cmdLine, nullptr};
vk::ResourceInterface* resource = new vk::ResourceInterfaceStandard{*tcx};
vk::BinaryCollection* collection = new vk::BinaryCollection{};
--- /dev/null
+#
+# Find the native FFMPEG includes and library
+# This module defines
+# FFMPEG_INCLUDE_DIR, where to find avcodec.h, avformat.h ...
+# FFMPEG_LIBRARIES, the libraries to link against to use FFMPEG.
+# FFMPEG_FOUND, If false, do not try to use FFMPEG.
+# FFMPEG_ROOT, if this module use this path to find FFMPEG headers
+# and libraries.
+
+# Macro to find header and lib directories
+# example: FFMPEG_FIND(AVFORMAT avformat avformat.h)
+MACRO(FFMPEG_FIND varname shortname headername)
+ # old version of ffmpeg put header in $prefix/include/[ffmpeg]
+ # so try to find header in include directory
+ FIND_PATH(FFMPEG_${varname}_INCLUDE_DIRS lib${shortname}/${headername}
+ PATHS
+ ${FFMPEG_ROOT}/include/lib${shortname}
+ $ENV{FFMPEG_DIR}/include/lib${shortname}
+ ~/Library/Frameworks/lib${shortname}
+ /Library/Frameworks/lib${shortname}
+ /usr/local/include/lib${shortname}
+ /usr/include/lib${shortname}
+ /sw/include/lib${shortname} # Fink
+ /opt/local/include/lib${shortname} # DarwinPorts
+ /opt/csw/include/lib${shortname} # Blastwave
+ /opt/include/lib${shortname}
+ /usr/freeware/include/lib${shortname}
+ PATH_SUFFIXES ffmpeg
+ DOC "Location of FFMPEG Headers"
+ )
+
+ FIND_PATH(FFMPEG_${varname}_INCLUDE_DIRS lib${shortname}/${headername}
+ PATHS
+ ${FFMPEG_ROOT}/include
+ $ENV{FFMPEG_DIR}/include
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local/include
+ /usr/include
+ /sw/include # Fink
+ /opt/local/include # DarwinPorts
+ /opt/csw/include # Blastwave
+ /opt/include
+ /usr/freeware/include
+ PATH_SUFFIXES ffmpeg
+ DOC "Location of FFMPEG Headers"
+ )
+
+ FIND_LIBRARY(FFMPEG_${varname}_LIBRARIES
+ NAMES ${shortname}
+ PATHS
+ ${FFMPEG_ROOT}/lib
+ $ENV{FFMPEG_DIR}/lib
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local/lib
+ /usr/local/lib64
+ /usr/lib/x86_64-linux-gnu
+ /usr/lib
+ /usr/lib64
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ /usr/freeware/lib64
+ DOC "Location of FFMPEG Libraries"
+ )
+
+ IF (FFMPEG_${varname}_LIBRARIES AND FFMPEG_${varname}_INCLUDE_DIRS)
+ SET(FFMPEG_${varname}_FOUND 1)
+ ENDIF(FFMPEG_${varname}_LIBRARIES AND FFMPEG_${varname}_INCLUDE_DIRS)
+
+ENDMACRO(FFMPEG_FIND)
+
+SET(FFMPEG_ROOT "$ENV{FFMPEG_DIR}" CACHE PATH "Location of FFMPEG")
+
+# find stdint.h
+IF(WIN32)
+
+ FIND_PATH(FFMPEG_STDINT_INCLUDE_DIR stdint.h
+ PATHS
+ ${FFMPEG_ROOT}/include
+ $ENV{FFMPEG_DIR}/include
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /usr/local/include
+ /usr/include
+ /sw/include # Fink
+ /opt/local/include # DarwinPorts
+ /opt/csw/include # Blastwave
+ /opt/include
+ /usr/freeware/include
+ PATH_SUFFIXES ffmpeg
+ DOC "Location of FFMPEG stdint.h Header"
+ )
+
+ IF (FFMPEG_STDINT_INCLUDE_DIR)
+ SET(STDINT_OK TRUE)
+ ENDIF()
+
+ELSE()
+
+ SET(STDINT_OK TRUE)
+
+ENDIF()
+
+FFMPEG_FIND(LIBAVFORMAT avformat avformat.h)
+#FFMPEG_FIND(LIBAVDEVICE avdevice avdevice.h)
+FFMPEG_FIND(LIBAVCODEC avcodec avcodec.h)
+FFMPEG_FIND(LIBAVUTIL avutil avutil.h)
+#FFMPEG_FIND(LIBSWSCALE swscale swscale.h) # not sure about the header to look for here.
+#FFMPEG_FIND(LIBX264 x264 x264.h)
+#FFMPEG_FIND(LIBX265 x265 x265.h)
+
+SET(FFMPEG_FOUND "NO")
+
+# Note we don't check FFMPEG_LIBSWSCALE_FOUND, FFMPEG_LIBAVDEVICE_FOUND,
+# and FFMPEG_LIBAVUTIL_FOUND as they are optional.
+IF (FFMPEG_LIBAVFORMAT_FOUND AND FFMPEG_LIBAVCODEC_FOUND AND STDINT_OK)
+
+ SET(FFMPEG_FOUND "YES")
+
+ SET(FFMPEG_INCLUDE_DIR ${FFMPEG_LIBAVFORMAT_INCLUDE_DIRS})
+
+ SET(FFMPEG_LIBRARY_DIRS ${FFMPEG_LIBAVFORMAT_LIBRARY_DIRS})
+
+ # Note we don't add FFMPEG_LIBSWSCALE_LIBRARIES here,
+ # it will be added if found later.
+ SET(FFMPEG_LIBRARIES
+ ${FFMPEG_LIBAVFORMAT_LIBRARIES}
+ ${FFMPEG_LIBAVDEVICE_LIBRARIES}
+ ${FFMPEG_LIBAVCODEC_LIBRARIES}
+ ${FFMPEG_LIBAVUTIL_LIBRARIES}
+ ${FFMPEG_LIBSWSCALE_LIBRARIES}
+ ${FFMPEG_LIBX264_LIBRARIES}
+ ${FFMPEG_LIBX265_LIBRARIES})
+ENDIF()
/* Posix implementation. */
#include <dlfcn.h>
+#include <libgen.h>
+#include <stdlib.h>
struct deDynamicLibrary_s
{
if (!library)
return DE_NULL;
- library->libHandle = dlopen(fileName, RTLD_LAZY);
+ if (getenv("LD_LIBRARY_PATH"))
+ library->libHandle = dlopen(basename((char*)fileName), RTLD_LAZY);
+ else
+ library->libHandle = dlopen(fileName, RTLD_LAZY);
+
if (!library->libHandle)
{
deFree(library);
const vk::PlatformDriver m_driver;
};
+class VulkanVideoDecodeParserLibrary : public vk::Library
+{
+public:
+ VulkanVideoDecodeParserLibrary(void)
+ : m_library("./libnvidia-vkvideo-parser.so")
+ {
+ }
+
+ const vk::PlatformInterface& getPlatformInterface(void) const
+ {
+ TCU_THROW(InternalError, "getPlatformInterface is not possible for VulkanVideoDecodeParserLibrary");
+ }
+ const tcu::FunctionLibrary& getFunctionLibrary(void) const
+ {
+ return m_library;
+ }
+
+private:
+ const tcu::DynamicFunctionLibrary m_library;
+};
+
+
VulkanPlatform::VulkanPlatform (EventState& eventState)
: m_eventState(eventState)
{
}
}
-vk::Library* VulkanPlatform::createLibrary (const char* libraryPath) const
+
+vk::Library* VulkanPlatform::createLibrary (LibraryType libraryType, const char* libraryPath) const
{
- return new VulkanLibrary(libraryPath);
+ switch(libraryType)
+ {
+ case LIBRARY_TYPE_VULKAN: return new VulkanLibrary(libraryPath);
+ case LIBRARY_TYPE_VULKAN_VIDEO_DECODE_PARSER: return new VulkanVideoDecodeParserLibrary();
+
+ default: TCU_THROW(InternalError, "Unknown library type requested");
+ }
}
void VulkanPlatform::describePlatform (std::ostream& dst) const
public:
VulkanPlatform (EventState& eventState);
vk::wsi::Display* createWsiDisplay (vk::wsi::Type wsiType) const;
- vk::Library* createLibrary (const char* libraryPath) const;
+ vk::Library* createLibrary (LibraryType libraryType = LIBRARY_TYPE_VULKAN, const char* libraryPath = DE_NULL) const;
bool hasDisplay (vk::wsi::Type wsiType) const;
void describePlatform (std::ostream& dst) const;
{
}
-vk::Library* Platform::createLibrary (const char* libraryPath) const
+vk::Library* Platform::createLibrary (vk::Platform::LibraryType, const char* libraryPath) const
{
DE_UNREF(libraryPath);
return vk::createNullDriver();
virtual void getMemoryLimits (tcu::PlatformMemoryLimits& limits) const;
private:
- virtual vk::Library* createLibrary (const char* libraryPath) const;
+ virtual vk::Library* createLibrary (vk::Platform::LibraryType libraryType = vk::Platform::LIBRARY_TYPE_VULKAN, const char* libraryPath = DE_NULL) const;
};
} // null
const vk::PlatformDriver m_driver;
};
+class VulkanVideoDecodeParserLibrary : public vk::Library
+{
+public:
+ VulkanVideoDecodeParserLibrary(void)
+ : m_library("nvidia-vkvideo-parser.dll")
+ {
+ }
+
+ const vk::PlatformInterface& getPlatformInterface(void) const
+ {
+ TCU_THROW(InternalError, "getPlatformInterface is not possible for VulkanVideoDecodeParserLibrary");
+ }
+ const tcu::FunctionLibrary& getFunctionLibrary(void) const
+ {
+ return m_library;
+ }
+
+private:
+ const tcu::DynamicFunctionLibrary m_library;
+};
+
+
VulkanPlatform::VulkanPlatform (HINSTANCE instance)
: m_instance(instance)
{
{
}
-vk::Library* VulkanPlatform::createLibrary (const char* libraryPath) const
+vk::Library* VulkanPlatform::createLibrary (LibraryType libraryType, const char* libraryPath) const
{
- return new VulkanLibrary(libraryPath);
+ switch(libraryType)
+ {
+ case LIBRARY_TYPE_VULKAN: return new VulkanLibrary(libraryPath);
+ case LIBRARY_TYPE_VULKAN_VIDEO_DECODE_PARSER: return new VulkanVideoDecodeParserLibrary();
+ default: TCU_THROW(InternalError, "Unknown library type requested");
+ }
}
ULONG getStringRegKey (const std::string& regKey, const std::string& strValueName, std::string& strValue)
VulkanPlatform (HINSTANCE instance);
~VulkanPlatform (void);
- vk::Library* createLibrary (const char* libraryPath) const;
+ vk::Library* createLibrary (LibraryType libraryType = LIBRARY_TYPE_VULKAN, const char* libraryPat = DE_NULL) const;
vk::wsi::Display* createWsiDisplay (vk::wsi::Type wsiType) const;
bool hasDisplay (vk::wsi::Type wsiType) const;
void describePlatform (std::ostream& dst) const;
".pkm",
".xcf",
".nspv",
+ ".h264",
+ ".h265",
+ ".mp4",
".diff"
]