Video tests plan for VK_KHR_video_queue
authorMarcin Zając <marcin.zajac@mobica.com>
Thu, 31 Mar 2022 12:50:57 +0000 (14:50 +0200)
committerMarcin Zając <marcin.zajac@mobica.com>
Tue, 20 Dec 2022 09:16:42 +0000 (10:16 +0100)
Test coverage for vulkan video

Add tests:
 * dEQP-VK.video.capabilities.*
 * dEQP-VK.video.decode.h264*
 * dEQP-VK.video.decode.h265*
 * dEQP-VK.video.synchronization.*
 * dEQP-VK.video.synchronization2.*

Affect tests:
 * dEQP-VK.*

Components: Framework, Vulkan

VK-GL-CTS issue: 2847

Change-Id: Ie15b46132b8260771074f011f33fed59357b7a5b

105 files changed:
AndroidGen.mk
CMakeLists.txt
android/cts/main/vk-master-2022-03-01.txt
android/cts/main/vk-master-2022-03-01/api.txt
android/cts/main/vk-master-2022-03-01/synchronization.txt
android/cts/main/vk-master-2022-03-01/video.txt [new file with mode: 0644]
android/cts/main/vk-master.txt
android/cts/main/vk-master/api.txt
android/cts/main/vk-master/synchronization.txt
android/cts/main/vk-master/video.txt [new file with mode: 0644]
external/fetch_sources.py
external/ffmpeg/.gitignore [new file with mode: 0644]
external/ffmpeg/CMakeLists.txt [new file with mode: 0644]
external/video-parser/.gitignore [new file with mode: 0644]
external/vulkancts/data/vulkan/video/clip-a.mp4 [new file with mode: 0644]
external/vulkancts/data/vulkan/video/clip-b.mp4 [new file with mode: 0644]
external/vulkancts/data/vulkan/video/clip-c.mp4 [new file with mode: 0644]
external/vulkancts/data/vulkan/video/clip-d.mp4 [new file with mode: 0644]
external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h264.mp4 [new file with mode: 0644]
external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h265.mp4 [new file with mode: 0644]
external/vulkancts/framework/vulkan/CMakeLists.txt
external/vulkancts/framework/vulkan/generated/vulkan/vkApiExtensionDependencyInfo.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkConcreteDeviceInterface.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceDriverImpl.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceExtensions.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeatureTest.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeatures.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeatures2.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeaturesForContextDecl.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeaturesForContextDefs.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkExtensionFunctions.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkFunctionPointerTypes.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkGetStructureTypeImpl.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkInitDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkNullDriverImpl.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkStructTypes.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkVirtualDeviceInterface.inl
external/vulkancts/framework/vulkan/generated/vulkan/vkVulkan_c.inl
external/vulkancts/framework/vulkan/generated/vulkansc/vkDeviceExtensions.inl
external/vulkancts/framework/vulkan/generated/vulkansc/vulkan_json_data.hpp
external/vulkancts/framework/vulkan/generated/vulkansc/vulkan_json_parser.hpp
external/vulkancts/framework/vulkan/vkBarrierUtil.cpp
external/vulkancts/framework/vulkan/vkDefs.hpp
external/vulkancts/framework/vulkan/vkPlatform.hpp
external/vulkancts/framework/vulkan/vkTypeUtil.hpp
external/vulkancts/modules/vulkan/CMakeLists.txt
external/vulkancts/modules/vulkan/api/vktApiBufferMemoryRequirementsTests.cpp
external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp
external/vulkancts/modules/vulkan/rasterization/vktRasterizationOrderAttachmentAccessTests.cpp
external/vulkancts/modules/vulkan/synchronization/CMakeLists.txt
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.hpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicFenceTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicFenceTests.hpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.hpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationDefs.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTests.hpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationUtil.hpp
external/vulkancts/modules/vulkan/video/CMakeLists.txt [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/extFFmpegDemuxer.h [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/extNvidiaVideoParserIf.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoTestUtils.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoTestUtils.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/video/vktVideoTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp
external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp
external/vulkancts/modules/vulkan/vktTestPackage.cpp
external/vulkancts/mustpass/main/vk-default.txt
external/vulkancts/mustpass/main/vk-default/api.txt
external/vulkancts/mustpass/main/vk-default/synchronization.txt
external/vulkancts/mustpass/main/vk-default/video.txt [new file with mode: 0644]
external/vulkancts/scripts/gen_framework.py
external/vulkancts/scripts/src/extensions/VK_KHR_video_queue.json [new file with mode: 0644]
external/vulkancts/vkscpc/vkscpc.cpp
external/vulkancts/vkscserver/vksServices.cpp
framework/delibs/cmake/FindFFmpeg.cmake [new file with mode: 0644]
framework/delibs/deutil/deDynamicLibrary.c
framework/platform/lnx/tcuLnxVulkanPlatform.cpp
framework/platform/lnx/tcuLnxVulkanPlatform.hpp
framework/platform/null/tcuNullPlatform.cpp
framework/platform/null/tcuNullPlatform.hpp
framework/platform/win32/tcuWin32VulkanPlatform.cpp
framework/platform/win32/tcuWin32VulkanPlatform.hpp
scripts/src_util/common.py

index bb70b97..658cb95 100644 (file)
@@ -587,6 +587,14 @@ LOCAL_SRC_FILES := \
        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 \
@@ -1365,6 +1373,7 @@ LOCAL_C_INCLUDES := \
        $(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 \
index d45b8b6..a633455 100644 (file)
@@ -3,6 +3,7 @@
 # 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)
 
@@ -115,6 +116,29 @@ include_directories(external/jsoncpp/src/include)
 # 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
index 83a235a..4865fe4 100644 (file)
@@ -36,5 +36,6 @@ vk-master-2022-03-01/synchronization.txt
 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
index 9b491fe..576901f 100644 (file)
@@ -41,6 +41,7 @@ dEQP-VK.api.info.get_physical_device_properties2.features.attachment_feedback_lo
 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
@@ -1721,7 +1722,9 @@ dEQP-VK.api.device_init.create_device_unsupported_features.address_binding_repor
 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
index cf192f7..3711cf2 100644 (file)
@@ -1,67 +1,3 @@
-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
diff --git a/android/cts/main/vk-master-2022-03-01/video.txt b/android/cts/main/vk-master-2022-03-01/video.txt
new file mode 100644 (file)
index 0000000..d0d5095
--- /dev/null
@@ -0,0 +1,181 @@
+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
index bc5e1eb..395ff1e 100644 (file)
@@ -46,5 +46,6 @@ vk-master/tessellation.txt
 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
index 067947c..8656bb9 100644 (file)
@@ -1980,6 +1980,7 @@ dEQP-VK.api.info.get_physical_device_properties2.features.attachment_feedback_lo
 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
@@ -42483,7 +42484,9 @@ dEQP-VK.api.device_init.create_device_unsupported_features.address_binding_repor
 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
index cab42c0..6806407 100644 (file)
@@ -27215,70 +27215,6 @@ dEQP-VK.synchronization.op.multi_queue.timeline_semaphore.write_update_index_buf
 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
diff --git a/android/cts/main/vk-master/video.txt b/android/cts/main/vk-master/video.txt
new file mode 100644 (file)
index 0000000..d0d5095
--- /dev/null
@@ -0,0 +1,181 @@
+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
index 72be2af..4f40526 100644 (file)
@@ -24,6 +24,7 @@ import os
 import sys
 import shutil
 import tarfile
+import zipfile
 import hashlib
 import argparse
 import subprocess
@@ -51,9 +52,9 @@ class Source:
        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)
 
@@ -66,6 +67,12 @@ class SourcePackage (Source):
                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()
@@ -145,7 +152,11 @@ class SourcePackage (Source):
                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)
@@ -291,6 +302,11 @@ PACKAGES = [
                "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",
@@ -315,7 +331,7 @@ PACKAGES = [
        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",
@@ -327,6 +343,11 @@ PACKAGES = [
                "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 ():
@@ -356,11 +377,34 @@ 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)
diff --git a/external/ffmpeg/.gitignore b/external/ffmpeg/.gitignore
new file mode 100644 (file)
index 0000000..671f540
--- /dev/null
@@ -0,0 +1,2 @@
+src
+packages
diff --git a/external/ffmpeg/CMakeLists.txt b/external/ffmpeg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..95ae796
--- /dev/null
@@ -0,0 +1,70 @@
+# 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 ()
diff --git a/external/video-parser/.gitignore b/external/video-parser/.gitignore
new file mode 100644 (file)
index 0000000..671f540
--- /dev/null
@@ -0,0 +1,2 @@
+src
+packages
diff --git a/external/vulkancts/data/vulkan/video/clip-a.mp4 b/external/vulkancts/data/vulkan/video/clip-a.mp4
new file mode 100644 (file)
index 0000000..c49e099
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/clip-a.mp4 differ
diff --git a/external/vulkancts/data/vulkan/video/clip-b.mp4 b/external/vulkancts/data/vulkan/video/clip-b.mp4
new file mode 100644 (file)
index 0000000..bb62d1d
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/clip-b.mp4 differ
diff --git a/external/vulkancts/data/vulkan/video/clip-c.mp4 b/external/vulkancts/data/vulkan/video/clip-c.mp4
new file mode 100644 (file)
index 0000000..afed786
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/clip-c.mp4 differ
diff --git a/external/vulkancts/data/vulkan/video/clip-d.mp4 b/external/vulkancts/data/vulkan/video/clip-d.mp4
new file mode 100644 (file)
index 0000000..8a46171
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/clip-d.mp4 differ
diff --git a/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h264.mp4 b/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h264.mp4
new file mode 100644 (file)
index 0000000..f0790dd
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h264.mp4 differ
diff --git a/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h265.mp4 b/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h265.mp4
new file mode 100644 (file)
index 0000000..dde0444
Binary files /dev/null and b/external/vulkancts/data/vulkan/video/jellyfish-250-mbps-4k-uhd-GOB-IPB13.h265.mp4 differ
index cfd893b..56efc01 100644 (file)
@@ -12,6 +12,7 @@ else()
        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)
@@ -227,6 +228,8 @@ PCH(VKUTILNOSHADER_INLS ../../modules/vulkan/pch.cpp)
 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)
@@ -266,3 +269,4 @@ add_library(vkscutil STATIC ${VKUTIL_SRCS})
 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)
