blob: 7f438e3154f521a1abc81d2ed722f8d4bdf2b494 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/lib/escher/test/vk_debug_report_collector.h"
#include <gtest/gtest.h>
namespace escher::test {
namespace impl {
uint32_t VkDebugReportCollector::HandleDebugReport(VkFlags flags,
VkDebugReportObjectTypeEXT object_type,
uint64_t object, size_t location,
int32_t message_code, const char *layer_prefix,
const char *message, void *user_data) {
vk::DebugReportFlagsEXT flags_ext(static_cast<vk::DebugReportFlagBitsEXT>(flags));
vk::DebugReportObjectTypeEXT object_type_ext(
static_cast<vk::DebugReportObjectTypeEXT>(object_type));
auto &debug_reports = static_cast<VkDebugReportCollector *>(user_data)->debug_reports_;
debug_reports.emplace_back(VkDebugReport{.flags = flags_ext,
.object_type = object_type_ext,
.object = object,
.layer_prefix = layer_prefix,
.message_code = message_code,
.message = message});
return false;
}
bool VkDebugReportCollector::PrintDebugReportsOnFalsePredicate(
const vk::DebugReportFlagsEXT &flags, size_t num_threshold,
const std::function<bool(size_t, size_t)> &pred, const char *file, size_t line) const {
auto debug_reports_with_flags = DebugReportsWithFlag(flags);
bool result = true;
if (!pred(debug_reports_with_flags.size(), num_threshold)) {
for (const auto &debug_report : debug_reports_with_flags) {
GTEST_MESSAGE_AT_(file, line, debug_report.ErrorMessage().c_str(),
::testing::TestPartResult::kNonFatalFailure);
}
result = false;
}
return result;
}
std::vector<VkDebugReportCollector::VkDebugReport> VkDebugReportCollector::DebugReportsWithFlag(
const vk::DebugReportFlagsEXT &flags) const {
std::vector<VkDebugReport> result = {};
std::copy_if(debug_reports_.begin(), debug_reports_.end(), std::back_inserter(result),
[flags](const auto &report) { return report.flags & flags; });
return result;
}
void VkDebugReportCollector::SuppressDebugReportsWithFlag(const vk::DebugReportFlagsEXT &flags) {
auto end = std::remove_if(
debug_reports_.begin(), debug_reports_.end(),
[flags](const VkDebugReport &debug_report) { return flags & debug_report.flags; });
debug_reports_.erase(end, debug_reports_.end());
}
} // namespace impl
} // namespace escher::test