blob: 17f64635c7561229ee40908b0894ef11db1d73b2 [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.
#ifndef SRC_UI_LIB_ESCHER_TEST_VK_DEBUG_REPORT_CALLBACK_REGISTRY_H_
#define SRC_UI_LIB_ESCHER_TEST_VK_DEBUG_REPORT_CALLBACK_REGISTRY_H_
#include <utility>
#include <vector>
#include "src/ui/lib/escher/test/test_with_vk_validation_layer_macros.h"
#include "src/ui/lib/escher/vk/vulkan_instance.h"
namespace escher::test {
namespace impl {
// Registry and storage of Vulkan validation callback functions
// used in |escher::test::TestWithVkValidationLayer|.
//
// A test fixture can have an instance of |VkDebugReportCallbackRegistry| as its member to register
// validation debug report callbacks; they need to set up callback functions in their initializer,
// and call |RegisterDebugReportCallbacks()| and |DeregisterDebugReportCallbacks()| functions
// explicitly in their own |SetUp()| and |TearDown()| functions.
//
class VkDebugReportCallbackRegistry {
public:
VkDebugReportCallbackRegistry(VulkanInstancePtr instance,
std::optional<VulkanInstance::DebugReportCallback> main_callback,
std::vector<VulkanInstance::DebugReportCallback> optional_callbacks)
: instance_(instance),
main_callback_(std::move(main_callback)),
optional_callbacks_(std::move(optional_callbacks)) {}
VulkanInstancePtr instance() const { return instance_; }
void SetMainDebugReportCallback(VulkanInstance::DebugReportCallback callback) {
FXL_CHECK(!main_callback_handle_);
main_callback_ = std::make_optional(std::move(callback));
}
void SetOptionalDebugReportCallbacks(std::vector<VulkanInstance::DebugReportCallback> callbacks) {
FXL_CHECK(optional_callback_handles_.empty());
optional_callbacks_ = std::move(callbacks);
}
void RegisterDebugReportCallbacks();
void DeregisterDebugReportCallbacks();
private:
VulkanInstancePtr instance_;
std::optional<VulkanInstance::DebugReportCallback> main_callback_ = std::nullopt;
std::optional<VulkanInstance::DebugReportCallbackHandle> main_callback_handle_ = std::nullopt;
std::vector<VulkanInstance::DebugReportCallback> optional_callbacks_ = {};
std::vector<VulkanInstance::DebugReportCallbackHandle> optional_callback_handles_ = {};
};
} // namespace impl
} // namespace escher::test
#endif // SRC_UI_LIB_ESCHER_TEST_VK_DEBUG_REPORT_CALLBACK_REGISTRY_H_