+
index 3815efb..ee27b09 100644 (file)
@@ -87,6 +87,14 @@ static const std::tuple<deUint32, deUint32, deUint32, const char*, const char*>
        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"),
@@ -136,10 +144,10 @@ static const std::tuple<deUint32, deUint32, deUint32, const char*, const char*>
        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"),
@@ -273,10 +281,10 @@ static const std::tuple<deUint32, deUint32, deUint32, const char*, const char*>
        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"),
@@ -374,6 +382,15 @@ static const std::tuple<deUint32, deUint32, deUint32, const char*, const char*>
        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"),
@@ -610,7 +627,7 @@ static const std::tuple<deUint32, deUint32, const char*>    extensionRequiredCoreVe
        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"),
@@ -729,7 +746,7 @@ static const std::tuple<deUint32, deUint32, const char*>    extensionRequiredCoreVe
        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"),
@@ -792,6 +809,8 @@ static const std::tuple<deUint32, deUint32, const char*>    extensionRequiredCoreVe
        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"),
@@ -878,6 +897,7 @@ static const std::tuple<deUint32, deUint32, const char*>    extensionRequiredCoreVe
        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"),
@@ -885,6 +905,7 @@ static const std::tuple<deUint32, deUint32, const char*>    extensionRequiredCoreVe
        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"),
index 66d0e7e..6579883 100644 (file)
@@ -3,34 +3,38 @@
  * 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);
@@ -1539,12 +1543,12 @@ enum VkStructureType
        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,
@@ -1805,12 +1809,12 @@ enum VkStructureType
        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,
@@ -1914,6 +1918,15 @@ enum VkStructureType
        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,
@@ -2130,6 +2143,8 @@ enum VkStructureType
        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,
@@ -2147,6 +2162,7 @@ enum VkStructureType
        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,
@@ -3537,6 +3553,14 @@ typedef uint64_t VkMemoryDecompressionMethodFlagBitsNV;
 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,
@@ -3906,6 +3930,7 @@ enum VkSwapchainCreateFlagBitsKHR
        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
 };
 
@@ -4145,6 +4170,22 @@ enum VkDeviceFaultAddressTypeEXT
        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,
@@ -4239,8 +4280,8 @@ enum VkPipelineExecutableStatisticFormatKHR
 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
@@ -4310,12 +4351,12 @@ enum VkVideoDecodeCapabilityFlagBitsKHR
        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
@@ -4938,6 +4979,8 @@ typedef uint32_t VkBuildMicromapFlagsEXT;
 
 typedef uint32_t VkMicromapCreateFlagsEXT;
 
+typedef uint32_t VkDirectDriverLoadingFlagsLUNARG;
+
 typedef uint32_t VkCompositeAlphaFlagsKHR;
 
 typedef uint32_t VkDisplayPlaneAlphaFlagsKHR;
@@ -5102,6 +5145,10 @@ typedef uint32_t VkOpticalFlowSessionCreateFlagsNV;
 
 typedef uint32_t VkOpticalFlowExecuteFlagsNV;
 
+typedef uint32_t VkPresentScalingFlagsEXT;
+
+typedef uint32_t VkPresentGravityFlagsEXT;
+
 typedef uint32_t VkVideoCodecOperationFlagsKHR;
 
 typedef uint32_t VkVideoCapabilityFlagsKHR;
