Make vkBase singleton class.

Hasty mode depends on tests using the same instance.
Make the vkBase singleton so that dev won't use different vkBase by
mistake.

BUG=b:172227944
TEST=./vkbench -t Draw

Change-Id: I345feff12ca870527bd4a4ba733625bbdeed3bed
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vkbench/+/2552099
Reviewed-by: Ilja H. Friedel <ihf@chromium.org>
Commit-Queue: Po-Hsien Wang <pwang@chromium.org>
Tested-by: Po-Hsien Wang <pwang@chromium.org>
Auto-Submit: Po-Hsien Wang <pwang@chromium.org>
diff --git a/src/main.cc b/src/main.cc
index 84b509a..7002d6b 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -187,33 +187,25 @@
 }
 
 int main(int argc, char* argv[]) {
-  vkbench::vkBase simpleVulkan;
   // all_tests list all the available tests.
-  std::vector<vkbench::testBase*> all_tests = {
-      new vkbench::SubmitTest(10, &simpleVulkan),
-      new vkbench::SubmitTest(100, &simpleVulkan),
-      new vkbench::SubmitTest(1000, &simpleVulkan),
-      new vkbench::SubmitTest(10000, &simpleVulkan),
-      new vkbench::SubmitTest(100000, &simpleVulkan),
-      new vkbench::DrawSizeTest(16, &simpleVulkan),
-      new vkbench::DrawSizeTest(64, &simpleVulkan),
-      new vkbench::DrawSizeTest(128, &simpleVulkan),
-      new vkbench::DrawSizeTest(512, &simpleVulkan),
-      new vkbench::DrawSizeTest(1024, &simpleVulkan),
-      new vkbench::ClearTest(&simpleVulkan),
+  std::vector<vkbench::testBase*> all_tests;
+  auto appendList = [](std::vector<vkbench::testBase*>& a,
+                       const std::vector<vkbench::testBase*>& b) {
+    a.insert(a.end(), b.begin(), b.end());
   };
+  appendList(all_tests, vkbench::SubmitTest::GenTests());
+  appendList(all_tests, vkbench::DrawSizeTest::GenTests());
+  appendList(all_tests, vkbench::ClearTest::GenTests());
+
+  if (!ParseArgv(argc, argv, all_tests)) {
+    return 0;
+  }
 
   // Sort to bundle tests using same vulkan instance together.
   std::stable_sort(all_tests.begin(), all_tests.end(),
                    [](vkbench::testBase* a, vkbench::testBase* b) -> bool {
                      return a->vk < b->vk;
                    });
-
-  if (!ParseArgv(argc, argv, all_tests)) {
-    return 0;
-  }
-
-  std::map<const char*, int> failed_test;
   LOG("@TEST_BEGIN")
   PrintDateTime();
   for (auto i = 0; i < all_tests.size(); i++) {
@@ -226,8 +218,7 @@
         if (!g_hasty)
           test->vk->Destroy();
       } catch (const std::runtime_error error) {
-        failed_test[test->Name()] += 1;
-        LOG("Runtime Error: %s", error.what());
+        LOG("@RESULT: %46s = ERROR[%s]", test->Name(), error.what());
       }
     }
 
@@ -239,12 +230,7 @@
     }
   }
   PrintDateTime();
-  LOG("@TEST_END")
-
-  for (auto& keyval : failed_test) {
-    LOG("%s failed %d times.", keyval.first, keyval.second)
-  }
-
+  LOG("@TEST_END");
   for (auto& test : all_tests) {
     delete test;
   }
diff --git a/src/tests/clearTest.h b/src/tests/clearTest.h
index 4fe532a..3699cd1 100644
--- a/src/tests/clearTest.h
+++ b/src/tests/clearTest.h
@@ -18,6 +18,10 @@
   }
   ~ClearTest() override = default;
 
