Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1e9cd15
Add a test runner to avoid regressions
charlie-ht Sep 19, 2023
7da694c
Fix validation setup
charlie-ht Jun 22, 2023
f9345fa
Fix vkGetDeviceQueue-queueFamilyIndex-00384 validation error
charlie-ht Jun 22, 2023
ef283fa
Add a utility to ignore VUIDs
charlie-ht Jun 22, 2023
6dd27e5
Forward selection of presentation to the decoder
charlie-ht Aug 31, 2023
2d3519d
Check for physical device features before using them
charlie-ht Jun 22, 2023
f80c786
Fix for update sequence count validation error
charlie-ht Aug 31, 2023
9157d2b
Align bitstream offset and size as advertised by implementation
charlie-ht Sep 19, 2023
fea2318
Ignore DPB management validation errors
charlie-ht Sep 19, 2023
e743a86
Expose transfer queues
charlie-ht Sep 19, 2023
2dae733
NFC: Rename get -> getVideoRelatedQueuesProperties
charlie-ht Sep 19, 2023
81d4881
NFC: AddOptinalDeviceExtension -> AddOptionalDeviceExtension
charlie-ht Sep 19, 2023
87524e1
NFC: Remove unnecessary nesting
charlie-ht Sep 19, 2023
babc3a5
NFC: Remove dead variable
charlie-ht Sep 19, 2023
997557e
Fix a sync2 validation warning
charlie-ht Sep 20, 2023
fe439ee
NFC: Display the device being used
charlie-ht Sep 19, 2023
f16ad34
Use concurrent sharing when the transfer queue != decode queue
charlie-ht Sep 19, 2023
e7c6207
Always keep DECODE_DST bit on the output image
charlie-ht Sep 19, 2023
401baf4
Tidy up output and dpb usage variables (note about linear tiling)
charlie-ht Sep 19, 2023
5c40245
Ensure the timeline semaphore is selected
charlie-ht Sep 19, 2023
1892443
Properly check supported formats and assert linear tiling is not supp…
charlie-ht Sep 19, 2023
9a818dd
Remove linear output handling
charlie-ht Sep 20, 2023
b18ab00
Use CopyToBuffer in ConvertFrameToNV12
charlie-ht Sep 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 31 additions & 12 deletions common/include/VkVideoCore/VulkanVideoCapabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "string.h"
#include "vulkan_interfaces.h"
#include "VkCodecUtils/VulkanDeviceContext.h"
#include "VkCodecUtils/VkBufferResource.h"
#include "VkCodecUtils/Helpers.h"
#include "VkVideoCore/VkVideoCoreProfile.h"

Expand Down Expand Up @@ -56,8 +57,8 @@ class VulkanVideoCapabilities
static VkResult GetSupportedVideoFormats(const VulkanDeviceContext* vkDevCtx,
const VkVideoCoreProfile& videoProfile,
VkVideoDecodeCapabilityFlagsKHR capabilityFlags,
VkFormat& pictureFormat,
VkFormat& referencePicturesFormat)
VkFormat& outputPictureFormat,
VkFormat& dpbPictureFormat)
{
VkResult result = VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
if ((capabilityFlags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR) != 0) {
Expand All @@ -68,8 +69,9 @@ class VulkanVideoCapabilities
(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR),
formatCount, supportedDpbFormats);

referencePicturesFormat = supportedDpbFormats[0];
pictureFormat = supportedDpbFormats[0];
assert(formatCount == 1); // how should we rank the formats?
dpbPictureFormat = supportedDpbFormats[0];
outputPictureFormat = supportedDpbFormats[0];

} else if ((capabilityFlags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR) != 0) {
// AMD
Expand All @@ -86,8 +88,9 @@ class VulkanVideoCapabilities
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
formatCount, supportedOutFormats);

referencePicturesFormat = supportedDpbFormats[0];
pictureFormat = supportedOutFormats[0];
assert(formatCount == 1); // how should we rank the formats?
dpbPictureFormat = supportedDpbFormats[0];
outputPictureFormat = supportedOutFormats[0];

} else {
fprintf(stderr, "\nERROR: Unsupported decode capability flags.");
Expand All @@ -99,8 +102,8 @@ class VulkanVideoCapabilities
fprintf(stderr, "\nERROR: GetVideoFormats() result: 0x%x\n", result);
}

assert((referencePicturesFormat != VK_FORMAT_UNDEFINED) && (pictureFormat != VK_FORMAT_UNDEFINED));
assert(referencePicturesFormat == pictureFormat);
assert((dpbPictureFormat != VK_FORMAT_UNDEFINED) && (outputPictureFormat != VK_FORMAT_UNDEFINED));
assert(dpbPictureFormat == outputPictureFormat);

