Skip to content

Commit 84a3158

Browse files
committed
Logger: add a log system instead of std::cout or printf
Add a logger with level from ERROR to DEBUG Signed-off-by: Stéphane Cerveau <[email protected]>
1 parent 0b4eb47 commit 84a3158

36 files changed

+791
-663
lines changed

common/include/Logger.h

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright (C) 2025 Igalia, S.L.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
#ifndef _LOGGER_H_
17+
#define _LOGGER_H_
18+
19+
#include <iostream>
20+
#include <fstream>
21+
#include <string>
22+
#include <stdarg.h>
23+
24+
// Enum for log levels
25+
enum LogLevel {
26+
LOG_NONE = 0, // Use this to disable logging
27+
LOG_ERROR,
28+
LOG_WARNING,
29+
LOG_INFO,
30+
LOG_DEBUG
31+
};
32+
33+
#define LOG_S_DEBUG Logger::instance()(LogLevel::LOG_DEBUG)
34+
#define LOG_S_INFO Logger::instance()(LogLevel::LOG_INFO)
35+
#define LOG_S_WARN Logger::instance()(LogLevel::LOG_WARNING)
36+
#define LOG_S_ERROR Logger::instance()(LogLevel::LOG_ERROR)
37+
38+
#define LOG_CAT_LEVEL(LEVEL, CAT, FMT, ...) Logger::instance().printf(LEVEL, FMT, ##__VA_ARGS__)
39+
40+
41+
#define LOG_DEBUG_CAT(CAT, FMT, ...) LOG_CAT_LEVEL(LogLevel::LOG_DEBUG, CAT, FMT, ##__VA_ARGS__)
42+
#define LOG_INFO_CAT(CAT, FMT, ...) LOG_CAT_LEVEL(LogLevel::LOG_INFO, CAT, FMT, ##__VA_ARGS__)
43+
#define LOG_WARN_CAT(CAT, FMT, ...) LOG_CAT_LEVEL(LogLevel::LOG_WARNING, CAT, FMT, ##__VA_ARGS__)
44+
#define LOG_ERROR_CAT(CAT, FMT, ...) LOG_CAT_LEVEL(LogLevel::LOG_ERROR, CAT, FMT, ##__VA_ARGS__)
45+
46+
#define LOG_DEBUG(FMT, ...) LOG_DEBUG_CAT("", FMT, ##__VA_ARGS__)
47+
#define LOG_INFO(FMT, ...) LOG_INFO_CAT("", FMT, ##__VA_ARGS__)
48+
#define LOG_WARN( FMT,...) LOG_WARN_CAT("", FMT, ##__VA_ARGS__)
49+
#define LOG_ERROR( FMT,...) LOG_DEBUG_CAT("", FMT, ##__VA_ARGS__)
50+
51+
#define LOG_DEBUG_CONFIG( FMT, ...) LOG_DEBUG_CAT("config:\t", FMT,##__VA_ARGS__)
52+
#define LOG_INFO_CONFIG( FMT,...) LOG_INFO_CAT("config:\t", FMT,##__VA_ARGS__)
53+
#define LOG_WARN_CONFIG( FMT,...) LOG_WARN_CAT("config:\t", FMT,##__VA_ARGS__)
54+
#define LOG_ERROR_CONFIG( FMT,...) LOG_DEBUG_CAT("config:\t", FMT,##__VA_ARGS__)
55+
56+
class Logger {
57+
private:
58+
std::ostream& os; // The output stream (e.g., std::cout or std::ofstream)
59+
std::ostream& err; // The error stream (e.g., std::cerr)
60+
LogLevel currentLevel; // Current log level
61+
LogLevel messageLevel; // The log level for the current message
62+
63+
public:
64+
static Logger &instance ()
65+
{
66+
static Logger instance;
67+
return instance;
68+
}
69+
// Constructor to set the output stream and log level (default is INFO)
70+
Logger(std::ostream& outStream = std::cout, std::ostream& errStream = std::cerr, LogLevel level = LogLevel::LOG_INFO)
71+
: os(outStream), err(errStream), currentLevel(level), messageLevel(LogLevel::LOG_INFO) {}
72+
73+
// Set the log level for the logger
74+
void setLogLevel(int level) {
75+
if (level > LOG_DEBUG)
76+
level = LOG_DEBUG;
77+
currentLevel = static_cast<LogLevel>(level);
78+
}
79+
80+
// Set the log level for the current message
81+
Logger& operator()(LogLevel level) {
82+
messageLevel = level;
83+
return *this;
84+
}
85+
86+
// Overload the << operator for generic types
87+
template<typename T>
88+
Logger& operator<<(const T& data) {
89+
if (messageLevel <= currentLevel) {
90+
if (messageLevel == LOG_ERROR)
91+
err << data;
92+
else
93+
os << data;
94+
}
95+
return *this;
96+
}
97+
98+
// Overload for stream manipulators (like std::endl)
99+
typedef std::ostream& (*StreamManipulator)(std::ostream&);
100+
Logger& operator<<(StreamManipulator manip) {
101+
if (messageLevel <= currentLevel) {
102+
if (messageLevel == LOG_ERROR)
103+
err << manip;
104+
else
105+
os << manip; // Handle std::endl, std::flush, etc.
106+
}
107+
return *this;
108+
}
109+
110+
void printf(LogLevel level, const char* format, ...) {
111+
if (level <= currentLevel) {
112+
va_list args;
113+
va_start(args, format);
114+
if (level == LOG_ERROR)
115+
vfprintf(stderr, format, args);
116+
else
117+
vfprintf(stdout,format, args);
118+
va_end(args);
119+
}
120+
}
121+
};
122+
123+
124+
#endif