+  static std::vector<testBase*> GenTests() {
+    return std::vector<testBase*>{
+        new vkbench::ClearTest(vkBase::GetInstance())};
+  }
   const char* Name() const override { return name_; }
   const char* Desp() const override { return desp_; }
   const char* Unit() const override { return "mpixels_sec"; }
diff --git a/src/tests/drawSizeTest.h b/src/tests/drawSizeTest.h
index 05304b0..f69e331 100644
--- a/src/tests/drawSizeTest.h
+++ b/src/tests/drawSizeTest.h
@@ -19,6 +19,15 @@
   }
   ~DrawSizeTest() override = default;
 
+  static std::vector<testBase*> GenTests() {
+    return std::vector<testBase*>{
+        new vkbench::DrawSizeTest(16, vkBase::GetInstance()),
+        new vkbench::DrawSizeTest(64, vkBase::GetInstance()),
+        new vkbench::DrawSizeTest(128, vkBase::GetInstance()),
+        new vkbench::DrawSizeTest(512, vkBase::GetInstance()),
+        new vkbench::DrawSizeTest(1024, vkBase::GetInstance()),
+    };
+  }
   const char* Name() const override { return name_; }
   const char* Desp() const override { return desp_; }
   const char* Unit() const override { return "us"; }
diff --git a/src/tests/submitTest.h b/src/tests/submitTest.h
index 2f70fd9..8e58620 100644
--- a/src/tests/submitTest.h
+++ b/src/tests/submitTest.h
@@ -19,6 +19,16 @@
   }
   ~SubmitTest() override = default;
 
+  static std::vector<testBase*> GenTests() {
+    return std::vector<testBase*>{
+        new vkbench::SubmitTest(16, vkBase::GetInstance()),
+        new vkbench::SubmitTest(64, vkBase::GetInstance()),
+        new vkbench::SubmitTest(256, vkBase::GetInstance()),
+        new vkbench::SubmitTest(1024, vkBase::GetInstance()),
+        new vkbench::SubmitTest(4096, vkBase::GetInstance()),
+        new vkbench::SubmitTest(16384, vkBase::GetInstance()),
+    };
+  }
   const char* Name() const override { return name_; }
   const char* Desp() const override { return desp_; }
   const char* Unit() const override { return "us"; }
diff --git a/src/vkBase.cc b/src/vkBase.cc
index 9aedfaf..20d8afa 100644
--- a/src/vkBase.cc
+++ b/src/vkBase.cc
@@ -102,6 +102,13 @@
   }
 }
 
+vkBase* vkBase::singleton_ = nullptr;
+vkBase* vkBase::GetInstance() {
+  if (singleton_ == nullptr)
+    singleton_ = new vkBase();
+  return singleton_;
+}
+
 uint32_t ChooseGFXQueueFamilies(const vk::PhysicalDevice& physical_device) {
   uint32_t gfx_queue_idx = UINT32_MAX;
   std::vector<vk::QueueFamilyProperties> props =
diff --git a/src/vkBase.h b/src/vkBase.h
index 057cb54..c9d5ab7 100644
--- a/src/vkBase.h
+++ b/src/vkBase.h
@@ -34,6 +34,8 @@
 class vkBase {
  public:
   virtual ~vkBase() = default;
+  static vkBase* GetInstance();
+
   virtual void Initialize();
   virtual bool IsInitialized() const;
   virtual void Destroy();
@@ -51,6 +53,7 @@
   // Helper function
   uint32_t GetMemoryType(uint32_t bits, vk::MemoryPropertyFlags properties);
   vkImage* GetReadableImage(vkImage* src, vk::Extent2D size, vk::Format format);
+  DISALLOW_COPY_AND_ASSIGN(vkBase);
 
  protected:
   // Vulkan general method.
@@ -76,6 +79,10 @@
 
   vk::SurfaceKHR surface_;
   bool initialized_ = false;
+
+ private:
+  vkBase() {}
+  static vkBase* singleton_;
 };
 
 }  // namespace vkbench