blob: 04996b8a8b83bb3e12f455469875b2b80c1154a0 [file] [log] [blame]
// Copyright 2019 The Chromium OS 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_TESTBASE_H_
#define SRC_TESTBASE_H_
#include <vulkan/vulkan.hpp>
#include <string>
#include <vector>
#include "src/filepath.h"
#include "src/utils.h"
#include "src/vkBase.h"
namespace vkbench {
class testBase {
public:
virtual ~testBase() {}
// Name of test.
const std::string Name() const { return name_; }
// Description of the test.
const std::string Desp() const { return desp_; }
// Unit for formatted measurement.
virtual const char* Unit() const = 0;
// Given time elapse per iteration, format it into meaningful numbers.
virtual double FormatMeasurement(double time) { return time; }
// Image returns the rendered image.
virtual Image GetImage() const {
NOT_SUPPORT("Test doesn't implement GetImage method.");
__builtin_unreachable();
}
// Test related resources allocation. The resources allocated here would be
// shared by all Run iterations. Time spent here will not be recorded.
virtual void Initialize() {}
// Test configuration before running the test. This will run once before
// each Run loop. Time spent here will be recorded.
virtual void Setup() {}
// Test body. Time spent will be recorded.
virtual void Run() = 0;
// Test cleanup after looping Run. Time spent here will be recorded.
virtual void Cleanup() {}
// Free and Destroy any resources allocated during Initialize. Time
// spent here will not be recorded.
virtual void Destroy() = 0;
vkbench::vkBase* vk;
protected:
std::string name_;
std::string desp_;
};
// commandTestBase submit a pre-recorded command buffers in its Run
// method.
class commandTestBase : public testBase {
public:
void Run() override { vk->SubmitAndWait(cmds_); }
void Destroy() override {
vk->GetDevice().freeCommandBuffers(vk->GetCommandPool(), cmds_);
}
// GetCommandBuffer returns a command buffer reference for submit later in Run
// Stage.
vk::CommandBuffer& GetCommandBuffer() {
if (cmds_.size() == 0) {
cmds_ = vk->GetDevice().allocateCommandBuffers(
{vk->GetCommandPool(), vk::CommandBufferLevel::ePrimary, 1});
}
return cmds_[0];
}
private:
std::vector<vk::CommandBuffer> cmds_;
};
} // namespace vkbench
#endif // SRC_TESTBASE_H_