common/include/VkVideoCore/VkVideoCoreProfile.h

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include "vulkan/vulkan.h"
2828
#include "nvidia_utils/vulkan/ycbcr_utils.h"
29+
#include "Logger.h"
2930

3031
typedef enum StdChromaFormatIdc {
3132
chroma_format_idc_monochrome = STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME,
@@ -621,58 +622,58 @@ class VkVideoCoreProfile
621622
{
622623
// formatProfile info based on supported chroma_format_idc
623624
if (pVideoProfile->chromaSubsampling & VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR) {
624-
std::cout << "MONO, ";
625+
LOG_S_DEBUG << "MONO, ";
625626
}
626627
if (pVideoProfile->chromaSubsampling & VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR) {
627-
std::cout << " 420, ";
628+
LOG_S_DEBUG << " 420, ";
628629
}
629630
if (pVideoProfile->chromaSubsampling & VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR) {
630-
std::cout << " 422, ";
631+
LOG_S_DEBUG << " 422, ";
631632
}
632633
if (pVideoProfile->chromaSubsampling & VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR) {
633-
std::cout << " 444, ";
634+
LOG_S_DEBUG << " 444, ";
634635
}
635636

636637
// Profile info based on max bit_depth_luma_minus8
637638
if (pVideoProfile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR) {
638-
std::cout << "LUMA: 8-bit, ";
639+
LOG_S_DEBUG << "LUMA: 8-bit, ";
639640
}
640641
if (pVideoProfile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR) {
641-
std::cout << "LUMA: 10-bit, ";
642+
LOG_S_DEBUG << "LUMA: 10-bit, ";
642643
}
643644
if (pVideoProfile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR) {
644-
std::cout << "LUMA: 12-bit, ";
645+
LOG_S_DEBUG << "LUMA: 12-bit, ";
645646
}
646647

647648
// Profile info based on max bit_depth_chroma_minus8
648649
if (pVideoProfile->chromaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR) {
649-
std::cout << "CHROMA: 8-bit, ";
650+
LOG_S_DEBUG << "CHROMA: 8-bit, ";
650651
}
651652
if (pVideoProfile->chromaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR) {
652-
std::cout << "CHROMA:10-bit, ";
653+
LOG_S_DEBUG << "CHROMA:10-bit, ";
653654
}
654655
if (pVideoProfile->chromaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR) {
655-
std::cout << "CHROMA:12-bit,";
656+
LOG_S_DEBUG << "CHROMA:12-bit,";
656657
}
657658
}
658659

659660
static void DumpH264Profiles(VkVideoDecodeH264ProfileInfoKHR* pH264Profiles)
660661
{
661662
switch (pH264Profiles->stdProfileIdc) {
662663
case STD_VIDEO_H264_PROFILE_IDC_BASELINE:
663-
std::cout << "BASELINE, ";
664+
LOG_S_DEBUG << "BASELINE, ";
664665
break;
665666
case STD_VIDEO_H264_PROFILE_IDC_MAIN:
666-
std::cout << "MAIN, ";
667+
LOG_S_DEBUG << "MAIN, ";
667668
break;
668669
case STD_VIDEO_H264_PROFILE_IDC_HIGH:
669-
std::cout << "HIGH, ";
670+
LOG_S_DEBUG << "HIGH, ";
670671
break;
671672
case STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE:
672-
std::cout << "HIGH_444_PREDICTIVE, ";
673+
LOG_S_DEBUG << "HIGH_444_PREDICTIVE, ";
673674
break;
674675
default:
675-
std::cout << "UNKNOWN PROFILE, ";
676+
LOG_S_DEBUG << "UNKNOWN PROFILE, ";
676677
break;
677678
}
678679
}
@@ -681,22 +682,22 @@ class VkVideoCoreProfile
681682
{
682683
switch (pH265Profiles->stdProfileIdc) {
683684
case STD_VIDEO_H265_PROFILE_IDC_MAIN:
684-
std::cout << "MAIN, ";
685+
LOG_S_DEBUG << "MAIN, ";
685686
break;
686687
case STD_VIDEO_H265_PROFILE_IDC_MAIN_10:
687-
std::cout << "MAIN_10, ";
688+
LOG_S_DEBUG << "MAIN_10, ";
688689
break;
689690
case STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE:
690-
std::cout << "MAIN_STILL_PICTURE, ";
691+
LOG_S_DEBUG << "MAIN_STILL_PICTURE, ";
691692
break;
692693
case STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS:
693-
std::cout << "FORMAT_RANGE_EXTENSIONS, ";
694+
LOG_S_DEBUG << "FORMAT_RANGE_EXTENSIONS, ";
694695
break;
695696
case STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS:
696-
std::cout << "SCC_EXTENSIONS, ";
697+
LOG_S_DEBUG << "SCC_EXTENSIONS, ";
697698
break;
698699
default:
699-
std::cout << "UNKNOWN PROFILE, ";
700+
LOG_S_DEBUG << "UNKNOWN PROFILE, ";
700701
break;
701702
}
702703
}

common/include/VkVideoCore/VulkanVideoCapabilities.h

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "VkCodecUtils/VulkanDeviceContext.h"
2323
#include "VkCodecUtils/Helpers.h"
2424
#include "VkVideoCore/VkVideoCoreProfile.h"
25+
#include "Logger.h"
2526

2627
class VulkanVideoCapabilities
2728
{
@@ -52,7 +53,7 @@ class VulkanVideoCapabilities
5253
VkResult result = GetVideoCapabilities(vkDevCtx, videoProfile, &videoCapabilities);
5354
assert(result == VK_SUCCESS);
5455
if (result != VK_SUCCESS) {
55-
fprintf(stderr, "\nERROR: Input is not supported. GetVideoCapabilities() result: 0x%x\n", result);
56+
LOG_ERROR("ERROR: Input is not supported. GetVideoCapabilities() result: 0x%x\n", result);
5657
}
5758
return result;
5859
}
@@ -76,7 +77,7 @@ class VulkanVideoCapabilities
7677
VkResult result = GetVideoCapabilities(vkDevCtx, videoProfile, &videoCapabilities);
7778
assert(result == VK_SUCCESS);
7879
if (result != VK_SUCCESS) {
79-
fprintf(stderr, "\nERROR: Input is not supported. GetVideoCapabilities() result: 0x%x\n", result);
80+
LOG_ERROR("ERROR: Input is not supported. GetVideoCapabilities() result: 0x%x\n", result);
8081
}
8182
return result;
8283
}
@@ -118,13 +119,13 @@ class VulkanVideoCapabilities
118119
pictureFormat = supportedOutFormats[0];
119120