@@ -5122,7 +5169,7 @@ typedef uint32_t VkVideoDecodeCapabilityFlagsKHR;
 
 typedef uint32_t VkVideoDecodeFlagsKHR;
 
-typedef uint32_t VkVideoDecodeH264PictureLayoutFlagsEXT;
+typedef uint32_t VkVideoDecodeH264PictureLayoutFlagsKHR;
 
 typedef uint32_t VkVideoEncodeFlagsKHR;
 
@@ -5225,9 +5272,9 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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"
@@ -5251,8 +5298,8 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
@@ -5489,8 +5536,8 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
@@ -5615,6 +5662,10 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                       void*)
 #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
@@ -5787,6 +5838,8 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
@@ -5801,6 +5854,8 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
@@ -5814,7 +5869,7 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
@@ -5841,7 +5896,7 @@ VK_DEFINE_PLATFORM_TYPE(MTLSharedEvent_id,                        void*)
 #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
index dc189c6..3507f05 100644 (file)
@@ -451,3 +451,4 @@ virtual void                                destroyOpticalFlowSessionNV                                                             (VkDevice device, VkOpticalFl
 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;
index e0ec58f..ee1c30c 100644 (file)
@@ -2243,3 +2243,8 @@ VkResult DeviceDriver::getDeviceFaultInfoEXT (VkDevice device, VkDeviceFaultCoun
 {
        return m_vk.getDeviceFaultInfoEXT(device, pFaultCounts, pFaultInfo);
 }
+
+VkResult DeviceDriver::releaseSwapchainImagesEXT (VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) const
+{
+       return m_vk.releaseSwapchainImagesEXT(device, pReleaseInfo);
+}
index 60e4a05..4fae821 100644 (file)
@@ -76,6 +76,7 @@ static const char* s_allowedDeviceKhrExtensions[] =
        "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",
index 3fefa95..06bad3d 100644 (file)
@@ -6868,6 +6868,53 @@ tcu::TestStatus createDeviceWithUnsupportedFeaturesTestShaderCoreBuiltinsFeature
 }
 
 
+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();
@@ -6915,6 +6962,53 @@ tcu::TestStatus createDeviceWithUnsupportedFeaturesTestRayTracingInvocationReord
 }
 
 
+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)
 {
 
@@ -7059,6 +7153,8 @@ 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);
 }
 
index 338a7cf..d51a8e7 100644 (file)
@@ -282,143 +282,147 @@ template<> void initFeatureFromBlob<VkPhysicalDeviceAddressBindingReportFeatures
 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}; }
@@ -492,6 +496,7 @@ static const FeatureStructCreationData featureStructCreationArray[]
        { 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 },
@@ -562,6 +567,7 @@ static const FeatureStructCreationData featureStructCreationArray[]
        { 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 },
index 674cab0..2a23813 100644 (file)
@@ -4263,6 +4263,43 @@ tcu::TestStatus testPhysicalDeviceFeatureFaultFeaturesEXT (Context& context)
        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)))
@@ -4568,6 +4605,7 @@ void addSeparateFeatureTests (tcu::TestCaseGroup* testGroup)
        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);
index af7c942..15075f8 100644 (file)
@@ -67,6 +67,7 @@ const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT&                                          getIndexTypeUint8Featu
 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;
@@ -137,6 +138,7 @@ const vk::VkPhysicalDeviceLegacyDitheringFeaturesEXT&                                               getLegacyDitheringFea
 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;
index c8cb126..c241601 100644 (file)
@@ -67,6 +67,7 @@ const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT&                                          Context::getIndexTypeU
 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();                          }
@@ -137,6 +138,7 @@ const vk::VkPhysicalDeviceLegacyDitheringFeaturesEXT&                                               Context::getLegacyDit
 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();                                     }
index 0a29cb2..64cde4a 100644 (file)
@@ -67,6 +67,7 @@ const VkPhysicalDeviceIndexTypeUint8FeaturesEXT&                                              getIndexTypeUint8FeaturesE
 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>();                    }
@@ -137,6 +138,7 @@ const VkPhysicalDeviceLegacyDitheringFeaturesEXT&                                           getLegacyDitheringFeature
 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>();                                 }
index 1eeb194..1669a74 100644 (file)
@@ -451,3 +451,4 @@ DestroyOpticalFlowSessionNVFunc                                                             destroyOpticalFlowSessionNV;
 BindOpticalFlowSessionImageNVFunc                                                      bindOpticalFlowSessionImageNV;
 CmdOpticalFlowExecuteNVFunc                                                                    cmdOpticalFlowExecuteNV;
 GetDeviceFaultInfoEXTFunc                                                                      getDeviceFaultInfoEXT;
