diff --git a/AppConfig.cpp b/AppConfig.cpp index 46b0ada..a4d1df7 100644 --- a/AppConfig.cpp +++ b/AppConfig.cpp @@ -1,14 +1,313 @@ #include "AppConfig.hpp" +#include +#include #include +#include +#include #include #include #include #include +#include #include +std::optional parsePresentMode( + std::string_view text); + namespace { +struct JsonValue +{ + using Object = std::map; + using Array = std::vector; + + std::variant< + std::nullptr_t, + bool, + double, + std::string, + Object, + Array> value; +}; + +class JsonParser +{ +public: + explicit JsonParser(std::string_view text) + : mText(text) + { + } + + std::optional parse() + { + JsonValue result; + if (!parseValue(result)) + { + return std::nullopt; + } + + skipWhitespace(); + if (mPos != mText.size()) + { + return std::nullopt; + } + + return result; + } + +private: + void skipWhitespace() + { + while (mPos < mText.size() && + std::isspace( + static_cast(mText[mPos]))) + { + ++mPos; + } + } + + bool consume(char expected) + { + skipWhitespace(); + if (mPos >= mText.size() || + mText[mPos] != expected) + { + return false; + } + + ++mPos; + return true; + } + + bool parseValue(JsonValue& out) + { + skipWhitespace(); + if (mPos >= mText.size()) + { + return false; + } + + const char c = mText[mPos]; + if (c == '{') + { + return parseObject(out); + } + if (c == '[') + { + return parseArray(out); + } + if (c == '"') + { + std::string s; + if (!parseString(s)) + { + return false; + } + out.value = std::move(s); + return true; + } + if (c == '-' || (c >= '0' && c <= '9')) + { + return parseNumber(out); + } + if (mText.substr(mPos, 4) == "true") + { + mPos += 4; + out.value = true; + return true; + } + if (mText.substr(mPos, 5) == "false") + { + mPos += 5; + out.value = false; + return true; + } + if (mText.substr(mPos, 4) == "null") + { + mPos += 4; + out.value = nullptr; + return true; + } + + return false; + } + + bool parseObject(JsonValue& out) + { + if (!consume('{')) + { + return false; + } + + JsonValue::Object object; + skipWhitespace(); + if (mPos < mText.size() && mText[mPos] == '}') + { + ++mPos; + out.value = std::move(object); + return true; + } + + while (true) + { + std::string key; + if (!parseString(key) || !consume(':')) + { + return false; + } + + JsonValue value; + if (!parseValue(value)) + { + return false; + } + + object[std::move(key)] = std::move(value); + + skipWhitespace(); + if (mPos < mText.size() && mText[mPos] == '}') + { + ++mPos; + out.value = std::move(object); + return true; + } + if (!consume(',')) + { + return false; + } + } + } + + bool parseArray(JsonValue& out) + { + if (!consume('[')) + { + return false; + } + + JsonValue::Array array; + skipWhitespace(); + if (mPos < mText.size() && mText[mPos] == ']') + { + ++mPos; + out.value = std::move(array); + return true; + } + + while (true) + { + JsonValue value; + if (!parseValue(value)) + { + return false; + } + + array.push_back(std::move(value)); + + skipWhitespace(); + if (mPos < mText.size() && mText[mPos] == ']') + { + ++mPos; + out.value = std::move(array); + return true; + } + if (!consume(',')) + { + return false; + } + } + } + + bool parseString(std::string& out) + { + skipWhitespace(); + if (mPos >= mText.size() || mText[mPos] != '"') + { + return false; + } + + ++mPos; + out.clear(); + + while (mPos < mText.size()) + { + const char c = mText[mPos++]; + if (c == '"') + { + return true; + } + if (c != '\\') + { + out.push_back(c); + continue; + } + if (mPos >= mText.size()) + { + return false; + } + + const char esc = mText[mPos++]; + switch (esc) + { + case '"': out.push_back('"'); break; + case '\\': out.push_back('\\'); break; + case '/': out.push_back('/'); break; + case 'b': out.push_back('\b'); break; + case 'f': out.push_back('\f'); break; + case 'n': out.push_back('\n'); break; + case 'r': out.push_back('\r'); break; + case 't': out.push_back('\t'); break; + default: + return false; + } + } + + return false; + } + + bool parseNumber(JsonValue& out) + { + skipWhitespace(); + const size_t start = mPos; + + if (mPos < mText.size() && mText[mPos] == '-') + { + ++mPos; + } + while (mPos < mText.size() && + mText[mPos] >= '0' && mText[mPos] <= '9') + { + ++mPos; + } + if (mPos < mText.size() && mText[mPos] == '.') + { + ++mPos; + while (mPos < mText.size() && + mText[mPos] >= '0' && mText[mPos] <= '9') + { + ++mPos; + } + } + + try + { + out.value = std::stod( + std::string(mText.substr(start, mPos - start)) + ); + } + catch (...) + { + return false; + } + + return true; + } + + std::string_view mText; + size_t mPos = 0; +}; + bool parseUint32( const char* text, uint32_t& value) @@ -94,6 +393,278 @@ void applyDefaultFeeds(AppConfig& config) { config.feeds.assign(feedCount(config), FeedConfig{}); } + +void resizeFeedsForGrid(AppConfig& config) +{ + config.feeds.resize(feedCount(config)); +} + +const JsonValue* objectField( + const JsonValue::Object& object, + const char* key) +{ + const auto it = object.find(key); + if (it == object.end()) + { + return nullptr; + } + return &it->second; +} + +const std::string* jsonString(const JsonValue* value) +{ + if (value == nullptr) + { + return nullptr; + } + return std::get_if(&value->value); +} + +const JsonValue::Array* jsonArray(const JsonValue* value) +{ + if (value == nullptr) + { + return nullptr; + } + return std::get_if(&value->value); +} + +bool jsonBool(const JsonValue* value, bool& out) +{ + if (value == nullptr) + { + return false; + } + + const bool* parsed = std::get_if(&value->value); + if (parsed == nullptr) + { + return false; + } + + out = *parsed; + return true; +} + +bool jsonUint32(const JsonValue* value, uint32_t& out) +{ + if (value == nullptr) + { + return false; + } + + const double* parsed = std::get_if(&value->value); + if (parsed == nullptr || + *parsed < 0.0 || + *parsed > 4294967295.0 || + *parsed != static_cast(*parsed)) + { + return false; + } + + out = static_cast(*parsed); + return true; +} + +bool applyConfigFile( + AppConfig& config, + const char* path, + std::string& error) +{ + std::ifstream file(path); + if (!file) + { + error = "failed to open config file"; + return false; + } + + const std::string text( + (std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + + std::optional rootValue = + JsonParser(text).parse(); + if (!rootValue.has_value()) + { + error = "invalid JSON"; + return false; + } + + const auto* root = + std::get_if(&rootValue->value); + if (root == nullptr) + { + error = "config root must be an object"; + return false; + } + + if (const std::string* grid = + jsonString(objectField(*root, "grid"))) + { + if (!parseGrid( + *grid, + config.gridCols, + config.gridRows)) + { + error = "grid must be x with 1-16 total feeds"; + return false; + } + resizeFeedsForGrid(config); + } + + uint32_t cols = 0; + uint32_t rows = 0; + const bool hasCols = + jsonUint32(objectField(*root, "cols"), cols); + const bool hasRows = + jsonUint32(objectField(*root, "rows"), rows); + if (hasCols || hasRows) + { + if (!hasCols || !hasRows || + cols == 0 || rows == 0 || + cols > MaxFeedCount / rows) + { + error = "cols and rows must describe 1-16 total feeds"; + return false; + } + + config.gridCols = cols; + config.gridRows = rows; + resizeFeedsForGrid(config); + } + + uint32_t fpsCap = 0; + if (jsonUint32(objectField(*root, "fpsCap"), fpsCap)) + { + if (fpsCap == 0 || fpsCap > 240) + { + error = "fpsCap must be 1-240"; + return false; + } + config.fpsCap = fpsCap; + } + + uint32_t maxV210UploadsPerFrame = 0; + if (jsonUint32( + objectField(*root, "maxV210UploadsPerFrame"), + maxV210UploadsPerFrame)) + { + if (maxV210UploadsPerFrame > MaxFeedCount) + { + error = "maxV210UploadsPerFrame must be 0-16"; + return false; + } + config.maxV210UploadsPerFrame = maxV210UploadsPerFrame; + } + + bool boolValue = false; + if (jsonBool(objectField(*root, "noFps"), boolValue)) + { + config.logFps = !boolValue; + } + if (jsonBool(objectField(*root, "perf"), boolValue)) + { + config.logPerf = boolValue; + } + if (jsonBool(objectField(*root, "verbose"), boolValue)) + { + config.verbose = boolValue; + } + if (jsonBool(objectField(*root, "paceUploads"), boolValue)) + { + config.paceUploads = boolValue; + } + + if (const std::string* present = + jsonString(objectField(*root, "present"))) + { + const std::optional mode = + parsePresentMode(*present); + if (!mode.has_value()) + { + error = "present must be fifo, mailbox, or immediate"; + return false; + } + config.presentMode = mode.value(); + } + + const JsonValue::Array* feeds = + jsonArray(objectField(*root, "feeds")); + if (feeds == nullptr) + { + return true; + } + + if (feeds->size() > MaxFeedCount) + { + error = "feeds array exceeds 16 entries"; + return false; + } + + if (feeds->size() > config.feeds.size()) + { + uint32_t side = 1; + while (side * side < feeds->size()) + { + ++side; + } + + config.gridCols = side; + config.gridRows = + static_cast( + (feeds->size() + side - 1) / side); + resizeFeedsForGrid(config); + } + + for (size_t i = 0; i < feeds->size(); ++i) + { + const auto* feedObject = + std::get_if( + &(*feeds)[i].value); + if (feedObject == nullptr) + { + error = "each feed must be an object"; + return false; + } + + FeedConfig feed; + + if (const std::string* kind = + jsonString(objectField(*feedObject, "kind"))) + { + const std::optional parsed = + parseFeedKind(*kind); + if (!parsed.has_value()) + { + error = "unknown feed kind: " + *kind; + return false; + } + feed.kind = parsed.value(); + } + + if (const std::string* domain = + jsonString(objectField(*feedObject, "domain"))) + { + feed.mxlDomain = *domain; + } + + const std::string* flow = + jsonString(objectField(*feedObject, "flow")); + if (flow == nullptr) + { + flow = jsonString(objectField(*feedObject, "flowId")); + } + if (flow != nullptr) + { + feed.mxlFlowId = *flow; + feed.kind = FeedKind::MxlSdk; + } + + config.feeds[i] = std::move(feed); + } + + return true; +} } std::optional parseFeedKind(std::string_view text) @@ -172,8 +743,11 @@ void printUsage(const char* executableName) << " --no-fps Disable FPS logging\n" << " --perf Log per-frame CPU timing breakdown\n" << " --verbose Enable detailed startup and SDK logs\n" + << " --pace-uploads Pace v210 uploads by feed frame rate\n" + << " --config Load JSON feed configuration\n" << " --grid x Set multiview grid (default 2x2, max 16 feeds)\n" << " --fps-cap Limit render loop FPS (default 60)\n" + << " --max-v210-uploads Limit v210 uploads per frame (0 = unlimited)\n" << " --present Present mode: fifo, mailbox, immediate (default mailbox)\n" << " --feed Set feed slot kind explicitly\n" << " --domain Set MXL domain for feed slot\n" @@ -191,30 +765,6 @@ ConfigParseResult parseAppConfig( { ConfigParseResult result; - for (int i = 1; i < argc; ++i) - { - if (std::string_view(argv[i]) != "--grid") - { - continue; - } - - if (i + 1 >= argc || - !parseGrid( - argv[i + 1], - result.config.gridCols, - result.config.gridRows)) - { - std::cerr << "--grid must be x with 1-" - << MaxFeedCount << " total feeds" - << std::endl; - result.shouldExit = true; - result.exitCode = 1; - return result; - } - - ++i; - } - applyDefaultFeeds(result.config); for (int i = 1; i < argc; ++i) @@ -252,6 +802,63 @@ ConfigParseResult parseAppConfig( } } + for (int i = 1; i < argc; ++i) + { + if (std::string_view(argv[i]) != "--config") + { + continue; + } + + if (i + 1 >= argc) + { + std::cerr << "--config requires " + << std::endl; + result.shouldExit = true; + result.exitCode = 1; + return result; + } + + std::string error; + if (!applyConfigFile( + result.config, + argv[i + 1], + error)) + { + std::cerr << "--config " << argv[i + 1] + << ": " << error << std::endl; + result.shouldExit = true; + result.exitCode = 1; + return result; + } + + ++i; + } + + for (int i = 1; i < argc; ++i) + { + if (std::string_view(argv[i]) != "--grid") + { + continue; + } + + if (i + 1 >= argc || + !parseGrid( + argv[i + 1], + result.config.gridCols, + result.config.gridRows)) + { + std::cerr << "--grid must be x with 1-" + << MaxFeedCount << " total feeds" + << std::endl; + result.shouldExit = true; + result.exitCode = 1; + return result; + } + + ++i; + resizeFeedsForGrid(result.config); + } + std::vector feedArgs; for (int i = 1; i < argc; ++i) @@ -276,12 +883,24 @@ ConfigParseResult parseAppConfig( continue; } + if (arg == "--pace-uploads") + { + result.config.paceUploads = true; + continue; + } + if (arg == "--grid") { ++i; continue; } + if (arg == "--config") + { + ++i; + continue; + } + if (arg == "--fps-cap") { if (i + 1 >= argc) @@ -310,6 +929,33 @@ ConfigParseResult parseAppConfig( continue; } + if (arg == "--max-v210-uploads") + { + if (i + 1 >= argc) + { + std::cerr << "--max-v210-uploads requires " + << std::endl; + result.shouldExit = true; + result.exitCode = 1; + return result; + } + + uint32_t maxUploads = 0; + if (!parseUint32(argv[i + 1], maxUploads) || + maxUploads > MaxFeedCount) + { + std::cerr << "--max-v210-uploads must be 0-" + << MaxFeedCount << std::endl; + result.shouldExit = true; + result.exitCode = 1; + return result; + } + + result.config.maxV210UploadsPerFrame = maxUploads; + ++i; + continue; + } + if (arg == "--present") { if (i + 1 >= argc) diff --git a/AppConfig.hpp b/AppConfig.hpp index 2ad0baa..2ee72db 100644 --- a/AppConfig.hpp +++ b/AppConfig.hpp @@ -41,7 +41,9 @@ struct AppConfig bool logFps = true; bool logPerf = false; bool verbose = false; + bool paceUploads = false; uint32_t fpsCap = 60; + uint32_t maxV210UploadsPerFrame = 0; uint32_t gridCols = DefaultGridCols; uint32_t gridRows = DefaultGridRows; PresentModeConfig presentMode = PresentModeConfig::Mailbox; diff --git a/IVideoFeed.hpp b/IVideoFeed.hpp index 60c5236..dbeafa4 100644 --- a/IVideoFeed.hpp +++ b/IVideoFeed.hpp @@ -41,6 +41,8 @@ public: virtual uint64_t frameVersion() const { return 0; } virtual bool hasGrainIndex() const { return false; } virtual uint64_t grainIndex() const { return 0; } + virtual bool hasFrameRate() const { return false; } + virtual double frameRate() const { return 0.0; } virtual float srcAspectRatio() const { diff --git a/MxlSdkFeed.cpp b/MxlSdkFeed.cpp index 5bef6eb..e8d7107 100644 --- a/MxlSdkFeed.cpp +++ b/MxlSdkFeed.cpp @@ -576,6 +576,21 @@ std::string MxlSdkFeed::sourceInfo() const uint64_t MxlSdkFeed::frameVersion() const { return mFrameVersion; } bool MxlSdkFeed::hasGrainIndex() const { return mFlowOpened; } uint64_t MxlSdkFeed::grainIndex() const { return mLastDisplayedIndex; } +bool MxlSdkFeed::hasFrameRate() const +{ + return mGrainRate.denominator > 0 && + mGrainRate.numerator > 0; +} +double MxlSdkFeed::frameRate() const +{ + if (!hasFrameRate()) + { + return 0.0; + } + + return static_cast(mGrainRate.numerator) / + static_cast(mGrainRate.denominator); +} float MxlSdkFeed::srcAspectRatio() const { @@ -604,6 +619,8 @@ std::string MxlSdkFeed::sourceInfo() const { return ""; } uint64_t MxlSdkFeed::frameVersion() const { return 0; } bool MxlSdkFeed::hasGrainIndex() const { return false; } uint64_t MxlSdkFeed::grainIndex() const { return 0; } +bool MxlSdkFeed::hasFrameRate() const { return false; } +double MxlSdkFeed::frameRate() const { return 0.0; } float MxlSdkFeed::srcAspectRatio() const { return 16.0f / 9.0f; } bool MxlSdkFeed::hasV210() const { return false; } const uint8_t* MxlSdkFeed::v210Data() const { return nullptr; } diff --git a/MxlSdkFeed.hpp b/MxlSdkFeed.hpp index fbbed94..b09fb19 100644 --- a/MxlSdkFeed.hpp +++ b/MxlSdkFeed.hpp @@ -38,6 +38,8 @@ public: uint64_t frameVersion() const override; bool hasGrainIndex() const override; uint64_t grainIndex() const override; + bool hasFrameRate() const override; + double frameRate() const override; float srcAspectRatio() const override; diff --git a/VulkanUtils.cpp b/VulkanUtils.cpp index a2b177c..f7bbca1 100644 --- a/VulkanUtils.cpp +++ b/VulkanUtils.cpp @@ -26,6 +26,60 @@ uint32_t findMemoryType( throw std::runtime_error("Failed to find suitable memory type"); } +uint32_t findMemoryTypeWithPreferred( + VkPhysicalDevice physicalDevice, + uint32_t typeFilter, + VkMemoryPropertyFlags requiredProperties, + VkMemoryPropertyFlags preferredProperties, + VkMemoryPropertyFlags& selectedProperties) +{ + VkPhysicalDeviceMemoryProperties memProperties; + + vkGetPhysicalDeviceMemoryProperties( + physicalDevice, + &memProperties + ); + + uint32_t fallbackIndex = UINT32_MAX; + VkMemoryPropertyFlags fallbackProperties = 0; + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; ++i) + { + if ((typeFilter & (1 << i)) == 0) + { + continue; + } + + const VkMemoryPropertyFlags flags = + memProperties.memoryTypes[i].propertyFlags; + + if ((flags & requiredProperties) != requiredProperties) + { + continue; + } + + if ((flags & preferredProperties) == preferredProperties) + { + selectedProperties = flags; + return i; + } + + if (fallbackIndex == UINT32_MAX) + { + fallbackIndex = i; + fallbackProperties = flags; + } + } + + if (fallbackIndex != UINT32_MAX) + { + selectedProperties = fallbackProperties; + return fallbackIndex; + } + + throw std::runtime_error("Failed to find suitable memory type"); +} + void createBuffer( VkDevice device, VkPhysicalDevice physicalDevice, @@ -66,6 +120,50 @@ void createBuffer( vkBindBufferMemory(device, buffer, bufferMemory, 0); } +void createBufferWithPreferredMemory( + VkDevice device, + VkPhysicalDevice physicalDevice, + VkDeviceSize size, + VkBufferUsageFlags usage, + VkMemoryPropertyFlags requiredProperties, + VkMemoryPropertyFlags preferredProperties, + VkBuffer& buffer, + VkDeviceMemory& bufferMemory, + VkMemoryPropertyFlags& selectedProperties) +{ + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = size; + bufferInfo.usage = usage; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create buffer"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(device, buffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryTypeWithPreferred( + physicalDevice, + memRequirements.memoryTypeBits, + requiredProperties, + preferredProperties, + selectedProperties + ); + + if (vkAllocateMemory(device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate buffer memory"); + } + + vkBindBufferMemory(device, buffer, bufferMemory, 0); +} + VkCommandBuffer beginSingleTimeCommands( VkDevice device, VkCommandPool commandPool) diff --git a/VulkanUtils.hpp b/VulkanUtils.hpp index c857882..b287ea8 100644 --- a/VulkanUtils.hpp +++ b/VulkanUtils.hpp @@ -9,6 +9,13 @@ uint32_t findMemoryType( uint32_t typeFilter, VkMemoryPropertyFlags properties); +uint32_t findMemoryTypeWithPreferred( + VkPhysicalDevice physicalDevice, + uint32_t typeFilter, + VkMemoryPropertyFlags requiredProperties, + VkMemoryPropertyFlags preferredProperties, + VkMemoryPropertyFlags& selectedProperties); + void createBuffer( VkDevice device, VkPhysicalDevice physicalDevice, @@ -18,6 +25,17 @@ void createBuffer( VkBuffer& buffer, VkDeviceMemory& bufferMemory); +void createBufferWithPreferredMemory( + VkDevice device, + VkPhysicalDevice physicalDevice, + VkDeviceSize size, + VkBufferUsageFlags usage, + VkMemoryPropertyFlags requiredProperties, + VkMemoryPropertyFlags preferredProperties, + VkBuffer& buffer, + VkDeviceMemory& bufferMemory, + VkMemoryPropertyFlags& selectedProperties); + VkCommandBuffer beginSingleTimeCommands( VkDevice device, VkCommandPool commandPool); diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o index 1ea7a10..d952efe 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o.d b/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o.d index 4646ef8..187d471 100644 --- a/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o.d +++ b/build-sdk/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o.d @@ -132,10 +132,9 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: \ /usr/include/c++/15/bits/stl_uninitialized.h \ /usr/include/c++/15/bits/stl_vector.h \ /usr/include/c++/15/bits/stl_bvector.h \ - /usr/include/c++/15/bits/vector.tcc /usr/include/c++/15/iostream \ - /usr/include/c++/15/ostream /usr/include/c++/15/bits/ostream.h \ - /usr/include/c++/15/ios /usr/include/c++/15/bits/ios_base.h \ - /usr/include/c++/15/ext/atomicity.h \ + /usr/include/c++/15/bits/vector.tcc /usr/include/c++/15/fstream \ + /usr/include/c++/15/istream /usr/include/c++/15/ios \ + /usr/include/c++/15/bits/ios_base.h /usr/include/c++/15/ext/atomicity.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/gthr.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/sched.h \ @@ -173,6 +172,18 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: \ /usr/include/c++/15/bits/streambuf_iterator.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/ctype_inline.h \ /usr/include/c++/15/bits/locale_facets.tcc \ - /usr/include/c++/15/bits/basic_ios.tcc \ - /usr/include/c++/15/bits/ostream.tcc /usr/include/c++/15/istream \ - /usr/include/c++/15/bits/istream.tcc + /usr/include/c++/15/bits/basic_ios.tcc /usr/include/c++/15/ostream \ + /usr/include/c++/15/bits/ostream.h /usr/include/c++/15/bits/ostream.tcc \ + /usr/include/c++/15/bits/istream.tcc /usr/include/c++/15/bits/codecvt.h \ + /usr/include/x86_64-linux-gnu/c++/15/bits/basic_file.h \ + /usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h \ + /usr/include/c++/15/bits/fstream.tcc /usr/include/c++/15/iostream \ + /usr/include/c++/15/iterator /usr/include/c++/15/bits/stream_iterator.h \ + /usr/include/c++/15/map /usr/include/c++/15/bits/stl_tree.h \ + /usr/include/c++/15/ext/aligned_buffer.h \ + /usr/include/c++/15/bits/node_handle.h \ + /usr/include/c++/15/bits/stl_map.h \ + /usr/include/c++/15/bits/stl_multimap.h \ + /usr/include/c++/15/bits/erase_if.h /usr/include/c++/15/variant \ + /usr/include/c++/15/bits/monostate.h \ + /usr/include/c++/15/bits/parse_numbers.h diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o index 0bfed65..4f848c2 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o index 6434d77..9fb5132 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o index c35940c..96bc356 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o index 5069bda..0144849 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o index 4232b93..0f960d1 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o index 100e33a..d23a9cc 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o index 2b08e9f..0144462 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o index af1047c..cd1492d 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o differ diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.internal b/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.internal index 695c98b..24123e8 100644 --- a/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.internal +++ b/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.internal @@ -21,14 +21,17 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/c++/15/bits/basic_string.tcc /usr/include/c++/15/bits/char_traits.h /usr/include/c++/15/bits/charconv.h + /usr/include/c++/15/bits/codecvt.h /usr/include/c++/15/bits/concept_check.h /usr/include/c++/15/bits/cpp_type_traits.h /usr/include/c++/15/bits/cxxabi_forced.h /usr/include/c++/15/bits/cxxabi_init_exception.h /usr/include/c++/15/bits/enable_special_members.h + /usr/include/c++/15/bits/erase_if.h /usr/include/c++/15/bits/exception.h /usr/include/c++/15/bits/exception_defines.h /usr/include/c++/15/bits/exception_ptr.h + /usr/include/c++/15/bits/fstream.tcc /usr/include/c++/15/bits/functexcept.h /usr/include/c++/15/bits/functional_hash.h /usr/include/c++/15/bits/hash_bytes.h @@ -44,12 +47,15 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/c++/15/bits/max_size_type.h /usr/include/c++/15/bits/memory_resource.h /usr/include/c++/15/bits/memoryfwd.h + /usr/include/c++/15/bits/monostate.h /usr/include/c++/15/bits/move.h /usr/include/c++/15/bits/nested_exception.h /usr/include/c++/15/bits/new_allocator.h + /usr/include/c++/15/bits/node_handle.h /usr/include/c++/15/bits/ostream.h /usr/include/c++/15/bits/ostream.tcc /usr/include/c++/15/bits/ostream_insert.h + /usr/include/c++/15/bits/parse_numbers.h /usr/include/c++/15/bits/postypes.h /usr/include/c++/15/bits/predefined_ops.h /usr/include/c++/15/bits/ptr_traits.h @@ -67,9 +73,13 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/c++/15/bits/stl_iterator.h /usr/include/c++/15/bits/stl_iterator_base_funcs.h /usr/include/c++/15/bits/stl_iterator_base_types.h + /usr/include/c++/15/bits/stl_map.h + /usr/include/c++/15/bits/stl_multimap.h /usr/include/c++/15/bits/stl_pair.h + /usr/include/c++/15/bits/stl_tree.h /usr/include/c++/15/bits/stl_uninitialized.h /usr/include/c++/15/bits/stl_vector.h + /usr/include/c++/15/bits/stream_iterator.h /usr/include/c++/15/bits/streambuf.tcc /usr/include/c++/15/bits/streambuf_iterator.h /usr/include/c++/15/bits/string_view.tcc @@ -93,16 +103,20 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/c++/15/debug/assertions.h /usr/include/c++/15/debug/debug.h /usr/include/c++/15/exception + /usr/include/c++/15/ext/aligned_buffer.h /usr/include/c++/15/ext/alloc_traits.h /usr/include/c++/15/ext/atomicity.h /usr/include/c++/15/ext/numeric_traits.h /usr/include/c++/15/ext/string_conversions.h /usr/include/c++/15/ext/type_traits.h + /usr/include/c++/15/fstream /usr/include/c++/15/initializer_list /usr/include/c++/15/ios /usr/include/c++/15/iosfwd /usr/include/c++/15/iostream /usr/include/c++/15/istream + /usr/include/c++/15/iterator + /usr/include/c++/15/map /usr/include/c++/15/new /usr/include/c++/15/numbers /usr/include/c++/15/optional @@ -116,6 +130,7 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/c++/15/tuple /usr/include/c++/15/type_traits /usr/include/c++/15/typeinfo + /usr/include/c++/15/variant /usr/include/c++/15/vector /usr/include/ctype.h /usr/include/endian.h @@ -204,8 +219,10 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h /usr/include/x86_64-linux-gnu/bits/wordsize.h /usr/include/x86_64-linux-gnu/c++/15/bits/atomic_word.h + /usr/include/x86_64-linux-gnu/c++/15/bits/basic_file.h /usr/include/x86_64-linux-gnu/c++/15/bits/c++allocator.h /usr/include/x86_64-linux-gnu/c++/15/bits/c++config.h + /usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h /usr/include/x86_64-linux-gnu/c++/15/bits/c++locale.h /usr/include/x86_64-linux-gnu/c++/15/bits/cpu_defines.h /usr/include/x86_64-linux-gnu/c++/15/bits/ctype_base.h diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.make b/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.make index 8a5e0ab..8163bb3 100644 --- a/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.make +++ b/build-sdk/CMakeFiles/mxl_multiviewer.dir/compiler_depend.make @@ -20,14 +20,17 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/c++/15/bits/basic_string.tcc \ /usr/include/c++/15/bits/char_traits.h \ /usr/include/c++/15/bits/charconv.h \ + /usr/include/c++/15/bits/codecvt.h \ /usr/include/c++/15/bits/concept_check.h \ /usr/include/c++/15/bits/cpp_type_traits.h \ /usr/include/c++/15/bits/cxxabi_forced.h \ /usr/include/c++/15/bits/cxxabi_init_exception.h \ /usr/include/c++/15/bits/enable_special_members.h \ + /usr/include/c++/15/bits/erase_if.h \ /usr/include/c++/15/bits/exception.h \ /usr/include/c++/15/bits/exception_defines.h \ /usr/include/c++/15/bits/exception_ptr.h \ + /usr/include/c++/15/bits/fstream.tcc \ /usr/include/c++/15/bits/functexcept.h \ /usr/include/c++/15/bits/functional_hash.h \ /usr/include/c++/15/bits/hash_bytes.h \ @@ -43,12 +46,15 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/c++/15/bits/max_size_type.h \ /usr/include/c++/15/bits/memory_resource.h \ /usr/include/c++/15/bits/memoryfwd.h \ + /usr/include/c++/15/bits/monostate.h \ /usr/include/c++/15/bits/move.h \ /usr/include/c++/15/bits/nested_exception.h \ /usr/include/c++/15/bits/new_allocator.h \ + /usr/include/c++/15/bits/node_handle.h \ /usr/include/c++/15/bits/ostream.h \ /usr/include/c++/15/bits/ostream.tcc \ /usr/include/c++/15/bits/ostream_insert.h \ + /usr/include/c++/15/bits/parse_numbers.h \ /usr/include/c++/15/bits/postypes.h \ /usr/include/c++/15/bits/predefined_ops.h \ /usr/include/c++/15/bits/ptr_traits.h \ @@ -66,9 +72,13 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/c++/15/bits/stl_iterator.h \ /usr/include/c++/15/bits/stl_iterator_base_funcs.h \ /usr/include/c++/15/bits/stl_iterator_base_types.h \ + /usr/include/c++/15/bits/stl_map.h \ + /usr/include/c++/15/bits/stl_multimap.h \ /usr/include/c++/15/bits/stl_pair.h \ + /usr/include/c++/15/bits/stl_tree.h \ /usr/include/c++/15/bits/stl_uninitialized.h \ /usr/include/c++/15/bits/stl_vector.h \ + /usr/include/c++/15/bits/stream_iterator.h \ /usr/include/c++/15/bits/streambuf.tcc \ /usr/include/c++/15/bits/streambuf_iterator.h \ /usr/include/c++/15/bits/string_view.tcc \ @@ -92,16 +102,20 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/c++/15/debug/assertions.h \ /usr/include/c++/15/debug/debug.h \ /usr/include/c++/15/exception \ + /usr/include/c++/15/ext/aligned_buffer.h \ /usr/include/c++/15/ext/alloc_traits.h \ /usr/include/c++/15/ext/atomicity.h \ /usr/include/c++/15/ext/numeric_traits.h \ /usr/include/c++/15/ext/string_conversions.h \ /usr/include/c++/15/ext/type_traits.h \ + /usr/include/c++/15/fstream \ /usr/include/c++/15/initializer_list \ /usr/include/c++/15/ios \ /usr/include/c++/15/iosfwd \ /usr/include/c++/15/iostream \ /usr/include/c++/15/istream \ + /usr/include/c++/15/iterator \ + /usr/include/c++/15/map \ /usr/include/c++/15/new \ /usr/include/c++/15/numbers \ /usr/include/c++/15/optional \ @@ -115,6 +129,7 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/c++/15/tuple \ /usr/include/c++/15/type_traits \ /usr/include/c++/15/typeinfo \ + /usr/include/c++/15/variant \ /usr/include/c++/15/vector \ /usr/include/ctype.h \ /usr/include/endian.h \ @@ -203,8 +218,10 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/AppC /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ /usr/include/x86_64-linux-gnu/bits/wordsize.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/atomic_word.h \ + /usr/include/x86_64-linux-gnu/c++/15/bits/basic_file.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/c++allocator.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/c++locale.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/cpu_defines.h \ /usr/include/x86_64-linux-gnu/c++/15/bits/ctype_base.h \ @@ -4918,8 +4935,6 @@ CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o: /usr/include/c++/15/filesystem: -/usr/include/c++/15/bits/node_handle.h: - /usr/include/c++/15/bits/fs_path.h: /usr/include/c++/15/bits/fs_fwd.h: @@ -5010,42 +5025,28 @@ CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o: /usr/lib/gcc/x86_64-linux-gnu/15/include/bmi2intrin.h: -/usr/include/c++/15/pstl/glue_memory_defs.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/fxsrintrin.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniintrin.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniint16intrin.h: -/usr/include/x86_64-linux-gnu/c++/15/bits/c++locale.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avxintrin.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/movdirintrin.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vpopcntdqvlintrin.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/mm_malloc.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vpopcntdqintrin.h: -/usr/include/SDL3/SDL_power.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vnnivlintrin.h: -/usr/include/c++/15/bits/ranges_util.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vp2intersectintrin.h: -/usr/include/x86_64-linux-gnu/asm/unistd_64.h: - -/usr/include/c++/15/bits/shared_ptr_base.h: - -/usr/include/c++/15/bits/stl_uninitialized.h: - -/usr/include/SDL3/SDL_endian.h: - -/usr/include/c++/15/bits/shared_ptr_atomic.h: +/usr/include/c++/15/backward/auto_ptr.h: /usr/include/c++/15/bits/exception_defines.h: /usr/include/c++/15/bits/stl_heap.h: -/usr/include/c++/15/bits/stl_construct.h: - /home/itten/mxl-multiviewer/NoSignalFeed.hpp: -/usr/include/c++/15/bits/ptr_traits.h: - -/home/itten/mxl-multiviewer/TileLayout.cpp: - /usr/lib/x86_64-linux-gnu/libXtst.so.6: /usr/include/c++/15/ext/numeric_traits.h: @@ -5066,20 +5067,28 @@ CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o: /usr/include/x86_64-linux-gnu/c++/15/bits/error_constants.h: -/home/itten/mxl-multiviewer/IVideoFeed.hpp: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniintrin.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/stddef.h: +/usr/include/x86_64-linux-gnu/c++/15/bits/c++locale.h: -/usr/include/vk_video/vulkan_video_codec_vp9std.h: +/usr/include/c++/15/pstl/glue_memory_defs.h: -/usr/lib/x86_64-linux-gnu/libdecor-0.so.0: +/usr/lib/gcc/x86_64-linux-gnu/15/include/movdirintrin.h: -/usr/include/c++/15/pstl/execution_defs.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/mm_malloc.h: -/usr/include/x86_64-linux-gnu/bits/uio_lim.h: +/usr/include/SDL3/SDL_power.h: + +/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: + +/home/itten/mxl-multiviewer/Swapchain.cpp: /usr/include/x86_64-linux-gnu/bits/waitflags.h: +/usr/include/vk_video/vulkan_video_codec_h264std_decode.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h: + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h: /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: @@ -5092,6 +5101,12 @@ CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o: /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: +CMakeFiles/mxl_multiviewer.dir/imgui/imgui_widgets.cpp.o: + +/usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h: + +/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h: + /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h: /usr/include/c++/15/bits/functexcept.h: @@ -5106,14 +5121,6 @@ CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o: /usr/include/x86_64-linux-gnu/bits/types/clock_t.h: -/usr/include/c++/15/bits/erase_if.h: - -/usr/include/c++/15/bits/std_mutex.h: - -/usr/include/c++/15/charconv: - -/usr/include/x86_64-linux-gnu/c++/15/bits/cpu_defines.h: - /usr/include/c++/15/tr1/special_function_util.h: /usr/include/c++/15/bits/stl_iterator_base_funcs.h: @@ -5138,14 +5145,12 @@ CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o: /usr/include/x86_64-linux-gnu/sys/select.h: +/usr/include/c++/15/bits/stream_iterator.h: + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: -/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: - -/home/itten/mxl-multiviewer/Swapchain.cpp: - CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/include/x86_64-linux-gnu/bits/stdint-least.h: @@ -5176,12 +5181,6 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/include/x86_64-linux-gnu/c++/15/bits/ctype_inline.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/hresetintrin.h: - -/usr/include/c++/15/bits/unique_ptr.h: - -/usr/include/c++/15/bits/move.h: - /home/itten/mxl-multiviewer/MxlFeed.hpp: /usr/include/SDL3/SDL_messagebox.h: @@ -5200,47 +5199,47 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/include/x86_64-linux-gnu/bits/cpu-set.h: -/usr/include/SDL3/SDL_mutex.h: - -/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: - /usr/include/c++/15/bits/this_thread_sleep.h: /usr/include/x86_64-linux-gnu/bits/byteswap.h: -/usr/include/x86_64-linux-gnu/bits/time64.h: - -/usr/include/c++/15/ext/aligned_buffer.h: - -/usr/include/x86_64-linux-gnu/asm/types.h: - /usr/include/SDL3/SDL_log.h: -/usr/include/stdio.h: - /usr/include/sched.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/ia32intrin.h: /usr/include/wctype.h: -/usr/include/c++/15/bits/exception.h: +/usr/include/x86_64-linux-gnu/bits/setjmp.h: -/usr/include/strings.h: - -/usr/include/asm-generic/bitsperlong.h: - -/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: /usr/include/c++/15/debug/assertions.h: -/usr/include/x86_64-linux-gnu/c++/15/bits/c++config.h: +/usr/include/linux/stddef.h: -/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: +/usr/include/SDL3/SDL_dlopennote.h: -/usr/include/SDL3/SDL_surface.h: +/usr/include/x86_64-linux-gnu/c++/15/bits/gthr-default.h: -/usr/include/c++/15/typeinfo: +/usr/include/linux/posix_types.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/features-time64.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/mwaitxintrin.h: + +/usr/include/errno.h: + +/usr/include/c++/15/cstddef: + +/usr/include/endian.h: + +/usr/include/stdint.h: /usr/include/c++/15/bits/ranges_algo.h: @@ -5252,12 +5251,6 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /home/itten/mxl-multiviewer/NoSignalFeed.cpp: -/usr/include/c++/15/bits/stl_raw_storage_iter.h: - -/usr/include/c++/15/bits/ostream.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512ifmavlintrin.h: - /usr/lib/gcc/x86_64-linux-gnu/15/libgcc_s.so: /usr/include/x86_64-linux-gnu/bits/long-double.h: @@ -5276,6 +5269,12 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/lib/gcc/x86_64-linux-gnu/15/include/avx512cdintrin.h: +/usr/include/c++/15/bits/monostate.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/limits.h: + /home/itten/mxl-multiviewer/imgui/imgui_tables.cpp: /home/itten/mxl-multiviewer/SmpteBarsFeed.hpp: @@ -5284,6 +5283,10 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vbmiintrin.h: +/usr/include/SDL3/SDL_oldnames.h: + +/usr/include/c++/15/bits/parse_numbers.h: + /usr/include/c++/15/bits/max_size_type.h: /usr/include/c++/15/bits/localefwd.h: @@ -5292,6 +5295,8 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/include/vk_video/vulkan_video_codec_av1std_decode.h: +/usr/include/x86_64-linux-gnu/bits/uio_lim.h: + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h: /usr/include/wchar.h: @@ -5308,6 +5313,20 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /usr/include/c++/15/bits/alloc_traits.h: +/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/15/bits/invoke.h: + +/usr/include/SDL3/SDL_thread.h: + +/usr/include/c++/15/bits/fstream.tcc: + +/usr/include/c++/15/bits/nested_exception.h: + +/usr/include/c++/15/bits/memoryfwd.h: + /home/itten/mxl-multiviewer/MxlSdkFeed.hpp: /usr/include/linux/close_range.h: @@ -5320,59 +5339,31 @@ CMakeFiles/mxl_multiviewer.dir/main.cpp.o: /home/itten/mxl-multiviewer/imgui/backends/imgui_impl_vulkan.cpp: -/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/platform.h: +/usr/include/locale.h: -/usr/include/c++/15/bits/range_access.h: +/usr/include/c++/15/bits/allocated_ptr.h: -/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/rational.h: +/lib64/ld-linux-x86-64.so.2: -/usr/include/c++/15/bits/cxxabi_init_exception.h: +/usr/include/c++/15/bits/istream.tcc: -/usr/include/x86_64-linux-gnu/bits/syscall.h: +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/asm-generic/bitsperlong.h: CMakeFiles/mxl_multiviewer.dir/imgui/imgui_tables.cpp.o: /usr/include/c++/15/iostream: -/usr/include/c++/15/climits: +/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/platform.h: -/usr/include/c++/15/bits/vector.tcc: +/usr/include/c++/15/bits/range_access.h: -/usr/include/c++/15/bits/cxxabi_forced.h: +CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: -/usr/include/c++/15/compare: +/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniint8intrin.h: -/usr/include/SDL3/SDL_rect.h: - -/usr/include/c++/15/bits/specfun.h: - -/usr/include/c++/15/cstddef: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/mwaitxintrin.h: - -/usr/include/errno.h: - -/usr/include/c++/15/ostream: - -/usr/include/c++/15/bits/basic_string.h: - -/usr/include/c++/15/bits/cpp_type_traits.h: - -/usr/include/c++/15/bits/ranges_cmp.h: - -/usr/include/SDL3/SDL_thread.h: - -/usr/include/c++/15/bits/fstream.tcc: - -/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: - -/usr/include/math.h: - -/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: - -/usr/include/c++/15/bits/locale_classes.h: - -/usr/include/linux/stddef.h: +/usr/include/pthread.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/wmmintrin.h: @@ -5382,20 +5373,152 @@ CMakeFiles/mxl_multiviewer.dir/imgui/imgui_tables.cpp.o: /usr/include/asm-generic/posix_types.h: -CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: +/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/rational.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniint8intrin.h: +/home/itten/mxl-multiviewer/IVideoFeed.hpp: -/usr/include/pthread.h: +/usr/lib/gcc/x86_64-linux-gnu/15/include/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/c++/15/bits/c++config.h: + +/usr/include/vk_video/vulkan_video_codec_vp9std.h: + +CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: + +/home/itten/mxl-multiviewer/Swapchain.hpp: + +/usr/include/c++/15/bits/cxxabi_init_exception.h: + +/usr/include/x86_64-linux-gnu/bits/syscall.h: + +/usr/include/c++/15/bits/enable_special_members.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512ifmavlintrin.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/sgxintrin.h: + +/usr/include/c++/15/fstream: + +/usr/include/c++/15/bits/postypes.h: + +/home/itten/mxl-multiviewer/PixelFormat.hpp: + +/home/itten/mxl-multiviewer/VulkanContext.cpp: + +/usr/include/assert.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/c++/15/bits/ranges_base.h: + +/usr/lib/x86_64-linux-gnu/libX11.so.6: + +/usr/include/x86_64-linux-gnu/sys/single_threaded.h: + +/usr/include/c++/15/bits/specfun.h: + +/usr/include/x86_64-linux-gnu/c++/15/bits/cpu_defines.h: + +/usr/include/c++/15/bits/cpp_type_traits.h: + +/usr/include/c++/15/bits/locale_classes.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/math.h: /usr/include/x86_64-linux-gnu/bits/waitstatus.h: /usr/include/asm-generic/errno-base.h: +/usr/include/c++/15/bits/codecvt.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/avxneconvertintrin.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vbmi2vlintrin.h: + +CMakeFiles/mxl_multiviewer.dir/imgui/backends/imgui_impl_sdl3.cpp.o: + +/usr/lib/x86_64-linux-gnu/libXext.so.6: + +/home/itten/mxl-multiviewer/VulkanUtils.hpp: + +/usr/include/c++/15/initializer_list: + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/adxintrin.h: +/usr/include/c++/15/bits/exception.h: + +/usr/include/c++/15/bits/basic_string.h: + +/usr/include/c++/15/ostream: + +/usr/include/strings.h: + +/usr/include/c++/15/typeinfo: + +/usr/include/SDL3/SDL_surface.h: + +/home/itten/mxl-multiviewer/AppConfig.cpp: + +/usr/include/c++/15/bits/stl_iterator_base_types.h: + +/usr/include/ctype.h: + +/usr/include/vk_video/vulkan_video_codec_h265std_encode.h: + +/usr/include/stdlib.h: + +/usr/include/c++/15/bits/locale_facets.tcc: + +/usr/include/SDL3/SDL_dialog.h: + +/usr/include/c++/15/bits/locale_facets_nonio.h: + +/usr/include/c++/15/bits/ranges_util.h: + +/usr/include/c++/15/bits/ostream.h: + +/usr/include/c++/15/bits/stl_raw_storage_iter.h: + +/usr/include/c++/15/bits/concept_check.h: + +/usr/include/c++/15/bits/version.h: + +/usr/include/c++/15/bits/node_handle.h: + +/usr/include/c++/15/bits/fs_ops.h: + +/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/flowinfo.h: + +/usr/include/c++/15/bits/charconv.h: + +/usr/include/c++/15/pstl/glue_algorithm_defs.h: + +/usr/include/c++/15/tr1/poly_laguerre.tcc: + +/usr/include/SDL3/SDL_begin_code.h: + +/home/itten/mxl-multiviewer/TileLayout.cpp: + +/usr/include/c++/15/bits/ptr_traits.h: + +/usr/include/c++/15/bits/stl_construct.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/SDL3/SDL_mutex.h: + /home/itten/mxl-multiviewer/FeedCreate.cpp: /usr/include/c++/15/bits/predefined_ops.h: @@ -5408,81 +5531,39 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/V210ComputeDecoder.cpp: -/home/itten/mxl-multiviewer/AppConfig.cpp: - -/usr/lib/x86_64-linux-gnu/libX11.so.6: - -/usr/include/x86_64-linux-gnu/sys/single_threaded.h: - -/usr/include/c++/15/bits/ranges_base.h: - -/usr/include/c++/15/bits/shared_ptr.h: - -/usr/include/c++/15/iomanip: - -/usr/include/c++/15/bits/stl_iterator_base_types.h: - -/usr/include/ctype.h: - -/usr/include/vk_video/vulkan_video_codec_h265std_encode.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avxintrin.h: - -/usr/include/stdlib.h: - -/usr/include/c++/15/bits/locale_facets.tcc: - -/usr/include/features.h: - -/usr/include/alloca.h: - -/usr/include/stdint.h: - -/usr/include/endian.h: - /usr/lib/x86_64-linux-gnu/libmpg123.so.0: /usr/include/x86_64-linux-gnu/c++/15/bits/gthr.h: /usr/include/c++/15/bits/uses_allocator.h: -/usr/include/c++/15/bits/concept_check.h: +/usr/include/alloca.h: -/usr/include/c++/15/bits/version.h: +/usr/include/c++/15/vector: -/usr/include/c++/15/bits/fs_ops.h: +/usr/include/c++/15/bits/stl_bvector.h: -/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/flowinfo.h: +/usr/include/x86_64-linux-gnu/bits/fp-fast.h: -/lib64/ld-linux-x86-64.so.2: +/usr/include/x86_64-linux-gnu/asm/types.h: -/usr/include/c++/15/bits/istream.tcc: +/usr/include/x86_64-linux-gnu/bits/time64.h: -/usr/include/c++/15/bits/charconv.h: +/usr/include/c++/15/ext/aligned_buffer.h: -/usr/include/c++/15/pstl/glue_algorithm_defs.h: - -/usr/include/c++/15/tr1/poly_laguerre.tcc: - -/usr/include/SDL3/SDL_begin_code.h: +/usr/include/c++/15/bits/ranges_cmp.h: /usr/include/x86_64-linux-gnu/sys/wait.h: /usr/include/c++/15/type_traits: -/usr/include/c++/15/map: +/usr/include/stdio.h: -/usr/include/c++/15/bits/refwrap.h: +/usr/include/c++/15/bits/stl_uninitialized.h: -/usr/include/x86_64-linux-gnu/bits/types/FILE.h: +/usr/include/c++/15/bits/shared_ptr_base.h: -/usr/include/x86_64-linux-gnu/bits/types/time_t.h: - -/usr/include/c++/15/bits/memoryfwd.h: - -/usr/include/c++/15/bits/nested_exception.h: - -/usr/include/SDL3/SDL_dlopennote.h: +/usr/include/SDL3/SDL_endian.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/pconfigintrin.h: @@ -5512,12 +5593,6 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /home/itten/mxl-multiviewer/imgui/imgui.h: -/usr/include/c++/15/bits/ranges_uninitialized.h: - -/usr/include/c++/15/bits/stl_bvector.h: - -/usr/include/x86_64-linux-gnu/bits/fp-fast.h: - /usr/include/c++/15/bits/char_traits.h: /usr/include/c++/15/cctype: @@ -5528,6 +5603,12 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /usr/include/SDL3/SDL_sensor.h: +/usr/include/c++/15/compare: + +/usr/include/c++/15/bits/cxxabi_forced.h: + +/usr/include/SDL3/SDL_rect.h: + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h: /home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/dataformat.h: @@ -5578,15 +5659,17 @@ CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o: /usr/include/c++/15/exception: -/usr/include/c++/15/bits/enable_special_members.h: +/usr/lib/x86_64-linux-gnu/libc.so.6: -CMakeFiles/mxl_multiviewer.dir/imgui/backends/imgui_impl_sdl3.cpp.o: +/usr/include/linux/types.h: -/usr/lib/x86_64-linux-gnu/libXext.so.6: +/usr/lib/gcc/x86_64-linux-gnu/15/include/amxbf16intrin.h: -/usr/include/c++/15/initializer_list: +/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/mxl.h: -/home/itten/mxl-multiviewer/VulkanUtils.hpp: +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/c++/15/ext/alloc_traits.h: /usr/include/c++/15/ext/concurrence.h: @@ -5598,11 +5681,9 @@ CMakeFiles/mxl_multiviewer.dir/imgui/backends/imgui_impl_sdl3.cpp.o: /usr/include/x86_64-linux-gnu/bits/sigevent-consts.h: -/usr/include/linux/errno.h: +/usr/include/c++/15/bits/refwrap.h: -/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h: - -/usr/include/c++/15/bits/invoke.h: +/usr/include/c++/15/map: /usr/include/c++/15/bits/basic_ios.tcc: @@ -5622,48 +5703,48 @@ CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o: /usr/include/c++/15/string: -/usr/include/c++/15/bits/stl_tempbuf.h: +/usr/include/c++/15/bits/ranges_uninitialized.h: + +/usr/include/c++/15/iomanip: + +/usr/include/c++/15/bits/shared_ptr.h: + +/usr/include/c++/15/bits/shared_ptr_atomic.h: + +/usr/include/c++/15/charconv: + +/usr/include/c++/15/bits/erase_if.h: + +/usr/include/c++/15/bits/std_mutex.h: + +/usr/include/x86_64-linux-gnu/asm/unistd_64.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/avx512dqintrin.h: +/usr/include/c++/15/bits/stl_tempbuf.h: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/hresetintrin.h: + +/usr/include/c++/15/bits/move.h: + +/usr/include/c++/15/bits/unique_ptr.h: + +/usr/include/c++/15/bits/vector.tcc: + +/usr/include/c++/15/climits: + /usr/include/c++/15/memory: /usr/include/x86_64-linux-gnu/bits/types/sigval_t.h: -/usr/include/c++/15/vector: +/usr/lib/x86_64-linux-gnu/libdecor-0.so.0: -/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: - -/usr/include/features-time64.h: - -/usr/include/x86_64-linux-gnu/c++/15/bits/gthr-default.h: - -/usr/include/linux/posix_types.h: - -/home/itten/dmf-mxl/mxl-1.0.1/lib/include/mxl/mxl.h: - -/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: - -/usr/include/c++/15/ext/alloc_traits.h: - -/usr/lib/x86_64-linux-gnu/libc.so.6: - -/usr/include/linux/types.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/amxbf16intrin.h: - -/usr/include/x86_64-linux-gnu/bits/setjmp.h: - -/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: - -/usr/include/c++/15/bits/allocated_ptr.h: - -/usr/include/locale.h: - -/usr/include/c++/15/bits/semaphore_base.h: +/usr/include/c++/15/pstl/execution_defs.h: /usr/include/x86_64-linux-gnu/c++/15/bits/basic_file.h: +/usr/include/c++/15/bits/semaphore_base.h: + /usr/include/linux/limits.h: /usr/lib/x86_64-linux-gnu/libopus.so.0: @@ -5686,10 +5767,6 @@ CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o: /usr/include/SDL3/SDL_keyboard.h: -/usr/include/c++/15/bits/codecvt.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vbmi2vlintrin.h: - /usr/include/x86_64-linux-gnu/bits/locale.h: /usr/include/x86_64-linux-gnu/bits/posix1_lim.h: @@ -5704,20 +5781,14 @@ CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o: /usr/include/x86_64-linux-gnu/bits/posix_opt.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/waitpkgintrin.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/limits.h: - -/usr/include/c++/15/bits/monostate.h: - /usr/lib/gcc/x86_64-linux-gnu/15/include/syslimits.h: /home/itten/mxl-multiviewer/FeedTexture.cpp: -/usr/include/c++/15/cwctype: - /usr/include/SDL3/SDL_hints.h: +/usr/include/c++/15/cwctype: + /home/itten/mxl-multiviewer/FeedTexture.hpp: /usr/include/vk_video/vulkan_video_codec_av1std.h: @@ -5732,22 +5803,12 @@ CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o: /usr/include/vk_video/vulkan_video_codec_h264std.h: -/usr/include/vk_video/vulkan_video_codec_h264std_decode.h: - -CMakeFiles/mxl_multiviewer.dir/imgui/imgui_widgets.cpp.o: - -/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h: - -/usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h: - -/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h: - /usr/include/vk_video/vulkan_video_codec_h264std_encode.h: -/usr/include/c++/15/bits/exception_ptr.h: - /usr/include/SDL3/SDL_storage.h: +/usr/include/c++/15/bits/exception_ptr.h: + /usr/include/vk_video/vulkan_video_codec_h265std.h: CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: @@ -5766,18 +5827,6 @@ CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: /usr/include/SDL3/SDL_pen.h: -/usr/include/c++/15/bits/postypes.h: - -/home/itten/mxl-multiviewer/PixelFormat.hpp: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/sgxintrin.h: - -/usr/include/c++/15/fstream: - -/home/itten/mxl-multiviewer/VulkanContext.cpp: - -/usr/include/assert.h: - /home/itten/mxl-multiviewer/MxlInstanceCache.cpp: /usr/include/SDL3/SDL_loadso.h: @@ -5822,14 +5871,6 @@ CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: /usr/include/c++/15/bits/locale_facets_nonio.tcc: -/usr/include/SDL3/SDL_oldnames.h: - -/usr/include/c++/15/bits/parse_numbers.h: - -/usr/include/c++/15/bits/locale_facets_nonio.h: - -/usr/include/SDL3/SDL_dialog.h: - /usr/include/c++/15/bits/quoted_string.h: /usr/include/x86_64-linux-gnu/bits/sigstack.h: @@ -5860,8 +5901,6 @@ CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: /usr/include/x86_64-linux-gnu/bits/sigstksz.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vpopcntdqintrin.h: - /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: /usr/include/c++/15/thread: @@ -5886,8 +5925,6 @@ CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: /usr/include/x86_64-linux-gnu/sys/time.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vnnivlintrin.h: - /home/itten/mxl-multiviewer/RenderPipeline.cpp: /home/itten/mxl-multiviewer/RenderPipeline.hpp: @@ -5898,10 +5935,6 @@ CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o: /usr/include/SDL3/SDL_platform.h: -CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: - -/home/itten/mxl-multiviewer/Swapchain.hpp: - /usr/include/x86_64-linux-gnu/bits/xopen_lim.h: /usr/include/c++/15/bits/atomic_wait.h: @@ -5998,6 +6031,8 @@ CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: /usr/include/c++/15/bits/basic_ios.h: +/usr/include/c++/15/variant: + /usr/lib/gcc/x86_64-linux-gnu/15/include/amxtransposeintrin.h: /usr/include/SDL3/SDL_misc.h: @@ -6064,10 +6099,6 @@ CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: /usr/include/SDL3/SDL_version.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/fxsrintrin.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avxvnniint16intrin.h: - /usr/lib/x86_64-linux-gnu/libmvec.so.1: /usr/include/x86_64-linux-gnu/sys/types.h: @@ -6132,6 +6163,8 @@ CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: /usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h: +/usr/include/c++/15/iterator: + /usr/include/x86_64-linux-gnu/bits/types/stack_t.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/amxavx512intrin.h: @@ -6211,13 +6244,3 @@ CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o: /usr/include/c++/15/bits/unicode-data.h: /usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vldqintrin.h: - -/usr/include/c++/15/backward/auto_ptr.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vp2intersectintrin.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avx512vpopcntdqvlintrin.h: - -/usr/include/x86_64-linux-gnu/bits/local_lim.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/include/avxneconvertintrin.h: diff --git a/build-sdk/CMakeFiles/mxl_multiviewer.dir/main.cpp.o b/build-sdk/CMakeFiles/mxl_multiviewer.dir/main.cpp.o index da9af86..6e1ef34 100644 Binary files a/build-sdk/CMakeFiles/mxl_multiviewer.dir/main.cpp.o and b/build-sdk/CMakeFiles/mxl_multiviewer.dir/main.cpp.o differ diff --git a/build-sdk/config.json b/build-sdk/config.json new file mode 100644 index 0000000..a8d02f0 --- /dev/null +++ b/build-sdk/config.json @@ -0,0 +1,27 @@ +{ + "grid": "2x2", + "fpsCap": 60, + "present": "mailbox", + "feeds": [ + { + "domain": "/tmp/mxl", + "flow": "aac7b492-fc2f-4869-a8a7-711ba10ee4bf" + }, + { + "domain": "/tmp/mxl", + "flow": "511f7ea0-9a48-45df-b258-f403e4deb810" + }, + { + "domain": "/tmp/mxl", + "flow": "fe28bb88-b503-4e16-9c51-894504fe7df8" + }, + { + "domain": "/tmp/mxl", + "flow": "fdd8346e-216d-4992-9586-31f4a916a951" + }, + { + "domain": "/tmp/mxl", + "flow": "64a8fe9a-8a89-441a-94b5-637c23fd6964" + } + ] +} diff --git a/build-sdk/mxl_multiviewer b/build-sdk/mxl_multiviewer index c134a31..ba97552 100755 Binary files a/build-sdk/mxl_multiviewer and b/build-sdk/mxl_multiviewer differ diff --git a/build/.ninja_deps b/build/.ninja_deps index a8a625d..bd53e45 100644 Binary files a/build/.ninja_deps and b/build/.ninja_deps differ diff --git a/build/.ninja_log b/build/.ninja_log index fb22540..9efa50b 100644 --- a/build/.ninja_log +++ b/build/.ninja_log @@ -6,75 +6,57 @@ 2 1397 1778927333260233960 CMakeFiles/multiview_test.dir/imgui/imgui_widgets.cpp.o fd62c43f9b0da4fb 1 1509 1778927333259086969 CMakeFiles/multiview_test.dir/imgui/imgui.cpp.o 184c54d1d7f8da34 3 593 1778927572649246506 CMakeFiles/multiview_test.dir/main.cpp.o b6b27a2b15f1d256 -3 1753 1779007423070775331 CMakeFiles/mxl_multiviewer.dir/main.cpp.o 74ec6e8ad51ac778 -1753 1929 1779007424820737076 mxl_multiviewer cdec97a9a3fabbaf -1 76 1779007718320780480 build.ninja 6c533b4704507e25 -1 76 1779007718319320950 /home/itten/mxl-multiviewer/build/cmake_install.cmake 6c533b4704507e25 -4 301 1778983233967716048 CMakeFiles/mxl_multiviewer.dir/FakeFeed.cpp.o 5e0b3d1cb566d05a -4 529 1779007423072713130 CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o 93407c7ad5167d54 -4 718 1779007423073204668 CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o 69d711f0c48f92ec -2 697 1778977198978521832 CMakeFiles/mxl_multiviewer.dir/FeedFactory.cpp.o 6eef4c3632622be1 -10 702 1779007013771260189 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 970034ac264b5657 -2 555 1778979545142358597 CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o a2065395257d96dd -3 416 1778981452702032549 CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o c4af20d1203eab69 -4 556 1778981355664862320 CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o 37993e8dd95f73ed -4 684 1779007189118962700 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o f6bae6695ad450e3 -2 843 1778977328847325588 CMakeFiles/mxl_multiviewer.dir/VulkanContext.cpp.o e40207fe55f6123f -4 886 1778983008534577859 CMakeFiles/mxl_multiviewer.dir/Swapchain.cpp.o 9b30fbbe9a04c9f3 -4 1664 1779007423072928867 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o d76d11a126fb2fc3 -11 452 1779007013771846780 CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o 9ea093f5f6628b8f -3 844 1779007423072250645 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 40e954a9c2dbd11f -1 445 1778980407712453965 CMakeFiles/v210_test.dir/v210_test.cpp.o 682a0bc85afb62d1 -445 523 1778980408156444438 v210_test 4225e54a48d1d5e7 -4 789 1778981355665094260 CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o f17de5555db36a7c -4 533 1779007423072479652 CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o 54ed93bfc21c9ce4 +9 3997 1779054776007096538 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3998 4649 1779054779996013156 mxl_multiviewer 205aad974c69f886 1 73 1779007718320780480 build.ninja 6c533b4704507e25 1 73 1779007718320780480 /home/itten/mxl-multiviewer/build/cmake_install.cmake 6c533b4704507e25 +4 301 1778983233967716048 CMakeFiles/mxl_multiviewer.dir/FakeFeed.cpp.o 5e0b3d1cb566d05a +12 905 1779007718338349519 CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o cd8f13ea68566562 +330 1484 1779007718656313583 CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o 9f5909ef338d6f84 +2 697 1778977198978521832 CMakeFiles/mxl_multiviewer.dir/FeedFactory.cpp.o 6eef4c3632622be1 +12 2727 1779054312183791887 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 +5 774 1779009114556786973 CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o 92548a3beaf6cc2a +10 1100 1779054776009391713 CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o 94922b0abaec7af0 +10 1303 1779054776008096517 CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o 465574e8abbc9d5d +5 803 1779009114557038260 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o 25f2e2a829e624ca +809 2567 1779007719135303112 CMakeFiles/mxl_multiviewer.dir/VulkanContext.cpp.o 24d381eb6627ff86 +1447 3074 1779007719773289165 CMakeFiles/mxl_multiviewer.dir/Swapchain.cpp.o 836fd7034af2b687 +13 3795 1779054312186396526 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o 351bcf65838bfc2a +13 809 1779007718339320513 CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o 57a3a622c77e76d2 +13 1859 1779054312184791866 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 +1 445 1778980407712453965 CMakeFiles/v210_test.dir/v210_test.cpp.o 682a0bc85afb62d1 +445 523 1778980408156444438 v210_test 4225e54a48d1d5e7 +12 1679 1779054776010096476 CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o e19e2ad84bfeb27f +5 466 1779009941332887356 CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o 60fdc117eb712bfb 5 330 1779007718331633644 CMakeFiles/mxl_multiviewer.dir/imgui/backends/imgui_impl_sdl3.cpp.o 2c9f9be8bffd084e 5 741 1779007718331977818 CMakeFiles/mxl_multiviewer.dir/imgui/backends/imgui_impl_vulkan.cpp.o 8c0e4a436c69f5e7 -13 809 1779007718339320513 CMakeFiles/mxl_multiviewer.dir/MxlInstanceCache.cpp.o 57a3a622c77e76d2 -12 905 1779007718338349519 CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o cd8f13ea68566562 -7 1447 1779007718333978263 CMakeFiles/mxl_multiviewer.dir/FeedTexture.cpp.o 465574e8abbc9d5d -330 1484 1779007718656313583 CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o 9f5909ef338d6f84 -6 1501 1779007718332320666 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 -7 1503 1779007718333320644 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 -10 1623 1779007718336320578 CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o 60fdc117eb712bfb -905 1869 1779007719231301013 CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o 94922b0abaec7af0 -741 2467 1779007719067304598 CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o 92548a3beaf6cc2a -809 2567 1779007719135303112 CMakeFiles/mxl_multiviewer.dir/VulkanContext.cpp.o 24d381eb6627ff86 4 2605 1779007718331033084 CMakeFiles/mxl_multiviewer.dir/imgui/imgui_tables.cpp.o a09d10ce44cb3e25 -1484 2927 1779007719810288356 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o 25f2e2a829e624ca -1447 3074 1779007719773289165 CMakeFiles/mxl_multiviewer.dir/Swapchain.cpp.o 836fd7034af2b687 -3 3125 1779007718330030033 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -1501 3139 1779007719827287985 CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o e19e2ad84bfeb27f 4 3229 1779007718330752185 CMakeFiles/mxl_multiviewer.dir/imgui/imgui_draw.cpp.o 1a20a9661d6284ca -14 3290 1779007718341320469 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o 351bcf65838bfc2a 4 3443 1779007718331330396 CMakeFiles/mxl_multiviewer.dir/imgui/imgui_widgets.cpp.o bdac470fb57774d5 3 3611 1779007718330343966 CMakeFiles/mxl_multiviewer.dir/imgui/imgui.cpp.o f1eaf5c81331737a -3611 3867 1779007721937241859 mxl_multiviewer 205aad974c69f886 -5 1543 1779008117816579924 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -5 1582 1779008117818216500 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o 351bcf65838bfc2a -1582 1829 1779008119393545416 mxl_multiviewer 205aad974c69f886 -4 730 1779008283108962935 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 -5 1517 1779008283109962913 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o 351bcf65838bfc2a -1517 1756 1779008284621929827 mxl_multiviewer 205aad974c69f886 -4 699 1779008561069442869 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o 25f2e2a829e624ca -4 1494 1779008561067880534 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -1494 1736 1779008562557847930 mxl_multiviewer 205aad974c69f886 -4 555 1779008749414207666 CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o 92548a3beaf6cc2a -4 729 1779008749414419772 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o 25f2e2a829e624ca -4 1523 1779008749412759102 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -1523 1764 1779008750931725863 mxl_multiviewer 205aad974c69f886 -5 774 1779009114556786973 CMakeFiles/mxl_multiviewer.dir/TileLayout.cpp.o 92548a3beaf6cc2a -5 803 1779009114557038260 CMakeFiles/mxl_multiviewer.dir/RenderPipeline.cpp.o 25f2e2a829e624ca -5 840 1779009114556529890 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 -4 900 1779009114556313105 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 -4 1724 1779009114554768928 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -1724 1975 1779009116274731292 mxl_multiviewer 205aad974c69f886 -4 622 1779009150878974069 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 -622 872 1779009151496960546 mxl_multiviewer 205aad974c69f886 -4 1574 1779009183315264286 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 -1574 1833 1779009184885229931 mxl_multiviewer 205aad974c69f886 -5 466 1779009941332887356 CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o 60fdc117eb712bfb -5 662 1779009941331679183 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 -662 919 1779009941988664817 mxl_multiviewer 205aad974c69f886 +6 1567 1779054848235586712 CMakeFiles/mxl_multiviewer.dir/V210ComputeDecoder.cpp.o e19e2ad84bfeb27f +5 3876 1779054848233586753 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3876 4531 1779054852104505838 mxl_multiviewer 205aad974c69f886 +14 1616 1779055038103617809 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 +12 2722 1779055038101617851 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 +11 3707 1779055055333257650 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3708 4394 1779055059030180371 mxl_multiviewer 205aad974c69f886 +8 3819 1779055227410660634 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3820 4512 1779055231222580951 mxl_multiviewer 205aad974c69f886 +13 1066 1779055934426291311 CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o cd8f13ea68566562 +13 1203 1779055934424881577 CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o 60fdc117eb712bfb +16 1233 1779055934427881514 CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o 9f5909ef338d6f84 +12 1900 1779055934423881598 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 +14 3929 1779055934426881535 CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o 351bcf65838bfc2a +10 4326 1779055934421881640 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +4326 5010 1779055938737791422 mxl_multiviewer 205aad974c69f886 +12 1766 1779056220053910937 CMakeFiles/mxl_multiviewer.dir/FeedCreate.cpp.o 4db48c69f1f95087 +10 2486 1779056220051910978 CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o 8761582270eea4c9 +6 3931 1779056220047911062 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3932 4606 1779056223973828997 mxl_multiviewer 205aad974c69f886 +10 3933 1779056371682741367 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3934 4592 1779056375606659343 mxl_multiviewer 205aad974c69f886 +10 3775 1779056501994010048 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3775 4452 1779056505758931079 mxl_multiviewer 205aad974c69f886 +13 3972 1779056635253214966 CMakeFiles/mxl_multiviewer.dir/main.cpp.o cfdc8d343a283e56 +3972 4674 1779056639212131929 mxl_multiviewer 205aad974c69f886 diff --git a/build/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o index 3940e28..061431f 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/AppConfig.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o index 729d0a3..edba41e 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/MxlFeed.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o index 67541d4..21436bc 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/MxlSdkFeed.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o index c29f6d6..cfd8e7a 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/NoSignalFeed.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o index 0093345..e3971f8 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/SmpteBarsFeed.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o index 2aa506d..9c92226 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/VulkanUtils.cpp.o differ diff --git a/build/CMakeFiles/mxl_multiviewer.dir/main.cpp.o b/build/CMakeFiles/mxl_multiviewer.dir/main.cpp.o index 169e522..dc952cc 100644 Binary files a/build/CMakeFiles/mxl_multiviewer.dir/main.cpp.o and b/build/CMakeFiles/mxl_multiviewer.dir/main.cpp.o differ diff --git a/build/mxl_multiviewer b/build/mxl_multiviewer index bee063b..4cc6e05 100755 Binary files a/build/mxl_multiviewer and b/build/mxl_multiviewer differ diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..08e0a2e --- /dev/null +++ b/config.example.json @@ -0,0 +1,23 @@ +{ + "grid": "2x2", + "fpsCap": 60, + "paceUploads": false, + "maxV210UploadsPerFrame": 0, + "present": "mailbox", + "feeds": [ + { + "domain": "/tmp/mxl", + "flow": "853a9cda-0f7a-4b48-b2df-b3f628440150" + }, + { + "domain": "/tmp/mxl", + "flow": "fab60e17-f721-4e12-a7dd-312f5f6e502d" + }, + { + "kind": "nosignal" + }, + { + "kind": "smpte" + } + ] +} diff --git a/main.cpp b/main.cpp index 1c8d906..57c2f7a 100644 --- a/main.cpp +++ b/main.cpp @@ -45,17 +45,46 @@ struct PerfStats uint64_t frames = 0; uint64_t feedReadTicks = 0; uint64_t uploadDecodeTicks = 0; + uint64_t stageCopyTicks = 0; + uint64_t uploadRecordTicks = 0; uint64_t submitPresentTicks = 0; uint64_t idleDelayTicks = 0; uint64_t frameTicks = 0; }; +struct FramePerfStats +{ + uint64_t eventTicks = 0; + uint64_t fenceWaitTicks = 0; + uint64_t feedReadTicks = 0; + uint64_t stageCopyTicks = 0; + uint64_t maxStageCopyTicks = 0; + uint64_t maxStageCopyBytes = 0; + uint32_t maxStageCopyFeed = 0; + uint32_t stageCopies = 0; + uint32_t v210StageCopies = 0; + uint64_t uploadRecordTicks = 0; + uint64_t layoutTicks = 0; + uint64_t imguiTicks = 0; + uint64_t drawRecordTicks = 0; + uint64_t acquireTicks = 0; + uint64_t submitPresentTicks = 0; + uint64_t idleDelayTicks = 0; +}; + struct FeedPerfStats { uint64_t updates = 0; + uint64_t uploads = 0; + uint64_t deferredUploads = 0; uint64_t repeats = 0; uint64_t skippedGrains = 0; uint64_t lastGrain = 0; + uint64_t lastUploadTicks = 0; + uint64_t uploadIntervalTicks = 0; + uint64_t minUploadIntervalTicks = UINT64_MAX; + uint64_t maxUploadIntervalTicks = 0; + uint64_t uploadIntervals = 0; bool hasLastGrain = false; }; @@ -721,6 +750,11 @@ int main(int argc, char* argv[]) std::vector v210FeedReady(feedCount); std::vector uploadedVersions(feedCount); std::vector feedUploadNeeded(feedCount); + std::vector pendingFrames(feedCount); + std::vector pendingVersions(feedCount); + std::vector pendingUploadNeeded(feedCount); + std::vector feedUploadCredits(feedCount, 1.0); + uint64_t lastUploadPaceTicks = SDL_GetPerformanceCounter(); std::fill( uploadedVersions.begin(), @@ -1026,9 +1060,14 @@ int main(int argc, char* argv[]) const Uint64 frameStartTicks = SDL_GetTicks(); const uint64_t perfFrameStartTicks = SDL_GetPerformanceCounter(); + FramePerfStats framePerf; + uint64_t perfSectionStartTicks = 0; SDL_Event event; + perfSectionStartTicks = + SDL_GetPerformanceCounter(); + while (SDL_PollEvent(&event)) { ImGui_ImplSDL3_ProcessEvent(&event); @@ -1048,11 +1087,18 @@ int main(int argc, char* argv[]) if (event.key.key == SDLK_ESCAPE) { g_running = false; - } + } break; } } + if (config.logPerf) + { + framePerf.eventTicks += + SDL_GetPerformanceCounter() - + perfSectionStartTicks; + } + // ---- resize handling ---- if (framebufferResized) @@ -1124,7 +1170,7 @@ int main(int argc, char* argv[]) // ---- frame timing ---- - uint64_t perfSectionStartTicks = + perfSectionStartTicks = SDL_GetPerformanceCounter(); vkWaitForFences( @@ -1142,9 +1188,12 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.submitPresentTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.submitPresentTicks += elapsed; + framePerf.fenceWaitTicks += elapsed; + framePerf.submitPresentTicks += elapsed; } ++frameCounter; @@ -1178,6 +1227,47 @@ int main(int argc, char* argv[]) feedUploadNeeded.end(), false ); + std::fill( + pendingFrames.begin(), + pendingFrames.end(), + nullptr + ); + std::fill( + pendingUploadNeeded.begin(), + pendingUploadNeeded.end(), + false + ); + + const uint64_t uploadPaceTicks = + SDL_GetPerformanceCounter(); + const double uploadPaceDeltaSeconds = + static_cast( + uploadPaceTicks - lastUploadPaceTicks) / + static_cast(perfFrequency); + lastUploadPaceTicks = uploadPaceTicks; + + if (config.paceUploads) + { + for (uint32_t i = 0; i < feedCount; ++i) + { + if (!feeds[i]->hasFrameRate()) + { + continue; + } + + const double rate = + std::min( + feeds[i]->frameRate(), + static_cast(config.fpsCap) + ); + feedUploadCredits[i] = + std::min( + 2.0, + feedUploadCredits[i] + + rate * uploadPaceDeltaSeconds + ); + } + } for (uint32_t i = 0; i < feedCount; ++i) { @@ -1193,9 +1283,11 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.feedReadTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.feedReadTicks += elapsed; + framePerf.feedReadTicks += elapsed; if (uploadNeeded) { @@ -1231,10 +1323,55 @@ int main(int argc, char* argv[]) continue; } + pendingFrames[i] = &frame; + pendingVersions[i] = version; + pendingUploadNeeded[i] = true; + } + + const uint32_t maxV210Uploads = + config.maxV210UploadsPerFrame == 0 + ? feedCount + : config.maxV210UploadsPerFrame; + uint32_t v210UploadsThisFrame = 0; + const uint32_t uploadStart = + feedCount == 0 ? 0 : frameCounter % feedCount; + + for (uint32_t offset = 0; offset < feedCount; ++offset) + { + const uint32_t i = + (uploadStart + offset) % feedCount; + + if (!pendingUploadNeeded[i]) + { + continue; + } + + const bool isV210 = feeds[i]->hasV210(); + if (config.paceUploads && + isV210 && + feeds[i]->hasFrameRate() && + feedUploadCredits[i] < 1.0) + { + if (config.logPerf) + { + ++feedPerfStats[i].deferredUploads; + } + continue; + } + + if (isV210 && v210UploadsThisFrame >= maxV210Uploads) + { + if (config.logPerf) + { + ++feedPerfStats[i].deferredUploads; + } + continue; + } + perfSectionStartTicks = SDL_GetPerformanceCounter(); - if (feeds[i]->hasV210()) + if (isV210) { if (!v210FeedReady[i]) { @@ -1284,7 +1421,7 @@ int main(int argc, char* argv[]) else { copyFrameToFeedTextureStaging( - frame, + *pendingFrames[i], imageSize, feedTextures[i] ); @@ -1292,17 +1429,79 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.uploadDecodeTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.stageCopyTicks += elapsed; + perfStats.uploadDecodeTicks += elapsed; + framePerf.stageCopyTicks += elapsed; + ++framePerf.stageCopies; + if (isV210) + { + ++framePerf.v210StageCopies; + } + if (elapsed > framePerf.maxStageCopyTicks) + { + framePerf.maxStageCopyTicks = elapsed; + framePerf.maxStageCopyFeed = i + 1; + framePerf.maxStageCopyBytes = + isV210 + ? static_cast( + feeds[i]->v210Stride()) * + feeds[i]->v210Height() + : static_cast(imageSize); + } } - uploadedVersions[i] = version; + uploadedVersions[i] = pendingVersions[i]; + if (isV210) + { + ++v210UploadsThisFrame; + if (config.paceUploads && + feeds[i]->hasFrameRate()) + { + feedUploadCredits[i] = + std::max( + 0.0, + feedUploadCredits[i] - 1.0 + ); + } + } + if (config.logPerf) + { + ++feedPerfStats[i].uploads; + + const uint64_t uploadTicks = + SDL_GetPerformanceCounter(); + if (feedPerfStats[i].lastUploadTicks != 0) + { + const uint64_t interval = + uploadTicks - + feedPerfStats[i].lastUploadTicks; + feedPerfStats[i].uploadIntervalTicks += + interval; + feedPerfStats[i].minUploadIntervalTicks = + std::min( + feedPerfStats[i].minUploadIntervalTicks, + interval + ); + feedPerfStats[i].maxUploadIntervalTicks = + std::max( + feedPerfStats[i].maxUploadIntervalTicks, + interval + ); + ++feedPerfStats[i].uploadIntervals; + } + feedPerfStats[i].lastUploadTicks = uploadTicks; + } feedUploadNeeded[i] = true; } // ---- update vertex UVs for aspect ratio ---- + perfSectionStartTicks = + SDL_GetPerformanceCounter(); + VkExtent2D swapExtent = swapchain.extent(); const float gapX = 2.0f * TILE_GAP_PIXELS / @@ -1349,8 +1548,18 @@ int main(int argc, char* argv[]) static_cast(vbSize) ); + if (config.logPerf) + { + framePerf.layoutTicks += + SDL_GetPerformanceCounter() - + perfSectionStartTicks; + } + // ---- ImGui frame ---- + perfSectionStartTicks = + SDL_GetPerformanceCounter(); + ImGui_ImplVulkan_NewFrame(); ImGui_ImplSDL3_NewFrame(); ImGui::NewFrame(); @@ -1364,6 +1573,13 @@ int main(int argc, char* argv[]) ImGui::Render(); ImDrawData* imguiDrawData = ImGui::GetDrawData(); + if (config.logPerf) + { + framePerf.imguiTicks += + SDL_GetPerformanceCounter() - + perfSectionStartTicks; + } + // ---- record upload commands ---- perfSectionStartTicks = @@ -1431,9 +1647,12 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.uploadDecodeTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.uploadRecordTicks += elapsed; + perfStats.uploadDecodeTicks += elapsed; + framePerf.uploadRecordTicks += elapsed; } // ---- acquire swapchain image ---- @@ -1453,6 +1672,13 @@ int main(int argc, char* argv[]) &imageIndex ); + if (config.logPerf) + { + framePerf.acquireTicks += + SDL_GetPerformanceCounter() - + perfSectionStartTicks; + } + if (acquireResult == VK_ERROR_OUT_OF_DATE_KHR) { std::cout @@ -1471,14 +1697,27 @@ int main(int argc, char* argv[]) ); } + perfSectionStartTicks = + SDL_GetPerformanceCounter(); + recordDrawCmdBuf( drawCmdBufs[imageIndex], imageIndex, imguiDrawData ); + if (config.logPerf) + { + framePerf.drawRecordTicks += + SDL_GetPerformanceCounter() - + perfSectionStartTicks; + } + // ---- submit ---- + perfSectionStartTicks = + SDL_GetPerformanceCounter(); + VkPipelineStageFlags waitStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; @@ -1554,9 +1793,11 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.submitPresentTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.submitPresentTicks += elapsed; + framePerf.submitPresentTicks += elapsed; } const Uint64 frameElapsedTicks = @@ -1575,9 +1816,11 @@ int main(int argc, char* argv[]) if (config.logPerf) { - perfStats.idleDelayTicks += + const uint64_t elapsed = SDL_GetPerformanceCounter() - perfSectionStartTicks; + perfStats.idleDelayTicks += elapsed; + framePerf.idleDelayTicks += elapsed; } } @@ -1586,7 +1829,76 @@ int main(int argc, char* argv[]) ++perfStats.frames; const uint64_t now = SDL_GetPerformanceCounter(); - perfStats.frameTicks += now - perfFrameStartTicks; + const uint64_t currentFrameTicks = + now - perfFrameStartTicks; + perfStats.frameTicks += currentFrameTicks; + + const double invMs = + 1000.0 / + static_cast(perfFrequency); + + if (currentFrameTicks * invMs > 25.0) + { + const uint64_t accountedTicks = + framePerf.eventTicks + + framePerf.fenceWaitTicks + + framePerf.feedReadTicks + + framePerf.stageCopyTicks + + framePerf.uploadRecordTicks + + framePerf.layoutTicks + + framePerf.imguiTicks + + framePerf.drawRecordTicks + + framePerf.acquireTicks + + framePerf.submitPresentTicks + + framePerf.idleDelayTicks; + const uint64_t otherTicks = + currentFrameTicks > accountedTicks + ? currentFrameTicks - accountedTicks + : 0; + + std::cout + << "SPIKE frame=" + << (currentFrameTicks * invMs) + << "ms event=" + << (framePerf.eventTicks * invMs) + << "ms fence=" + << (framePerf.fenceWaitTicks * invMs) + << "ms feedRead=" + << (framePerf.feedReadTicks * invMs) + << "ms stageCopy=" + << (framePerf.stageCopyTicks * invMs) + << "ms stageCopies=" + << framePerf.stageCopies + << " v210Copies=" + << framePerf.v210StageCopies + << " maxCopy=f" + << framePerf.maxStageCopyFeed + << ":" + << (framePerf.maxStageCopyTicks * invMs) + << "ms/" + << (static_cast( + framePerf.maxStageCopyBytes) / + (1024.0 * 1024.0)) + << "MiB" + << " uploadRecord=" + << (framePerf.uploadRecordTicks * invMs) + << "ms layout=" + << (framePerf.layoutTicks * invMs) + << "ms imgui=" + << (framePerf.imguiTicks * invMs) + << "ms drawRecord=" + << (framePerf.drawRecordTicks * invMs) + << "ms acquire=" + << (framePerf.acquireTicks * invMs) + << "ms submitPresent=" + << (framePerf.submitPresentTicks * invMs) + << "ms idleDelay=" + << (framePerf.idleDelayTicks * invMs) + << "ms other=" + << (otherTicks * invMs) + << "ms" + << std::endl; + } const uint64_t elapsedTicks = now - lastPerfLogTicks; @@ -1595,9 +1907,6 @@ int main(int argc, char* argv[]) const double elapsedSeconds = static_cast(elapsedTicks) / static_cast(perfFrequency); - const double invMs = - 1000.0 / - static_cast(perfFrequency); const double frames = static_cast(perfStats.frames); @@ -1607,6 +1916,10 @@ int main(int argc, char* argv[]) << (perfStats.feedReadTicks * invMs / frames) << "ms uploadDecode=" << (perfStats.uploadDecodeTicks * invMs / frames) + << "ms stageCopy=" + << (perfStats.stageCopyTicks * invMs / frames) + << "ms uploadRecord=" + << (perfStats.uploadRecordTicks * invMs / frames) << "ms submitPresent=" << (perfStats.submitPresentTicks * invMs / frames) << "ms idleDelay=" @@ -1625,6 +1938,8 @@ int main(int argc, char* argv[]) << feedRuntimeStatusName( feeds[i]->status()) << ":upd=" << feedPerfStats[i].updates + << ",upl=" << feedPerfStats[i].uploads + << ",def=" << feedPerfStats[i].deferredUploads << ",rep=" << feedPerfStats[i].repeats; if (feedPerfStats[i].hasLastGrain) @@ -1638,6 +1953,44 @@ int main(int argc, char* argv[]) } std::cout << std::endl; + std::cout << "JITTER"; + for (uint32_t i = 0; i < feedCount; ++i) + { + std::cout << " f" << (i + 1) + << ":upl=" << feedPerfStats[i].uploads; + + if (feedPerfStats[i].uploadIntervals > 0) + { + const double avgMs = + feedPerfStats[i].uploadIntervalTicks * + invMs / + static_cast( + feedPerfStats[i].uploadIntervals); + const double minMs = + feedPerfStats[i].minUploadIntervalTicks * + invMs; + const double maxMs = + feedPerfStats[i].maxUploadIntervalTicks * + invMs; + + std::cout + << ",avg=" << avgMs + << "ms,min=" << minMs + << "ms,max=" << maxMs + << "ms"; + } + + if (feeds[i]->hasFrameRate() && + feeds[i]->frameRate() > 0.0) + { + std::cout + << ",exp=" + << (1000.0 / feeds[i]->frameRate()) + << "ms"; + } + } + std::cout << std::endl; + ThreadCpuSamples currentThreadCpuSamples = collectThreadCpuSamples(); printThreadCpuPerf(