120121
} else {
121-
fprintf(stderr, "\nERROR: Unsupported decode capability flags.");
122+
LOG_ERROR("ERROR: Unsupported decode capability flags.");
122123
return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
123124
}
124125

125126
assert(result == VK_SUCCESS);
126127
if (result != VK_SUCCESS) {
127-
fprintf(stderr, "\nERROR: GetVideoFormats() result: 0x%x\n", result);
128+
LOG_ERROR("ERROR: GetVideoFormats() result: 0x%x\n", result);
128129
}
129130

130131
assert((referencePicturesFormat != VK_FORMAT_UNDEFINED) && (pictureFormat != VK_FORMAT_UNDEFINED));
@@ -218,46 +219,45 @@ class VulkanVideoCapabilities
218219
return result;
219220
}
220221

221-
if (dumpData) {
222-
std::cout << "\t\t\t" << ((videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) ? "h264" : "h265") << "decode capabilities: " << std::endl;
223222

224-
if (pVideoCapabilities->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR) {
225-
std::cout << "\t\t\t" << "Use separate reference images" << std::endl;
226-
}
223+
LOG_S_ERROR << "\t\t\t" << videoProfile.CodecToName(videoProfile.GetCodecType()) << " capabilities: " << std::endl;
227224

228-
std::cout << "\t\t\t" << "minBitstreamBufferOffsetAlignment: " << pVideoCapabilities->minBitstreamBufferOffsetAlignment << std::endl;
229-
std::cout << "\t\t\t" << "minBitstreamBufferSizeAlignment: " << pVideoCapabilities->minBitstreamBufferSizeAlignment << std::endl;
230-
std::cout << "\t\t\t" << "pictureAccessGranularity: " << pVideoCapabilities->pictureAccessGranularity.width << " x " << pVideoCapabilities->pictureAccessGranularity.height << std::endl;
231-
std::cout << "\t\t\t" << "minCodedExtent: " << pVideoCapabilities->minCodedExtent.width << " x " << pVideoCapabilities->minCodedExtent.height << std::endl;
232-
std::cout << "\t\t\t" << "maxCodedExtent: " << pVideoCapabilities->maxCodedExtent.width << " x " << pVideoCapabilities->maxCodedExtent.height << std::endl;
233-
std::cout << "\t\t\t" << "maxDpbSlots: " << pVideoCapabilities->maxDpbSlots << std::endl;
234-
std::cout << "\t\t\t" << "maxActiveReferencePictures: " << pVideoCapabilities->maxActiveReferencePictures << std::endl;
235-
236-
if (videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) {
237-
const VkVideoDecodeH264CapabilitiesKHR* pH264DecCapabilities = (VkVideoDecodeH264CapabilitiesKHR*)pVideoDecodeCapabilities->pNext;
238-
std::cout << "\t\t\t" << "maxLevelIdc: " << pH264DecCapabilities->maxLevelIdc << std::endl;
239-
std::cout << "\t\t\t" << "fieldOffsetGranularity: " << pH264DecCapabilities->fieldOffsetGranularity.x << " x " << pH264DecCapabilities->fieldOffsetGranularity.y << std::endl;
240-
241-
if (strncmp(pVideoCapabilities->stdHeaderVersion.extensionName,
242-
VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME,
243-
sizeof (pVideoCapabilities->stdHeaderVersion.extensionName) - 1U) ||
244-
(pVideoCapabilities->stdHeaderVersion.specVersion != VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION)) {
245-
assert(!"Unsupported h.264 STD version");
246-
return VK_ERROR_INCOMPATIBLE_DRIVER;
247-
}
248-
} else if (videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) {
249-
const VkVideoDecodeH265CapabilitiesKHR* pH265DecCapabilities = (VkVideoDecodeH265CapabilitiesKHR*)pVideoDecodeCapabilities->pNext;
250-
std::cout << "\t\t\t" << "maxLevelIdc: " << pH265DecCapabilities->maxLevelIdc << std::endl;
251-
if (strncmp(pVideoCapabilities->stdHeaderVersion.extensionName,
252-
VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
253-
sizeof (pVideoCapabilities->stdHeaderVersion.extensionName) - 1U) ||
254-
(pVideoCapabilities->stdHeaderVersion.specVersion != VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION)) {
255-
assert(!"Unsupported h.265 STD version");
256-
return VK_ERROR_INCOMPATIBLE_DRIVER;
257-
}
258-
} else {
259-
assert(!"Unsupported codec");
225+
if (pVideoCapabilities->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR) {
226+
LOG_S_DEBUG << "\t\t\t" << "Use separate reference images" << std::endl;
227+
}
228+
229+
LOG_S_DEBUG << "\t\t\t" << "minBitstreamBufferOffsetAlignment: " << pVideoCapabilities->minBitstreamBufferOffsetAlignment << std::endl;
230+
LOG_S_DEBUG << "\t\t\t" << "minBitstreamBufferSizeAlignment: " << pVideoCapabilities->minBitstreamBufferSizeAlignment << std::endl;
231+
LOG_S_DEBUG << "\t\t\t" << "pictureAccessGranularity: " << pVideoCapabilities->pictureAccessGranularity.width << " x " << pVideoCapabilities->pictureAccessGranularity.height << std::endl;
232+
LOG_S_DEBUG << "\t\t\t" << "minCodedExtent: " << pVideoCapabilities->minCodedExtent.width << " x " << pVideoCapabilities->minCodedExtent.height << std::endl;
233+
LOG_S_DEBUG << "\t\t\t" << "maxCodedExtent: " << pVideoCapabilities->maxCodedExtent.width << " x " << pVideoCapabilities->maxCodedExtent.height << std::endl;
234+
LOG_S_DEBUG << "\t\t\t" << "maxDpbSlots: " << pVideoCapabilities->maxDpbSlots << std::endl;
235+
LOG_S_DEBUG << "\t\t\t" << "maxActiveReferencePictures: " << pVideoCapabilities->maxActiveReferencePictures << std::endl;
236+
237+
if (videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) {
238+
const VkVideoDecodeH264CapabilitiesKHR* pH264DecCapabilities = (VkVideoDecodeH264CapabilitiesKHR*)pVideoDecodeCapabilities->pNext;
239+
LOG_S_DEBUG << "\t\t\t" << "maxLevelIdc: " << pH264DecCapabilities->maxLevelIdc << std::endl;
240+
LOG_S_DEBUG << "\t\t\t" << "fieldOffsetGranularity: " << pH264DecCapabilities->fieldOffsetGranularity.x << " x " << pH264DecCapabilities->fieldOffsetGranularity.y << std::endl;
241+
242+
if (strncmp(pVideoCapabilities->stdHeaderVersion.extensionName,
243+
VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME,
244+
sizeof (pVideoCapabilities->stdHeaderVersion.extensionName) - 1U) ||
245+
(pVideoCapabilities->stdHeaderVersion.specVersion != VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION)) {
246+
assert(!"Unsupported h.264 STD version");
247+
return VK_ERROR_INCOMPATIBLE_DRIVER;
260248
}
249+
} else if (videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) {
250+
const VkVideoDecodeH265CapabilitiesKHR* pH265DecCapabilities = (VkVideoDecodeH265CapabilitiesKHR*)pVideoDecodeCapabilities->pNext;
251+
LOG_S_DEBUG << "\t\t\t" << "maxLevelIdc: " << pH265DecCapabilities->maxLevelIdc << std::endl;
252+
if (strncmp(pVideoCapabilities->stdHeaderVersion.extensionName,
253+
VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
254+
sizeof (pVideoCapabilities->stdHeaderVersion.extensionName) - 1U) ||
255+
(pVideoCapabilities->stdHeaderVersion.specVersion != VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION)) {
256+
assert(!"Unsupported h.265 STD version");
257+
return VK_ERROR_INCOMPATIBLE_DRIVER;
258+
}
259+
} else {
260+
assert(!"Unsupported codec");
261261
}
262262

263263
return result;
@@ -300,11 +300,10 @@ class VulkanVideoCapabilities
300300

301301
result = vkDevCtx->GetPhysicalDeviceVideoFormatPropertiesKHR(vkDevCtx->getPhysicalDevice(), &videoFormatInfo, &supportedFormatCount, pSupportedFormats);
302302
assert(result == VK_SUCCESS);
303-
if (dumpData) {
304-
std::cout << "\t\t\t" << ((videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) ? "h264" : "h265") << "decode formats: " << std::endl;
305-
for (uint32_t fmt = 0; fmt < supportedFormatCount; fmt++) {
306-
std::cout << "\t\t\t " << fmt << ": " << std::hex << pSupportedFormats[fmt].format << std::dec << std::endl;
307-
}
303+
304+
LOG_S_DEBUG << "\t\t\t" << ((videoProfile.GetCodecType() == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR) ? "h264" : "h265") << "decode formats: " << std::endl;
305+
for (uint32_t fmt = 0; fmt < supportedFormatCount; fmt++) {
306+
LOG_S_DEBUG << "\t\t\t " << fmt << ": " << std::hex << pSupportedFormats[fmt].format << std::dec << std::endl;
308307
}
309308

310309
formatCount = std::min(supportedFormatCount, formatCount);

0 commit comments

Comments
 (0)