+ReleaseSwapchainImagesEXTFunc                                                          releaseSwapchainImagesEXT;
index b65879d..8324786 100644 (file)
@@ -157,7 +157,7 @@ void getInstanceExtensionFunctions (uint32_t apiVersion, ::std::string extName,
        {
                return;
        }
-       if (extName == "VK_EXT_video_decode_h264")
+       if (extName == "VK_KHR_video_decode_h264")
        {
                return;
        }
@@ -657,7 +657,7 @@ void getInstanceExtensionFunctions (uint32_t apiVersion, ::std::string extName,
        {
                return;
        }
-       if (extName == "VK_EXT_video_decode_h265")
+       if (extName == "VK_KHR_video_decode_h265")
        {
                return;
        }
@@ -916,6 +916,14 @@ void getInstanceExtensionFunctions (uint32_t apiVersion, ::std::string extName,
        {
                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;
@@ -1266,6 +1274,10 @@ void getInstanceExtensionFunctions (uint32_t apiVersion, ::std::string extName,
        {
                return;
        }
+       if (extName == "VK_LUNARG_direct_driver_loading")
+       {
+               return;
+       }
        if (extName == "VK_EXT_shader_module_identifier")
        {
                return;
@@ -1295,6 +1307,10 @@ void getInstanceExtensionFunctions (uint32_t apiVersion, ::std::string extName,
        {
                return;
        }
+       if (extName == "VK_QCOM_multiview_per_view_viewports")
+       {
+               return;
+       }
        if (extName == "VK_NV_ray_tracing_invocation_reorder")
        {
                return;
@@ -1502,7 +1518,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        {
                return;
        }
-       if (extName == "VK_EXT_video_decode_h264")
+       if (extName == "VK_KHR_video_decode_h264")
        {
                return;
        }
@@ -2072,7 +2088,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        {
                return;
        }
-       if (extName == "VK_EXT_video_decode_h265")
+       if (extName == "VK_KHR_video_decode_h265")
        {
                return;
        }
@@ -2355,6 +2371,15 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        {
                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;
@@ -2787,6 +2812,10 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        {
                return;
        }
+       if (extName == "VK_LUNARG_direct_driver_loading")
+       {
+               return;
+       }
        if (extName == "VK_EXT_shader_module_identifier")
        {
                functions.push_back("vkGetShaderModuleIdentifierEXT");
@@ -2823,6 +2852,10 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        {
                return;
        }
+       if (extName == "VK_QCOM_multiview_per_view_viewports")
+       {
+               return;
+       }
        if (extName == "VK_NV_ray_tracing_invocation_reorder")
        {
                return;
@@ -2899,10 +2932,12 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        "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[] =
@@ -2930,7 +2965,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        "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",
@@ -3031,7 +3066,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        "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",
@@ -3089,6 +3124,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        "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",
@@ -3178,6 +3214,7 @@ void getDeviceExtensionFunctions (uint32_t apiVersion, ::std::string extName, ::
        "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",
index 025df22..bf3968c 100644 (file)
@@ -623,3 +623,4 @@ typedef VKAPI_ATTR void                                     (VKAPI_CALL* DestroyOpticalFlowSessionNVFunc)
 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);
index 66df80e..f6fe3e7 100644 (file)
@@ -2778,64 +2778,64 @@ template<> VkStructureType getStructureType<VkVideoDecodeInfoKHR> (void)
        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)
@@ -3653,6 +3653,51 @@ template<> VkStructureType getStructureType<VkPhysicalDeviceShaderCoreBuiltinsFe
        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;
@@ -3663,3 +3708,18 @@ template<> VkStructureType getStructureType<VkPhysicalDeviceRayTracingInvocation
        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;
+}
+
index a85ccd3..7ce401a 100644 (file)
@@ -587,3 +587,4 @@ m_vk.destroyOpticalFlowSessionNV                                                    = (DestroyOpticalFlowSessionNVFunc)
 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");
index fb21919..40eb806 100644 (file)
@@ -3842,6 +3842,13 @@ VKAPI_ATTR VkResult VKAPI_CALL getDeviceFaultInfoEXT (VkDevice device, VkDeviceF
        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),
@@ -4392,5 +4399,6 @@ static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
        VK_NULL_FUNC_ENTRY(vkBindOpticalFlowSessionImageNV,                                                             bindOpticalFlowSessionImageNV),
        VK_NULL_FUNC_ENTRY(vkCmdOpticalFlowExecuteNV,                                                                   cmdOpticalFlowExecuteNV),
        VK_NULL_FUNC_ENTRY(vkGetDeviceFaultInfoEXT,                                                                             getDeviceFaultInfoEXT),
+       VK_NULL_FUNC_ENTRY(vkReleaseSwapchainImagesEXT,                                                                 releaseSwapchainImagesEXT),
 };
 
index 1895470..a10b382 100644 (file)
@@ -87,6 +87,7 @@ const char*   getCopyMicromapModeEXTName                                                              (VkCopyMicromapModeEXT value);
 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);
@@ -225,6 +226,7 @@ inline tcu::Format::Enum<VkCopyMicromapModeEXT>                                                             getCopyMicromapModeEXTStr
 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);                                                                                         }
@@ -363,6 +365,7 @@ inline std::ostream&        operator<<      (std::ostream& s, VkCopyMicromapModeEXT 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);                                            }
@@ -500,6 +503,7 @@ tcu::Format::Bitfield<32>   getRenderingFlagsStr                                                                            (VkRenderingFlags 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);
@@ -567,6 +571,8 @@ tcu::Format::Bitfield<32>   getOpticalFlowGridSizeFlagsNVStr                                                        (VkOpticalFlowG
 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);
@@ -577,7 +583,7 @@ tcu::Format::Bitfield<32>   getVideoCodingControlFlagsKHRStr                                                        (VkVideoCodingC
 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);
@@ -1273,18 +1279,18 @@ std::ostream&   operator<<      (std::ostream& s, const VkVideoReferenceSlotInfoKHR& va
 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);
@@ -1467,8 +1473,20 @@ std::ostream&    operator<<      (std::ostream& s, const VkDeviceFaultVendorBinaryHeader
 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);
index 22e400c..f63c460 100644 (file)
@@ -1566,12 +1566,12 @@ const char* getStructureTypeName (VkStructureType 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";
@@ -1832,12 +1832,12 @@ const char* getStructureTypeName (VkStructureType value)
                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";
@@ -1941,6 +1941,15 @@ const char* getStructureTypeName (VkStructureType value)
                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";
@@ -2157,6 +2166,8 @@ const char* getStructureTypeName (VkStructureType value)
                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";
@@ -2174,6 +2185,7 @@ const char* getStructureTypeName (VkStructureType value)
                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";
@@ -3450,6 +3462,16 @@ tcu::Format::Bitfield<64> getMemoryDecompressionMethodFlagsNVStr (VkMemoryDecomp
        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)
@@ -3850,6 +3872,7 @@ tcu::Format::Bitfield<32> getSwapchainCreateFlagsKHRStr (VkSwapchainCreateFlagsK
                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));
 }
@@ -4119,6 +4142,28 @@ const char* getDeviceFaultAddressTypeEXTName (VkDeviceFaultAddressTypeEXT value)
        }
 }
 
+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)
@@ -4214,8 +4259,8 @@ tcu::Format::Bitfield<32> getVideoCodecOperationFlagsKHRStr (VkVideoCodecOperati
        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"),
        };
@@ -4310,13 +4355,13 @@ tcu::Format::Bitfield<32> getVideoDecodeCapabilityFlagsKHRStr (VkVideoDecodeCapa
        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));
 }
@@ -4962,6 +5007,11 @@ tcu::Format::Bitfield<32> getAccelerationStructureMotionInstanceFlagsNVStr (VkAc
        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);
@@ -13569,9 +13619,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeInfoKHR& value)
        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';
@@ -13580,9 +13630,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileInfoEXT
        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';
@@ -13591,9 +13641,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesEX
        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';
@@ -13604,9 +13654,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParamet
        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';
@@ -13616,9 +13666,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParamet
        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';
@@ -13628,9 +13678,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoEXT
        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';
@@ -13638,9 +13688,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoEXT
        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';
@@ -13648,9 +13698,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileInfoEXT
        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';
@@ -13658,9 +13708,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesEX
        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';
@@ -13673,9 +13723,9 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParamet
        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';
@@ -13686,21 +13736,21 @@ std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParamet
        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';
@@ -15955,6 +16005,108 @@ std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceShaderCoreBuilt
        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";
@@ -15975,6 +16127,39 @@ std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceRayTracingInvoc
        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";
index 0191288..1728827 100644 (file)
@@ -6282,7 +6282,7 @@ struct VkQueueFamilyQueryResultStatusPropertiesKHR
 
 struct VkPhysicalDeviceVideoFormatInfoKHR
 {
-        VkStructureType        sType;
+       VkStructureType         sType;
        const void*                     pNext;
        VkImageUsageFlags       imageUsage;
 };