return result;
}
Expand Down Expand Up @@ -182,7 +185,7 @@ class VulkanVideoCapabilities
static VkResult GetVideoFormats(const VulkanDeviceContext* vkDevCtx,
const VkVideoCoreProfile& videoProfile, VkImageUsageFlags imageUsage,
uint32_t& formatCount, VkFormat* formats,
bool dumpData = false)
bool dumpData = true)
{
for (uint32_t i = 0; i < formatCount; i++) {
formats[i] = VK_FORMAT_UNDEFINED;
Expand All @@ -206,9 +209,25 @@ class VulkanVideoCapabilities
result = vkDevCtx->GetPhysicalDeviceVideoFormatPropertiesKHR(vkDevCtx->getPhysicalDevice(), &videoFormatInfo, &supportedFormatCount, pSupportedFormats);
assert(result == VK_SUCCESS);
if (dumpData) {
std::cout << "\t\t\t" << ((videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) ? "h264" : "h265") << "decode formats: " << std::endl;
printf("supported decode formats:\n");
for (uint32_t fmt = 0; fmt < supportedFormatCount; fmt++) {
std::cout << "\t\t\t " << fmt << ": " << std::hex << pSupportedFormats[fmt].format << std::dec << std::endl;
switch (pSupportedFormats[fmt].format) {
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
printf("\tVK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR\n");
break;
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
printf("\tVK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR\n");
break;
case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
printf("\tVK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR\n");
break;
case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:
printf("\tVK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR\n");
break;
default:
printf("\tUnusual image format: %d\n", pSupportedFormats[fmt].format);
break;
}
}
}

Expand All @@ -234,7 +253,7 @@ class VulkanVideoCapabilities
std::vector<VkQueueFamilyProperties2> queues;
std::vector<VkQueueFamilyVideoPropertiesKHR> videoQueues;
std::vector<VkQueueFamilyQueryResultStatusPropertiesKHR> queryResultStatus;
get(vkDevCtx, vkPhysicalDev, queues, videoQueues, queryResultStatus);
getVideoRelatedQueuesProperties(vkDevCtx, vkPhysicalDev, queues, videoQueues, queryResultStatus);

for (uint32_t queueIndx = 0; queueIndx < queues.size(); queueIndx++) {
const VkQueueFamilyProperties2 &q = queues[queueIndx];
Expand Down
29 changes: 14 additions & 15 deletions vk_video_decoder/demos/vk-video-dec/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ int main(int argc, const char **argv) {
VulkanDeviceContext vkDevCtxt(programConfig.deviceId);

if (programConfig.validate) {
vkDevCtxt.AddRequiredInstanceLayer("VK_LAYER_LUNARG_standard_validation");
vkDevCtxt.AddRequiredInstanceLayer(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
// REVIEW: Should we make an effort to check for the old LUNARG validation layer name?
vkDevCtxt.AddRequiredInstanceLayer("VK_LAYER_KHRONOS_validation");
vkDevCtxt.AddRequiredInstanceExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
}

/********** Start WSI instance extensions support *******************************************/
Expand All @@ -61,16 +62,15 @@ int main(int argc, const char **argv) {
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME);
#endif
{ // Vulkan Video required extensions
// VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME - for NV only
vkDevCtxt.AddOptinalDeviceExtension(VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME);
vkDevCtxt.AddOptinalDeviceExtension(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
vkDevCtxt.AddOptinalDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
vkDevCtxt.AddOptinalDeviceExtension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_VIDEO_QUEUE_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME);
}
// VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME - for NV only
vkDevCtxt.AddOptionalDeviceExtension(VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME);
vkDevCtxt.AddOptionalDeviceExtension(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
vkDevCtxt.AddOptionalDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
vkDevCtxt.AddOptionalDeviceExtension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
// Vulkan Video required extensions
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_VIDEO_QUEUE_EXTENSION_NAME);
vkDevCtxt.AddRequiredDeviceExtension(VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME);

VkResult result = vkDevCtxt.InitVulkanDevice(programConfig.name.c_str(),
programConfig.verbose);
Expand All @@ -97,12 +97,11 @@ int main(int argc, const char **argv) {
return -1;
}

const bool supportsDisplay = true;
const int32_t numDecodeQueues = ((programConfig.queueId != 0) ||
(programConfig.enableHwLoadBalancing != 0)) ?
-1 : // all available HW decoders
1; // only one HW decoder instance
if (supportsDisplay && !programConfig.noPresent) {
if (!programConfig.noPresent) {

VkSharedBaseObj<Shell> displayShell;
result = Shell::Create(&vkDevCtxt, frameProcessor, programConfig.directMode, displayShell);
Expand Down Expand Up @@ -134,8 +133,8 @@ int main(int argc, const char **argv) {
displayShell->RunLoop();

} else {

result = vkDevCtxt.InitPhysicalDevice((VK_QUEUE_GRAPHICS_BIT |
VK_QUEUE_TRANSFER_BIT |
VK_QUEUE_VIDEO_DECODE_BIT_KHR),
nullptr);
if (result != VK_SUCCESS) {
Expand Down
Loading