@@ -6396,15 +6396,15 @@ struct VkVideoDecodeInfoKHR
        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;
@@ -6412,14 +6412,14 @@ struct VkVideoDecodeH264CapabilitiesEXT
        VkOffset2D                              fieldOffsetGranularity;
 };
 
-struct VkVideoDecodeH265ProfileInfoEXT
+struct VkVideoDecodeH265ProfileInfoKHR
 {
        VkStructureType                 sType;
        const void*                             pNext;
        StdVideoH265ProfileIdc  stdProfileIdc;
 };
 
-struct VkVideoDecodeH265CapabilitiesEXT
+struct VkVideoDecodeH265CapabilitiesKHR
 {
        VkStructureType                 sType;
        void*                                   pNext;
@@ -6870,7 +6870,7 @@ union VkDescriptorDataEXT
        const VkDescriptorAddressInfoEXT*       pStorageTexelBuffer;
        const VkDescriptorAddressInfoEXT*       pUniformBuffer;
        const VkDescriptorAddressInfoEXT*       pStorageBuffer;
-        VkDeviceAddress                                        accelerationStructure;
+       VkDeviceAddress                                         accelerationStructure;
 };
 
 struct VkDescriptorGetInfoEXT
@@ -8010,6 +8010,81 @@ struct VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM
        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;
@@ -8024,6 +8099,30 @@ struct VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV
        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;
@@ -8159,7 +8258,7 @@ struct StdVideoH264PictureParameterSet
        const StdVideoH264ScalingLists* pScalingLists;
 };
 
-struct VkVideoDecodeH264SessionParametersAddInfoEXT
+struct VkVideoDecodeH264SessionParametersAddInfoKHR
 {
        VkStructureType                                                 sType;
        const void*                                                             pNext;
@@ -8189,13 +8288,13 @@ struct StdVideoDecodeH264PictureInfoFlags
        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
@@ -8219,7 +8318,7 @@ struct StdVideoDecodeH264PictureInfo
        int32_t                                                         PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];
 };
 
-struct VkVideoDecodeH264PictureInfoEXT
+struct VkVideoDecodeH264PictureInfoKHR
 {
        VkStructureType                                                 sType;
        const void*                                                             pNext;
@@ -8244,7 +8343,7 @@ struct StdVideoDecodeH264ReferenceInfo
        int32_t                                                                 PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];
 };
 
-struct VkVideoDecodeH264DpbSlotInfoEXT
+struct VkVideoDecodeH264DpbSlotInfoKHR
 {
        VkStructureType                                                 sType;
        const void*                                                             pNext;
@@ -8735,7 +8834,7 @@ struct StdVideoH265PictureParameterSet
        const StdVideoH265PredictorPaletteEntries*      pPredictorPaletteEntries;
 };
 
-struct VkVideoDecodeH265SessionParametersAddInfoEXT
+struct VkVideoDecodeH265SessionParametersAddInfoKHR
 {
        VkStructureType                                                 sType;
        const void*                                                             pNext;
@@ -8767,14 +8866,14 @@ struct StdVideoDecodeH265PictureInfoFlags
        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
@@ -8802,13 +8901,13 @@ struct StdVideoDecodeH265PictureInfo
        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
@@ -8823,7 +8922,7 @@ struct StdVideoDecodeH265ReferenceInfo
        int32_t                                                                 PicOrderCntVal;
 };
 
-struct VkVideoDecodeH265DpbSlotInfoEXT
+struct VkVideoDecodeH265DpbSlotInfoKHR
 {
        VkStructureType                                                 sType;
        const void*                                                             pNext;
index a774a70..e20d531 100644 (file)
@@ -451,3 +451,4 @@ virtual void                                destroyOpticalFlowSessionNV                                                             (VkDevice device, VkOpticalFl
 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;
index d73b659..fa218df 100644 (file)
@@ -367,7 +367,7 @@ extern "C" {
 
 #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"
@@ -941,11 +941,11 @@ extern "C" {
 
 
 #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 {
@@ -1016,11 +1016,11 @@ extern "C" {
 
 
 #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;
@@ -1133,7 +1133,7 @@ extern "C" {
 #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)
@@ -1229,24 +1229,12 @@ typedef enum VkResult {
     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,
@@ -1504,66 +1492,26 @@ typedef enum VkStructureType {
     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,
@@ -1641,24 +1589,12 @@ typedef enum VkStructureType {
 #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,
@@ -1821,24 +1757,12 @@ typedef enum VkStructureType {
     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,
@@ -1915,6 +1839,15 @@ typedef enum VkStructureType {
     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,
@@ -2100,6 +2033,8 @@ typedef enum VkStructureType {
     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,
@@ -2118,6 +2053,7 @@ typedef enum VkStructureType {
     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,
@@ -2324,15 +2260,9 @@ typedef enum VkImageLayout {
     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,
@@ -2393,12 +2323,8 @@ typedef enum VkObjectType {
     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,
@@ -2774,9 +2700,7 @@ typedef enum VkQueryType {
     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,
@@ -3257,12 +3181,8 @@ typedef enum VkFormatFeatureFlagBits {
     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,
@@ -3339,15 +3259,9 @@ typedef enum VkImageUsageFlagBits {
     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
@@ -3402,9 +3316,7 @@ typedef enum VkQueueFlagBits {
     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
@@ -3511,9 +3423,7 @@ typedef enum VkQueryResultFlagBits {
     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;
@@ -3542,12 +3452,8 @@ typedef enum VkBufferUsageFlagBits {
     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,
@@ -7608,9 +7514,7 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT
 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
@@ -7680,12 +7584,8 @@ static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000
 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
@@ -7791,12 +7691,8 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_
 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;
@@ -8690,6 +8586,7 @@ typedef enum VkSwapchainCreateFlagBitsKHR {
     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;
@@ -8993,6 +8890,412 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(
 #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"
@@ -10106,6 +10409,59 @@ typedef struct VkPhysicalDeviceShaderClockFeaturesKHR {
 
 
 
+#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
@@ -14170,6 +14526,105 @@ typedef struct VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT {
 
 
 
+#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"
@@ -14728,7 +15183,7 @@ typedef union VkDescriptorDataEXT {
     const VkDescriptorAddressInfoEXT*    pStorageTexelBuffer;
     const VkDescriptorAddressInfoEXT*    pUniformBuffer;
     const VkDescriptorAddressInfoEXT*    pStorageBuffer;
-     VkDeviceAddress                     accelerationStructure;
+    VkDeviceAddress                      accelerationStructure;
 } VkDescriptorDataEXT;
 
 typedef struct VkDescriptorGetInfoEXT {
@@ -15304,24 +15759,6 @@ typedef struct VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT {
 
 
 
-#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"
@@ -16608,6 +17045,36 @@ typedef struct VkRenderPassSubpassFeedbackCreateInfoEXT {
 
 
 
+#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
@@ -16897,6 +17364,17 @@ typedef struct VkAmigoProfilingSubmitInfoSEC {
 
 
 
+#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"
index 7900677..90cd9c9 100644 (file)
@@ -77,6 +77,7 @@ static const char* s_allowedDeviceKhrExtensions[] =
        "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",
index c5d2bf6..0108cfd 100644 (file)
@@ -973,7 +973,7 @@ static std::map<deUint64, std::string> VkStructureType_map = {
     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"),
@@ -1012,14 +1012,14 @@ static std::map<deUint64, std::string> VkStructureType_map = {
     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"),
index 07751e1..0666a5f 100644 (file)
@@ -2338,7 +2338,7 @@ static std::map<std::string, int> VkStructureType_map = {
     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),
@@ -2377,14 +2377,14 @@ static std::map<std::string, int> VkStructureType_map = {
     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),
index 24d4acb..b615b6a 100644 (file)
@@ -199,5 +199,4 @@ void cmdPipelineImageMemoryBarrier  (const DeviceInterface&                 vk,
 
        vk.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, 0u, DE_NULL, 0u, DE_NULL, imageMemoryBarrierCount32, pImageMemoryBarriers);
 }
-
 } // vkt
index 88a61fd..dda5e78 100644 (file)
@@ -66,6 +66,9 @@ struct NAME {                                                                                 \
 #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
  *//*--------------------------------------------------------------------*/
@@ -189,6 +192,8 @@ typedef VKAPI_ATTR VkBool32 (VKAPI_CALL* PFN_vkDebugReportCallbackEXT)                      (VkDebu
                                                                                                                                                                 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,
index d5c5bbd..77ab2c4 100644 (file)
@@ -389,10 +389,22 @@ class Display;
 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;
index 406c1e7..376c200 100644 (file)
@@ -99,6 +99,14 @@ inline VkComponentMapping makeComponentMappingRGBA (void)
                                                                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());
@@ -180,6 +188,19 @@ inline VkViewport makeViewport(const deUint32 width, const deUint32 height)
        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));
index 900545b..eade987 100644 (file)
@@ -49,7 +49,7 @@ add_subdirectory(reconvergence)
 add_subdirectory(mesh_shader)
 add_subdirectory(fragment_shading_barycentric)
 add_subdirectory(sc)
-
+add_subdirectory(video)
 
 include_directories(
        api
@@ -100,6 +100,7 @@ include_directories(
        fragment_shading_barycentric
        ${DEQP_INL_DIR}
        sc
+       video
        )
 
 set(DEQP_VK_SRCS
@@ -169,6 +170,7 @@ set(DEQP_VK_LIBS
        deqp-vk-reconvergence
        deqp-vk-mesh-shader
        deqp-vk-fragment-shading-barycentric
+       deqp-vk-video
        )
 
 
@@ -249,6 +251,24 @@ FOREACH(FOUND_PATH ${PATHS_MATCHING_PATTERN})
        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})
index 9681af6..f181f1b 100644 (file)
@@ -521,22 +521,22 @@ void MemoryRequirementsTest::checkSupport (Context& context) const
                                        }
                                        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;
@@ -721,12 +721,12 @@ template<> void* BufferMemoryRequirementsInstance::chainVkStructure<VkVideoProfi
                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[]
@@ -744,7 +744,7 @@ template<> void* BufferMemoryRequirementsInstance::chainVkStructure<VkVideoProfi
                {
                        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;
index 2935eba..1498e93 100644 (file)
@@ -133,9 +133,12 @@ public:
                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
index 7480edf..51c43d2 100644 (file)
@@ -154,7 +154,7 @@ public:
 protected:
        virtual void                    addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> &params) 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);
@@ -233,7 +233,7 @@ public:
        }
 protected:
        virtual void                    addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> &params) const;
-       virtual void                    checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM &rasterizationAccess) const
+       virtual void                    checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &rasterizationAccess) const
        {
                if (!m_explicitSync && !rasterizationAccess.rasterizationOrderDepthAttachmentAccess)
                {
@@ -280,7 +280,7 @@ public:
        }
 protected:
        virtual void                    addShadersInternal(SourceCollections& programCollection, const std::map<std::string, std::string> &params) const;
-       virtual void                    checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM &rasterizationAccess) const
+       virtual void                    checkAdditionalRasterizationFlags(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &rasterizationAccess) const
        {
                if (!m_explicitSync && !rasterizationAccess.rasterizationOrderStencilAttachmentAccess)
                {
@@ -818,7 +818,7 @@ void AttachmentAccessOrderTestCase::checkSupport (Context& context) const
        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);
index 633df5c..460e428 100644 (file)
@@ -5,6 +5,7 @@ include_directories(
        )
 
 set(DEQP_VK_VKSC_SYNCHRONIZATION_SRCS
+       vktSynchronizationDefs.hpp
        vktSynchronizationTests.cpp
        vktSynchronizationTests.hpp
        vktSynchronizationUtil.cpp
index c3dfedd..a533481 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktSynchronizationBasicEventTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -41,16 +42,20 @@ using namespace vk;
 #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,
@@ -87,10 +92,11 @@ tcu::TestStatus hostResetSetEventCase (Context& context, TestConfig config)
 
 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));
@@ -229,10 +235,11 @@ tcu::TestStatus eventSetResetNoneStage (Context& context, TestConfig)
 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) };
@@ -273,10 +280,11 @@ tcu::TestStatus singleSubmissionCase (Context& context, TestConfig config)
 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));
@@ -337,10 +345,11 @@ tcu::TestStatus multiSubmissionCase(Context& context, TestConfig config)
 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));
@@ -413,6 +422,9 @@ tcu::TestStatus secondaryCommandBufferCase (Context& context, TestConfig config)
 
 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");
 
@@ -425,21 +437,22 @@ void checkSupport (Context& context, TestConfig config)
 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"));
@@ -448,17 +461,20 @@ tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx)
        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"));
index ac72d81..2c188c4 100644 (file)
  * \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
index 77e1049..e6af2a4 100644 (file)
@@ -41,16 +41,24 @@ namespace synchronization
 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));
 
@@ -105,29 +113,30 @@ tcu::TestStatus basicOneFenceCase (Context& context)
        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 =
        {
@@ -136,7 +145,7 @@ tcu::TestStatus basicSignaledCase (Context& context, uint32_t numFences)
                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)
@@ -153,7 +162,7 @@ tcu::TestStatus basicSignaledCase (Context& context, uint32_t numFences)
        return tcu::TestStatus::pass("Pass");
 }
 
-tcu::TestStatus basicMultiFenceCase (Context& context)
+tcu::TestStatus basicMultiFenceCase (Context& context, FenceConfig config)
 {
        enum
        {
@@ -161,10 +170,11 @@ tcu::TestStatus basicMultiFenceCase (Context& context)
                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));
 
@@ -232,11 +242,12 @@ tcu::TestStatus basicMultiFenceCase (Context& context)
        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         =
        {
@@ -255,7 +266,7 @@ tcu::TestStatus emptySubmitCase (Context& context)
        return tcu::TestStatus::pass("OK");
 }
 
-tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context)
+tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context, FenceConfig config)
 {
        enum
        {
@@ -263,10 +274,11 @@ tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context)
                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));
 
@@ -341,15 +353,16 @@ tcu::TestStatus basicMultiFenceWaitAllFalseCase (Context& context)
 
 } // 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();
 }
index 3e7d5f3..e1f15a4 100644 (file)
  * \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
index 61f547e..7c09fcd 100644 (file)
@@ -46,12 +46,14 @@ namespace
 {
 
 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
@@ -72,10 +74,11 @@ Move<VkSemaphore> createTestSemaphore(Context& context, const DeviceInterface& v
 
 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));
@@ -200,9 +203,10 @@ tcu::TestStatus noneWaitSubmitTest (Context& context, const TestConfig config)
 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;
@@ -259,9 +263,10 @@ tcu::TestStatus basicChainCase(Context & context, TestConfig config)
 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 };
@@ -325,11 +330,12 @@ tcu::TestStatus basicChainTimelineCase (Context& context, TestConfig config)
        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));
@@ -402,7 +408,7 @@ tcu::TestStatus basicThreadTimelineCase(Context& context, TestConfig)
        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 };
@@ -413,19 +419,30 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
                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}
@@ -438,12 +455,56 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
                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;
 
@@ -476,7 +537,7 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
        }
 
        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 };
@@ -484,6 +545,10 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
        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"))
@@ -544,14 +609,14 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
        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)
        {
@@ -681,8 +746,11 @@ tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
        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");
 
@@ -690,9 +758,10 @@ void checkSupport(Context& context, TestConfig config)
                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");
@@ -701,7 +770,7 @@ void checkCommandBufferSimultaneousUseSupport(Context& context, TestConfig confi
 
 } // 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"));
 
@@ -710,6 +779,7 @@ tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx,
                0,
                VK_SEMAPHORE_TYPE_BINARY,
                type,
+               videoCodecOperationFlags,
        };
        for (deUint32 typedCreate = 0; typedCreate < 2; typedCreate++)
        {
@@ -728,7 +798,7 @@ tcu::TestCaseGroup* createBasicBinarySemaphoreTests (tcu::TestContext& testCtx,
        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 =
@@ -736,6 +806,7 @@ tcu::TestCaseGroup* createBasicTimelineSemaphoreTests (tcu::TestContext& testCtx
                true,
                VK_SEMAPHORE_TYPE_TIMELINE,
                type,
+               videoCodecOperationFlags,
        };
 
        addFunctionCase(basicTests.get(), "one_queue",          "Basic timeline semaphore tests with one queue",        checkCommandBufferSimultaneousUseSupport,       basicOneQueueCase, config);
index bd99dd4..997de8c 100644 (file)
 
 #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
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationDefs.hpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationDefs.hpp
new file mode 100644 (file)
index 0000000..dd238da
--- /dev/null
@@ -0,0 +1,43 @@
+#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
index bdcdbb9..387b081 100644 (file)
@@ -49,22 +49,22 @@ namespace synchronization
 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();
 }
@@ -91,59 +91,94 @@ private:
        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
index 96d061c..b9be06a 100644 (file)
  * \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
 
index 5e1ac1d..5a7b04b 100644 (file)
@@ -1193,5 +1193,37 @@ void PipelineCacheData::setFromPipelineCache (const vk::DeviceInterface& vk, con
 #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
index a7a96f9..ac59275 100644 (file)
@@ -33,6 +33,7 @@
 #include "deMutex.hpp"
 #include <memory>
 #include "vkResourceInterface.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 namespace vkt
 {
@@ -337,6 +338,10 @@ vk::VkCommandBufferSubmitInfoKHR   makeCommonCommandBufferSubmitInfo                       (const vk::
 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
 
diff --git a/external/vulkancts/modules/vulkan/video/CMakeLists.txt b/external/vulkancts/modules/vulkan/video/CMakeLists.txt
new file mode 100644 (file)
index 0000000..62b75bb
--- /dev/null
@@ -0,0 +1,46 @@
+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})
+
diff --git a/external/vulkancts/modules/vulkan/video/extFFmpegDemuxer.h b/external/vulkancts/modules/vulkan/video/extFFmpegDemuxer.h
new file mode 100644 (file)
index 0000000..8ae9f94
--- /dev/null
@@ -0,0 +1,492 @@
+#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 */
diff --git a/external/vulkancts/modules/vulkan/video/extNvidiaVideoParserIf.hpp b/external/vulkancts/modules/vulkan/video/extNvidiaVideoParserIf.hpp
new file mode 100644 (file)
index 0000000..5c6048a
--- /dev/null
@@ -0,0 +1,1032 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp
new file mode 100644 (file)
index 0000000..2317d37
--- /dev/null
@@ -0,0 +1,4212 @@
+/*------------------------------------------------------------------------
+ * 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, &currentPictureResource, 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, &currentPictureResource, 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.hpp b/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.hpp
new file mode 100644 (file)
index 0000000..4bd6e12
--- /dev/null
@@ -0,0 +1,643 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.cpp b/external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.cpp
new file mode 100644 (file)
index 0000000..b763bab
--- /dev/null
@@ -0,0 +1,1156 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.hpp b/external/vulkancts/modules/vulkan/video/vktVideoCapabilitiesTests.hpp
new file mode 100644 (file)
index 0000000..799a92d
--- /dev/null
@@ -0,0 +1,39 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp b/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp
new file mode 100644 (file)
index 0000000..1e6d593
--- /dev/null
@@ -0,0 +1,1229 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.hpp b/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.hpp
new file mode 100644 (file)
index 0000000..2638c11
--- /dev/null
@@ -0,0 +1,39 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.cpp
new file mode 100644 (file)
index 0000000..1c06dd5
--- /dev/null
@@ -0,0 +1,77 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.hpp b/external/vulkancts/modules/vulkan/video/vktVideoPictureUtils.hpp
new file mode 100644 (file)
index 0000000..cdc10f6
--- /dev/null
@@ -0,0 +1,54 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.cpp
new file mode 100644 (file)
index 0000000..a72116a
--- /dev/null
@@ -0,0 +1,183 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.hpp b/external/vulkancts/modules/vulkan/video/vktVideoSessionFfmpegUtils.hpp
new file mode 100644 (file)
index 0000000..3b50cd3
--- /dev/null
@@ -0,0 +1,56 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.cpp
new file mode 100644 (file)
index 0000000..50ebefd
--- /dev/null
@@ -0,0 +1,185 @@
+/*------------------------------------------------------------------------
+ * 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(&parameters) != 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.hpp b/external/vulkancts/modules/vulkan/video/vktVideoSessionNvUtils.hpp
new file mode 100644 (file)
index 0000000..b662ad8
--- /dev/null
@@ -0,0 +1,57 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoTestUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoTestUtils.cpp
new file mode 100644 (file)
index 0000000..fa9c282
--- /dev/null
@@ -0,0 +1,807 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoTestUtils.hpp b/external/vulkancts/modules/vulkan/video/vktVideoTestUtils.hpp
new file mode 100644 (file)
index 0000000..092fb55
--- /dev/null
@@ -0,0 +1,165 @@
+#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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoTests.cpp b/external/vulkancts/modules/vulkan/video/vktVideoTests.cpp
new file mode 100644 (file)
index 0000000..ee777ee
--- /dev/null
@@ -0,0 +1,71 @@
+/*------------------------------------------------------------------------
+ * 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
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoTests.hpp b/external/vulkancts/modules/vulkan/video/vktVideoTests.hpp
new file mode 100644 (file)
index 0000000..dafd4de
--- /dev/null
@@ -0,0 +1,39 @@
+#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
index 7fd1135..9bea666 100644 (file)
@@ -26,6 +26,7 @@
 #include "vkQueryUtil.hpp"
 #include "vkDeviceUtil.hpp"
 #include "vkDebugReportUtil.hpp"
+#include "vkMemUtil.hpp"
 #include "tcuCommandLine.hpp"
 #include "vktCustomInstancesDevices.hpp"
 
@@ -502,5 +503,461 @@ CustomInstanceWrapper::CustomInstanceWrapper(Context& context, const std::vector
        : 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
+}
 
 }
index c050049..ce432a1 100644 (file)
@@ -144,6 +144,67 @@ public:
        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
index e47f442..77b5356 100644 (file)
 #ifdef CTS_USES_VULKANSC
 #include "vktSafetyCriticalTests.hpp"
 #endif // CTS_USES_VULKANSC
+#include "vktVideoTests.hpp"
 
 #include <vector>
 #include <sstream>
@@ -203,7 +204,11 @@ static void                restoreStandardOutput   ()                                                                                              { qpRedirectOut(openWrite, open
 
 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)
@@ -1132,6 +1137,7 @@ void TestPackage::init (void)
        addChild(FragmentShadingBarycentric::createTests(m_testCtx));
        // Amber depth pipeline tests
        addChild(cts_amber::createAmberDepthGroup       (m_testCtx));
+       addChild(video::createTests                                     (m_testCtx));
 }
 
 void ExperimentalTestPackage::init (void)
index 1d51bfd..84bdec8 100644 (file)
@@ -46,5 +46,6 @@ vk-default/tessellation.txt
 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
index 16c051e..b22eb2d 100644 (file)
@@ -1980,6 +1980,7 @@ dEQP-VK.api.info.get_physical_device_properties2.features.attachment_feedback_lo
 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
@@ -42481,7 +42482,9 @@ dEQP-VK.api.device_init.create_device_unsupported_features.address_binding_repor
 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
index cab42c0..6806407 100644 (file)
@@ -27215,70 +27215,6 @@ dEQP-VK.synchronization.op.multi_queue.timeline_semaphore.write_update_index_buf
 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
diff --git a/external/vulkancts/mustpass/main/vk-default/video.txt b/external/vulkancts/mustpass/main/vk-default/video.txt
new file mode 100644 (file)
index 0000000..d0d5095
--- /dev/null
@@ -0,0 +1,181 @@
+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
index 9afa9e5..10299a8 100755 (executable)
@@ -669,9 +669,10 @@ class API:
                                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",
@@ -1694,8 +1695,9 @@ def writeTypeUtil (api, filename):
                        "StdVideoEncodeH265SliceSegmentHeaderFlags",
                        "StdVideoEncodeH265ReferenceModificationFlags",
                        "StdVideoEncodeH265ReferenceInfoFlags",
+                       "StdVideoEncodeH265SliceSegmentHeaderFlags",
                        "StdVideoH265ProfileTierLevelFlags",
-                       "StdVideoH265ShortTermRefPicSetFlags"
+                       "StdVideoH265ShortTermRefPicSetFlags",
                ])
 
        def isSimpleStruct (type):
diff --git a/external/vulkancts/scripts/src/extensions/VK_KHR_video_queue.json b/external/vulkancts/scripts/src/extensions/VK_KHR_video_queue.json
new file mode 100644 (file)
index 0000000..eb459c7
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "register_extension":
+       {
+               "type": "device",
+               "core": ""
+       }
+}
\ No newline at end of file
index 61274a8..1dc60fa 100644 (file)
@@ -288,7 +288,7 @@ int main (int argc, char** argv)
                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 }});
index 1f081d4..0b4850b 100644 (file)
@@ -163,7 +163,7 @@ VkscServer* createServerVKSC(const std::string& logFile)
        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{};
diff --git a/framework/delibs/cmake/FindFFmpeg.cmake b/framework/delibs/cmake/FindFFmpeg.cmake
new file mode 100644 (file)
index 0000000..9fae7e9
--- /dev/null
@@ -0,0 +1,137 @@
+#
+# 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()
index e16839b..c8eafbf 100644 (file)
@@ -28,6 +28,8 @@
 /* Posix implementation. */
 
 #include <dlfcn.h>
+#include <libgen.h>
+#include <stdlib.h>
 
 struct deDynamicLibrary_s
 {
@@ -40,7 +42,11 @@ deDynamicLibrary* deDynamicLibrary_open (const char* fileName)
        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);
index 4d57526..ce01a3a 100644 (file)
@@ -349,6 +349,28 @@ private:
        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)
 {
@@ -418,9 +440,16 @@ bool VulkanPlatform::hasDisplay (vk::wsi::Type wsiType) const
 
        }
 }
-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
index 86c3c32..7e0f8d8 100644 (file)
@@ -38,7 +38,7 @@ class VulkanPlatform : public vk::Platform
 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;
 
index 69e31c3..3ce0517 100644 (file)
@@ -81,7 +81,7 @@ Platform::~Platform (void)
 {
 }
 
-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();
index 405e445..aa82fcb 100644 (file)
@@ -46,7 +46,7 @@ public:
        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
index b6ef471..55fa53e 100644 (file)
@@ -113,6 +113,28 @@ private:
        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)
 {
@@ -122,9 +144,14 @@ VulkanPlatform::~VulkanPlatform (void)
 {
 }
 
-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)
index fc5eb59..3a242d0 100644 (file)
@@ -38,7 +38,7 @@ public:
                                                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;
index 633f545..0addecf 100644 (file)
@@ -55,6 +55,9 @@ BINARY_FILE_EXTENSION = [
     ".pkm",
     ".xcf",
     ".nspv",
+    ".h264",
+    ".h265",
+    ".mp4",
        ".diff"
     ]